diff --git a/AUTHORS b/AUTHORS index f787da4d..d99b2c4 100644 --- a/AUTHORS +++ b/AUTHORS
@@ -1436,6 +1436,7 @@ Vewd Software AS <*@vewd.com> Vivaldi Technologies AS <*@vivaldi.com> Wacom <*@wacom.com> +Whist Technologies <*@whist.com> Xperi Corporation <*@xperi.com> Yandex LLC <*@yandex-team.ru> Zuckjet <zuckjet@gmail.com>
diff --git a/DEPS b/DEPS index c8ef7dc0..e1ab0a8 100644 --- a/DEPS +++ b/DEPS
@@ -297,15 +297,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '53d4265d838bd37bdd0f0a0ff937635cf1ff31cf', + 'skia_revision': '61860c1148f35fe66498be4b431372bea28872b2', # 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': '425ff17f2d485fb23a7f328e59a39ee9ee5b150c', + 'v8_revision': '0f82c98002cfeec0125e4c571f196224113766a5', # 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': 'dbfab1595b8a92978e8e5d79cc6dec46f592629d', + 'angle_revision': '9e3e203278ee3cfe52c64ac9dc9b4ecb2a2ef9ca', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -324,7 +324,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:9.20220805.1.1', + 'fuchsia_version': 'version:9.20220805.2.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. @@ -368,7 +368,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': 'dcdf418945390a0e5a1f5ad8fde09b38c03d9516', + 'catapult_revision': 'd4a09458ea5c4374e8280348b7eff6871dc8888a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. @@ -376,7 +376,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': 'f6d21b7784d50b8fe372491be9d7468db6c784ee', + 'devtools_frontend_revision': '6d97228951a6c8884b3ac4b712e966e79f2bdc3c', # 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. @@ -412,7 +412,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': '127288b742e4ff693b06e80da2e6957f0c09f662', + 'dawn_revision': 'a0df1384f207c4b3b36351bf75dd6dd6ec857901', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -440,7 +440,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': '377dc47c9f2a54ec9b4df7dac3d0419a782f37e3', + 'nearby_revision': '4bf31d18da0faddcf0a39262c743c4ea95de95ac', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -480,7 +480,7 @@ # If you change this, also update the libc++ revision in # //buildtools/deps_revisions.gni. - 'libcxx_revision': 'a47a05b6a096e53f529c6cec03915b4a0c0bce2c', + 'libcxx_revision': 'd3b184e37759cdce251af00b850f3db79a4e92e0', # GN CIPD package version. 'gn_version': 'git_revision:c8c63300ac8ecb66d8126af5407257209ae59044', @@ -773,7 +773,7 @@ Var('chromium_git') + '/external/github.com/toji/webvr.info.git' + '@' + 'c58ae99b9ff9e2aa4c524633519570bf33536248', 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + '29eacb93bfef5707b3718bc58073dd4edf65c610', + 'url': Var('chromium_git') + '/website.git' + '@' + '8612ce17027a0beafaaf284e3019ccfb88134444', }, 'src/ios/third_party/earl_grey2/src': { @@ -862,7 +862,7 @@ 'packages': [ { 'package': 'chromium/rts/model/linux-amd64', - 'version': 'TRb09hRUmejOEu3Gq8POdvtLWNFoYEIAOPSSW1PKSKUC', + 'version': '2qzm1rb__hk_crMooo1qPkGVx8cbtiPkauBVXOO-wnUC', }, ], 'dep_type': 'cipd', @@ -873,7 +873,7 @@ 'packages': [ { 'package': 'chromium/rts/model/mac-amd64', - 'version': 'ucgJaIVpPd53Z5AbVVIJn4QRzV3UPEyR6f-IKZxPtVYC', + 'version': 'WFwRJYWrCDQe8paPfYHf2KH-aV1DM6oX3lY6Aj1Z4f4C', }, ], 'dep_type': 'cipd', @@ -884,7 +884,7 @@ 'packages': [ { 'package': 'chromium/rts/model/windows-amd64', - 'version': '2nti71TXjWDOL2reC4jEhI3gNN63imORXcOFCnp_sVMC', + 'version': 'TJ7THbAADa0eU-wOdY2WD2f7AXWpYzjFrwPEV21_JTkC', }, ], 'dep_type': 'cipd', @@ -1069,7 +1069,7 @@ Var('chromium_git') + '/angle/angle.git' + '@' + Var('angle_revision'), 'src/third_party/content_analysis_sdk/src': - Var('chromium_git') + '/external/github.com/chromium/content_analysis_sdk.git' + '@' + '1d7dd0490808a8a972949521cc314e42d085c69f', + Var('chromium_git') + '/external/github.com/chromium/content_analysis_sdk.git' + '@' + 'fe3c222acb75bdd5248a3339d4255f032e293296', 'src/third_party/dav1d/libdav1d': Var('chromium_git') + '/external/github.com/videolan/dav1d.git' + '@' + '87f9a81cd770e49394a45deca7a3df41243de00b', @@ -1573,7 +1573,7 @@ }, 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'c7072e645ea2540075aa10e3c3caa9f3cc168303', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'f44970fbdaa94f4edc67f0914b2a51aa9a237463', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1693,7 +1693,7 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@fa6a3bcb6169cbeab07cf1bdbd12c34fae669e60', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7e4e5d736e846a65703dd908cdd95677b1492d97', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'ebe84bec02c041d28f902da0214bf442743fc907', @@ -1762,7 +1762,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/linux-amd64', - 'version': '0NA1CyaNhIxt00SqtGFZVHJ-K7ioB4L6a5rT4MzyQ48C', + 'version': '9fyLI7UE2vwgyQweLyqyh193CzDMxbUr0xRuqtcCLAgC', }, ], 'dep_type': 'cipd', @@ -1772,7 +1772,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/windows-amd64', - 'version': 'TwW8GVww_8ATYlTEN2pHq5xuXkLqTN5mrqFZjRWD2GgC', + 'version': 'rV5hj2Xykfze-wY9ozIelEOoVLxjUV7rPUMxnRrlh80C', }, ], 'dep_type': 'cipd', @@ -1783,7 +1783,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-amd64', - 'version': 'FWI4Q_ogCO1xBJ0xpOqci1On1AsY-RHqGDYlvqf3AiQC', + 'version': 'Gd1BbosIHwOaX5zOlcEpL3_dE4fNnH3ZavJaYPSbIaEC', }, ], 'dep_type': 'cipd', @@ -1794,7 +1794,7 @@ 'packages': [ { 'package': 'skia/tools/goldctl/mac-arm64', - 'version': '3dJEBjpviigMA6es0-th0SJsyrnw5_4wTMyBddvEByUC', + 'version': 'xjfviFgm_MjrBG13x_JywIF9-wkn8wCyBm7yZVx-V10C', }, ], 'dep_type': 'cipd', @@ -1805,7 +1805,7 @@ Var('chromium_git') + '/v8/v8.git' + '@' + Var('v8_revision'), 'src-internal': { - 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@bc5a7e369852020571df26319a487debcbd2fc31', + 'url': 'https://chrome-internal.googlesource.com/chrome/src-internal.git@58a9745cd53376e9943a6bfed836a1cc27e0561d', 'condition': 'checkout_src_internal', }, @@ -1835,7 +1835,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'XdMahsclKEDVke2jW_KD9ME6Xb4JKI34dJpUd3Zsbk8C', + 'version': 'JV8Fb8N7DqZpLi1E8lYjxoI4oJsPrFzqm9BSNn-W0tEC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -1846,7 +1846,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': '236do74t5f1t4aLggy43Ait8gx56CHkHnhvNixXzSC4C', + 'version': '0ffqZ9co7-2vedJANjXXvA8PSyiPYxARpJ0oAmco_uAC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3287,7 +3287,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib', - 'version': 'version:2@1.7.0.cr1', + 'version': 'version:2@1.7.10.cr1', }, ], 'condition': 'checkout_android', @@ -3298,7 +3298,7 @@ 'packages': [ { 'package': 'chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common', - 'version': 'version:2@1.7.0.cr1', + 'version': 'version:2@1.7.10.cr1', }, ], 'condition': 'checkout_android',
diff --git a/OWNERS b/OWNERS index 3510d60..c95403d0 100644 --- a/OWNERS +++ b/OWNERS
@@ -12,7 +12,9 @@ per-file .gitignore=* per-file .git-blame-ignore-revs=mgiuca@chromium.org per-file .git-blame-ignore-revs=thakis@chromium.org +per-file .gn=ddorwin@chromium.org # For fuchsia_target_api_level changes. per-file .gn=estaab@chromium.org +per-file .gn=sergeyu@chromium.org # For fuchsia_target_api_level changes. per-file .gn=file://build/OWNERS per-file .mailmap=* per-file .rustfmt.toml=file://styleguide/rust/OWNERS
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java index 794b03a..08f9278 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwMetricsIntegrationTest.java
@@ -6,6 +6,9 @@ import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.Matchers.contains; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.chromium.android_webview.test.OnlyRunIn.ProcessMode.MULTI_PROCESS; @@ -16,7 +19,6 @@ import org.hamcrest.Description; import org.hamcrest.Matchers; import org.hamcrest.TypeSafeMatcher; -import org.junit.Assert; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -118,10 +120,10 @@ @Feature({"AndroidWebView"}) public void testMetadata_basicInfo() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); - Assert.assertEquals(ChromeUserMetricsExtension.Product.ANDROID_WEBVIEW, + assertEquals(ChromeUserMetricsExtension.Product.ANDROID_WEBVIEW, ChromeUserMetricsExtension.Product.forNumber(log.getProduct())); - Assert.assertTrue("Should have some client_id", log.hasClientId()); - Assert.assertTrue("Should have some session_id", log.hasSessionId()); + assertTrue("Should have some client_id", log.hasClientId()); + assertTrue("Should have some session_id", log.hasSessionId()); } @Test @@ -130,9 +132,9 @@ public void testMetadata_buildInfo() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some build_timestamp", systemProfile.hasBuildTimestamp()); - Assert.assertTrue("Should have some app_version", systemProfile.hasAppVersion()); - Assert.assertTrue("Should have some channel", systemProfile.hasChannel()); + assertTrue("Should have some build_timestamp", systemProfile.hasBuildTimestamp()); + assertTrue("Should have some app_version", systemProfile.hasAppVersion()); + assertTrue("Should have some channel", systemProfile.hasChannel()); } @Test @@ -141,19 +143,16 @@ public void testMetadata_miscellaneousSystemProfileInfo() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some uma_enabled_date", systemProfile.hasUmaEnabledDate()); - Assert.assertTrue("Should have some install_date", systemProfile.hasInstallDate()); + assertTrue("Should have some uma_enabled_date", systemProfile.hasUmaEnabledDate()); + assertTrue("Should have some install_date", systemProfile.hasInstallDate()); // Don't assert application_locale's value, because we don't want to enforce capitalization // requirements on the metrics service (ex. in case it switches from "en-US" to "en-us" for // some reason). - Assert.assertTrue( - "Should have some application_locale", systemProfile.hasApplicationLocale()); + assertTrue("Should have some application_locale", systemProfile.hasApplicationLocale()); - Assert.assertEquals( - ApiHelperForM.isProcess64Bit(), systemProfile.getAppVersion().contains("-64")); - Assert.assertTrue( - "Should have some low_entropy_source", systemProfile.hasLowEntropySource()); - Assert.assertTrue( + assertEquals(ApiHelperForM.isProcess64Bit(), systemProfile.getAppVersion().contains("-64")); + assertTrue("Should have some low_entropy_source", systemProfile.hasLowEntropySource()); + assertTrue( "Should have some old_low_entropy_source", systemProfile.hasOldLowEntropySource()); } @@ -163,9 +162,9 @@ public void testMetadata_osData() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertEquals("Android", systemProfile.getOs().getName()); - Assert.assertTrue("Should have some os.version", systemProfile.getOs().hasVersion()); - Assert.assertTrue("Should have some os.build_fingerprint", + assertEquals("Android", systemProfile.getOs().getName()); + assertTrue("Should have some os.version", systemProfile.getOs().hasVersion()); + assertTrue("Should have some os.build_fingerprint", systemProfile.getOs().hasBuildFingerprint()); } @@ -175,9 +174,9 @@ public void testMetadata_hardwareMiscellaneous() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some hardware.system_ram_mb", + assertTrue("Should have some hardware.system_ram_mb", systemProfile.getHardware().hasSystemRamMb()); - Assert.assertTrue("Should have some hardware.hardware_class", + assertTrue("Should have some hardware.hardware_class", systemProfile.getHardware().hasHardwareClass()); } @@ -187,13 +186,13 @@ public void testMetadata_hardwareScreen() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some hardware.screen_count", + assertTrue("Should have some hardware.screen_count", systemProfile.getHardware().hasScreenCount()); - Assert.assertTrue("Should have some hardware.primary_screen_width", + assertTrue("Should have some hardware.primary_screen_width", systemProfile.getHardware().hasPrimaryScreenWidth()); - Assert.assertTrue("Should have some hardware.primary_screen_height", + assertTrue("Should have some hardware.primary_screen_height", systemProfile.getHardware().hasPrimaryScreenHeight()); - Assert.assertTrue("Should have some hardware.primary_screen_scale_factor", + assertTrue("Should have some hardware.primary_screen_scale_factor", systemProfile.getHardware().hasPrimaryScreenScaleFactor()); } @@ -203,15 +202,15 @@ public void testMetadata_hardwareCpu() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some hardware.cpu_architecture", + assertTrue("Should have some hardware.cpu_architecture", systemProfile.getHardware().hasCpuArchitecture()); - Assert.assertTrue("Should have some hardware.cpu.vendor_name", + assertTrue("Should have some hardware.cpu.vendor_name", systemProfile.getHardware().getCpu().hasVendorName()); - Assert.assertTrue("Should have some hardware.cpu.signature", + assertTrue("Should have some hardware.cpu.signature", systemProfile.getHardware().getCpu().hasSignature()); - Assert.assertTrue("Should have some hardware.cpu.num_cores", + assertTrue("Should have some hardware.cpu.num_cores", systemProfile.getHardware().getCpu().hasNumCores()); - Assert.assertTrue("Should have some hardware.cpu.is_hypervisor", + assertTrue("Should have some hardware.cpu.is_hypervisor", systemProfile.getHardware().getCpu().hasIsHypervisor()); } @@ -221,11 +220,11 @@ public void testMetadata_hardwareGpu() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some hardware.gpu.driver_version", + assertTrue("Should have some hardware.gpu.driver_version", systemProfile.getHardware().getGpu().hasDriverVersion()); - Assert.assertTrue("Should have some hardware.gpu.gl_vendor", + assertTrue("Should have some hardware.gpu.gl_vendor", systemProfile.getHardware().getGpu().hasGlVendor()); - Assert.assertTrue("Should have some hardware.gpu.gl_renderer", + assertTrue("Should have some hardware.gpu.gl_renderer", systemProfile.getHardware().getGpu().hasGlRenderer()); } @@ -235,9 +234,9 @@ public void testMetadata_hardwareDrive() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some hardware.app_drive.has_seek_penalty", + assertTrue("Should have some hardware.app_drive.has_seek_penalty", systemProfile.getHardware().getAppDrive().hasHasSeekPenalty()); - Assert.assertTrue("Should have some hardware.user_data_drive.has_seek_penalty", + assertTrue("Should have some hardware.user_data_drive.has_seek_penalty", systemProfile.getHardware().getUserDataDrive().hasHasSeekPenalty()); } @@ -247,17 +246,17 @@ public void testMetadata_network() throws Throwable { ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertTrue("Should have some network.connection_type_is_ambiguous", + assertTrue("Should have some network.connection_type_is_ambiguous", systemProfile.getNetwork().hasConnectionTypeIsAmbiguous()); - Assert.assertTrue("Should have some network.connection_type", + assertTrue("Should have some network.connection_type", systemProfile.getNetwork().hasConnectionType()); - Assert.assertTrue("Should have some network.wifi_phy_layer_protocol_is_ambiguous", + assertTrue("Should have some network.wifi_phy_layer_protocol_is_ambiguous", systemProfile.getNetwork().hasWifiPhyLayerProtocolIsAmbiguous()); - Assert.assertTrue("Should have some network.wifi_phy_layer_protocol", + assertTrue("Should have some network.wifi_phy_layer_protocol", systemProfile.getNetwork().hasWifiPhyLayerProtocol()); - Assert.assertTrue("Should have some network.min_effective_connection_type", + assertTrue("Should have some network.min_effective_connection_type", systemProfile.getNetwork().hasMinEffectiveConnectionType()); - Assert.assertTrue("Should have some network.max_effective_connection_type", + assertTrue("Should have some network.max_effective_connection_type", systemProfile.getNetwork().hasMaxEffectiveConnectionType()); } @@ -272,7 +271,7 @@ mRule.loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), embeddedTestServer.getURL("/android_webview/test/data/hello_world.html")); - Assert.assertEquals("Should have correct stability histogram kPageLoad count", 1, + assertEquals("Should have correct stability histogram kPageLoad count", 1, RecordHistogram.getHistogramValueCountForTesting( "Stability.Counts2", StabilityEventType.PAGE_LOAD)); } finally { @@ -291,7 +290,7 @@ mRule.loadUrlSync(mAwContents, mContentsClient.getOnPageFinishedHelper(), embeddedTestServer.getURL("/android_webview/test/data/hello_world.html")); - Assert.assertEquals("Should have correct stability histogram kRendererLaunch count", 1, + assertEquals("Should have correct stability histogram kRendererLaunch count", 1, RecordHistogram.getHistogramValueCountForTesting( "Stability.Counts2", StabilityEventType.RENDERER_LAUNCH)); } finally { @@ -318,7 +317,7 @@ helper.waitForCallback( callCount, 1, CallbackHelper.WAIT_TIMEOUT_SECONDS * 5, TimeUnit.SECONDS); - Assert.assertEquals("Should have correct stability histogram kRendererCrash count", 1, + assertEquals("Should have correct stability histogram kRendererCrash count", 1, RecordHistogram.getHistogramValueCountForTesting( "Stability.Counts2", StabilityEventType.RENDERER_CRASH)); } @@ -329,7 +328,7 @@ public void testMetadata_stability_browserLaunchCount() throws Throwable { // This should be triggered simply by initializing the MetricsService. This should be logged // (and persisted) even before we start collecting the first metrics log. - Assert.assertEquals("Should have correct stability histogram kLaunch count", 1, + assertEquals("Should have correct stability histogram kLaunch count", 1, RecordHistogram.getHistogramValueCountForTesting( "Stability.Counts2", StabilityEventType.LAUNCH)); } @@ -343,7 +342,7 @@ // assert total count == 0), because this would race with the initial metrics log. mPlatformServiceBridge.waitForNextMetricsLog(); - Assert.assertEquals( + assertEquals( 1, RecordHistogram.getHistogramTotalCountForTesting("MemoryAndroid.LowRamDevice")); } @@ -356,7 +355,7 @@ // assert total count == 0), because this would race with the initial metrics log. mPlatformServiceBridge.waitForNextMetricsLog(); - Assert.assertEquals( + assertEquals( 1, RecordHistogram.getHistogramTotalCountForTesting("UMA.SamplingRatePerMille")); } @@ -369,7 +368,7 @@ // do not assert total count == 0), because this would race with the initial metrics log. mPlatformServiceBridge.waitForNextMetricsLog(); - Assert.assertEquals(1, + assertEquals(1, RecordHistogram.getHistogramTotalCountForTesting( "Accessibility.Android.ScreenReader.EveryReport")); } @@ -401,7 +400,7 @@ ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertEquals(appPackageName, systemProfile.getAppPackageName()); + assertEquals(appPackageName, systemProfile.getAppPackageName()); } private static TypeSafeMatcher<ChromeComponent> matchesChromeComponent( @@ -450,7 +449,7 @@ ChromeUserMetricsExtension log = mPlatformServiceBridge.waitForNextMetricsLog(); SystemProfileProto systemProfile = log.getSystemProfile(); - Assert.assertEquals( + assertEquals( "Should have exactly one component", systemProfile.getChromeComponentCount(), 1); ChromeComponent expectedAllowlistComponent = ChromeComponent.newBuilder() @@ -532,7 +531,7 @@ embeddedTestServer.getURL("/android_webview/test/data/hello_world.html")); helper.waitForCallback(finalMetricsCollectedCount, 2); - Assert.assertEquals(1, + assertEquals(1, RecordHistogram.getHistogramTotalCountForTesting( "Android.SeccompStatus.RendererSandbox")); } finally { @@ -568,15 +567,13 @@ int zeroBucketSamples = RecordHistogram.getHistogramValueCountForTesting(histogramName, 0); - Assert.assertNotEquals("There should be at least one sample in a non-zero bucket", + assertNotEquals("There should be at least one sample in a non-zero bucket", zeroBucketSamples, totalSamples); TestThreadUtils.runOnUiThreadBlocking(() -> { - Assert.assertEquals( - 1, AwContents.AwWindowCoverageTracker.sWindowCoverageTrackers.size()); + assertEquals(1, AwContents.AwWindowCoverageTracker.sWindowCoverageTrackers.size()); mAwContents.onDetachedFromWindow(); - Assert.assertEquals( - 0, AwContents.AwWindowCoverageTracker.sWindowCoverageTrackers.size()); + assertEquals(0, AwContents.AwWindowCoverageTracker.sWindowCoverageTrackers.size()); }); } finally { embeddedTestServer.stopAndDestroyServer();
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java index 5637014..80d22dd 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/devui/DeveloperUiTest.java
@@ -58,7 +58,7 @@ import org.chromium.android_webview.nonembedded_util.WebViewPackageHelper; import org.chromium.android_webview.test.AwJUnit4ClassRunner; import org.chromium.base.test.BaseActivityTestRule; -import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.Feature; import org.chromium.ui.test.util.ViewUtils; @@ -67,7 +67,7 @@ * have their own test class. */ @RunWith(AwJUnit4ClassRunner.class) -@Batch(Batch.PER_CLASS) +@DoNotBatch(reason = "Batching causes flakes.") public class DeveloperUiTest { // The package name of the test shell. This is acting both as the client app and the WebView // provider.
diff --git a/ash/app_list/BUILD.gn b/ash/app_list/BUILD.gn index 6d9ff81..b00bc72 100644 --- a/ash/app_list/BUILD.gn +++ b/ash/app_list/BUILD.gn
@@ -133,6 +133,7 @@ "views/scrollable_apps_grid_view.h", "views/search_box_view.cc", "views/search_box_view.h", + "views/search_box_view_delegate.h", "views/search_result_actions_view.cc", "views/search_result_actions_view.h", "views/search_result_actions_view_delegate.h",
diff --git a/ash/app_list/app_list_presenter_unittest.cc b/ash/app_list/app_list_presenter_unittest.cc index ef75336..9bfdfd21 100644 --- a/ash/app_list/app_list_presenter_unittest.cc +++ b/ash/app_list/app_list_presenter_unittest.cc
@@ -1681,13 +1681,6 @@ EnsureLauncherShown(); EnableTabletMode(tablet_mode_param()); - TestAppListClient* const client = GetAppListTestHelper()->app_list_client(); - // Closing the bubble launcher clears search. - if (tablet_mode_param() && productivity_launcher_param()) { - EXPECT_EQ(std::vector<std::u16string>({u""}), - client->GetAndResetPastSearchQueries()); - } - EnsureLauncherShown(); // Type a character into the textfield and verify this issues a single search @@ -1696,6 +1689,7 @@ generator->PressKey(ui::VKEY_A, 0); EXPECT_TRUE(AppListSearchResultPageVisible()); + TestAppListClient* const client = GetAppListTestHelper()->app_list_client(); EXPECT_EQ(std::vector<std::u16string>({u"a"}), client->GetAndResetPastSearchQueries()); generator->PressKey(ui::VKEY_B, 0); @@ -1716,13 +1710,6 @@ EnsureLauncherShown(); EnableTabletMode(tablet_mode_param()); - TestAppListClient* const client = GetAppListTestHelper()->app_list_client(); - // Closing the bubble launcher clears search. - if (tablet_mode_param() && productivity_launcher_param()) { - EXPECT_EQ(std::vector<std::u16string>({u""}), - client->GetAndResetPastSearchQueries()); - } - EnsureLauncherShown(); // Type a character into the textfield and verify this issues a single search @@ -1731,6 +1718,7 @@ generator->PressKey(ui::VKEY_A, 0); EXPECT_TRUE(AppListSearchResultPageVisible()); + TestAppListClient* const client = GetAppListTestHelper()->app_list_client(); EXPECT_EQ(std::vector<std::u16string>({u"a"}), client->GetAndResetPastSearchQueries()); generator->PressKey(ui::VKEY_B, 0);
diff --git a/ash/app_list/views/app_list_bubble_view.cc b/ash/app_list/views/app_list_bubble_view.cc index 8054f1f..a0d0cac 100644 --- a/ash/app_list/views/app_list_bubble_view.cc +++ b/ash/app_list/views/app_list_bubble_view.cc
@@ -611,10 +611,10 @@ } } -void AppListBubbleView::QueryChanged(SearchBoxViewBase* sender) { - DCHECK_EQ(sender, search_box_view_); +void AppListBubbleView::QueryChanged(const std::u16string& trimmed_query, + bool initiated_by_user) { if (current_page_ != AppListBubblePage::kNone) { - if (search_box_view_->HasValidQuery()) + if (!trimmed_query.empty()) ShowPage(AppListBubblePage::kSearch); else ShowPage(AppListBubblePage::kApps);
diff --git a/ash/app_list/views/app_list_bubble_view.h b/ash/app_list/views/app_list_bubble_view.h index 4fe92e29..068e34d 100644 --- a/ash/app_list/views/app_list_bubble_view.h +++ b/ash/app_list/views/app_list_bubble_view.h
@@ -9,9 +9,9 @@ #include "ash/app_list/app_list_view_provider.h" #include "ash/app_list/views/app_list_folder_controller.h" +#include "ash/app_list/views/search_box_view_delegate.h" #include "ash/ash_export.h" #include "ash/public/cpp/app_list/app_list_types.h" -#include "ash/search_box/search_box_view_delegate.h" #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" #include "ui/views/view.h" @@ -100,7 +100,8 @@ void Layout() override; // SearchBoxViewDelegate: - void QueryChanged(SearchBoxViewBase* sender) override; + void QueryChanged(const std::u16string& trimmed_query, + bool initiated_by_user) override; void AssistantButtonPressed() override; void CloseButtonPressed() override; void ActiveChanged(SearchBoxViewBase* sender) override {}
diff --git a/ash/app_list/views/app_list_main_view.cc b/ash/app_list/views/app_list_main_view.cc index 4671302..87a1d40 100644 --- a/ash/app_list/views/app_list_main_view.cc +++ b/ash/app_list/views/app_list_main_view.cc
@@ -124,13 +124,12 @@ contents_view_->SetBoundsRect(rect); } -void AppListMainView::QueryChanged(SearchBoxViewBase* sender) { - SearchModel* const search_model = AppListModelProvider::Get()->search_model(); - const std::u16string raw_query = search_model->search_box()->text(); - std::u16string query; - base::TrimWhitespace(raw_query, base::TRIM_ALL, &query); +void AppListMainView::QueryChanged(const std::u16string& trimmed_query, + bool initiated_by_user) { + app_list_view_->SetStateFromSearchBoxView(trimmed_query.empty(), + initiated_by_user); contents_view_->ShowSearchResults(search_box_view_->is_search_box_active() || - !query.empty()); + !trimmed_query.empty()); } void AppListMainView::ActiveChanged(SearchBoxViewBase* sender) {
diff --git a/ash/app_list/views/app_list_main_view.h b/ash/app_list/views/app_list_main_view.h index 2b68cd5..d3672b54 100644 --- a/ash/app_list/views/app_list_main_view.h +++ b/ash/app_list/views/app_list_main_view.h
@@ -6,8 +6,8 @@ #define ASH_APP_LIST_VIEWS_APP_LIST_MAIN_VIEW_H_ #include "ash/app_list/model/search/search_model.h" +#include "ash/app_list/views/search_box_view_delegate.h" #include "ash/ash_export.h" -#include "ash/search_box/search_box_view_delegate.h" #include "base/memory/weak_ptr.h" #include "base/timer/timer.h" #include "ui/views/view.h" @@ -63,7 +63,8 @@ PaginationModel* GetAppsPaginationModel(); // Overridden from SearchBoxViewDelegate: - void QueryChanged(SearchBoxViewBase* sender) override; + void QueryChanged(const std::u16string& trimmed_query, + bool initiated_by_user) override; void AssistantButtonPressed() override; void CloseButtonPressed() override; void ActiveChanged(SearchBoxViewBase* sender) override;
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc index 8799c7d..8d71383 100644 --- a/ash/app_list/views/search_box_view.cc +++ b/ash/app_list/views/search_box_view.cc
@@ -18,6 +18,7 @@ #include "ash/app_list/views/app_list_view.h" #include "ash/app_list/views/contents_view.h" #include "ash/app_list/views/result_selection_controller.h" +#include "ash/app_list/views/search_box_view_delegate.h" #include "ash/app_list/views/search_result_base_view.h" #include "ash/constants/ash_features.h" #include "ash/keyboard/ui/keyboard_ui_controller.h" @@ -28,7 +29,6 @@ #include "ash/public/cpp/wallpaper/wallpaper_types.h" #include "ash/resources/vector_icons/vector_icons.h" #include "ash/search_box/search_box_constants.h" -#include "ash/search_box/search_box_view_delegate.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" #include "base/metrics/histogram_functions.h" @@ -206,7 +206,7 @@ SearchBoxView::SearchBoxView(SearchBoxViewDelegate* delegate, AppListViewDelegate* view_delegate, AppListView* app_list_view) - : SearchBoxViewBase(delegate), + : delegate_(delegate), view_delegate_(view_delegate), app_list_view_(app_list_view), is_app_list_bubble_(!app_list_view_), @@ -306,18 +306,6 @@ } } -void SearchBoxView::ClearSearch() { - SearchBoxViewBase::ClearSearch(); - current_query_.clear(); - // Peeking/fullscreen launcher needs explicit state changes. - if (app_list_view_) { - app_list_view_->SetStateFromSearchBoxView( - /*search_box_is_empty=*/true, /*triggered_by_contents_change=*/false); - } - NotifyQueryChanged(); - view_delegate_->StartSearch(u""); -} - void SearchBoxView::HandleSearchBoxEvent(ui::LocatedEvent* located_event) { if (located_event->type() == ui::ET_MOUSEWHEEL) { // TODO(crbug.com/1216082): Forward scroll events for bubble launcher. @@ -361,25 +349,28 @@ keyboard_controller->HideKeyboardByUser(); } -void SearchBoxView::UpdateModel(bool initiated_by_user) { - auto new_query = search_box()->GetText(); - SearchBoxModel* const search_box_model = - AppListModelProvider::Get()->search_model()->search_box(); - +void SearchBoxView::HandleQueryChange(const std::u16string& query, + bool initiated_by_user) { // Randomly select a new placeholder text when we get an empty new query. - if (new_query.empty() && features::IsProductivityLauncherEnabled()) + if (query.empty() && features::IsProductivityLauncherEnabled()) UpdatePlaceholderTextAndAccessibleName(); + MaybeSetAutocompleteGhostText(std::u16string(), std::u16string()); + + // Update autocomplete text highlight range to track user typed text. + if (ShouldProcessAutocomplete()) + ResetHighlightRange(); + if (initiated_by_user) { - const std::u16string& previous_query = search_box_model->text(); const base::TimeTicks current_time = base::TimeTicks::Now(); - if (previous_query.empty() && !new_query.empty()) { + if (current_query_.empty() && !query.empty()) { + base::RecordAction(base::UserMetricsAction("AppList_SearchQueryStarted")); // Set 'user_initiated_model_update_time_' when initiating a new query. user_initiated_model_update_time_ = current_time; - } else if (!previous_query.empty() && new_query.empty()) { + } else if (!current_query_.empty() && query.empty()) { // Reset 'user_initiated_model_update_time_' when clearing the search_box. user_initiated_model_update_time_ = base::TimeTicks(); - } else if (new_query != previous_query && + } else if (query != current_query_ && !user_initiated_model_update_time_.is_null()) { if (is_tablet_mode_) { UMA_HISTOGRAM_TIMES("Ash.SearchModelUpdateTime.TabletMode", @@ -391,16 +382,35 @@ user_initiated_model_update_time_ = current_time; } } + + std::u16string trimmed_query; + base::TrimWhitespace(query, base::TrimPositions::TRIM_ALL, &trimmed_query); + const bool query_empty_changed = + trimmed_query.empty() != IsTrimmedQueryEmpty(current_query_); + + current_query_ = query; + + // The search box background depens on whether the query is empty, so schedule + // repaint when this changes. + if (query_empty_changed) + SchedulePaint(); + // Temporarily remove from observer to ignore notifications caused by us. search_box_model_observer_.Reset(); - search_box_model->Update(new_query, initiated_by_user); + SearchBoxModel* const search_box_model = + AppListModelProvider::Get()->search_model()->search_box(); + + search_box_model->Update(query, initiated_by_user); search_box_model_observer_.Observe(search_box_model); - // Ask the controller to start the search if the change was initiated by the - // user. - if (initiated_by_user) - view_delegate_->StartSearch(new_query); + delegate_->QueryChanged(trimmed_query, initiated_by_user); + + // Don't reinitiate zero state search if the previous query was already empty + // (to avoid issuing zero state search twice in a row while clearing up search + // - see http://crbug.com/979594). + if (initiated_by_user || !trimmed_query.empty() || query_empty_changed) + view_delegate_->StartSearch(query); } void SearchBoxView::UpdatePlaceholderTextStyle() { @@ -554,6 +564,8 @@ UpdatePlaceholderTextAndAccessibleName(); } } + + delegate_->ActiveChanged(this); } void SearchBoxView::UpdateSearchBoxFocusPaint() { @@ -579,7 +591,7 @@ (IsUnhandledArrowKeyEvent(*evt) || evt->key_code() == ui::VKEY_TAB)) { search_box()->RequestFocus(); - if (delegate()->CanSelectSearchResults() && + if (delegate_->CanSelectSearchResults() && result_selection_controller_->MoveSelection(*evt) == ResultSelectionController::MoveResult::kResultChanged) { UpdateSearchBoxForSelectedResult( @@ -590,7 +602,7 @@ return; } - delegate()->OnSearchBoxKeyEvent(evt); + delegate_->OnSearchBoxKeyEvent(evt); } bool SearchBoxView::OnMouseWheel(const ui::MouseWheelEvent& event) { @@ -839,11 +851,11 @@ } void SearchBoxView::CloseButtonPressed() { - delegate()->CloseButtonPressed(); + delegate_->CloseButtonPressed(); } void SearchBoxView::AssistantButtonPressed() { - delegate()->AssistantButtonPressed(); + delegate_->AssistantButtonPressed(); } void SearchBoxView::UpdateSearchIcon() { @@ -977,32 +989,6 @@ SetA11yActiveDescendant(absl::nullopt); } -void SearchBoxView::ContentsChanged(views::Textfield* sender, - const std::u16string& new_contents) { - bool current_query_empty = IsTrimmedQueryEmpty(current_query_); - bool new_contents_empty = IsTrimmedQueryEmpty(new_contents); - if (current_query_empty && !new_contents_empty) { - // User enters a new search query. Record the action. - base::RecordAction(base::UserMetricsAction("AppList_SearchQueryStarted")); - } - - // Schedule paint to update the focus bar, a part of the search box background - // that is dependent on whether the query is empty. - if (current_query_empty != new_contents_empty) - SchedulePaint(); - - current_query_ = new_contents; - - // Update autocomplete text highlight range to track user typed text. - if (ShouldProcessAutocomplete()) - ResetHighlightRange(); - SearchBoxViewBase::ContentsChanged(sender, new_contents); - if (app_list_view_) { - app_list_view_->SetStateFromSearchBoxView( - IsSearchBoxTrimmedQueryEmpty(), true /*triggered_by_contents_change*/); - } -} - void SearchBoxView::SetAutocompleteText( const std::u16string& autocomplete_text) { if (!ShouldProcessAutocomplete()) @@ -1091,7 +1077,7 @@ // Nothing to do if no results are available (the rest of the method handles // result actions and result traversal). This might happen if zero state // suggestions are not enabled, and search box textfield is empty. - if (!delegate()->CanSelectSearchResults()) + if (!delegate_->CanSelectSearchResults()) return false; // When search box is active, the focus cycles between close button and the @@ -1266,10 +1252,13 @@ } void SearchBoxView::Update() { - search_box()->SetText( - AppListModelProvider::Get()->search_model()->search_box()->text()); + const std::u16string text = + AppListModelProvider::Get()->search_model()->search_box()->text(); + search_box()->SetText(text); UpdateButtonsVisibility(); - NotifyQueryChanged(); + std::u16string trimmed_text; + base::TrimWhitespace(text, base::TrimPositions::TRIM_ALL, &trimmed_text); + delegate_->QueryChanged(trimmed_text, false); } void SearchBoxView::SearchEngineChanged() {
diff --git a/ash/app_list/views/search_box_view.h b/ash/app_list/views/search_box_view.h index ba3dfe6..41d56dce 100644 --- a/ash/app_list/views/search_box_view.h +++ b/ash/app_list/views/search_box_view.h
@@ -32,6 +32,7 @@ class AppListViewDelegate; class ContentsView; class ResultSelectionController; +class SearchBoxViewDelegate; class SearchResultBaseView; // Subclass of SearchBoxViewBase. SearchBoxModel is its data model @@ -86,10 +87,10 @@ // Overridden from SearchBoxViewBase: void UpdateSearchTextfieldAccessibleNodeData( ui::AXNodeData* node_data) override; - void ClearSearch() override; void HandleSearchBoxEvent(ui::LocatedEvent* located_event) override; void UpdateKeyboardVisibility() override; - void UpdateModel(bool initiated_by_user) override; + void HandleQueryChange(const std::u16string& query, + bool initiated_by_user) override; void UpdatePlaceholderTextStyle() override; void UpdateSearchBoxBorder() override; void RecordSearchBoxActivationHistogram(ui::EventType event_type) override; @@ -209,8 +210,6 @@ // Overridden from views::TextfieldController: void OnBeforeUserAction(views::Textfield* sender) override; - void ContentsChanged(views::Textfield* sender, - const std::u16string& new_contents) override; bool HandleKeyEvent(views::Textfield* sender, const ui::KeyEvent& key_event) override; bool HandleMouseEvent(views::Textfield* sender, @@ -247,6 +246,7 @@ // The key most recently pressed. ui::KeyboardCode last_key_pressed_ = ui::VKEY_UNKNOWN; + SearchBoxViewDelegate* const delegate_; AppListViewDelegate* const view_delegate_; // Owned by views hierarchy. May be null for bubble launcher.
diff --git a/ash/search_box/search_box_view_delegate.h b/ash/app_list/views/search_box_view_delegate.h similarity index 63% rename from ash/search_box/search_box_view_delegate.h rename to ash/app_list/views/search_box_view_delegate.h index 5aa7c49..f41da54 100644 --- a/ash/search_box/search_box_view_delegate.h +++ b/ash/app_list/views/search_box_view_delegate.h
@@ -2,8 +2,10 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef ASH_SEARCH_BOX_SEARCH_BOX_VIEW_DELEGATE_H_ -#define ASH_SEARCH_BOX_SEARCH_BOX_VIEW_DELEGATE_H_ +#ifndef ASH_APP_LIST_VIEWS_SEARCH_BOX_VIEW_DELEGATE_H_ +#define ASH_APP_LIST_VIEWS_SEARCH_BOX_VIEW_DELEGATE_H_ + +#include <string> namespace ui { class KeyEvent; @@ -15,8 +17,13 @@ class SearchBoxViewDelegate { public: - // Invoked when query text has changed by the user. - virtual void QueryChanged(SearchBoxViewBase* sender) = 0; + // Invoked when query text in the search box changes. + // `trimmed_query` - the search boxt textfiled contents with whitespace + // trimmed (which will generally match the query sent to search providers). + // `initiated_by_user` - whether the query changed as a result of user input + // (as opposed to the search box getting cleared). + virtual void QueryChanged(const std::u16string& trimmed_query, + bool initiated_by_user) = 0; // Invoked when the back button has been pressed. virtual void AssistantButtonPressed() = 0; @@ -42,4 +49,4 @@ } // namespace ash -#endif // ASH_SEARCH_BOX_SEARCH_BOX_VIEW_DELEGATE_H_ +#endif // ASH_APP_LIST_VIEWS_SEARCH_BOX_VIEW_DELEGATE_H_
diff --git a/ash/app_list/views/search_box_view_unittest.cc b/ash/app_list/views/search_box_view_unittest.cc index ec4556a..c85d3fd 100644 --- a/ash/app_list/views/search_box_view_unittest.cc +++ b/ash/app_list/views/search_box_view_unittest.cc
@@ -21,6 +21,7 @@ #include "ash/app_list/views/privacy_container_view.h" #include "ash/app_list/views/productivity_launcher_search_view.h" #include "ash/app_list/views/result_selection_controller.h" +#include "ash/app_list/views/search_box_view_delegate.h" #include "ash/app_list/views/search_result_page_view.h" #include "ash/constants/ash_features.h" #include "ash/public/cpp/app_list/app_list_color_provider.h" @@ -28,7 +29,6 @@ #include "ash/public/cpp/app_list/vector_icons/vector_icons.h" #include "ash/public/cpp/test/test_app_list_color_provider.h" #include "ash/search_box/search_box_constants.h" -#include "ash/search_box/search_box_view_delegate.h" #include "ash/shell.h" #include "ash/strings/grit/ash_strings.h" #include "ash/style/ash_color_provider.h" @@ -279,7 +279,8 @@ } // Overridden from SearchBoxViewDelegate: - void QueryChanged(SearchBoxViewBase* sender) override {} + void QueryChanged(const std::u16string& trimmed_query, + bool initiated_by_user) override {} void AssistantButtonPressed() override {} void CloseButtonPressed() override {} void ActiveChanged(SearchBoxViewBase* sender) override {}
diff --git a/ash/components/hid_detection/bluetooth_hid_detector.h b/ash/components/hid_detection/bluetooth_hid_detector.h index c52a9b8..3f436130 100644 --- a/ash/components/hid_detection/bluetooth_hid_detector.h +++ b/ash/components/hid_detection/bluetooth_hid_detector.h
@@ -11,8 +11,6 @@ namespace ash::hid_detection { -// TODO(gordonseto): Move this to HidDetectionManager when that class is -// created. struct BluetoothHidPairingState { BluetoothHidPairingState(const std::string& code, uint8_t num_keys_entered); BluetoothHidPairingState(BluetoothHidPairingState&& other); @@ -67,7 +65,8 @@ absl::optional<BluetoothHidMetadata> current_pairing_device; // Set if the current pairing requires a code that should be displayed to - // the user to enter. + // the user to enter. This will always be null if |current_pairing_device| + // is null. absl::optional<BluetoothHidPairingState> pairing_state; };
diff --git a/ash/components/hid_detection/fake_bluetooth_hid_detector.cc b/ash/components/hid_detection/fake_bluetooth_hid_detector.cc index 0499a1e..8ffa91a 100644 --- a/ash/components/hid_detection/fake_bluetooth_hid_detector.cc +++ b/ash/components/hid_detection/fake_bluetooth_hid_detector.cc
@@ -42,8 +42,15 @@ NotifyBluetoothHidDetectionStatusChanged(); } -void FakeBluetoothHidDetector::SimulatePairingFinished() { +void FakeBluetoothHidDetector::SetPairingState( + absl::optional<BluetoothHidPairingState> pairing_state) { + current_pairing_state_ = std::move(pairing_state); + NotifyBluetoothHidDetectionStatusChanged(); +} + +void FakeBluetoothHidDetector::SimulatePairingSessionEnded() { current_pairing_device_.reset(); + current_pairing_state_.reset(); NotifyBluetoothHidDetectionStatusChanged(); }
diff --git a/ash/components/hid_detection/fake_bluetooth_hid_detector.h b/ash/components/hid_detection/fake_bluetooth_hid_detector.h index ef0e623..7ea1400 100644 --- a/ash/components/hid_detection/fake_bluetooth_hid_detector.h +++ b/ash/components/hid_detection/fake_bluetooth_hid_detector.h
@@ -22,7 +22,8 @@ void SimulatePairingStarted( BluetoothHidDetector::BluetoothHidMetadata pairing_device); - void SimulatePairingFinished(); + void SetPairingState(absl::optional<BluetoothHidPairingState> pairing_state); + void SimulatePairingSessionEnded(); const InputDevicesStatus& input_devices_status() { return input_devices_status_;
diff --git a/ash/components/hid_detection/fake_hid_detection_manager.cc b/ash/components/hid_detection/fake_hid_detection_manager.cc index 149e8ad..0b3225ce 100644 --- a/ash/components/hid_detection/fake_hid_detection_manager.cc +++ b/ash/components/hid_detection/fake_hid_detection_manager.cc
@@ -21,7 +21,7 @@ void FakeHidDetectionManager::SetHidStatusTouchscreenDetected( bool touchscreen_detected) { - hid_detection_status_.touchscreen_detected = touchscreen_detected; + touchscreen_detected_ = touchscreen_detected; if (!is_hid_detection_active_) return; @@ -30,7 +30,7 @@ void FakeHidDetectionManager::SetHidStatusPointerMetadata( InputMetadata metadata) { - hid_detection_status_.pointer_metadata = metadata; + pointer_metadata_ = metadata; if (!is_hid_detection_active_) return; @@ -39,18 +39,23 @@ void FakeHidDetectionManager::SetHidStatusKeyboardMetadata( InputMetadata metadata) { - hid_detection_status_.keyboard_metadata = metadata; + keyboard_metadata_ = metadata; if (!is_hid_detection_active_) return; NotifyHidDetectionStatusChanged(); } +void FakeHidDetectionManager::SetPairingState( + absl::optional<BluetoothHidPairingState> pairing_state) { + pairing_state_ = std::move(pairing_state); + NotifyHidDetectionStatusChanged(); +} + void FakeHidDetectionManager::GetIsHidDetectionRequired( base::OnceCallback<void(bool)> callback) { - std::move(callback).Run( - IsInputMissing(hid_detection_status_.pointer_metadata) || - IsInputMissing(hid_detection_status_.keyboard_metadata)); + std::move(callback).Run(IsInputMissing(pointer_metadata_) || + IsInputMissing(keyboard_metadata_)); } void FakeHidDetectionManager::PerformStartHidDetection() { @@ -66,7 +71,14 @@ HidDetectionManager::HidDetectionStatus FakeHidDetectionManager::ComputeHidDetectionStatus() const { - return hid_detection_status_; + absl::optional<BluetoothHidPairingState> pairing_state; + if (pairing_state_.has_value()) { + pairing_state = BluetoothHidPairingState{ + pairing_state_.value().code, pairing_state_.value().num_keys_entered}; + } + + return HidDetectionStatus(pointer_metadata_, keyboard_metadata_, + touchscreen_detected_, std::move(pairing_state)); } } // namespace ash::hid_detection
diff --git a/ash/components/hid_detection/fake_hid_detection_manager.h b/ash/components/hid_detection/fake_hid_detection_manager.h index 9da96526..9f5f051 100644 --- a/ash/components/hid_detection/fake_hid_detection_manager.h +++ b/ash/components/hid_detection/fake_hid_detection_manager.h
@@ -20,6 +20,7 @@ void SetHidStatusTouchscreenDetected(bool touchscreen_detected); void SetHidStatusPointerMetadata(InputMetadata metadata); void SetHidStatusKeyboardMetadata(InputMetadata metadata); + void SetPairingState(absl::optional<BluetoothHidPairingState> pairing_state); bool is_hid_detection_active() const { return is_hid_detection_active_; } @@ -33,7 +34,11 @@ const override; bool is_hid_detection_active_ = false; - HidDetectionManager::HidDetectionStatus hid_detection_status_; + + InputMetadata pointer_metadata_; + InputMetadata keyboard_metadata_; + bool touchscreen_detected_ = false; + absl::optional<BluetoothHidPairingState> pairing_state_; }; } // namespace ash::hid_detection
diff --git a/ash/components/hid_detection/hid_detection_manager.cc b/ash/components/hid_detection/hid_detection_manager.cc index 30fc106..0190434 100644 --- a/ash/components/hid_detection/hid_detection_manager.cc +++ b/ash/components/hid_detection/hid_detection_manager.cc
@@ -8,6 +8,35 @@ namespace ash::hid_detection { +HidDetectionManager::HidDetectionStatus::HidDetectionStatus( + InputMetadata pointer_metadata, + InputMetadata keyboard_metadata, + bool touchscreen_detected, + absl::optional<BluetoothHidPairingState> pairing_state) + : pointer_metadata(pointer_metadata), + keyboard_metadata(keyboard_metadata), + touchscreen_detected(touchscreen_detected), + pairing_state(std::move(pairing_state)) {} + +HidDetectionManager::HidDetectionStatus::HidDetectionStatus( + HidDetectionStatus&& other) { + pointer_metadata = other.pointer_metadata; + keyboard_metadata = other.keyboard_metadata; + touchscreen_detected = other.touchscreen_detected; + pairing_state = std::move(other.pairing_state); +} + +HidDetectionManager::HidDetectionStatus& +HidDetectionManager::HidDetectionStatus::operator=(HidDetectionStatus&& other) { + pointer_metadata = other.pointer_metadata; + keyboard_metadata = other.keyboard_metadata; + touchscreen_detected = other.touchscreen_detected; + pairing_state = std::move(other.pairing_state); + return *this; +} + +HidDetectionManager::HidDetectionStatus::~HidDetectionStatus() = default; + HidDetectionManager::HidDetectionManager() { DCHECK(ash::features::IsOobeHidDetectionRevampEnabled()); }
diff --git a/ash/components/hid_detection/hid_detection_manager.h b/ash/components/hid_detection/hid_detection_manager.h index 6d2d3d0f..c0b06a1 100644 --- a/ash/components/hid_detection/hid_detection_manager.h +++ b/ash/components/hid_detection/hid_detection_manager.h
@@ -7,6 +7,7 @@ #include "base/callback.h" +#include "ash/components/hid_detection/bluetooth_hid_detector.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace ash::hid_detection { @@ -44,6 +45,14 @@ // Represents the status of inputs on the device. struct HidDetectionStatus { + HidDetectionStatus(InputMetadata pointer_metadata, + InputMetadata keyboard_metadata, + bool touchscreen_detected, + absl::optional<BluetoothHidPairingState> pairing_state); + HidDetectionStatus(HidDetectionStatus&& other); + HidDetectionStatus& operator=(HidDetectionStatus&& other); + ~HidDetectionStatus(); + // Pointer input info of the device. InputMetadata pointer_metadata; @@ -52,6 +61,10 @@ // Indicates the device has a touchscreen connected. bool touchscreen_detected = false; + + // Set if the current pairing requires a code that should be displayed to + // the user to enter. + absl::optional<BluetoothHidPairingState> pairing_state; }; class Delegate {
diff --git a/ash/components/hid_detection/hid_detection_manager_impl.cc b/ash/components/hid_detection/hid_detection_manager_impl.cc index 848b3d1..7ece9c5 100644 --- a/ash/components/hid_detection/hid_detection_manager_impl.cc +++ b/ash/components/hid_detection/hid_detection_manager_impl.cc
@@ -72,12 +72,13 @@ HidDetectionManagerImpl::ComputeHidDetectionStatus() const { BluetoothHidDetector::BluetoothHidDetectionStatus bluetooth_status = bluetooth_hid_detector_->GetBluetoothHidDetectionStatus(); - return HidDetectionManager::HidDetectionStatus{ + return HidDetectionManager::HidDetectionStatus( GetInputMetadata(connected_pointer_id_, BluetoothHidType::kPointer, bluetooth_status.current_pairing_device), GetInputMetadata(connected_keyboard_id_, BluetoothHidType::kKeyboard, bluetooth_status.current_pairing_device), - connected_touchscreen_id_.has_value()}; + connected_touchscreen_id_.has_value(), + std::move(bluetooth_status.pairing_state)); } void HidDetectionManagerImpl::InputDeviceAdded(
diff --git a/ash/components/hid_detection/hid_detection_manager_impl_unittest.cc b/ash/components/hid_detection/hid_detection_manager_impl_unittest.cc index eded63f..68d8ea4 100644 --- a/ash/components/hid_detection/hid_detection_manager_impl_unittest.cc +++ b/ash/components/hid_detection/hid_detection_manager_impl_unittest.cc
@@ -26,6 +26,7 @@ using InputDevicesStatus = BluetoothHidDetector::InputDevicesStatus; const char kTestHidName[] = "testName"; +const char kTestPinCode[] = "123456"; enum TestHidType { kMouse, @@ -53,7 +54,7 @@ void OnHidDetectionStatusChanged( HidDetectionManager::HidDetectionStatus status) override { ++num_hid_detection_status_changed_calls_; - last_hid_detection_status_ = status; + last_hid_detection_status_ = std::move(status); } size_t num_hid_detection_status_changed_calls_ = 0u; @@ -186,14 +187,23 @@ base::RunLoop().RunUntilIdle(); } - void SimulatePairingFinished() { - fake_bluetooth_hid_detector_->SimulatePairingFinished(); + void SimulatePairingCodeRequired( + const BluetoothHidPairingState& pairing_state) { + fake_bluetooth_hid_detector_->SetPairingState(BluetoothHidPairingState{ + pairing_state.code, pairing_state.num_keys_entered}); base::RunLoop().RunUntilIdle(); } - void AssertHidDetectionStatus(InputMetadata pointer_metadata, - InputMetadata keyboard_metadata, - bool touchscreen_detected) { + void SimulatePairingSessionEnded() { + fake_bluetooth_hid_detector_->SimulatePairingSessionEnded(); + base::RunLoop().RunUntilIdle(); + } + + void AssertHidDetectionStatus( + InputMetadata pointer_metadata, + InputMetadata keyboard_metadata, + bool touchscreen_detected, + const absl::optional<BluetoothHidPairingState>& pairing_state) { EXPECT_EQ(pointer_metadata.state, GetLastHidDetectionStatus()->pointer_metadata.state); EXPECT_EQ(pointer_metadata.detected_hid_name, @@ -204,6 +214,15 @@ GetLastHidDetectionStatus()->keyboard_metadata.detected_hid_name); EXPECT_EQ(touchscreen_detected, GetLastHidDetectionStatus()->touchscreen_detected); + EXPECT_EQ(pairing_state.has_value(), + GetLastHidDetectionStatus()->pairing_state.has_value()); + + if (pairing_state.has_value()) { + EXPECT_EQ(pairing_state->code, + GetLastHidDetectionStatus()->pairing_state->code); + EXPECT_EQ(pairing_state->num_keys_entered, + GetLastHidDetectionStatus()->pairing_state->num_keys_entered); + } } void AssertInputDevicesStatus(InputDevicesStatus input_devices_status) { @@ -298,7 +317,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/true); + /*touchscreen_detected=*/true, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -318,7 +338,8 @@ /*pointer_metadata=*/{InputState::kConnected, device_id}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -338,7 +359,8 @@ /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kConnected, device_id}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = false}); @@ -356,7 +378,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -370,7 +393,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/true); + /*touchscreen_detected=*/true, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -382,7 +406,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -394,7 +419,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -409,7 +435,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -422,7 +449,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -438,7 +466,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -450,7 +479,8 @@ /*pointer_metadata=*/{InputState::kPairedViaBluetooth, pointer_id1}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -462,7 +492,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -474,7 +505,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -488,7 +520,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -501,7 +534,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -517,7 +551,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -530,7 +565,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kConnectedViaUsb, keyboard_id1}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = false}); @@ -542,7 +578,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -554,7 +591,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -568,7 +606,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -581,7 +620,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -604,7 +644,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/true); + /*touchscreen_detected=*/true, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -618,7 +659,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/true); + /*touchscreen_detected=*/true, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -641,7 +683,8 @@ /*pointer_metadata=*/{InputState::kConnected, device_id1}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -654,7 +697,8 @@ /*pointer_metadata=*/{InputState::kPairedViaBluetooth, device_id2}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -678,7 +722,8 @@ /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, device_id1}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = false}); @@ -691,7 +736,8 @@ /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kConnected, device_id2}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = false}); @@ -717,7 +763,8 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kConnectedViaUsb, device_id1}, /*keyboard_metadata=*/{InputState::kConnected, device_id2}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = false}); @@ -727,7 +774,8 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kConnected, device_id2}, /*keyboard_metadata=*/{InputState::kConnected, device_id2}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = false}); @@ -738,7 +786,8 @@ /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kConnected, device_id3}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = false}); @@ -758,7 +807,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -770,7 +820,8 @@ /*pointer_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -783,18 +834,20 @@ /*pointer_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); - SimulatePairingFinished(); + SimulatePairingSessionEnded(); EXPECT_EQ(4u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -811,7 +864,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -823,20 +877,22 @@ /*pointer_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); // Simulate the pairing failing. - SimulatePairingFinished(); + SimulatePairingSessionEnded(); EXPECT_EQ(3u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -853,7 +909,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -864,7 +921,20 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); + EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); + AssertInputDevicesStatus( + {.pointer_is_missing = true, .keyboard_is_missing = true}); + + absl::optional<BluetoothHidPairingState> pairing_state = + BluetoothHidPairingState{kTestPinCode, /*num_keys_entered=*/6}; + SimulatePairingCodeRequired(pairing_state.value()); + EXPECT_EQ(3u, GetNumHidDetectionStatusChangedCalls()); + AssertHidDetectionStatus( + /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, + /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, + /*touchscreen_detected=*/false, pairing_state); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -872,21 +942,22 @@ // Simulate the pairing succeeding. AddDevice(TestHidType::kKeyboard, InputDeviceType::TYPE_BLUETOOTH, /*id_out=*/nullptr, kTestHidName); - EXPECT_EQ(3u, GetNumHidDetectionStatusChangedCalls()); - AssertHidDetectionStatus( - /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, - /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); - EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); - AssertInputDevicesStatus( - {.pointer_is_missing = true, .keyboard_is_missing = false}); - - SimulatePairingFinished(); EXPECT_EQ(4u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, pairing_state); + EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); + AssertInputDevicesStatus( + {.pointer_is_missing = true, .keyboard_is_missing = false}); + + SimulatePairingSessionEnded(); + EXPECT_EQ(5u, GetNumHidDetectionStatusChangedCalls()); + AssertHidDetectionStatus( + /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, + /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = false}); @@ -903,7 +974,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -914,20 +986,34 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); + EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); + AssertInputDevicesStatus( + {.pointer_is_missing = true, .keyboard_is_missing = true}); + + absl::optional<BluetoothHidPairingState> pairing_state = + BluetoothHidPairingState{kTestPinCode, /*num_keys_entered=*/6}; + SimulatePairingCodeRequired(pairing_state.value()); + EXPECT_EQ(3u, GetNumHidDetectionStatusChangedCalls()); + AssertHidDetectionStatus( + /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, + /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, + /*touchscreen_detected=*/false, pairing_state); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); // Simulate the pairing failing. - SimulatePairingFinished(); - EXPECT_EQ(3u, GetNumHidDetectionStatusChangedCalls()); + SimulatePairingSessionEnded(); + EXPECT_EQ(4u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -945,7 +1031,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -956,7 +1043,8 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -969,17 +1057,19 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = false}); - SimulatePairingFinished(); + SimulatePairingSessionEnded(); EXPECT_EQ(4u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = false}); @@ -997,7 +1087,8 @@ /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -1008,20 +1099,22 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); // Simulate the pairing failing. - SimulatePairingFinished(); + SimulatePairingSessionEnded(); EXPECT_EQ(3u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kSearching, /*detected_hid_name=*/""}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = true, .keyboard_is_missing = true}); @@ -1042,7 +1135,8 @@ /*pointer_metadata=*/{InputState::kConnectedViaUsb, device_id1}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -1053,7 +1147,8 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kConnectedViaUsb, device_id1}, /*keyboard_metadata=*/{InputState::kPairingViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(0u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true}); @@ -1066,17 +1161,19 @@ AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kConnectedViaUsb, device_id1}, /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = false}); - SimulatePairingFinished(); + SimulatePairingSessionEnded(); EXPECT_EQ(4u, GetNumHidDetectionStatusChangedCalls()); AssertHidDetectionStatus( /*pointer_metadata=*/{InputState::kConnectedViaUsb, device_id1}, /*keyboard_metadata=*/{InputState::kPairedViaBluetooth, kTestHidName}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(1u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = false}); @@ -1088,7 +1185,8 @@ /*pointer_metadata=*/{InputState::kConnectedViaUsb, device_id1}, /*keyboard_metadata=*/ {InputState::kSearching, /*detected_hid_name=*/""}, - /*touchscreen_detected=*/false); + /*touchscreen_detected=*/false, + /*pairing_state=*/absl::nullopt); EXPECT_EQ(2u, GetNumSetInputDevicesStatusCalls()); AssertInputDevicesStatus( {.pointer_is_missing = false, .keyboard_is_missing = true});
diff --git a/ash/components/tpm/BUILD.gn b/ash/components/tpm/BUILD.gn index 0a3f46b..1da457b 100644 --- a/ash/components/tpm/BUILD.gn +++ b/ash/components/tpm/BUILD.gn
@@ -29,14 +29,9 @@ "//chromeos/dbus/tpm_manager:tpm_manager_proto", "//chromeos/login/login_state", "//components/account_id", - "//components/policy/core/common:common_constants", - "//components/policy/proto", "//crypto", - "//google_apis", ] sources = [ - "install_attributes.cc", - "install_attributes.h", "prepare_tpm.cc", "prepare_tpm.h", "tpm_token_info_getter.cc", @@ -46,20 +41,6 @@ ] } -source_set("test_support") { - testonly = true - deps = [ - ":tpm", - "//base", - "//chromeos/dbus/tpm_manager:tpm_manager_proto", - "//components/policy/core/common:common_constants", - ] - sources = [ - "stub_install_attributes.cc", - "stub_install_attributes.h", - ] -} - source_set("unit_tests") { testonly = true deps = [ @@ -74,12 +55,9 @@ "//chromeos/dbus/cryptohome:cryptohome_proto", "//chromeos/dbus/tpm_manager", "//chromeos/dbus/tpm_manager:tpm_manager_proto", - "//components/policy/proto", - "//google_apis", "//testing/gtest", ] sources = [ - "install_attributes_unittest.cc", "prepare_tpm_unittest.cc", "tpm_token_info_getter_unittest.cc", ]
diff --git a/ash/components/tpm/DEPS b/ash/components/tpm/DEPS index 79f0fe5..811e6d6 100644 --- a/ash/components/tpm/DEPS +++ b/ash/components/tpm/DEPS
@@ -8,7 +8,6 @@ "+chromeos/ash/components/dbus", "+chromeos/dbus", "+components/account_id", - "+components/policy/core/common/cloud/cloud_policy_constants.h", "+components/policy/proto", "+google_apis/gaia", "+testing",
diff --git a/ash/quick_pair/repository/fast_pair/saved_device_registry.cc b/ash/quick_pair/repository/fast_pair/saved_device_registry.cc index 555e9f5..45d9c4c 100644 --- a/ash/quick_pair/repository/fast_pair/saved_device_registry.cc +++ b/ash/quick_pair/repository/fast_pair/saved_device_registry.cc
@@ -96,7 +96,7 @@ } const base::Value* result = - pref_service->Get(kFastPairSavedDevicesPref)->FindKey(mac_address); + pref_service->GetValue(kFastPairSavedDevicesPref).FindKey(mac_address); if (!result || !result->is_string()) { return absl::nullopt; }
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc index 287ab81..f46ced7 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.cc
@@ -13,6 +13,7 @@ #include "ash/quick_pair/common/device.h" #include "ash/quick_pair/common/fast_pair/fast_pair_metrics.h" #include "ash/quick_pair/common/logging.h" +#include "ash/quick_pair/common/protocol.h" #include "ash/quick_pair/common/quick_pair_browser_delegate.h" #include "ash/quick_pair/proto/fastpair.pb.h" #include "ash/quick_pair/repository/fast_pair/fast_pair_image_decoder.h" @@ -92,10 +93,9 @@ DiscoveryCallback callback) { const auto metadata_id = device->metadata_id; FastPairRepository::Get()->GetDeviceMetadata( - metadata_id, - base::BindRepeating(&FastPairPresenterImpl::OnDiscoveryMetadataRetrieved, - weak_pointer_factory_.GetWeakPtr(), std::move(device), - std::move(callback))); + metadata_id, base::BindRepeating( + &FastPairPresenterImpl::OnDiscoveryMetadataRetrieved, + weak_pointer_factory_.GetWeakPtr(), device, callback)); } void FastPairPresenterImpl::OnDiscoveryMetadataRetrieved( @@ -106,6 +106,11 @@ if (!device_metadata) return; + if (device->protocol == Protocol::kFastPairSubsequent) { + ShowSubsequentDiscoveryNotification(device, callback, device_metadata); + return; + } + // Anti-spoofing keys were introduced in Fast Pair v2, so if this isn't // available then the device is v1. if (device_metadata->GetDetails() @@ -130,8 +135,7 @@ Shell::Get()->session_controller()->login_status())) { QP_LOG(VERBOSE) << __func__ << ": in guest mode, showing guest notification"; - ShowGuestDiscoveryNotification(device, std::move(callback), - device_metadata); + ShowGuestDiscoveryNotification(device, callback, device_metadata); return; } @@ -142,16 +146,15 @@ // interpretation of the opt-in status. if (features::IsFastPairSavedDevicesEnabled() && features::IsFastPairSavedDevicesStrictOptInEnabled()) { - FastPairRepository::Get()->CheckOptInStatus( - base::BindOnce(&FastPairPresenterImpl::OnCheckOptInStatus, - weak_pointer_factory_.GetWeakPtr(), device, - std::move(callback), device_metadata)); + FastPairRepository::Get()->CheckOptInStatus(base::BindOnce( + &FastPairPresenterImpl::OnCheckOptInStatus, + weak_pointer_factory_.GetWeakPtr(), device, callback, device_metadata)); return; } // If we don't have SavedDevices flag enabled, then we can ignore the user's // opt in status and move forward to showing the User Discovery notification. - ShowUserDiscoveryNotification(device, std::move(callback), device_metadata); + ShowUserDiscoveryNotification(device, callback, device_metadata); } void FastPairPresenterImpl::OnCheckOptInStatus( @@ -162,12 +165,39 @@ QP_LOG(INFO) << __func__; if (status != nearby::fastpair::OptInStatus::STATUS_OPTED_IN) { - ShowGuestDiscoveryNotification(device, std::move(callback), - device_metadata); + ShowGuestDiscoveryNotification(device, callback, device_metadata); return; } - ShowUserDiscoveryNotification(device, std::move(callback), device_metadata); + ShowUserDiscoveryNotification(device, callback, device_metadata); +} + +void FastPairPresenterImpl::ShowSubsequentDiscoveryNotification( + scoped_refptr<Device> device, + DiscoveryCallback callback, + DeviceMetadata* device_metadata) { + if (!device_metadata) + return; + + // Since Subsequent Pairing scenario can only happen for a signed in user + // when a device has already been saved to their account, this should never + // be null. We cannot get to this scenario in Guest Mode. + signin::IdentityManager* identity_manager = + QuickPairBrowserDelegate::Get()->GetIdentityManager(); + DCHECK(identity_manager); + + const std::string& email = + identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin) + .email; + notification_controller_->ShowSubsequentDiscoveryNotification( + base::ASCIIToUTF16(device_metadata->GetDetails().name()), + base::ASCIIToUTF16(email), device_metadata->image(), + base::BindRepeating(&FastPairPresenterImpl::OnDiscoveryClicked, + weak_pointer_factory_.GetWeakPtr(), callback), + base::BindRepeating(&FastPairPresenterImpl::OnDiscoveryLearnMoreClicked, + weak_pointer_factory_.GetWeakPtr(), callback), + base::BindOnce(&FastPairPresenterImpl::OnDiscoveryDismissed, + weak_pointer_factory_.GetWeakPtr(), callback)); } void FastPairPresenterImpl::ShowGuestDiscoveryNotification( @@ -189,13 +219,13 @@ scoped_refptr<Device> device, DiscoveryCallback callback, DeviceMetadata* device_metadata) { - // Since we check this in |OnDiscoveryMetadataRetrieved| to determine if we - // should show the Guest notification, this should never be null. + // Since we check this in |OnInitialDiscoveryMetadataRetrieved| to determine + // if we should show the Guest notification, this should never be null. signin::IdentityManager* identity_manager = QuickPairBrowserDelegate::Get()->GetIdentityManager(); DCHECK(identity_manager); - const std::string email = + const std::string& email = identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin) .email; notification_controller_->ShowUserDiscoveryNotification( @@ -232,7 +262,7 @@ FastPairRepository::Get()->GetDeviceMetadata( metadata_id, base::BindOnce(&FastPairPresenterImpl::OnPairingMetadataRetrieved, - weak_pointer_factory_.GetWeakPtr(), std::move(device))); + weak_pointer_factory_.GetWeakPtr(), device)); } void FastPairPresenterImpl::OnPairingMetadataRetrieved( @@ -254,8 +284,7 @@ FastPairRepository::Get()->GetDeviceMetadata( metadata_id, base::BindOnce(&FastPairPresenterImpl::OnPairingFailedMetadataRetrieved, - weak_pointer_factory_.GetWeakPtr(), std::move(device), - std::move(callback))); + weak_pointer_factory_.GetWeakPtr(), device, callback)); } void FastPairPresenterImpl::OnPairingFailedMetadataRetrieved( @@ -305,8 +334,7 @@ metadata_id, base::BindOnce( &FastPairPresenterImpl::OnAssociateAccountMetadataRetrieved, - weak_pointer_factory_.GetWeakPtr(), std::move(device), - std::move(callback))); + weak_pointer_factory_.GetWeakPtr(), device, callback)); } void FastPairPresenterImpl::OnAssociateAccountMetadataRetrieved(
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h index 34df699..9f57885d 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl.h
@@ -79,6 +79,9 @@ void ShowGuestDiscoveryNotification(scoped_refptr<Device> device, DiscoveryCallback callback, DeviceMetadata* device_metadata); + void ShowSubsequentDiscoveryNotification(scoped_refptr<Device> device, + DiscoveryCallback callback, + DeviceMetadata* device_metadata); void OnDiscoveryClicked(DiscoveryCallback action_callback); void OnDiscoveryDismissed(DiscoveryCallback callback, bool user_dismissed); void OnDiscoveryLearnMoreClicked(DiscoveryCallback action_callback);
diff --git a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc index b6ba4a6..151ab79 100644 --- a/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc +++ b/ash/quick_pair/ui/fast_pair/fast_pair_presenter_impl_unittest.cc
@@ -52,6 +52,8 @@ "cros_fast_pair_pairing_notification_id"; const char kFastPairAssociateAccountNotificationId[] = "cros_fast_pair_associate_account_notification_id"; +const char kFastPairDiscoverySubsequentNotificationId[] = + "cros_fast_pair_discovery_subsequent_notification_id"; class TestMessageCenter : public message_center::FakeMessageCenter { public: @@ -138,8 +140,10 @@ metadata.mutable_anti_spoofing_key_pair()->set_public_key(decoded_key); repository_->SetFakeMetadata(kValidModelId, metadata); - device_ = base::MakeRefCounted<Device>(kValidModelId, kTestAddress, - Protocol::kFastPairInitial); + initially_paired_device_ = base::MakeRefCounted<Device>( + kValidModelId, kTestAddress, Protocol::kFastPairInitial); + subsequently_paired_device_ = base::MakeRefCounted<Device>( + kValidModelId, kTestAddress, Protocol::kFastPairSubsequent); fast_pair_presenter_ = std::make_unique<FastPairPresenterImpl>(&test_message_center_); } @@ -179,7 +183,8 @@ PairingFailedAction pairing_failed_action_; AssociateAccountAction associate_account_action_; TestMessageCenter test_message_center_; - scoped_refptr<Device> device_; + scoped_refptr<Device> initially_paired_device_; + scoped_refptr<Device> subsequently_paired_device_; mojo::SharedRemote<mojom::FastPairDataParser> data_parser_remote_; mojo::PendingRemote<mojom::FastPairDataParser> fast_pair_data_parser_; std::unique_ptr<FastPairDataParser> data_parser_; @@ -188,7 +193,8 @@ base::WeakPtrFactory<FastPairPresenterImplTest> weak_pointer_factory_{this}; }; -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_OptedIn_FlagEnabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_User_OptedIn_FlagEnabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kFastPairSavedDevices, @@ -204,16 +210,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_OptedIn_FlagDisabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_User_OptedIn_FlagDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{}, @@ -229,9 +237,10 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -239,7 +248,7 @@ } TEST_F(FastPairPresenterImplTest, - ShowDiscovery_User_OptedIn_StrictFlagDisabled) { + ShowInitialDiscovery_User_OptedIn_StrictFlagDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kFastPairSavedDevices}, @@ -254,16 +263,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_OptedOut_FlagEnabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_User_OptedOut_FlagEnabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kFastPairSavedDevices, @@ -279,16 +290,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_OptedOut_FlagDisabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_User_OptedOut_FlagDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{}, @@ -304,9 +317,10 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -314,7 +328,7 @@ } TEST_F(FastPairPresenterImplTest, - ShowDiscovery_User_OptedOut_StrictFlagDisabled) { + ShowInitialDiscovery_User_OptedOut_StrictFlagDisabled) { base::test::ScopedFeatureList feature_list; feature_list.InitWithFeatures( /*enabled_features=*/{features::kFastPairSavedDevices}, @@ -329,16 +343,17 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_Child) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_Child) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -348,9 +363,10 @@ Login(user_manager::UserType::USER_TYPE_CHILD); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -368,9 +384,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -382,7 +399,8 @@ kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_NoDeviceMetadata_FlagDisabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_NoDeviceMetadata_FlagDisabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -399,9 +417,10 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( @@ -409,7 +428,7 @@ } TEST_F(FastPairPresenterImplTest, - ShowDiscovery_NoDeviceMetadata_StrictFlagDisabled) { + ShowInitialDiscovery_NoDeviceMetadata_StrictFlagDisabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -425,16 +444,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_NoDeviceMetadata_FlagEnabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_NoDeviceMetadata_FlagEnabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -451,16 +472,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_V1Device_FlagEnabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_V1initially_paired_device_FlagEnabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -470,8 +493,8 @@ nearby::fastpair::Device metadata; repository_->SetFakeMetadata(kValidModelId, metadata); - device_ = base::MakeRefCounted<Device>(kValidModelId, kTestAddress, - Protocol::kFastPairInitial); + initially_paired_device_ = base::MakeRefCounted<Device>( + kValidModelId, kTestAddress, Protocol::kFastPairInitial); Login(user_manager::UserType::USER_TYPE_REGULAR); base::test::ScopedFeatureList feature_list; @@ -482,16 +505,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_V1Device_FlagDisabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_V1initially_paired_device_FlagDisabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -501,8 +526,8 @@ nearby::fastpair::Device metadata; repository_->SetFakeMetadata(kValidModelId, metadata); - device_ = base::MakeRefCounted<Device>(kValidModelId, kTestAddress, - Protocol::kFastPairInitial); + initially_paired_device_ = base::MakeRefCounted<Device>( + kValidModelId, kTestAddress, Protocol::kFastPairInitial); Login(user_manager::UserType::USER_TYPE_REGULAR); base::test::ScopedFeatureList feature_list; @@ -513,16 +538,18 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_V1Device_StrictFlagDisabled) { +TEST_F(FastPairPresenterImplTest, + ShowInitialDiscovery_V1initially_paired_device_StrictFlagDisabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryUserNotificationId)); @@ -532,8 +559,8 @@ nearby::fastpair::Device metadata; repository_->SetFakeMetadata(kValidModelId, metadata); - device_ = base::MakeRefCounted<Device>(kValidModelId, kTestAddress, - Protocol::kFastPairInitial); + initially_paired_device_ = base::MakeRefCounted<Device>( + kValidModelId, kTestAddress, Protocol::kFastPairInitial); Login(user_manager::UserType::USER_TYPE_REGULAR); base::test::ScopedFeatureList feature_list; @@ -543,9 +570,10 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -553,7 +581,7 @@ } TEST_F(FastPairPresenterImplTest, - ShowDiscovery_Regular_NoIdentityManager_FlagEnabled) { + ShowInitialDiscovery_Regular_NoIdentityManager_FlagEnabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); base::test::ScopedFeatureList feature_list; @@ -569,9 +597,10 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -579,7 +608,7 @@ } TEST_F(FastPairPresenterImplTest, - ShowDiscovery_Regular_NoIdentityManager_FlagDisabled) { + ShowInitialDiscovery_Regular_NoIdentityManager_FlagDisabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); base::test::ScopedFeatureList feature_list; @@ -595,9 +624,10 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -605,7 +635,7 @@ } TEST_F(FastPairPresenterImplTest, - ShowDiscovery_Regular_NoIdentityManager_StrictFlagDisabled) { + ShowInitialDiscovery_Regular_NoIdentityManager_StrictFlagDisabled) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); base::test::ScopedFeatureList feature_list; @@ -620,16 +650,17 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_OUT); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_ConnectClicked) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_User_ConnectClicked) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_REGULAR); @@ -640,9 +671,10 @@ features::kFastPairSavedDevicesStrictOptIn}); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -654,7 +686,7 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kPairToDevice); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_LearnMoreClicked) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_User_LearnMoreClicked) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_REGULAR); @@ -665,9 +697,10 @@ features::kFastPairSavedDevicesStrictOptIn}); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -679,7 +712,7 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kLearnMore); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_DismissedByUser) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_User_DismissedByUser) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_REGULAR); @@ -690,9 +723,10 @@ features::kFastPairSavedDevicesStrictOptIn}); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -704,7 +738,7 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kDismissedByUser); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_User_DismissedByOS) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_User_DismissedByOS) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_REGULAR); @@ -715,9 +749,10 @@ features::kFastPairSavedDevicesStrictOptIn}); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -729,7 +764,7 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kDismissed); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_Guest) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_Guest) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); @@ -739,16 +774,17 @@ Login(user_manager::UserType::USER_TYPE_GUEST); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_KioskApp) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_KioskApp) { EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); @@ -764,24 +800,26 @@ repository_->SetOptInStatus(nearby::fastpair::OptInStatus::STATUS_OPTED_IN); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( kFastPairDiscoveryGuestNotificationId)); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_Guest_ConnectClicked) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_Guest_ConnectClicked) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_GUEST); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -793,15 +831,16 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kPairToDevice); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_Guest_LearnMoreClicked) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_Guest_LearnMoreClicked) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_GUEST); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -813,15 +852,16 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kLearnMore); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_Guest_DismissedByUser) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_Guest_DismissedByUser) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_GUEST); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -833,15 +873,16 @@ EXPECT_EQ(discovery_action_, DiscoveryAction::kDismissedByUser); } -TEST_F(FastPairPresenterImplTest, ShowDiscovery_Guest_DismissedByOS) { +TEST_F(FastPairPresenterImplTest, ShowInitialDiscovery_Guest_DismissedByOS) { ON_CALL(*browser_delegate_, GetIdentityManager()) .WillByDefault(testing::Return(identity_manager_)); Login(user_manager::UserType::USER_TYPE_GUEST); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowDiscovery( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -862,7 +903,7 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); - fast_pair_presenter_->ShowPairing(device_); + fast_pair_presenter_->ShowPairing(initially_paired_device_); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -879,7 +920,7 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); - fast_pair_presenter_->ShowPairing(device_); + fast_pair_presenter_->ShowPairing(initially_paired_device_); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( @@ -896,9 +937,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowPairingFailed( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnPairingFailedAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -916,9 +958,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowPairingFailed( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnPairingFailedAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( @@ -931,9 +974,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowPairingFailed( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnPairingFailedAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -951,9 +995,10 @@ Login(user_manager::UserType::USER_TYPE_GUEST); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowPairingFailed( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnPairingFailedAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -975,9 +1020,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -990,9 +1036,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -1016,9 +1063,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( @@ -1036,9 +1084,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( @@ -1051,9 +1100,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -1071,9 +1121,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -1092,9 +1143,10 @@ Login(user_manager::UserType::USER_TYPE_REGULAR); base::RunLoop().RunUntilIdle(); fast_pair_presenter_->ShowAssociateAccount( - device_, + initially_paired_device_, base::BindRepeating(&FastPairPresenterImplTest::OnAssociateAccountAction, - weak_pointer_factory_.GetWeakPtr(), device_)); + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); base::RunLoop().RunUntilIdle(); EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( @@ -1106,5 +1158,107 @@ EXPECT_EQ(associate_account_action_, AssociateAccountAction::kDismissed); } +TEST_F(FastPairPresenterImplTest, ShowSubsequentDiscovery_Connect) { + EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + ON_CALL(*browser_delegate_, GetIdentityManager()) + .WillByDefault(testing::Return(identity_manager_)); + + Login(user_manager::UserType::USER_TYPE_REGULAR); + base::RunLoop().RunUntilIdle(); + fast_pair_presenter_->ShowDiscovery( + subsequently_paired_device_, + base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + test_message_center_.ClickOnNotificationButton( + /*id=*/kFastPairDiscoverySubsequentNotificationId, /*button_index=*/0); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(discovery_action_, DiscoveryAction::kPairToDevice); +} + +TEST_F(FastPairPresenterImplTest, ShowSubsequentDiscovery_LearnMore) { + EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + ON_CALL(*browser_delegate_, GetIdentityManager()) + .WillByDefault(testing::Return(identity_manager_)); + + Login(user_manager::UserType::USER_TYPE_REGULAR); + base::RunLoop().RunUntilIdle(); + fast_pair_presenter_->ShowDiscovery( + subsequently_paired_device_, + base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + test_message_center_.ClickOnNotificationButton( + /*id=*/kFastPairDiscoverySubsequentNotificationId, /*button_index=*/1); + base::RunLoop().RunUntilIdle(); + EXPECT_EQ(discovery_action_, DiscoveryAction::kLearnMore); +} + +TEST_F(FastPairPresenterImplTest, ShowSubsequentDiscovery_DismissedByUser) { + EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + ON_CALL(*browser_delegate_, GetIdentityManager()) + .WillByDefault(testing::Return(identity_manager_)); + + Login(user_manager::UserType::USER_TYPE_REGULAR); + base::RunLoop().RunUntilIdle(); + fast_pair_presenter_->ShowDiscovery( + subsequently_paired_device_, + base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + test_message_center_.Close( + /*id=*/kFastPairDiscoverySubsequentNotificationId, /*by_user=*/true); + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(discovery_action_, DiscoveryAction::kDismissedByUser); +} + +TEST_F(FastPairPresenterImplTest, ShowSubsequentDiscovery_DismissedByOS) { + EXPECT_FALSE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + ON_CALL(*browser_delegate_, GetIdentityManager()) + .WillByDefault(testing::Return(identity_manager_)); + + Login(user_manager::UserType::USER_TYPE_REGULAR); + base::RunLoop().RunUntilIdle(); + fast_pair_presenter_->ShowDiscovery( + subsequently_paired_device_, + base::BindRepeating(&FastPairPresenterImplTest::OnDiscoveryAction, + weak_pointer_factory_.GetWeakPtr(), + initially_paired_device_)); + base::RunLoop().RunUntilIdle(); + + EXPECT_TRUE(test_message_center_.FindVisibleNotificationById( + kFastPairDiscoverySubsequentNotificationId)); + + test_message_center_.Close( + /*id=*/kFastPairDiscoverySubsequentNotificationId, /*by_user=*/false); + base::RunLoop().RunUntilIdle(); + + EXPECT_EQ(discovery_action_, DiscoveryAction::kDismissed); +} + } // namespace quick_pair } // namespace ash
diff --git a/ash/rgb_keyboard/histogram_util.cc b/ash/rgb_keyboard/histogram_util.cc index f340c01..c4b6f79 100644 --- a/ash/rgb_keyboard/histogram_util.cc +++ b/ash/rgb_keyboard/histogram_util.cc
@@ -20,10 +20,11 @@ return "IndividualKey"; case rgbkbd::RgbKeyboardCapabilities::kFourZoneTwelveLed: return "FourZoneTwelveLed"; - case rgbkbd::RgbKeyboardCapabilities::kFourZoneFifteenLed: - return "FourZoneFifteenLed"; + case rgbkbd::RgbKeyboardCapabilities::kFourZoneFourLed: + return "FourZoneFourLed"; } } + void EmitRgbKeyboardCapabilityType( rgbkbd::RgbKeyboardCapabilities capabilities) { base::UmaHistogramEnumeration(kRgbKeyboardCapabilityTypeHistogramName,
diff --git a/ash/rgb_keyboard/histogram_util.h b/ash/rgb_keyboard/histogram_util.h index f8549b89..574b972 100644 --- a/ash/rgb_keyboard/histogram_util.h +++ b/ash/rgb_keyboard/histogram_util.h
@@ -26,8 +26,8 @@ kIndividualKey = 1, kFourZoneFortyLed = 2, kFourZoneTwelveLed = 3, - kFourZoneFifteenLed = 4, - kMaxValue = kFourZoneFifteenLed, + kFourZoneFourLed = 4, + kMaxValue = kFourZoneFourLed, }; enum class RgbKeyboardBacklightChangeType {
diff --git a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc index 8b8448f..f1db670 100644 --- a/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc +++ b/ash/rgb_keyboard/rgb_keyboard_manager_unittest.cc
@@ -103,9 +103,9 @@ std::make_pair(rgbkbd::RgbKeyboardCapabilities::kFourZoneTwelveLed, ash::rgb_keyboard::metrics::RgbKeyboardCapabilityType:: kFourZoneTwelveLed), - std::make_pair(rgbkbd::RgbKeyboardCapabilities::kFourZoneFifteenLed, + std::make_pair(rgbkbd::RgbKeyboardCapabilities::kFourZoneFourLed, ash::rgb_keyboard::metrics::RgbKeyboardCapabilityType:: - kFourZoneFifteenLed))); + kFourZoneFourLed))); TEST_P(KeyboardCapabilityHistogramEmittedTest, KeyboardCapabilityHistogramEmitted) { @@ -130,7 +130,7 @@ testing::Values(rgbkbd::RgbKeyboardCapabilities::kIndividualKey, rgbkbd::RgbKeyboardCapabilities::kFourZoneFortyLed, rgbkbd::RgbKeyboardCapabilities::kFourZoneTwelveLed, - rgbkbd::RgbKeyboardCapabilities::kFourZoneFifteenLed)); + rgbkbd::RgbKeyboardCapabilities::kFourZoneFourLed)); TEST_P(RgbChangeTypeHistogramEmittedTest, RgbChangeTypeHistogramEmitted) { base::HistogramTester histogram_tester;
diff --git a/ash/search_box/BUILD.gn b/ash/search_box/BUILD.gn index 8098396..ab4422e 100644 --- a/ash/search_box/BUILD.gn +++ b/ash/search_box/BUILD.gn
@@ -11,7 +11,6 @@ "search_box_constants.h", "search_box_view_base.cc", "search_box_view_base.h", - "search_box_view_delegate.h", ] deps = [
diff --git a/ash/search_box/search_box_view_base.cc b/ash/search_box/search_box_view_base.cc index 7b34b5099..d61c873 100644 --- a/ash/search_box/search_box_view_base.cc +++ b/ash/search_box/search_box_view_base.cc
@@ -11,7 +11,6 @@ #include "ash/constants/ash_features.h" #include "ash/public/cpp/app_list/app_list_color_provider.h" #include "ash/public/cpp/ash_typography.h" -#include "ash/search_box/search_box_view_delegate.h" #include "ash/strings/grit/ash_strings.h" #include "base/bind.h" #include "third_party/skia/include/core/SkPath.h" @@ -370,9 +369,8 @@ SearchBoxViewBase::InitParams::~InitParams() = default; -SearchBoxViewBase::SearchBoxViewBase(SearchBoxViewDelegate* delegate) - : delegate_(delegate), search_box_(new SearchBoxTextfield(this)) { - DCHECK(delegate_); +SearchBoxViewBase::SearchBoxViewBase() + : search_box_(new SearchBoxTextfield(this)) { SetLayoutManager(std::make_unique<views::FillLayout>()); const int between_child_spacing = @@ -570,8 +568,6 @@ UpdateButtonsVisibility(); OnSearchBoxActiveChanged(active); - NotifyActiveChanged(); - content_container_->Layout(); UpdateSearchBoxFocusPaint(); SchedulePaint(); @@ -648,35 +644,15 @@ ui::AXNodeData* node_data) {} void SearchBoxViewBase::ClearSearch() { - if (features::IsAutocompleteExtendedSuggestionsEnabled()) { - MaybeSetAutocompleteGhostText(std::u16string(), std::u16string()); - } - // Avoid setting |search_box_| text to empty if it is already empty. - if (search_box_->GetText() == std::u16string()) - return; - search_box_->SetText(std::u16string()); UpdateButtonsVisibility(); - // Updates model and fires query changed manually because SetText() above - // does not generate ContentsChanged() notification. - UpdateModel(false); - NotifyQueryChanged(); + HandleQueryChange(u"", /*initiated_by_user=*/false); } void SearchBoxViewBase::OnSearchBoxActiveChanged(bool active) {} void SearchBoxViewBase::UpdateSearchBoxFocusPaint() {} -void SearchBoxViewBase::NotifyQueryChanged() { - DCHECK(delegate_); - delegate_->QueryChanged(this); -} - -void SearchBoxViewBase::NotifyActiveChanged() { - DCHECK(delegate_); - delegate_->ActiveChanged(this); -} - void SearchBoxViewBase::UpdateButtonsVisibility() { DCHECK(close_button_); @@ -748,12 +724,10 @@ const std::u16string& new_contents) { // Set search box focused when query changes. search_box_->RequestFocus(); - UpdateModel(true); - NotifyQueryChanged(); + HandleQueryChange(new_contents, /*initiated_by_user=*/true); if (!new_contents.empty()) SetSearchBoxActive(true, ui::ET_KEY_PRESSED); UpdateButtonsVisibility(); - MaybeSetAutocompleteGhostText(std::u16string(), std::u16string()); } bool SearchBoxViewBase::HandleMouseEvent(views::Textfield* sender,
diff --git a/ash/search_box/search_box_view_base.h b/ash/search_box/search_box_view_base.h index 3d195bb..f323ff52 100644 --- a/ash/search_box/search_box_view_base.h +++ b/ash/search_box/search_box_view_base.h
@@ -32,7 +32,6 @@ namespace ash { class SearchBoxImageButton; -class SearchBoxViewDelegate; class SearchIconImageView; // These are used in histograms, do not remove/renumber entries. If you're @@ -52,7 +51,7 @@ class SearchBoxViewBase : public views::View, public views::TextfieldController { public: - explicit SearchBoxViewBase(SearchBoxViewDelegate* delegate); + SearchBoxViewBase(); SearchBoxViewBase(const SearchBoxViewBase&) = delete; SearchBoxViewBase& operator=(const SearchBoxViewBase&) = delete; @@ -86,6 +85,14 @@ views::ImageView* search_icon(); views::Textfield* search_box() { return search_box_; } + // Called when the query in the search box textfield changes. The search box + // implementation is expected to handle the new query. + // `query` the new search box query. + // `initiated_by_user` whether the query changes was a result of the user + // typing. + virtual void HandleQueryChange(const std::u16string& query, + bool initiated_by_user) = 0; + // Sets contents for the title and category labels used for ghost text // autocomplete. void MaybeSetAutocompleteGhostText(const std::u16string& title, @@ -124,7 +131,7 @@ virtual void UpdateSearchTextfieldAccessibleNodeData( ui::AXNodeData* node_data); - virtual void ClearSearch(); + void ClearSearch(); // Called when the search box active state changes. virtual void OnSearchBoxActiveChanged(bool active); @@ -158,12 +165,6 @@ void Init(const InitParams& params); - // Fires query change notification. - void NotifyQueryChanged(); - - // Nofifies the active status change. - void NotifyActiveChanged(); - // Updates the visibility of the close and assistant buttons. void UpdateButtonsVisibility(); @@ -184,8 +185,6 @@ bool HandleGestureEvent(views::Textfield* sender, const ui::GestureEvent& gesture_event) override; - SearchBoxViewDelegate* delegate() { return delegate_; } - views::BoxLayoutView* box_layout_view() { return content_container_; } void SetSearchBoxBackgroundCornerRadius(int corner_radius); @@ -204,9 +203,6 @@ // Shows/hides the virtual keyboard if the search box is active. virtual void UpdateKeyboardVisibility() {} - // Updates model text and selection model with current Textfield info. - virtual void UpdateModel(bool initiated_by_user) {} - // Updates the color and alignment of the placeholder text. virtual void UpdatePlaceholderTextStyle() {} @@ -219,8 +215,6 @@ private: void OnEnabledChanged(); - SearchBoxViewDelegate* const delegate_; - // Owned by views hierarchy. views::BoxLayoutView* content_container_; SearchIconImageView* search_icon_ = nullptr;
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_af.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_af.xtb index 5fdbb9e..82d495ab 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_af.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_af.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Sleep die skakel na 'n leë area op die oortjiestrook</translation> <translation id="8389638407792712197">Maak nuwe venster oop</translation> <translation id="8429696719963529183">Gebruik F-sleutels (F1 tot F12)</translation> -<translation id="8537650670971624753">Verlaat soekmodus</translation> <translation id="85690795166292698">Maak die skakel in 'n nuwe oortjie oop</translation> <translation id="8609384513243082612">Maak nuwe oortjie oop</translation> <translation id="8644639153978066712">Wys versteekte lêers in die Lêers-program</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_am.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_am.xtb index 03fec7d..fb0d6ed02 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_am.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_am.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">አገናኙን በትሩ ድርድር ላይ ወዳለ ባዶ ቦታ ይጎትቱት</translation> <translation id="8389638407792712197">አዲስ መስኮት ይክፈቱ</translation> <translation id="8429696719963529183">የF ቁልፎችን ይጠቀሙ (F1 እስከ F12)</translation> -<translation id="8537650670971624753">ከፍለጋ ሁነታ ይውጡ</translation> <translation id="85690795166292698">አገናኙን በአዲስ ትር ውስጥ ይክፈቱ</translation> <translation id="8609384513243082612">አዲስ ትር ይክፈቱ</translation> <translation id="8644639153978066712">በፋይሎች መተግበሪያ ውስጥ የተደበቁ ፋይሎችን አሳይ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb index cb68052..dd7f94c5 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ar.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">اسحب الرابط إلى منطقة فارغة على شريط علامات التبويب</translation> <translation id="8389638407792712197">فتح نافذة جديدة</translation> <translation id="8429696719963529183">استخدام مفاتيح F (من F1 إلى F12)</translation> -<translation id="8537650670971624753">الخروج من وضع البحث</translation> <translation id="85690795166292698">فتح الرابط في علامة تبويب جديدة</translation> <translation id="8609384513243082612">فتح علامة تبويب جديدة</translation> <translation id="8644639153978066712">عرض الملفات المخفية في تطبيق "الملفات"</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb index d06e9f9..8daf3704 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_as.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">লিংকটো টেবৰ ষ্ট্রিপৰ খালী ঠাইলৈ টানি আনি এৰক</translation> <translation id="8389638407792712197">নতুন ৱিণ্ড’ খোলক</translation> <translation id="8429696719963529183">F কীসমূহ ব্যৱহাৰ কৰক (F1ৰপৰা F12)</translation> -<translation id="8537650670971624753">সন্ধানৰ ম’ডৰ পৰা বাহিৰ হওক</translation> <translation id="85690795166292698">লিংকটো এটা নতুন টেবত খোলক</translation> <translation id="8609384513243082612">নতুন টেব খোলক</translation> <translation id="8644639153978066712">Files এপত লুকাই থকা ফাইলসমূহ দেখুৱাওক</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb index e1509987..2bd465f3 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_az.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Linki tabdakı boş əraziyə çəkin</translation> <translation id="8389638407792712197">Yeni pəncərə açın</translation> <translation id="8429696719963529183">F açarlarından (F1 - F12) istifadə edin</translation> -<translation id="8537650670971624753">Axtarış rejimindən çıxın</translation> <translation id="85690795166292698">Linki yeni tabda açın</translation> <translation id="8609384513243082612">Yeni tab açın</translation> <translation id="8644639153978066712">Gizlədilmiş faylları Fayl tətbiqində göstərin</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb index dd1526b4..46fd1762 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_be.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Перацягнуць спасылку на пустое месца на панэлі ўкладак</translation> <translation id="8389638407792712197">Адкрыць новае акно</translation> <translation id="8429696719963529183">Выкарыстоўваць функцыянальныя клавішы (F1 – F12)</translation> -<translation id="8537650670971624753">Выйсці з рэжыму пошуку</translation> <translation id="85690795166292698">Адкрыць спасылку ў новай укладцы</translation> <translation id="8609384513243082612">Адкрыць новую ўкладку</translation> <translation id="8644639153978066712">Паказваць схаваныя файлы ў праграме "Файлы"</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb index d4c26b5..71ddfe0 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bg.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Преместете с плъзгане връзката до празен участък на лентата с раздели</translation> <translation id="8389638407792712197">Отваряне на нов прозорец</translation> <translation id="8429696719963529183">Използване на функционалните клавиши (F1 до F12)</translation> -<translation id="8537650670971624753">Изход от режима на търсене</translation> <translation id="85690795166292698">Отваряне на връзката в нов раздел</translation> <translation id="8609384513243082612">Отваряне на нов раздел</translation> <translation id="8644639153978066712">Показване на скритите файлове в приложението Файлове</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb index ff77d83..bcaa1507 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bn.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ট্যাব বারের ফাঁকা অঞ্চলে একটি লিঙ্ক টেনে আনুন</translation> <translation id="8389638407792712197">নতুন উইন্ডো খুলুন</translation> <translation id="8429696719963529183">F কীগুলি ব্যবহার করুন (F1 থেকে F12)</translation> -<translation id="8537650670971624753">সার্চ মোড থেকে বেরিয়ে আসুন</translation> <translation id="85690795166292698">একটি নতুন ট্যাবে লিঙ্ক খুলুন</translation> <translation id="8609384513243082612">নতুন ট্যাব খুলুন</translation> <translation id="8644639153978066712">ফাইল অ্যাপে লুকিয়ে থাকা ফাইলগুলি ডিসপ্লে করুন</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bs.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bs.xtb index 3c2d448d..06cbc76 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_bs.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_bs.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Prevucite link na prazan prostor na traci kartice</translation> <translation id="8389638407792712197">Otvori novi prozor</translation> <translation id="8429696719963529183">Korištenje F tipki (od F1 do F12)</translation> -<translation id="8537650670971624753">Izađi iz načina rada za pretraživanje</translation> <translation id="85690795166292698">Otvorite link u novoj kartici</translation> <translation id="8609384513243082612">Otvaranje nove kartice</translation> <translation id="8644639153978066712">Prikaz skrivenih fajlova u aplikaciji Fajlovi</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb index d683d0b..d4a34aac 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ca.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arrossega l'enllaç a una àrea buida de la barra de pestanyes</translation> <translation id="8389638407792712197">Obre una finestra nova</translation> <translation id="8429696719963529183">Fes servir les tecles de funció (F1 a F12)</translation> -<translation id="8537650670971624753">Surt del mode de cerca</translation> <translation id="85690795166292698">Obre l'enllaç en una pestanya nova</translation> <translation id="8609384513243082612">Obre una pestanya nova</translation> <translation id="8644639153978066712">Mostra els fitxers amagats a l'aplicació Fitxers</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_cs.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_cs.xtb index 8e2e0e1..dd94a55 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_cs.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_cs.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Přetáhněte odkaz na prázdné místo na liště karet</translation> <translation id="8389638407792712197">Otevřít nové okno</translation> <translation id="8429696719963529183">Použít funkční klávesy (F1 až F12)</translation> -<translation id="8537650670971624753">Opustit režim vyhledávání</translation> <translation id="85690795166292698">Otevřít odkaz na nové kartě</translation> <translation id="8609384513243082612">Otevřít novou kartu</translation> <translation id="8644639153978066712">Zobrazit v aplikaci Soubory skryté soubory</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb index 0a826afe..09b27f1 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_cy.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Llusgwch y ddolen i fan gwag ar y stribed tabiau</translation> <translation id="8389638407792712197">Agor ffenestr newydd</translation> <translation id="8429696719963529183">Defnyddiwch fysellau F (F1 i F12)</translation> -<translation id="8537650670971624753">Gadael y modd chwilio</translation> <translation id="85690795166292698">Agor y ddolen mewn tab newydd</translation> <translation id="8609384513243082612">Agor tab newydd</translation> <translation id="8644639153978066712">Dangos ffeiliau cudd yn yr ap Files</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb index b15abcd8..603f7f5 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_da.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Træk linket til et tomt område på fanelinjen</translation> <translation id="8389638407792712197">Åbn et nyt vindue</translation> <translation id="8429696719963529183">Brug F-tasterne (F1 til F12)</translation> -<translation id="8537650670971624753">Afslut søgetilstand</translation> <translation id="85690795166292698">Åbn linket på en ny fane</translation> <translation id="8609384513243082612">Åbn en ny fane</translation> <translation id="8644639153978066712">Vis skjulte filer i appen Filer</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb index 76bd59b..61fdbe9 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_de.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Link in einen leeren Bereich auf der Tableiste ziehen</translation> <translation id="8389638407792712197">Neues Fenster öffnen</translation> <translation id="8429696719963529183">Funktionstasten F1 bis F12 verwenden</translation> -<translation id="8537650670971624753">Suchmodus beenden</translation> <translation id="85690795166292698">Link in einem neuen Tab öffnen</translation> <translation id="8609384513243082612">Neuen Tab öffnen</translation> <translation id="8644639153978066712">Verborgene Dateien in der App "Dateien" anzeigen</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb index 3af3eeb..fb38bc04e 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_el.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Σύρετε τον σύνδεσμο σε μια κενή περιοχή της γραμμής καρτελών</translation> <translation id="8389638407792712197">Άνοιγμα νέου παραθύρου</translation> <translation id="8429696719963529183">Χρήση των πλήκτρων F (F1 έως F12)</translation> -<translation id="8537650670971624753">Έξοδος από τη λειτουργία αναζήτησης</translation> <translation id="85690795166292698">Άνοιγμα του συνδέσμου σε νέα καρτέλα</translation> <translation id="8609384513243082612">Άνοιγμα νέας καρτέλας</translation> <translation id="8644639153978066712">Εμφάνιση κρυφών αρχείων στην εφαρμογή Αρχεία</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb index 3765bb1..86326ca 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_en-GB.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Drag the link to a blank area on the tab strip</translation> <translation id="8389638407792712197">Open new window</translation> <translation id="8429696719963529183">Use F keys (F1 to F12)</translation> -<translation id="8537650670971624753">Exit search mode</translation> <translation id="85690795166292698">Open the link in a new tab</translation> <translation id="8609384513243082612">Open new tab</translation> <translation id="8644639153978066712">Display hidden files in the Files app</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb index 9ba05b0..6f66d01 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es-419.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arrastra el vínculo al área en blanco de la barra de pestañas</translation> <translation id="8389638407792712197">Abrir una ventana nueva</translation> <translation id="8429696719963529183">Usar las teclas de función (F1 a F12)</translation> -<translation id="8537650670971624753">Salir del modo de búsqueda</translation> <translation id="85690795166292698">Abrir el vínculo en una pestaña nueva</translation> <translation id="8609384513243082612">Abrir una pestaña nueva</translation> <translation id="8644639153978066712">Mostrar archivos ocultos en la app de Archivos</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb index edd2ef4..4df846a 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_es.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arrastra el enlace a un área en blanco de la barra de pestañas</translation> <translation id="8389638407792712197">Abrir nueva ventana</translation> <translation id="8429696719963529183">Utilizar las teclas F (de F1 a F12)</translation> -<translation id="8537650670971624753">Salir del modo de búsqueda</translation> <translation id="85690795166292698">Abrir el enlace en una pestaña nueva</translation> <translation id="8609384513243082612">Abrir nueva pestaña</translation> <translation id="8644639153978066712">Mostrar archivos ocultos en la aplicación Archivos</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_et.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_et.xtb index 4a8d7f3..3a18a47 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_et.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_et.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Lohistage link vahelehtede ribal tühjale alale</translation> <translation id="8389638407792712197">Uue akna avamine</translation> <translation id="8429696719963529183">F-klahvide kasutamine (F1–F12)</translation> -<translation id="8537650670971624753">Välju otsingurežiimist</translation> <translation id="85690795166292698">Lingi avamine uuel vahelehel</translation> <translation id="8609384513243082612">Uue vahelehe avamine</translation> <translation id="8644639153978066712">Peidetud failide kuvamine rakenduses Failid</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb index fa34f4a..668cc07 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_eu.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arrastatu esteka fitxen zintako zuriune batera</translation> <translation id="8389638407792712197">Ireki beste leiho bat</translation> <translation id="8429696719963529183">Erabili F teklak (F1 eta F12 artean)</translation> -<translation id="8537650670971624753">Irten bilaketa modutik</translation> <translation id="85690795166292698">Ireki esteka beste fitxa batean</translation> <translation id="8609384513243082612">Ireki beste fitxa bat</translation> <translation id="8644639153978066712">Bistaratu ezkutatutako fitxategiak Fitxategiak aplikazioan</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fa.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fa.xtb index 78b4aed..44998223 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fa.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fa.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">کشیدن پیوند به قسمتی خالی در نوار برگه</translation> <translation id="8389638407792712197">باز کردن پنجره جدید</translation> <translation id="8429696719963529183">استفاده از کلیدهای F (F1 تا F12)</translation> -<translation id="8537650670971624753">خروج از حالت جستجو</translation> <translation id="85690795166292698">بازکردن پیوند در یک برگه جدید</translation> <translation id="8609384513243082612">بازکردن برگه جدید</translation> <translation id="8644639153978066712">نمایش فایلهای مخفی در برنامه Files</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb index 92ba1b4..ffa5c620 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fi.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Vedä linkki välilehtirivin ryhjään kohtaan</translation> <translation id="8389638407792712197">Avaa uusi ikkuna</translation> <translation id="8429696719963529183">Käytä F-näppäimiä (F1–F12)</translation> -<translation id="8537650670971624753">Poistu hakutilasta</translation> <translation id="85690795166292698">Avaa linkki uudella välilehdellä</translation> <translation id="8609384513243082612">Avaa uusi välilehti</translation> <translation id="8644639153978066712">Näytä piilotetut tiedostot Tiedostot-sovelluksessa</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fil.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fil.xtb index cc9a88e..e11282a 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fil.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fil.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">I-drag ang link sa isang blankong bahagi sa tab strip</translation> <translation id="8389638407792712197">Magbukas ng bagong window</translation> <translation id="8429696719963529183">Gumamit ng mga F key (F1 hanggang F12)</translation> -<translation id="8537650670971624753">Lumabas sa search mode</translation> <translation id="85690795166292698">Buksan ang link sa isang bagong tab</translation> <translation id="8609384513243082612">Magbukas ng bagong tab</translation> <translation id="8644639153978066712">Ipakita ang mga nakatagong file sa app na Mga File</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb index 3ad1968d..ef0882c6 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr-CA.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Faites glisser le lien vers une zone vide de la bande d'onglets</translation> <translation id="8389638407792712197">Ouvrir une nouvelle fenêtre</translation> <translation id="8429696719963529183">Utiliser les touches F (F1 à F12)</translation> -<translation id="8537650670971624753">Sortir du mode de recherche</translation> <translation id="85690795166292698">Ouvrir le lien dans un nouvel onglet</translation> <translation id="8609384513243082612">Ouvrir un nouvel onglet</translation> <translation id="8644639153978066712">Afficher les fichiers masqués dans l'application Fichiers</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb index c388aa8..88cef21 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_fr.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Faites glisser le lien vers une zone vierge de la barre d'onglets</translation> <translation id="8389638407792712197">Ouvrir une nouvelle fenêtre</translation> <translation id="8429696719963529183">Utiliser les touches F (F1 à F12)</translation> -<translation id="8537650670971624753">Quitter le mode Recherche</translation> <translation id="85690795166292698">Ouvrir le lien dans un nouvel onglet</translation> <translation id="8609384513243082612">Ouvrir un nouvel onglet</translation> <translation id="8644639153978066712">Afficher les fichiers masqués dans l'application Fichiers</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb index 65b3648e..ebbae73 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_gl.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arrastra a ligazón a unha zona baleira da franxa de pestanas</translation> <translation id="8389638407792712197">Abre unha nova ventá</translation> <translation id="8429696719963529183">Usa as teclas F (de F1 a F12)</translation> -<translation id="8537650670971624753">Saír do modo de busca</translation> <translation id="85690795166292698">Abre a ligazón nunha nova pestana</translation> <translation id="8609384513243082612">Abre unha nova pestana</translation> <translation id="8644639153978066712">Mostra os ficheiros ocultos na aplicación Ficheiros</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_gu.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_gu.xtb index 0d280a3..adff6ab9 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_gu.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_gu.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">લિંકને ટૅબ સ્ટ્રિપ પરના ખાલી વિસ્તારમાં ખેંચો</translation> <translation id="8389638407792712197">નવી વિંડો ખોલો</translation> <translation id="8429696719963529183">F કી (F1 થી F12)નો ઉપયોગ કરો</translation> -<translation id="8537650670971624753">શોધ મોડમાંથી બહાર નીકળો</translation> <translation id="85690795166292698">લિંકને નવા ટૅબમાં ખોલો</translation> <translation id="8609384513243082612">નવું ટૅબ ખોલો</translation> <translation id="8644639153978066712">Files ઍપમાંની છુપાયેલી ફાઇલો બતાવો</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hi.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hi.xtb index 741aa46..bb99303 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hi.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hi.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">लिंक को टैब स्ट्रिप पर खाली जगह में खींचें और छोड़ें</translation> <translation id="8389638407792712197">नई विंडो खोलें</translation> <translation id="8429696719963529183">F कुंजियों (F1 से F12) का इस्तेमाल करें</translation> -<translation id="8537650670971624753">खोज मोड से बाहर निकलें</translation> <translation id="85690795166292698">लिंक को नए टैब में खोलें</translation> <translation id="8609384513243082612">नया टैब खोलें</translation> <translation id="8644639153978066712">Files ऐप्लिकेशन में छिपी हुई फ़ाइलें दिखाएं</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hr.xtb index 3056f3f9..9defda0 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hr.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hr.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Povucite vezu na prazno područje na vrpci kartica</translation> <translation id="8389638407792712197">Otvaranje novog prozora</translation> <translation id="8429696719963529183">Upotreba F tipki (od F1 to F12)</translation> -<translation id="8537650670971624753">Izlaz iz načina pretraživanja</translation> <translation id="85690795166292698">Otvaranje veze u novoj kartici</translation> <translation id="8609384513243082612">Otvaranje nove kartice</translation> <translation id="8644639153978066712">Prikazivanje skrivenih datoteka u aplikaciji Datoteke</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hu.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hu.xtb index 09f1632..8d4f77d 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hu.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hu.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">A link húzása a lapsor egy üres területére</translation> <translation id="8389638407792712197">Új ablak megnyitása</translation> <translation id="8429696719963529183">Funkcióbillentyűk (F1–F12) használata</translation> -<translation id="8537650670971624753">Kilépés a keresési módból</translation> <translation id="85690795166292698">Link megnyitása új lapon</translation> <translation id="8609384513243082612">Új lap megnyitása</translation> <translation id="8644639153978066712">Rejtett fájlok megjelenítése a Fájlok alkalmazásban</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb index b44e62b..51c0b0f 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_hy.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Քաշեք հղումը դատարկ տեղ ներդիրների գոտում</translation> <translation id="8389638407792712197">Բացել նոր պատուհան</translation> <translation id="8429696719963529183">Օգտագործել F ստեղները (F1-ից F12)</translation> -<translation id="8537650670971624753">Դուրս գալ որոնման ռեժիմից</translation> <translation id="85690795166292698">Բացել հղումը նոր ներդիրում</translation> <translation id="8609384513243082612">Բացել նոր ներդիր</translation> <translation id="8644639153978066712">Ցուցադրել թաքցված ֆայլերը «Ֆայլեր» հավելվածում</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb index fd29310..18d083ab 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_id.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Tarik link ke area kosong di tab setrip</translation> <translation id="8389638407792712197">Membuka jendela baru</translation> <translation id="8429696719963529183">Menggunakan tombol F (F1 sampai F12)</translation> -<translation id="8537650670971624753">Keluar dari mode penelusuran</translation> <translation id="85690795166292698">Membuka link di tab baru</translation> <translation id="8609384513243082612">Membuka tab baru</translation> <translation id="8644639153978066712">Menampilkan file tersembunyi dalam aplikasi File</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb index 4fb82ab..b9fc126 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_is.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Dragðu tengilinn yfir á auðan hluta á fliparæmunni</translation> <translation id="8389638407792712197">Opna nýjan glugga</translation> <translation id="8429696719963529183">Nota F-lykla (F1 til F12)</translation> -<translation id="8537650670971624753">Hætta í leitarstillingu</translation> <translation id="85690795166292698">Opna tengilinn í nýjum flipa</translation> <translation id="8609384513243082612">Opna nýjan flipa</translation> <translation id="8644639153978066712">Birta faldar skrár í forritinu Skrár</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_it.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_it.xtb index 1df4929..8173cde 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_it.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_it.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Trascina il link in un'area vuota della tabstrip</translation> <translation id="8389638407792712197">Apre una nuova finestra</translation> <translation id="8429696719963529183">Utilizza i tasti F (da F1 a F12)</translation> -<translation id="8537650670971624753">Esci dalla modalità di ricerca</translation> <translation id="85690795166292698">Apre il link in una nuova scheda</translation> <translation id="8609384513243082612">Apre una nuova scheda</translation> <translation id="8644639153978066712">Visualizza i file nascosti nell'app File</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb index 23d287c..bcc3984 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_iw.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">גרירת הקישור לאזור ריק בשורת הכרטיסיות</translation> <translation id="8389638407792712197">פתיחת חלון חדש</translation> <translation id="8429696719963529183">שימוש במקשי F (F1 עד F12)</translation> -<translation id="8537650670971624753">יציאה ממצב חיפוש</translation> <translation id="85690795166292698">פתיחת הקישור בכרטיסייה חדשה</translation> <translation id="8609384513243082612">פתיחת כרטיסייה חדשה</translation> <translation id="8644639153978066712">הצגת קבצים מוסתרים באפליקציה 'קבצים'</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ja.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ja.xtb index e548c3f..a4cafe3 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ja.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ja.xtb
@@ -203,7 +203,6 @@ <translation id="8388247778047144397">リンクをドラッグしてタブストリップの空白領域に移動する</translation> <translation id="8389638407792712197">新しいウィンドウを開く</translation> <translation id="8429696719963529183">F キー(F1~F12)を使用する</translation> -<translation id="8537650670971624753">検索モードを終了</translation> <translation id="85690795166292698">新しいタブでリンクを開く</translation> <translation id="8609384513243082612">新しいタブを開く</translation> <translation id="8644639153978066712">ファイルアプリで隠しファイルを表示する</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb index 622fd00..1f266fa 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ka.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ჩავლებით გადაიტანეთ ბმული ჩანართების ზოლის ცარიელ არეზე</translation> <translation id="8389638407792712197">ახალი ფანჯრის გახსნა</translation> <translation id="8429696719963529183">F-კლავიშების გამოყენება (F1-დან F12-მდე)</translation> -<translation id="8537650670971624753">ძიების რეჟიმიდან გამოსვლა</translation> <translation id="85690795166292698">ბმულის გახსნა ახალ ჩანართში</translation> <translation id="8609384513243082612">ახალი ჩანართის გახსნა</translation> <translation id="8644639153978066712">ფაილების აპში დამალული ფაილების ჩვენება</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb index 5b37e82..a03e7f7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kk.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Сілтемені қойындылар жолағындағы бос жерге апарыңыз</translation> <translation id="8389638407792712197">Жаңа терезе ашу</translation> <translation id="8429696719963529183">F пернелерін пайдалану (F1-F12)</translation> -<translation id="8537650670971624753">Іздеу режимінен шығу</translation> <translation id="85690795166292698">Сілтемені жаңа қойындыда ашу</translation> <translation id="8609384513243082612">Жаңа қойынды ашу</translation> <translation id="8644639153978066712">Жасырын файлдарды Files қолданбасында көрсету</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb index 55e37234..0944d9b 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_km.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">អូសតំណទៅកាន់តំបន់ទទេនៅលើរបារផ្ទាំង</translation> <translation id="8389638407792712197">បើកវិនដូថ្មី</translation> <translation id="8429696719963529183">ប្រើគ្រាប់ចុច F (F1 ដល់ F12)</translation> -<translation id="8537650670971624753">ចាកចេញពីមុខងារស្វែងរក</translation> <translation id="85690795166292698">បើកតំណនៅក្នុងផ្ទាំងថ្មី</translation> <translation id="8609384513243082612">បើកផ្ទាំងថ្មី</translation> <translation id="8644639153978066712">បង្ហាញឯកសារដែលបានលាក់នៅក្នុងកម្មវិធីឯកសារ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kn.xtb index 81c05d1e..a46c292 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_kn.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_kn.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ಟ್ಯಾಬ್ ಪಟ್ಟಿಯಲ್ಲಿನ ಖಾಲಿ ವಲಯಕ್ಕೆ ಲಿಂಕ್ ಎಳೆಯಿರಿ</translation> <translation id="8389638407792712197">ಹೊಸ ವಿಂಡೋವನ್ನು ತೆರೆಯಿರಿ</translation> <translation id="8429696719963529183">F ಕೀಗಳನ್ನು ಬಳಸಿ (F1 ನಿಂದ F12)</translation> -<translation id="8537650670971624753">ಹುಡುಕಾಟ ಮೋಡ್ನಿಂದ ನಿರ್ಗಮಿಸಿ</translation> <translation id="85690795166292698">ಹೊಸ ಟ್ಯಾಬ್ನಲ್ಲಿ ಲಿಂಕ್ ತೆರೆಯಿರಿ</translation> <translation id="8609384513243082612">ಹೊಸ ಟ್ಯಾಬ್ ತೆರೆಯಿರಿ</translation> <translation id="8644639153978066712">ಫೈಲ್ಗಳ ಅಪ್ಲಿಕೇಶನ್ನಲ್ಲಿ ಮರೆಮಾಡಿದ ಫೈಲ್ಗಳನ್ನು ಪ್ರದರ್ಶಿಸಿ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb index d1408a14..ad373cf 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ko.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">링크를 탭 표시줄의 빈 영역으로 드래그</translation> <translation id="8389638407792712197">새 창 열기</translation> <translation id="8429696719963529183">F 키(F1~F12) 사용</translation> -<translation id="8537650670971624753">검색 모드 종료</translation> <translation id="85690795166292698">새 탭에서 링크 열기</translation> <translation id="8609384513243082612">새 탭 열기</translation> <translation id="8644639153978066712">파일 앱에 숨겨진 파일 표시하기</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ky.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ky.xtb index 917a3c08..fc27a080 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ky.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ky.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Шилтемени өтмөк тасмасындагы бош жерге сүйрөңүз</translation> <translation id="8389638407792712197">Жаңы терезе ачуу</translation> <translation id="8429696719963529183">F баскычтарын колдонуу (F1'ден F12'ге чейин)</translation> -<translation id="8537650670971624753">Издөө режиминен чыгуу</translation> <translation id="85690795166292698">Шилтемени жаңы өтмөктө ачуу</translation> <translation id="8609384513243082612">Жаңы өтмөк ачуу</translation> <translation id="8644639153978066712">Жашырылган файлдарды Файлдар колдонмосунда көрсөтүү</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb index 6394832..6b3ff107 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lo.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ລາກລິ້ງໄປໃສ່ພື້ນທີ່ຫວ່າງໃນລາຍແຖບ</translation> <translation id="8389638407792712197">ເປີດໜ້າຈໍໃໝ່</translation> <translation id="8429696719963529183">ໃຊ້ປຸ່ມ F (F1 ຫາ F12)</translation> -<translation id="8537650670971624753">ອອກຈາກໂໝດຊອກຫາ</translation> <translation id="85690795166292698">ເປີດລິ້ງໃນແຖບໃໝ່</translation> <translation id="8609384513243082612">ເປີດແຖບໃໝ່</translation> <translation id="8644639153978066712">ສະແດງໄຟລ໌ທີ່ເຊື່ອງໄວ້ໃນແອັບໄຟລ໌</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb index 6e45395..0ab115d 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lt.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Nuvilkite nuorodą į tuščią sritį skirtuko juostelėje</translation> <translation id="8389638407792712197">Atidaryti naują langą</translation> <translation id="8429696719963529183">Naudoti F klavišus (F1–F12)</translation> -<translation id="8537650670971624753">Išeiti iš paieškos režimo</translation> <translation id="85690795166292698">Atidaryti nuorodą naujame skirtuke</translation> <translation id="8609384513243082612">Atidaryti naują skirtuką</translation> <translation id="8644639153978066712">Pateikti paslėptus failus Failų programoje</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb index 44273699..1c98186 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_lv.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Vilkt saiti uz tukšu apgabalu ciļņu joslā</translation> <translation id="8389638407792712197">Atvērt jaunu logu</translation> <translation id="8429696719963529183">Izmantot funkcionālos taustiņus (no F1 līdz F12)</translation> -<translation id="8537650670971624753">Iziet no meklēšanas režīma</translation> <translation id="85690795166292698">Atvērt saiti jaunā cilnē</translation> <translation id="8609384513243082612">Atvērt jaunu cilni</translation> <translation id="8644639153978066712">Rādīt paslēptos failus lietotnē Faili</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mk.xtb index 2327936..c84eed2 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mk.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mk.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Повлечете го линкот до празен простор на лентата за картички</translation> <translation id="8389638407792712197">Отворете нов прозорец</translation> <translation id="8429696719963529183">Користете ги копчињата F (F1 до F12)</translation> -<translation id="8537650670971624753">Излезете од режимот за пребарување</translation> <translation id="85690795166292698">Отворете го линкот во нова картичка</translation> <translation id="8609384513243082612">Отворете нова картичка</translation> <translation id="8644639153978066712">Прикажете ги сокриените датотеки во апликацијата „Датотеки“</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb index 18ca9c0..7cf14f7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ml.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">തുറന്ന് വെച്ചിട്ടുള്ള ടാബുകളിലെ ശൂന്യമായ സ്ഥലത്തേക്ക് ലിങ്ക് വലിച്ചിടുക</translation> <translation id="8389638407792712197">പുതിയ വിൻഡോ തുറക്കുക</translation> <translation id="8429696719963529183">F കീകൾ ഉപയോഗിക്കുക (F1 മുതൽ F12 വരെ)</translation> -<translation id="8537650670971624753">തിരയൽ മോഡിൽ നിന്ന് പുറത്തുകടക്കുക</translation> <translation id="85690795166292698">പുതിയ ടാബിൽ ലിങ്ക് തുറക്കുക</translation> <translation id="8609384513243082612">പുതിയ ടാബ് തുറക്കുക</translation> <translation id="8644639153978066712">Files ആപ്പിലെ അദൃശ്യമായ ഫയലുകൾ പ്രദർശിപ്പിക്കുക</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb index f427a4a..220ff66 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mn.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Холбоосыг tab мессежийн хоосон хэсэгт чирэх</translation> <translation id="8389638407792712197">Шинэ цонх нээх</translation> <translation id="8429696719963529183">F түлхүүрийг ашиглах (F1-с F12)</translation> -<translation id="8537650670971624753">Хайлтын горимоос гарах</translation> <translation id="85690795166292698">Холбоосыг шинэ табад нээх</translation> <translation id="8609384513243082612">Шинэ таб нээх</translation> <translation id="8644639153978066712">Файлс аппад нуусан файлыг харуулах</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb index d553c91..5091dd7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_mr.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">टॅब स्ट्रिपवरील एका रिक्त भागावर एखादी लिंक ड्रॅग करा</translation> <translation id="8389638407792712197">नवीन विंडो उघडा</translation> <translation id="8429696719963529183">F की वापरा (F1 ते F12)</translation> -<translation id="8537650670971624753">शोध मोडमधून बाहेर पडा</translation> <translation id="85690795166292698">लिंक एका नवीन टॅबमध्ये उघडा</translation> <translation id="8609384513243082612">नवीन टॅब उघडा</translation> <translation id="8644639153978066712">Files अॅप मध्ये लपवलेल्या फाइल डिस्प्ले करा</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb index 6c8914b..b88b6fe 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ms.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Seret pautan ke bahagian kosong pada jalur tab</translation> <translation id="8389638407792712197">Buka tetingkap baharu</translation> <translation id="8429696719963529183">Gunakan kekunci F (F1 hingga F12)</translation> -<translation id="8537650670971624753">Keluar daripada mod carian</translation> <translation id="85690795166292698">Buka pautan dalam tab baharu</translation> <translation id="8609384513243082612">Buka tab baharu</translation> <translation id="8644639153978066712">Paparkan fail tersembunyi dalam apl Fail</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_my.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_my.xtb index c988aa3..83cb352f 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_my.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_my.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">လင့်ခ်ကို တဘ်ဘားတန်းပေါ်ရှိ နေရာလွတ်သို့ ဖိဆွဲပါ</translation> <translation id="8389638407792712197">ဝင်းဒိုးအသစ် ဖွင့်ရန်</translation> <translation id="8429696719963529183">F ခလုတ်များ (F1 မှ F12) ကို သုံးရန်</translation> -<translation id="8537650670971624753">ရှာဖွေမှုမုဒ်မှ ထွက်ရန်</translation> <translation id="85690795166292698">လင့်ခ်ကို တဘ်အသစ်တွင် ဖွင့်ရန်</translation> <translation id="8609384513243082612">တဘ်အသစ် ဖွင့်ရန်</translation> <translation id="8644639153978066712">Files အက်ပ်အတွင်း ဝှက်ထားသည့် ဖိုင်များကို ပြရန်</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb index edf523d..a11d96d 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ne.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">लिंकलाई ट्याब स्ट्रिपमा रहेको खाली क्षेत्रमा ड्र्याग गर्नुहोस्</translation> <translation id="8389638407792712197">नयाँ विन्डो खोल्नुहोस्</translation> <translation id="8429696719963529183">F कुञ्जीहरू प्रयोग गर्नुहोस् (F1 देखि F12 सम्म)</translation> -<translation id="8537650670971624753">खोज मोडबाट बाहिर निस्कनुहोस्</translation> <translation id="85690795166292698">लिंकलाई नयाँ ट्याबमा खोल्नुहोस्</translation> <translation id="8609384513243082612">नयाँ ट्याब खोल्नुहोस्</translation> <translation id="8644639153978066712">लुकाइएका फाइलहरूलाई फाइल एपमा देखाउनुहोस्</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_nl.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_nl.xtb index 46aaa5b1..e75d472 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_nl.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_nl.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Sleep de link naar een blanco gedeelte van de tabbladstrook</translation> <translation id="8389638407792712197">Nieuw venster openen</translation> <translation id="8429696719963529183">De F-toetsen gebruiken (F1 tot en met F12)</translation> -<translation id="8537650670971624753">Zoekmodus afsluiten</translation> <translation id="85690795166292698">De link openen op een nieuw tabblad</translation> <translation id="8609384513243082612">Nieuw tabblad openen</translation> <translation id="8644639153978066712">Verborgen bestanden in de app Bestanden bekijken</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb index 7b808240a..a78bc1a 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_no.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Dra linken til et tomt område på faneraden.</translation> <translation id="8389638407792712197">Åpne et nytt vindu</translation> <translation id="8429696719963529183">Bruk F-tastene (F1 til F12)</translation> -<translation id="8537650670971624753">Avslutt søkemodusen</translation> <translation id="85690795166292698">Åpne linken i en ny fane</translation> <translation id="8609384513243082612">Åpne en ny fane</translation> <translation id="8644639153978066712">Vis skjulte filer i Filer-appen</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb index e917382..9b20f4d 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_or.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ଟାବ୍ ପଟିର ଏକ ଖାଲି କ୍ଷେତ୍ରକୁ ଲିଙ୍କ୍ ଟାଣନ୍ତୁ</translation> <translation id="8389638407792712197">ନୂଆ ୱିଣ୍ଡୋ ଖୋଲନ୍ତୁ</translation> <translation id="8429696719963529183">F କୀ'ଗୁଡ଼ିକ (F1 to F12) ବ୍ୟବହାର କରନ୍ତୁ</translation> -<translation id="8537650670971624753">ସନ୍ଧାନ ମୋଡ୍ରୁ ବାହାରି ଯାଆନ୍ତୁ</translation> <translation id="85690795166292698">ଏକ ନୂଆ ଟାବ୍ରେ ଲିଙ୍କ୍ ଖୋଲନ୍ତୁ</translation> <translation id="8609384513243082612">ନୂଆ ଟାବ୍ ଖୋଲନ୍ତୁ</translation> <translation id="8644639153978066712">ଫାଇଲ୍ସ ଆପ୍ରେ ଲୁଚିଥିବା ଫାଇଲ୍ଗୁଡ଼ିକ ପ୍ରଦର୍ଶନ କରନ୍ତୁ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb index b4982d8d..8da2e0a7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pa.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ਲਿੰਕ ਨੂੰ ਟੈਬ ਪੱਟੀ 'ਤੇ ਕਿਸੇ ਖਾਲੀ ਖੇਤਰ 'ਤੇ ਘਸੀਟੋ</translation> <translation id="8389638407792712197">ਨਵੀਂ ਵਿੰਡੋ ਖੋਲ੍ਹੋ</translation> <translation id="8429696719963529183">F ਕੁੰਜੀਆਂ ਵਰਤੋ (F1 ਤੋਂ F12 ਤੱਕ)</translation> -<translation id="8537650670971624753">ਖੋਜ ਮੋਡ ਤੋਂ ਬਾਹਰ ਨਿਕਲੋ</translation> <translation id="85690795166292698">ਕਿਸੇ ਨਵੀਂ ਟੈਬ ਵਿੱਚ ਲਿੰਕ ਨੂੰ ਖੋਲ੍ਹੋ</translation> <translation id="8609384513243082612">ਨਵੀਂ ਟੈਬ ਖੋਲ੍ਹੋ</translation> <translation id="8644639153978066712">ਫ਼ਾਈਲਾਂ ਐਪ ਵਿੱਚ ਲੁਕੀਆਂ ਹੋਈਆਂ ਫ਼ਾਈਲਾਂ ਦਿਖਾਓ</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pl.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pl.xtb index 52890fd..48400615 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pl.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pl.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Przeciągnij link na pusty obszar na pasku kart</translation> <translation id="8389638407792712197">Otwórz nowe okno</translation> <translation id="8429696719963529183">Użyj klawiszy funkcyjnych (od F1 do F12)</translation> -<translation id="8537650670971624753">Zamknij tryb wyszukiwania</translation> <translation id="85690795166292698">Otwórz link w nowej karcie</translation> <translation id="8609384513243082612">Otwórz nową kartę</translation> <translation id="8644639153978066712">Pokaż ukryte pliki w aplikacji Pliki</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb index e02508b..fd4a52af 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-BR.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arrastar o link até uma área em branco na barra de guias</translation> <translation id="8389638407792712197">Abrir nova janela</translation> <translation id="8429696719963529183">Usar teclas F (F1 a F12)</translation> -<translation id="8537650670971624753">Sair do modo de pesquisa</translation> <translation id="85690795166292698">Abrir o link em uma nova guia</translation> <translation id="8609384513243082612">Abrir nova guia</translation> <translation id="8644639153978066712">Exibir arquivos ocultos no app Arquivos</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb index 1ba91c14..5bca180 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_pt-PT.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Arraste o link para uma área em branco na Faixa de separadores.</translation> <translation id="8389638407792712197">Abrir nova janela</translation> <translation id="8429696719963529183">Utilizar as teclas F (F1 a F12)</translation> -<translation id="8537650670971624753">Sair do modo de pesquisa</translation> <translation id="85690795166292698">Abrir o link num novo separador</translation> <translation id="8609384513243082612">Abrir novo separador</translation> <translation id="8644639153978066712">Apresentar ficheiros ocultos na aplicação Ficheiros</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ro.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ro.xtb index 36e2fd3..6d97574c 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ro.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ro.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Trage linkul într-o zonă liberă a barei de file</translation> <translation id="8389638407792712197">Deschide o fereastră nouă</translation> <translation id="8429696719963529183">Folosește tastele F (de la F1 la F12)</translation> -<translation id="8537650670971624753">Ieși din modul de căutare</translation> <translation id="85690795166292698">Deschide linkul într-o filă nouă</translation> <translation id="8609384513243082612">Deschide o filă nouă</translation> <translation id="8644639153978066712">Afișează fișiere ascunse din aplicația Fișiere</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ru.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ru.xtb index 19a6faf..5db38c8 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ru.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ru.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Перетащить ссылку в пустую область на панели вкладок</translation> <translation id="8389638407792712197">Открыть новое окно</translation> <translation id="8429696719963529183">Использовать функциональные клавиши (от F1 до F12)</translation> -<translation id="8537650670971624753">Выйти из режима поиска</translation> <translation id="85690795166292698">Открыть ссылку в новой вкладке</translation> <translation id="8609384513243082612">Открыть новую вкладку</translation> <translation id="8644639153978066712">Показать скрытые файлы в приложении "Файлы"</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb index eede8de..8b03294 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_si.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">පටිති තීරුවෙහි හිස් ප්රදේශයකට සබැඳිය අදින්න</translation> <translation id="8389638407792712197">නව කවුළුව විවෘත කරන්න</translation> <translation id="8429696719963529183">F යතුරු භාවිතා කරන්න (F1 සිට F12)</translation> -<translation id="8537650670971624753">සෙවීමේ ආකාරයෙන් ඉවත් වන්න</translation> <translation id="85690795166292698">සබැඳිය නව පටිත්තක විවෘත කරන්න</translation> <translation id="8609384513243082612">නව පටිත්ත විවෘත කරන්න</translation> <translation id="8644639153978066712">ගොනු යෙදුමෙහි සැඟවුණු ගොනු පෙන්වන්න</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb index 0c2c4012..26d86aba 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sk.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Presunutie odkazu do prázdnej oblasti na paneli kariet</translation> <translation id="8389638407792712197">Otvorenie nového okna</translation> <translation id="8429696719963529183">Použitie klávesov F (F1 až F12)</translation> -<translation id="8537650670971624753">Ukončiť režim vyhľadávania</translation> <translation id="85690795166292698">Otvorenie odkazu na novej karte</translation> <translation id="8609384513243082612">Otvorenie novej karty</translation> <translation id="8644639153978066712">Zobrazenie skrytých súborov v aplikácii Súbory</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb index 9243f85..4d57ffc7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sl.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Povlecite povezavo na prazno območje na traku z zavihki</translation> <translation id="8389638407792712197">Odpiranje novega okna</translation> <translation id="8429696719963529183">Uporaba funkcijskih tipk (od F1 do F12)</translation> -<translation id="8537650670971624753">Zapri način iskanja</translation> <translation id="85690795166292698">Odpiranje povezave na novem zavihku</translation> <translation id="8609384513243082612">Odpiranje novega zavihka</translation> <translation id="8644639153978066712">Prikaz skritih datotek v aplikaciji Datoteke</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb index 7e796235..c0146e3d 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sq.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Zvarrit lidhjen në një fushë boshe në shiritin e skedave</translation> <translation id="8389638407792712197">Hap dritaren e re</translation> <translation id="8429696719963529183">Përdor tastet F (F1 deri F12)</translation> -<translation id="8537650670971624753">Dil nga modaliteti i kërkimit</translation> <translation id="85690795166292698">Hap lidhjen në një skedë të re</translation> <translation id="8609384513243082612">Hap skedë të re</translation> <translation id="8644639153978066712">Shfaq skedarët e fshehur në aplikacionin "Skedarët"</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr-Latn.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr-Latn.xtb index 94ed3e0..14177368 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr-Latn.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr-Latn.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Prevucite link u praznu oblast na traci sa karticama</translation> <translation id="8389638407792712197">Otvorite novi prozor</translation> <translation id="8429696719963529183">Koristite F tastere (od F1 do F12)</translation> -<translation id="8537650670971624753">Izađi iz režima pretrage</translation> <translation id="85690795166292698">Otvorite link na novoj kartici</translation> <translation id="8609384513243082612">Otvorite novu karticu</translation> <translation id="8644639153978066712">Prikažite skrivene datoteke u aplikaciji Datoteke</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr.xtb index 80b7722..e1a1eb51 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sr.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Превуците линк у празну област на траци са картицама</translation> <translation id="8389638407792712197">Отворите нови прозор</translation> <translation id="8429696719963529183">Користите F тастере (од F1 до F12)</translation> -<translation id="8537650670971624753">Изађи из режима претраге</translation> <translation id="85690795166292698">Отворите линк на новој картици</translation> <translation id="8609384513243082612">Отворите нову картицу</translation> <translation id="8644639153978066712">Прикажите скривене датотеке у апликацији Датотеке</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb index 3a584db..8469220 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sv.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Dra länken till ett tomt område i flikhuvudet</translation> <translation id="8389638407792712197">Öppna nytt fönster</translation> <translation id="8429696719963529183">Använd F-tangenterna (F1 till F12)</translation> -<translation id="8537650670971624753">Avsluta sökläget</translation> <translation id="85690795166292698">Öppna länken på en ny flik</translation> <translation id="8609384513243082612">Öppna ny flik</translation> <translation id="8644639153978066712">Visa dolda filer i appen Filer</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb index 704ee00c..a7332df 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_sw.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Buruta kiungo kwenye sehemu tupu katika ukanda wa vichupo</translation> <translation id="8389638407792712197">Fungua dirisha jipya</translation> <translation id="8429696719963529183">Tumia vitufe vya F (F1 hadi F12)</translation> -<translation id="8537650670971624753">Funga hali ya utafutaji</translation> <translation id="85690795166292698">Fungua kiungo katika kichupo kipya</translation> <translation id="8609384513243082612">Fungua kichupo kipya</translation> <translation id="8644639153978066712">Onyesha faili zilizofichwa katika programu ya Faili</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb index db95998..f2595973 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ta.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">உலாவிப்பக்கப் பட்டியில் உள்ள வெற்றுப் பகுதியில் இணைப்பை இழுக்கவும்</translation> <translation id="8389638407792712197">புதிய சாளரத்தைத் திறக்கும்</translation> <translation id="8429696719963529183">F விசைகளைப் பயன்படுத்தும் (F1 முதல் F12 வரை)</translation> -<translation id="8537650670971624753">தேடல் பயன்முறையிலிருந்து வெளியேறவும்</translation> <translation id="85690795166292698">இணைப்பை புதிய தாவலில் திறக்கும்</translation> <translation id="8609384513243082612">புதிய தாவலைத் திறக்கும்</translation> <translation id="8644639153978066712">ஃபைல்கள் ஆப்ஸில் உள்ள மறைக்கப்பட்ட கோப்புகளைக் காண்பிக்கும்</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb index b965b37..9b252c4 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_te.xtb
@@ -148,7 +148,7 @@ <translation id="6185696379715117369">ఎగువ పేజీకి వెళ్లుతుంది</translation> <translation id="6228457605945141550">ప్రకాశాన్ని తగ్గించండి</translation> <translation id="6276708887952587684">పేజీ సోర్స్ కోడ్ను చూడండి</translation> -<translation id="6321940490215594447">చరిత్ర పేజీని తెరవండి</translation> +<translation id="6321940490215594447">హిస్టరీ పేజీని తెరవండి</translation> <translation id="6340769215862220182">డిస్ప్లేని దగ్గరగా జూమ్ చేస్తుంది</translation> <translation id="634687982629734605">వీటి మధ్య ఫోకస్ను మార్చండి: స్టేటస్ ఏరియా (మీ ఖాతా ఫోటో కనిపించే ప్రాంతం), లాంచర్, అడ్రస్ బార్, బుక్మార్క్ బార్ (కనిపించినట్లయితే), తెరవబడే వెబ్పేజీ, డౌన్లోడ్ల బార్ (కనిపించినట్లయితే). ఫోకస్ చేయదగిన డైలాగ్ ప్రదర్శించబడితే, బదులుగా ఫోకస్ను అక్కడికి తరలించండి.</translation> <translation id="6359811074279051077"><ph name="MODIFIER" /><ph name="SEPARATOR" /><ph name="KEY" /></translation> @@ -202,7 +202,6 @@ <translation id="8388247778047144397">లింక్ను ట్యాబ్ స్ట్రిప్లోని ఖాళీ ప్రాంతంలోకి లాగండి</translation> <translation id="8389638407792712197">కొత్త విండోను తెరవండి</translation> <translation id="8429696719963529183">F కీలు (F1 నుండి F12 వరకు) ఉపయోగించండి</translation> -<translation id="8537650670971624753">శోధన మోడ్ నుండి నిష్క్రమించండి</translation> <translation id="85690795166292698">లింక్ను కొత్త ట్యాబ్లో తెరవండి</translation> <translation id="8609384513243082612">కొత్త ట్యాబ్ను తెరవండి</translation> <translation id="8644639153978066712">దాచబడిన ఫైళ్లను ఫైల్స్ యాప్ ద్వారా ప్రదర్శించండి</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb index bd037d9..86d8bb9 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_th.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">ลากลิงก์ไปยังพื้นที่ว่างบนแนวแท็บ</translation> <translation id="8389638407792712197">เปิดหน้าต่างใหม่</translation> <translation id="8429696719963529183">ใช้ปุ่ม F (F1 ถึง F12)</translation> -<translation id="8537650670971624753">ออกจากโหมดค้นหา</translation> <translation id="85690795166292698">เปิดลิงก์ในแท็บใหม่</translation> <translation id="8609384513243082612">เปิดแท็บใหม่</translation> <translation id="8644639153978066712">แสดงไฟล์ที่ซ่อนอยู่ในแอป Files</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb index 3162246..2807c70 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_tr.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Bağlantıyı sekme şeridindeki boş bir alana sürükleyin</translation> <translation id="8389638407792712197">Yeni pencere açar</translation> <translation id="8429696719963529183">F tuşlarını kullandırır (F1 - F12)</translation> -<translation id="8537650670971624753">Arama modundan çık</translation> <translation id="85690795166292698">Bağlantıyı yeni bir sekmede açar</translation> <translation id="8609384513243082612">Yeni sekme açar</translation> <translation id="8644639153978066712">Dosyalar uygulamasındaki gizli dosyaları görüntüler</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_uk.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_uk.xtb index 219341e..586b5b7 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_uk.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_uk.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Перетягніть посилання на порожнє місце на панелі вкладок</translation> <translation id="8389638407792712197">Відкрити нове вікно</translation> <translation id="8429696719963529183">Натиснути функціональну клавішу (від F1 до F12)</translation> -<translation id="8537650670971624753">Вийти з режиму пошуку</translation> <translation id="85690795166292698">Відкрити посилання в новій вкладці</translation> <translation id="8609384513243082612">Відкрити нову вкладку</translation> <translation id="8644639153978066712">Показати сховані файли в додатку Файли</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb index 1fb164eb..5ef9cc1 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_ur.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">لنک کو گھسیٹ کر ٹیب اسٹرپ پر خالی جگہ تک لے جائیں</translation> <translation id="8389638407792712197">نئی ونڈو کھولیں</translation> <translation id="8429696719963529183">F کلیدیں استعمال کریں (F1 سے F12 تک)</translation> -<translation id="8537650670971624753">تلاش وضع سے باہر نکلیں</translation> <translation id="85690795166292698">لنک کو ایک نئے ٹیب میں کھولیں</translation> <translation id="8609384513243082612">نیا ٹیب کھولیں</translation> <translation id="8644639153978066712">پوشیدہ فائلز کو فائلز ایپ میں کھولیں</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_uz.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_uz.xtb index 90e70a3..9980bee 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_uz.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_uz.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Havolani varaqlar panelidagi bo‘sh joyga sudrash</translation> <translation id="8389638407792712197">Yangi oyna ochish</translation> <translation id="8429696719963529183">Funksiya tugmalarini bosish (F1 dan F12 gacha)</translation> -<translation id="8537650670971624753">Qidiruv rejimidan chiqish</translation> <translation id="85690795166292698">Havolani yangi varaqda ochish</translation> <translation id="8609384513243082612">Yangi varaq ochish</translation> <translation id="8644639153978066712">Fayllar ilovasidagi yashirin fayllarni ko‘rish</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_vi.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_vi.xtb index 74311b6c..7dd1f7d8 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_vi.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_vi.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Kéo liên kết vào một vùng trống trên thanh thẻ</translation> <translation id="8389638407792712197">Mở cửa sổ mới</translation> <translation id="8429696719963529183">Sử dụng các phím F (F1 tới F12)</translation> -<translation id="8537650670971624753">Thoát khỏi chế độ tìm kiếm</translation> <translation id="85690795166292698">Mở đường liên kết trong một thẻ mới</translation> <translation id="8609384513243082612">Mở thẻ mới</translation> <translation id="8644639153978066712">Hiển thị các tệp bị ẩn trong ứng dụng Tệp</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb index df9396e..67b9e1d 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-CN.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">将链接拖到标签栏的空白区域中</translation> <translation id="8389638407792712197">打开新窗口</translation> <translation id="8429696719963529183">使用键盘顶部的一系列功能键(F1 到 F12)</translation> -<translation id="8537650670971624753">退出搜索模式</translation> <translation id="85690795166292698">在新标签页中打开链接</translation> <translation id="8609384513243082612">打开新标签页</translation> <translation id="8644639153978066712">在“文件”应用中显示处于隐藏状态的文件</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb index dee4cd1f..8e013cf 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-HK.xtb
@@ -203,7 +203,6 @@ <translation id="8388247778047144397">將連結拖曳至標籤列上的空白區域</translation> <translation id="8389638407792712197">開啟新視窗</translation> <translation id="8429696719963529183">使用 F 鍵 (F1 至 F12)</translation> -<translation id="8537650670971624753">結束搜尋模式</translation> <translation id="85690795166292698">在新分頁中開啟連結</translation> <translation id="8609384513243082612">開啟新分頁</translation> <translation id="8644639153978066712">在「檔案」應用程式中顯示隱藏的檔案</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb index 6630487..231d5d5 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zh-TW.xtb
@@ -203,7 +203,6 @@ <translation id="8388247778047144397">將連結拖曳至分頁列中的空白區域</translation> <translation id="8389638407792712197">開啟新視窗</translation> <translation id="8429696719963529183">使用 F 鍵 (F1 到 F12)</translation> -<translation id="8537650670971624753">結束搜尋模式</translation> <translation id="85690795166292698">在新分頁中開啟連結</translation> <translation id="8609384513243082612">開啟新分頁</translation> <translation id="8644639153978066712">顯示「檔案」應用程式中隱藏的檔案</translation>
diff --git a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zu.xtb b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zu.xtb index 8a2b3fe..8b2167bf 100644 --- a/ash/shortcut_viewer/strings/shortcut_viewer_strings_zu.xtb +++ b/ash/shortcut_viewer/strings/shortcut_viewer_strings_zu.xtb
@@ -202,7 +202,6 @@ <translation id="8388247778047144397">Hudulela isixhumanisi endaweni engenalutho kumugqa wamathebhu</translation> <translation id="8389638407792712197">Vula iwindi elisha</translation> <translation id="8429696719963529183">Sebenzisa okhiye baka-F (u-F1 ukuya ku-F12)</translation> -<translation id="8537650670971624753">Phuma kumodi yokusesha</translation> <translation id="85690795166292698">Vula isixhumanisi kuthebhu elisha</translation> <translation id="8609384513243082612">Vula ithebhu entsha</translation> <translation id="8644639153978066712">Bonisa amafayela afihliwe kuhlelo lokusebenza lwamafayela</translation>
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc index 93e1c49..6aa7cd91 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.cc +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.cc
@@ -374,11 +374,14 @@ UpdateActiveAndInactiveFrameColor(); } -void KeyboardShortcutView::QueryChanged(ash::SearchBoxViewBase* sender) { - const bool query_empty = sender->IsSearchBoxTrimmedQueryEmpty(); +void KeyboardShortcutView::QueryChanged(const std::u16string& query) { + std::u16string trimmed_query; + base::TrimWhitespace(query, base::TRIM_ALL, &trimmed_query); + + const bool query_empty = trimmed_query.empty(); if (is_search_box_empty_ != query_empty) { is_search_box_empty_ = query_empty; - UpdateViewsLayout(/*is_search_box_active=*/true); + UpdateViewsLayout(); } debounce_timer_.Stop(); @@ -389,24 +392,9 @@ // TODO(wutao): This timeout value is chosen based on subjective search // latency tests on Minnie. Objective method or UMA is desired. constexpr base::TimeDelta kTimeOut(base::Milliseconds(250)); - debounce_timer_.Start( - FROM_HERE, kTimeOut, - base::BindOnce(&KeyboardShortcutView::ShowSearchResults, - base::Unretained(this), sender->search_box()->GetText())); -} - -void KeyboardShortcutView::ActiveChanged(ash::SearchBoxViewBase* sender) { - const bool is_search_box_active = sender->is_search_box_active(); - is_search_box_empty_ = sender->IsSearchBoxTrimmedQueryEmpty(); - if (is_search_box_active) { - base::RecordAction( - base::UserMetricsAction("KeyboardShortcutViewer.Search")); - } - UpdateViewsLayout(is_search_box_active); -} - -bool KeyboardShortcutView::CanSelectSearchResults() { - return true; + debounce_timer_.Start(FROM_HERE, kTimeOut, + base::BindOnce(&KeyboardShortcutView::ShowSearchResults, + base::Unretained(this), query)); } KeyboardShortcutView::KeyboardShortcutView() { @@ -422,7 +410,8 @@ void KeyboardShortcutView::InitViews() { TRACE_EVENT0("shortcut_viewer", "InitViews"); // Init search box view. - auto search_box_view = std::make_unique<KSVSearchBoxView>(this); + auto search_box_view = std::make_unique<KSVSearchBoxView>(base::BindRepeating( + &KeyboardShortcutView::QueryChanged, base::Unretained(this))); search_box_view->Initialize(); search_box_view_ = AddChildView(std::move(search_box_view)); @@ -544,15 +533,11 @@ tab_contents->InvalidateLayout(); } -void KeyboardShortcutView::UpdateViewsLayout(bool is_search_box_active) { - // 1. Search box is not active: show |categories_tabbed_pane_| and focus on +void KeyboardShortcutView::UpdateViewsLayout() { + // 1. Search box is empty: show |categories_tabbed_pane_| and focus on // active tab. - // 2. Search box is active and empty: show |categories_tabbed_pane_| but focus - // on search box. - // 3. Search box is not empty, show |search_results_container_|. Focus is on - // search box. - const bool should_show_search_results = - is_search_box_active && !is_search_box_empty_; + // 2. Search box is not empty, show |search_results_container_|. + const bool should_show_search_results = !is_search_box_empty_; if (!should_show_search_results) { // Remove all child views, including horizontal separator lines, to prepare // for showing search results next time.
diff --git a/ash/shortcut_viewer/views/keyboard_shortcut_view.h b/ash/shortcut_viewer/views/keyboard_shortcut_view.h index 75aa71e..4dd329b 100644 --- a/ash/shortcut_viewer/views/keyboard_shortcut_view.h +++ b/ash/shortcut_viewer/views/keyboard_shortcut_view.h
@@ -9,7 +9,6 @@ #include <memory> #include <vector> -#include "ash/search_box/search_box_view_delegate.h" #include "base/timer/timer.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/views/widget/widget_delegate.h" @@ -33,8 +32,7 @@ class KSVSearchBoxView; // The UI container for Ash and Chrome keyboard shortcuts. -class KeyboardShortcutView : public views::WidgetDelegateView, - public ash::SearchBoxViewDelegate { +class KeyboardShortcutView : public views::WidgetDelegateView { public: KeyboardShortcutView(const KeyboardShortcutView&) = delete; KeyboardShortcutView& operator=(const KeyboardShortcutView&) = delete; @@ -57,13 +55,8 @@ void OnPaint(gfx::Canvas* canvas) override; void OnThemeChanged() override; - // SearchBoxViewDelegate: - void QueryChanged(ash::SearchBoxViewBase* sender) override; - void AssistantButtonPressed() override {} - void CloseButtonPressed() override {} - void ActiveChanged(ash::SearchBoxViewBase* sender) override; - void OnSearchBoxKeyEvent(ui::KeyEvent* event) override {} - bool CanSelectSearchResults() override; + // Handles search box query changes. + void QueryChanged(const std::u16string& query); private: friend class KeyboardShortcutViewTest; @@ -80,7 +73,7 @@ absl::optional<ash::ShortcutCategory> initial_category); // Update views' layout based on search box status. - void UpdateViewsLayout(bool is_search_box_active); + void UpdateViewsLayout(); // Show search results in |search_results_container_|. void ShowSearchResults(const std::u16string& search_query);
diff --git a/ash/shortcut_viewer/views/ksv_search_box_view.cc b/ash/shortcut_viewer/views/ksv_search_box_view.cc index 379a405..d1923de 100644 --- a/ash/shortcut_viewer/views/ksv_search_box_view.cc +++ b/ash/shortcut_viewer/views/ksv_search_box_view.cc
@@ -9,9 +9,9 @@ #include "ash/resources/vector_icons/vector_icons.h" #include "ash/search_box/search_box_constants.h" #include "ash/search_box/search_box_view_base.h" -#include "ash/search_box/search_box_view_delegate.h" #include "ash/shortcut_viewer/strings/grit/shortcut_viewer_strings.h" #include "ash/style/dark_light_mode_controller_impl.h" +#include "base/metrics/user_metrics.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/accessibility/ax_enums.mojom.h" #include "ui/accessibility/ax_node_data.h" @@ -34,8 +34,8 @@ } // namespace -KSVSearchBoxView::KSVSearchBoxView(ash::SearchBoxViewDelegate* delegate) - : ash::SearchBoxViewBase(delegate) { +KSVSearchBoxView::KSVSearchBoxView(QueryHandler query_handler) + : query_handler_(std::move(query_handler)) { SetSearchBoxBackgroundCornerRadius(kBorderCornerRadius); UpdateBackgroundColor(GetBackgroundColor()); search_box()->SetBackgroundColor(SK_ColorTRANSPARENT); @@ -60,6 +60,8 @@ close_button->SetTooltipText(close_button_label); } +KSVSearchBoxView::~KSVSearchBoxView() = default; + void KSVSearchBoxView::Initialize() { ash::SearchBoxViewBase::InitParams params; params.show_close_button_when_active = false; @@ -112,6 +114,11 @@ NotifyAccessibilityEvent(ax::mojom::Event::kValueChanged, true); } +void KSVSearchBoxView::HandleQueryChange(const std::u16string& query, + bool initiated_by_user) { + query_handler_.Run(query); +} + void KSVSearchBoxView::UpdateSearchBoxBorder() { // TODO(wutao): Rename this function or create another function in base class. // It updates many things in addition to the border. @@ -129,6 +136,13 @@ UpdateBackgroundColor(GetBackgroundColor()); } +void KSVSearchBoxView::OnSearchBoxActiveChanged(bool active) { + if (active) { + base::RecordAction( + base::UserMetricsAction("KeyboardShortcutViewer.Search")); + } +} + void KSVSearchBoxView::UpdatePlaceholderTextStyle() { SetPlaceholderTextAttributes(); }
diff --git a/ash/shortcut_viewer/views/ksv_search_box_view.h b/ash/shortcut_viewer/views/ksv_search_box_view.h index f40b962..80da4d68 100644 --- a/ash/shortcut_viewer/views/ksv_search_box_view.h +++ b/ash/shortcut_viewer/views/ksv_search_box_view.h
@@ -10,21 +10,19 @@ #include "ash/search_box/search_box_view_base.h" #include "third_party/skia/include/core/SkColor.h" -namespace ash { -class SearchBoxViewDelegate; -} // namespace ash - namespace keyboard_shortcut_viewer { // A search_box_SearchBoxViewBase implementation for KeyboardShortcutViewer. class KSVSearchBoxView : public ash::SearchBoxViewBase { public: - explicit KSVSearchBoxView(ash::SearchBoxViewDelegate* delegate); + using QueryHandler = + base::RepeatingCallback<void(const std::u16string& query)>; + explicit KSVSearchBoxView(QueryHandler query_handler); KSVSearchBoxView(const KSVSearchBoxView&) = delete; KSVSearchBoxView& operator=(const KSVSearchBoxView&) = delete; - ~KSVSearchBoxView() override = default; + ~KSVSearchBoxView() override; // Initializes the search box view style. void Initialize(); @@ -38,8 +36,11 @@ void SetAccessibleValue(const std::u16string& value); // SearchBoxViewBase: + void HandleQueryChange(const std::u16string& query, + bool initiated_by_user) override; void UpdateSearchBoxBorder() override; void UpdatePlaceholderTextStyle() override; + void OnSearchBoxActiveChanged(bool active) override; private: void SetPlaceholderTextAttributes(); @@ -57,6 +58,9 @@ bool ShouldUseFocusedColors(); bool ShouldUseDarkThemeColors(); + // Callback that gets invoked to handle search box query changes. + const QueryHandler query_handler_; + // Accessibility data value. Used to pronounce the number of search results. std::u16string accessible_value_; };
diff --git a/ash/strings/ash_strings_af.xtb b/ash/strings/ash_strings_af.xtb index 6132df23..094f065 100644 --- a/ash/strings/ash_strings_af.xtb +++ b/ash/strings/ash_strings_af.xtb
@@ -473,7 +473,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> en nog <ph name="UNAVAILABLE_APPS_COUNT" /> is nie op hierdie toestel nie.</translation> <translation id="3735740477244556633">Rangskik volgens</translation> <translation id="3742055079367172538">Skermkiekie geneem</translation> -<translation id="3761848338953536304">Jou administrateur versoek tans dat jy die SIM-slotinstelling afskakel</translation> <translation id="3765841986579723851">Vandag gewysig</translation> <translation id="3771549900096082774">Hoëkontrasmodus</translation> <translation id="3773700760453577392">'n Administrateur laat nie veelvuldige aanmeldings deur <ph name="USER_EMAIL" /> toe nie. @@ -762,6 +761,16 @@ <translation id="5393156353051693207">Raak en hou op enige plek om jou programme te herrangskik</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> bo-oor <ph name="IN_PLACE_APP" />; laat los om vouer te skep.</translation> <translation id="5397578532367286026">Gebruiker se gebruik en geskiedenis kan op chrome.com deur die bestuurder (<ph name="MANAGER_EMAIL" />) nagegaan word.</translation> +<translation id="5399673806694250334">Statuslaai, tyd <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Kitsinstellings; druk soek + links om na die kennisgewingsentrum toe te gaan.</translation> <translation id="5426063383988017631">Instellingskieslys is gesluit</translation> <translation id="5428899915242071344">Begin kies</translation> @@ -860,7 +869,6 @@ <translation id="598407983968395253">Gebruik templaat</translation> <translation id="598882571027504733">Herbegin jou Chromebook met die sleutelbord aangeheg om die opdatering te kry.</translation> <translation id="5992218262414051481">Hoëkontras-modus is geaktiveer. Druk weer Ctrl+Search+H om dit af te skakel.</translation> -<translation id="6009656393242168182">Deaktiveer jou SIM-slotinstelling</translation> <translation id="6012623610530968780">Bladsy <ph name="SELECTED_PAGE" /> van <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Verlaat tans spieëlmodus</translation> <translation id="602001110135236999">Rollees links</translation>
diff --git a/ash/strings/ash_strings_am.xtb b/ash/strings/ash_strings_am.xtb index 110a183..50ce2c9 100644 --- a/ash/strings/ash_strings_am.xtb +++ b/ash/strings/ash_strings_am.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />፣ <ph name="UNAVAILABLE_APPS_TWO" /> እና <ph name="UNAVAILABLE_APPS_COUNT" /> ሌሎች በዚህ መሳሪያ ላይ የሉም።</translation> <translation id="3735740477244556633">ደርድር በ</translation> <translation id="3742055079367172538">ቅጽበታዊ ገጽ እይታ ተነስቷል</translation> -<translation id="3761848338953536304">የእርስዎ አስተዳዳሪ የሲም ቁልፍ ቅንብሩን እንዲያጠፉ እየጠየቀ ነው</translation> <translation id="3765841986579723851">ዛሬ አርትዖት ተደርጎበታል</translation> <translation id="3771549900096082774">ባለከፍተኛ ንፅፅር ሁነታ</translation> <translation id="3773700760453577392">አንድ አስተዳዳሪ ለ<ph name="USER_EMAIL" /> በበርካታ መለያ መግባቶችን ከልክሏል። ለመቀጠል ሁሉም ተጠቃሚዎች ዘግተው መውጣት አለባቸው።</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">ቅንብር ደንብን ተጠቀም</translation> <translation id="598882571027504733">ዝማኔውን ለማግኘት፣ ከተያያዘው የቁልፍ ሰሌዳ ጋር የእርስዎን Chromebook ዳግም ያስጀምሩ።</translation> <translation id="5992218262414051481">ባለከፍተኛ ንፅፅር ሁነታ ነቅቷል። እሱን ለማጥፋት እንደገና Ctrl+Search+H ይጫኑ።</translation> -<translation id="6009656393242168182">የእርስዎን የሲም ቁልፍ ቅንብር ያሰናክሉ።</translation> <translation id="6012623610530968780">ገጽ <ph name="SELECTED_PAGE" /> ከ<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">ከመስታወት ሁነታ በመውጣት ላይ</translation> <translation id="602001110135236999">ወደ ግራ ይሸብልሉ</translation> @@ -897,6 +895,7 @@ <translation id="619279033188484792">የስልክዎን የቅርብ ጊዜ ፎቶዎች፣ ሚዲያ እና ማሳወቂያዎች በእርስዎ <ph name="DEVICE_TYPE" /> ላይ ይመልከቱ</translation> <translation id="619335566042889110">አሁን ሙሉ ኃይል ይሙሉ</translation> <translation id="6193431488227440296">ገንቢ</translation> +<translation id="6210042900243040400">ከዚህ ቀደም በ<ph name="EMAIL" /> ላይ ከተቀመጠ <ph name="NAME" /> ጋር ይገናኙ</translation> <translation id="6220928844947387476">አሁን እራስዎን እና ማያ ገጽዎን በተመሳሳይ ጊዜ መቅረጽ ይችላሉ</translation> <translation id="622484624075952240">ታች</translation> <translation id="6231419273573514727">የተቀጥላዎች አፈጻጸም የተገደበ ሊሆን ይችላል።</translation>
diff --git a/ash/strings/ash_strings_ar.xtb b/ash/strings/ash_strings_ar.xtb index adec5fa..10ca9b0 100644 --- a/ash/strings/ash_strings_ar.xtb +++ b/ash/strings/ash_strings_ar.xtb
@@ -126,7 +126,7 @@ <translation id="1620510694547887537">الكاميرا</translation> <translation id="1632985212731562677">يمكن إيقاف ميزة "الوصول عبر مفتاح التحويل" في "الإعدادات" > "أدوات تمكين الوصول".</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> جهاز</translation> -<translation id="1639239467298939599">جارٍ التحميل.</translation> +<translation id="1639239467298939599">جارٍ التحميل</translation> <translation id="1654477262762802994">بدء طلب بحث صوتي</translation> <translation id="1668469839109562275">الشبكة الافتراضية الخاصة المُدمجة</translation> <translation id="1677472565718498478">الوقت المتبقي <ph name="TIME" /></translation> @@ -474,7 +474,6 @@ <translation id="3735740477244556633">الترتيب حسب </translation> <translation id="3742055079367172538">تم التقاط لقطة الشاشة</translation> -<translation id="3761848338953536304">يطلب المشرف إيقاف ميزة قفل شريحة SIM.</translation> <translation id="3765841986579723851">تم تعديله اليوم.</translation> <translation id="3771549900096082774">وضع التباين العالي</translation> <translation id="3773700760453577392">منع أحد المشرفين الدخول المتعدد لـ <ph name="USER_EMAIL" />. لذا على جميع المستخدمين تسجيل الخروج للمتابعة.</translation> @@ -869,7 +868,6 @@ <translation id="598407983968395253">استخدام النموذج</translation> <translation id="598882571027504733">للحصول على التحديث، يُرجى إعادة تشغيل جهاز Chromebook مع توصيل لوحة المفاتيح.</translation> <translation id="5992218262414051481">تم تفعيل وضع التباين العالي. اضغط على "Ctrl+Search+H" مرة أخرى لإيقافه.</translation> -<translation id="6009656393242168182">إيقاف ميزة قفل شريحة SIM</translation> <translation id="6012623610530968780">صفحة <ph name="SELECTED_PAGE" /> من <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">جارٍ الخروج من وضع المرآة</translation> <translation id="602001110135236999">التمرير لليسار</translation> @@ -909,6 +907,7 @@ <translation id="619279033188484792">يمكنك عرض الصور والوسائط والإشعارات الحديثة في هاتفك على <ph name="DEVICE_TYPE" />.</translation> <translation id="619335566042889110">الشحن بالكامل الآن</translation> <translation id="6193431488227440296">إصدار مطوِّري البرامج</translation> +<translation id="6210042900243040400">ربط <ph name="NAME" /> الذي تم حفظه في السابق على الحساب <ph name="EMAIL" /></translation> <translation id="6220928844947387476">يمكنك الآن تسجيل فيديو لنفسك ولشاشتك في الوقت نفسه.</translation> <translation id="622484624075952240">Down</translation> <translation id="6231419273573514727">قد يصبح أداء الأجهزة الملحقة محدودًا</translation>
diff --git a/ash/strings/ash_strings_as.xtb b/ash/strings/ash_strings_as.xtb index b365560..fdd5756 100644 --- a/ash/strings/ash_strings_as.xtb +++ b/ash/strings/ash_strings_as.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">এই ডিভাইচটোত <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> আৰু <ph name="UNAVAILABLE_APPS_COUNT" /> টা নাই।</translation> <translation id="3735740477244556633">এই অনুসৰি সজাওক</translation> <translation id="3742055079367172538">স্ক্ৰীণশ্বট লোৱা হ’ল</translation> -<translation id="3761848338953536304">আপোনাৰ প্ৰশাসকে আপোনাক লক ছিমৰ ছেটিংটো অফ কৰিবলৈ অনুৰোধ কৰিছে</translation> <translation id="3765841986579723851">আজি সম্পাদনা কৰিছে</translation> <translation id="3771549900096082774">হাই কনট্ৰাষ্ট ম’ড</translation> <translation id="3773700760453577392">কোনো প্ৰশাসকে <ph name="USER_EMAIL" />ৰ বাবে একাধিক ছাইন ইনৰ সুবিধাটোৰ অনুমতি বাতিল কৰিছে। অব্যাহত ৰাখিবলৈ সকলো ব্যৱহাৰকাৰীয়ে ছাইন আউট কৰিবই লাগিব।</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">আপোনাৰ এপ্ পুনৰ সজাবলৈ যিকোনো ঠাইতে স্পৰ্শ কৰি ধৰি ৰাখক</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> <ph name="IN_PLACE_APP" />ৰ ওপৰত আছে, ফ'ল্ডাৰ সৃষ্টি কৰিবলৈ এৰি দিয়ক।</translation> <translation id="5397578532367286026">পৰিচালকে(<ph name="MANAGER_EMAIL" />) chrome.comত এই ব্যৱহাৰকাৰীৰ ডিভাইচৰ ব্যৱহাৰ আৰু ইতিহাস পর্যালোচনা কৰিব পাৰে।</translation> +<translation id="5399673806694250334">স্থিতিৰ ট্ৰে’, সময় <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">দ্ৰুত ছেটিংসমূহ, জাননী কেন্দ্ৰ এক্সেছ কৰিবলৈ search + left টিপক।</translation> <translation id="5426063383988017631">ছেটিঙৰ মেনু বন্ধ আছে</translation> <translation id="5428899915242071344">বাছনি কৰা আৰম্ভ কৰক</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">টেমপ্লে’ট ব্যৱহাৰ কৰক</translation> <translation id="598882571027504733">আপডে’টটো পাবলৈ সংলগ্ন কীব’ৰ্ডখন ব্যৱহাৰ কৰি আপোনাৰ Chromebook ৰিষ্টাৰ্ট কৰক।</translation> <translation id="5992218262414051481">উচ্চ বৈষাদৃশ্যৰ ম’ড সক্ষম কৰা হ’ল। ইয়াক ট’গল অফ কৰিবলৈ আকৌ Ctrl+Search+H টিপক।</translation> -<translation id="6009656393242168182">আপোনাৰ ছিম লকৰ ছেটিং অক্ষম কৰক</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />ৰ <ph name="SELECTED_PAGE" /> পৃষ্ঠা</translation> <translation id="6018164090099858612">প্ৰতিবিম্বকৰণ ম’ড বন্ধ কৰি আছে</translation> <translation id="602001110135236999">বাওঁফাললৈ স্ক্ৰ’ল কৰক</translation>
diff --git a/ash/strings/ash_strings_az.xtb b/ash/strings/ash_strings_az.xtb index bd7d3f5..f4fc062 100644 --- a/ash/strings/ash_strings_az.xtb +++ b/ash/strings/ash_strings_az.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> və daha <ph name="UNAVAILABLE_APPS_COUNT" /> tətbiq bu cihazda yoxdur.</translation> <translation id="3735740477244556633">Çeşidləyin</translation> <translation id="3742055079367172538">Skrinşot çəkildi</translation> -<translation id="3761848338953536304">Admininiz sizdən SIM-i kilidləmə ayarını deaktiv etməyinizi tələb edir</translation> <translation id="3765841986579723851">Bugün redaktə edilib</translation> <translation id="3771549900096082774">Yüksək Kontrast Rejimi</translation> <translation id="3773700760453577392">Administrator <ph name="USER_EMAIL" /> üçün çoxsaylı girişə icazə verməyib. Bütün istifadəçilər davam etmək üçün çıxış etməlidir.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Tətbiqləri yenidən sıralamaq üçün istənilən yerə toxunub saxlayın</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> <ph name="IN_PLACE_APP" /> tətbiqinin üzərindədir, qovluq yaratmaq üçün buraxın.</translation> <translation id="5397578532367286026">Bu istifadəçinin istifadəsi və tarixçəsi (<ph name="MANAGER_EMAIL" />) on chrome.com domenindəki menecer tərəfindən izlənə bilər.</translation> +<translation id="5399673806694250334">Vəziyyət bölməsi, vaxt: <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Sürətli Ayarlar: Bildiriş mərkəzinə daxil olmaq üçün axtarış + sol üzərinə basın.</translation> <translation id="5426063383988017631">Ayarlar menyusu bağlanıb</translation> <translation id="5428899915242071344">Seçimi başladın</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Şablon istifadə edin</translation> <translation id="598882571027504733">Güncəlləməni əldə etmək üçün əlavə edilən klavatura ilə Chromebook'u yenidən başladın.</translation> <translation id="5992218262414051481">Yüksək Kontrast Rejimi aktiv edildi. Rejimi deaktiv etmək üçün Ctrl+Search+H düymələrini basın.</translation> -<translation id="6009656393242168182">SIM Kilidi ayarınızı deaktiv edin</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> səhifədən <ph name="SELECTED_PAGE" /> səhifə</translation> <translation id="6018164090099858612">Güzgü rejimindən çıxır</translation> <translation id="602001110135236999">Sola sürüşdürün</translation>
diff --git a/ash/strings/ash_strings_be.xtb b/ash/strings/ash_strings_be.xtb index 5685d87..a61db6d 100644 --- a/ash/strings/ash_strings_be.xtb +++ b/ash/strings/ash_strings_be.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">Падключаныя раней прылады</translation> <translation id="371370241367527062">Пярэдні мікрафон</translation> <translation id="3713734891607377840">Адкрыць пасля завяршэння</translation> +<translation id="3724279623330129812">Камера адцэнтравана функцыяй аўтамаштабавання</translation> <translation id="3726171378575546917">На гэтай прыладзе няма праграм "<ph name="UNAVAILABLE_APPS_ONE" />", "<ph name="UNAVAILABLE_APPS_TWO" />" і яшчэ <ph name="UNAVAILABLE_APPS_COUNT" />.</translation> <translation id="3735740477244556633">Парадак сартавання</translation> <translation id="3742055079367172538">Здымак экрана зроблены</translation> -<translation id="3761848338953536304">Ваш адміністратар просіць вас адключыць наладу блакіроўкі SIM-карты</translation> <translation id="3765841986579723851">Зменена сёння</translation> <translation id="3771549900096082774">Рэжым высокай кантраснасці</translation> <translation id="3773700760453577392">Адміністратар забараніў уваход у некалькі ўліковых запісаў для карыстальніка <ph name="USER_EMAIL" />. Каб працягнуць, усе карыстальнікі павінны выйсці.</translation> @@ -857,7 +857,6 @@ <translation id="598407983968395253">Выкарыстаць шаблон</translation> <translation id="598882571027504733">Для абнаўлення падключыце клавіятуру і перазапусціце Chromebook.</translation> <translation id="5992218262414051481">Рэжым высокай кантраснасці ўключаны. Каб выключыць яго, зноў націсніце Ctrl + Пошук + H.</translation> -<translation id="6009656393242168182">Адключыце наладу блакіроўкі SIM-карты</translation> <translation id="6012623610530968780">Старонка <ph name="SELECTED_PAGE" /> з <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Выхад з рэжыму адлюстравання</translation> <translation id="602001110135236999">Прагартаць улева</translation> @@ -897,6 +896,7 @@ <translation id="619279033188484792">Праглядайце на прыладзе <ph name="DEVICE_TYPE" /> нядаўнія апавяшчэнні з тэлефона, а таксама медыяфайлы і фота</translation> <translation id="619335566042889110">Зарадзіць акумулятар поўнасцю</translation> <translation id="6193431488227440296">Для распрацоўшчыкаў</translation> +<translation id="6210042900243040400">Можна падключыцца да прылады "<ph name="NAME" />", якая была захавана раней ва ўліковым запісе <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Цяпер можна адначасова весці запіс экрана і відарыса з камеры</translation> <translation id="622484624075952240">Уніз</translation> <translation id="6231419273573514727">Прадукцыйнасць перыферыйных прылад можа быць абмежаванай</translation>
diff --git a/ash/strings/ash_strings_bg.xtb b/ash/strings/ash_strings_bg.xtb index b7c522b..cdd9895 100644 --- a/ash/strings/ash_strings_bg.xtb +++ b/ash/strings/ash_strings_bg.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и още <ph name="UNAVAILABLE_APPS_COUNT" /> приложения не са инсталирани на това устройство.</translation> <translation id="3735740477244556633">Сортиране по</translation> <translation id="3742055079367172538">Направена бе екранна снимка</translation> -<translation id="3761848338953536304">Администраторът ви изисква да изключите настройката за заключване на SIM картата</translation> <translation id="3765841986579723851">Редактирано днес</translation> <translation id="3771549900096082774">Режим на висок контраст</translation> <translation id="3773700760453577392">Администратор е деактивирал централизирания вход за <ph name="USER_EMAIL" />. За да се продължи, всички потребители трябва да излязат от профилите си.</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">Използване на шаблон</translation> <translation id="598882571027504733">За да инсталирате актуализацията, рестартирайте своя Chromebook, докато клавиатурата е прикачена.</translation> <translation id="5992218262414051481">Режимът на висок контраст е активиран. За да го изключите, натиснете отново Ctrl + клавиш „Търсене“ + H.</translation> -<translation id="6009656393242168182">Деактивиране на настройката за заключване на SIM картата ви</translation> <translation id="6012623610530968780">Страница <ph name="SELECTED_PAGE" /> от <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Излиза се от огледалния режим</translation> <translation id="602001110135236999">Превъртане наляво</translation> @@ -907,6 +905,7 @@ <translation id="619279033188484792">Преглед на скорошните снимки, мултимедийни файлове и известия от телефона ви на вашия <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Пълно зареждане сега</translation> <translation id="6193431488227440296">За програмисти</translation> +<translation id="6210042900243040400">Свържете устройството <ph name="NAME" />, запазено преди това в(ъв) <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Вече можете да записвате себе си и екрана си едновременно</translation> <translation id="622484624075952240">Клавиш за надолу</translation> <translation id="6231419273573514727">Ефективността на периферните устройства може да е ограничена</translation>
diff --git a/ash/strings/ash_strings_bn.xtb b/ash/strings/ash_strings_bn.xtb index 0d4b7da5..5cfbec4 100644 --- a/ash/strings/ash_strings_bn.xtb +++ b/ash/strings/ash_strings_bn.xtb
@@ -470,10 +470,10 @@ <translation id="3708186454126126312">আগে কানেক্ট করা ছিল</translation> <translation id="371370241367527062">সামনের মাইক্রোফোন</translation> <translation id="3713734891607377840">সম্পূর্ণ হলে খুলুন</translation> +<translation id="3724279623330129812">ক্যামেরাকে কেন্দ্র করে অটোজুম</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> এবং আরও <ph name="UNAVAILABLE_APPS_COUNT" />টি অ্যাপ এই ডিভাইসে উপলভ্য নেই।</translation> <translation id="3735740477244556633">এই অনুসারে সাজান</translation> <translation id="3742055079367172538">স্ক্রিনশট নেওয়া হয়েছে</translation> -<translation id="3761848338953536304">'লক সিম' সেটিং বন্ধ করার জন্য আপনাকে অ্যাডমিনিস্ট্রেটর অনুরোধ করেছেন</translation> <translation id="3765841986579723851">আজ এডিট করা হয়েছে</translation> <translation id="3771549900096082774">উচ্চ কনট্রাস্ট মোড</translation> <translation id="3773700760453577392">একজন অ্যাডমিনিস্ট্রেটর <ph name="USER_EMAIL" />-র জন্য একাধিক সাইন-ইন বাতিল করেছেন। চালিয়ে যাওয়ার জন্য, সব ব্যবহারকারীকে অবশ্যই সাইন-আউট করতে হবে।</translation> @@ -761,6 +761,16 @@ <translation id="5393156353051693207">অ্যাপ নতুন করে সাজাতে যেকোনও জায়গায় টাচ করে ধরে থাকুন</translation> <translation id="5395308026110844773">ফোল্ডার তৈরি করতে <ph name="IN_PLACE_APP" />-এর উপরে <ph name="DRAGGED_APP_NAME" /> টেনে এনে ছেড়ে দিন।</translation> <translation id="5397578532367286026">chrome.com-এ পরিচালক (<ph name="MANAGER_EMAIL" />) এই ব্যবহারকারীর ব্যবহার এবং ইতিহাস পর্যালোচনা করতে পারেন৷</translation> +<translation id="5399673806694250334">স্ট্যাটাস ট্রে, সময় <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">দ্রুত সেটিংস, বিজ্ঞপ্তি কেন্দ্র অ্যাক্সেস করতে, 'সার্চ করুন' ও 'বাঁদিকে যান' বোতামে একসাথে প্রেস করুন।</translation> <translation id="5426063383988017631">'সেটিংস' মেনু বন্ধ করা হয়েছে</translation> <translation id="5428899915242071344">বেছে নেওয়া শুরু করুন</translation> @@ -859,7 +869,6 @@ <translation id="598407983968395253">টেমপ্লেট ব্যবহার করুন</translation> <translation id="598882571027504733">আপডেট পেতে, অ্যাটাচ করা কীবোর্ডের মাধ্যমে আপনার Chromebook রিস্টার্ট করুন।</translation> <translation id="5992218262414051481">উচ্চ কনট্রাস্ট মোড চালু করা হয়েছে। টগল করে বন্ধ করার জন্য Ctrl+Search+H টিপুন।</translation> -<translation id="6009656393242168182">আপনার 'সিম লক' সেটিং বন্ধ করুন</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />টি পৃষ্ঠার মধ্যে <ph name="SELECTED_PAGE" />টি পৃষ্ঠা</translation> <translation id="6018164090099858612">মিরর মোড থেকে প্রস্থান করছে</translation> <translation id="602001110135236999">বাঁ দিকে স্ক্রল করুন</translation>
diff --git a/ash/strings/ash_strings_bs.xtb b/ash/strings/ash_strings_bs.xtb index 826bf959..df1850cd 100644 --- a/ash/strings/ash_strings_bs.xtb +++ b/ash/strings/ash_strings_bs.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">Prethodno povezano</translation> <translation id="371370241367527062">Prednji mikrofon</translation> <translation id="3713734891607377840">Otvori kada se završi</translation> +<translation id="3724279623330129812">Automatsko zumiranje centriralo je kameru</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> aplikacije(a) nisu na ovom uređaju.</translation> <translation id="3735740477244556633">Poredaj po</translation> <translation id="3742055079367172538">Snimak ekrana je napravljen</translation> -<translation id="3761848338953536304">Administrator zahtijeva da isključite postavku zaključavanja SIM-a</translation> <translation id="3765841986579723851">Uređeno danas</translation> <translation id="3771549900096082774">Način rada visokog kontrasta</translation> <translation id="3773700760453577392">Administrator nije dozvolio višestruku prijavu za korisnika <ph name="USER_EMAIL" />. Svi korisnici se moraju odjaviti kako bi se nastavilo.</translation> @@ -867,7 +867,6 @@ <translation id="598407983968395253">Koristi šablon</translation> <translation id="598882571027504733">Za primanje ažuriranja, ponovo pokrenite Chromebook dok je tastatura priključena.</translation> <translation id="5992218262414051481">Omogućen je način rada u visokom kontrastu. Pritisnite ponovo Ctrl + tipku za pretraživanje + H da ga onemogućite.</translation> -<translation id="6009656393242168182">Onemogućite postavku zaključavanja SIM-a</translation> <translation id="6012623610530968780">Stranica <ph name="SELECTED_PAGE" /> od <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Izlazak iz načina rada za preslikavanje</translation> <translation id="602001110135236999">Listaj ulijevo</translation> @@ -907,7 +906,7 @@ <translation id="619279033188484792">Pregledajte nedavne fotografije, medije i obavještenja telefona na uređaju <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Potpuno napuni sada</translation> <translation id="6193431488227440296">Dev</translation> -<translation id="6210042900243040400">Povežite uređaj <ph name="NAME" /> koji je prethodno spremljen na e-adresu <ph name="EMAIL" /></translation> +<translation id="6210042900243040400">Povežite se na uređaj <ph name="NAME" /> prethodno sačuvan na račun <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Sada istovremeno možete snimati sebe i svoj ekran</translation> <translation id="622484624075952240">Dolje</translation> <translation id="6231419273573514727">Performanse perifernog uređaja su možda ograničene</translation>
diff --git a/ash/strings/ash_strings_ca.xtb b/ash/strings/ash_strings_ca.xtb index 2c7f342..86cea15 100644 --- a/ash/strings/ash_strings_ca.xtb +++ b/ash/strings/ash_strings_ca.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i <ph name="UNAVAILABLE_APPS_COUNT" /> aplicacions més no estan disponibles en aquest dispositiu.</translation> <translation id="3735740477244556633">Ordena per</translation> <translation id="3742055079367172538">Captura de pantalla feta</translation> -<translation id="3761848338953536304">L'administrador sol·licita que desactivis la configuració de bloqueig de la SIM</translation> <translation id="3765841986579723851">Editat avui</translation> <translation id="3771549900096082774">Mode d'alt contrast</translation> <translation id="3773700760453577392">Un administrador ha desactivat l'inici de sessió múltiple per a <ph name="USER_EMAIL" />. Tots els usuaris han de tancar la sessió per continuar.</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">Utilitza la plantilla</translation> <translation id="598882571027504733">Per obtenir l'actualització, reinicia Chromebook amb el teclat connectat.</translation> <translation id="5992218262414051481">El mode d'alt contrast està activat. Torna a prémer Ctrl+Cerca+H per desactivar-lo.</translation> -<translation id="6009656393242168182">Desactiva la configuració de bloqueig de la SIM</translation> <translation id="6012623610530968780">Pàgina <ph name="SELECTED_PAGE" /> de <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">S'està sortint del mode de mirall</translation> <translation id="602001110135236999">Desplaça't cap a l'esquerra</translation>
diff --git a/ash/strings/ash_strings_cs.xtb b/ash/strings/ash_strings_cs.xtb index 038dc2c..663443e 100644 --- a/ash/strings/ash_strings_cs.xtb +++ b/ash/strings/ash_strings_cs.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">Kabel může mít vliv na výkon</translation> <translation id="2903844815300039659">Jste připojeni k síti <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Snímky obrazovky</translation> +<translation id="2925246975070834767">Vyzkoušejte automatické přiblížení, abyste se dostali doprostřed obrazovky. Funkci zapnete v Rychlém nastavení.</translation> <translation id="2941112035454246133">Nízká</translation> <translation id="2942350706960889382">Zabudovaná lupa</translation> <translation id="2942516765047364088">Pozice poličky</translation> @@ -472,7 +473,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> a další aplikace (<ph name="UNAVAILABLE_APPS_COUNT" />) na tomto zařízení nejsou.</translation> <translation id="3735740477244556633">Seřadit podle</translation> <translation id="3742055079367172538">Byl vytvořen snímek obrazovky</translation> -<translation id="3761848338953536304">Váš administrátor požaduje, abyste vypnuli zámek SIM karty</translation> <translation id="3765841986579723851">Upraveno dnes</translation> <translation id="3771549900096082774">Režim vysokého kontrastu</translation> <translation id="3773700760453577392">Administrátor zakázal vícenásobné přihlášení pro účet <ph name="USER_EMAIL" />. Všichni uživatelé se před pokračováním musejí odhlásit.</translation> @@ -634,6 +634,7 @@ <translation id="4628757576491864469">Zařízení</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, hodnocení hvězdičkami <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Do jednoho dne zařízení převeďte na předchozí verzi}few{Do # dnů zařízení převeďte na předchozí verzi}many{Do # dne zařízení převeďte na předchozí verzi}other{Do # dnů zařízení převeďte na předchozí verzi}}</translation> +<translation id="4633636853437260449">Položku smažete stisknutím kláves Ctrl + W</translation> <translation id="4642092649622328492">Pořídit částečný snímek obrazovky</translation> <translation id="4644727592819780893">Oblast je pro náhled obrazu z kamery příliš malá</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, doporučení aplikace</translation> @@ -759,6 +760,16 @@ <translation id="5393156353051693207">Pokud chcete změnit pořadí aplikací, podržte kdekoliv prst</translation> <translation id="5395308026110844773">Aplikace <ph name="DRAGGED_APP_NAME" /> je nad aplikací <ph name="IN_PLACE_APP" />. Uvolněním vytvoříte složku.</translation> <translation id="5397578532367286026">Údaje o využití a historii tohoto uživatele si správce (<ph name="MANAGER_EMAIL" />) může prohlédnout na webu chrome.com.</translation> +<translation id="5399673806694250334">Stavový panel, čas <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Rychlé nastavení, centrum oznámení otevřete stisknutím klávesy vyhledávání a šipky vlevo.</translation> <translation id="5426063383988017631">Nabídka nastavení byla zavřena</translation> <translation id="5428899915242071344">Zahájit výběr</translation> @@ -857,7 +868,6 @@ <translation id="598407983968395253">Použít šablonu</translation> <translation id="598882571027504733">Aktualizaci nainstalujete tím, že Chromebook s připojenou klávesnicí restartujete.</translation> <translation id="5992218262414051481">Je aktivován režim vysokého kontrastu. Vypnete jej opětovným stisknutím kombinace kláves Ctrl+Hledat+H.</translation> -<translation id="6009656393242168182">Vypněte zámek SIM karty</translation> <translation id="6012623610530968780">Stránka <ph name="SELECTED_PAGE" /> z <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ukončování režimu zrcadlení</translation> <translation id="602001110135236999">Posunout doleva</translation> @@ -897,6 +907,7 @@ <translation id="619279033188484792">Zobrazovat na zařízení <ph name="DEVICE_TYPE" /> nejnovější fotky, média a oznámení z telefonu</translation> <translation id="619335566042889110">Plně nabít</translation> <translation id="6193431488227440296">Pro vývojáře</translation> +<translation id="6210042900243040400">Připojit zařízení <ph name="NAME" />, které bylo dříve uloženo do účtu <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Nyní můžete nahrávat sebe a obrazovku současně</translation> <translation id="622484624075952240">Dolů</translation> <translation id="6231419273573514727">Výkon periferního zařízení může být omezen</translation>
diff --git a/ash/strings/ash_strings_cy.xtb b/ash/strings/ash_strings_cy.xtb index 7eb7c03..24a2f93 100644 --- a/ash/strings/ash_strings_cy.xtb +++ b/ash/strings/ash_strings_cy.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">Nid yw <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, a <ph name="UNAVAILABLE_APPS_COUNT" /> arall ar y ddyfais hon.</translation> <translation id="3735740477244556633">Trefnu yn ôl</translation> <translation id="3742055079367172538">Wedi tynnu sgrinlun</translation> -<translation id="3761848338953536304">Mae eich gweinyddwr yn gofyn i chi ddiffodd y gosodiad Lock SIM</translation> <translation id="3765841986579723851">Golygwyd heddiw</translation> <translation id="3771549900096082774">Modd Cyferbyniad Uchel</translation> <translation id="3773700760453577392">Mae gweinyddwr wedi gwrthod mewngofnodi o sawl cyfrif ar gyfer <ph name="USER_EMAIL" />. Rhaid i bob defnyddiwr allgofnodi i barhau.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Cyffyrddwch a daliwch unrhyw le i aildrefnu'ch apiau</translation> <translation id="5395308026110844773">Mae <ph name="DRAGGED_APP_NAME" /> ar ben <ph name="IN_PLACE_APP" />, rhyddhewch i greu ffolder.</translation> <translation id="5397578532367286026">Gall y rheolwr (<ph name="MANAGER_EMAIL" />) adolygu defnydd a hanes y defnyddiwr hwn ar chrome.com.</translation> +<translation id="5399673806694250334">Hambwrdd statws, amser <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Gosodiadau Cyflym, Pwyswch Search + chwith i gyrchu'r ganolfan hysbysiadau.</translation> <translation id="5426063383988017631">Cafodd y ddewislen gosodiadau ei chau</translation> <translation id="5428899915242071344">Dechrau dewis</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Defnyddio templed</translation> <translation id="598882571027504733">I gael y diweddariad, ailgychwynnwch eich Chromebook gyda'r bysellfwrdd wedi'i atodi.</translation> <translation id="5992218262414051481">Mae'r Modd Cyferbyniad Uchel wedi'i alluogi. Pwyswch Ctrl+Search+H eto i'w toglo.</translation> -<translation id="6009656393242168182">Analluogwch eich gosodiad SIM Lock</translation> <translation id="6012623610530968780">Tudalen <ph name="SELECTED_PAGE" /> o <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Wrthi'n gadael y modd adlewyrchu</translation> <translation id="602001110135236999">Sgrolio i'r chwith</translation>
diff --git a/ash/strings/ash_strings_da.xtb b/ash/strings/ash_strings_da.xtb index a3a82e9..7918c40 100644 --- a/ash/strings/ash_strings_da.xtb +++ b/ash/strings/ash_strings_da.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1632985212731562677">Kontaktadgang kan deaktiveres under Indstillinger > Hjælpefunktioner.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> enheder</translation> -<translation id="1639239467298939599">Indlæser...</translation> +<translation id="1639239467298939599">Indlæser</translation> <translation id="1654477262762802994">Start en stemmeforespørgsel</translation> <translation id="1668469839109562275">Indbygget VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> tilbage</translation> @@ -327,6 +327,7 @@ <translation id="2894949423239620203">Kablet kan påvirke ydeevnen</translation> <translation id="2903844815300039659">Der er forbindelse til <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Screenshots</translation> +<translation id="2925246975070834767">Prøv automatisk zoom, så du centreres på skærmen. Aktivér funktionen i kvikmenuen.</translation> <translation id="2941112035454246133">Lav</translation> <translation id="2942350706960889382">Fastgjort lupvindue</translation> <translation id="2942516765047364088">Hyldeplacering</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Tidligere forbundne enheder</translation> <translation id="371370241367527062">Mikrofon på forsiden</translation> <translation id="3713734891607377840">Åbn efter download</translation> +<translation id="3724279623330129812">Automatisk zoom holdt kameraet centreret</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> mere er ikke på denne enhed.</translation> <translation id="3735740477244556633">Sortér efter</translation> <translation id="3742055079367172538">Screenshottet blev gemt</translation> -<translation id="3761848338953536304">Din administrator anmoder om, at du deaktiverer indstillingen for SIM-lås</translation> <translation id="3765841986579723851">Redigeret i dag</translation> <translation id="3771549900096082774">Tilstanden Høj kontrast</translation> <translation id="3773700760453577392">En administrator har afvist samlet login fra flere konti for <ph name="USER_EMAIL" />. Alle brugere skal logge ud for at fortsætte.</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">Enheder</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, antal stjerner <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Skift til en tidligere version af enheden inden for en dag}one{Skift til en tidligere version af enheden inden for # dag}other{Skift til en tidligere version af enheden inden for # dage}}</translation> +<translation id="4633636853437260449">Tryk på Ctrl+W for at slette</translation> <translation id="4642092649622328492">Tag et delvist screenshot</translation> <translation id="4644727592819780893">Området er for småt til kameraet</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, anbefalet app</translation> @@ -759,6 +761,16 @@ <translation id="5393156353051693207">Hold fingeren nede et vilkårligt sted for at omarrangere dine apps</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> oven på <ph name="IN_PLACE_APP" />, slip for at oprette mappe.</translation> <translation id="5397578532367286026">Denne brugers forbrug og historik kan ses af administratoren (<ph name="MANAGER_EMAIL" />) på chrome.com.</translation> +<translation id="5399673806694250334">Statusbakke, klokkeslæt <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Kvikmenu, Tryk på søgetasten + venstre pil for at få adgang til notifikationscenteret.</translation> <translation id="5426063383988017631">Indstillingsmenuen er lukket</translation> <translation id="5428899915242071344">Gå i gang med at vælge</translation> @@ -857,7 +869,6 @@ <translation id="598407983968395253">Brug skabelon</translation> <translation id="598882571027504733">Genstart din Chromebook med det tilsluttede tastatur for at hente opdateringen.</translation> <translation id="5992218262414051481">Tilstanden Høj kontrast er aktiveret. Tryk på Ctrl+Søg+H igen for at deaktivere tilstanden.</translation> -<translation id="6009656393242168182">Deaktiver din indstilling for SIM-lås</translation> <translation id="6012623610530968780">Side <ph name="SELECTED_PAGE" /> ud af <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Lukker spejltilstand</translation> <translation id="602001110135236999">Rul til venstre</translation>
diff --git a/ash/strings/ash_strings_de.xtb b/ash/strings/ash_strings_de.xtb index 077fd8c77..518ce4d 100644 --- a/ash/strings/ash_strings_de.xtb +++ b/ash/strings/ash_strings_de.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1632985212731562677">Der Schalterzugriff kann unter "Einstellungen" > "Bedienungshilfen" deaktiviert werden.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> Geräte</translation> -<translation id="1639239467298939599">Wird geladen...</translation> +<translation id="1639239467298939599">Wird geladen</translation> <translation id="1654477262762802994">Gesprochene Anfrage starten</translation> <translation id="1668469839109562275">Integriertes VPN</translation> <translation id="1677472565718498478">Noch <ph name="TIME" /> h</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> und <ph name="UNAVAILABLE_APPS_COUNT" /> weitere sind nicht auf diesem Gerät installiert.</translation> <translation id="3735740477244556633">Sortieren nach</translation> <translation id="3742055079367172538">Screenshot erstellt</translation> -<translation id="3761848338953536304">Dein Administrator bittet dich, die Einstellung zum Sperren der SIM-Karte zu deaktivieren</translation> <translation id="3765841986579723851">Heute bearbeitet</translation> <translation id="3771549900096082774">Modus mit hohem Kontrast</translation> <translation id="3773700760453577392">Ein Administrator hat die Mehrfachanmeldung für <ph name="USER_EMAIL" /> deaktiviert. Alle Nutzer müssen sich abmelden, um fortfahren zu können.</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">Vorlage verwenden</translation> <translation id="598882571027504733">Du kannst das Update vornehmen, indem du dein Chromebook mit angeschlossener Tastatur neu startest.</translation> <translation id="5992218262414051481">Modus mit hohem Kontrast aktiviert. Drücke Strg + Suche + H, um ihn zu deaktivieren.</translation> -<translation id="6009656393242168182">Deaktiviere deine Einstellung zum Sperren der SIM-Karte</translation> <translation id="6012623610530968780">Seite <ph name="SELECTED_PAGE" /> von <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Spiegelungsmodus wird beendet</translation> <translation id="602001110135236999">Nach links scrollen</translation> @@ -907,6 +905,7 @@ <translation id="619279033188484792">Letzte Fotos, Medien und Benachrichtigungen von deinem Smartphone auf deinem Gerät „<ph name="DEVICE_TYPE" />“ ansehen</translation> <translation id="619335566042889110">Jetzt vollständig aufladen</translation> <translation id="6193431488227440296">Entwickler</translation> +<translation id="6210042900243040400"><ph name="NAME" /> verbinden, wurde(n) bereits in <ph name="EMAIL" /> gespeichert</translation> <translation id="6220928844947387476">Jetzt kannst du dich selbst und deinen Bildschirm gleichzeitig aufnehmen</translation> <translation id="622484624075952240">Abwärts</translation> <translation id="6231419273573514727">Die Leistung der Peripheriegeräte ist möglicherweise eingeschränkt</translation>
diff --git a/ash/strings/ash_strings_el.xtb b/ash/strings/ash_strings_el.xtb index c3c16d6..ef8abeef 100644 --- a/ash/strings/ash_strings_el.xtb +++ b/ash/strings/ash_strings_el.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Κάμερα</translation> <translation id="1632985212731562677">Η πρόσβαση με διακόπτη μπορεί να απενεργοποιηθεί από τις Ρυθμίσεις > Προσβασιμότητα.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> συσκευές</translation> -<translation id="1639239467298939599">Γίνεται φόρτωση</translation> +<translation id="1639239467298939599">Φόρτωση</translation> <translation id="1654477262762802994">Έναρξη φωνητικού ερωτήματος</translation> <translation id="1668469839109562275">Ενσωματωμένο VPN</translation> <translation id="1677472565718498478">Απομένουν <ph name="TIME" /></translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917">Οι εφαρμογές <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> και <ph name="UNAVAILABLE_APPS_COUNT" /> ακόμη εφαρμογές δεν βρίσκονται σε αυτήν τη συσκευή.</translation> <translation id="3735740477244556633">Ταξινόμηση κατά</translation> <translation id="3742055079367172538">Το στιγμιότυπο οθόνης έχει ληφθεί</translation> -<translation id="3761848338953536304">Ο διαχειριστής ζητάει να απενεργοποιήσετε τη ρύθμιση κλειδώματος SIM.</translation> <translation id="3765841986579723851">Έγινε επεξεργασία σήμερα</translation> <translation id="3771549900096082774">Λειτουργία υψηλής αντίθεσης</translation> <translation id="3773700760453577392">Ένας διαχειριστής δεν επιτρέπει τη σύνδεση σε πολλούς λογαριασμούς για τον χρήστη <ph name="USER_EMAIL" />. Όλοι οι χρήστες πρέπει να αποσυνδεθούν για να συνεχίσετε.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Αγγίξτε παρατεταμένα οπουδήποτε για να αναδιατάξετε τις εφαρμογές σας</translation> <translation id="5395308026110844773">Η εφαρμογή <ph name="DRAGGED_APP_NAME" /> πάνω από την εφαρμογή <ph name="IN_PLACE_APP" />, αφήστε για να δημιουργήσετε φάκελο.</translation> <translation id="5397578532367286026">Ο διαχειριστής (<ph name="MANAGER_EMAIL" />) μπορεί να ελέγξει τη χρήση και το ιστορικό αυτού του χρήστη στη διεύθυνση chrome.com.</translation> +<translation id="5399673806694250334">Περιοχή κατάστασης, ώρα <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Γρήγορες ρυθμίσεις, πατήστε Αναζήτηση και αριστερά για πρόσβαση στο κέντρο ειδοποιήσεων.</translation> <translation id="5426063383988017631">Το μενού Ρυθμίσεις έκλεισε.</translation> <translation id="5428899915242071344">Έναρξη επιλογής</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Χρήση προτύπου</translation> <translation id="598882571027504733">Για να λάβετε την ενημέρωση, επανεκκινήστε το Chromebook με το συνδεδεμένο πληκτρολόγιο.</translation> <translation id="5992218262414051481">Η Λειτουργία υψηλής αντίθεσης ενεργοποιήθηκε. Πατήστε Ctrl+Search+H ξανά για να την απενεργοποιήσετε.</translation> -<translation id="6009656393242168182">Απενεργοποιήστε τη ρύθμιση κλειδώματος SIM</translation> <translation id="6012623610530968780">Σελίδα <ph name="SELECTED_PAGE" /> από <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Έξοδος από λειτουργία κατοπτρισμού</translation> <translation id="602001110135236999">Κύλιση αριστερά</translation>
diff --git a/ash/strings/ash_strings_en-GB.xtb b/ash/strings/ash_strings_en-GB.xtb index 99b8509..d34d332 100644 --- a/ash/strings/ash_strings_en-GB.xtb +++ b/ash/strings/ash_strings_en-GB.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">Cable may impact performance</translation> <translation id="2903844815300039659">Connected to <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Screen captures</translation> +<translation id="2925246975070834767">Try auto-zoom so that you'll be in the centre of the screen. Turn it on in Quick Settings.</translation> <translation id="2941112035454246133">Low</translation> <translation id="2942350706960889382">Docked Magnifier</translation> <translation id="2942516765047364088">Shelf position</translation> @@ -473,7 +474,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> and <ph name="UNAVAILABLE_APPS_COUNT" /> more aren't on this device.</translation> <translation id="3735740477244556633">Sort by</translation> <translation id="3742055079367172538">Screenshot taken</translation> -<translation id="3761848338953536304">Your administrator is requesting that you turn off the Lock SIM setting</translation> <translation id="3765841986579723851">Edited today</translation> <translation id="3771549900096082774">High contrast mode</translation> <translation id="3773700760453577392">An administrator has disallowed multiple sign-in for <ph name="USER_EMAIL" />. All users must sign out to continue.</translation> @@ -635,6 +635,7 @@ <translation id="4628757576491864469">Devices</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, star rating <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Change device to previous version within a day}other{Change device to previous version within # days}}</translation> +<translation id="4633636853437260449">Press Ctrl+W to delete</translation> <translation id="4642092649622328492">Take partial screenshot</translation> <translation id="4644727592819780893">Region is too small to fit camera</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, app recommendation</translation> @@ -868,7 +869,6 @@ <translation id="598407983968395253">Use template</translation> <translation id="598882571027504733">To get the update, restart your Chromebook with the keyboard attached.</translation> <translation id="5992218262414051481">High contrast mode enabled. Press Ctrl+Search+H again to toggle it off.</translation> -<translation id="6009656393242168182">Disable your SIM lock setting</translation> <translation id="6012623610530968780">Page <ph name="SELECTED_PAGE" /> of <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Exiting mirror mode</translation> <translation id="602001110135236999">Scroll left</translation>
diff --git a/ash/strings/ash_strings_es-419.xtb b/ash/strings/ash_strings_es-419.xtb index 7e43055..f6b14df 100644 --- a/ash/strings/ash_strings_es-419.xtb +++ b/ash/strings/ash_strings_es-419.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> y<ph name="UNAVAILABLE_APPS_COUNT" /> más no están disponibles en este dispositivo.</translation> <translation id="3735740477244556633">Ordenar por</translation> <translation id="3742055079367172538">Captura de pantalla tomada</translation> -<translation id="3761848338953536304">El administrador te solicita que desactives la configuración de bloqueo de la SIM</translation> <translation id="3765841986579723851">Se editó hoy</translation> <translation id="3771549900096082774">Modo de contraste alto</translation> <translation id="3773700760453577392">Un administrador inhabilitó el acceso múltiple para <ph name="USER_EMAIL" />. @@ -563,7 +562,7 @@ <translation id="4274537685965975248">Se modificó la combinación de teclas Ctrl + Alt + flecha hacia abajo. Para usar la tecla Fin, presiona la tecla <ph name="LAUNCHER_KEY_NAME" /> + flecha hacia la derecha.</translation> <translation id="4279490309300973883">Duplicando</translation> <translation id="4283888303416325161">Ingresa la contraseña para más seguridad</translation> -<translation id="4285498937028063278">No fijar</translation> +<translation id="4285498937028063278">Dejar de fijar</translation> <translation id="4294319844246081198">Buenos días, <ph name="GIVEN_NAME" />:</translation> <translation id="4296136865091727875">Borrar las <ph name="COUNT" /> notificaciones</translation> <translation id="430191667033048642">Se movió <ph name="MOVED_APP_NAME" /> a la carpeta <ph name="FOLDER_NAME" />.</translation> @@ -760,6 +759,16 @@ <translation id="5393156353051693207">Mantén presionado en cualquier lugar para reorganizar las apps</translation> <translation id="5395308026110844773">Arrastra la app <ph name="DRAGGED_APP_NAME" /> sobre <ph name="IN_PLACE_APP" /> y suéltala para crear una carpeta.</translation> <translation id="5397578532367286026">El administrador (<ph name="MANAGER_EMAIL" />) puede revisar el uso y el historial de este usuario en la página chrome.com.</translation> +<translation id="5399673806694250334">Bandeja de estado, hora <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Configuración rápida, presiona la tecla de búsqueda + la tecla hacia la izquierda para acceder al centro de notificaciones.</translation> <translation id="5426063383988017631">Se cerró el menú de configuración</translation> <translation id="5428899915242071344">Comenzar a seleccionar</translation> @@ -858,7 +867,6 @@ <translation id="598407983968395253">Utilizar plantilla</translation> <translation id="598882571027504733">Para obtener la actualización, reinicia tu Chromebook con el teclado conectado.</translation> <translation id="5992218262414051481">Se habilitó el modo de contraste alto. Presiona Ctrl+Buscar+H de nuevo para desactivarlo.</translation> -<translation id="6009656393242168182">Inhabilita la configuración de bloqueo de la SIM</translation> <translation id="6012623610530968780">Página <ph name="SELECTED_PAGE" /> de <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Saliendo del modo de espejo</translation> <translation id="602001110135236999">Desplazar hacia la izquierda</translation> @@ -898,6 +906,7 @@ <translation id="619279033188484792">Ve las fotos, el contenido multimedia y las notificaciones recientes del teléfono en tu <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Cargar por completo ahora</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Conectar <ph name="NAME" /> que guardaste anteriormente en <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Ahora puedes grabarte a ti y a tu pantalla al mismo tiempo</translation> <translation id="622484624075952240">Abajo</translation> <translation id="6231419273573514727">Es posible que se limite el rendimiento de los dispositivos periféricos</translation>
diff --git a/ash/strings/ash_strings_es.xtb b/ash/strings/ash_strings_es.xtb index f1059cbc..bd756fd7 100644 --- a/ash/strings/ash_strings_es.xtb +++ b/ash/strings/ash_strings_es.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> y <ph name="UNAVAILABLE_APPS_COUNT" /> más no están en este dispositivo.</translation> <translation id="3735740477244556633">Ordenar por</translation> <translation id="3742055079367172538">Captura de pantalla hecha</translation> -<translation id="3761848338953536304">Tu administrador solicita que desactives el ajuste de bloqueo de la SIM</translation> <translation id="3765841986579723851">Editado hoy</translation> <translation id="3771549900096082774">Modo de contraste alto</translation> <translation id="3773700760453577392">Un administrador ha inhabilitado el inicio de sesión múltiple para <ph name="USER_EMAIL" />. @@ -858,7 +857,6 @@ <translation id="598407983968395253">Utilizar plantilla</translation> <translation id="598882571027504733">Para recibir la actualización, reinicia tu Chromebook con el teclado conectado.</translation> <translation id="5992218262414051481">Se ha habilitado el modo de contraste alto. Pulsa Ctrl + Tecla de búsqueda + H de nuevo para desactivarlo.</translation> -<translation id="6009656393242168182">Inhabilita el ajuste de bloqueo de tu SIM</translation> <translation id="6012623610530968780">Página <ph name="SELECTED_PAGE" /> de <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Saliendo del modo Espejo</translation> <translation id="602001110135236999">Desplazar a la izquierda</translation> @@ -898,6 +896,7 @@ <translation id="619279033188484792">Consulta fotos, contenido multimedia y notificaciones recientes de tu teléfono en tu <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Cargar al 100 % ahora</translation> <translation id="6193431488227440296">Desarrollo</translation> +<translation id="6210042900243040400">Conectar dispositivo <ph name="NAME" /> guardado anteriormente en <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Ahora puedes grabarte a ti mismo y tu pantalla al mismo tiempo</translation> <translation id="622484624075952240">Flecha hacia abajo</translation> <translation id="6231419273573514727">Es posible que el rendimiento de los periféricos esté limitado</translation>
diff --git a/ash/strings/ash_strings_et.xtb b/ash/strings/ash_strings_et.xtb index 1764d39..4d9e103d 100644 --- a/ash/strings/ash_strings_et.xtb +++ b/ash/strings/ash_strings_et.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">Rakendusi <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ja veel <ph name="UNAVAILABLE_APPS_COUNT" /> rakendust pole selles seadmes.</translation> <translation id="3735740477244556633">Sortimisalus:</translation> <translation id="3742055079367172538">Ekraanipilt on tehtud</translation> -<translation id="3761848338953536304">Teie administraator nõuab, et lülitaksite SIM-kaardi luku seade välja</translation> <translation id="3765841986579723851">Täna muudetud</translation> <translation id="3771549900096082774">Suure kontrastsusega režiim</translation> <translation id="3773700760453577392">Administraator on keelanud e-posti aadressi <ph name="USER_EMAIL" /> puhul mitmele kontole sisselogimise. @@ -760,6 +759,16 @@ <translation id="5393156353051693207">Rakenduste järjestuse muutmiseks puudutage pikalt kus tahes</translation> <translation id="5395308026110844773">Rakendus <ph name="DRAGGED_APP_NAME" /> rakenduse <ph name="IN_PLACE_APP" /> kohal, kausta loomiseks vabastage.</translation> <translation id="5397578532367286026">Haldur (<ph name="MANAGER_EMAIL" />) saab kasutaja kasutusandmeid ja ajalugu vaadata aadressil chrome.com.</translation> +<translation id="5399673806694250334">Olekusalv, aeg <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Kiirseaded, märguandekeskusele juurdepääsemiseks vajutage otsinguklahvi ja vasaknoolt.</translation> <translation id="5426063383988017631">Seadete menüü on suletud</translation> <translation id="5428899915242071344">Alustage valimist</translation> @@ -858,7 +867,6 @@ <translation id="598407983968395253">Kasuta malli</translation> <translation id="598882571027504733">Värskenduse hankimiseks taaskäivitage Chromebook koos ühendatud klaviatuuriga.</translation> <translation id="5992218262414051481">Suure kontrastsusega režiim on lubatud. Vajutage selle väljalülitamiseks uuesti klahvikombinatsiooni Ctrl + otsinguklahv + H.</translation> -<translation id="6009656393242168182">Keelake SIM-kaardi luku seade</translation> <translation id="6012623610530968780">Leht <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Peeglirežiimist väljumine</translation> <translation id="602001110135236999">Keri vasakule</translation>
diff --git a/ash/strings/ash_strings_eu.xtb b/ash/strings/ash_strings_eu.xtb index 333578c..d2720ab6 100644 --- a/ash/strings/ash_strings_eu.xtb +++ b/ash/strings/ash_strings_eu.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> eta beste <ph name="UNAVAILABLE_APPS_COUNT" /> ez daude gailuan.</translation> <translation id="3735740477244556633">Ordenatzeko irizpidea</translation> <translation id="3742055079367172538">Pantaila-argazkia hartu da</translation> -<translation id="3761848338953536304">SIMa blokeatzeko ezarpena desaktibatzeko eskatzen ari zaizu administratzailea</translation> <translation id="3765841986579723851">Gaur editatu da</translation> <translation id="3771549900096082774">Kontraste handiko modua</translation> <translation id="3773700760453577392">Administratzaile batek <ph name="USER_EMAIL" /> erabiltzaileari saio-hasiera anitza desgaitu dio. @@ -760,6 +759,16 @@ <translation id="5393156353051693207">Aplikazioen ordena aldatzeko, eduki sakatuta edozein toki</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" /> aplikazioaren gainean dago <ph name="DRAGGED_APP_NAME" />; aska ezazu karpeta bat sortzeko.</translation> <translation id="5397578532367286026">Kudeatzaileak (<ph name="MANAGER_EMAIL" />) erabiltzaile honen erabilera-datuak eta historia ikus ditzake manager chrome.com webgunean.</translation> +<translation id="5399673806694250334">Egoera-erretilua. Ordua: <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Ezarpen bizkorrak: sakatu "Bilatu" + Ezkerrera gezia jakinarazpen-zentrora joateko.</translation> <translation id="5426063383988017631">Ezarpenen menua itxi da</translation> <translation id="5428899915242071344">Hasi hautatzen</translation> @@ -858,7 +867,6 @@ <translation id="598407983968395253">Erabili txantiloia</translation> <translation id="598882571027504733">Eguneratzea eskuratzeko, berrabiarazi Chromebook-a teklatua konektatuta daukala.</translation> <translation id="5992218262414051481">Gaituta dago kontraste handiko modua. Desaktibatzeko, sakatu berriro Ktrl + Bilatu + H.</translation> -<translation id="6009656393242168182">Desgaitu SIMa blokeatzeko ezarpena</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /> orria</translation> <translation id="6018164090099858612">Ispilu modutik irteten</translation> <translation id="602001110135236999">Egin ezkerrera</translation>
diff --git a/ash/strings/ash_strings_fa.xtb b/ash/strings/ash_strings_fa.xtb index 60010408..7a7756a 100644 --- a/ash/strings/ash_strings_fa.xtb +++ b/ash/strings/ash_strings_fa.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">دوربین</translation> <translation id="1632985212731562677">میتوانید «دسترسی کلیدی» را در «تنظیمات > دسترسپذیری» غیرفعال کنید.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> دستگاه</translation> -<translation id="1639239467298939599">بارگیری</translation> +<translation id="1639239467298939599">در حال بارگیری</translation> <translation id="1654477262762802994">شروع پُرسمان صوتی</translation> <translation id="1668469839109562275">VPN داخلی</translation> <translation id="1677472565718498478"><ph name="TIME" /> باقیمانده</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، و <ph name="UNAVAILABLE_APPS_COUNT" /> برنامه دیگر در این دستگاه وجود ندارند.</translation> <translation id="3735740477244556633">مرتب کردن براساس</translation> <translation id="3742055079367172538">نماگرفت گرفته شد</translation> -<translation id="3761848338953536304">سرپرستتان از شما میخواهد تنظیم «قفل سیمکارت» را خاموش کنید</translation> <translation id="3765841986579723851">امروز ویرایش شده است</translation> <translation id="3771549900096082774">حالت تضاد بالا</translation> <translation id="3773700760453577392">یکی از سرپرستان ورود چندگانه به سیستم را برای <ph name="USER_EMAIL" /> غیرمجاز کرده است. برای ادامه دادن، همه کاربران باید از سیستم خارج شوند.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">برای تغییر ترتیب برنامهها، جایی را لمس کنید و نگه دارید</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> موجود در بالای <ph name="IN_PLACE_APP" />، برای ایجاد پوشه رها کنید.</translation> <translation id="5397578532367286026">میزان مصرف و سابقه این کاربر میتواند توسط مدیر (<ph name="MANAGER_EMAIL" />) در chrome.com بازبینی شود.</translation> +<translation id="5399673806694250334">سینی وضعیت، زمان <ph name="TIME" />، + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />، + <ph name="MIC" />، + <ph name="CAMERA" />، + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />، + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">تنظیمات فوری، برای دسترسی به مرکز اعلان، «جستجو + چپ» را فشار دهید.</translation> <translation id="5426063383988017631">منوی تنظیمات بسته شد</translation> <translation id="5428899915242071344">شروع کردن انتخاب</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">استفاده از الگو</translation> <translation id="598882571027504733">برای دریافت بهروزرسانی، Chromebook را با صفحهکلید متصل بازراهاندازی کنید.</translation> <translation id="5992218262414051481">«حالت تضاد بالا» فعال شد. برای خاموش کردن آن، Ctrl+Search+H را دوباره فشار دهید.</translation> -<translation id="6009656393242168182">غیرفعال کردن تنظیم «قفل سیمکارت»</translation> <translation id="6012623610530968780">صفحه <ph name="SELECTED_PAGE" /> از <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">خروج از حالت آینه</translation> <translation id="602001110135236999">پیمایش به چپ</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">اعلانها، رسانه، و عکسهای جدید تلفنتان را در <ph name="DEVICE_TYPE" /> مشاهده کنید</translation> <translation id="619335566042889110">اکنون کامل شارژ شود</translation> <translation id="6193431488227440296">توسعهدهنده</translation> +<translation id="6210042900243040400">به <ph name="NAME" /> که قبلاً در <ph name="EMAIL" /> ذخیره شده متصل شوید</translation> <translation id="6220928844947387476">اکنون میتوانید همزمان هم از خودتان و هم از صفحهنمایش فیلمبرداری کنید</translation> <translation id="622484624075952240">پیکان پایین</translation> <translation id="6231419273573514727">عملکرد لوازم جانبی ممکن است محدود باشند</translation>
diff --git a/ash/strings/ash_strings_fi.xtb b/ash/strings/ash_strings_fi.xtb index 547e0e6..5a228d61 100644 --- a/ash/strings/ash_strings_fi.xtb +++ b/ash/strings/ash_strings_fi.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ja <ph name="UNAVAILABLE_APPS_COUNT" /> muuta puuttuvat laitteelta.</translation> <translation id="3735740477244556633">Lajitteluperuste</translation> <translation id="3742055079367172538">Kuvakaappaus otettu</translation> -<translation id="3761848338953536304">Järjestelmänvalvoja pyytää sinua laittamaan SIM-kortin lukitusasetuksen pois päältä</translation> <translation id="3765841986579723851">Muokattu tänään</translation> <translation id="3771549900096082774">Suuri kontrasti ‑tila</translation> <translation id="3773700760453577392">Järjestelmänvalvoja on estänyt käyttäjää <ph name="USER_EMAIL" /> kirjautumasta sisään useille tileille. Kaikkien käyttäjien on kirjauduttava ulos jatkaakseen käyttöä.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Järjestele sovellukset uudelleen koskettamalla mitä tahansa kohtaa pitkään</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> on sovelluksen <ph name="IN_PLACE_APP" /> päällä, päästä irti luodaksesi kansion.</translation> <translation id="5397578532367286026">Hallinnoija (<ph name="MANAGER_EMAIL" />) voi tarkkailla tämän käyttäjän käyttö- ja historiatietoja osoitteessa chrome.com.</translation> +<translation id="5399673806694250334">Tila-alue, aika <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Pika-asetukset, Paina hakupainiketta ja vasenta nuolipainiketta siirtyäksesi ilmoituskeskukseen.</translation> <translation id="5426063383988017631">Asetusvalikko suljettu</translation> <translation id="5428899915242071344">Aloita valitseminen</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Käytä mallia</translation> <translation id="598882571027504733">Voit asentaa päivityksen käynnistämällä Chromebookisi uudelleen niin, että näppäimistö on kytkettynä.</translation> <translation id="5992218262414051481">Suuri kontrasti ‑tila on käytössä. Poista se käytöstä painamalla uudelleen Ctrl + haku + H.</translation> -<translation id="6009656393242168182">Poista SIM-kortin lukitusasetus käytöstä</translation> <translation id="6012623610530968780">Sivu <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Poistutaan peilitilasta</translation> <translation id="602001110135236999">Vieritä vasemmalle</translation>
diff --git a/ash/strings/ash_strings_fil.xtb b/ash/strings/ash_strings_fil.xtb index 663cd3b..7cb661f 100644 --- a/ash/strings/ash_strings_fil.xtb +++ b/ash/strings/ash_strings_fil.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">Posibleng naaapektuhan ng cable ang performance</translation> <translation id="2903844815300039659">Nakakonekta sa <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Mga pag-capture ng screen</translation> +<translation id="2925246975070834767">Subukan ang awtomatikong pag-zoom para mapunta ka sa gitna ng screen. I-on ito sa Mga Mabilisang Setting.</translation> <translation id="2941112035454246133">Mababa</translation> <translation id="2942350706960889382">Naka-dock na Magnifier</translation> <translation id="2942516765047364088">Posisyon ng shelf</translation> @@ -472,7 +473,6 @@ <translation id="3726171378575546917">Wala ang <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, at <ph name="UNAVAILABLE_APPS_COUNT" /> pa sa device na ito.</translation> <translation id="3735740477244556633">Pagbukud-bukurin ayon sa</translation> <translation id="3742055079367172538">Nakakuha na ng screenshot</translation> -<translation id="3761848338953536304">Hinihiling ng iyong administrator na i-off mo ang setting ng Lock SIM</translation> <translation id="3765841986579723851">Na-edit ngayon</translation> <translation id="3771549900096082774">High Contrast Mode</translation> <translation id="3773700760453577392">Hindi pinayagan ng isang administrator ang maraming pag-sign in para sa <ph name="USER_EMAIL" />. Dapat mag-sign out ang lahat ng user para makapagpatuloy.</translation> @@ -634,6 +634,7 @@ <translation id="4628757576491864469">Mga Device</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Star na rating <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Ibalik sa nakaraang bersyon ang device sa loob ng isang araw}one{Ibalik sa nakaraang bersyon ang device sa loob ng # araw}other{Ibalik sa nakaraang bersyon ang device sa loob ng # na araw}}</translation> +<translation id="4633636853437260449">Pindutin ang Ctrl+W para i-delete</translation> <translation id="4642092649622328492">Kumuha ng screenshot ng bahagi ng screen</translation> <translation id="4644727592819780893">Masyadong maliit ang rehiyon para ipakita ang preview ng camera</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, Rekomendasyon sa app</translation> @@ -857,7 +858,6 @@ <translation id="598407983968395253">Gamitin ang template</translation> <translation id="598882571027504733">Para makuha ang update, i-restart ang iyong Chromebook nang nakakabit ang keyboard.</translation> <translation id="5992218262414051481">Na-enable ang High Contrast Mode. Pinduting muli ang Ctrl+Search+H upang i-off ito.</translation> -<translation id="6009656393242168182">I-disable ang iyong setting ng SIM Lock</translation> <translation id="6012623610530968780">Page <ph name="SELECTED_PAGE" /> ng <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Lumalabas sa mirror mode</translation> <translation id="602001110135236999">Mag-scroll pakaliwa</translation> @@ -897,6 +897,7 @@ <translation id="619279033188484792">Tingnan ang mga kamakailang larawan, media, at notification ng iyong telepono sa <ph name="DEVICE_TYPE" /> mo</translation> <translation id="619335566042889110">Ganap na i-charge ngayon</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Ikonekta ang <ph name="NAME" /> na dating na-save sa <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Puwede mo na ngayong sabay na i-record ang iyong sarili at ang screen mo</translation> <translation id="622484624075952240">Down</translation> <translation id="6231419273573514727">Posibleng maging limitado ang performance ng peripheral</translation>
diff --git a/ash/strings/ash_strings_fr-CA.xtb b/ash/strings/ash_strings_fr-CA.xtb index 2c70b2b..36d8dac4 100644 --- a/ash/strings/ash_strings_fr-CA.xtb +++ b/ash/strings/ash_strings_fr-CA.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> et <ph name="UNAVAILABLE_APPS_COUNT" /> autres applications ne sont pas sur cet appareil.</translation> <translation id="3735740477244556633">Trier par</translation> <translation id="3742055079367172538">Saisie d'écran enregistrée</translation> -<translation id="3761848338953536304">Votre administrateur vous demande de désactiver le paramètre de verrouillage SIM</translation> <translation id="3765841986579723851">Modifié aujourd'hui</translation> <translation id="3771549900096082774">Mode de contraste élevé</translation> <translation id="3773700760453577392">Un administrateur a désactivé la connexion multicompte pour <ph name="USER_EMAIL" />. Tous les utilisateurs doivent se déconnecter pour continuer.</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">Utiliser le modèle</translation> <translation id="598882571027504733">Pour télécharger la mise à jour, redémarrez votre Chromebook avec le clavier associé.</translation> <translation id="5992218262414051481">Mode de contraste élevé activé. Appuyez à nouveau sur Ctrl+Recherche+H pour le désactiver.</translation> -<translation id="6009656393242168182">Désactivez votre paramètre de verrouillage SIM</translation> <translation id="6012623610530968780">Page <ph name="SELECTED_PAGE" /> sur <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Fermeture du mode miroir</translation> <translation id="602001110135236999">Faire défiler vers la gauche</translation>
diff --git a/ash/strings/ash_strings_fr.xtb b/ash/strings/ash_strings_fr.xtb index 9292e89a..b0fe8885 100644 --- a/ash/strings/ash_strings_fr.xtb +++ b/ash/strings/ash_strings_fr.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Caméra</translation> <translation id="1632985212731562677">Vous pouvez désactiver Switch Access en sélectionnant Paramètres > Accessibilité.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> appareils</translation> -<translation id="1639239467298939599">Chargement en cours</translation> +<translation id="1639239467298939599">Chargement en cours…</translation> <translation id="1654477262762802994">Soumettre une requête vocale</translation> <translation id="1668469839109562275">VPN intégré</translation> <translation id="1677472565718498478">Temps restant : <ph name="TIME" /></translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> et <ph name="UNAVAILABLE_APPS_COUNT" /> autres applis ne sont pas sur cet appareil.</translation> <translation id="3735740477244556633">Trier par</translation> <translation id="3742055079367172538">Capture d'écran réalisée</translation> -<translation id="3761848338953536304">Votre administrateur vous demande de désactiver le paramètre de verrouillage de la carte SIM</translation> <translation id="3765841986579723851">Modifié aujourd'hui</translation> <translation id="3771549900096082774">Mode Contraste élevé</translation> <translation id="3773700760453577392">Un administrateur a désactivé la connexion multicompte pour <ph name="USER_EMAIL" />. Tous les utilisateurs doivent se déconnecter pour continuer.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">Utiliser le modèle</translation> <translation id="598882571027504733">Pour télécharger la mise à jour, redémarrez votre Chromebook avec le clavier branché.</translation> <translation id="5992218262414051481">Le mode Contraste élevé est activé. Appuyez de nouveau sur Ctrl+Recherche+H pour le désactiver.</translation> -<translation id="6009656393242168182">Désactiver votre paramètre de verrouillage de la carte SIM</translation> <translation id="6012623610530968780">Page <ph name="SELECTED_PAGE" /> sur <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Sortie du mode Miroir…</translation> <translation id="602001110135236999">Vers la gauche</translation> @@ -897,6 +895,7 @@ <translation id="619279033188484792">Afficher les photos, contenus multimédias et notifications récents de votre téléphone sur votre <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Recharger complètement</translation> <translation id="6193431488227440296">Développement</translation> +<translation id="6210042900243040400">Associer les <ph name="NAME" /> précédemment enregistrés dans <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Vous pouvez maintenant enregistrer votre écran et vous-même en même temps</translation> <translation id="622484624075952240">Bas</translation> <translation id="6231419273573514727">Les performances du périphérique risquent d'être limitées</translation>
diff --git a/ash/strings/ash_strings_gl.xtb b/ash/strings/ash_strings_gl.xtb index adce046..b677cbf3 100644 --- a/ash/strings/ash_strings_gl.xtb +++ b/ash/strings/ash_strings_gl.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e <ph name="UNAVAILABLE_APPS_COUNT" /> aplicacións máis non están neste dispositivo.</translation> <translation id="3735740477244556633">Ordenar por</translation> <translation id="3742055079367172538">Captura de pantalla feita</translation> -<translation id="3761848338953536304">O teu administrador está solicitando que desactives a opción de configuración de bloqueo da SIM</translation> <translation id="3765841986579723851">Editouse hoxe</translation> <translation id="3771549900096082774">Modo de alto contraste</translation> <translation id="3773700760453577392">Un administrador non permitiu o inicio de sesión múltiple de <ph name="USER_EMAIL" />. @@ -858,7 +857,6 @@ <translation id="598407983968395253">Usar modelo</translation> <translation id="598882571027504733">Para recibir a actualización, reinicia o dispositivo Chromebook co teclado conectado.</translation> <translation id="5992218262414051481">O modo de alto contraste está activado. Preme Ctrl+Buscar+H de novo para desactivalo.</translation> -<translation id="6009656393242168182">Desactiva a opción de configuración de bloqueo da SIM</translation> <translation id="6012623610530968780">Páxina <ph name="SELECTED_PAGE" /> de <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Saíndo do modo de proxección</translation> <translation id="602001110135236999">Desprazarse á esquerda</translation>
diff --git a/ash/strings/ash_strings_gu.xtb b/ash/strings/ash_strings_gu.xtb index 5d2e48d..8659a87 100644 --- a/ash/strings/ash_strings_gu.xtb +++ b/ash/strings/ash_strings_gu.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">કૅમેરા</translation> <translation id="1632985212731562677">સ્વિચ ઍક્સેસને સેટિંગ > ઍક્સેસિબિલિટીમાંથી બંધ કરી શકાય છે.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> ડિવાઇસ</translation> -<translation id="1639239467298939599">લોડ કરી રહ્યું છે</translation> +<translation id="1639239467298939599">લોડ થઇ રહી છે</translation> <translation id="1654477262762802994">વૉઇસ ક્વેરી શરૂ કરો</translation> <translation id="1668469839109562275">બિલ્ટ-ઇન VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> બાકી</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917">આ ડિવાઇસ પર <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> અને વધુ <ph name="UNAVAILABLE_APPS_COUNT" /> ઍપ ઉપલબ્ધ નથી.</translation> <translation id="3735740477244556633">આ પ્રમાણે સૉર્ટ કરો</translation> <translation id="3742055079367172538">સ્ક્રીનશૉટ લેવાયો</translation> -<translation id="3761848338953536304">તમે 'સિમ કાર્ડ લૉક કરો' સેટિંગ બંધ કરો એવી વિનંતી તમારા ઍડમિનિસ્ટ્રેટર કરી રહ્યાં છે</translation> <translation id="3765841986579723851">આજે ફેરફાર કરવામાં આવ્યો હતો</translation> <translation id="3771549900096082774">ઉચ્ચ કોન્ટ્રાસ્ટ મોડ</translation> <translation id="3773700760453577392">એડમિને <ph name="USER_EMAIL" /> માટે એકથી વધુ સાઇન ઇનને નામંજૂર કર્યું છે. ચાલુ રાખવા માટે બધા વપરાશકર્તાઓએ સાઇન આઉટ કરવું જરૂરી છે.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">નમૂનાનો ઉપયોગ કરો</translation> <translation id="598882571027504733">અપડેટ મેળવવા માટે, તમારી Chromebookને જોડાયેલ કીબોર્ડ સાથે ફરીથી શરૂ કરો.</translation> <translation id="5992218262414051481">હાઇ કોન્ટ્રાસ્ટ મોડ ચાલુ કર્યો. ટૉગલ બંધ કરવા માટે ફરીથી Ctrl+Search+H ફરીથી દબાવો.</translation> -<translation id="6009656393242168182">તમારું 'સિમ કાર્ડ લૉક કરો' સેટિંગ બંધ કરો</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" /> પેજમાંનું <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">મીરર મોડથી બહાર નીકળે છે</translation> <translation id="602001110135236999">ડાબે સ્ક્રોલ કરો</translation>
diff --git a/ash/strings/ash_strings_hi.xtb b/ash/strings/ash_strings_hi.xtb index a9db14a..c778df1 100644 --- a/ash/strings/ash_strings_hi.xtb +++ b/ash/strings/ash_strings_hi.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">कैमरा</translation> <translation id="1632985212731562677">ऐक्सेस करने का तरीका बदलने की सुविधा को सेटिंग > सुलभता में जाकर, बंद किया जा सकता है.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> डिवाइस</translation> -<translation id="1639239467298939599">लोड हो रहा है</translation> +<translation id="1639239467298939599">लोड हो रही है</translation> <translation id="1654477262762802994">बोलकर खोजना शुरू करें</translation> <translation id="1668469839109562275">पहले से मौजूद वीपीएन</translation> <translation id="1677472565718498478"><ph name="TIME" /> बाकी</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, और <ph name="UNAVAILABLE_APPS_COUNT" /> ऐप्लिकेशन इस डिवाइस पर मौजूद नहीं हैं.</translation> <translation id="3735740477244556633">इसके अनुसार क्रम से लगाएं</translation> <translation id="3742055079367172538">स्क्रीनशॉट लिया गया</translation> -<translation id="3761848338953536304">आपके एडमिन ने आपसे 'सिम लॉक करें' सेटिंग बंद करने का अनुरोध किया है</translation> <translation id="3765841986579723851">इसमें, आज बदलाव किया गया था</translation> <translation id="3771549900096082774">उच्च कंट्रास्ट मोड</translation> <translation id="3773700760453577392">किसी एडमिन ने <ph name="USER_EMAIL" /> के लिए एक से ज़्यादा 'साइन इन' नामंज़ूर कर दिए हैं. @@ -858,7 +857,6 @@ <translation id="598407983968395253">टेंप्लेट का इस्तेमाल करें</translation> <translation id="598882571027504733">अपडेट पाने के लिए, अटैच किए गए कीबोर्ड से अपने Chromebook को रीस्टार्ट करें.</translation> <translation id="5992218262414051481">हाई कंट्रास्ट मोड चालू है. उसे टॉगल करने के लिए फिर से Ctrl+Search+H दबाएं.</translation> -<translation id="6009656393242168182">'सिम लॉक करें' सेटिंग बंद करें</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> में से <ph name="SELECTED_PAGE" /> पेज</translation> <translation id="6018164090099858612">मिरर मोड से बाहर निकाला जा रहा है</translation> <translation id="602001110135236999">बाईं ओर स्क्रोल करें</translation> @@ -898,6 +896,7 @@ <translation id="619279033188484792">अपने फ़ोन में मौजूद हाल ही की फ़ोटो, मीडिया, और सूचनाएं <ph name="DEVICE_TYPE" /> पर देखें</translation> <translation id="619335566042889110">बैटरी पूरी चार्ज हो चुकी है</translation> <translation id="6193431488227440296">डेव</translation> +<translation id="6210042900243040400"><ph name="EMAIL" /> में पहले से सेव किए गए <ph name="NAME" /> को कनेक्ट करें</translation> <translation id="6220928844947387476">अब, कैमरे और स्क्रीन दोनों पर दिख रही चीज़ों की रिकॉर्डिंग एक साथ की जा सकती है</translation> <translation id="622484624075952240">नीचे</translation> <translation id="6231419273573514727">हो सकता है कि सहायक डिवाइस पूरी तरह काम न करें</translation>
diff --git a/ash/strings/ash_strings_hr.xtb b/ash/strings/ash_strings_hr.xtb index cb180a7..5477fe4 100644 --- a/ash/strings/ash_strings_hr.xtb +++ b/ash/strings/ash_strings_hr.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">Prethodno povezano</translation> <translation id="371370241367527062">Prednji mikrofon</translation> <translation id="3713734891607377840">Otvaranje nakon završetka</translation> +<translation id="3724279623330129812">Automatsko zumiranje centriralo je kameru</translation> <translation id="3726171378575546917">Aplikacije <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i njih još <ph name="UNAVAILABLE_APPS_COUNT" /> nisu instalirane na ovom uređaju.</translation> <translation id="3735740477244556633">Poredaj po</translation> <translation id="3742055079367172538">Izrađena je snimka zaslona</translation> -<translation id="3761848338953536304">Administrator traži da isključite postavku zaključavanja SIM-a</translation> <translation id="3765841986579723851">Uređeno danas</translation> <translation id="3771549900096082774">Način visokog kontrasta</translation> <translation id="3773700760453577392">Administrator je onemogućio višestruku prijavu za <ph name="USER_EMAIL" />. Svi se korisnici moraju odjaviti da bi nastavili.</translation> @@ -533,7 +533,7 @@ <translation id="4115378294792113321">Magenta</translation> <translation id="412298498316631026">prozor</translation> <translation id="4123259114412175274">Da biste otključali Chromebook, provjerite je li na telefonu uključen Bluetooth</translation> -<translation id="4125970834901680537">Aplikacije se ne mogu emitirati u načinu rada tableta. Pokušajte ponovo u načinu rada prijenosnog računala.</translation> +<translation id="4125970834901680537">Aplikacije se ne mogu streamati u načinu rada tableta. Pokušajte u načinu prijenosnog računala.</translation> <translation id="4129129681837227511">Za prikaz obavijesti na zaključanom zaslonu otključajte zaslon da biste promijenili postavku</translation> <translation id="4136724716305260864">Uključeno do izlaska sunca</translation> <translation id="4146833061457621061">Pusti glazbu</translation> @@ -867,7 +867,6 @@ <translation id="598407983968395253">Koristi predložak</translation> <translation id="598882571027504733">Da biste preuzeli ažuriranje, ponovo pokrenite Chromebook dok je tipkovnica priključena.</translation> <translation id="5992218262414051481">Način visokog kontrasta omogućen je. Ponovo pritisnite Ctrl + Search + H da biste ga isključili.</translation> -<translation id="6009656393242168182">Onemogućite postavku zaključavanja SIM-a</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. stranica od <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Izlaz iz zrcalnog načina</translation> <translation id="602001110135236999">Pomicanje ulijevo</translation>
diff --git a/ash/strings/ash_strings_hu.xtb b/ash/strings/ash_strings_hu.xtb index f93c16e..2aa3842 100644 --- a/ash/strings/ash_strings_hu.xtb +++ b/ash/strings/ash_strings_hu.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">A(z) <ph name="UNAVAILABLE_APPS_ONE" />, a(z) <ph name="UNAVAILABLE_APPS_TWO" /> és <ph name="UNAVAILABLE_APPS_COUNT" /> további alkalmazás nincs telepítve erre az eszközre.</translation> <translation id="3735740477244556633">Rendezés</translation> <translation id="3742055079367172538">Képernyőkép elkészítve</translation> -<translation id="3761848338953536304">A rendszergazda a SIM-zárolási beállítás kikapcsolására kéri Önt.</translation> <translation id="3765841986579723851">Ma szerkesztette</translation> <translation id="3771549900096082774">Nagy kontrasztú mód</translation> <translation id="3773700760453577392">Egy rendszergazda letiltotta a többfiókos bejelentkezést <ph name="USER_EMAIL" /> számára. @@ -868,7 +867,6 @@ <translation id="598407983968395253">Sablon használata</translation> <translation id="598882571027504733">A frissítés lekéréséhez indítsa újra a Chromebookot a csatlakoztatott billentyűzet segítségével.</translation> <translation id="5992218262414051481">Nagy kontrasztú mód bekapcsolva. Kikapcsoláshoz nyomja le ismét a Ctrl+Keresés+H billentyűparancsot.</translation> -<translation id="6009656393242168182">SIM-zárolási beállítás kikapcsolása</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />/<ph name="SELECTED_PAGE" />. oldal</translation> <translation id="6018164090099858612">Kilépés a tükrözési módból</translation> <translation id="602001110135236999">Görgetés balra</translation>
diff --git a/ash/strings/ash_strings_hy.xtb b/ash/strings/ash_strings_hy.xtb index 96b9682..eb462c9 100644 --- a/ash/strings/ash_strings_hy.xtb +++ b/ash/strings/ash_strings_hy.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" /> և <ph name="UNAVAILABLE_APPS_TWO" /> հավելվածներն ու ևս <ph name="UNAVAILABLE_APPS_COUNT" /> հավելված տեղադրված չեն այս սարքում։</translation> <translation id="3735740477244556633">Դասավորել ըստ</translation> <translation id="3742055079367172538">Սքրինշոթը ստեղծված է</translation> -<translation id="3761848338953536304">Ձեր ադմինիստրատորը պահանջում է, որ անջատեք SIM քարտի կողպման կարգավորումը</translation> <translation id="3765841986579723851">Այսօր փոփոխել եք</translation> <translation id="3771549900096082774">Բարձր կոնտրաստով ռեժիմ</translation> <translation id="3773700760453577392">Ադմինիստրատորն արգելել է բազմակի մուտքը <ph name="USER_EMAIL" />-ի հաշվի համար: Շարունակելու համար բոլոր օգտատերերը պետք է դուրս գրվեն:</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Հպեք էկրանի ցանկացած հատվածին և պահեք՝ հավելվածները վերադասավորելու համար</translation> <translation id="5395308026110844773">«<ph name="DRAGGED_APP_NAME" />» հավելվածը «<ph name="IN_PLACE_APP" />» հավելվածի վրա է: Բաց թողեք՝ պանակ ստեղծելու համար:</translation> <translation id="5397578532367286026">Այս օգտատիրոջ օգտագործման տվյալները և պատմությունը կարող են վերահսկվել chrome.com-ի կառավարիչի (<ph name="MANAGER_EMAIL" />) կողմից:</translation> +<translation id="5399673806694250334">Կարգավիճակի տող, ժամը՝ <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Արագ կարգավորումներ․ սեղմեք Search+ձախ սլաքը՝ ծանուցումների կենտրոն մտնելու համար։</translation> <translation id="5426063383988017631">Կարգավորումների ընտրացանկը փակված է</translation> <translation id="5428899915242071344">Սկսել տեքստի ընտրությունը</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Օգտագործել ձևանմուշը</translation> <translation id="598882571027504733">Թարմացումը տեղադրելու համար վերագործարկեք Chromebook-ը՝ առանց ստեղնաշարն անջատելու։</translation> <translation id="5992218262414051481">Բարձր կոնտրաստի ռեժիմը միացավ: Այն անջատելու համար նորից սեղմեք Ctrl+Search+H:</translation> -<translation id="6009656393242168182">Անջատեք ձեր SIM քարտի կողպման կարգավորումը</translation> <translation id="6012623610530968780">Էջ <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ելք հայելային ռեժիմից</translation> <translation id="602001110135236999">Ոլորել ձախ</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">Թույլ է տալիս հեռախոսում վերջերս ավելացված լուսանկարները, մեդիա ֆայլերը և ծանուցումները դիտել <ph name="DEVICE_TYPE" /> սարքում։</translation> <translation id="619335566042889110">Լիցքավորել ամբողջությամբ հիմա</translation> <translation id="6193431488227440296">Մշակողների</translation> +<translation id="6210042900243040400">Միացեք սարքին (<ph name="NAME" />), որը նախկինում պահել եք <ph name="EMAIL" /> հաշվում</translation> <translation id="6220928844947387476">Այժմ դուք կարող եք միաժամանակ տեսագրել ձեզ և ձեր էկրանը</translation> <translation id="622484624075952240">Վար</translation> <translation id="6231419273573514727">Արտաքին սարքերի աշխատանքի արդյունավետությունը կարող է սահմանափակվել</translation>
diff --git a/ash/strings/ash_strings_id.xtb b/ash/strings/ash_strings_id.xtb index 16b32bc..d09a1ce 100644 --- a/ash/strings/ash_strings_id.xtb +++ b/ash/strings/ash_strings_id.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, dan <ph name="UNAVAILABLE_APPS_COUNT" /> lainnya tidak ada di perangkat ini.</translation> <translation id="3735740477244556633">Urutkan menurut</translation> <translation id="3742055079367172538">Screenshot telah diambil</translation> -<translation id="3761848338953536304">Administrator meminta Anda untuk menonaktifkan setelan Kunci SIM</translation> <translation id="3765841986579723851">Diedit hari ini</translation> <translation id="3771549900096082774">Mode Kontras Tinggi</translation> <translation id="3773700760453577392">Administrator telah melarang fitur login multipel untuk <ph name="USER_EMAIL" />. Semua pengguna harus logout untuk melanjutkan.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Sentuh lama di sembarang tempat untuk mengurutkan ulang aplikasi</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> di atas <ph name="IN_PLACE_APP" />, lalu lepaskan untuk membuat folder.</translation> <translation id="5397578532367286026">Penggunaan dan histori pengguna ini dapat ditinjau oleh pengelola (<ph name="MANAGER_EMAIL" />) di chrome.com.</translation> +<translation id="5399673806694250334">Menu status, waktu <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Setelan Cepat, Tekan penelusuran + kiri untuk mengakses pusat notifikasi.</translation> <translation id="5426063383988017631">Menu setelan ditutup</translation> <translation id="5428899915242071344">Mulai memilih</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Gunakan template</translation> <translation id="598882571027504733">Untuk mendapatkan update, nyalakan ulang Chromebook dengan keyboard dalam keadaan terhubung.</translation> <translation id="5992218262414051481">Mode Kontras Tinggi diaktifkan. Tekan Ctrl+Search+H lagi untuk menonaktifkannya.</translation> -<translation id="6009656393242168182">Nonaktifkan setelan Kunci SIM Anda</translation> <translation id="6012623610530968780">Halaman <ph name="SELECTED_PAGE" /> dari <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Keluar dari mode transmisi</translation> <translation id="602001110135236999">Scroll ke kiri</translation>
diff --git a/ash/strings/ash_strings_is.xtb b/ash/strings/ash_strings_is.xtb index ab4ff7c..fa1c2cde 100644 --- a/ash/strings/ash_strings_is.xtb +++ b/ash/strings/ash_strings_is.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> í viðbót eru ekki í þessu tæki.</translation> <translation id="3735740477244556633">Raða eftir</translation> <translation id="3742055079367172538">Skjámynd tekin</translation> -<translation id="3761848338953536304">Kerfisstjórinn biður um að þú slökkvir á stillingunni fyrir SIM-lás</translation> <translation id="3765841986579723851">Breytt í dag</translation> <translation id="3771549900096082774">Mikil birtuskil</translation> <translation id="3773700760453577392">Stjórnandi hefur lokað á innskráningu fleiri en eins notanda fyrir <ph name="USER_EMAIL" />. Allir notendur verða að skrá sig út til að halda áfram.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Haltu inni hvar sem er til að endurraða forritunum þínum</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> ofan á <ph name="IN_PLACE_APP" />, slepptu til að búa til möppu.</translation> <translation id="5397578532367286026">Stjórnandinn (<ph name="MANAGER_EMAIL" />) getur farið yfir notkun og feril þessa notanda á chrome.com.</translation> +<translation id="5399673806694250334">Stöðusvæði, tími <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Flýtistillingar, ýttu á leit + vinstri til að opna tilkynningamiðstöðina.</translation> <translation id="5426063383988017631">Stillingavalmynd lokað</translation> <translation id="5428899915242071344">Byrja að velja</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Nota sniðmát</translation> <translation id="598882571027504733">Endurræstu Chromebook með lyklaborðið tengt til að uppfæra</translation> <translation id="5992218262414051481">Kveikt á stillingu fyrir mikil birtuskil. Ýttu aftur á Ctrl+leitarhnappinn+H til að slökkva á henni.</translation> -<translation id="6009656393242168182">Slökktu á stillingunni fyrir SIM-lás</translation> <translation id="6012623610530968780">Síða <ph name="SELECTED_PAGE" /> af <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Hættir í spegilstillingu</translation> <translation id="602001110135236999">Fletta til vinstri</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">Skoðaðu nýlegar myndir, margmiðlunarefni og tilkynningar símans í <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Fullhlaða núna</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Tengdu <ph name="NAME" />, sem áður var vistað á <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Nú geturðu tekið þig og skjáinn upp á sama tíma</translation> <translation id="622484624075952240">Niður</translation> <translation id="6231419273573514727">Afköst jaðartækja gætu verið takmörkuð</translation>
diff --git a/ash/strings/ash_strings_it.xtb b/ash/strings/ash_strings_it.xtb index 25fc275..f1648f6 100644 --- a/ash/strings/ash_strings_it.xtb +++ b/ash/strings/ash_strings_it.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e altre <ph name="UNAVAILABLE_APPS_COUNT" /> app non sono disponibili su questo dispositivo.</translation> <translation id="3735740477244556633">Ordina per</translation> <translation id="3742055079367172538">Screenshot acquisito</translation> -<translation id="3761848338953536304">L'amministratore richiede la disattivazione dell'impostazione di blocco della SIM</translation> <translation id="3765841986579723851">Modificato oggi</translation> <translation id="3771549900096082774">Modalità ad alto contrasto</translation> <translation id="3773700760453577392">Un amministratore ha vietato l'accesso simultaneo per <ph name="USER_EMAIL" />. @@ -858,7 +857,6 @@ <translation id="598407983968395253">Utilizza modello</translation> <translation id="598882571027504733">Per scaricare l'aggiornamento, riavvia il Chromebook con la tastiera collegata.</translation> <translation id="5992218262414051481">Modalità ad alto contrasto attivata. Premi di nuovo CTRL + tasto per la ricerca + H per disattivarla.</translation> -<translation id="6009656393242168182">Disattiva l'impostazione di blocco della SIM</translation> <translation id="6012623610530968780">Pagina <ph name="SELECTED_PAGE" /> di <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Uscita dalla modalità di mirroring</translation> <translation id="602001110135236999">Scorri a sinistra</translation>
diff --git a/ash/strings/ash_strings_iw.xtb b/ash/strings/ash_strings_iw.xtb index bb0d5c9e..1b023948 100644 --- a/ash/strings/ash_strings_iw.xtb +++ b/ash/strings/ash_strings_iw.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ועוד <ph name="UNAVAILABLE_APPS_COUNT" /> אפליקציות נוספות לא נמצאות במכשיר הזה.</translation> <translation id="3735740477244556633">מיון לפי</translation> <translation id="3742055079367172538">צילום המסך בוצע</translation> -<translation id="3761848338953536304">לפי בקשת האדמין, עליך להשבית את ההגדרה של נעילת ה-SIM</translation> <translation id="3765841986579723851">נערך היום</translation> <translation id="3771549900096082774">מצב ניגודיות גבוהה</translation> <translation id="3773700760453577392">מנהל מערכת ביטל הרשאה של כניסה עם מספר חשבונות עבור <ph name="USER_EMAIL" />. כדי להמשיך, כל המשתמשים חייבים לבצע יציאה.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">לוחצים לחיצה ארוכה במקום כלשהו כדי למיין מחדש את האפליקציות</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> מעל <ph name="IN_PLACE_APP" />. יש לשחרר כדי ליצור תיקייה.</translation> <translation id="5397578532367286026">המנהל (<ph name="MANAGER_EMAIL" />) יכול לבדוק את השימוש וההיסטוריה של משתמש זה ב-chrome.com.</translation> +<translation id="5399673806694250334">מגש סטטוס, שעה <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">הגדרות מהירות, יש להקיש על מקש החיפוש ביחד עם מקש חץ שמאלה כדי לגשת אל מרכז ההתראות.</translation> <translation id="5426063383988017631">תפריט ההגדרות נסגר</translation> <translation id="5428899915242071344">אני רוצה להתחיל לבחור</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">שימוש בתבנית</translation> <translation id="598882571027504733">כדי להתקין את העדכון, יש להפעיל מחדש את ה-Chromebook כשהמקלדת מחוברת.</translation> <translation id="5992218262414051481">מצב ניגודיות גבוהה פועל. יש להקיש שוב על Ctrl+Search+H כדי לכבות אותו.</translation> -<translation id="6009656393242168182">השבתת ההגדרה של נעילת ה-SIM</translation> <translation id="6012623610530968780">דף <ph name="SELECTED_PAGE" /> מתוך <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">יציאה ממצב שיקוף</translation> <translation id="602001110135236999">גלילה שמאלה</translation>
diff --git a/ash/strings/ash_strings_ja.xtb b/ash/strings/ash_strings_ja.xtb index d70d74a..2e9306e 100644 --- a/ash/strings/ash_strings_ja.xtb +++ b/ash/strings/ash_strings_ja.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">カメラ</translation> <translation id="1632985212731562677">スイッチ アクセスは [設定] > [ユーザー補助機能] で無効にできます。</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> 台のデバイス</translation> -<translation id="1639239467298939599">読み込み中</translation> +<translation id="1639239467298939599">読み込んでいます</translation> <translation id="1654477262762802994">音声検索を開始</translation> <translation id="1668469839109562275">組み込みの VPN</translation> <translation id="1677472565718498478">残り <ph name="TIME" /></translation> @@ -469,10 +469,10 @@ <translation id="3708186454126126312">以前に接続したデバイス</translation> <translation id="371370241367527062">前方のマイク</translation> <translation id="3713734891607377840">完了したら開く</translation> +<translation id="3724279623330129812">オートズームによりカメラの中心に合わせました</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />、<ph name="UNAVAILABLE_APPS_TWO" />、<ph name="UNAVAILABLE_APPS_COUNT" /> はこのデバイスにありません。</translation> <translation id="3735740477244556633">並べ替え</translation> <translation id="3742055079367172538">スクリーンショット撮影完了</translation> -<translation id="3761848338953536304">管理者が SIM ロック設定を無効にするよう求めています</translation> <translation id="3765841986579723851">今日編集したファイル</translation> <translation id="3771549900096082774">ハイ コントラスト モード</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> へのマルチログインは、管理者によって禁止されています。続行するには、すべてのユーザーがログアウトする必要があります。</translation> @@ -867,7 +867,6 @@ <translation id="598407983968395253">テンプレートを使用</translation> <translation id="598882571027504733">アップデートを取得するには、キーボードを接続した状態で Chromebook を再起動してください。</translation> <translation id="5992218262414051481">ハイコントラスト モードが有効になりました。無効にするには、Ctrl+検索+H キーをもう一度押します。</translation> -<translation id="6009656393242168182">SIM ロック設定を無効にしてください</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" /> ページ</translation> <translation id="6018164090099858612">ミラーモードを終了しています</translation> <translation id="602001110135236999">左にスクロール</translation>
diff --git a/ash/strings/ash_strings_ka.xtb b/ash/strings/ash_strings_ka.xtb index 900d7c8..73f33e8e 100644 --- a/ash/strings/ash_strings_ka.xtb +++ b/ash/strings/ash_strings_ka.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">კაბელმა შეიძლება გავლენა იქონიოს ეფექტურობაზე</translation> <translation id="2903844815300039659">დაკავშირებულია <ph name="NAME" />-თან, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">ეკრანის აღბეჭდვები</translation> +<translation id="2925246975070834767">ცადეთ ავტომატური მასშტაბირება, ეკრანის ცენტრში რომ მოექცეთ. მისი ჩართვა შეგიძლიათ სწრაფი პარამეტრებიდან.</translation> <translation id="2941112035454246133">დაბალი</translation> <translation id="2942350706960889382">ჩამაგრებული ლუპა</translation> <translation id="2942516765047364088">თაროს პოზიცია</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">ადრე დაკავშირებული</translation> <translation id="371370241367527062">წინა მიკროფონი</translation> <translation id="3713734891607377840">დასრულებისას გახსნა</translation> +<translation id="3724279623330129812">ავტომატურმა მასშტაბირებამ ცენტრში მოაქცია კამერა</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> და <ph name="UNAVAILABLE_APPS_COUNT" /> სხვა აპი არ არის ამ მოწყობილობაზე.</translation> <translation id="3735740477244556633">დალაგება</translation> <translation id="3742055079367172538">ეკრანის ანაბეჭდი გადაღებულია</translation> -<translation id="3761848338953536304">თქვენი ადმინისტრატორი ითხოვს, გამორთოთ SIM ბარათის ჩაკეტვის პარამეტრი</translation> <translation id="3765841986579723851">დღეს რედაქტირებული</translation> <translation id="3771549900096082774">მაღალკონტრასტული რეჟიმი</translation> <translation id="3773700760453577392">ადმინისტრატორმა აკრძალა მრავალჯერადი შესვლა <ph name="USER_EMAIL" />-ისთვის. გასაგრძელებლად საჭიროა ყველა მომხმარებლის გამოსვლა სისტემიდან.</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">მოწყობილობები</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, შეფასებულია <ph name="RATING_SCORE" /> ვარსკვლავით</translation> <translation id="4633185660152240791">{0,plural, =1{დააბრუნეთ მოწყობილობა წინა ვერსიაზე ერთი დღის განმავლობაში}other{დააბრუნეთ მოწყობილობა წინა ვერსიაზე # დღის განმავლობაში}}</translation> +<translation id="4633636853437260449">წასაშლელად დააჭირეთ კლავიშთა კომბინაციას Ctrl+W</translation> <translation id="4642092649622328492">ეკრანის ნაწილობრივი ანაბეჭდის გადაღება</translation> <translation id="4644727592819780893">რეგიონი ზედმეტად პატარაა კამერის მოსათავსებლად</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, აპის რეკომენდაცია</translation> @@ -857,7 +859,6 @@ <translation id="598407983968395253">შაბლონის გამოყენება</translation> <translation id="598882571027504733">განახლების ჩამოსატვირთად გადატვირთეთ თქვენი Chromebook და არ გამოართოთ კლავიატურა.</translation> <translation id="5992218262414051481">მაღალკონტრასტული რეჟიმი ჩართულია. გამოსართავად ხელახლა დააჭირეთ კლავიშთა კომბინაციას: Ctrl+Search+H.</translation> -<translation id="6009656393242168182">გათიშეთ SIM ბარათის ჩაკეტვის პარამეტრი</translation> <translation id="6012623610530968780">გვერდი <ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" />-დან</translation> <translation id="6018164090099858612">მიმდინარეობს სარკის რეჟიმიდან გამოსვლა</translation> <translation id="602001110135236999">გადაადგილება მარცხნივ</translation>
diff --git a/ash/strings/ash_strings_kk.xtb b/ash/strings/ash_strings_kk.xtb index d2a126d..c39c2ec 100644 --- a/ash/strings/ash_strings_kk.xtb +++ b/ash/strings/ash_strings_kk.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> және тағы <ph name="UNAVAILABLE_APPS_COUNT" /> қолданба бұл құрылғыда жоқ.</translation> <translation id="3735740477244556633">Сұрыптау шарты</translation> <translation id="3742055079367172538">Скриншот түсірілді</translation> -<translation id="3761848338953536304">Әкімші сізден SIM картасын құлыптау параметрін өшіруіңізді сұрап тұр.</translation> <translation id="3765841986579723851">Бүгін өзгертілді.</translation> <translation id="3771549900096082774">Жоғары контраст режимі</translation> <translation id="3773700760453577392">Әкімшінің шешімі бойынша енді <ph name="USER_EMAIL" /> электрондық поштасына бір уақытта бірнеше пайдаланушы кіре алмайды. Жалғастыру үшін пайдаланушылардың барлығы аккаунттан шығуы керек.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Қолданбалар ретін өзгерту үшін кез келген жерден басып тұрыңыз.</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> қолданбасын <ph name="IN_PLACE_APP" /> үстіне сүйреп әкеліп қойсаңыз, қалта жасалады.</translation> <translation id="5397578532367286026">Бұл пайдаланушының дерек трафигі мен тарихын chrome.com мекенжайындағы басқарушысы (<ph name="MANAGER_EMAIL" />) арқылы шолуға болады.</translation> +<translation id="5399673806694250334">Күй жолағы, уақыты: <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Жылдам параметрлер: хабарландыру орталығына кіру үшін "Іздеу" + сол жақ көрсеткі түймесін басыңыз.</translation> <translation id="5426063383988017631">Параметрлер мәзірі жабық</translation> <translation id="5428899915242071344">Таңдай бастау</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Үлгіні қолдану</translation> <translation id="598882571027504733">Жаңартылған нұсқаны алу үшін, пернетақта жалғанған күйі Chromebook ноутбугын қайта қосыңыз.</translation> <translation id="5992218262414051481">Жоғары контраст режимі қосылды. Оны өшіру үшін қайтадан Ctrl+Search+H пернелерін басыңыз.</translation> -<translation id="6009656393242168182">SIM картасын құлыптау параметрін өшіріңіз</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /> бет</translation> <translation id="6018164090099858612">Айна режимінен шығуда</translation> <translation id="602001110135236999">Солға айналдыру</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">Телефондағы соңғы фотосуреттерді, медианы және хабарландыруларды <ph name="DEVICE_TYPE" /> құрылғысында көріңіз.</translation> <translation id="619335566042889110">Енді толық зарядтаңыз.</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Бұрын <ph name="EMAIL" /> электрондық поштасына сақталған <ph name="NAME" /> құрылғысын байланыстырыңыз.</translation> <translation id="6220928844947387476">Енді бір уақытта экранды жазып, өзіңізді де бейнеге түсіре аласыз.</translation> <translation id="622484624075952240">Төмен</translation> <translation id="6231419273573514727">Перифериялық құрылғының өнімділігі шектеулі болуы мүмкін</translation>
diff --git a/ash/strings/ash_strings_km.xtb b/ash/strings/ash_strings_km.xtb index 880898e7..d5fb505 100644 --- a/ash/strings/ash_strings_km.xtb +++ b/ash/strings/ash_strings_km.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">ខ្សែអាចប៉ះពាល់ដល់ប្រតិបត្តិការ</translation> <translation id="2903844815300039659">បានភ្ជាប់ទៅ <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">រូបថតអេក្រង់</translation> +<translation id="2925246975070834767">សាកល្បងប្រើមុខងារពង្រីកដោយស្វ័យប្រវត្តិ ដើម្បីឱ្យអ្នកនឹងស្ថិតនៅកណ្តាលអេក្រង់។ បើកមុខងារនេះនៅក្នុងការកំណត់រហ័ស។</translation> <translation id="2941112035454246133">ទាប</translation> <translation id="2942350706960889382">កែវពង្រីកដាក់ខាងលើបំផុត</translation> <translation id="2942516765047364088">ទីតាំងធ្នើ</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">បានភ្ជាប់ពីមុន</translation> <translation id="371370241367527062">មីក្រូហ្វូនខាងមុខ</translation> <translation id="3713734891607377840">បើកនៅពេលបញ្ចប់</translation> +<translation id="3724279623330129812">មុខងារពង្រីកដោយស្វ័យប្រវត្តិបានដាក់រូបឱ្យនៅចំកណ្ដាលកាមេរ៉ា</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> និង <ph name="UNAVAILABLE_APPS_COUNT" /> ទៀតមិនមាននៅលើឧបករណ៍នេះទេ។</translation> <translation id="3735740477244556633">តម្រៀបតាម</translation> <translation id="3742055079367172538">រូបថតអេក្រង់ត្រូវបានថតយក</translation> -<translation id="3761848338953536304">អ្នកគ្រប់គ្រងរបស់អ្នកកំពុងស្នើឱ្យអ្នកបិទការកំណត់ការចាក់សោស៊ីម</translation> <translation id="3765841986579723851">បានកែនៅថ្ងៃនេះ</translation> <translation id="3771549900096082774">មុខងារភាពដិតកម្រិតខ្ពស់</translation> <translation id="3773700760453577392">អ្នកគ្រប់គ្រងបានដកការអនុញ្ញាតមិនឱ្យមានការចូលគណនីច្រើនសម្រាប់ <ph name="USER_EMAIL" /> ទេ។ អ្នកប្រើប្រាស់ទាំងអស់ត្រូវចាកចេញដើម្បីបន្ត។</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">ឧបករណ៍</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, ការវាយតម្លៃដោយដាក់ផ្កាយ <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{ប្ដូរកំណែឧបករណ៍ទៅកំណែមុនក្នុងរយៈពេលមួយថ្ងៃ}other{ប្ដូរកំណែឧបករណ៍ទៅកំណែមុនក្នុងរយៈពេល # ថ្ងៃ}}</translation> +<translation id="4633636853437260449">ចុច Ctrl+W ដើម្បីលុប</translation> <translation id="4642092649622328492">ថតរូបអេក្រង់មួយផ្នែក</translation> <translation id="4644727592819780893">តំបន់តូចពេក មិនអាចមើលសាកល្បងលើកាមេរ៉ាបានទេ</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, ការណែនាំកម្មវិធី</translation> @@ -867,7 +869,6 @@ <translation id="598407983968395253">ប្រើទម្រង់គំរូ</translation> <translation id="598882571027504733">ដើម្បីទទួលបានកំណែថ្មី សូមចាប់ផ្តើម Chromebook របស់អ្នកឡើងវិញដោយប្រើក្តារចុចដែលភ្ជាប់មកជាមួយ។</translation> <translation id="5992218262414051481">បានបើកមុខងារកម្រិតពណ៌ខ្ពស់។ សូមចុច Ctrl+Search+H ម្តងទៀតដើម្បីបិទវា។</translation> -<translation id="6009656393242168182">បិទការកំណត់ការចាក់សោស៊ីមរបស់អ្នក</translation> <translation id="6012623610530968780">ទំព័រ <ph name="SELECTED_PAGE" /> នៃ <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">កំពុងចាកចេញពីមុខងារឆ្លុះ</translation> <translation id="602001110135236999">រំកិលទៅឆ្វេង</translation> @@ -907,6 +908,7 @@ <translation id="619279033188484792">មើលរូបថត មេឌៀ និងការជូនដំណឹងថ្មីៗរបស់ទូរសព្ទអ្នកនៅលើ <ph name="DEVICE_TYPE" /> របស់អ្នក</translation> <translation id="619335566042889110">ឥឡូវសាកថ្មពេញហើយ</translation> <translation id="6193431488227440296">អ្នកអភិវឌ្ឍន៍</translation> +<translation id="6210042900243040400">ភ្ជាប់ <ph name="NAME" /> ដែលបានរក្សាទុកពីមុនទៅ <ph name="EMAIL" /></translation> <translation id="6220928844947387476">ឥឡូវនេះអ្នកអាចថតខ្លួនអ្នក និងអេក្រង់របស់អ្នកក្នុងពេលតែមួយបាន</translation> <translation id="622484624075952240">ចុះក្រោម</translation> <translation id="6231419273573514727">ប្រតិបត្តិការរបស់ឧបករណ៍សម្រាប់ភ្ជាប់ជាមួយកុំព្យូទ័រអាចមានកម្រិត</translation>
diff --git a/ash/strings/ash_strings_kn.xtb b/ash/strings/ash_strings_kn.xtb index 4ed1cd0..33960fa 100644 --- a/ash/strings/ash_strings_kn.xtb +++ b/ash/strings/ash_strings_kn.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">ಈ ಸಾಧನದಲ್ಲಿ <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ಮತ್ತು ಇನ್ನೂ <ph name="UNAVAILABLE_APPS_COUNT" /> ಆ್ಯಪ್ಗಳು ಲಭ್ಯವಿಲ್ಲ.</translation> <translation id="3735740477244556633">ಈ ಪ್ರಕಾರ ವಿಂಗಡಿಸಿ</translation> <translation id="3742055079367172538">ಸ್ಕ್ರಿನ್ಶಾಟ್ ತೆಗೆದುಕೊಳ್ಳಲಾಗಿದೆ</translation> -<translation id="3761848338953536304">ಲಾಕ್ SIM ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ಆಫ್ ಮಾಡಲು ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ವಿನಂತಿಸುತ್ತಿದ್ದಾರೆ</translation> <translation id="3765841986579723851">ಇಂದು ಎಡಿಟ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="3771549900096082774">ಉನ್ನತ ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> ಗೆ ಬಹು ಸೈನ್-ಇನ್ ಅನುಮತಿಯನ್ನು ನಿರ್ವಾಹಕರು ರದ್ದುಗೊಳಿಸಿದ್ದಾರೆ. ಮುಂದುವರಿಯಲು ಎಲ್ಲ ಬಳಕೆದಾರರು ಸೈನ್ ಔಟ್ ಮಾಡಬೇಕು.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">ನಿಮ್ಮ ಆ್ಯಪ್ಗಳನ್ನು ಮರುಕ್ರಮಗೊಳಿಸಲು ಎಲ್ಲಿಯಾದರೂ ಸ್ಪರ್ಶಿಸಿ ಮತ್ತು ಹಿಡಿದುಕೊಳ್ಳಿ</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" /> ನ ಮೇಲ್ಭಾಗದಲ್ಲಿ <ph name="DRAGGED_APP_NAME" />, ಫೋಲ್ಡರ್ ರಚಿಸಲು ಬಿಡುಗಡೆ ಮಾಡಿ.</translation> <translation id="5397578532367286026">ಈ ಬಳಕೆದಾರರ ಬಳಕೆ ಮತ್ತು ಇತಿಹಾಸವನ್ನು chrome.com ನಲ್ಲಿ ನಿರ್ವಾಹಕರು (<ph name="MANAGER_EMAIL" />) ಪರಿಶೀಲಿಸಬಹುದು.</translation> +<translation id="5399673806694250334">ಸ್ಥಿತಿ ಟ್ರೇ, ಸಮಯ <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">ತ್ವರಿತ ಸೆಟ್ಟಿಂಗ್ಗಳು, ಅಧಿಸೂಚನೆ ಕೇಂದ್ರಕ್ಕೆ ಪ್ರವೇಶಿಸಲು ಹುಡುಕಾಟ + ಎಡಕ್ಕೆ ಬಾಣದ ಗುರುತನ್ನು ಒತ್ತಿರಿ.</translation> <translation id="5426063383988017631">ಸೆಟ್ಟಿಂಗ್ಗಳ ಮೆನುವನ್ನು ಮುಚ್ಚಲಾಗಿದೆ</translation> <translation id="5428899915242071344">ಆಯ್ಕೆಮಾಡುವುದನ್ನು ಪ್ರಾರಂಭಿಸಿ</translation> @@ -858,7 +867,6 @@ <translation id="598882571027504733">ಅಪ್ಡೇಟ್ ಪಡೆಯಲು, ಕೀಬೋರ್ಡ್ ಲಗತ್ತಿನೊಂದಿಗೆ ನಿಮ್ಮ Chromebook ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ.</translation> <translation id="5992218262414051481">ಹೆಚ್ಚು ಕಾಂಟ್ರಾಸ್ಟ್ ಮೋಡ್ ಅನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಅದನ್ನು ಟಾಗಲ್ ಆಫ್ ಮಾಡಲು ಪುನಃ Ctrl+ಹುಡುಕಾಟ+H ಅನ್ನು ಒತ್ತಿರಿ.</translation> -<translation id="6009656393242168182">ನಿಮ್ಮ SIM ಲಾಕ್ ಸೆಟ್ಟಿಂಗ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿ</translation> <translation id="6012623610530968780">ಪುಟ <ph name="SELECTED_PAGE" /> ರಲ್ಲಿ <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">ಪ್ರತಿಬಿಂಬ ಮೋಡ್ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ</translation> <translation id="602001110135236999">ಎಡಕ್ಕೆ ಸ್ಕ್ರಾಲ್ ಮಾಡಿ</translation>
diff --git a/ash/strings/ash_strings_ko.xtb b/ash/strings/ash_strings_ko.xtb index f8e61e98e..c572dd7 100644 --- a/ash/strings/ash_strings_ko.xtb +++ b/ash/strings/ash_strings_ko.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">이 기기에 <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> 외 앱 <ph name="UNAVAILABLE_APPS_COUNT" />개가 없습니다.</translation> <translation id="3735740477244556633">정렬 기준</translation> <translation id="3742055079367172538">찍은 스크린샷</translation> -<translation id="3761848338953536304">관리자가 SIM 잠금 설정을 사용 중지하도록 요청합니다.</translation> <translation id="3765841986579723851">오늘 수정됨</translation> <translation id="3771549900096082774">고대비 모드</translation> <translation id="3773700760453577392">관리자가 <ph name="USER_EMAIL" />의 멀티 로그인을 허용하지 않습니다. 계속하려면 모든 사용자가 로그아웃해야 합니다.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">앱을 재정렬하려면 아무 곳이나 길게 터치합니다</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" />을(를) <ph name="IN_PLACE_APP" /> 위로 드래그해서 놓으면 폴더가 만들어집니다.</translation> <translation id="5397578532367286026">관리자(<ph name="MANAGER_EMAIL" />)는 chrome.com에서 해당 사용자의 사용 및 방문 기록을 검토할 수 있습니다.</translation> +<translation id="5399673806694250334">상태 표시줄, 시간 <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">빠른 설정, 검색 + 왼쪽 키를 눌러 알림 센터에 액세스하세요.</translation> <translation id="5426063383988017631">설정 메뉴 닫힘</translation> <translation id="5428899915242071344">선택 시작</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">템플릿 사용</translation> <translation id="598882571027504733">업데이트하려면 키보드가 연결된 상태로 Chromebook을 다시 시작하세요.</translation> <translation id="5992218262414051481">고대비 모드가 사용 설정되었습니다. 사용 중지하려면 다시 Ctrl+Search+H를 누르세요.</translation> -<translation id="6009656393242168182">SIM 잠금 설정 사용 중지</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" />페이지</translation> <translation id="6018164090099858612">미러링 모드 종료 중</translation> <translation id="602001110135236999">왼쪽으로 스크롤</translation>
diff --git a/ash/strings/ash_strings_ky.xtb b/ash/strings/ash_strings_ky.xtb index 6d02947..dfc1a87 100644 --- a/ash/strings/ash_strings_ky.xtb +++ b/ash/strings/ash_strings_ky.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> жана дагы<ph name="UNAVAILABLE_APPS_COUNT" /> колдонмо бул түзмөктө жок.</translation> <translation id="3735740477244556633">Төмөнкү боюнча иргөө</translation> <translation id="3742055079367172538">Скриншот тартылды</translation> -<translation id="3761848338953536304">Администраторуңуз SIM-картанын кулпусунун параметрин өчүрүүнү суранып жатат</translation> <translation id="3765841986579723851">Бүгүн түзөтүлдү</translation> <translation id="3771549900096082774">Жогорку контраст режими</translation> <translation id="3773700760453577392">Администратор <ph name="USER_EMAIL" /> дарегине бир убакта бир нече колдонуучуга кирүүгө тыюу салды. Улантуу үчүн бардык колдонуучулар чыгышы керек.</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">Үлгүнү колдонуу</translation> <translation id="598882571027504733">Жаңыртуу үчүн, туташкан баскычтопту үзбөй туруп, Chromebook'ту өчүрүп-күйгүзүңүз.</translation> <translation id="5992218262414051481">Жогорку контраст режими иштетилди. Аны өчүрүү үчүн Ctrl+Search+H баскычтарын кайра басыңыз.</translation> -<translation id="6009656393242168182">SIM-картанын кулпусунун параметрин өчүрүү</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> барактын ичинен <ph name="SELECTED_PAGE" /> барак</translation> <translation id="6018164090099858612">Күзгү режиминен чыгууда</translation> <translation id="602001110135236999">Солго сыдыруу</translation> @@ -907,6 +905,7 @@ <translation id="619279033188484792">Телефонуңуздагы соңку сүрөттөрдү, медиа файлдарды жана билдирмелерди <ph name="DEVICE_TYPE" /> түзмөгүңүздөн көрөсүз</translation> <translation id="619335566042889110">Азыр толук кубаттоо</translation> <translation id="6193431488227440296">Иштеп чыгуучу</translation> +<translation id="6210042900243040400">Буга чейин <ph name="EMAIL" /> аккаунтуна сакталган <ph name="NAME" /> түзмөгүн туташтырыңыз</translation> <translation id="6220928844947387476">Эми бир эле убакта өзүңүздү жана экранды жаздыра аласыз</translation> <translation id="622484624075952240">Төмөн</translation> <translation id="6231419273573514727">Перифериялык жөндөөлөр чектелиши мүмкүн</translation>
diff --git a/ash/strings/ash_strings_lo.xtb b/ash/strings/ash_strings_lo.xtb index da10d5f..f0b6816 100644 --- a/ash/strings/ash_strings_lo.xtb +++ b/ash/strings/ash_strings_lo.xtb
@@ -473,7 +473,6 @@ <translation id="3726171378575546917">ບໍ່ມີ <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ແລະ ອີກ <ph name="UNAVAILABLE_APPS_COUNT" /> ແອັບຢູ່ອຸປະກອນນີ້.</translation> <translation id="3735740477244556633">ຈັດຮຽງຕາມ</translation> <translation id="3742055079367172538">ຖ່າຍຮູບໜ້າຈໍແລ້ວ</translation> -<translation id="3761848338953536304">ຜູ້ເບິ່ງແຍງລະບົບຮ້ອງຂໍໃຫ້ທ່ານປິດການຕັ້ງຄ່າການລັອກຊິມ</translation> <translation id="3765841986579723851">ແກ້ໄຂມື້ນີ້</translation> <translation id="3771549900096082774">ໂໝດສີຕັດກັນສູງ</translation> <translation id="3773700760453577392">ຜູ້ເບິ່ງແຍງລະບົບໄດ້ເຊົາອະນຸຍາດການເຂົ້າສູ່ລະບົບແບບຫຼາຍບັນຊີສໍາລັບ <ph name="USER_EMAIL" /> ແລ້ວ. ຜູ້ໃຊ້ທັງໝົດຕ້ອງອອກຈາກລະບົບເພື່ອສືບຕໍ່.</translation> @@ -869,7 +868,6 @@ <translation id="598407983968395253">ໃຊ້ແມ່ແບບ</translation> <translation id="598882571027504733">ເພື່ອຮັບເອົາການອັບເດດ, ກະລຸນາປິດເປີດ Chromebook ຂອງທ່ານຄືນໃໝ່ທີ່ມີແປ້ນພິມເຊື່ອມຕໍ່ແລ້ວ.</translation> <translation id="5992218262414051481">ເປີດນຳໃຊ້ໂໝດສີຕັດສູງແລ້ວ. ກົດ Ctrl+Search+H ອີກຄັ້ງເພື່ອປິດມັນ.</translation> -<translation id="6009656393242168182">ປິດການນຳໃຊ້ການຕັ້ງຄ່າການລັອກຊິມຂອງທ່ານ</translation> <translation id="6012623610530968780">ໜ້າທີ <ph name="SELECTED_PAGE" /> ຈາກທັງໝົດ <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">ກຳລັງອອກຈາກໂໝດແວ່ນສະທ້ອນ</translation> <translation id="602001110135236999">ເລື່ອນໄປຊ້າຍ</translation>
diff --git a/ash/strings/ash_strings_lt.xtb b/ash/strings/ash_strings_lt.xtb index 3ea1b2b6..021037cb 100644 --- a/ash/strings/ash_strings_lt.xtb +++ b/ash/strings/ash_strings_lt.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">Šiame įrenginyje nėra „<ph name="UNAVAILABLE_APPS_ONE" />“, „<ph name="UNAVAILABLE_APPS_TWO" />“ ir dar <ph name="UNAVAILABLE_APPS_COUNT" /> program.</translation> <translation id="3735740477244556633">Rūšiuoti pagal</translation> <translation id="3742055079367172538">Ekrano kopija padaryta</translation> -<translation id="3761848338953536304">Administratorius prašo jūsų išjungti SIM užrakto nustatymą</translation> <translation id="3765841986579723851">Redaguota šiandien</translation> <translation id="3771549900096082774">Didelio kontrasto režimas</translation> <translation id="3773700760453577392">Administratorius neleido <ph name="USER_EMAIL" /> prisijungti prie kelių paskyrų. Norėdami tęsti, visi naudotojai turi atsijungti.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Norėdami pertvarkyti programas, palieskite ir palaikykite bet kur</translation> <translation id="5395308026110844773">„<ph name="DRAGGED_APP_NAME" />“ ant „<ph name="IN_PLACE_APP" />“, paleiskite, kad sukurtumėte aplanką.</translation> <translation id="5397578532367286026">Šio naudotojo naudojimo duomenis ir istoriją valdytojas (<ph name="MANAGER_EMAIL" />) gali peržiūrėti adresu chrome.com.</translation> +<translation id="5399673806694250334">Būsenos dėklas, laikas <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Spartieji nustatymai: paspauskite „Ieškoti“ ir rodyklę kairėn, kad pasiektumėte pranešimų centrą.</translation> <translation id="5426063383988017631">Nustatymų meniu uždarytas</translation> <translation id="5428899915242071344">Pradėti rinktis</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Naudoti šabloną</translation> <translation id="598882571027504733">Kad gautumėte naujinį, iš naujo paleiskite „Chromebook“ su prijungta klaviatūra.</translation> <translation id="5992218262414051481">Didelio kontrasto režimas įgalintas. Dar kartą paspauskite „Ctrl“ + paieškos klavišą + H, kad išjungtumėte režimą.</translation> -<translation id="6009656393242168182">Išjunkite SIM užrakto nustatymą</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" /> psl. iš <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Išjungiamas atvaizdavimo režimas</translation> <translation id="602001110135236999">Slinkti kairėn</translation>
diff --git a/ash/strings/ash_strings_lv.xtb b/ash/strings/ash_strings_lv.xtb index 853642e8..d76f20d3 100644 --- a/ash/strings/ash_strings_lv.xtb +++ b/ash/strings/ash_strings_lv.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">Šajā ierīcē nav lietotņu <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> un vēl <ph name="UNAVAILABLE_APPS_COUNT" /> lietotnes(-ņu).</translation> <translation id="3735740477244556633">Kārtot pēc</translation> <translation id="3742055079367172538">Ekrānuzņēmums ir uzņemts</translation> -<translation id="3761848338953536304">Jūsu administrators pieprasa, lai jūs izslēgtu SIM bloķēšanas iestatījumu.</translation> <translation id="3765841986579723851">Rediģēts šodien</translation> <translation id="3771549900096082774">Augsta kontrasta režīms</translation> <translation id="3773700760453577392">Administrators ir aizliedzis lietotājam <ph name="USER_EMAIL" /> vairākkārtēju pierakstīšanos. Lai turpinātu, visiem lietotājiem ir jāizrakstās.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Pieskarieties jebkurā vietā un turiet, lai pārkārtotu lietotnes</translation> <translation id="5395308026110844773">Lietotne <ph name="DRAGGED_APP_NAME" /> tiek vilkta <ph name="IN_PLACE_APP" /> lietotnes vietā, atlaidiet, lai izveidotu mapi.</translation> <translation id="5397578532367286026">Šī lietotāja datu lietojumu un vēsturi var pārvaldīt pārzinis (<ph name="MANAGER_EMAIL" />) vietnē chrome.com.</translation> +<translation id="5399673806694250334">Statusa josla, plkst. <ph name="TIME" />. + <ph name="BATTERY" /> + <ph name="CHANNEL" />. + <ph name="NETWORK" /> + <ph name="MIC" />. + <ph name="CAMERA" />. + <ph name="MANAGED" />. + <ph name="NOTIFICATION" />. + <ph name="IME" />. + <ph name="LOCALE" />.</translation> <translation id="5400461572260843123">Ātrie iestatījumi: vienlaikus nospiediet meklēšanas taustiņu un kreiso bulttaustiņu, lai atvērtu paziņojumu centru.</translation> <translation id="5426063383988017631">Iestatījumu izvēlne aizvērta</translation> <translation id="5428899915242071344">Sākt atlasīšanu</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Izmantot veidni</translation> <translation id="598882571027504733">Lai iegūtu atjauninājumu, restartējiet savu Chromebook datoru ar pievienoto tastatūru.</translation> <translation id="5992218262414051481">Augsta kontrasta režīms ir iespējots. Lai to izslēgtu, vēlreiz nospiediet Ctrl+Search+H.</translation> -<translation id="6009656393242168182">Atspējojiet savu SIM bloķēšanas iestatījumu</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. lapa no <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Notiek iziešana no spoguļošanas režīma</translation> <translation id="602001110135236999">Ritināt pa kreisi</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">Skatiet tālruņa jaunākos fotoattēlus, multivides saturu un paziņojumus savā ierīcē (<ph name="DEVICE_TYPE" />).</translation> <translation id="619335566042889110">Pilnībā uzlādēt</translation> <translation id="6193431488227440296">Izstrāde</translation> +<translation id="6210042900243040400">Savienojums ar ierīci <ph name="NAME" /> iepriekš saglabāts kontā <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Tagad varat ierakstīt gan savu video, gan savu ekrānu vienlaikus.</translation> <translation id="622484624075952240">Lejup</translation> <translation id="6231419273573514727">Perifēro ierīču veiktspēja var būt ierobežota</translation>
diff --git a/ash/strings/ash_strings_mk.xtb b/ash/strings/ash_strings_mk.xtb index 9e05e7dc..4b609fe 100644 --- a/ash/strings/ash_strings_mk.xtb +++ b/ash/strings/ash_strings_mk.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">Кабелот може да влијае врз изведбата</translation> <translation id="2903844815300039659">Поврзано со <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Слики од екранот</translation> +<translation id="2925246975070834767">Пробајте автоматско зумирање за да бидете во средината на екранот. Вклучете го во „Брзи поставки“.</translation> <translation id="2941112035454246133">Низок</translation> <translation id="2942350706960889382">Закотвена лупа</translation> <translation id="2942516765047364088">Позиција на полица</translation> @@ -473,7 +474,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и уште <ph name="UNAVAILABLE_APPS_COUNT" /> не се на уредов.</translation> <translation id="3735740477244556633">Подреди по</translation> <translation id="3742055079367172538">Направена е слика од екранот</translation> -<translation id="3761848338953536304">Администраторот бара да ја исклучите поставката за заклучување SIM-картичка</translation> <translation id="3765841986579723851">Изменето денес</translation> <translation id="3771549900096082774">Режим на голем контраст</translation> <translation id="3773700760453577392">Администраторот оневозможил повеќекратно најавување за <ph name="USER_EMAIL" />. @@ -636,6 +636,7 @@ <translation id="4628757576491864469">Уреди</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, оцена со ѕвезди: <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Променете го уредот на претходната верзија во рок од еден ден}one{Променете го уредот на претходната верзија во рок од # ден}other{Променете го уредот на претходната верзија во рок од # дена}}</translation> +<translation id="4633636853437260449">Притиснете Ctrl+W за да избришете</translation> <translation id="4642092649622328492">Снимете делумна слика од екранот</translation> <translation id="4644727592819780893">Регионот е премал за да се прикаже преглед на камерата</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, препорачана апликација</translation> @@ -869,7 +870,6 @@ <translation id="598407983968395253">Употреби го шаблонот</translation> <translation id="598882571027504733">За да го добиете ажурирањето, рестартирајте го Chromebook додека тастатурата е прикачена.</translation> <translation id="5992218262414051481">Режимот на висок контраст е овозможен. Притиснете „Ctrl+Пребарување+H“ повторно за да го исклучите.</translation> -<translation id="6009656393242168182">Оневозможете ја поставката за заклучување SIM-картичка</translation> <translation id="6012623610530968780">Страница <ph name="SELECTED_PAGE" /> од <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Се излегува од режим на огледало</translation> <translation id="602001110135236999">Лизгај налево</translation>
diff --git a/ash/strings/ash_strings_ml.xtb b/ash/strings/ash_strings_ml.xtb index 81af04c..2af914e 100644 --- a/ash/strings/ash_strings_ml.xtb +++ b/ash/strings/ash_strings_ml.xtb
@@ -473,7 +473,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> എന്നിവയും മറ്റ് <ph name="UNAVAILABLE_APPS_COUNT" /> എണ്ണവും ഈ ഉപകരണത്തിൽ ലഭ്യമല്ല.</translation> <translation id="3735740477244556633">ഇപ്രകാരം അടുക്കുക</translation> <translation id="3742055079367172538">സ്ക്രീൻഷോട്ട് എടുത്തു</translation> -<translation id="3761848338953536304">സിം കാർഡ് ലോക്ക് ചെയ്യുക ക്രമീകരണം ഓഫാക്കാൻ നിങ്ങളുടെ അഡ്മിൻ അഭ്യർത്ഥിക്കുന്നു</translation> <translation id="3765841986579723851">ഇന്ന് എഡിറ്റ് ചെയ്തത്</translation> <translation id="3771549900096082774">ഉയർന്ന ദൃശ്യതീവ്രതാ മോഡ്</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> എന്ന ഇമെയിലിലേക്ക് ഒന്നിലധികം പേർ സൈൻ ഇൻ ചെയ്യുന്നത് ഒരു അഡ്മിനിസ്ട്രേറ്റർ വിലക്കിയിരിക്കുന്നു. തുടരാൻ, എല്ലാ ഉപയോക്താക്കളും സൈൻ ഔട്ട് ചെയ്യണം.</translation> @@ -868,7 +867,6 @@ <translation id="598407983968395253">ടെംപ്ലേറ്റ് ഉപയോഗിക്കുക</translation> <translation id="598882571027504733">അപ്ഡേറ്റ് നേടാൻ, അറ്റാച്ച് ചെയ്ത കീബോഡിനൊപ്പം Chromebook റീസ്റ്റാർട്ട് ചെയ്യുക.</translation> <translation id="5992218262414051481">ഉയർന്ന ദൃശ്യതീവ്രത മോഡ് പ്രവർത്തനക്ഷമമാക്കി. ഇത് ഓഫാക്കാൻ, Ctrl+തിരയൽ+H വീണ്ടും അമർത്തുക.</translation> -<translation id="6009656393242168182">നിങ്ങളുടെ സിം ലോക്ക് ക്രമീകരണം പ്രവർത്തനരഹിതമാക്കുക</translation> <translation id="6012623610530968780">പേജ് <ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">മിറർ മോഡിൽ നിന്ന് പുറത്തുകടക്കുന്നു</translation> <translation id="602001110135236999">ഇടത്തോട്ട് സ്ക്രോൾ ചെയ്യുക</translation>
diff --git a/ash/strings/ash_strings_mn.xtb b/ash/strings/ash_strings_mn.xtb index f2a79a4..5f6e2a4 100644 --- a/ash/strings/ash_strings_mn.xtb +++ b/ash/strings/ash_strings_mn.xtb
@@ -470,10 +470,10 @@ <translation id="3708186454126126312">Өмнө нь холбогдсон</translation> <translation id="371370241367527062">Урд талын микрофон</translation> <translation id="3713734891607377840">Дуусах үед нээх</translation> +<translation id="3724279623330129812">Автомат томруулалтыг камерын төвд байрлуулсан</translation> <translation id="3726171378575546917">Энэ төхөөрөмж дээр <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> болон өөр <ph name="UNAVAILABLE_APPS_COUNT" /> апп байхгүй байна.</translation> <translation id="3735740477244556633">Дараахаар эрэмбэлэх</translation> <translation id="3742055079367172538">Дэлгэцний зургийг авсан болно (Screenshot)</translation> -<translation id="3761848338953536304">Танай администратор таныг SIM түгжих тохиргоог унтраахыг хүсэж байна</translation> <translation id="3765841986579723851">Өнөөдөр зассан</translation> <translation id="3771549900096082774">Өндөр ялгаралтай горим</translation> <translation id="3773700760453577392">Админ <ph name="USER_EMAIL" />-д олон зэрэг нэвтрэхийг зөвшөөрөөгүй байна. @@ -870,7 +870,6 @@ <translation id="598407983968395253">Загварыг ашиглах</translation> <translation id="598882571027504733">Шинэчлэлт авахын тулд Chromebook-ээ хавсаргасан гараар шинэчилнэ үү.</translation> <translation id="5992218262414051481">Өндөр ялгаралтай горимыг идэвхжүүлсэн. Үүнийг унтраахын тулд Ctrl+Search+H-г дахин дарна уу.</translation> -<translation id="6009656393242168182">SIM-н түгжээний тохиргоогоо идэвхгүй болгох</translation> <translation id="6012623610530968780">Хуудас <ph name="TOTAL_PAGE_NUM" />-н <ph name="SELECTED_PAGE" /></translation> <translation id="6018164090099858612">Толь горимоос гарч байна</translation> <translation id="602001110135236999">Зүүн тийш гүйлгэх</translation>
diff --git a/ash/strings/ash_strings_mr.xtb b/ash/strings/ash_strings_mr.xtb index 4160a85..2fce1b21 100644 --- a/ash/strings/ash_strings_mr.xtb +++ b/ash/strings/ash_strings_mr.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">कॅमेरा</translation> <translation id="1632985212731562677">सेटिंग्ज > अॅक्सेसिबिलिटी मध्ये स्विच अॅक्सेस बंद केले जाऊ शकते.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> डिव्हाइस</translation> -<translation id="1639239467298939599">लोड करीत आहे</translation> +<translation id="1639239467298939599">लोड करत आहे</translation> <translation id="1654477262762802994">व्हॉइस क्वेरी सुरू करा</translation> <translation id="1668469839109562275">बिल्ट-इन VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> शिल्लक</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> आणि<ph name="UNAVAILABLE_APPS_COUNT" /> ही ॲप्स या डिव्हाइसवर उपलब्ध नाहीत.</translation> <translation id="3735740477244556633">यानुसार क्रमाने लावा</translation> <translation id="3742055079367172538">स्क्रीनशॉट घेतला</translation> -<translation id="3761848338953536304">तुमच्या अॅडमिनिस्ट्रेटरने तुम्हाला लॉक सिम सेटिंग बंद करण्याची विनंती केली आहे</translation> <translation id="3765841986579723851">आज संपादित केलेली</translation> <translation id="3771549900096082774">उच्च कॉन्ट्रास्ट मोड</translation> <translation id="3773700760453577392">ॲडमिनिस्ट्रेटरने <ph name="USER_EMAIL" /> साठी एकाहून अधिक साइन-इन बंद केले आहे. सुरू ठेवण्यासाठी सर्व वापरकर्त्यांनी साइन आउट करणे आवश्यक आहे.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">टेंप्लेट वापरा</translation> <translation id="598882571027504733">अपडेट करण्यासाठी, संलग्न केलेल्या कीबोर्डसह तुमचे Chromebook रीस्टार्ट करा.</translation> <translation id="5992218262414051481">उच्च तीव्रता मोड सुरू केला आहे. तो बंदवर टॉगल करण्यासाठी Ctrl+Search+H दाबा.</translation> -<translation id="6009656393242168182">तुमची सिम लॉक सेटिंग बंद करा</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> पैकी <ph name="SELECTED_PAGE" /> पेज</translation> <translation id="6018164090099858612">मिरर मोडमधून बाहेर पडत आहे</translation> <translation id="602001110135236999">डावीकडे स्क्रोल करा</translation>
diff --git a/ash/strings/ash_strings_ms.xtb b/ash/strings/ash_strings_ms.xtb index b028ceb..77a8766 100644 --- a/ash/strings/ash_strings_ms.xtb +++ b/ash/strings/ash_strings_ms.xtb
@@ -470,10 +470,10 @@ <translation id="3708186454126126312">Disambungkan sebelum ini</translation> <translation id="371370241367527062">Mikrofon depan</translation> <translation id="3713734891607377840">Buka apabila sudah selesai</translation> +<translation id="3724279623330129812">Autozum memusatkan kamera</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> dan <ph name="UNAVAILABLE_APPS_COUNT" /> lagi tidak tersedia pada peranti ini.</translation> <translation id="3735740477244556633">Isih mengikut</translation> <translation id="3742055079367172538">Tangkapan skrin diambil</translation> -<translation id="3761848338953536304">Pentadbir anda meminta agar anda mematikan tetapan Kunci SIM</translation> <translation id="3765841986579723851">Diedit hari ini</translation> <translation id="3771549900096082774">Mod Kontras Tinggi</translation> <translation id="3773700760453577392">Pentadbir tidak membenarkan log masuk berbilang untuk <ph name="USER_EMAIL" />. @@ -762,6 +762,16 @@ <translation id="5393156353051693207">Sentuh & tahan di mana-mana untuk menyusun semula apl anda</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> ke atas <ph name="IN_PLACE_APP" />, lepaskan untuk membuat folder.</translation> <translation id="5397578532367286026">Penggunaan dan sejarah pengguna ini boleh disemak oleh pengurus (<ph name="MANAGER_EMAIL" />) di chrome.com.</translation> +<translation id="5399673806694250334">Dulang status, masa <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Tetapan Pantas, Tekan cari + kiri untuk mengakses pusat pemberitahuan.</translation> <translation id="5426063383988017631">Menu tetapan ditutup</translation> <translation id="5428899915242071344">Mula memilih</translation> @@ -860,7 +870,6 @@ <translation id="598407983968395253">Gunakan templat</translation> <translation id="598882571027504733">Untuk mendapatkan kemas kini, mulakan semula Chromebook dengan papan kekunci yang dipasang.</translation> <translation id="5992218262414051481">Mod Kontras Tinggi didayakan. Tekan Ctrl+Cari+H semula untuk mematikannya.</translation> -<translation id="6009656393242168182">Lumpuhkan tetapan Kunci SIM anda</translation> <translation id="6012623610530968780">Halaman <ph name="SELECTED_PAGE" /> daripada <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Keluar daripada mod cermin</translation> <translation id="602001110135236999">Tatal ke kiri</translation>
diff --git a/ash/strings/ash_strings_my.xtb b/ash/strings/ash_strings_my.xtb index 818d5d7..62b5e3b3 100644 --- a/ash/strings/ash_strings_my.xtb +++ b/ash/strings/ash_strings_my.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">ယခင် ချိတ်ဆက်ထားသည်များ</translation> <translation id="371370241367527062">အရှေ့မိုက်ခရိုဖုန်း</translation> <translation id="3713734891607377840">ပြီးသွားပါက ဖွင့်မည်</translation> +<translation id="3724279623330129812">အလိုအလျောက် ဇူးမ်ဆွဲခြင်းက ကင်မရာကို အလယ်တည့်တည့်တွင် ထားသည်</translation> <translation id="3726171378575546917">ဤစက်တွင် <ph name="UNAVAILABLE_APPS_ONE" />၊<ph name="UNAVAILABLE_APPS_TWO" /> နှင့် အခြားအက်ပ်<ph name="UNAVAILABLE_APPS_COUNT" /> ခု မရှိပါ။</translation> <translation id="3735740477244556633">အောက်ပါအတိုင်းစီရန်</translation> <translation id="3742055079367172538">မျက်နှာပြင်ပုံရိပ် ရယူပြီး</translation> -<translation id="3761848338953536304">သင့်စီမံခန့်ခွဲသူက ‘ဆင်းမ်လော့ခ်’ ဆက်တင်ကို ပိတ်ရန် တောင်းဆိုနေသည်</translation> <translation id="3765841986579723851">ယနေ့ ပြင်ဆင်ထားသည်</translation> <translation id="3771549900096082774">အဖြူအမဲခြားနားချက် မြင့်သောမုဒ်</translation> <translation id="3773700760453577392">စီမံခန့်ခွဲသူသည် <ph name="USER_EMAIL" /> အတွက် အကောင့်များစွာ လက်မှတ်ထိုးဝင်ခွင့်ကို ပိတ်ထားသည်။ ရှေ့ဆက်နိုင်ရန်အတွက် အသုံးပြုသူများအားလုံး ထွက်ရပါမည်။</translation> @@ -867,7 +867,6 @@ <translation id="598407983968395253">နမူနာပုံစံ သုံးရန်</translation> <translation id="598882571027504733">အပ်ဒိတ်ရယူနိုင်ရန်အတွက် ကီးဘုတ်ကို ချိတ်ဆက်ထားပြီး Chromebook ကို ပြန်လည်စတင်ပါ။</translation> <translation id="5992218262414051481">ခြားနားမှုမြင့်သည့်မုဒ်ကို ဖွင့်ထားပါသည်။ ၎င်းကို ပိတ်ရန် Ctrl+Search+H ကို ထပ်မံနှိပ်ပါ။</translation> -<translation id="6009656393242168182">သင့် ‘ဆင်းမ်လော့ခ်’ ဆက်တင်ကို ပိတ်ခြင်း</translation> <translation id="6012623610530968780">စာမျက်နှာ <ph name="TOTAL_PAGE_NUM" /> အနက် <ph name="SELECTED_PAGE" /></translation> <translation id="6018164090099858612">ကြေးမုံရိပ်မုဒ်မှ ထွက်နေသည်</translation> <translation id="602001110135236999">ဘယ်သို့ လှိမ့်ရန်</translation>
diff --git a/ash/strings/ash_strings_ne.xtb b/ash/strings/ash_strings_ne.xtb index b0e7b7e..55cb356 100644 --- a/ash/strings/ash_strings_ne.xtb +++ b/ash/strings/ash_strings_ne.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">यो डिभाइसमा <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> र <ph name="UNAVAILABLE_APPS_COUNT" /> उपलब्ध छैनन्।</translation> <translation id="3735740477244556633">यसअनुसार क्रमबद्ध गर्नुहोस्</translation> <translation id="3742055079367172538">स्क्रिनसट लिइयो</translation> -<translation id="3761848338953536304">तपाईंका एड्मिन तपाईंलाई SIM लकसम्बन्धी सेटिङ अफ गर्न अनुरोध गरिरहनुभएको छ</translation> <translation id="3765841986579723851">आज सम्पादन गरिएको</translation> <translation id="3771549900096082774">उच्च कन्ट्रास्ट मोड</translation> <translation id="3773700760453577392">कुनै प्रशासकले <ph name="USER_EMAIL" /> बाट एकभन्दा बढी साइन इन गर्ने अनुमति दिनुभएको छैन। जारी राख्न सबै प्रयोगकर्ताहरूले अनिवार्य रूपमा साइन आउट गर्नु पर्छ।</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">टेम्प्लेट प्रयोग गर्नुहोस्</translation> <translation id="598882571027504733">अद्यावधिक प्राप्त गर्न, उक्त किबोर्ड जोडिएकै अवस्थामा आफ्नो Chromebook पुनः सुरु गर्नुहोस्।</translation> <translation id="5992218262414051481">उच्च कन्ट्रास्ट मोड सक्षम गरिएको छ। यसलाई टगल गर्दै निष्क्रिय पार्न फेरि Ctrl+Search+H थिच्नुहोस्।</translation> -<translation id="6009656393242168182">आफ्नो SIM लकसम्बन्धी सेटिङ अफ गर्नुहोस्</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> मध्ये <ph name="SELECTED_PAGE" /> पृष्ठ</translation> <translation id="6018164090099858612">मिरर मोडबाट बाहिर निस्कँदै</translation> <translation id="602001110135236999">बायाँतिर स्क्रोल गर्नुहोस्</translation>
diff --git a/ash/strings/ash_strings_nl.xtb b/ash/strings/ash_strings_nl.xtb index bf49f20..3a122f7 100644 --- a/ash/strings/ash_strings_nl.xtb +++ b/ash/strings/ash_strings_nl.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">De kabel kan invloed hebben op de prestaties</translation> <translation id="2903844815300039659">Verbonden met <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Schermopnamen</translation> +<translation id="2925246975070834767">Probeer automatisch zoomen zodat je het midden van het scherm ziet. Zet dit aan via Snelle instellingen.</translation> <translation id="2941112035454246133">Laag</translation> <translation id="2942350706960889382">Vastgezet vergrootglas</translation> <translation id="2942516765047364088">Positie van plank</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Eerder verbonden</translation> <translation id="371370241367527062">Microfoon aan voorzijde</translation> <translation id="3713734891607377840">Openen na afronding</translation> +<translation id="3724279623330129812">De camera automatisch centreren</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> en nog <ph name="UNAVAILABLE_APPS_COUNT" /> staan niet op dit apparaat.</translation> <translation id="3735740477244556633">Sorteren op</translation> <translation id="3742055079367172538">Screenshot gemaakt</translation> -<translation id="3761848338953536304">Je beheerder vraagt je om de simlockinstelling uit te zetten</translation> <translation id="3765841986579723851">Vandaag bewerkt</translation> <translation id="3771549900096082774">Modus voor hoog contrast</translation> <translation id="3773700760453577392">Een beheerder heeft geen toestemming gegeven voor toegang tot meerdere accounts voor <ph name="USER_EMAIL" />. Alle gebruikers moeten uitloggen om door te gaan.</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">Apparaten</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, sterbeoordeling <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Zet het apparaat binnen een dag terug naar een oudere versie}other{Zet het apparaat binnen # dagen terug naar een oudere versie}}</translation> +<translation id="4633636853437260449">Druk op Ctrl + W om te verwijderen</translation> <translation id="4642092649622328492">Gedeeltelijk screenshot maken</translation> <translation id="4644727592819780893">Gebied is te klein voor het cameravoorbeeld</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, app-aanbeveling</translation> @@ -867,7 +869,6 @@ <translation id="598407983968395253">Template gebruiken</translation> <translation id="598882571027504733">Als je de update wilt downloaden, sluit je het toetsenbord aan en start je je Chromebook opnieuw op</translation> <translation id="5992218262414051481">De modus voor hoog contrast staat aan. Druk nogmaals op Ctrl+Zoeken+H om deze uit te zetten.</translation> -<translation id="6009656393242168182">Je simlockinstelling uitzetten</translation> <translation id="6012623610530968780">Pagina <ph name="SELECTED_PAGE" /> van <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Mirrormodus wordt gesloten</translation> <translation id="602001110135236999">Naar links scrollen</translation>
diff --git a/ash/strings/ash_strings_no.xtb b/ash/strings/ash_strings_no.xtb index 953cac4..4dd4a95 100644 --- a/ash/strings/ash_strings_no.xtb +++ b/ash/strings/ash_strings_no.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">Tidligere tilkoblet</translation> <translation id="371370241367527062">Mikrofon foran</translation> <translation id="3713734891607377840">Åpne når nedlastingen er fullført</translation> +<translation id="3724279623330129812">Automatisk zoom sentrerte kameraet</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> og <ph name="UNAVAILABLE_APPS_COUNT" /> til er ikke på denne enheten.</translation> <translation id="3735740477244556633">Sortér etter</translation> <translation id="3742055079367172538">Skjermdump tatt</translation> -<translation id="3761848338953536304">Administratoren ber deg slå av innstillingen for SIM-kortlås</translation> <translation id="3765841986579723851">Redigert i dag</translation> <translation id="3771549900096082774">Høykontrastmodus</translation> <translation id="3773700760453577392">En administrator har slått av multipålogging for <ph name="USER_EMAIL" />. Alle brukere må logge av for å fortsette.</translation> @@ -867,7 +867,6 @@ <translation id="598407983968395253">Bruk mal</translation> <translation id="598882571027504733">For å laste ned oppdateringen, start Chromebooken på nytt med tastaturet tilkoblet.</translation> <translation id="5992218262414051481">Høykontrastmodus er slått på. Trykk på Ctrl + Søk + H på nytt for å slå den av.</translation> -<translation id="6009656393242168182">Slå av innstillingen for SIM-kortlås</translation> <translation id="6012623610530968780">Side <ph name="SELECTED_PAGE" /> av <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Avslutter speilingsmodus</translation> <translation id="602001110135236999">Rull til venstre</translation>
diff --git a/ash/strings/ash_strings_or.xtb b/ash/strings/ash_strings_or.xtb index 91d8b50..30bca7b6 100644 --- a/ash/strings/ash_strings_or.xtb +++ b/ash/strings/ash_strings_or.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">ଏହି ଡିଭାଇସରେ <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ଏବଂ <ph name="UNAVAILABLE_APPS_COUNT" />ଟି ଅଧିକ ଆପ ନାହିଁ।</translation> <translation id="3735740477244556633">ଏହି କ୍ରମରେ ସଜାନ୍ତୁ</translation> <translation id="3742055079367172538">ସ୍କ୍ରିନ୍ସଟ୍ ନିଆଯାଇଛି</translation> -<translation id="3761848338953536304">ଆପଣ ଲକ SIM ସେଟିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ ବୋଲି ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟର ଅନୁରୋଧ କରୁଛନ୍ତି</translation> <translation id="3765841986579723851">ଆଜି ଏଡିଟ କରାଯାଇଛି</translation> <translation id="3771549900096082774">ଉଚ୍ଚ କଣ୍ଟ୍ରାଷ୍ଟ୍ ମୋଡ୍</translation> <translation id="3773700760453577392">ଜଣେ ବ୍ୟବସ୍ଥାପକ <ph name="USER_EMAIL" /> ପାଇଁ ଏକାଧିକ ସାଇନ୍-ଇନ୍କୁ ଅନୁମୋଦିତ କରିନାହାନ୍ତି। ଜାରି ରଖିବା ନିମନ୍ତେ ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ ସାଇନ୍ ଆଉଟ୍ କରିବାକୁ ହେବ।</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">ଆପଣଙ୍କ ଆପଗୁଡ଼ିକୁ ପୁଣି କ୍ରମରେ ରଖିବା ପାଇଁ ଯେ କୌଣସି ସ୍ଥାନରେ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />ର ଶୀର୍ଷରେ <ph name="DRAGGED_APP_NAME" />କୁ, ଫୋଲ୍ଡର୍ ତିଆରି କରିବା ପାଇଁ ରିଲିଜ୍ କରନ୍ତୁ।</translation> <translation id="5397578532367286026">chrome.com ରେ ପରିଚାଳକ (<ph name="MANAGER_EMAIL" />) ଙ୍କ ଦ୍ଵାରା ଏହି ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ବ୍ୟବହାର ପ୍ରଣାଳୀ ଓ ଇତିବୃତ୍ତିର ସମୀକ୍ଷା କରାଯାଇପାରିବ।</translation> +<translation id="5399673806694250334">ଷ୍ଟାଟସ ଟ୍ରେ, ସମୟ <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" />, + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" /> + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">ଦ୍ରୁତ ସେଟିଂସ୍, ବିଜ୍ଞପ୍ତି କେନ୍ଦ୍ରକୁ ଆକ୍ସେସ୍ କରିବା ପାଇଁ search + left ଦବାନ୍ତୁ।</translation> <translation id="5426063383988017631">ସେଟିଂସ୍ ମେନୁ ବନ୍ଦ କରାଯାଇଛି</translation> <translation id="5428899915242071344">ଚୟନ କରିବା ଆରମ୍ଭ କରନ୍ତୁ</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">ଟେମ୍ପଲେଟ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="598882571027504733">ଅପ୍ଡେଟ୍ ପ୍ରାପ୍ତ କରିବା ପାଇଁ, ଆପଣଙ୍କର Chromebookକୁ କୀବୋର୍ଡରେ ସଂଲଗ୍ନ କରି ରିଷ୍ଟାର୍ଟ କରନ୍ତୁ।</translation> <translation id="5992218262414051481">ଉଚ୍ଚ କଣ୍ଟ୍ରାଷ୍ଟ ମୋଡ୍ ସକ୍ଷମ କରାଗଲା। ଏହାକୁ ବନ୍ଦରେ ଟୋଗଲ୍ କରିବା ପାଇଁ ପୁଣିଥରେ Ctrl+Search+D ଦବାନ୍ତୁ</translation> -<translation id="6009656393242168182">ଆପଣଙ୍କ SIM ଲକ ସେଟିଂକୁ ଅକ୍ଷମ କରନ୍ତୁ</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />ରୁ <ph name="SELECTED_PAGE" /> ପୃଷ୍ଠା</translation> <translation id="6018164090099858612">ମିରର୍ ମୋଡ୍ରୁ ପ୍ରସ୍ଥାନ କରୁଛି</translation> <translation id="602001110135236999">ବାମକୁ ସ୍କ୍ରୋଲ୍ କରନ୍ତୁ</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">ଆପଣଙ୍କ ଫୋନରେ ଥିବା ବର୍ତ୍ତମାନର ଫଟୋ, ମିଡିଆ ଏବଂ ବିଜ୍ଞପ୍ତିଗୁଡ଼ିକୁ ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />ରେ ଦେଖନ୍ତୁ</translation> <translation id="619335566042889110">ବର୍ତ୍ତମାନ ସମ୍ପୂର୍ଣ୍ଣ ଚାର୍ଜ କରନ୍ତୁ</translation> <translation id="6193431488227440296">ଡେଭ</translation> +<translation id="6210042900243040400"><ph name="EMAIL" />ରେ ପୂର୍ବରୁ ସେଭ କରାଯାଇଥିବା <ph name="NAME" /> ସହ କନେକ୍ଟ କରନ୍ତୁ</translation> <translation id="6220928844947387476">ଆପଣ ବର୍ତ୍ତମାନ ନିଜକୁ ଏବଂ ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ସମାନ ସମୟରେ ରେକର୍ଡ କରିପାରିବେ</translation> <translation id="622484624075952240">ଡାଉନ୍ କୀ</translation> <translation id="6231419273573514727">ପେରିଫେରାଲର ପରଫରମାନ୍ସ ସୀମିତ ହୋଇପାରେ</translation>
diff --git a/ash/strings/ash_strings_pa.xtb b/ash/strings/ash_strings_pa.xtb index 9f3fd10..54c3ce68 100644 --- a/ash/strings/ash_strings_pa.xtb +++ b/ash/strings/ash_strings_pa.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">ਪਹਿਲਾਂ ਤੋਂ ਕਨੈਕਟ ਕੀਤੇ</translation> <translation id="371370241367527062">ਮੂਹਰਲਾ ਮਾਈਕ੍ਰੋਫ਼ੋਨ</translation> <translation id="3713734891607377840">ਪੂਰਾ ਹੋਣ 'ਤੇ ਖੁੱਲ੍ਹੇ</translation> +<translation id="3724279623330129812">ਸਵੈ ਜ਼ੂਮ ਨੇ ਕੈਮਰੇ ਨੂੰ ਕੇਂਦਰਿਤ ਕੀਤਾ</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ਅਤੇ <ph name="UNAVAILABLE_APPS_COUNT" /> ਹੋਰ ਐਪਾਂ ਇਸ ਡੀਵਾਈਸ 'ਤੇ ਉਪਲਬਧ ਨਹੀਂ ਹਨ।</translation> <translation id="3735740477244556633">ਇਸ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ ਕਰੋ</translation> <translation id="3742055079367172538">ਸਕ੍ਰੀਨਸ਼ਾਟ ਲਿਆ ਗਿਆ</translation> -<translation id="3761848338953536304">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਤੁਹਾਨੂੰ ਲਾਕ ਸਿਮ ਸੈਟਿੰਗ ਨੂੰ ਬੰਦ ਕਰਨ ਦੀ ਬੇਨਤੀ ਕਰ ਰਿਹਾ ਹੈ</translation> <translation id="3765841986579723851">ਅੱਜ ਸੰਪਾਦਨ ਕੀਤਾ ਗਿਆ</translation> <translation id="3771549900096082774">ਉੱਚ ਵਖਰੇਵਾਂ ਮੋਡ</translation> <translation id="3773700760453577392">ਕਿਸੇ ਪ੍ਰਸ਼ਾਸਕ ਨੇ <ph name="USER_EMAIL" /> ਲਈ ਬਹੁ-ਗਿਣਤੀ ਸਾਈਨ-ਇਨ ਨੂੰ ਅਸਵੀਕਾਰ ਕੀਤਾ ਹੈ। ਜਾਰੀ ਰੱਖਣ ਲਈ ਸਾਰੇ ਵਰਤੋਂਕਾਰਾਂ ਦਾ ਸਾਈਨ-ਆਊਟ ਹੋਣਾ ਲਾਜ਼ਮੀ ਹੈ।</translation> @@ -868,7 +868,6 @@ <translation id="598407983968395253">ਟੈਮਪਲੇਟ ਵਰਤੋ</translation> <translation id="598882571027504733">ਅੱਪਡੇਟ ਪ੍ਰਾਪਤ ਕਰਨ ਲਈ, Chromebook ਨੂੰ ਨਾਲ ਅਟੈਚ ਕੀਤੇ ਕੀ-ਬੋਰਡ ਰਾਹੀਂ ਮੁੜ-ਚਾਲੂ ਕਰੋ।</translation> <translation id="5992218262414051481">ਉੱਚ ਵਖਰੇਵਾਂ ਮੋਡ ਚਾਲੂ ਕੀਤਾ ਗਿਆ ਹੈ। ਇਸਨੂੰ ਬੰਦ 'ਤੇ ਟੌਗਲ ਕਰਨ ਲਈ ਦੁਬਾਰਾ Ctrl+Search+H ਦਬਾਓ।</translation> -<translation id="6009656393242168182">ਆਪਣੀ ਸਿਮ ਲਾਕ ਸੈਟਿੰਗ ਨੂੰ ਬੰਦ ਕਰੋ</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> ਵਿੱਚੋਂ <ph name="SELECTED_PAGE" /> ਪੰਨਾ</translation> <translation id="6018164090099858612">"ਮਿਰਰ ਮੋਡ" ਤੋਂ ਬਾਹਰ ਨਿਕਲਿਆ ਜਾ ਰਿਹਾ ਹੈ</translation> <translation id="602001110135236999">ਖੱਬੇ ਪਾਸੇ ਸਕ੍ਰੋਲ ਕਰੋ</translation>
diff --git a/ash/strings/ash_strings_pl.xtb b/ash/strings/ash_strings_pl.xtb index 670ec5c..8982a3e 100644 --- a/ash/strings/ash_strings_pl.xtb +++ b/ash/strings/ash_strings_pl.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">Wcześniej połączone</translation> <translation id="371370241367527062">Przedni mikrofon</translation> <translation id="3713734891607377840">Otwórz po pobraniu</translation> +<translation id="3724279623330129812">Automatyczne powiększenie wyśrodkowało obraz z kamery</translation> <translation id="3726171378575546917">Aplikacji <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ani jeszcze <ph name="UNAVAILABLE_APPS_COUNT" /> nie ma na tym urządzeniu.</translation> <translation id="3735740477244556633">Sortuj według</translation> <translation id="3742055079367172538">Wykonano zrzut ekranu</translation> -<translation id="3761848338953536304">Administrator prosi o wyłączenie ustawienia blokady SIM</translation> <translation id="3765841986579723851">Edytowane dzisiaj</translation> <translation id="3771549900096082774">Tryb wysokiego kontrastu</translation> <translation id="3773700760453577392">Administrator nie zezwolił na wielokrotne logowanie użytkownika <ph name="USER_EMAIL" />. Aby kontynuować, wszyscy użytkownicy muszą się wylogować.</translation> @@ -759,6 +759,16 @@ <translation id="5393156353051693207">Naciśnij i przytrzymaj dowolne miejsce, aby zmienić kolejność aplikacji</translation> <translation id="5395308026110844773">Aplikacja <ph name="DRAGGED_APP_NAME" /> jest nad aplikacją <ph name="IN_PLACE_APP" /> – puść, by utworzyć folder.</translation> <translation id="5397578532367286026">Działania i historia tego użytkownika mogą być sprawdzane przez menedżera (<ph name="MANAGER_EMAIL" />) na chrome.com.</translation> +<translation id="5399673806694250334">Zasobnik stanu, godzina <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Szybkie ustawienia, naciśnij Wyszukaj + strzałka w lewo, by otworzyć centrum powiadomień.</translation> <translation id="5426063383988017631">Zamknięto menu ustawień</translation> <translation id="5428899915242071344">Rozpocznij zaznaczanie</translation> @@ -857,7 +867,6 @@ <translation id="598407983968395253">Użyj szablonu</translation> <translation id="598882571027504733">Aby pobrać aktualizację, uruchom Chromebooka ponownie z podłączoną klawiaturą.</translation> <translation id="5992218262414051481">Tryb wysokiego kontrastu został włączony. Aby go wyłączyć, naciśnij ponownie Ctrl+Search+H.</translation> -<translation id="6009656393242168182">Wyłącz ustawienie blokady SIM</translation> <translation id="6012623610530968780">Strona <ph name="SELECTED_PAGE" /> z <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Wyłączam tryb odbicia lustrzanego</translation> <translation id="602001110135236999">Przewiń w lewo</translation> @@ -897,6 +906,7 @@ <translation id="619279033188484792">Wyświetlaj najnowsze zdjęcia, pliki multimedialne i powiadomienia z telefonu na urządzeniu <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Naładuj do pełna teraz</translation> <translation id="6193431488227440296">Deweloperska</translation> +<translation id="6210042900243040400">Połącz urządzenie <ph name="NAME" /> wcześniej zapisane na koncie <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Teraz możesz jednocześnie nagrywać siebie i swój ekran</translation> <translation id="622484624075952240">W dół</translation> <translation id="6231419273573514727">Wydajność urządzeń peryferyjnych może być ograniczona</translation>
diff --git a/ash/strings/ash_strings_pt-BR.xtb b/ash/strings/ash_strings_pt-BR.xtb index ab5f3ab..ba7a868b 100644 --- a/ash/strings/ash_strings_pt-BR.xtb +++ b/ash/strings/ash_strings_pt-BR.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">O cabo pode afetar o desempenho</translation> <translation id="2903844815300039659">Conectado a <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Capturas de tela</translation> +<translation id="2925246975070834767">Use o zoom automático para ficar no centro da tela. Ative essa opção nas Configurações rápidas.</translation> <translation id="2941112035454246133">Baixa</translation> <translation id="2942350706960889382">Lupa em área fixa</translation> <translation id="2942516765047364088">Posição da estante</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Conectados anteriormente</translation> <translation id="371370241367527062">Microfone frontal</translation> <translation id="3713734891607377840">Abrir quando o download for concluído</translation> +<translation id="3724279623330129812">O zoom automático centralizou o foco da câmera</translation> <translation id="3726171378575546917">Os apps <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> e <ph name="UNAVAILABLE_APPS_COUNT" /> não estão no dispositivo.</translation> <translation id="3735740477244556633">Ordenar por</translation> <translation id="3742055079367172538">Captura de tela realizada</translation> -<translation id="3761848338953536304">Seu administrador está solicitando que você desative a configuração de bloqueio do chip</translation> <translation id="3765841986579723851">Editado hoje</translation> <translation id="3771549900096082774">Modo de alto contraste</translation> <translation id="3773700760453577392">Um administrador desativou o login múltiplo para <ph name="USER_EMAIL" />. Todos os usuários precisam sair para continuar.</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">Dispositivos</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, avaliado com <ph name="RATING_SCORE" /> estrelas</translation> <translation id="4633185660152240791">{0,plural, =1{Reverta o dispositivo para a versão anterior em até 1 dia}one{Reverta o dispositivo para a versão anterior em até # dia}other{Reverta o dispositivo para a versão anterior em até # dias}}</translation> +<translation id="4633636853437260449">Pressione Ctrl+W para excluir</translation> <translation id="4642092649622328492">Fazer uma captura de tela parcial</translation> <translation id="4644727592819780893">A região é muito pequena para caber na câmera</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, recomendação de app</translation> @@ -867,7 +869,6 @@ <translation id="598407983968395253">Usar modelo</translation> <translation id="598882571027504733">Para receber a atualização, reinicie seu Chromebook com o teclado conectado.</translation> <translation id="5992218262414051481">Modo de alto contraste ativado. Pressione Ctrl+Pesquisa+H novamente para desativá-lo.</translation> -<translation id="6009656393242168182">Desative a configuração de bloqueio do chip</translation> <translation id="6012623610530968780">Página <ph name="SELECTED_PAGE" /> de <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Saindo do modo espelhado</translation> <translation id="602001110135236999">Rolar para a esquerda</translation>
diff --git a/ash/strings/ash_strings_pt-PT.xtb b/ash/strings/ash_strings_pt-PT.xtb index e56195e..f202adb9 100644 --- a/ash/strings/ash_strings_pt-PT.xtb +++ b/ash/strings/ash_strings_pt-PT.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Câmara</translation> <translation id="1632985212731562677">O acesso por comutador pode ser desativado em Definições > Acessibilidade.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> dispositivos</translation> -<translation id="1639239467298939599">A carregar</translation> +<translation id="1639239467298939599">A carregar…</translation> <translation id="1654477262762802994">Iniciar uma consulta de voz</translation> <translation id="1668469839109562275">VPN incorporada</translation> <translation id="1677472565718498478"><ph name="TIME" /> restante(s)</translation> @@ -327,6 +327,7 @@ <translation id="2894949423239620203">O cabo pode afetar o desempenho</translation> <translation id="2903844815300039659">Ligado a <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Capturas de ecrã</translation> +<translation id="2925246975070834767">Experimente o zoom automático para ficar no centro do ecrã. Ative-o nas Definições rápidas.</translation> <translation id="2941112035454246133">Baixa</translation> <translation id="2942350706960889382">Lupa ancorada</translation> <translation id="2942516765047364088">Posição da prateleira</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Ligados anteriormente</translation> <translation id="371370241367527062">Microfone frontal</translation> <translation id="3713734891607377840">Abrir ao concluir</translation> +<translation id="3724279623330129812">O zoom automático centrou a câmara</translation> <translation id="3726171378575546917">A app <ph name="UNAVAILABLE_APPS_ONE" />, a app <ph name="UNAVAILABLE_APPS_TWO" /> e mais <ph name="UNAVAILABLE_APPS_COUNT" /> apps não se encontram neste dispositivo.</translation> <translation id="3735740477244556633">Ordenar por</translation> <translation id="3742055079367172538">Captura de ecrã efetuada</translation> -<translation id="3761848338953536304">O administrador está a pedir para desativar a definição de bloqueio do SIM</translation> <translation id="3765841986579723851">Editado hoje</translation> <translation id="3771549900096082774">Modo de alto contraste</translation> <translation id="3773700760453577392">Um administrador não permitiu o início de sessão integrado para <ph name="USER_EMAIL" />. Todos os utilizadores têm de terminar sessão para continuar.</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">Dispositivos</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, número de estrelas: <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Altere o dispositivo para uma versão anterior dentro de um dia}other{Altere o dispositivo para uma versão anterior dentro de # dias}}</translation> +<translation id="4633636853437260449">Prima Ctrl + W para eliminar</translation> <translation id="4642092649622328492">Criar uma captura de ecrã parcial</translation> <translation id="4644727592819780893">A região é demasiado pequena para se ajustar à câmara</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, recomendação de aplicação</translation> @@ -867,7 +869,6 @@ <translation id="598407983968395253">Utilizar modelo</translation> <translation id="598882571027504733">Para obter a atualização, reinicie o Chromebook com o teclado ligado.</translation> <translation id="5992218262414051481">Modo de alto contraste ativado. Prima Ctrl + Pesquisa + H novamente para o desativar.</translation> -<translation id="6009656393242168182">Desative a definição de bloqueio do SIM</translation> <translation id="6012623610530968780">Página <ph name="SELECTED_PAGE" /> de <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">A sair do modo espelhado</translation> <translation id="602001110135236999">Deslocar para a esquerda</translation>
diff --git a/ash/strings/ash_strings_ro.xtb b/ash/strings/ash_strings_ro.xtb index e5c4222657..6cc0303 100644 --- a/ash/strings/ash_strings_ro.xtb +++ b/ash/strings/ash_strings_ro.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">Cablul poate afecta performanța</translation> <translation id="2903844815300039659">Conectat la <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Capturi de ecran</translation> +<translation id="2925246975070834767">Încearcă zoomul automat, astfel încât să fii în centrul ecranului. Activează-l în Setări rapide.</translation> <translation id="2941112035454246133">Redusă</translation> <translation id="2942350706960889382">Lupă andocată</translation> <translation id="2942516765047364088">Poziție raft</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Conectat anterior</translation> <translation id="371370241367527062">Microfonul din față</translation> <translation id="3713734891607377840">Deschide după finalizare</translation> +<translation id="3724279623330129812">Zoomul automat a centrat camera</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> și încă <ph name="UNAVAILABLE_APPS_COUNT" /> nu sunt disponibile pe acest dispozitiv.</translation> <translation id="3735740477244556633">Sortează după</translation> <translation id="3742055079367172538">Captură de ecran efectuată</translation> -<translation id="3761848338953536304">Administratorul solicită să dezactivezi setarea de blocare a cardului SIM</translation> <translation id="3765841986579723851">Editat astăzi</translation> <translation id="3771549900096082774">Mod de contrast ridicat</translation> <translation id="3773700760453577392">Un administrator a interzis conectarea multiplă pentru <ph name="USER_EMAIL" />. Toți utilizatorii trebuie să se deconecteze pentru a continua.</translation> @@ -533,7 +534,7 @@ <translation id="4115378294792113321">Magenta</translation> <translation id="412298498316631026">fereastră</translation> <translation id="4123259114412175274">Pentru a debloca Chromebookul, asigură-te că funcția Bluetooth a telefonului este activată</translation> -<translation id="4125970834901680537">Nu se pot reda în stream aplicațiile în modul tabletă. Încearcă din nou în modul laptop.</translation> +<translation id="4125970834901680537">Nu se pot reda în stream aplicațiile în modul tabletă. Încearcă în modul laptop.</translation> <translation id="4129129681837227511">Pentru a vedea notificările pe ecranul de blocare, deblochează pentru a modifica setarea</translation> <translation id="4136724716305260864">Activată până la răsărit</translation> <translation id="4146833061457621061">Redă muzică</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">Dispozitive</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, evaluare cu stele: <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Treci la versiunea anterioară a dispozitivului în cel mult o zi}few{Treci la versiunea anterioară a dispozitivului în # zile}other{Treci la versiunea anterioară a dispozitivului în # de zile}}</translation> +<translation id="4633636853437260449">Apasă Ctrl + W pentru a șterge</translation> <translation id="4642092649622328492">Realizează o captură de ecran parțială</translation> <translation id="4644727592819780893">Regiunea este prea mică pentru cameră</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, aplicație recomandată</translation> @@ -867,7 +869,6 @@ <translation id="598407983968395253">Folosește șablonul</translation> <translation id="598882571027504733">Pentru a obține actualizarea, repornește Chromebookul cu tastatura atașată.</translation> <translation id="5992218262414051481">Modul Contrast ridicat este activat. Apasă din nou pe Ctrl + tasta de căutare + H pentru a-l dezactiva.</translation> -<translation id="6009656393242168182">Dezactivează setarea de blocare a cardului SIM</translation> <translation id="6012623610530968780">Pagina <ph name="SELECTED_PAGE" /> din <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Se iese din modul oglindă</translation> <translation id="602001110135236999">Derulează la stânga</translation>
diff --git a/ash/strings/ash_strings_ru.xtb b/ash/strings/ash_strings_ru.xtb index c05a253..69a6826f 100644 --- a/ash/strings/ash_strings_ru.xtb +++ b/ash/strings/ash_strings_ru.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1632985212731562677">Функцию Switch Access можно отключить в разделе "Настройки > Специальные возможности".</translation> <translation id="1637505162081889933">Устройств: <ph name="NUM_DEVICES" /></translation> -<translation id="1639239467298939599">Загрузка</translation> +<translation id="1639239467298939599">Загрузка…</translation> <translation id="1654477262762802994">Произнесите запрос</translation> <translation id="1668469839109562275">Встроенная VPN</translation> <translation id="1677472565718498478">Ещё <ph name="TIME" /></translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917">Приложения "<ph name="UNAVAILABLE_APPS_ONE" />", "<ph name="UNAVAILABLE_APPS_TWO" />" и ещё несколько сервисов (<ph name="UNAVAILABLE_APPS_COUNT" />) не установлены на этом устройстве.</translation> <translation id="3735740477244556633">Сортировать по:</translation> <translation id="3742055079367172538">Сделан скриншот</translation> -<translation id="3761848338953536304">Администратор просит вас отключить блокировку SIM-карты.</translation> <translation id="3765841986579723851">Изменено сегодня</translation> <translation id="3771549900096082774">Режим высокой контрастности</translation> <translation id="3773700760453577392">Администратор отключил множественный вход для аккаунта <ph name="USER_EMAIL" />. Чтобы продолжить, все пользователи должны выйти из аккаунтов.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">Использовать шаблон</translation> <translation id="598882571027504733">Чтобы выполнить обновление, перезагрузите устройство Chromebook, не отключая от него клавиатуру.</translation> <translation id="5992218262414051481">Режим высокой контрастности включен. Чтобы отключить его, нажмите CTRL + ПОИСК + H.</translation> -<translation id="6009656393242168182">Разблокируйте SIM-карту</translation> <translation id="6012623610530968780">Страница <ph name="SELECTED_PAGE" /> из <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Выход из режима трансляции…</translation> <translation id="602001110135236999">Влево</translation> @@ -897,6 +895,7 @@ <translation id="619279033188484792">Позволяет просматривать на устройстве <ph name="DEVICE_TYPE" /> уведомления с телефона, а также недавно добавленные на телефон фотографии и медиафайлы</translation> <translation id="619335566042889110">Зарядить до конца сейчас</translation> <translation id="6193431488227440296">Версия для разработчиков</translation> +<translation id="6210042900243040400">Можно подключиться к устройству <ph name="NAME" />, которое уже сохранено в аккаунте <ph name="EMAIL" />.</translation> <translation id="6220928844947387476">Теперь можно вести запись экрана и изображения с веб-камеры одновременно.</translation> <translation id="622484624075952240">Вниз</translation> <translation id="6231419273573514727">Производительность периферийных устройств может быть ограничена</translation>
diff --git a/ash/strings/ash_strings_si.xtb b/ash/strings/ash_strings_si.xtb index 7a6b158..00c62ec 100644 --- a/ash/strings/ash_strings_si.xtb +++ b/ash/strings/ash_strings_si.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" /> <ph name="UNAVAILABLE_APPS_TWO" /> සහ තව <ph name="UNAVAILABLE_APPS_COUNT" />ක් මෙම උපාංගයෙහි නැත.</translation> <translation id="3735740477244556633">අනුපිළිවෙළ</translation> <translation id="3742055079367172538">තිර ඡායාව ගැනිණි</translation> -<translation id="3761848338953536304">ඔබගේ පරිපාලක ඔබෙන් අගුලු SIM සැකසීම ක්රියාවිරහිත කරන ලෙස ඉල්ලයි</translation> <translation id="3765841986579723851">අද සංස්කරණය කරන ලදී</translation> <translation id="3771549900096082774">අධි අසමානතා ප්රකාරය</translation> <translation id="3773700760453577392">පරිපාලකයෙකු විසින් <ph name="USER_EMAIL" /> සඳහා බහු පුරනයට ඉඩ දී නොමැත. සියලු පරිශීලකයින් ඉදිරියට යෑමට වරනය විය යුතුයි.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">අච්චුව භාවිත කරන්න</translation> <translation id="598882571027504733">යාවත්කාලීනය ලබා ගැනීමට, අමුණා ඇති යතුරුපුවරුව සමගින් ඔබගේ Chromebook නැවත ආරම්භ කරන්න.</translation> <translation id="5992218262414051481">ඉහළ ප්රභේදන ප්රකාරය සබලයි. එය ක්රියාවිරහිත කිරීම ටොගල කිරීමට නැවත Ctrl+Search+H ඔබන්න.</translation> -<translation id="6009656393242168182">ඔබගේ SIM අගුල සැකසීම අබල කරන්න</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> න් <ph name="SELECTED_PAGE" /> වැනි පිටුව</translation> <translation id="6018164090099858612">කැඩපත් ප්රකාරයෙන් ඉවත් වෙමින්</translation> <translation id="602001110135236999">වමට අනුචලන කරන්න</translation> @@ -897,6 +895,7 @@ <translation id="619279033188484792">ඔබගේ දුරකථනයේ මෑත ඡායාරූප, මාධ්ය සහ ඔබගේ <ph name="DEVICE_TYPE" /> හි දැනුම්දීම් බලන්න</translation> <translation id="619335566042889110">දැන් සම්පූර්ණයෙන්ම ආරෝපණය කරන්න</translation> <translation id="6193431488227440296">සංවර්ධක</translation> +<translation id="6210042900243040400"><ph name="EMAIL" /> වෙත කලින් සුරකින ලද <ph name="NAME" /> සම්බන්ධ කරන්න</translation> <translation id="6220928844947387476">ඔබට දැන් ඔබව සහ ඔබගේ තිරය එකම අවස්ථාවේදී පටිගත කළ හැකිය</translation> <translation id="622484624075952240">පහළ</translation> <translation id="6231419273573514727">උපාංග කාර්ය සාධනය සීමිත විය හැකිය</translation>
diff --git a/ash/strings/ash_strings_sk.xtb b/ash/strings/ash_strings_sk.xtb index c2540f3..0b5be76 100644 --- a/ash/strings/ash_strings_sk.xtb +++ b/ash/strings/ash_strings_sk.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1632985212731562677">Ovládanie prepínačmi je možné deaktivovať v sekcii Nastavenia > Dostupnosť.</translation> <translation id="1637505162081889933">Zariadenia: <ph name="NUM_DEVICES" /></translation> -<translation id="1639239467298939599">Prebieha načítavanie</translation> +<translation id="1639239467298939599">Načítava sa</translation> <translation id="1654477262762802994">Spustiť hlasový dopyt</translation> <translation id="1668469839109562275">Vstavaná sieť VPN</translation> <translation id="1677472565718498478">Zostávajúci čas: <ph name="TIME" /></translation> @@ -327,6 +327,7 @@ <translation id="2894949423239620203">Kábel môže ovplyvniť výkonnosť</translation> <translation id="2903844815300039659">Pripojené k sieti <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Snímky obrazovky</translation> +<translation id="2925246975070834767">Vyskúšajte automatické priblíženie, ktoré vám umožní byť v strede obrazovky. Môžete ho zapnúť v rýchlych nastaveniach.</translation> <translation id="2941112035454246133">Nízka</translation> <translation id="2942350706960889382">Ukotvená lupa</translation> <translation id="2942516765047364088">Pozícia poličky</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Predtým pripojené zariadenia</translation> <translation id="371370241367527062">Predný mikrofón</translation> <translation id="3713734891607377840">Po dokončení otvoriť</translation> +<translation id="3724279623330129812">Automatické priblíženie vycentrovalo kameru</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> a ďalšie (<ph name="UNAVAILABLE_APPS_COUNT" />) nie sú v tomto zariadení.</translation> <translation id="3735740477244556633">Zoradiť podľa</translation> <translation id="3742055079367172538">Vytvorila sa snímka obrazovky</translation> -<translation id="3761848338953536304">Váš správca požaduje, aby ste vypli nastavenie zámky SIM karty</translation> <translation id="3765841986579723851">Upravené dnes</translation> <translation id="3771549900096082774">Režim s vysokým kontrastom</translation> <translation id="3773700760453577392">Správca zakázal viacnásobné prihlásenie pre používateľa <ph name="USER_EMAIL" />. Všetci používatelia sa musia odhlásiť a až potom môžu pokračovať.</translation> @@ -634,6 +635,7 @@ <translation id="4628757576491864469">Zariadenia</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, hodnotenie hviezdičkami <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Do jedného dňa obnovte v zariadení predchádzajúcu verziu}few{Do # dní obnovte v zariadení predchádzajúcu verziu}many{Do # dňa obnovte v zariadení predchádzajúcu verziu}other{Do # dní obnovte v zariadení predchádzajúcu verziu}}</translation> +<translation id="4633636853437260449">Položku odstránite stlačením klávesov Ctrl + W</translation> <translation id="4642092649622328492">Vytvorenie čiastočnej snímky obrazovky</translation> <translation id="4644727592819780893">Oblasť je príliš malá na zobrazenie ukážky v kamere</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, odporúčanie aplikácie</translation> @@ -857,7 +859,6 @@ <translation id="598407983968395253">Použiť šablónu</translation> <translation id="598882571027504733">Ak chcete získať aktualizáciu, Chromebook s pripojenou klávesnicou reštartujte.</translation> <translation id="5992218262414051481">Režim vysokého kontrastu je aktívny. Vypnete ho opätovným stlačením kombinácie klávesov Ctrl+Hľadať+H.</translation> -<translation id="6009656393242168182">Deaktivujte nastavenie zámky SIM karty</translation> <translation id="6012623610530968780">Stránka <ph name="SELECTED_PAGE" /> z <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ukončuje sa režim zrkadlenia</translation> <translation id="602001110135236999">Posunúť doľava</translation>
diff --git a/ash/strings/ash_strings_sl.xtb b/ash/strings/ash_strings_sl.xtb index 9b08a54b..0771e8e 100644 --- a/ash/strings/ash_strings_sl.xtb +++ b/ash/strings/ash_strings_sl.xtb
@@ -469,10 +469,10 @@ <translation id="3708186454126126312">Predhodno povezane naprave</translation> <translation id="371370241367527062">Sprednji mikrofon</translation> <translation id="3713734891607377840">Odpri ob dokončanju</translation> +<translation id="3724279623330129812">Samodejna povečava/pomanjšava je osredotočila fotoaparat</translation> <translation id="3726171378575546917">Aplikacij <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> in drugih (<ph name="UNAVAILABLE_APPS_COUNT" />) ni v tej napravi.</translation> <translation id="3735740477244556633">Razvrsti po</translation> <translation id="3742055079367172538">Posnetek zaslona je narejen</translation> -<translation id="3761848338953536304">Vaš skrbnik zahteva, da izklopite nastavitev zaklepanja kartice SIM.</translation> <translation id="3765841986579723851">Urejeno danes</translation> <translation id="3771549900096082774">Visokokontrastni način</translation> <translation id="3773700760453577392">Skrbnik je prepovedal prijavo z več računi za <ph name="USER_EMAIL" />. Če želite nadaljevati, morajo biti odjavljeni vsi uporabniki.</translation> @@ -707,7 +707,7 @@ <translation id="5071064518267176975">Aplikacija želi uporabljati mikrofon</translation> <translation id="5078796286268621944">Napačen PIN</translation> <translation id="5083553833479578423">Odklenite več funkcij Pomočnika.</translation> -<translation id="509790653408515442">Ko pretočno predvajate aplikacije v telefonu, so prikazane tukaj</translation> +<translation id="509790653408515442">Ko pretočno predvajate aplikacije v telefonu, so prikazane tukaj.</translation> <translation id="5098537242461068432">Namizje in okna so znova odprti</translation> <translation id="5107522548814527560">Splet</translation> <translation id="5117590920725113268">Prikaz naslednjega meseca</translation> @@ -759,6 +759,16 @@ <translation id="5393156353051693207">Če želite preurediti aplikacije, se kjer koli dotaknite in pridržite.</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> na <ph name="IN_PLACE_APP" />, spustite, da ustvarite mapo.</translation> <translation id="5397578532367286026">Upravitelj (<ph name="MANAGER_EMAIL" />) lahko na chrome.com pregleduje uporabo in zgodovino tega uporabnika.</translation> +<translation id="5399673806694250334">Vrstica stanja, čas <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Hitre nastavitve, pritisnite tipko za iskanje in puščico levo, če želite dostopati do središča za obvestila.</translation> <translation id="5426063383988017631">Meni z nastavitvami je zaprt</translation> <translation id="5428899915242071344">Začni izbiranje</translation> @@ -857,7 +867,6 @@ <translation id="598407983968395253">Uporabi predlogo</translation> <translation id="598882571027504733">Če želite prejeti posodobitev, znova zaženite Chromebook s priklopljeno tipkovnico.</translation> <translation id="5992218262414051481">Visokokontrastni način je omogočen. Če ga želite izklopiti, znova pritisnite Ctrl + tipko za iskanje + H.</translation> -<translation id="6009656393242168182">Onemogočanje nastavitve zaklepanja kartice SIM</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. stran od <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Izhod iz zrcalnega načina</translation> <translation id="602001110135236999">Pomik levo</translation> @@ -897,6 +906,7 @@ <translation id="619279033188484792">Oglejte si nedavne fotografije, predstavnost in obvestila telefona v napravi <ph name="DEVICE_TYPE" />.</translation> <translation id="619335566042889110">Napolni v celoti</translation> <translation id="6193431488227440296">Za razvijalce</translation> +<translation id="6210042900243040400">Vzpostavite povezavo z napravo <ph name="NAME" />, ki je že shranjena v računu <ph name="EMAIL" />.</translation> <translation id="6220928844947387476">Sebe in zaslon lahko zdaj posnamete istočasno.</translation> <translation id="622484624075952240">Dol</translation> <translation id="6231419273573514727">Delovanje zunanje dodatne opreme bo morda omejeno</translation>
diff --git a/ash/strings/ash_strings_sq.xtb b/ash/strings/ash_strings_sq.xtb index 50bb4116..6c8c1862d 100644 --- a/ash/strings/ash_strings_sq.xtb +++ b/ash/strings/ash_strings_sq.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> dhe <ph name="UNAVAILABLE_APPS_COUNT" /> të tjera nuk gjenden në këtë pajisje.</translation> <translation id="3735740477244556633">Rendit sipas</translation> <translation id="3742055079367172538">Pamja e ekranit u mor</translation> -<translation id="3761848338953536304">Administratori po kërkon që ta çaktivizosh cilësimin e kyçjes së kartës SIM</translation> <translation id="3765841986579723851">Modifikuar sot</translation> <translation id="3771549900096082774">Modaliteti i kontrastit të lartë</translation> <translation id="3773700760453577392">Një administrator ka ndaluar identifikimin e shumëfishtë për <ph name="USER_EMAIL" />. Të gjithë përdoruesit duhet të dalin për të vazhduar.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">Përdor shabllonin</translation> <translation id="598882571027504733">Për të marrë përditësimin, rinise Chromebook me tastierën e lidhur.</translation> <translation id="5992218262414051481">Modaliteti i kontrastit të lartë u aktivizua. Shtyp përsëri Ctrl+Kërko+Shift+H për ta çaktivizuar.</translation> -<translation id="6009656393242168182">Çaktivizo cilësimin e kyçjes së kartës SIM</translation> <translation id="6012623610530968780">Faqja <ph name="SELECTED_PAGE" /> nga <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Po del nga modaliteti i pasqyrës</translation> <translation id="602001110135236999">Lëviz majtas</translation> @@ -897,6 +895,7 @@ <translation id="619279033188484792">Shiko fotografitë, mediat dhe njoftimet më të fundit të telefonit tënd në <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Karikoje plotësisht tani</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Lidh pajisjen <ph name="NAME" /> që është ruajtur më parë te <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Tani mund të regjistrosh veten dhe ekranin në të njëjtën kohë</translation> <translation id="622484624075952240">Poshtë</translation> <translation id="6231419273573514727">Cilësia e funksionimit të pajisjeve periferike mund të jetë e kufizuar</translation>
diff --git a/ash/strings/ash_strings_sr-Latn.xtb b/ash/strings/ash_strings_sr-Latn.xtb index 2f6f445..0b99af7 100644 --- a/ash/strings/ash_strings_sr-Latn.xtb +++ b/ash/strings/ash_strings_sr-Latn.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1632985212731562677">Pristup pomoću prekidača može da se onemogući u odeljku Podešavanja > Pristupačnost.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> uređaja</translation> -<translation id="1639239467298939599">Učitavanje</translation> +<translation id="1639239467298939599">Učitava se</translation> <translation id="1654477262762802994">Započnite glasovnu pretragu</translation> <translation id="1668469839109562275">Ugrađeni VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> je preostalo</translation> @@ -327,6 +327,7 @@ <translation id="2894949423239620203">Kabl može da utiče na učinak</translation> <translation id="2903844815300039659">Povezano na mrežu <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Snimci ekrana</translation> +<translation id="2925246975070834767">Probajte automatsko zumiranje da biste bili u centru ekrana. Uključite ga u Brzim podešavanjima.</translation> <translation id="2941112035454246133">Nizak</translation> <translation id="2942350706960889382">Montirana lupa ekrana</translation> <translation id="2942516765047364088">Položaj police</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Prethodno povezani</translation> <translation id="371370241367527062">Prednji mikrofon</translation> <translation id="3713734891607377840">Otvori kada bude završeno</translation> +<translation id="3724279623330129812">Automatsko zumiranje je centriralo kameru</translation> <translation id="3726171378575546917">Aplikacije <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> i još <ph name="UNAVAILABLE_APPS_COUNT" /> nisu na ovom uređaju.</translation> <translation id="3735740477244556633">Sortiraj prema</translation> <translation id="3742055079367172538">Snimak ekrana je napravljen</translation> -<translation id="3761848338953536304">Administrator zahteva da isključite podešavanje zaključavanja SIM kartice</translation> <translation id="3765841986579723851">Izmenjeno danas</translation> <translation id="3771549900096082774">Režim visokog kontrasta</translation> <translation id="3773700760453577392">Administrator je zabranio višestruko prijavljivanje za <ph name="USER_EMAIL" />. Svi korisnici moraju da se odjave da bismo nastavili sa sesijom.</translation> @@ -635,6 +636,7 @@ <translation id="4628757576491864469">Uređaji</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, ocena u zvezdicama <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Promenite verziju uređaja u prethodnu verziju u roku od jednog dana}one{Promenite verziju uređaja u prethodnu verziju u roku od # dana}few{Promenite verziju uređaja u prethodnu verziju u roku od # dana}other{Promenite verziju uređaja u prethodnu verziju u roku od # dana}}</translation> +<translation id="4633636853437260449">Pritisnite Ctrl+W da biste izbrisali</translation> <translation id="4642092649622328492">Napravite delimičan snimak ekrana</translation> <translation id="4644727592819780893">Region je premali da bi stala kamera</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, preporučena aplikacija</translation> @@ -868,7 +870,6 @@ <translation id="598407983968395253">Koristi šablon</translation> <translation id="598882571027504733">Da biste preuzeli ažuriranje, restartujte Chromebook sa priključenom tastasturom.</translation> <translation id="5992218262414051481">Režim visokog kontrasta je omogućen. Pritisnite Ctrl + taster za pretragu + H ponovo da biste ga isključili.</translation> -<translation id="6009656393242168182">Onemogućite podešavanje zaključavanja SIM kartice</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. stranica od <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Izlazak iz režima sa preslikavanjem</translation> <translation id="602001110135236999">Pomeri nalevo</translation>
diff --git a/ash/strings/ash_strings_sr.xtb b/ash/strings/ash_strings_sr.xtb index b22c930..704ec7f 100644 --- a/ash/strings/ash_strings_sr.xtb +++ b/ash/strings/ash_strings_sr.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1632985212731562677">Приступ помоћу прекидача може да се онемогући у одељку Подешавања > Приступачност.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> уређаја</translation> -<translation id="1639239467298939599">Учитавање</translation> +<translation id="1639239467298939599">Учитава се</translation> <translation id="1654477262762802994">Започните гласовну претрагу</translation> <translation id="1668469839109562275">Уграђени VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> је преостало</translation> @@ -327,6 +327,7 @@ <translation id="2894949423239620203">Кабл може да утиче на учинак</translation> <translation id="2903844815300039659">Повезано на мрежу <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Снимци екрана</translation> +<translation id="2925246975070834767">Пробајте аутоматско зумирање да бисте били у центру екрана. Укључите га у Брзим подешавањима.</translation> <translation id="2941112035454246133">Низак</translation> <translation id="2942350706960889382">Монтирана лупа екрана</translation> <translation id="2942516765047364088">Положај полице</translation> @@ -469,10 +470,10 @@ <translation id="3708186454126126312">Претходно повезани</translation> <translation id="371370241367527062">Предњи микрофон</translation> <translation id="3713734891607377840">Отвори када буде завршено</translation> +<translation id="3724279623330129812">Аутоматско зумирање је центрирало камеру</translation> <translation id="3726171378575546917">Апликације <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> и још <ph name="UNAVAILABLE_APPS_COUNT" /> нису на овом уређају.</translation> <translation id="3735740477244556633">Сортирај према</translation> <translation id="3742055079367172538">Снимак екрана је направљен</translation> -<translation id="3761848338953536304">Администратор захтева да искључите подешавање закључавања SIM картице</translation> <translation id="3765841986579723851">Измењено данас</translation> <translation id="3771549900096082774">Режим високог контраста</translation> <translation id="3773700760453577392">Администратор је забранио вишеструко пријављивање за <ph name="USER_EMAIL" />. Сви корисници морају да се одјаве да бисмо наставили са сесијом.</translation> @@ -635,6 +636,7 @@ <translation id="4628757576491864469">Уређаји</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, оцена у звездицама <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Промените верзију уређаја у претходну верзију у року од једног дана}one{Промените верзију уређаја у претходну верзију у року од # дана}few{Промените верзију уређаја у претходну верзију у року од # дана}other{Промените верзију уређаја у претходну верзију у року од # дана}}</translation> +<translation id="4633636853437260449">Притисните Ctrl+W да бисте избрисали</translation> <translation id="4642092649622328492">Направите делимичан снимак екрана</translation> <translation id="4644727592819780893">Регион је премали да би стала камера</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, препоручена апликација</translation> @@ -868,7 +870,6 @@ <translation id="598407983968395253">Користи шаблон</translation> <translation id="598882571027504733">Да бисте преузели ажурирање, рестартујте Chromebook са прикљученом тастастуром.</translation> <translation id="5992218262414051481">Режим високог контраста је омогућен. Притисните Ctrl + тастер за претрагу + H поново да бисте га искључили.</translation> -<translation id="6009656393242168182">Онемогућите подешавање закључавања SIM картице</translation> <translation id="6012623610530968780"><ph name="SELECTED_PAGE" />. страница од <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Излазак из режима са пресликавањем</translation> <translation id="602001110135236999">Помери налево</translation>
diff --git a/ash/strings/ash_strings_sv.xtb b/ash/strings/ash_strings_sv.xtb index c95f2a20..1b4b7577 100644 --- a/ash/strings/ash_strings_sv.xtb +++ b/ash/strings/ash_strings_sv.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1632985212731562677">Brytarstyrning kan inaktiveras under Inställningar > Tillgänglighet</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> enheter</translation> -<translation id="1639239467298939599">Läser in</translation> +<translation id="1639239467298939599">Profilen läses in</translation> <translation id="1654477262762802994">Säg en sökfråga</translation> <translation id="1668469839109562275">Inbyggt VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> kvar</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> och <ph name="UNAVAILABLE_APPS_COUNT" /> till finns inte på enheten.</translation> <translation id="3735740477244556633">Sortera efter</translation> <translation id="3742055079367172538">Skärmbilden har tagits</translation> -<translation id="3761848338953536304">Administratören kräver att du inaktiverar SIM-låsinställningen</translation> <translation id="3765841986579723851">Redigerades i dag</translation> <translation id="3771549900096082774">Högkontrastläge</translation> <translation id="3773700760453577392">En administratör har förbjudit multiinloggning för <ph name="USER_EMAIL" />. Alla användare måste logga ut för att fortsätta.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">Använd mall</translation> <translation id="598882571027504733">Starta om Chromebook-enheten med tangentbordet tillkopplat för att uppdatera.</translation> <translation id="5992218262414051481">Högkontrastläget har aktiverats. Tryck på Ctrl+Sök+H igen om du vill inaktivera det.</translation> -<translation id="6009656393242168182">Inaktivera SIM-låsinställningen</translation> <translation id="6012623610530968780">Sida <ph name="SELECTED_PAGE" /> av <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Spegelläge avslutas</translation> <translation id="602001110135236999">Scrolla åt vänster</translation> @@ -897,6 +895,7 @@ <translation id="619279033188484792">Visa de senaste bilderna, mediefilerna och aviseringar från telefonen på din <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Ladda fullt nu</translation> <translation id="6193431488227440296">Utvecklare</translation> +<translation id="6210042900243040400">Anslut <ph name="NAME" /> som tidigare sparats i <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Nu kan du spela in dig själv och skärmen på samma gång</translation> <translation id="622484624075952240">Ner</translation> <translation id="6231419273573514727">Kringutrustningens prestanda kan vara begränsad</translation>
diff --git a/ash/strings/ash_strings_sw.xtb b/ash/strings/ash_strings_sw.xtb index f70e8ee..cb105e2 100644 --- a/ash/strings/ash_strings_sw.xtb +++ b/ash/strings/ash_strings_sw.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> na zingine <ph name="UNAVAILABLE_APPS_COUNT" /> hazipo kwenye kifaa hiki.</translation> <translation id="3735740477244556633">Panga kwa</translation> <translation id="3742055079367172538">Picha ya skrini imepigwa</translation> -<translation id="3761848338953536304">Msimamizi wako anakuomba uzime mipangilio ya kufunga SIM</translation> <translation id="3765841986579723851">Imebadilishwa leo</translation> <translation id="3771549900096082774">Hali ya Juu ya Utofautishaji</translation> <translation id="3773700760453577392">Msimamizi ameondoa uwezo wa <ph name="USER_EMAIL" /> wa kuingia katika akaunti nyingi kwa wakati mmoja. Watumiaji wote lazima waondoke katika akaunti ili waendelee.</translation> @@ -533,7 +532,7 @@ <translation id="4115378294792113321">Rangi ya damu ya mzee</translation> <translation id="412298498316631026">dirisha</translation> <translation id="4123259114412175274">Ili kufungua Chromebook yako, hakikisha Bluetooth ya simu yako imewashwa</translation> -<translation id="4125970834901680537">Huwezi kutiririsha maudhui ya kwenye programu katika hali ya kompyuta kibao. Jaribu tena katika hali ya kompyuta ya kupakata.</translation> +<translation id="4125970834901680537">Huwezi kutiririsha maudhui kwenye programu katika hali ya kompyuta kibao. Jaribu tena katika hali ya kompyuta ya kupakata.</translation> <translation id="4129129681837227511">Ili uone arifa kwenye skrini iliyofungwa, ifungue ili ubadilishe mipangilio hii</translation> <translation id="4136724716305260864">Umewashwa hadi mawio</translation> <translation id="4146833061457621061">Cheza muziki</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">Tumia kiolezo</translation> <translation id="598882571027504733">Ili upate sasisho, washa Chromebook yako upya huku kibodi ikiwa imeunganishwa.</translation> <translation id="5992218262414051481">Hali ya Utofautishaji wa Juu imewashwa. Bonyeza Ctrl+Search+H tena ili ugeuze na kuizima.</translation> -<translation id="6009656393242168182">Zima mipangilio yako ya kufunga SIM</translation> <translation id="6012623610530968780">Ukurasa wa <ph name="SELECTED_PAGE" /> kati ya <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Inaondoka kwenye hali ya kuakisi</translation> <translation id="602001110135236999">Sogeza kushoto</translation> @@ -907,6 +905,7 @@ <translation id="619279033188484792">Tazama picha, maudhui na arifa za hivi karibuni za simu yako kwenye <ph name="DEVICE_TYPE" /> yako</translation> <translation id="619335566042889110">Chaji betri kikamilifu sasa</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400">Unganisha <ph name="NAME" /> zilizohifadhiwa hapo awali kwenye <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Sasa unaweza kujirekodi wewe mwenyewe na skrini yako kwa wakati mmoja</translation> <translation id="622484624075952240">Chini</translation> <translation id="6231419273573514727">Huenda vifaa unavyounganisha kwenye kompyuta yako visifanye kazi kikamilifu</translation>
diff --git a/ash/strings/ash_strings_ta.xtb b/ash/strings/ash_strings_ta.xtb index 6cf18f3..0fbebb2 100644 --- a/ash/strings/ash_strings_ta.xtb +++ b/ash/strings/ash_strings_ta.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ஆகியவையும் மேலும் <ph name="UNAVAILABLE_APPS_COUNT" /> ஆப்ஸும் இந்தச் சாதனத்தில் இல்லை.</translation> <translation id="3735740477244556633">இதன்படி வரிசைப்படுத்து</translation> <translation id="3742055079367172538">ஸ்கிரீன்ஷாட் எடுக்கப்பட்டது</translation> -<translation id="3761848338953536304">சிம் கார்டைப் பூட்டுவதற்கான அமைப்பை உங்கள் நிர்வாகி முடக்கச் சொல்கிறார்</translation> <translation id="3765841986579723851">இன்று திருத்தப்பட்டது</translation> <translation id="3771549900096082774">அதிக ஒளி மாறுபாட்டுப் பயன்முறை</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" />க்கு, பல உள்நுழைவை நிர்வாகி அனுமதிக்கவில்லை. தொடர, எல்லாப் பயனர்களும் வெளியேற வேண்டும்.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">உங்கள் ஆப்ஸை மறுவரிசைப்படுத்த, எங்கேயாவது தொட்டுப் பிடிக்கவும்</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />ன் மேல் <ph name="DRAGGED_APP_NAME" />ஐ இழுத்துவிடுகிறீர்கள். ஃபோல்டரை உருவாக்க, விடுவிக்கவும்.</translation> <translation id="5397578532367286026">இந்தப் பயனரின் பயன்பாடு மற்றும் வரலாறு chrome.com இன் நிர்வாகியால் (<ph name="MANAGER_EMAIL" />) மதிப்பாய்வு செய்யப்படும்.</translation> +<translation id="5399673806694250334">நிலைத் தட்டு, நேரம் <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">விரைவு அமைப்புகள், அறிவிப்பு மையத்தை அணுக, தேடல் + இடது அம்புக்குறியை அழுத்தவும்.</translation> <translation id="5426063383988017631">அமைப்புகள் மெனு மூடப்பட்டது</translation> <translation id="5428899915242071344">தேர்ந்தெடுப்பதைத் தொடங்கு</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">டெம்ப்ளேட்டைப் பயன்படுத்து</translation> <translation id="598882571027504733">புதுப்பிப்பைப் பெற, கீபோர்டு இணைக்கப்பட்ட உங்கள் Chromebookஐ மீண்டும் தொடங்கவும்.</translation> <translation id="5992218262414051481">அதிக ஒளி மாறுபாட்டுப் பயன்முறை இயக்கப்பட்டது. அதை முடக்க, Ctrl+தேடல்+Hஐ மீண்டும் அழுத்தவும்.</translation> -<translation id="6009656393242168182">உங்கள் சிம் கார்டைப் பூட்டுவதற்கான அமைப்பை முடக்குங்கள்</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" /> இல் <ph name="SELECTED_PAGE" />வது பக்கம்</translation> <translation id="6018164090099858612">கண்ணாடிப் பயன்முறையிலிருந்து வெளியேறுகிறது</translation> <translation id="602001110135236999">இடப்புறம் செல்</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">மொபைலில் உள்ள சமீபத்திய படங்கள், மீடியா, அறிவிப்புகள் ஆகியவற்றை <ph name="DEVICE_TYPE" /> இல் பார்க்கலாம்</translation> <translation id="619335566042889110">இப்போதே சார்ஜ் செய்க</translation> <translation id="6193431488227440296">Dev</translation> +<translation id="6210042900243040400"><ph name="EMAIL" /> என்ற கணக்கில் இதற்குமுன்பு சேமிக்கப்பட்ட <ph name="NAME" /> சாதனத்தை இணைக்கவும்</translation> <translation id="6220928844947387476">இப்போது ஒரே சமயத்தில் உங்கள் வீடியோவையும் திரையையும் ரெக்கார்டு செய்யலாம்</translation> <translation id="622484624075952240">கீழ்</translation> <translation id="6231419273573514727">சாதனத்தின் செயல்திறன் குறைக்கப்பட்டிருக்கலாம்</translation>
diff --git a/ash/strings/ash_strings_te.xtb b/ash/strings/ash_strings_te.xtb index 1fc4f130..eeff3af 100644 --- a/ash/strings/ash_strings_te.xtb +++ b/ash/strings/ash_strings_te.xtb
@@ -125,7 +125,7 @@ <translation id="1620510694547887537">కెమెరా</translation> <translation id="1632985212731562677">సెట్టింగ్లు > యాక్సెసిబిలిటీలో స్విచ్ యాక్సెస్ను డిజేబుల్ చేయవచ్చు.</translation> <translation id="1637505162081889933"><ph name="NUM_DEVICES" /> పరికరాలు</translation> -<translation id="1639239467298939599">లోడ్ అవుతోంది</translation> +<translation id="1639239467298939599">లోడ్ చేస్తోంది</translation> <translation id="1654477262762802994">వాయిస్ ప్రశ్నను ప్రారంభించు</translation> <translation id="1668469839109562275">బిల్ట్-ఇన్ VPN</translation> <translation id="1677472565718498478"><ph name="TIME" /> మిగిలి ఉంది</translation> @@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, మరో<ph name="UNAVAILABLE_APPS_COUNT" /> యాప్లు ఈ పరికరంలో అందుబాటులో లేవు.</translation> <translation id="3735740477244556633">దీని ద్వారా క్రమీకరించు</translation> <translation id="3742055079367172538">స్క్రీన్షాట్ తీసినప్పుడు</translation> -<translation id="3761848338953536304">మీరు లాక్ SIM సెట్టింగ్ను ఆఫ్ చేయవలసిందిగా మీ అడ్మినిస్ట్రేటర్ రిక్వెస్ట్ చేస్తున్నారు</translation> <translation id="3765841986579723851">ఈ రోజు ఎడిట్ చేశారు</translation> <translation id="3771549900096082774">అధిక కాంట్రాస్ట్ మోడ్</translation> <translation id="3773700760453577392"><ph name="USER_EMAIL" /> కోసం బహుళ సైన్-ఇన్ అనుమతిని నిర్వాహకుడు తిరస్కరించారు. @@ -759,7 +758,7 @@ <translation id="5391307769715781764">సేవ్ చేసిన డెస్క్ను రీప్లేస్ చేయాలా?</translation> <translation id="5393156353051693207">మీ యాప్ల క్రమాన్ని మార్చడానికి ఎక్కడైనా తాకి, నొక్కి ఉంచండి</translation> <translation id="5395308026110844773"><ph name="IN_PLACE_APP" />పై భాగాన <ph name="DRAGGED_APP_NAME" /> ఉంది, ఫోల్డర్ క్రియేట్ చేయడానికి రిలీజ్ చేయండి.</translation> -<translation id="5397578532367286026">ఈ వినియోగదారు యొక్క వినియోగం మరియు చరిత్రను chrome.comలో నిర్వాహకుడు (<ph name="MANAGER_EMAIL" />) సమీక్షించవచ్చు.</translation> +<translation id="5397578532367286026">ఈ వినియోగదారు యొక్క వినియోగం మరియు హిస్టరీని chrome.comలో నిర్వాహకుడు (<ph name="MANAGER_EMAIL" />) సమీక్షించవచ్చు.</translation> <translation id="5399673806694250334">స్టేటస్ ట్రే, సమయం <ph name="TIME" />, <ph name="BATTERY" /> <ph name="CHANNEL" /> @@ -868,7 +867,6 @@ <translation id="598407983968395253">టెంప్లేట్ను ఉపయోగించండి</translation> <translation id="598882571027504733">అప్డేట్ను పొందడానికి, కీబోర్డ్ను అలానే జోడించి ఉంచి మీ Chromebookను పునఃప్రారంభించండి.</translation> <translation id="5992218262414051481">అధిక క్రాంటాస్ట్ మోడ్ ఆరంభించబడింది. దానిని ఆఫ్కు టోగుల్ చేయడం కోసం మళ్లీ Ctrl+Search+Hను నొక్కండి.</translation> -<translation id="6009656393242168182">మీ SIM లాక్ సెట్టింగ్ను డిజేబుల్ చేయండి</translation> <translation id="6012623610530968780"><ph name="TOTAL_PAGE_NUM" />లో <ph name="SELECTED_PAGE" />వ పేజీ</translation> <translation id="6018164090099858612">ప్రతిబింబ మోడ్ నుండి నిష్క్రమిస్తోంది</translation> <translation id="602001110135236999">ఎడమకు స్క్రోల్ చేయి</translation>
diff --git a/ash/strings/ash_strings_th.xtb b/ash/strings/ash_strings_th.xtb index ade6eb1b..fbaf355 100644 --- a/ash/strings/ash_strings_th.xtb +++ b/ash/strings/ash_strings_th.xtb
@@ -470,10 +470,10 @@ <translation id="3708186454126126312">อุปกรณ์ที่เคยเชื่อมต่อ</translation> <translation id="371370241367527062">ไมโครโฟนด้านหน้า</translation> <translation id="3713734891607377840">เปิดเมื่อดาวน์โหลดเสร็จ</translation> +<translation id="3724279623330129812">ซูมอัตโนมัติให้อยู่ตรงกลางกล้อง</translation> <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> และอีก<ph name="UNAVAILABLE_APPS_COUNT" /> แอปไม่ได้อยู่ในอุปกรณ์</translation> <translation id="3735740477244556633">จัดเรียงตาม</translation> <translation id="3742055079367172538">ภาพหน้าจอที่บันทึก</translation> -<translation id="3761848338953536304">ผู้ดูแลระบบขอให้คุณปิดการตั้งค่าการล็อกซิม</translation> <translation id="3765841986579723851">แก้ไขวันนี้</translation> <translation id="3771549900096082774">โหมดคอนทราสต์สูง</translation> <translation id="3773700760453577392">ผู้ดูแลระบบไม่อนุญาตให้ <ph name="USER_EMAIL" /> ลงชื่อเข้าสู่ระบบพร้อมกันหลายบัญชี ผู้ใช้ทุกคนต้องออกจากระบบเพื่อดำเนินการต่อ</translation> @@ -859,7 +859,6 @@ <translation id="598407983968395253">ใช้เทมเพลต</translation> <translation id="598882571027504733">หากต้องการรับอัปเดต ให้รีสตาร์ท Chromebook ในขณะที่ยังเชื่อมต่อกับแป้นพิมพ์</translation> <translation id="5992218262414051481">เปิดใช้โหมดคอนทราสต์สูงอยู่ กด Ctrl+Search+H อีกครั้งเพื่อสลับเป็นปิด</translation> -<translation id="6009656393242168182">ปิดใช้การตั้งค่าการล็อกซิม</translation> <translation id="6012623610530968780">หน้า <ph name="SELECTED_PAGE" /> จาก <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">กำลังออกจากโหมดมิเรอร์</translation> <translation id="602001110135236999">เลื่อนไปทางซ้าย</translation> @@ -899,6 +898,7 @@ <translation id="619279033188484792">ดูรูปภาพ สื่อ และการแจ้งเตือนล่าสุดของโทรศัพท์ใน <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">ชาร์จจนเต็มเลย</translation> <translation id="6193431488227440296">กำลังพัฒนา</translation> +<translation id="6210042900243040400">เชื่อมต่อ <ph name="NAME" /> ที่บันทึกไว้ก่อนหน้านี้ใน <ph name="EMAIL" /></translation> <translation id="6220928844947387476">ตอนนี้สามารถบันทึกตัวคุณเองไปพร้อมกับหน้าจอได้แล้ว</translation> <translation id="622484624075952240">ลง</translation> <translation id="6231419273573514727">อุปกรณ์ต่อพ่วงอาจมีประสิทธิภาพจำกัด</translation>
diff --git a/ash/strings/ash_strings_tr.xtb b/ash/strings/ash_strings_tr.xtb index 2136370..f35544e 100644 --- a/ash/strings/ash_strings_tr.xtb +++ b/ash/strings/ash_strings_tr.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> ve <ph name="UNAVAILABLE_APPS_COUNT" /> uygulama daha bu cihazda yok.</translation> <translation id="3735740477244556633">Sıralama ölçütü</translation> <translation id="3742055079367172538">Ekran görüntüsü alındı</translation> -<translation id="3761848338953536304">Yöneticiniz, SIM Kilidi ayarını devre dışı bırakmanızı istiyor</translation> <translation id="3765841986579723851">Bugün düzenlendi</translation> <translation id="3771549900096082774">Yüksek Kontrast Modu</translation> <translation id="3773700760453577392">Bir yönetici <ph name="USER_EMAIL" /> için çoklu oturum açmayı engellemiş. Tüm kullanıcılar devam etmek için çıkış yapmalıdır.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Uygulamalarınızı yeniden sıralamak için herhangi bir yere dokunup basılı tutun</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> uygulaması <ph name="IN_PLACE_APP" /> uygulamasının üzerinde, klasör oluşturmak için serbest bırakın.</translation> <translation id="5397578532367286026">Bu kullanıcıyla ilgili kullanım ve geçmiş bilgileri, yönetici (<ph name="MANAGER_EMAIL" />) tarafından chrome.com adresinden incelenebilir.</translation> +<translation id="5399673806694250334">Durum tepsisi, saat <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Hızlı Ayarlar, Bildirim merkezine erişmek için arama + sol tuşlarına basın.</translation> <translation id="5426063383988017631">Ayarlar menüsü kapatıldı</translation> <translation id="5428899915242071344">Seçmeye başla</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Şablonu kullan</translation> <translation id="598882571027504733">Güncellemeyi almak için Chromebook'unuzu klavye takılıyken yeniden başlatın.</translation> <translation id="5992218262414051481">Yüksek Kontrast Modu etkinleştirildi. Modu kapatmak için tekrar Ctrl+Arama+H tuşlarına basın.</translation> -<translation id="6009656393242168182">SIM Kilidi ayarınızı devre dışı bırakın</translation> <translation id="6012623610530968780">Sayfa <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ayna modundan çıkılıyor</translation> <translation id="602001110135236999">Sola kaydır</translation>
diff --git a/ash/strings/ash_strings_uk.xtb b/ash/strings/ash_strings_uk.xtb index 9627dc0..d82af97 100644 --- a/ash/strings/ash_strings_uk.xtb +++ b/ash/strings/ash_strings_uk.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">На цьому пристрої не встановлено додатки <ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> і ще <ph name="UNAVAILABLE_APPS_COUNT" />.</translation> <translation id="3735740477244556633">Параметри сортування</translation> <translation id="3742055079367172538">Знімок екрана зроблено</translation> -<translation id="3761848338953536304">Ваш адміністратор просить вимкнути налаштування блокування вашої SIM-карти</translation> <translation id="3765841986579723851">Змінено сьогодні</translation> <translation id="3771549900096082774">Режим високого контрасту</translation> <translation id="3773700760453577392">Адміністратор заборонив паралельний вхід користувачеві <ph name="USER_EMAIL" />. Щоб продовжити, усі користувачі повинні вийти.</translation> @@ -759,6 +758,16 @@ <translation id="5393156353051693207">Натисніть і втримуйте будь-яке місце, щоб змінити порядок додатків</translation> <translation id="5395308026110844773"><ph name="DRAGGED_APP_NAME" /> перетягнено на додаток <ph name="IN_PLACE_APP" />. Відпустіть, щоб створити папку.</translation> <translation id="5397578532367286026">Менеджер (<ph name="MANAGER_EMAIL" />) може переглядати дії й історію цього користувача на chrome.com.</translation> +<translation id="5399673806694250334">Панель статусу, час: <ph name="TIME" />, + <ph name="BATTERY" /> + <ph name="CHANNEL" /> + <ph name="NETWORK" />, + <ph name="MIC" />, + <ph name="CAMERA" />, + <ph name="MANAGED" /> + <ph name="NOTIFICATION" />, + <ph name="IME" /> + <ph name="LOCALE" /></translation> <translation id="5400461572260843123">Швидкі налаштування: натисніть клавішу пошуку + стрілку ліворуч, щоб перейти в центр сповіщень.</translation> <translation id="5426063383988017631">Меню налаштувань закрито</translation> <translation id="5428899915242071344">Почати вибір</translation> @@ -857,7 +866,6 @@ <translation id="598407983968395253">Використати шаблон</translation> <translation id="598882571027504733">Щоб завантажити оновлення, перезапустіть Chromebook із під’єднаною клавіатурою.</translation> <translation id="5992218262414051481">Увімкнено режим високого контрасту. Щоб вимкнути його, знову натисніть Ctrl+Search+H.</translation> -<translation id="6009656393242168182">Вимкніть налаштування блокування SIM-карти</translation> <translation id="6012623610530968780">Сторінка <ph name="SELECTED_PAGE" /> з <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Вихід із режиму віддзеркалення</translation> <translation id="602001110135236999">Прокрутити ліворуч</translation> @@ -897,6 +905,7 @@ <translation id="619279033188484792">Переглядайте нещодавні фотографії, медіаконтент і сповіщення з телефона на пристрої <ph name="DEVICE_TYPE" /></translation> <translation id="619335566042889110">Зарядити повністю</translation> <translation id="6193431488227440296">Версія для розробників</translation> +<translation id="6210042900243040400">Підключіть пристрій <ph name="NAME" />, який уже збережено в обліковому записі <ph name="EMAIL" /></translation> <translation id="6220928844947387476">Тепер ви можете робити запис з екрана й веб-камери одночасно</translation> <translation id="622484624075952240">Донизу</translation> <translation id="6231419273573514727">Ефективність периферійних пристроїв може бути обмежена</translation>
diff --git a/ash/strings/ash_strings_ur.xtb b/ash/strings/ash_strings_ur.xtb index 9c69787..9f52197 100644 --- a/ash/strings/ash_strings_ur.xtb +++ b/ash/strings/ash_strings_ur.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />، <ph name="UNAVAILABLE_APPS_TWO" />، اور <ph name="UNAVAILABLE_APPS_COUNT" /> مزید اس آلہ پر موجود نہیں ہے۔</translation> <translation id="3735740477244556633">ترتیب دیں بلحاظ</translation> <translation id="3742055079367172538">اسکرین شاٹ لی گئی</translation> -<translation id="3761848338953536304">آپ کا منتظم درخواست کر رہا ہے کہ آپ لاک SIM کی ترتیب کو بند کر دیں</translation> <translation id="3765841986579723851">آج ترمیم کیا گیا</translation> <translation id="3771549900096082774">اعلی تناسب امتزاج وضع</translation> <translation id="3773700760453577392">منتظم نے <ph name="USER_EMAIL" /> کیلئے متعدد سائن ان کی اجازت نہیں دی ہے۔ جاری رکھنے کیلئے تمام صارفین کا سائن آؤٹ کرنا لازمی ہے۔</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">تمثیل استعمال کریں</translation> <translation id="598882571027504733">اپ ڈیٹ حاصل کرنے کیلئے، منسلک شدہ کی بورڈ سے اپنا Chromebook دوبارہ شروع کریں۔</translation> <translation id="5992218262414051481">اعلی تناسب امتزاج کی وضع فعال ہے۔ اسے آف ٹوگل کرنے کیلئے Ctrl+Search+H کو دوبارہ دبائیں۔</translation> -<translation id="6009656393242168182">اپنے SIM لاک کی ترتیب کو غیر فعال کریں</translation> <translation id="6012623610530968780">صفحہ <ph name="TOTAL_PAGE_NUM" /> کا <ph name="SELECTED_PAGE" /></translation> <translation id="6018164090099858612">مرر وضع سے باہر نکل رہے ہیں</translation> <translation id="602001110135236999">بائیں اسکرول کریں</translation>
diff --git a/ash/strings/ash_strings_uz.xtb b/ash/strings/ash_strings_uz.xtb index bbfdc65..8f2c71a 100644 --- a/ash/strings/ash_strings_uz.xtb +++ b/ash/strings/ash_strings_uz.xtb
@@ -473,7 +473,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" /> va yana <ph name="UNAVAILABLE_APPS_COUNT" /> ta ilova bu qurilmada emas.</translation> <translation id="3735740477244556633">Saralash tartibi</translation> <translation id="3742055079367172538">Ekran suratga olindi</translation> -<translation id="3761848338953536304">Administratoringiz SIM kartani qulflash sozlamasini faolsizlantirishni talab qilmoqda</translation> <translation id="3765841986579723851">Bugun tahrirlangan</translation> <translation id="3771549900096082774">Yuqori kontrastli rejim</translation> <translation id="3773700760453577392">Administrator <ph name="USER_EMAIL" /> hisobi uchun bir multi-kirish imkoniyatini o‘chirib qo‘ydi. Hisobga kirishingizdan avval barcha foydalanuvchilar hisobdan chiqishi kerak.</translation> @@ -869,7 +868,6 @@ <translation id="598407983968395253">Andozadan foydalanish</translation> <translation id="598882571027504733">Yangilanishni o‘rnatish uchun Chromebook qurilmangizni tashqi klavuatura orqali o‘chirib yoqing.</translation> <translation id="5992218262414051481">Yuqori kontrastli rejim yoniq. O‘chirib qo‘yish uchun Ctrl+Qidiruv+H tugmalarini bosing.</translation> -<translation id="6009656393242168182">SIM karta qulfi sozlamasini faolsizlantiring</translation> <translation id="6012623610530968780">Sahifa: <ph name="SELECTED_PAGE" /> / <ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Translatsiya rejimidan chiqish</translation> <translation id="602001110135236999">Chapga aylantirish</translation>
diff --git a/ash/strings/ash_strings_vi.xtb b/ash/strings/ash_strings_vi.xtb index 4325643..d77aa00e 100644 --- a/ash/strings/ash_strings_vi.xtb +++ b/ash/strings/ash_strings_vi.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">Cáp có thể ảnh hưởng đến hiệu suất</translation> <translation id="2903844815300039659">Đã kết nối tới <ph name="NAME" />, <ph name="STRENGTH" /></translation> <translation id="2914580577416829331">Ảnh chụp màn hình</translation> +<translation id="2925246975070834767">Thử dùng tính năng tự động thu phóng để bạn nằm ở chính giữa màn hình. Bạn có thể bật tính năng này trong phần Cài đặt nhanh.</translation> <translation id="2941112035454246133">Thấp</translation> <translation id="2942350706960889382">Phóng to ở vị trí cố định</translation> <translation id="2942516765047364088">Vị trí kệ</translation> @@ -473,7 +474,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, và <ph name="UNAVAILABLE_APPS_COUNT" /> ứng dụng khác không có trên thiết bị này.</translation> <translation id="3735740477244556633">Sắp xếp theo</translation> <translation id="3742055079367172538">Ảnh màn hình đã chụp</translation> -<translation id="3761848338953536304">Quản trị viên của bạn đang yêu cầu bạn tắt chế độ Khoá SIM</translation> <translation id="3765841986579723851">Chỉnh sửa hôm nay</translation> <translation id="3771549900096082774">Chế độ tương phản cao</translation> <translation id="3773700760453577392">Quản trị viên không cho phép <ph name="USER_EMAIL" /> thực hiện đăng nhập nhiều tài khoản. Tất cả người dùng phải đăng xuất để tiếp tục.</translation> @@ -635,6 +635,7 @@ <translation id="4628757576491864469">Thiết bị</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />, Xếp hạng theo sao <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{Hạ cấp hệ điều hành trên thiết bị về phiên bản trước trong vòng một ngày}other{Hạ cấp hệ điều hành trên thiết bị về phiên bản trước trong vòng # ngày}}</translation> +<translation id="4633636853437260449">Nhấn tổ hợp phím Ctrl+W để xoá</translation> <translation id="4642092649622328492">Chụp ảnh một phần màn hình</translation> <translation id="4644727592819780893">Kích thước khu vực quá nhỏ, không đủ để chụp</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />, Ứng dụng đề xuất</translation> @@ -868,7 +869,6 @@ <translation id="598407983968395253">Sử dụng mẫu</translation> <translation id="598882571027504733">Để cập nhật, hãy khởi động lại Chromebook bằng bàn phím đã kết nối.</translation> <translation id="5992218262414051481">Đã bật Chế độ tương phản cao. Nhấn lại Ctrl+Search+H để tắt.</translation> -<translation id="6009656393242168182">Tắt chế độ Khoá SIM</translation> <translation id="6012623610530968780">Trang <ph name="SELECTED_PAGE" />/<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Đang thoát chế độ phản chiếu</translation> <translation id="602001110135236999">Cuộn sang trái</translation>
diff --git a/ash/strings/ash_strings_zh-CN.xtb b/ash/strings/ash_strings_zh-CN.xtb index d93ad02..c8fe41b 100644 --- a/ash/strings/ash_strings_zh-CN.xtb +++ b/ash/strings/ash_strings_zh-CN.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917">无法在此设备上使用<ph name="UNAVAILABLE_APPS_ONE" />、<ph name="UNAVAILABLE_APPS_TWO" />以及另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 个应用。</translation> <translation id="3735740477244556633">排序依据</translation> <translation id="3742055079367172538">已完成屏幕截图</translation> -<translation id="3761848338953536304">您的管理员正在要求您关闭 SIM 卡锁定设置</translation> <translation id="3765841986579723851">今天修改过</translation> <translation id="3771549900096082774">高反差模式</translation> <translation id="3773700760453577392">管理员已禁止 <ph name="USER_EMAIL" /> 使用多帐号登录功能。所有用户都必须先退出帐号才能继续。</translation> @@ -867,7 +866,6 @@ <translation id="598407983968395253">使用模板</translation> <translation id="598882571027504733">要想获取此项更新,请在已连接该键盘的情况下重新启动您的 Chromebook。</translation> <translation id="5992218262414051481">已启用高反差模式。再按一次 Ctrl+搜索键+H 组合键即可关闭此模式。</translation> -<translation id="6009656393242168182">停用您的 SIM 卡锁定设置</translation> <translation id="6012623610530968780">第 <ph name="SELECTED_PAGE" /> 页(共 <ph name="TOTAL_PAGE_NUM" /> 页)</translation> <translation id="6018164090099858612">正在退出镜像模式</translation> <translation id="602001110135236999">向左滚动</translation>
diff --git a/ash/strings/ash_strings_zh-HK.xtb b/ash/strings/ash_strings_zh-HK.xtb index da015fb3..78da7fd 100644 --- a/ash/strings/ash_strings_zh-HK.xtb +++ b/ash/strings/ash_strings_zh-HK.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">連接線可能會影響效能</translation> <translation id="2903844815300039659">連咗線去 <ph name="NAME" />,<ph name="STRENGTH" /></translation> <translation id="2914580577416829331">螢幕截圖</translation> +<translation id="2925246975070834767">試用自動縮放,便可以令自己保持在螢幕中央。請在「快速設定」中開啟自動縮放。</translation> <translation id="2941112035454246133">低</translation> <translation id="2942350706960889382">固定的放大鏡</translation> <translation id="2942516765047364088">捷徑列位置</translation> @@ -472,7 +473,6 @@ <translation id="3726171378575546917">此裝置上未安裝「<ph name="UNAVAILABLE_APPS_ONE" />」、「<ph name="UNAVAILABLE_APPS_TWO" />」和另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 個應用程式。</translation> <translation id="3735740477244556633">排序方式</translation> <translation id="3742055079367172538">已拍攝螢幕擷圖</translation> -<translation id="3761848338953536304">管理員要求您關閉 SIM 卡鎖定設定</translation> <translation id="3765841986579723851">今天編輯過</translation> <translation id="3771549900096082774">高對比模式</translation> <translation id="3773700760453577392">管理員已禁止 <ph name="USER_EMAIL" /> 的多重登入功能。所有使用者都必須登出,才能繼續操作。</translation> @@ -634,6 +634,7 @@ <translation id="4628757576491864469">裝置</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />,<ph name="RATING_SCORE" /> 星</translation> <translation id="4633185660152240791">{0,plural, =1{在 1 天內將裝置回復為先前的版本}other{在 # 天內將裝置回復為先前的版本}}</translation> +<translation id="4633636853437260449">㩒一下 Ctrl+W 就可以刪除</translation> <translation id="4642092649622328492">擷取部分螢幕畫面</translation> <translation id="4644727592819780893">區域太小,無法顯示攝錄機預覽畫面</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />,推薦應用程式</translation> @@ -866,7 +867,6 @@ <translation id="598407983968395253">使用範本</translation> <translation id="598882571027504733">如要下載更新,請連接鍵盤並重新啟動 Chromebook。</translation> <translation id="5992218262414051481">已啟用高對比模式。再次按下 Ctrl+Search+H 鍵即可停用。</translation> -<translation id="6009656393242168182">停用 SIM 卡鎖定設定</translation> <translation id="6012623610530968780">第 <ph name="SELECTED_PAGE" /> 頁 (共 <ph name="TOTAL_PAGE_NUM" /> 頁)</translation> <translation id="6018164090099858612">正在退出鏡像模式</translation> <translation id="602001110135236999">向左捲動</translation>
diff --git a/ash/strings/ash_strings_zh-TW.xtb b/ash/strings/ash_strings_zh-TW.xtb index 3fb47fd..11e8ea5 100644 --- a/ash/strings/ash_strings_zh-TW.xtb +++ b/ash/strings/ash_strings_zh-TW.xtb
@@ -327,6 +327,7 @@ <translation id="2894949423239620203">連接線可能會影響效能</translation> <translation id="2903844815300039659">已連上 <ph name="NAME" />,<ph name="STRENGTH" /></translation> <translation id="2914580577416829331">螢幕截圖</translation> +<translation id="2925246975070834767">你可以試試自動放大功能,讓自己保持在視訊畫面的中央位置。你可以在「快速設定」中開啟這項功能。</translation> <translation id="2941112035454246133">低</translation> <translation id="2942350706960889382">停駐放大鏡</translation> <translation id="2942516765047364088">檔案櫃位置</translation> @@ -472,7 +473,6 @@ <translation id="3726171378575546917">這部裝置未安裝「<ph name="UNAVAILABLE_APPS_ONE" />」、「<ph name="UNAVAILABLE_APPS_TWO" />」和另外 <ph name="UNAVAILABLE_APPS_COUNT" /> 個應用程式。</translation> <translation id="3735740477244556633">排序依據</translation> <translation id="3742055079367172538">已拍攝螢幕截圖</translation> -<translation id="3761848338953536304">系統管理員要求你關閉 SIM 卡鎖定設定</translation> <translation id="3765841986579723851">今天編輯過</translation> <translation id="3771549900096082774">高對比模式</translation> <translation id="3773700760453577392">管理員已禁止 <ph name="USER_EMAIL" /> 的多重登入功能。所有使用者都必須登出,才能繼續操作。</translation> @@ -634,6 +634,7 @@ <translation id="4628757576491864469">裝置</translation> <translation id="4631891353005174729"><ph name="APP_NAME_TYPE" />,星級評等 <ph name="RATING_SCORE" /></translation> <translation id="4633185660152240791">{0,plural, =1{在 1 天內將裝置復原為先前的版本}other{在 # 天內將裝置復原為先前的版本}}</translation> +<translation id="4633636853437260449">按下 Ctrl 和 W 鍵即可刪除</translation> <translation id="4642092649622328492">擷取部分螢幕畫面</translation> <translation id="4644727592819780893">區域太小,無法顯示攝影機預覽畫面</translation> <translation id="4648249871170053485"><ph name="APP_NAME" />,推薦的應用程式</translation> @@ -867,7 +868,6 @@ <translation id="598407983968395253">使用範本</translation> <translation id="598882571027504733">如要更新,請連接鍵盤並重新啟動 Chromebook。</translation> <translation id="5992218262414051481">高對比模式已啟用。再次按下 Ctrl 鍵 + 搜尋鍵 + H 鍵即可停用。</translation> -<translation id="6009656393242168182">停用 SIM 卡鎖定設定</translation> <translation id="6012623610530968780">第 <ph name="SELECTED_PAGE" /> 頁 (共 <ph name="TOTAL_PAGE_NUM" /> 頁)</translation> <translation id="6018164090099858612">退出鏡像模式</translation> <translation id="602001110135236999">向左捲動</translation>
diff --git a/ash/strings/ash_strings_zu.xtb b/ash/strings/ash_strings_zu.xtb index 7c5c370..12622e1d 100644 --- a/ash/strings/ash_strings_zu.xtb +++ b/ash/strings/ash_strings_zu.xtb
@@ -472,7 +472,6 @@ <translation id="3726171378575546917"><ph name="UNAVAILABLE_APPS_ONE" />, <ph name="UNAVAILABLE_APPS_TWO" />, nangu-<ph name="UNAVAILABLE_APPS_COUNT" /> ngaphezulu awekho kule divayisi.</translation> <translation id="3735740477244556633">Hlunga nge-</translation> <translation id="3742055079367172538">Kuthathwe isithombe-skrini</translation> -<translation id="3761848338953536304">Umlawuli wakho ucela ukuthi uvale isethingi Lokukhiya i-SIM</translation> <translation id="3765841986579723851">Kuhlelwe namuhla</translation> <translation id="3771549900096082774">Imodi yokugqama okuphezulu</translation> <translation id="3773700760453577392">Umlawuli akazange avumele ukungena ngemvume okuningi kwe-<ph name="USER_EMAIL" />. Bonke abasebenzisi kumele baphume ngemvume ukuze baqhubeke.</translation> @@ -857,7 +856,6 @@ <translation id="598407983968395253">Sebenzisa isifanekiso</translation> <translation id="598882571027504733">Ukuze uthole izibuyekezo, qalisa kabusha i-Chromebook ngekhibhodi enamathiselwe.</translation> <translation id="5992218262414051481">Imodi yokugqama okuphezulu inikwe amandla. Cindezela u-Ctrl+Usesho+H futhi ukuze uyiguqule uyivale.</translation> -<translation id="6009656393242168182">Khubaza isethingi Lokukhiya i-SIM yakho</translation> <translation id="6012623610530968780">Ikhasi elingu-<ph name="SELECTED_PAGE" /> kwangu-<ph name="TOTAL_PAGE_NUM" /></translation> <translation id="6018164090099858612">Ukuphuma kumodi ye-mirror</translation> <translation id="602001110135236999">Skrolela ngakwesokunxele</translation>
diff --git a/ash/style/ash_color_mixer.cc b/ash/style/ash_color_mixer.cc index 86a5e56..e25072d1 100644 --- a/ash/style/ash_color_mixer.cc +++ b/ash/style/ash_color_mixer.cc
@@ -80,15 +80,14 @@ mixer[kColorAshControlBackgroundColorInactive] = use_dark_color ? ui::ColorTransform(SkColorSetA(SK_ColorWHITE, 0x1A)) : ui::ColorTransform(SkColorSetA(SK_ColorBLACK, 0x0D)); - mixer[kColorAshControlBackgroundColorAlert] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleRed300) - : ui::ColorTransform(gfx::kGoogleRed600); + mixer[kColorAshControlBackgroundColorAlert] = {cros_tokens::kColorAlert}; + // TOOD(skau): Replace with kColorWarning when it's determined that light can + // be Yellow900 instead. mixer[kColorAshControlBackgroundColorWarning] = use_dark_color ? ui::ColorTransform(gfx::kGoogleYellow300) : ui::ColorTransform(gfx::kGoogleYellow600); - mixer[kColorAshControlBackgroundColorPositive] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleGreen300) - : ui::ColorTransform(gfx::kGoogleGreen600); + mixer[kColorAshControlBackgroundColorPositive] = { + cros_tokens::kColorPositive}; mixer[kColorAshFocusAuraColor] = ui::SetAlpha(cros_tokens::kColorProminent, 0x3D); mixer[ui::kColorAshFocusRing] = {cros_tokens::kColorProminent}; @@ -111,15 +110,9 @@ : ui::ColorTransform(SkColorSetA(SK_ColorBLACK, 0x24)); mixer[kColorAshTextColorPrimary] = {cros_tokens::kColorPrimary}; mixer[kColorAshTextColorSecondary] = {cros_tokens::kColorSecondary}; - mixer[kColorAshTextColorAlert] = use_dark_color - ? ui::ColorTransform(gfx::kGoogleRed300) - : ui::ColorTransform(gfx::kGoogleRed600); - mixer[kColorAshTextColorWarning] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleYellow300) - : ui::ColorTransform(gfx::kGoogleYellow900); - mixer[kColorAshTextColorPositive] = - use_dark_color ? ui::ColorTransform(gfx::kGoogleGreen300) - : ui::ColorTransform(gfx::kGoogleGreen600); + mixer[kColorAshTextColorAlert] = {cros_tokens::kColorAlert}; + mixer[kColorAshTextColorWarning] = {cros_tokens::kColorWarning}; + mixer[kColorAshTextColorPositive] = {cros_tokens::kColorPositive}; mixer[kColorAshTextColorURL] = {cros_tokens::kColorProminent}; mixer[kColorAshIconColorPrimary] = {kColorAshTextColorPrimary}; mixer[kColorAshIconColorSecondary] = {kColorAshTextColorSecondary}; @@ -368,7 +361,8 @@ mixer[ui::kColorAshActionLabelFocusRingEdit] = { cros_tokens::kColorProminentDark}; - mixer[ui::kColorAshActionLabelFocusRingError] = {gfx::kGoogleRed300}; + mixer[ui::kColorAshActionLabelFocusRingError] = { + cros_tokens::kColorAlertDark}; mixer[ui::kColorAshActionLabelFocusRingHover] = ui::SetAlpha(cros_tokens::kColorPrimaryDark, 0x60);
diff --git a/ash/system/diagnostics/async_log.cc b/ash/system/diagnostics/async_log.cc index cded670..e29bb969b 100644 --- a/ash/system/diagnostics/async_log.cc +++ b/ash/system/diagnostics/async_log.cc
@@ -6,6 +6,9 @@ #include "base/files/file_util.h" #include "base/logging.h" +#include "base/memory/scoped_refptr.h" +#include "base/sequence_checker.h" +#include "base/task/sequenced_task_runner.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -16,6 +19,7 @@ sequenced_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( {base::MayBlock(), base::TaskPriority::USER_VISIBLE, base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}); + DETACH_FROM_SEQUENCE(async_log_checker_); } AsyncLog::~AsyncLog() = default; @@ -23,7 +27,7 @@ void AsyncLog::Append(const std::string& text) { sequenced_task_runner_->PostTask( FROM_HERE, - base::BindOnce(&AsyncLog::AppendImpl, base::Unretained(this), text)); + base::BindOnce(&AsyncLog::AppendImpl, weak_factory_.GetWeakPtr(), text)); } std::string AsyncLog::GetContents() const { @@ -37,7 +41,13 @@ return contents; } +void AsyncLog::SetTaskRunnerForTesting( + const scoped_refptr<base::SequencedTaskRunner>& task_runner) { + sequenced_task_runner_ = std::move(task_runner); +} + void AsyncLog::AppendImpl(const std::string& text) { + DCHECK_CALLED_ON_VALID_SEQUENCE(async_log_checker_); // Ensure file exists. if (!base::PathExists(file_path_)) { CreateFile();
diff --git a/ash/system/diagnostics/async_log.h b/ash/system/diagnostics/async_log.h index c52d6a0..04134c1 100644 --- a/ash/system/diagnostics/async_log.h +++ b/ash/system/diagnostics/async_log.h
@@ -10,6 +10,8 @@ #include "ash/ash_export.h" #include "base/files/file_path.h" #include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "base/sequence_checker.h" #include "base/task/sequenced_task_runner.h" namespace ash { @@ -31,6 +33,9 @@ // Returns the current contents as a string. std::string GetContents() const; + void SetTaskRunnerForTesting( + const scoped_refptr<base::SequencedTaskRunner>& task_runner); + private: // Appends to the file. Run on the the task runner. void AppendImpl(const std::string& text); @@ -43,6 +48,10 @@ // Blockable task runner to enable I/O operations. scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; + SEQUENCE_CHECKER(async_log_checker_); + + // WeakPtr should be destroyed first. + base::WeakPtrFactory<AsyncLog> weak_factory_{this}; }; } // namespace diagnostics
diff --git a/ash/system/diagnostics/async_log_unittest.cc b/ash/system/diagnostics/async_log_unittest.cc index b8ec3d8..b85c191 100644 --- a/ash/system/diagnostics/async_log_unittest.cc +++ b/ash/system/diagnostics/async_log_unittest.cc
@@ -4,12 +4,15 @@ #include "ash/system/diagnostics/async_log.h" +#include <memory> + #include "ash/system/diagnostics/log_test_helpers.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/files/scoped_temp_dir.h" #include "base/run_loop.h" #include "base/test/task_environment.h" +#include "base/test/test_simple_task_runner.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash { @@ -22,7 +25,7 @@ class AsyncLogTest : public testing::Test { public: - AsyncLogTest() { + AsyncLogTest() : task_runner_(new base::TestSimpleTaskRunner) { EXPECT_TRUE(temp_dir_.CreateUniqueTempDir()); log_path_ = temp_dir_.GetPath().AppendASCII(kLogFileName); } @@ -32,6 +35,7 @@ protected: base::test::TaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + scoped_refptr<base::TestSimpleTaskRunner> task_runner_; base::ScopedTempDir temp_dir_; base::FilePath log_path_; @@ -39,6 +43,7 @@ TEST_F(AsyncLogTest, NoWriteEmpty) { AsyncLog log(log_path_); + log.SetTaskRunnerForTesting(task_runner_); // The file won't until it is written to. EXPECT_FALSE(base::PathExists(log_path_)); @@ -49,12 +54,15 @@ TEST_F(AsyncLogTest, WriteEmpty) { AsyncLog log(log_path_); + log.SetTaskRunnerForTesting(task_runner_); // Append empty string to the log. log.Append(""); + EXPECT_TRUE(task_runner_->HasPendingTask()); // Ensure pending tasks complete. - task_environment_.RunUntilIdle(); + task_runner_->RunUntilIdle(); + EXPECT_FALSE(task_runner_->HasPendingTask()); // The file exists. EXPECT_TRUE(base::PathExists(log_path_)); @@ -65,6 +73,7 @@ TEST_F(AsyncLogTest, WriteOneLine) { AsyncLog log(log_path_); + log.SetTaskRunnerForTesting(task_runner_); const std::string line = "Hello"; @@ -72,7 +81,7 @@ log.Append(line); // Ensure pending tasks complete. - task_environment_.RunUntilIdle(); + task_runner_->RunUntilIdle(); // Log contains `line`. EXPECT_EQ(line, log.GetContents()); @@ -80,6 +89,7 @@ TEST_F(AsyncLogTest, WriteMultipleLines) { AsyncLog log(log_path_); + log.SetTaskRunnerForTesting(task_runner_); const std::vector<std::string> lines = { "Line 1", @@ -93,11 +103,29 @@ } // Ensure pending tasks complete. - task_environment_.RunUntilIdle(); + task_runner_->RunUntilIdle(); // Read back the log and split the lines. EXPECT_EQ(lines, GetLogLines(log.GetContents())); } +TEST_F(AsyncLogTest, NoUseAfterFreeCrash) { + auto log = std::make_unique<AsyncLog>(log_path_); + log->SetTaskRunnerForTesting(task_runner_); + + const std::string line_not_written = "Should not be written"; + log->Append(line_not_written); + EXPECT_EQ(1u, task_runner_->NumPendingTasks()); + + // Simulate log destroyed before append can complete. + log.reset(); + + // Attempt to run pending AppendImpl call after AsyncLog destroyed. + task_runner_->RunUntilIdle(); + + EXPECT_FALSE(base::PathExists(log_path_)); + EXPECT_EQ(0u, task_runner_->NumPendingTasks()); +} + } // namespace diagnostics } // namespace ash
diff --git a/ash/system/microphone_mute/microphone_mute_notification_controller.cc b/ash/system/microphone_mute/microphone_mute_notification_controller.cc index 5cb6f41..c3515e9 100644 --- a/ash/system/microphone_mute/microphone_mute_notification_controller.cc +++ b/ash/system/microphone_mute/microphone_mute_notification_controller.cc
@@ -79,8 +79,13 @@ message_center::NotificationPriority priority, bool recreate) { if (mic_mute_on_) { + auto* microphone_mute_notification_delegate = + MicrophoneMuteNotificationDelegate::Get(); + // `MicrophoneMuteNotificationDelegate` is not created in guest mode. + if (!microphone_mute_notification_delegate) + return; absl::optional<std::u16string> app_name = - MicrophoneMuteNotificationDelegate::Get()->GetAppAccessingMicrophone(); + microphone_mute_notification_delegate->GetAppAccessingMicrophone(); if (app_name.has_value() || input_stream_count_) { if (recreate) RemoveMicrophoneMuteNotification();
diff --git a/ash/system/unified/unified_system_info_view.cc b/ash/system/unified/unified_system_info_view.cc index 4f54df0..69c97e7 100644 --- a/ash/system/unified/unified_system_info_view.cc +++ b/ash/system/unified/unified_system_info_view.cc
@@ -138,7 +138,9 @@ Update(); Shell::Get()->system_tray_model()->clock()->AddObserver(this); - SetEnabled(Shell::Get()->system_tray_model()->clock()->IsSettingsAvailable()); + if (!features::IsCalendarViewEnabled()) + SetEnabled( + Shell::Get()->system_tray_model()->clock()->IsSettingsAvailable()); SetInstallFocusRingOnFocus(true); views::FocusRing::Get(this)->SetColorId(ui::kColorAshFocusRing); views::InkDrop::Get(this)->SetMode(views::InkDropHost::InkDropMode::OFF);
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb index 7b866a89..10e7d4878 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_be.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Павярнуць на 90 градусаў па гадзіннікавай стрэлцы</translation> <translation id="1276998909102132017">Відарысы ў галерэі</translation> <translation id="1300209025925956156">Сканіраванне дакумента</translation> +<translation id="1309250603447638106">Ідзе спампоўванне абнаўленняў для функцыі сканіравання дакументаў</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Каб перайсці да іх, націсніце кнопку Пошук + стрэлка ўлева.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Друк</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Перадпрагляд у рэжыме люстэрка</translation> <translation id="2879583609344924966">Камера "<ph name="CAMERA" />" падключана.</translation> +<translation id="2904654629665923749">Сканіраванне дакументаў даступнае</translation> <translation id="2968794441791257519">Фота і відэа, знятыя на камеру, будуць перамешчаны ў папку "Спампоўкі". Іх можна знайсці ў Файлах. Доступ да іх будуць мець праграмы з дазволам на сховішча.</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 99a7ae61..87002308 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">ঘড়ির কাঁটার দিকে ৯০ ডিগ্রি ঘোরান</translation> <translation id="1276998909102132017">গ্যালারির ছবি</translation> <translation id="1300209025925956156">আপনার ডকুমেন্ট স্ক্যান করুন</translation> +<translation id="1309250603447638106">ডকুমেন্ট স্ক্যান করার জন্য আপডেট ডাউনলোড করা হচ্ছে</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />। অ্যাক্সেস করতে Search কীয়ের সাথে 'বাঁদিকের তীরচিহ্ন' একসাথে প্রেস করুন।</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">প্রিন্ট</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">মিরর করার প্রিভিউ</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> প্লাগ-ইন করা হয়েছে।</translation> +<translation id="2904654629665923749">ডকুমেন্ট স্ক্যান করার সুবিধা উপলভ্য</translation> <translation id="2968794441791257519">ক্যামেরায় তোলা ফটো ও ভিডিও ডাউনলোড ফোল্ডারে সরিয়ে দেওয়া হবে। আপনি সেগুলি ফাইল থেকে অ্যাক্সেস করতে পারবেন। আপনার ফটো ও ভিডিওতে স্টোরেজ ব্যবহারের অনুমতি আছে এমন অ্যাপের অ্যাক্সেস থাকবে।</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb index d4cb1856..1296173 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_bs.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Rotiranje 90 stepeni udesno</translation> <translation id="1276998909102132017">Slike iz Galerije</translation> <translation id="1300209025925956156">Skenirajte dokument</translation> +<translation id="1309250603447638106">Preuzimanje ažuriranja za skeniranje dokumenata</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Za pristup pritisnite Pretraživanje + strelicu ulijevo.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Štampaj</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Pregled preslikavanja</translation> <translation id="2879583609344924966">Kamera <ph name="CAMERA" /> je priključena.</translation> +<translation id="2904654629665923749">Dostupno je skeniranje dokumenata</translation> <translation id="2968794441791257519">Fotografije i videozapisi snimljeni kamerom premjestit će se u folder Preuzimanja. Možete im pristupiti u aplikaciji Files. Aplikacije s odobrenjem za pohranu moći će pristupiti vašim fotografijama i videozapisima.</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 0e2fefaaa..d1352289 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Roter 90 grader med uret</translation> <translation id="1276998909102132017">Galleribilleder</translation> <translation id="1300209025925956156">Scan dit dokument</translation> +<translation id="1309250603447638106">Downloader opdateringer til dokumentscanning</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Tryk på søgetasten+venstrepil for at få adgang til dem.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Udskriv</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Forhåndsvisning af spejl</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> er tilsluttet.</translation> +<translation id="2904654629665923749">Dokumentscanning er tilgængelig</translation> <translation id="2968794441791257519">Billeder og videoer, der er taget med kameraet, flyttes til mappen Downloads. Du kan få adgang til dem i Filer. Apps med lagertilladelser får adgang til dine billeder og videoer.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb index e3dec679..23935b18 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_hr.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Zakreni za 90 stupnjeva u smjeru kazaljke na satu</translation> <translation id="1276998909102132017">Slike iz galerije</translation> <translation id="1300209025925956156">Skeniranje dokumenta</translation> +<translation id="1309250603447638106">Preuzimanje ažuriranja za skeniranje dokumenata</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Pretraživanje + strelica lijevo za pristup.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Ispis</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Zrcali pregled</translation> <translation id="2879583609344924966">Kamera <ph name="CAMERA" /> je uključena.</translation> +<translation id="2904654629665923749">Dostupno je skeniranje dokumenata</translation> <translation id="2968794441791257519">Fotografije i videozapisi snimljeni fotoaparatom premjestit će se u mapu Preuzimanja. Možete im pristupiti u Datotekama. Aplikacije s dopuštenjima za pohranu imat će pristup vašim fotografijama i videozapisima.</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 315ad1ed..1b8b2ce 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">時計回りに 90 度回転</translation> <translation id="1276998909102132017">ギャラリー画像</translation> <translation id="1300209025925956156">ドキュメントをスキャンします</translation> +<translation id="1309250603447638106">ドキュメント スキャン機能のアップデートをダウンロードしています</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />。アクセスするには検索+左矢印キーを押します。</translation> <translation id="1393338179284529051">クアッド HD</translation> <translation id="1430915738399379752">印刷</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">ミラー プレビュー</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> が接続されました。</translation> +<translation id="2904654629665923749">ドキュメントをスキャンできます</translation> <translation id="2968794441791257519">カメラで撮影した写真と動画を [ダウンロード] フォルダに移動します。これらの写真や動画には、[ファイル] からアクセスできます。 また、ストレージへのアクセスが許可されているアプリからも、これらの写真や動画にアクセスできます。</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb index 1a09d5e4..55598015 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ka.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">შეტრიალება 90 გრადუსით საათის ისრის მიმართულებით</translation> <translation id="1276998909102132017">გალერეის სურათები</translation> <translation id="1300209025925956156">დაასკანირეთ თქვენი დოკუმენტი</translation> +<translation id="1309250603447638106">მიმდინარეობს განახლებების ჩამოტვირთვა დოკუმენტების სკანირებისთვის</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. წვდომისთვის გამოიყენეთ კლავიშთა კომბინაცია Search + მარცხნივ მიმართული ისარი.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">ბეჭდვა</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">არეკვლის გადახედვა</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> მიერთებულია.</translation> +<translation id="2904654629665923749">ხელმისაწვდომია დოკუმენტების სკანირება</translation> <translation id="2968794441791257519">კამერით გადაღებული ფოტოები და ვიდეოები გადატანილი იქნება „ჩამოტვირთვების“ საქაღალდეში. მათზე წვდომა შეგიძლიათ ფაილების აპიდან. აპები, რომლებსაც მინიჭებული აქვს მეხსიერებაზე წვდომის ნებართვა, შეძლებს თქვენს ფოტოებსა და ვიდეოებზე წვდომას.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb index 1d873b6..552ed11e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_km.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">បង្វិល 90 ដឺក្រេស្របទ្រនិចនាឡិកា</translation> <translation id="1276998909102132017">រូបភាពក្នុងសាលរូបភាព</translation> <translation id="1300209025925956156">ស្កេនឯកសាររបស់អ្នក</translation> +<translation id="1309250603447638106">កំពុងទាញយកកំណែថ្មីសម្រាប់ការស្កេនឯកសារ</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />។ Search + ព្រួញទៅឆ្វេង ដើម្បីចូលប្រើ។</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">បោះពុម្ព</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">ការមើលកញ្ចក់សាកល្បង</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> ត្រូវបានភ្ជាប់។</translation> +<translation id="2904654629665923749">អាចប្រើការស្កេនឯកសារបាន</translation> <translation id="2968794441791257519">រូបថត និងវីដេអូដែលថតដោយប្រើកាមេរ៉ានឹងផ្លាស់ទីទៅក្នុងថតទាញយក។ អ្នកអាចចូលប្រើរូបថត និងវីដេអូទាំងនោះនៅក្នុងកម្មវិធី Files ។ កម្មវិធីដែលមានការអនុញ្ញាតចូលប្រើទំហំផ្ទុកនឹងមានសិទ្ធិចូលប្រើរូបថត និងវីដេអូរបស់អ្នក។</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb index 04a6c4c..5148af6 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_mn.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Цагийн зүүний дагуу 90 хэм эргүүлэх</translation> <translation id="1276998909102132017">Галлерейны зураг</translation> <translation id="1300209025925956156">Документоо скан хийх</translation> +<translation id="1309250603447638106">Документийг скан хийхийн тулд шинэчлэлтүүдийг татаж байна</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Хандахын тулд Хайлт + Зүүн сумыг дарна уу.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Хэвлэх</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Тусгалын урьдчилан үзэх</translation> <translation id="2879583609344924966"><ph name="CAMERA" />-г залгасан байна.</translation> +<translation id="2904654629665923749">Документ скан хийх боломжтой</translation> <translation id="2968794441791257519">Камераар авсан зураг болон видеог Татаж авсан файлын фолдерт зөөнө. Та тэдгээрт Файлс цэсээс хандаж болно. Хадгалах сангийн зөвшөөрөлтэй аппууд таны зураг болон видеонд хандах эрхтэй болно.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb index 83cdc00..508134f2e 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ms.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Putar 90 darjah mengikut arah jam</translation> <translation id="1276998909102132017">Imej galeri</translation> <translation id="1300209025925956156">Imbas dokumen anda</translation> +<translation id="1309250603447638106">Memuat turun kemaskinian untuk pengimbasan dokumen</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Carian + Anak panah ke kiri untuk mengakses.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Cetak</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Pratonton cermin</translation> <translation id="2879583609344924966">Palam <ph name="CAMERA" /> dipasang.</translation> +<translation id="2904654629665923749">Imbasan dokumen tersedia</translation> <translation id="2968794441791257519">Foto dan video yang diambil dengan kamera akan dialihkan ke folder Muat Turun. Anda boleh mengakses foto dan video itu dalam Fail. Apl yang diberikan kebenaran storan boleh mengakses foto dan video anda.</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 143556b..03e5fa1 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">၉၀ ဒီဂရီ နာရီလက်တံအတိုင်း လှည့်ရန်</translation> <translation id="1276998909102132017">ပြခန်းပုံများ</translation> <translation id="1300209025925956156">သင့်မှတ်တမ်းဖိုင်ကို စကင်ဖတ်ခြင်း</translation> +<translation id="1309250603447638106">မှတ်တမ်းစကင်ဖတ်ခြင်းအတွက် အပ်ဒိတ်များ ဒေါင်းလုဒ်လုပ်နေသည်</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />။ ကြည့်ရန် Search + ‘ဘယ်ညွှန်မြား’ နှိပ်ပါ။</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">ပရင့်</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">မှန်အစမ်းကြည့်ရန်</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> ကို ပလတ်တပ်ထားသည်။</translation> +<translation id="2904654629665923749">မှတ်တမ်းစကင်ဖတ်နိုင်ပြီ</translation> <translation id="2968794441791257519">ကင်မရာဖြင့်ရိုက်ကူးထားသော ဓာတ်ပုံနှင့် ဗီဒီယိုများကို 'ဒေါင်းလုဒ်များ' ဖိုင်တွဲသို့ ရွှေ့ပါမည်။ ၎င်းတို့ကို Files ထဲတွင် ဝင်သုံးနိုင်ပါသည်။ သိုလှောင်ခန်း ခွင့်ပြုချက်ရထားသည့် အက်ပ်များသည် သင့်ဓာတ်ပုံနှင့် ဗီဒီယိုများကို သုံးခွင့်ရှိပါမည်။</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb index 5d6a334c..1896205 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_nl.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">90 graden rechtsom draaien</translation> <translation id="1276998909102132017">Galerij-afbeeldingen</translation> <translation id="1300209025925956156">Je document scannen</translation> +<translation id="1309250603447638106">Updates voor het scannen van documenten downloaden</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Zoeken + pijl-links om ze te openen.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Afdrukken</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Voorbeeld van spiegelen</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> is aangesloten.</translation> +<translation id="2904654629665923749">Scan van document beschikbaar</translation> <translation id="2968794441791257519">Foto's en video's die zijn gemaakt met de camera worden verplaatst naar de map Downloads. Je kunt ze vinden via Bestanden. Apps met opslagmachtiging hebben toegang tot je foto's en video's.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb index 873dc56..a1df669 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_no.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Rotér 90 grader med klokken</translation> <translation id="1276998909102132017">Galleribilder</translation> <translation id="1300209025925956156">Skann dokumentet</translation> +<translation id="1309250603447638106">Laster ned oppdateringer for dokumentskanning</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Trykk på søketasten + venstrepil for å se dem.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Skriv ut</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Forhåndsvisning av speiling</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> er koblet til.</translation> +<translation id="2904654629665923749">Dokumentskanning er tilgjengelig</translation> <translation id="2968794441791257519">Bilder og videoer som er tatt med kameraet, flyttes til mappen Nedlastinger. Du har tilgang til dem i Filer. Apper med lagringstillatelser har tilgang til bildene og videoene dine.</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 0b6dc262..9300d2b 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">ਘੜੀ ਦੀ ਦਿਸ਼ਾ ਵਿੱਚ 90 ਡਿਗਰੀ ਘੁਮਾਓ</translation> <translation id="1276998909102132017">ਗੈਲਰੀ ਚਿੱਤਰ</translation> <translation id="1300209025925956156">ਆਪਣਾ ਦਸਤਾਵੇਜ਼ ਸਕੈਨ ਕਰੋ</translation> +<translation id="1309250603447638106">ਦਸਤਾਵੇਜ਼ ਸਕੈਨਿੰਗ ਲਈ ਅੱਪਡੇਟ ਡਾਊਨਲੋਡ ਕੀਤੇ ਜਾ ਰਹੇ ਹਨ</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. ਪਹੁੰਚ ਕਰਨ ਲਈ Search + ਖੱਬਾ ਤੀਰ ਦਬਾਓ।</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">ਪ੍ਰਿੰਟ ਕਰੋ</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">ਪ੍ਰਤਿਬਿੰਬ ਦੀ ਪੂਰਵ-ਝਲਕ</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> ਪਲੱਗ-ਇਨ ਕੀਤਾ ਹੋਇਆ ਹੈ।</translation> +<translation id="2904654629665923749">ਦਸਤਾਵੇਜ਼ ਸਕੈਨ ਉਪਲਬਧ ਹੈ</translation> <translation id="2968794441791257519">ਕੈਮਰੇ ਨਾਲ ਖਿੱਚੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਬਣਾਏ ਵੀਡੀਓ 'ਡਾਊਨਲੋਡ' ਫੋਲਡਰ ਵਿੱਚ ਲਿਜਾਏ ਜਾਣਗੇ। ਤੁਸੀਂ 'ਫ਼ਾਈਲਾਂ' ਵਿੱਚ ਉਹਨਾਂ ਤੱਕ ਪਹੁੰਚ ਕਰ ਸਕਦੇ ਹੋ। ਸਟੋਰੇਜ ਇਜਾਜ਼ਤਾਂ ਵਾਲੀਆਂ ਐਪਾਂ ਕੋਲ ਤੁਹਾਡੀਆਂ ਫ਼ੋਟੋਆਂ ਅਤੇ ਵੀਡੀਓ ਤੱਕ ਪਹੁੰਚ ਹੋਵੇਗੀ।</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 9035e6ff..b36532d 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Obróć o 90 stopni w prawo</translation> <translation id="1276998909102132017">Zdjęcia z galerii</translation> <translation id="1300209025925956156">Skanowanie dokumentu</translation> +<translation id="1309250603447638106">Pobieram aktualizacje dotyczące skanowania dokumentów</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Wyszukaj + strzałka w lewo, aby przejść.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Drukuj</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Podgląd odbicia lustrzanego</translation> <translation id="2879583609344924966">Podłączono kamerę <ph name="CAMERA" />.</translation> +<translation id="2904654629665923749">Dostępne jest skanowanie dokumentów</translation> <translation id="2968794441791257519">Zdjęcia i filmy pochodzące z aparatu zostaną przeniesione do folderu Pobrane pliki. Dostęp do nich możesz uzyskać w aplikacji Pliki. Do Twoich zdjęć i filmów będą mieć dostęp aplikacje z uprawnieniami dostępu do pamięci.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb index 1f5a7a4..2bcf79f8 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-BR.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Girar 90 graus no sentido horário</translation> <translation id="1276998909102132017">Imagens da galeria</translation> <translation id="1300209025925956156">Digitalize seu documento</translation> +<translation id="1309250603447638106">Fazendo o download de atualizações da digitalização de documentos</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Pressione "Pesquisa" + seta para a esquerda para acessar.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Imprimir</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Visualização do espelhamento</translation> <translation id="2879583609344924966">A <ph name="CAMERA" /> foi conectada.</translation> +<translation id="2904654629665923749">Digitalização de documentos disponível</translation> <translation id="2968794441791257519">As fotos e os vídeos capturados com a câmera serão movidos para a pasta "Downloads", e você poderá acessá-los no app Arquivos. Os apps com permissões de armazenamento terão acesso a seus vídeos e fotos.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb index a7d959c..9c89aa2 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_pt-PT.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Rodar 90 graus no sentido dos ponteiros do relógio</translation> <translation id="1276998909102132017">Imagens da galeria</translation> <translation id="1300209025925956156">Digitalize o seu documento</translation> +<translation id="1309250603447638106">A transferir atualizações para a digitalização de documentos</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Pesquisa + seta para a esquerda para aceder.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Imprimir</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Pré-visualização do espelho</translation> <translation id="2879583609344924966">A <ph name="CAMERA" /> está ligada.</translation> +<translation id="2904654629665923749">Digitalização de documentos disponível</translation> <translation id="2968794441791257519">As fotos e os vídeos realizados com a câmara serão movidos para a pasta Transferências. Pode aceder aos mesmos em Ficheiros. As apps com autorizações de armazenamento terão acesso aos seus vídeos e fotos.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb index e919bb9..1dbce96 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_ro.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Rotește spre dreapta cu 90 de grade</translation> <translation id="1276998909102132017">Imagini din galerie</translation> <translation id="1300209025925956156">Scanează documentul</translation> +<translation id="1309250603447638106">Se descarcă actualizările pentru scanarea documentelor</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Tasta de căutare + săgeată spre stânga pentru acces.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Printează</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Previzualizarea oglindirii</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> este conectată.</translation> +<translation id="2904654629665923749">Este disponibilă scanarea documentelor</translation> <translation id="2968794441791257519">Fotografiile și videoclipurile făcute cu camera foto vor fi mutate în dosarul Descărcări. Le poți accesa în Fișiere. Aplicațiile cu permisiuni de stocare vor avea acces la fotografiile și videoclipurile tale.</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 45f57195..8cd202d9 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Otočiť o 90 stupňov v smere hodinových ručičiek</translation> <translation id="1276998909102132017">Obrázky galérie</translation> <translation id="1300209025925956156">Skenovanie dokumentu</translation> +<translation id="1309250603447638106">Sťahujú sa aktualizácie na skenovanie dokumentov</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Prístup získate stlačením klávesa vyhľadávania + šípky doľava.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Tlačiť</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Ukážka zrkadlenia</translation> <translation id="2879583609344924966">Kamera <ph name="CAMERA" /> je pripojená.</translation> +<translation id="2904654629665923749">K dispozícii je skenovanie dokumentov</translation> <translation id="2968794441791257519">Fotky a videá nasnímané fotoaparátom budú presunuté do priečinka Stiahnuté súbory. Dostanete sa k nim v Súboroch. Fotky aj videá budú môcť používať aplikácie s povoleniami pre úložisko.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb index 72dfc55..a189d7eb 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_sl.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Zavrti za 90 stopinj v desno</translation> <translation id="1276998909102132017">Slike v galeriji</translation> <translation id="1300209025925956156">Optično branje dokumenta</translation> +<translation id="1309250603447638106">Prenašanje posodobitev za optično branje dokumentov</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Tipka za iskanja + puščica levo za dostop.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Natisni</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Predogled zrcaljenja</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> je priključena.</translation> +<translation id="2904654629665923749">Na voljo je optično branje dokumentov</translation> <translation id="2968794441791257519">Fotografije in videoposnetki, ki ste jih posneli s fotoaparatom, bodo premaknjeni v mapo Prenosi. Do njih lahko dostopate v aplikaciji Datoteke. Aplikacije z dovoljenji za shrambo bodo imele dostop do fotografij in videoposnetkov.</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 55eec514f..6545826 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Rotiraj za 90 stepeni udesno</translation> <translation id="1276998909102132017">Slike u galeriji</translation> <translation id="1300209025925956156">Skenirajte dokument</translation> +<translation id="1309250603447638106">Preuzimaju se ažuriranja za skeniranje dokumenata</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Taster za pretragu + strelica nalevo da biste pristupili.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Štampaj</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Pregled preslikavanja</translation> <translation id="2879583609344924966">Kamera <ph name="CAMERA" /> je priključena.</translation> +<translation id="2904654629665923749">Dostupno je skeniranje dokumenata</translation> <translation id="2968794441791257519">Slike i video snimci koji su snimljeni pomoću kamere će se premestiti u direktorijum Preuzimanja. Možete da im pristupite u Datotekama. Aplikacije sa dozvolama za pristup memorijskom prostoru će imati pristup slikama i video snimcima.</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 e6d65d0..e9b61ba 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
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">Ротирај за 90 степени удесно</translation> <translation id="1276998909102132017">Слике у галерији</translation> <translation id="1300209025925956156">Скенирајте документ</translation> +<translation id="1309250603447638106">Преузимају се ажурирања за скенирање докумената</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" />. Тастер за претрагу + стрелица налево да бисте приступили.</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">Штампај</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">Преглед пресликавања</translation> <translation id="2879583609344924966">Камера <ph name="CAMERA" /> је прикључена.</translation> +<translation id="2904654629665923749">Доступно је скенирање докумената</translation> <translation id="2968794441791257519">Слике и видео снимци који су снимљени помоћу камере ће се преместити у директоријум Преузимања. Можете да им приступите у Датотекама. Апликације са дозволама за приступ меморијском простору ће имати приступ сликама и видео снимцима.</translation>
diff --git a/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb b/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb index e3569f14..31a15322 100644 --- a/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb +++ b/ash/webui/camera_app_ui/resources/strings/camera_strings_th.xtb
@@ -7,6 +7,7 @@ <translation id="1258009455399840361">หมุน 90 องศาตามเข็มนาฬิกา</translation> <translation id="1276998909102132017">รูปภาพในแกลเลอรี</translation> <translation id="1300209025925956156">สแกนเอกสาร</translation> +<translation id="1309250603447638106">กำลังดาวน์โหลดอัปเดตของฟีเจอร์การสแกนเอกสาร</translation> <translation id="137991641490787891"><ph name="ASPECT_RATIO_WIDTH" /> กดค้นหา + ลูกศรซ้ายเพื่อเข้าถึง</translation> <translation id="1393338179284529051">Quad HD</translation> <translation id="1430915738399379752">พิมพ์</translation> @@ -47,6 +48,7 @@ <translation id="2816865716882637212">HD</translation> <translation id="28682968802727151">แสดงตัวอย่างมิเรอร์</translation> <translation id="2879583609344924966"><ph name="CAMERA" /> เสียบอยู่</translation> +<translation id="2904654629665923749">การสแกนเอกสารพร้อมใช้งานแล้ว</translation> <translation id="2968794441791257519">รูปภาพและวิดีโอที่ถ่ายจากกล้องจะย้ายไปยังโฟลเดอร์ "ดาวน์โหลด" คุณจะเข้าถึงรายการเหล่านี้ได้ในแอป Files แอปที่มีสิทธิ์ในพื้นที่เก็บข้อมูลจะเข้าถึงรูปภาพและวิดีโอของคุณได้</translation>
diff --git a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h index c5d2bd5..60353ebd 100644 --- a/ash/webui/os_feedback_ui/backend/feedback_service_provider.h +++ b/ash/webui/os_feedback_ui/backend/feedback_service_provider.h
@@ -38,9 +38,9 @@ void OpenMetricsDialog() override; void OpenSystemInfoDialog() override; void RecordPostSubmitAction( - os_feedback_ui::mojom::FeedbackAppPostSubmitAction) override; + os_feedback_ui::mojom::FeedbackAppPostSubmitAction action) override; void RecordPreSubmitAction( - os_feedback_ui::mojom::FeedbackAppPreSubmitAction) override; + os_feedback_ui::mojom::FeedbackAppPreSubmitAction action) override; void BindInterface( mojo::PendingReceiver<os_feedback_ui::mojom::FeedbackServiceProvider>
diff --git a/ash/webui/os_feedback_ui/backend/histogram_util.cc b/ash/webui/os_feedback_ui/backend/histogram_util.cc index f2cdfd0..43c333d 100644 --- a/ash/webui/os_feedback_ui/backend/histogram_util.cc +++ b/ash/webui/os_feedback_ui/backend/histogram_util.cc
@@ -32,4 +32,21 @@ contact_user_consent); } +void EmitFeedbackAppIncludedFile(bool included_file) { + base::UmaHistogramBoolean(kFeedbackAppIncludedFile, included_file); +} + +void EmitFeedbackAppIncludedEmail(bool included_email) { + base::UmaHistogramBoolean(kFeedbackAppIncludedEmail, included_email); +} + +void EmitFeedbackAppIncludedUrl(bool included_url) { + base::UmaHistogramBoolean(kFeedbackAppIncludedUrl, included_url); +} + +void EmitFeedbackAppIncludedSystemInfo(bool included_system_info) { + base::UmaHistogramBoolean(kFeedbackAppIncludedSystemInfo, + included_system_info); +} + } // namespace ash::os_feedback_ui::metrics
diff --git a/ash/webui/os_feedback_ui/backend/histogram_util.h b/ash/webui/os_feedback_ui/backend/histogram_util.h index e93d4a3..6d9f77f 100644 --- a/ash/webui/os_feedback_ui/backend/histogram_util.h +++ b/ash/webui/os_feedback_ui/backend/histogram_util.h
@@ -22,6 +22,12 @@ "Feedback.ChromeOSApp.ViewedScreenshot"; constexpr char kFeedbackAppCanContactUser[] = "Feedback.ChromeOSApp.CanContactUser"; +constexpr char kFeedbackAppIncludedFile[] = "Feedback.ChromeOSApp.IncludedFile"; +constexpr char kFeedbackAppIncludedEmail[] = + "Feedback.ChromeOSApp.IncludedEmail"; +constexpr char kFeedbackAppIncludedUrl[] = "Feedback.ChromeOSApp.IncludedUrl"; +constexpr char kFeedbackAppIncludedSystemInfo[] = + "Feedback.ChromeOSApp.IncludedSystemInfo"; // The enums below are used in histograms, do not remove/renumber entries. If // you're adding to any of these enums, update the corresponding enum listing in @@ -44,6 +50,14 @@ void EmitFeedbackAppCanContactUser( FeedbackAppContactUserConsentType contact_user_consent); +void EmitFeedbackAppIncludedFile(bool included_file); + +void EmitFeedbackAppIncludedEmail(bool included_email); + +void EmitFeedbackAppIncludedUrl(bool included_url); + +void EmitFeedbackAppIncludedSystemInfo(bool included_system_info); + } // namespace ash::os_feedback_ui::metrics #endif // ASH_WEBUI_OS_FEEDBACK_UI_BACKEND_HISTOGRAM_UTIL_H_ \ No newline at end of file
diff --git a/ash/webui/os_feedback_ui/resources/share_data_page.js b/ash/webui/os_feedback_ui/resources/share_data_page.js index eab39434..3c5ddbb 100644 --- a/ash/webui/os_feedback_ui/resources/share_data_page.js +++ b/ash/webui/os_feedback_ui/resources/share_data_page.js
@@ -80,7 +80,10 @@ super.ready(); this.setPrivacyNote_(); this.setSysInfoCheckboxLabelAndAttributes_(); - this.$.screenshotCheckbox.ariaLabel = + // Set the aria description works the best for screen reader. + // It reads the description when the checkbox is focused, and when it is + // checked and unchecked. + this.$.screenshotCheckbox.ariaDescription = this.i18n('attachScreenshotCheckboxAriaLabel'); this.$.imageButton.ariaLabel = this.i18n( 'previewImageAriaLabel', this.$.screenshotCheckLabel.textContent);
diff --git a/ash/webui/projector_app/projector_app_client.h b/ash/webui/projector_app/projector_app_client.h index 238b9a5b..6c00d5af 100644 --- a/ash/webui/projector_app/projector_app_client.h +++ b/ash/webui/projector_app/projector_app_client.h
@@ -29,10 +29,8 @@ namespace ash { class AnnotatorMessageHandler; - struct AnnotatorTool; -struct ProjectorScreencast; - +struct ProjectorScreencastVideo; struct NewScreencastPrecondition; struct PendingScreencast { @@ -83,9 +81,9 @@ // ProjectorApp. class ProjectorAppClient { public: - // The callback used by the GetScreencast() API. - using OnGetScreencastCallback = - base::OnceCallback<void(std::unique_ptr<ProjectorScreencast> screencast, + // The callback used by the GetVideo() API. + using OnGetVideoCallback = + base::OnceCallback<void(std::unique_ptr<ProjectorScreencastVideo> video, const std::string& error_message)>; // Interface for observing events on the ProjectorAppClient. @@ -155,10 +153,13 @@ // Triggers the opening of the Chrome feedback dialog. virtual void OpenFeedbackDialog() const = 0; - // TODO(b/236857019): Wire up ProjectorMessageHandler. - // Populates a screencast object in |callback| for given |screencast_id|. - virtual void GetScreencast(const std::string& screencast_id, - OnGetScreencastCallback callback) = 0; + // Launches the given DriveFS video file with `video_file_id` into the + // Projector app. The `resource_key` is an additional security token needed to + // gain access to link-shared files. Since the `resource_key` is currently + // only used by Googlers, the `resource_key` might be empty. + virtual void GetVideo(const std::string& video_file_id, + const std::string& resource_key, + OnGetVideoCallback callback) const = 0; // Registers the AnnotatorMessageHandler that is owned by the WebUI that // contains the Projector annotator.
diff --git a/ash/webui/projector_app/projector_message_handler.cc b/ash/webui/projector_app/projector_message_handler.cc index 5eb34661..9a499e0 100644 --- a/ash/webui/projector_app/projector_message_handler.cc +++ b/ash/webui/projector_app/projector_message_handler.cc
@@ -409,7 +409,7 @@ return; } - ResolveJavascriptCallback(args[0], *(pref_service_->Get(user_pref))); + ResolveJavascriptCallback(args[0], pref_service_->GetValue(user_pref)); } void ProjectorMessageHandler::SetUserPref(const base::Value::List& args) { @@ -481,18 +481,38 @@ } void ProjectorMessageHandler::GetVideo(const base::Value::List& args) { - AllowJavascript(); // Two arguments. The first is callback id, and the second is the list // containing the item id and resource key. DCHECK_EQ(args.size(), 2u); const auto& func_args = args[1].GetList(); DCHECK_EQ(func_args.size(), 2u); - // TODO(b/237089852): Create a launch event with the file. - ProjectorScreencastVideo video; - video.file_id = func_args[0].GetString(); + const std::string& js_callback_id = args[0].GetString(); + const std::string& video_file_id = func_args[0].GetString(); + std::string resource_key; + if (func_args[1].is_string()) + resource_key = func_args[1].GetString(); - ResolveJavascriptCallback(args[0], video.ToValue()); + ProjectorAppClient::Get()->GetVideo( + video_file_id, resource_key, + base::BindOnce(&ProjectorMessageHandler::OnVideoLocated, GetWeakPtr(), + js_callback_id)); +} + +void ProjectorMessageHandler::OnVideoLocated( + const std::string& js_callback_id, + std::unique_ptr<ProjectorScreencastVideo> video, + const std::string& error_message) { + AllowJavascript(); + + if (!error_message.empty()) { + RejectJavascriptCallback(base::Value(js_callback_id), + base::Value(error_message)); + return; + } + DCHECK(video) + << "If there is no error message, then video should not be nullptr"; + ResolveJavascriptCallback(base::Value(js_callback_id), video->ToValue()); } } // namespace ash
diff --git a/ash/webui/projector_app/projector_message_handler.h b/ash/webui/projector_app/projector_message_handler.h index 044fa97..d136a8d2 100644 --- a/ash/webui/projector_app/projector_message_handler.h +++ b/ash/webui/projector_app/projector_message_handler.h
@@ -5,6 +5,8 @@ #ifndef ASH_WEBUI_PROJECTOR_APP_PROJECTOR_MESSAGE_HANDLER_H_ #define ASH_WEBUI_PROJECTOR_APP_PROJECTOR_MESSAGE_HANDLER_H_ +#include <memory> + #include "ash/public/cpp/projector/projector_new_screencast_precondition.h" #include "ash/webui/projector_app/projector_app_client.h" #include "ash/webui/projector_app/projector_oauth_token_fetcher.h" @@ -22,6 +24,7 @@ namespace ash { class ProjectorXhrSender; +struct ProjectorScreencastVideo; // Enum to record the different errors that may occur in the Projector app. enum class ProjectorError { @@ -124,6 +127,13 @@ // the Drive item id specified by `args`. void GetVideo(const base::Value::List& args); + // Called when video file fetch by item id request is complete. Resolves the + // javascript promise created by ProjectorBrowserProxy.getScreencast by + // calling the `js_callback_id`. + void OnVideoLocated(const std::string& js_callback_id, + std::unique_ptr<ProjectorScreencastVideo> video, + const std::string& error_message); + ProjectorOAuthTokenFetcher oauth_token_fetcher_; std::unique_ptr<ProjectorXhrSender> xhr_sender_;
diff --git a/ash/webui/projector_app/projector_screencast.cc b/ash/webui/projector_app/projector_screencast.cc index 38ae4c7..da7553a 100644 --- a/ash/webui/projector_app/projector_screencast.cc +++ b/ash/webui/projector_app/projector_screencast.cc
@@ -8,28 +8,8 @@ base::Value::Dict ProjectorScreencastVideo::ToValue() const { base::Value::Dict dict; - dict.Set("srcUrl", src_url); dict.Set("fileId", file_id); return dict; } -ProjectorScreencast::ProjectorScreencast() = default; - -ProjectorScreencast::ProjectorScreencast(const ProjectorScreencast&) = default; - -ProjectorScreencast& ProjectorScreencast::operator=( - const ProjectorScreencast&) = default; - -ProjectorScreencast::~ProjectorScreencast() = default; - -base::Value::Dict ProjectorScreencast::ToValue() const { - base::Value::Dict dict; - dict.Set("containerFolderId", container_folder_id); - dict.Set("name", name); - dict.Set("metadataFileId", metadata_file_id); - dict.Set("video", video.ToValue()); - - return dict; -} - } // namespace ash
diff --git a/ash/webui/projector_app/projector_screencast.h b/ash/webui/projector_app/projector_screencast.h index fad42fd..fb78664 100644 --- a/ash/webui/projector_app/projector_screencast.h +++ b/ash/webui/projector_app/projector_screencast.h
@@ -15,35 +15,9 @@ struct ProjectorScreencastVideo { base::Value::Dict ToValue() const; // TODO(b/236857019): Add thumbnail link and duration millis. - std::string src_url; std::string file_id; }; -// Struct of screencast model. -struct ProjectorScreencast { - ProjectorScreencast(); - ProjectorScreencast(const ProjectorScreencast&); - ProjectorScreencast& operator=(const ProjectorScreencast&); - ~ProjectorScreencast(); - - base::Value::Dict ToValue() const; - - // Only available for screencasts located in DriveFs. - std::string container_folder_id; - - std::string name; - - // The Drive server side item id of ".projector" file. - std::string metadata_file_id; - - ProjectorScreencastVideo video; - - // TODO(b/236857019): 1 Implement following fields: status, metadata_file_id, - // metadata, is_editable, upload_progress. - // 2 Replace the PendingScreencast struct defined in ProjectorAppClient with - // this struct. -}; - } // namespace ash #endif // ASH_WEBUI_PROJECTOR_APP_PROJECTOR_SCREENCAST_H_
diff --git a/ash/webui/projector_app/test/mock_app_client.h b/ash/webui/projector_app/test/mock_app_client.h index 30b28d5..f644061 100644 --- a/ash/webui/projector_app/test/mock_app_client.h +++ b/ash/webui/projector_app/test/mock_app_client.h
@@ -51,9 +51,10 @@ MOCK_METHOD0(OnSodaInstallError, void()); MOCK_METHOD0(OnSodaInstalled, void()); MOCK_CONST_METHOD0(OpenFeedbackDialog, void()); - MOCK_METHOD2(GetScreencast, - void(const std::string&, - ProjectorAppClient::OnGetScreencastCallback)); + MOCK_CONST_METHOD3(GetVideo, + void(const std::string&, + const std::string&, + ProjectorAppClient::OnGetVideoCallback)); MOCK_METHOD1(SetAnnotatorMessageHandler, void(AnnotatorMessageHandler*)); MOCK_METHOD1(ResetAnnotatorMessageHandler, void(AnnotatorMessageHandler*)); MOCK_METHOD1(SetTool, void(const AnnotatorTool&));
diff --git a/ash/webui/projector_app/test/projector_message_handler_unittest.cc b/ash/webui/projector_app/test/projector_message_handler_unittest.cc index 2fd24a6..ca6dab1c 100644 --- a/ash/webui/projector_app/test/projector_message_handler_unittest.cc +++ b/ash/webui/projector_app/test/projector_message_handler_unittest.cc
@@ -7,6 +7,7 @@ #include "ash/constants/ash_pref_names.h" #include "ash/public/cpp/projector/projector_new_screencast_precondition.h" #include "ash/public/cpp/test/mock_projector_controller.h" +#include "ash/webui/projector_app/projector_screencast.h" #include "ash/webui/projector_app/projector_xhr_sender.h" #include "ash/webui/projector_app/test/mock_app_client.h" #include "base/files/file_path.h" @@ -20,6 +21,8 @@ namespace { +using ::testing::_; + const char kTestUserEmail[] = "testuser1@gmail.com"; const char kVideoFileId[] = "video_file_id"; const char kResourceKey[] = "resource_key"; @@ -566,6 +569,19 @@ } TEST_F(ProjectorMessageHandlerUnitTest, GetVideo) { + ProjectorScreencastVideo expected_video; + expected_video.file_id = kVideoFileId; + + EXPECT_CALL(mock_app_client(), GetVideo(kVideoFileId, kResourceKey, _)) + .WillOnce( + [&expected_video](const std::string& video_file_id, + const std::string& resource_key, + ProjectorAppClient::OnGetVideoCallback callback) { + std::move(callback).Run( + std::make_unique<ProjectorScreencastVideo>(expected_video), + /*error_message=*/std::string()); + }); + base::ListValue list_args; list_args.Append(kGetVideoCallback); base::ListValue args; @@ -585,9 +601,37 @@ // Expect the callback to be successful. EXPECT_TRUE(call_data.arg2()->GetBool()); ASSERT_TRUE(call_data.arg3()->is_dict()); - const base::Value::Dict& dict = call_data.arg3()->GetDict(); + EXPECT_EQ(call_data.arg3()->GetDict(), expected_video.ToValue()); +} - EXPECT_EQ(*dict.FindString("fileId"), kVideoFileId); +TEST_F(ProjectorMessageHandlerUnitTest, GetVideoFail) { + EXPECT_CALL(mock_app_client(), GetVideo(kVideoFileId, _, _)) + .WillOnce([](const std::string& video_file_id, + const std::string& resource_key, + ProjectorAppClient::OnGetVideoCallback callback) { + EXPECT_TRUE(resource_key.empty()); + std::move(callback).Run(/*video=*/nullptr, /*error_message=*/"error1"); + }); + + base::ListValue list_args; + list_args.Append(kGetVideoCallback); + base::ListValue args; + args.Append(kVideoFileId); + args.Append(base::Value()); + list_args.Append(std::move(args)); + + web_ui().HandleReceivedMessage("getVideo", &list_args); + + // We expect that there was only one callback to the WebUI. + EXPECT_EQ(web_ui().call_data().size(), 1u); + + const content::TestWebUI::CallData& call_data = FetchCallData(0); + EXPECT_EQ(call_data.function_name(), kWebUIResponse); + EXPECT_EQ(call_data.arg1()->GetString(), kGetVideoCallback); + + // Expect the callback to fail. + EXPECT_FALSE(call_data.arg2()->GetBool()); + EXPECT_EQ(call_data.arg3()->GetString(), "error1"); } class ProjectorStorageDirNameValidationTest
diff --git a/ash/wm/desks/templates/saved_desk_dialog_controller.cc b/ash/wm/desks/templates/saved_desk_dialog_controller.cc index d15e63b1..516a9aed 100644 --- a/ash/wm/desks/templates/saved_desk_dialog_controller.cc +++ b/ash/wm/desks/templates/saved_desk_dialog_controller.cc
@@ -4,6 +4,7 @@ #include "ash/wm/desks/templates/saved_desk_dialog_controller.h" +#include "ash/accessibility/accessibility_controller_impl.h" #include "ash/constants/app_types.h" #include "ash/public/cpp/desks_templates_delegate.h" #include "ash/shell.h" @@ -304,6 +305,14 @@ dialog_widget_->GetNativeWindow()->SetName("TemplateDialogForTesting"); dialog_widget_->Show(); dialog_widget_observation_.Observe(dialog_widget_); + + // Ensure that if ChromeVox is enabled, it focuses on the dialog. + AccessibilityControllerImpl* accessibility_controller = + Shell::Get()->accessibility_controller(); + if (accessibility_controller->spoken_feedback().enabled()) { + accessibility_controller->SetA11yOverrideWindow( + dialog_widget_->GetNativeWindow()); + } } bool SavedDeskDialogController::CanShowDialog() const {
diff --git a/ash/wm/window_state.h b/ash/wm/window_state.h index 428adbf..61828dc3 100644 --- a/ash/wm/window_state.h +++ b/ash/wm/window_state.h
@@ -179,7 +179,6 @@ void set_is_moving_to_another_display(bool moving) { is_moving_to_another_display_ = moving; } - bool is_moving_to_another_display_ = false; // Checks if the window can change its state accordingly. bool CanMaximize() const; @@ -586,6 +585,7 @@ bool autohide_shelf_when_maximized_or_fullscreen_; ui::ZOrderLevel cached_z_order_; bool allow_set_bounds_direct_ = false; + bool is_moving_to_another_display_ = false; // A property to save the ratio between snapped window width (or height // for vertical layout) and display workarea width (or height). The ratio
diff --git a/base/task/sequence_manager/timing_wheel.h b/base/task/sequence_manager/timing_wheel.h index 89ef355..68d79be 100644 --- a/base/task/sequence_manager/timing_wheel.h +++ b/base/task/sequence_manager/timing_wheel.h
@@ -51,7 +51,7 @@ template <typename T, size_t WheelSize, typename TimingWheelHandleAccessor, - TimeTicks (*GetDelayedRunTime)(const T&)> + typename GetDelayedRunTime> friend class TimingWheel; // Only TimingWheels can create valid TimingWheelHandles. @@ -74,21 +74,23 @@ // inserted in a TimingWheel. |T| is a typename for element. |WheelSize| is the // number of buckets this TimingWheel has. |TimingWheelHandleAccessor| is the // type of the object which under the hood manages the TimingWheelHandle. -// |GetDelayedRunTime| is a function which returns the time when the element is +// |GetDelayedRunTime| is a functor which returns the time when the element is // due at. template <typename T, size_t WheelSize, typename TimingWheelHandleAccessor, - TimeTicks (*GetDelayedRunTime)(const T&)> + typename GetDelayedRunTime> class TimingWheel { public: // Constructs a TimingWheel instance where each bucket corresponds to a // TimeDelta of |time_delta_per_bucket_|. - TimingWheel(TimeDelta time_delta_per_bucket) + explicit TimingWheel( + TimeDelta time_delta_per_bucket, + const GetDelayedRunTime& get_delayed_run_time = GetDelayedRunTime()) : time_delta_per_bucket_(time_delta_per_bucket), last_updated_bucket_index_(0), time_passed_(Microseconds(0)), - total_elements_(0) {} + get_delayed_run_time_(get_delayed_run_time) {} TimingWheel(TimingWheel&&) = delete; TimingWheel& operator=(TimingWheel&&) = delete; @@ -182,9 +184,8 @@ } auto it = std::min_element( - bucket.begin(), bucket.end(), [](const T& a, const T& b) { - // return a.delayed_run_time > b.delayed_run_time; - return GetDelayedRunTime(a) > GetDelayedRunTime(b); + bucket.begin(), bucket.end(), [this](const T& a, const T& b) { + return get_delayed_run_time_(a) > get_delayed_run_time_(b); }); return *it; } @@ -247,7 +248,10 @@ TimeDelta time_passed_; // The number of elements in |buckets_|. - size_t total_elements_; + size_t total_elements_ = 0; + + // The functor to get the delayed run time of elements. + GetDelayedRunTime get_delayed_run_time_; }; } // namespace base::sequence_manager::internal
diff --git a/base/task/sequence_manager/timing_wheel_unittest.cc b/base/task/sequence_manager/timing_wheel_unittest.cc index cdbf9f3..9a26665 100644 --- a/base/task/sequence_manager/timing_wheel_unittest.cc +++ b/base/task/sequence_manager/timing_wheel_unittest.cc
@@ -52,10 +52,12 @@ }; // Gets the delayed run time of the |element|. -template <typename T> -TimeTicks GetDelayedRunTime(const T& element) { - return element.delayed_run_time; -} +struct GetDelayedRunTime { + template <typename T> + TimeTicks operator()(const T& element) { + return element.delayed_run_time; + } +}; // The total number of buckets that we use for the TimingWheel in all the unit // tests.
diff --git a/base/test/values_test_util.cc b/base/test/values_test_util.cc index 5a7c560..09459d54 100644 --- a/base/test/values_test_util.cc +++ b/base/test/values_test_util.cc
@@ -13,6 +13,7 @@ #include "base/stl_util.h" #include "base/strings/string_number_conversions.h" #include "testing/gtest/include/gtest/gtest.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace base { @@ -167,6 +168,27 @@ const base::Value template_value_; }; +// Attempts to parse `json` as JSON. Returns resulting Value on success, has an +// EXPECT failure and returns nullopt on failure. If `expected_type` is +// provided, treats `json` parsing as a Value of a different type as a failure. +// +absl::optional<Value> ParseJsonHelper( + StringPiece json, + absl::optional<Value::Type> expected_type) { + auto result = JSONReader::ReadAndReturnValueWithError( + json, JSON_PARSE_CHROMIUM_EXTENSIONS | JSON_ALLOW_TRAILING_COMMAS); + if (!result.has_value()) { + ADD_FAILURE() << "Failed to parse \"" << json + << "\": " << result.error().message; + return absl::nullopt; + } + if (expected_type && result->type() != *expected_type) { + ADD_FAILURE() << "JSON is of wrong type: " << json; + return absl::nullopt; + } + return std::move(*result); +} + } // namespace testing::Matcher<const base::Value&> DictionaryHasValue( @@ -233,14 +255,21 @@ } Value ParseJson(StringPiece json) { - auto result = JSONReader::ReadAndReturnValueWithError( - json, JSON_PARSE_CHROMIUM_EXTENSIONS | JSON_ALLOW_TRAILING_COMMAS); - if (!result.has_value()) { - ADD_FAILURE() << "Failed to parse \"" << json - << "\": " << result.error().message; - return Value(); - } - return std::move(*result); + absl::optional<Value> result = + ParseJsonHelper(json, /*expected_type=*/absl::nullopt); + return result.has_value() ? std::move(*result) : Value(); +} + +Value::Dict ParseJsonDict(StringPiece json) { + absl::optional<Value> result = + ParseJsonHelper(json, /*expected_type=*/Value::Type::DICT); + return result.has_value() ? std::move(result->GetDict()) : Value::Dict(); +} + +Value::List ParseJsonList(StringPiece json) { + absl::optional<Value> result = + ParseJsonHelper(json, /*expected_type=*/Value::Type::LIST); + return result.has_value() ? std::move(result->GetList()) : Value::List(); } std::unique_ptr<Value> ParseJsonDeprecated(StringPiece json) {
diff --git a/base/test/values_test_util.h b/base/test/values_test_util.h index 0b36be7d..75eff99 100644 --- a/base/test/values_test_util.h +++ b/base/test/values_test_util.h
@@ -88,11 +88,17 @@ return testing::MakePolymorphicMatcher(IsJsonMatcher(value)); } -// Parses |json| as JSON, allowing trailing commas, and returns the resulting -// value. If |json| fails to parse, causes an EXPECT failure and returns the +// Parses `json` as JSON, allowing trailing commas, and returns the resulting +// value. If `json` fails to parse, causes an EXPECT failure and returns the // Null Value. Value ParseJson(StringPiece json); +// Just like ParseJson(), except returns Dicts/Lists. If `json` fails to parse +// or is not of the expected type, causes an EXPECT failure and returns an empty +// container. +Value::Dict ParseJsonDict(StringPiece json); +Value::List ParseJsonList(StringPiece json); + // DEPRECATED. // Parses |json| as JSON, allowing trailing commas, and returns the // resulting value. If the json fails to parse, causes an EXPECT
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py index 89bacb2..6cee06f722 100755 --- a/build/android/gyp/dex.py +++ b/build/android/gyp/dex.py
@@ -31,8 +31,6 @@ r'Type `sun.misc.SharedSecrets` was not found', # Caused by jacoco code coverage: r'Type `java.lang.management.ManagementFactory` was not found', - # TODO(wnwen): Remove this after R8 version 3.0.26-dev: - r'Missing class sun.misc.Unsafe', # Caused when the test apk and the apk under test do not having native libs. r'Missing class org.chromium.build.NativeLibraries', # Caused by internal annotation: https://crbug.com/1180222 @@ -181,7 +179,7 @@ # } output = re.sub( r'Rule matches the static final field `java\.lang\.String ' - 'com\.google\.protobuf.*\{\n.*?\n\}\n?', + r'com\.google\.protobuf.*\{\n.*?\n\}\n?', '', output, flags=re.DOTALL) @@ -529,7 +527,7 @@ lambda changes: _OnStaleMd5(changes, options, final_dex_inputs, dex_cmd), options, input_paths=input_paths, - input_strings=dex_cmd + [bool(options.incremental_dir)], + input_strings=dex_cmd + [str(bool(options.incremental_dir))], output_paths=output_paths, pass_changes=True, track_subpaths_allowlist=track_subpaths_allowlist,
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 5c9f5d4..f061c66 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -1643,8 +1643,7 @@ if (is_clang) { cflags += [ # Warn on missing break statements at the end of switch cases. - # For intentional fallthrough, use FALLTHROUGH; from - # base/compiler_specific.h + # For intentional fallthrough, use [[fallthrough]]. "-Wimplicit-fallthrough", ]
diff --git a/build/fuchsia/linux_internal.sdk.sha1 b/build/fuchsia/linux_internal.sdk.sha1 index 884cfb2..a1980cea 100644 --- a/build/fuchsia/linux_internal.sdk.sha1 +++ b/build/fuchsia/linux_internal.sdk.sha1
@@ -1 +1 @@ -9.20220805.1.1 +9.20220805.2.1
diff --git a/build/toolchain/fuchsia/BUILD.gn b/build/toolchain/fuchsia/BUILD.gn index d77640b..9c6b4b1 100644 --- a/build/toolchain/fuchsia/BUILD.gn +++ b/build/toolchain/fuchsia/BUILD.gn
@@ -12,8 +12,9 @@ assert(defined(invoker.toolchain_args), "toolchain_args must be defined for fuchsia_clang_toolchain()") - # We want to build and strip binaries, but retain the unstripped binaries - # in runtime_deps to make them available for isolates. + # While we want use stripped binaries on the device, we need to retain the + # unstripped binaries in runtime_deps to make them available for the test + # isolates to enable symbolizing on bots. strip = rebase_path("${clang_base_path}/bin/llvm-strip", root_build_dir) use_unstripped_as_runtime_outputs = true
diff --git a/buildtools/deps_revisions.gni b/buildtools/deps_revisions.gni index a592fe0..e43bd63d 100644 --- a/buildtools/deps_revisions.gni +++ b/buildtools/deps_revisions.gni
@@ -5,5 +5,5 @@ declare_args() { # Used to cause full rebuilds on libc++ rolls. This should be kept in sync # with the libcxx_revision vars in //DEPS. - libcxx_revision = "a47a05b6a096e53f529c6cec03915b4a0c0bce2c" + libcxx_revision = "d3b184e37759cdce251af00b850f3db79a4e92e0" }
diff --git a/cc/layers/layer.h b/cc/layers/layer.h index 78dcfb3..8687039 100644 --- a/cc/layers/layer.h +++ b/cc/layers/layer.h
@@ -720,7 +720,7 @@ // Internal method to be overridden by Layer subclasses that need to do work // during a main frame. The method should compute any state that will need to - // propogated to the compositor thread for the next commit, and return true + // propagated to the compositor thread for the next commit, and return true // if there is anything new to commit. If all layers return false, the commit // may be aborted. virtual bool Update();
diff --git a/cc/layers/picture_layer_unittest.cc b/cc/layers/picture_layer_unittest.cc index 5153ad7..93474da 100644 --- a/cc/layers/picture_layer_unittest.cc +++ b/cc/layers/picture_layer_unittest.cc
@@ -444,7 +444,7 @@ layer->SetNeedsDisplayRect(invalidation_bounds); layer->Update(); - // Once the recording scale is set and propogated to the recording source, + // Once the recording scale is set and propagated to the recording source, // the solid color analysis should work as expected and return false. EXPECT_FALSE(recording_source->is_solid_color()); }
diff --git a/cc/mojo_embedder/async_layer_tree_frame_sink.cc b/cc/mojo_embedder/async_layer_tree_frame_sink.cc index 522c1a6..2fa65d4 100644 --- a/cc/mojo_embedder/async_layer_tree_frame_sink.cc +++ b/cc/mojo_embedder/async_layer_tree_frame_sink.cc
@@ -117,9 +117,11 @@ begin_frame_source_.reset(); synthetic_begin_frame_source_.reset(); client_receiver_.reset(); + // `compositor_frame_sink_ptr_` points to either `compositor_frame_sink_` or + // `compositor_frame_sink_associated_`, so it must be set to nullptr first. + compositor_frame_sink_ptr_ = nullptr; compositor_frame_sink_.reset(); compositor_frame_sink_associated_.reset(); - compositor_frame_sink_ptr_ = nullptr; LayerTreeFrameSink::DetachFromClient(); }
diff --git a/cc/mojo_embedder/async_layer_tree_frame_sink.h b/cc/mojo_embedder/async_layer_tree_frame_sink.h index dc69f471..a2893a8 100644 --- a/cc/mojo_embedder/async_layer_tree_frame_sink.h +++ b/cc/mojo_embedder/async_layer_tree_frame_sink.h
@@ -131,14 +131,14 @@ // Message pipes that will be bound when BindToClient() is called. UnboundMessagePipes pipes_; - // One of |compositor_frame_sink_| or |compositor_frame_sink_associated_| will - // be bound after calling BindToClient(). |compositor_frame_sink_ptr_| will - // point to message pipe we want to use. - raw_ptr<viz::mojom::CompositorFrameSink, DanglingUntriaged> - compositor_frame_sink_ptr_ = nullptr; mojo::Remote<viz::mojom::CompositorFrameSink> compositor_frame_sink_; mojo::AssociatedRemote<viz::mojom::CompositorFrameSink> compositor_frame_sink_associated_; + // One of |compositor_frame_sink_| or |compositor_frame_sink_associated_| will + // be bound after calling BindToClient(). |compositor_frame_sink_ptr_| will + // point to message pipe we want to use. It must be declared last and cleared + // first. + raw_ptr<viz::mojom::CompositorFrameSink> compositor_frame_sink_ptr_ = nullptr; mojo::Receiver<viz::mojom::CompositorFrameSinkClient> client_receiver_{this}; THREAD_CHECKER(thread_checker_);
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index adc2e71..24496e3 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -2211,6 +2211,7 @@ gl->OrderingBarrierCHROMIUM(); ri->ConvertYUVAMailboxesToRGB(dest_mailbox, kJPEG_SkYUVColorSpace, + SkColorSpace::MakeSRGB().get(), SkYUVAInfo::PlaneConfig::kY_U_V, SkYUVAInfo::Subsampling::k420, yuv_mailboxes); ri->OrderingBarrierCHROMIUM(); @@ -2345,6 +2346,7 @@ gl->OrderingBarrierCHROMIUM(); ri->ConvertYUVAMailboxesToRGB(dest_mailbox, kJPEG_SkYUVColorSpace, + SkColorSpace::MakeSRGB().get(), SkYUVAInfo::PlaneConfig::kY_UV, SkYUVAInfo::Subsampling::k420, y_uv_mailboxes); ri->OrderingBarrierCHROMIUM();
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 9685623..530a8d84 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -724,7 +724,7 @@ // Start animations before UpdateDrawProperties and PrepareTiles, as they can // change the results. When doing commit to the active tree, this must happen - // after ActivateAnimations() in order for this ticking to be propogated + // after ActivateAnimations() in order for this ticking to be propagated // to layers on the active tree. if (CommitToActiveTree()) Animate();
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 68254db..f477b6b 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1770,7 +1770,6 @@ "//services/device/public/java:geolocation_java", "//services/device/public/java:geolocation_java_test_support", "//services/device/public/mojom:mojom_java", - "//services/media_session/public/mojom:mojom_java", "//services/network/public/mojom:mojom_java", "//services/network/public/mojom:mojom_proxy_config_java", "//services/network/public/mojom:url_loader_base_java",
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index ce1c7a6..ddb41aae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -75,6 +75,7 @@ private static final float TAN_OF_REORDER_ANGLE_START_THRESHOLD = (float) Math.tan(Math.PI / 4.0f); private static final float REORDER_OVERLAP_SWITCH_PERCENTAGE = 0.53f; + private static final float DROP_INTO_GROUP_MAX_OFFSET = 36.f; // Animation/Timer Constants private static final int RESIZE_DELAY_MS = 1500; @@ -91,10 +92,14 @@ private static final int ANIM_TAB_DRAW_X_MS = 250; private static final int ANIM_TAB_SELECTION_DELAY = 150; private static final int ANIM_TAB_MOVE_MS = 125; + private static final long INVALID_TIME = 0L; + static final long DROP_INTO_GROUP_MS = 300L; // Visibility Constants private static final float TAB_STACK_WIDTH_DP = 4.f; private static final float TAB_OVERLAP_WIDTH_DP = 24.f; + private static final float TAB_WIDTH_SMALL = 108.f; + private static final float TAB_WIDTH_MEDIUM = 156.f; private static final float MAX_TAB_WIDTH_DP = 265.f; private static final float REORDER_MOVE_START_THRESHOLD_DP = 50.f; private static final float REORDER_EDGE_SCROLL_MAX_SPEED_DP = 1000.f; @@ -106,12 +111,12 @@ private static final float NEW_TAB_BUTTON_HEIGHT_DP = 24.f; private static final float NEW_TAB_BUTTON_PADDING_DP = 24.f; private static final float NEW_TAB_BUTTON_TOUCH_TARGET_OFFSET = 12.f; + static final float BACKGROUND_TAB_BRIGHTNESS_DEFAULT = 1.f; + static final float BACKGROUND_TAB_BRIGHTNESS_DIMMED = 0.65f; static final float FADE_FULL_OPACITY_THRESHOLD_DP = 24.f; - private static final float TAB_WIDTH_SMALL = 108.f; private static final int MESSAGE_RESIZE = 1; private static final int MESSAGE_UPDATE_SPINNER = 2; - private static final float TAB_WIDTH_MEDIUM = 156.f; private static final float CLOSE_BTN_VISIBILITY_THRESHOLD_END_MODEL_SELECTOR = 120.f; private static final float CLOSE_BTN_VISIBILITY_THRESHOLD_END = 72.f; private static final float CLOSE_BTN_VISIBILITY_THRESHOLD_START = 96.f; @@ -160,6 +165,10 @@ private float mTabMarginWidth; private float mStripStartMarginForReorder; private long mLastReorderScrollTime; + private long mLastUpdateTime; + private long mHoverStartTime; + private float mHoverStartOffset; + private boolean mHoveringOverGroup; // Tab switch efficiency private Long mTabScrollStartTime; @@ -323,6 +332,7 @@ * @return The brightness of background tabs in the tabstrip. */ public float getBackgroundTabBrightness() { + // TODO(crbug.com/1347591): Remove unused brightness code. return mInReorderMode ? 0.75f : 1.0f; } @@ -521,6 +531,8 @@ * @return Whether or not animations are done. */ public boolean updateLayout(long time) { + mLastUpdateTime = time; + // 1. Handle any Scroller movements (flings). updateScrollOffset(time); @@ -807,6 +819,7 @@ long time, float x, float y, float deltaX, float deltaY, float totalX, float totalY) { resetResizeTimeout(false); + mLastUpdateTime = time; deltaX = MathUtils.flipSignIf(deltaX, LocalizationUtils.isLayoutRtl()); // 1. Reset the button state. @@ -1670,7 +1683,7 @@ public void startReorderModeAtIndexForTesting(int index) { StripLayoutTab tab = mStripTabs[index]; updateStrip(); - startReorderMode(0L, 0f, tab.getDrawX() + (tab.getWidth() / 2)); + startReorderMode(INVALID_TIME, 0f, tab.getDrawX() + (tab.getWidth() / 2)); } @VisibleForTesting @@ -1692,17 +1705,23 @@ if (mInteractingTab == null) return; // 3. Set initial state parameters. - mLastReorderScrollTime = 0; + mLastReorderScrollTime = INVALID_TIME; + mHoverStartTime = INVALID_TIME; + mHoverStartOffset = 0; mReorderState = REORDER_SCROLL_NONE; mLastReorderX = startX; mTabMarginWidth = mCachedTabWidth / 2; mInReorderMode = true; + mHoveringOverGroup = false; // 4. Select this tab so that it is always in the foreground. TabModelUtils.setIndex( mModel, TabModelUtils.getTabIndexById(mModel, mInteractingTab.getId()), false); - // 5. Fast expand to make sure this tab is visible. If tabs are not cascaded, the selected + // 5. Dim the background tabs. + setBackgroundTabsDimmed(true); + + // 6. Fast expand to make sure this tab is visible. If tabs are not cascaded, the selected // tab will already be visible, so there's no need to fast expand to make it visible. if (mShouldCascadeTabs) { float fastExpandDelta = @@ -1711,9 +1730,11 @@ mScrollOffset, 0, (int) fastExpandDelta, 0, time, getExpandDuration()); } else if (isTabGroupsEnabled()) { computeAndUpdateTabGroupMargins(true, true); + setTabGroupDimmed( + mTabGroupModelFilter.getRootId(getTabById(mInteractingTab.getId())), false); } - // 6. Request an update. + // 7. Request an update. mUpdateHost.requestUpdate(); } @@ -1721,9 +1742,7 @@ if (!mInReorderMode) return; // 1. Reset the state variables. - mLastReorderScrollTime = 0; mReorderState = REORDER_SCROLL_NONE; - mLastReorderX = 0.f; mInReorderMode = false; // 2. Clear any drag offset. @@ -1734,7 +1753,10 @@ mRunningAnimator.start(); // 3. Clear any tab group margins if they are enabled. - if (isTabGroupsEnabled()) resetTabGroupMargins(); + if (isTabGroupsEnabled()) { + resetTabGroupMargins(); + setBackgroundTabsDimmed(false); + } // 4. Request an update. mUpdateHost.requestUpdate(); @@ -1798,25 +1820,145 @@ updateScrollOffsetLimits(allowReorder); } + private void setBackgroundTabsDimmed(boolean dimmed) { + for (int i = 0; i < mStripTabs.length; i++) { + final StripLayoutTab tab = mStripTabs[i]; + + if (tab != mInteractingTab) { + tab.setBrightness(dimmed ? BACKGROUND_TAB_BRIGHTNESS_DIMMED + : BACKGROUND_TAB_BRIGHTNESS_DEFAULT); + } + } + } + + private void setTabGroupDimmed(int groupId, boolean dimmed) { + // Should only target tab groups if reordering with tab groups for tablet enabled. + if (!isTabGroupsEnabled()) return; + + for (int i = 0; i < mStripTabs.length; i++) { + final StripLayoutTab tab = mStripTabs[i]; + + if (mTabGroupModelFilter.getRootId(getTabById(tab.getId())) == groupId) { + tab.setBrightness(dimmed ? BACKGROUND_TAB_BRIGHTNESS_DIMMED + : BACKGROUND_TAB_BRIGHTNESS_DEFAULT); + } + } + } + + /** + * This method determines the new index for the interacting tab, based on whether or not it has + * met the conditions to be moved out of its tab group. + * + * @param offset The distance the interacting tab has been dragged from its ideal x-position. + * @param curIndex The index of the interacting tab. + * @return The new index for the interacting tab if it has been removed from its tab group and + * the INVALID_TAB_INDEX otherwise. + */ private int maybeMoveOutOfGroup(float offset, int curIndex) { + // If past threshold, un-dim hovered group and trigger reorder. if (Math.abs(offset) > mTabMarginWidth * REORDER_OVERLAP_SWITCH_PERCENTAGE) { - mTabGroupModelFilter.moveTabOutOfGroupInDirection(mInteractingTab.getId(), offset > 0); + final int tabId = mInteractingTab.getId(); + + setTabGroupDimmed(mTabGroupModelFilter.getRootId(getTabById(tabId)), true); + mTabGroupModelFilter.moveTabOutOfGroupInDirection(tabId, offset > 0); + return curIndex; } return TabModel.INVALID_TAB_INDEX; } + /** + * This method determines the new index for the interacting tab, based on whether or not it has + * met the conditions to be merged into a neighboring tab group. + * + * @param offset The distance the interacting tab has been dragged from its ideal x-position. + * @param curIndex The index of the interacting tab. + * @param towardEnd True if the interacting tab is being dragged toward the end of the strip. + * @return The new index for the interacting tab if it has been moved into a neighboring tab + * group and the INVALID_TAB_INDEX otherwise. + */ + private int maybeMergeToGroup(float offset, int curIndex, boolean towardEnd) { + // 1. Only attempt to merge if hovering a group for a valid amount of time. + if (!mHoveringOverGroup) return TabModel.INVALID_TAB_INDEX; + + // 2. Set initial hover variables if we have not yet started or if we have moved too far + // from the initial hover. Since we have just started a new hover, do not trigger a + // reorder. + if (mHoverStartTime == INVALID_TIME + || Math.abs(mHoverStartOffset - offset) > DROP_INTO_GROUP_MAX_OFFSET) { + mHoverStartTime = mLastUpdateTime; + mHoverStartOffset = offset; + + return TabModel.INVALID_TAB_INDEX; + } + + // 3. If we have not yet hovered for the required amount of time, keep waiting and do not + // trigger a reorder. + if (mLastUpdateTime - mHoverStartTime < DROP_INTO_GROUP_MS) { + mUpdateHost.requestUpdate(); + + return TabModel.INVALID_TAB_INDEX; + } + + // 4. We have hovered for the required time, so trigger a reorder. + int direction = towardEnd ? 1 : -1; + int destinationTabId = mTabGroupModelFilter.getRootId( + getTabById(mStripTabs[curIndex + direction].getId())); + int numTabsToSkip = (int) ((Math.abs(offset) - mTabMarginWidth) / mCachedTabWidth); + + mTabGroupModelFilter.mergeTabsToGroup(mInteractingTab.getId(), destinationTabId, true); + + return towardEnd ? curIndex + 1 + numTabsToSkip : curIndex - numTabsToSkip; + } + + private int updateHoveringOverGroup(float offset, int curIndex, boolean towardEnd) { + boolean hoveringOverGroup = Math.abs(offset) > mTabMarginWidth - mTabOverlapWidth; + + // 1. Check if hover state has changed. + if (mHoveringOverGroup != hoveringOverGroup) { + // 1.a. Reset hover variables. + mHoveringOverGroup = hoveringOverGroup; + mHoverStartTime = 0L; + mHoverStartOffset = 0; + + // 1.b. Set tab group dim as necessary. + int groupId = mTabGroupModelFilter.getRootId( + getTabById(mStripTabs[curIndex + (towardEnd ? 1 : -1)].getId())); + setTabGroupDimmed(groupId, !mHoveringOverGroup); + } + + // 2. If we are hovering, attempt to merge to the hovered group. + if (mHoveringOverGroup) { + return maybeMergeToGroup(offset, curIndex, towardEnd); + } + + // 3. Default to not triggering a reorder. + return TabModel.INVALID_TAB_INDEX; + } + + /** + * This method determines the new index for the interacting tab, based on whether or not it has + * met the conditions to be moved past a neighboring tab group. + * + * @param offset The distance the interacting tab has been dragged from its ideal x-position. + * @param curIndex The index of the interacting tab. + * @param towardEnd True if the interacting tab is being dragged toward the end of the strip. + * @return The new index for the interacting tab if it should be moved past the neighboring tab + * group and the INVALID_TAB_INDEX otherwise. + */ private int maybeMovePastGroup(float offset, int curIndex, boolean towardEnd) { int direction = towardEnd ? 1 : -1; int groupId = mTabGroupModelFilter.getRootId( getTabById(mStripTabs[curIndex + direction].getId())); int numTabsToSkip = mTabGroupModelFilter.getRelatedTabCountForRootId(groupId); float effectiveTabWidth = mCachedTabWidth - mTabOverlapWidth; - float threshold = (numTabsToSkip * effectiveTabWidth) + mTabMarginWidth - + (REORDER_OVERLAP_SWITCH_PERCENTAGE * mTabMarginWidth); + float threshold = (numTabsToSkip * effectiveTabWidth) + mTabMarginWidth + mTabOverlapWidth; + // If past threshold, un-dim hovered group and trigger reorder. if (Math.abs(offset) > threshold) { + setTabGroupDimmed(groupId, true); + int destIndex = towardEnd ? curIndex + 1 + numTabsToSkip : curIndex - numTabsToSkip; return destIndex; } @@ -1853,10 +1995,12 @@ destIndex = maybeMoveOutOfGroup(offset, curIndex); } else { // 2.b. Tab is not in a group and approaching a margin. Maybe target tab group. - // TODO(crbug.com/1330740): Update internal hovering state. + destIndex = updateHoveringOverGroup(offset, curIndex, towardEnd); // 2.c. Tab is not in a group and approaching a margin. Maybe drag past group. - destIndex = maybeMovePastGroup(offset, curIndex, towardEnd); + if (destIndex == TabModel.INVALID_TAB_INDEX) { + destIndex = maybeMovePastGroup(offset, curIndex, towardEnd); + } } } else { // 2.d Tab is not interacting with tab groups. Reorder as normal. @@ -1978,8 +2122,9 @@ if (!mInReorderMode) return; // 1. Track the delta time since the last auto scroll. - final float deltaSec = - mLastReorderScrollTime == 0 ? 0.f : (time - mLastReorderScrollTime) / 1000.f; + final float deltaSec = mLastReorderScrollTime == INVALID_TIME + ? 0.f + : (time - mLastReorderScrollTime) / 1000.f; mLastReorderScrollTime = time; final float x = mInteractingTab.getDrawX(); @@ -2015,7 +2160,7 @@ mUpdateHost.requestUpdate(); } else { // 4.b. We're not in a gutter. Reset the scroll delta time tracker. - mLastReorderScrollTime = 0; + mLastReorderScrollTime = INVALID_TIME; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java index e29772c3..48da9e2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
@@ -172,6 +172,7 @@ private CompositorAnimator mButtonOpacityAnimation; private float mLoadingSpinnerRotationDegrees; + private float mBrightness = 1.f; // Preallocated private final RectF mClosePlacement = new RectF(); @@ -422,6 +423,20 @@ } /** + * @param brightness The fraction (from 0.f to 1.f) of how bright the tab should be. + */ + public void setBrightness(float brightness) { + mBrightness = brightness; + } + + /** + * @return The fraction (from 0.f to 1.f) of how bright the tab should be. + */ + public float getBrightness() { + return mBrightness; + } + + /** * @param offsetX How far to offset the tab content (favicons and title). */ public void setContentOffsetX(float offsetX) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java index 16699d5..1406614 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java
@@ -182,7 +182,8 @@ st.getDrawX() * mDpToPx, st.getDrawY() * mDpToPx, st.getWidth() * mDpToPx, st.getHeight() * mDpToPx, st.getContentOffsetX() * mDpToPx, st.getCloseButton().getOpacity(), st.isLoading(), - st.getLoadingSpinnerRotation(), layerTitleCache, resourceManager); + st.getLoadingSpinnerRotation(), st.getBrightness(), layerTitleCache, + resourceManager); } } @@ -219,7 +220,7 @@ int closeTint, int handleTint, int handleOutlineTint, boolean foreground, boolean closePressed, float toolbarWidth, float x, float y, float width, float height, float contentOffsetX, float closeButtonAlpha, boolean isLoading, - float spinnerRotation, LayerTitleCache layerTitleCache, + float spinnerRotation, float brightness, LayerTitleCache layerTitleCache, ResourceManager resourceManager); void setContentTree( long nativeTabStripSceneLayer, TabStripSceneLayer caller, SceneLayer contentTree);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java index 188a7ee..2f6058a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/PictureInPictureActivity.java
@@ -16,8 +16,6 @@ import android.content.Intent; import android.content.IntentFilter; import android.content.res.Configuration; -import android.graphics.Bitmap; -import android.graphics.Color; import android.graphics.Rect; import android.graphics.drawable.Icon; import android.os.Build; @@ -108,56 +106,20 @@ private MediaSessionBroadcastReceiver mMediaSessionReceiver; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - MediaActionButtonsManager mMediaActionsButtonsManager; + private MediaActionButtonsManager mMediaActionsButtonsManager; /** * A helper class for managing media action buttons in PictureInPicture window. */ - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - class MediaActionButtonsManager { - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final RemoteAction mPreviousTrack; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final RemoteAction mPlay; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final RemoteAction mPause; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final RemoteAction mReplay; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final RemoteAction mNextTrack; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final RemoteAction mHangUp; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final ToggleRemoteAction mMicrophone; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - final ToggleRemoteAction mCamera; + private class MediaActionButtonsManager { + private final RemoteAction mPreviousTrack; + private final RemoteAction mPlay; + private final RemoteAction mPause; + private final RemoteAction mReplay; + private final RemoteAction mNextTrack; private @PlaybackState int mPlaybackState; - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - class ToggleRemoteAction { - private final RemoteAction mActionOn; - private final RemoteAction mActionOff; - private boolean mState; - - private ToggleRemoteAction( - RemoteAction actionOn, RemoteAction actionOff) { - mActionOn = actionOn; - mActionOff = actionOff; - mState = false; - } - - private void setState(boolean on) { - mState = on; - } - - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - RemoteAction getAction() { - return mState ? mActionOn : mActionOff; - } - } - /** A set of {@link MediaSessionAction}. */ private HashSet<Integer> mVisibleActions; @@ -172,85 +134,35 @@ R.string.accessibility_replay); mNextTrack = createRemoteAction(MediaSessionAction.NEXT_TRACK, R.drawable.ic_skip_next_white_36dp, R.string.accessibility_next_track); - mHangUp = createRemoteAction(MediaSessionAction.HANG_UP, - R.drawable.ic_call_end_white_36dp, R.string.accessibility_hang_up); - mMicrophone = new ToggleRemoteAction( - createRemoteAction(MediaSessionAction.TOGGLE_MICROPHONE, - R.drawable.ic_mic_white_36dp, R.string.accessibility_mute_microphone), - createRemoteAction(MediaSessionAction.TOGGLE_MICROPHONE, - R.drawable.ic_mic_off_white_36dp, - R.string.accessibility_unmute_microphone)); - mCamera = new ToggleRemoteAction(createRemoteAction(MediaSessionAction.TOGGLE_CAMERA, - R.drawable.ic_videocam_white_36dp, - R.string.accessibility_turn_off_camera), - createRemoteAction(MediaSessionAction.TOGGLE_CAMERA, - R.drawable.ic_videocam_off_white_36dp, - R.string.accessibility_turn_on_camera)); mPlaybackState = PlaybackState.END_OF_VIDEO; mVisibleActions = new HashSet<>(); } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @SuppressLint("NewApi") - ArrayList<RemoteAction> getActionsForPictureInPictureParams() { + private ArrayList<RemoteAction> getActionsForPictureInPictureParams() { ArrayList<RemoteAction> actions = new ArrayList<>(); - boolean shouldShowPreviousNextTrack = - mVisibleActions.contains(MediaSessionAction.PREVIOUS_TRACK) - || mVisibleActions.contains(MediaSessionAction.NEXT_TRACK); - if (shouldShowPreviousNextTrack) { - mPreviousTrack.setEnabled( - mVisibleActions.contains(MediaSessionAction.PREVIOUS_TRACK)); - actions.add(mPreviousTrack); - } + mPreviousTrack.setEnabled(mVisibleActions.contains(MediaSessionAction.PREVIOUS_TRACK)); + actions.add(mPreviousTrack); - if (mVisibleActions.contains(MediaSessionAction.PLAY)) { - switch (mPlaybackState) { - case PlaybackState.PLAYING: - actions.add(mPause); - break; - case PlaybackState.PAUSED: - actions.add(mPlay); - break; - case PlaybackState.END_OF_VIDEO: - actions.add(mReplay); - break; - } + RemoteAction playPauseAction = null; + switch (mPlaybackState) { + case PlaybackState.PLAYING: + playPauseAction = mPause; + break; + case PlaybackState.PAUSED: + playPauseAction = mPlay; + break; + case PlaybackState.END_OF_VIDEO: + playPauseAction = mReplay; + break; } + playPauseAction.setEnabled(mVisibleActions.contains(MediaSessionAction.PLAY)); + actions.add(playPauseAction); - if (shouldShowPreviousNextTrack) { - mNextTrack.setEnabled(mVisibleActions.contains(MediaSessionAction.NEXT_TRACK)); - actions.add(mNextTrack); - } - - if (mVisibleActions.contains(MediaSessionAction.TOGGLE_MICROPHONE)) { - actions.add(mMicrophone.getAction()); - } - - if (mVisibleActions.contains(MediaSessionAction.TOGGLE_CAMERA)) { - actions.add(mCamera.getAction()); - } - - if (mVisibleActions.contains(MediaSessionAction.HANG_UP)) { - actions.add(mHangUp); - } - - // Insert a disabled dummy remote action with transparent icon if action list is empty. - // This is a workaround of the issue that android picture-in-picture will fallback to - // default MediaSession when action list given is empty. - // TODO (jazzhsu): Remove this when android picture-in-picture can accept empty list and - // not fallback to default MediaSession. - if (actions.isEmpty()) { - RemoteAction dummyAction = new RemoteAction( - Icon.createWithBitmap(Bitmap.createBitmap( - new int[] {Color.TRANSPARENT}, 1, 1, Bitmap.Config.ARGB_8888)), - "", "", - PendingIntent.getBroadcast(getApplicationContext(), -1, - new Intent(MEDIA_ACTION), PendingIntent.FLAG_IMMUTABLE)); - dummyAction.setEnabled(false); - actions.add(dummyAction); - } + mNextTrack.setEnabled(mVisibleActions.contains(MediaSessionAction.NEXT_TRACK)); + actions.add(mNextTrack); return actions; } @@ -268,16 +180,8 @@ mPlaybackState = playbackState; } - private void setMicrophoneMuted(boolean muted) { - mMicrophone.setState(!muted); - } - - private void setCameraOn(boolean cameraOn) { - mCamera.setState(cameraOn); - } - /** - * Create a remote action for picture-in-picture window. + * Create a disabled remote action for picture-in-picture window. * * @param action {@link MediaSessionAction} that the action button is corresponding to. * @param iconResourceId used for getting icon associated with the id. @@ -294,10 +198,13 @@ PendingIntent.getBroadcast(getApplicationContext(), action, intent, PendingIntent.FLAG_IMMUTABLE | PendingIntent.FLAG_UPDATE_CURRENT); - return new RemoteAction( + RemoteAction remoteAction = new RemoteAction( Icon.createWithResource(getApplicationContext(), iconResourceId), getApplicationContext().getResources().getText(titleResourceId), "", pendingIntent); + + remoteAction.setEnabled(false); + return remoteAction; } } @@ -328,15 +235,6 @@ case MediaSessionAction.NEXT_TRACK: PictureInPictureActivityJni.get().nextTrack(nativeOverlayWindowAndroid); return; - case MediaSessionAction.TOGGLE_MICROPHONE: - PictureInPictureActivityJni.get().toggleMicrophone(nativeOverlayWindowAndroid); - return; - case MediaSessionAction.TOGGLE_CAMERA: - PictureInPictureActivityJni.get().toggleCamera(nativeOverlayWindowAndroid); - return; - case MediaSessionAction.HANG_UP: - PictureInPictureActivityJni.get().hangUp(nativeOverlayWindowAndroid); - return; default: return; } @@ -410,7 +308,7 @@ // Compute a somewhat arbitrary cut-off of 90% of the window's display width. The PiP // window can't be anywhere near this big, so the exact value doesn't matter. We'll ignore // resizes messages that are above it, since they're spurious. - mMaxWidth = (int) ((getWindowAndroid().getDisplay().getDisplayWidth()) * 0.9); + mMaxWidth = (int) ((getWindowAndroid().getDisplay().getDisplayWidth()) * 0.95); mCompositorView = CompositorViewFactory.create( this, getWindowAndroid(), new ThinWebViewConstraints()); @@ -586,28 +484,14 @@ mAspectRatio = new Rational(width, height); } - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @CalledByNative - void setPlaybackState(@PlaybackState int playbackState) { + private void setPlaybackState(@PlaybackState int playbackState) { mMediaActionsButtonsManager.updatePlaybackState(playbackState); updatePictureInPictureParams(); } @CalledByNative - private void setMicrophoneMuted(boolean muted) { - mMediaActionsButtonsManager.setMicrophoneMuted(muted); - updatePictureInPictureParams(); - } - - @CalledByNative - private void setCameraState(boolean turnedOn) { - mMediaActionsButtonsManager.setCameraOn(turnedOn); - updatePictureInPictureParams(); - } - - @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) - @CalledByNative - void updateVisibleActions(int[] actions) { + private void updateVisibleActions(int[] actions) { HashSet<Integer> visibleActions = new HashSet<>(); for (int action : actions) visibleActions.add(action); mMediaActionsButtonsManager.updateVisibleActions(visibleActions); @@ -720,9 +604,6 @@ void togglePlayPause(long nativeOverlayWindowAndroid); void nextTrack(long nativeOverlayWindowAndroid); void previousTrack(long nativeOverlayWindowAndroid); - void toggleMicrophone(long nativeOverlayWindowAndroid); - void toggleCamera(long nativeOverlayWindowAndroid); - void hangUp(long nativeOverlayWindowAndroid); void compositorViewCreated(long nativeOverlayWindowAndroid, CompositorView compositorView);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index 6f979f3..96c449b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -669,6 +669,7 @@ initAppMenu(); initDirectActionInitializer(); initBottomSheetObserver(); + initSnackbarObserver(); if (mAppMenuCoordinator != null && mModalDialogManagerSupplier.hasValue()) { mModalDialogManagerObserver = new ModalDialogManagerObserver() { @Override @@ -1154,13 +1155,6 @@ mMicStateObserver = voiceToolbarButtonController::updateMicButtonState; voiceRecognitionHandler.addObserver(mMicStateObserver); } - - mSnackbarManagerSupplier.get().isShowingSupplier().addObserver((Boolean isShowing) -> { - if (isShowing && mPageZoomCoordinator != null) { - // On show snackbar, hide page zoom dialog - mPageZoomCoordinator.hide(); - } - }); } } @@ -1494,6 +1488,18 @@ mBottomSheetController.addObserver(mBottomSheetObserver); } + /** + * Initialize logic for hiding page zoom slider when snackbar is showiung + */ + private void initSnackbarObserver() { + mSnackbarManagerSupplier.get().isShowingSupplier().addObserver((Boolean isShowing) -> { + if (isShowing && mPageZoomCoordinator != null) { + // On show snackbar, hide page zoom dialog + mPageZoomCoordinator.hide(); + } + }); + } + public OneshotSupplier<IncognitoReauthController> getIncognitoReauthControllerSupplier() { return mIncognitoReauthControllerOneshotSupplier; }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java index cf26964..4ff6bce 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/fullscreen/FullscreenManagerTest.java
@@ -5,7 +5,7 @@ package org.chromium.chrome.browser.fullscreen; // (http://crbug/642336) -// import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE; +import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE; import android.graphics.Point; import android.graphics.Rect; @@ -36,6 +36,7 @@ import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.base.test.util.FlakyTest; +import org.chromium.base.test.util.Restriction; import org.chromium.base.test.util.UrlUtils; import org.chromium.chrome.R; import org.chromium.chrome.browser.app.ChromeActivity; @@ -593,6 +594,7 @@ @Test @LargeTest @Feature({"Fullscreen"}) + @Restriction(RESTRICTION_TYPE_NON_LOW_END_DEVICE) public void testControlsShownOnUnresponsiveRenderer() { FullscreenManagerTestUtils.disableBrowserOverrides(); mActivityTestRule.startMainActivityWithURL(LONG_HTML_TEST_PAGE);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java index 2b1a9331..4e36bd0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java
@@ -13,7 +13,6 @@ import static org.chromium.base.test.util.Restriction.RESTRICTION_TYPE_NON_LOW_END_DEVICE; import android.app.Activity; -import android.app.RemoteAction; import android.content.Context; import android.content.res.Configuration; import android.graphics.Rect; @@ -49,12 +48,9 @@ import org.chromium.chrome.test.ChromeTabbedActivityTestRule; import org.chromium.chrome.test.util.ActivityTestUtils; import org.chromium.content_public.browser.WebContents; -import org.chromium.content_public.browser.overlay_window.PlaybackState; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.content_public.browser.test.util.WebContentsUtils; -import org.chromium.media_session.mojom.MediaSessionAction; -import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.concurrent.TimeoutException; @@ -190,69 +186,6 @@ testExitOn(activity, () -> activity.close()); } - @Test - @MediumTest - @MinAndroidSdkLevel(Build.VERSION_CODES.O) - public void testMediaActions() throws Throwable { - PictureInPictureActivity activity = startPictureInPictureActivity(); - PictureInPictureActivity.MediaActionButtonsManager manager = - activity.mMediaActionsButtonsManager; - - activity.updateVisibleActions(new int[] {MediaSessionAction.PLAY}); - activity.setPlaybackState(PlaybackState.PAUSED); - ArrayList<RemoteAction> actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.size(), 1); - Assert.assertEquals(actions.get(0), manager.mPlay); - - activity.setPlaybackState(PlaybackState.PLAYING); - actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.get(0), manager.mPause); - - // Both next track and previous track button should be visible when only one of them is - // enabled. The one that is not handled should be visible and disabled. - activity.updateVisibleActions( - new int[] {MediaSessionAction.PLAY, MediaSessionAction.PREVIOUS_TRACK}); - actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.size(), 3); - Assert.assertEquals(actions.get(0), manager.mPreviousTrack); - Assert.assertEquals(actions.get(2), manager.mNextTrack); - Assert.assertTrue(actions.get(0).isEnabled()); - Assert.assertFalse(actions.get(2).isEnabled()); - - // When all actions are not handled, there should be a dummy action presented to prevent - // android picture-in-picture from using default MediaSession. - activity.updateVisibleActions(new int[] {}); - actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.size(), 1); - Assert.assertFalse(actions.get(0).isEnabled()); - testExitOn(activity, () -> activity.close()); - } - - @Test - @MediumTest - @MinAndroidSdkLevel(Build.VERSION_CODES.O) - public void testMediaActionsForVideoConferencing() throws Throwable { - PictureInPictureActivity activity = startPictureInPictureActivity(); - PictureInPictureActivity.MediaActionButtonsManager manager = - activity.mMediaActionsButtonsManager; - - activity.updateVisibleActions(new int[] {MediaSessionAction.TOGGLE_MICROPHONE}); - ArrayList<RemoteAction> actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.size(), 1); - Assert.assertEquals(actions.get(0), manager.mMicrophone.getAction()); - - activity.updateVisibleActions(new int[] {MediaSessionAction.TOGGLE_CAMERA}); - actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.size(), 1); - Assert.assertEquals(actions.get(0), manager.mCamera.getAction()); - - activity.updateVisibleActions(new int[] {MediaSessionAction.HANG_UP}); - actions = manager.getActionsForPictureInPictureParams(); - Assert.assertEquals(actions.size(), 1); - Assert.assertEquals(actions.get(0), manager.mHangUp); - testExitOn(activity, () -> activity.close()); - } - private WebContents getWebContents() { return mActivityTestRule.getActivity().getCurrentWebContents(); }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/NativeUiUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/NativeUiUtils.java index 521aa80..7ddc183 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/NativeUiUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/util/NativeUiUtils.java
@@ -279,7 +279,7 @@ /** * Clicks on a UI element as if done via a controller and waits until all resulting - * animations have finished and propogated to the point of being visible in screenshots. + * animations have finished and propagated to the point of being visible in screenshots. * * @param elementName The UserFriendlyElementName that will be clicked on. * @param position A PointF specifying where on the element to send the click relative to a
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index af46f391..334af1e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -12,6 +12,7 @@ import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; @@ -127,6 +128,8 @@ mStripLayoutHelper.stopReorderModeForTesting(); mStripLayoutHelper.setTabAtPositionForTesting(null); } + + TabUiFeatureUtilities.setTabMinWidthForTesting(null); } /** @@ -1049,6 +1052,63 @@ @Test @Feature("Tab Groups on Tab Strip") + public void testReorder_SetBackgroundTabsDimmed() { + // Mock 5 tabs. + initializeTest(false, false, 0, 5); + mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP); + + // Start reorder mode on first tab. + mStripLayoutHelper.startReorderModeAtIndexForTesting(0); + + // Verify background tabs are dimmed. + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabs(); + float expectedNotDimmed = StripLayoutHelper.BACKGROUND_TAB_BRIGHTNESS_DEFAULT; + float expectedDimmed = StripLayoutHelper.BACKGROUND_TAB_BRIGHTNESS_DIMMED; + assertEquals("Selected tab should not dim.", expectedNotDimmed, tabs[0].getBrightness(), + EPSILON); + assertEquals( + "Background tab should dim.", expectedDimmed, tabs[1].getBrightness(), EPSILON); + assertEquals( + "Background tab should dim.", expectedDimmed, tabs[2].getBrightness(), EPSILON); + assertEquals( + "Background tab should dim.", expectedDimmed, tabs[3].getBrightness(), EPSILON); + assertEquals( + "Background tab should dim.", expectedDimmed, tabs[4].getBrightness(), EPSILON); + } + + @Test + @Feature("Tab Groups on Tab Strip") + public void testReorder_SetSelectedTabGroupNotDimmed() { + // Mock 5 tabs. Group the first two tabs. + initializeTest(false, false, 0, 5); + mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP); + groupTabs(0, 2); + + // Start reorder mode on third tab. Drag to hover over the tab group. + // -100 < -marginWidth = -95 + mStripLayoutHelper.startReorderModeAtIndexForTesting(2); + float dragDistance = -100f; + float startX = mStripLayoutHelper.getLastReorderX(); + mStripLayoutHelper.drag(TIMESTAMP, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + + // Verify background tabs are dimmed, while interacting tab and hovered group are not. + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabs(); + float expectedNotDimmed = StripLayoutHelper.BACKGROUND_TAB_BRIGHTNESS_DEFAULT; + float expectedDimmed = StripLayoutHelper.BACKGROUND_TAB_BRIGHTNESS_DIMMED; + assertEquals("Tab in hovered group should not dim.", expectedNotDimmed, + tabs[0].getBrightness(), EPSILON); + assertEquals("Tab in hovered group should not dim.", expectedNotDimmed, + tabs[1].getBrightness(), EPSILON); + assertEquals("Selected tab should not dim.", expectedNotDimmed, tabs[2].getBrightness(), + EPSILON); + assertEquals( + "Background tab should dim.", expectedDimmed, tabs[3].getBrightness(), EPSILON); + assertEquals( + "Background tab should dim.", expectedDimmed, tabs[4].getBrightness(), EPSILON); + } + + @Test + @Feature("Tab Groups on Tab Strip") public void testReorder_NoGroups() { // Mock 5 tabs. initializeTest(false, false, 0, 5); @@ -1162,6 +1222,44 @@ } @Test + @Feature("Tab Groups on Tab Strip") + public void testReorder_MergeToGroup() { + // Mock 5 tabs. Group the first two tabs. + initializeTest(false, false, 0, 5); + mStripLayoutHelper.onSizeChanged(SCREEN_WIDTH, SCREEN_HEIGHT, false, TIMESTAMP); + StripLayoutTab[] tabs = mStripLayoutHelper.getStripLayoutTabs(); + StripLayoutTab thirdTab = tabs[2]; + groupTabs(0, 2); + + // Start reorder mode on third tab. Drag between tabs in group. + // -300 < -(tabWidth + marginWidth) = -(190 + 95) = -285 + mStripLayoutHelper.startReorderModeAtIndexForTesting(2); + float dragDistance = -300f; + float startX = mStripLayoutHelper.getLastReorderX(); + mStripLayoutHelper.drag(TIMESTAMP, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + + // Verify state has not yet changed. + tabs = mStripLayoutHelper.getStripLayoutTabs(); + assertEquals("Third tab should not have moved.", thirdTab, tabs[2]); + verify(mTabGroupModelFilter, never()).mergeTabsToGroup(anyInt(), anyInt()); + verify(mTabGroupModelFilter, never()).mergeTabsToGroup(anyInt(), anyInt(), anyBoolean()); + + // Wait minimum time to trigger merge. + // -10 > -(dropMaxDragOffset) = -36 + dragDistance = -10; + startX = mStripLayoutHelper.getLastReorderX(); + long timeDelta = StripLayoutHelper.DROP_INTO_GROUP_MS; + mStripLayoutHelper.drag( + TIMESTAMP + timeDelta, startX + dragDistance, 0f, dragDistance, 0f, 0f, 0f); + + // Verify interacting tab was merged into group at the second index. + tabs = mStripLayoutHelper.getStripLayoutTabs(); + // assertEquals("Third tab should now be second tab.", thirdTab, tabs[1]); + verify(mTabGroupModelFilter) + .mergeTabsToGroup(eq(thirdTab.getId()), eq(tabs[0].getId()), eq(true)); + } + + @Test @Feature("Tab Strip Improvements") public void testTabClosing_NoTabResize() { // Arrange
diff --git a/chrome/app/chrome_exe_main_win.cc b/chrome/app/chrome_exe_main_win.cc index 24f7a1c..b3672a15 100644 --- a/chrome/app/chrome_exe_main_win.cc +++ b/chrome/app/chrome_exe_main_win.cc
@@ -33,7 +33,6 @@ #include "base/strings/utf_string_conversions.h" #include "base/time/time.h" #include "base/win/current_module.h" -#include "base/win/dark_mode_support.h" #include "base/win/registry.h" #include "base/win/win_util.h" #include "base/win/windows_version.h" @@ -384,9 +383,6 @@ // Only enable High DPI support for browser and GPU process. if (process_type.empty() || process_type == switches::kGpuProcess) base::win::EnableHighDPISupport(); - // Only enable dark mode support for the browser process. - if (process_type.empty()) - base::win::AllowDarkModeForApp(true); if (AttemptFastNotify(*command_line)) return 0;
diff --git a/chrome/app/chrome_main_delegate.cc b/chrome/app/chrome_main_delegate.cc index 3b19f6a..4c1df2f 100644 --- a/chrome/app/chrome_main_delegate.cc +++ b/chrome/app/chrome_main_delegate.cc
@@ -618,7 +618,6 @@ if (!invoked_in_browser) { CommonEarlyInitialization(); return absl::nullopt; - ; } #if BUILDFLAG(IS_WIN)
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index dc4a0cf5..2d50540 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -5025,6 +5025,18 @@ <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED" desc="The label in an extension's page access submenu when the user blocked any extensions on the current page (sentence case)."> You previously chose to not allow any extensions on <ph name="ORIGIN">$1<ex>google.com</ex></ph> </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK_V2" desc="The label in an extension's context menu to allow the extension access to the page only when the user clicks on the extension action (sentence case)."> + When I click the extension + </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE_V2" desc="The label in an extension's context menu to always allow the extension access to the current origin (sentence case)."> + Always on <ph name="ORIGIN">$1<ex>google.com</ex></ph> + </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES_V2" desc="The label in an extension's context menu to always allow the extension access on all sites (sentence case)."> + Always on all sites + </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_PERMISSIONS_PAGE" desc="The label in an extension's context menu that the user can click to open site permissions page in chrome://extensions (sentence case)."> + Manage site permissions + </message> <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK" desc="The label in an extension's context menu to allow the extension access to the page only when the user clicks on the extension action (sentence case)."> When you click the extension </message> @@ -5087,6 +5099,18 @@ <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED" desc="The label in an extension's page access submenu when the user blocked any extensions on the current page (title case)."> You Previously Chose To Not Allow Any Extensions On <ph name="ORIGIN">$1<ex>google.com</ex></ph> </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK_V2" desc="The label in an extension's context menu to allow the extension access to the page only when the user clicks on the extension action (title case)."> + When I Click the Extension + </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE_V2" desc="The label in an extension's context menu to always allow the extension access to the current origin (title case)."> + Always on <ph name="ORIGIN">$1<ex>google.com</ex></ph> + </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES_V2" desc="The label in an extension's context menu to always allow the extension access on all sites (title case)."> + Always on All Sites + </message> + <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_PERMISSIONS_PAGE" desc="The label in an extension's context menu that the user can click to open site permissions page in chrome://extensions (title case)."> + Manage Site Permissions + </message> <message name="IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK" desc="The label in an extension's context menu to allow the extension access to the page only when the user clicks on the extension action (title case)."> When You Click the Extension </message>
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_PERMISSIONS_PAGE.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_PERMISSIONS_PAGE.png.sha1 new file mode 100644 index 0000000..97a76d9 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_PERMISSIONS_PAGE.png.sha1
@@ -0,0 +1 @@ +b036b24ec161eb04a3e1d987025a36d4194364f0 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES_V2.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES_V2.png.sha1 new file mode 100644 index 0000000..bf157389 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES_V2.png.sha1
@@ -0,0 +1 @@ +c2fdf1188e2c64e976cf2d4da4c38d4595f43e95 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK_V2.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK_V2.png.sha1 new file mode 100644 index 0000000..b5254bc --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK_V2.png.sha1
@@ -0,0 +1 @@ +4fb5e264123d559f26c85dd06c3cebdd1aac36d6 \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE_V2.png.sha1 b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE_V2.png.sha1 new file mode 100644 index 0000000..de98aed --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE_V2.png.sha1
@@ -0,0 +1 @@ +285c9c514e154003fcf7b2e1a5a8eb6e2b5876b0 \ No newline at end of file
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index 9f59a28e..b75976d 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -28,7 +28,7 @@ <translation id="1808667845054772817">Chromiumను మళ్లీ ఇన్స్టాల్ చేయి</translation> <translation id="185970820835152459">మీరు సైన్ ఇన్ చేసిన Google ఖాతాలను మీరు మేనేజ్ చేయవచ్చు. Chromium బ్రౌజర్, Play Store, Gmail, ఇంకా మరిన్నింటి కోసం మీ Google ఖాతాలు ఉపయోగించబడతాయి. ఫ్యామిలీ మెంబర్ వంటి వారి కోసం మీరు ఖాతాను జోడించాలనుకుంటే, బదులుగా కొత్త వ్యక్తిని మీ <ph name="DEVICE_TYPE" />కు జోడించండి. <ph name="LINK_BEGIN" />మరింత తెలుసుకోండి<ph name="LINK_END" /></translation> <translation id="1863308913976887472">మీ ఆసక్తులకు సంబంధించిన సమాచారాన్ని సైట్లు Chromiumతో స్టోర్ చేయగలవు. ఉదాహరణకు, మారథాన్ కోసం షూస్ కొనడానికి మీరు ఒక సైట్ను సందర్శించినట్లయితే, మారథాన్లలో పరిగెత్తడం మీకు ఆసక్తి అని ఆ సైట్ స్టోర్ చేయవచ్చు. తర్వాత, రేస్ కోసం రిజిస్టర్ చేసుకోవడానికి మీరు వేరొక సైట్ను సందర్శిస్తే, మీ ఆసక్తుల ఆధారంగా ఆ సైట్ మీకు పరిగెత్తడానికి అవసరమైన షూస్ యాడ్ను చూపిస్తుంది.</translation> -<translation id="1881322772814446296">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. మీరు ప్రస్తుతం ఉన్న మీ Chromium డేటాను వేరుగా ఉంచడానికి ఐచ్ఛికంగా కొత్త ప్రొఫైల్ను సృష్టించవచ్చు. <ph name="LEARN_MORE" /></translation> +<translation id="1881322772814446296">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. మీరు ప్రస్తుతం ఉన్న మీ Chromium డేటాను వేరుగా ఉంచడానికి ఐచ్ఛికంగా కొత్త ప్రొఫైల్ను సృష్టించవచ్చు. <ph name="LEARN_MORE" /></translation> <translation id="1911763535808217981">దీనిని ఆఫ్ చేయడం ద్వారా, మీరు Chromiumకి సైన్ ఇన్ చేయకుండానే Gmail లాంటి Google సైట్లలో సైన్ ఇన్ చేయగలరు</translation> <translation id="1929939181775079593">Chromium ప్రతిస్పందించడం లేదు. ఇప్పుడు మళ్లీ ప్రారంభించాలా?</translation> <translation id="193439633299369377">అప్డేట్ను వర్తింపజేయడానికి ChromiumOSను రీస్టార్ట్ చేయాలి.</translation> @@ -147,7 +147,7 @@ <translation id="452711251841752011">Chromiumకు స్వాగతం; కొత్త బ్రౌజర్ విండో తెరవబడింది</translation> <translation id="4544142686420020088">Chromium అప్డేట్ అవ్వలేదు, ఏదో తప్పు జరిగింది. <ph name="BEGIN_LINK" />Chromium అప్డేట్ సమస్యలు, విఫలమైన అప్డేట్లను పరిష్కరించండి.<ph name="END_LINK" /></translation> <translation id="454579500955453258">కొత్త Chromium ప్రొఫైల్లో కొనసాగించాలా?</translation> -<translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేశారు. ఇప్పుడు మీరు సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్మార్క్లు, చరిత్ర మరియు ఇతర సెట్టింగ్లను యాక్సెస్ చేయవచ్చు.</translation> +<translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేశారు. ఇప్పుడు మీరు సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్మార్క్లు, హిస్టరీ మరియు ఇతర సెట్టింగ్లను యాక్సెస్ చేయవచ్చు.</translation> <translation id="4594305310729380060">ఈ పరికరంలోని పాస్వర్డ్ మేనేజర్కు</translation> <translation id="459535195905078186">Chromium యాప్లు</translation> <translation id="4613863813562375431">ChromiumOS వెర్షన్</translation> @@ -165,14 +165,14 @@ <translation id="4888717733111232871">mDNS ట్రాఫిక్ను అనుమతించడానికి Chromium ఇన్బౌండ్ నియమం.</translation> <translation id="4893347770495441059">&Chromiumను అప్డేట్ చేయడానికి రీ-లాంచ్ చేయండి</translation> <translation id="4943838377383847465">Chromium నేపథ్య మోడ్లో ఉంది.</translation> -<translation id="4987820182225656817">అతిథులు ఎటువంటి చరిత్రను వదలకుండానే Chromiumను ఉపయోగించవచ్చు.</translation> +<translation id="4987820182225656817">అతిథులు ఎటువంటి హిస్టరీని వదలకుండానే Chromiumను ఉపయోగించవచ్చు.</translation> <translation id="4994636714258228724">Chromiumకు మిమ్మల్ని జోడించుకోండి</translation> <translation id="5114678101347489141">Chromium మీ సమాచారాన్ని తక్కువగా ఉపయోగిస్తూ అదే బ్రౌజింగ్ అనుభవాన్ని అందించడానికి సైట్లను అనుమతించే కొత్త ఫీచర్ల కోసం అన్వేషిస్తోంది</translation> <translation id="5224391634244552924">సేవ్ చేసిన పాస్వర్డ్లు లేవు. మీరు మీ పాస్వర్డ్లను సేవ్ చేసినప్పుడు Chromium వాటిని చెక్ చేయగలదు.</translation> <translation id="5252179775517634216"><ph name="EXISTING_USER" /> ఇప్పటికే ఈ Chromium ప్రొఫైల్కు సైన్ ఇన్ చేశారు. ఇది <ph name="USER_EMAIL_ADDRESS" />కు కొత్త Chromium ప్రొఫైల్ను క్రియేట్ చేస్తుంది</translation> <translation id="5277894862589591112">మీ మార్పులను వర్తింపజేయడానికి, Chromiumని పునఃప్రారంభించండి</translation> <translation id="5296845517486664001">ట్రయల్స్ ఆన్లో ఉన్నప్పుడు, Chromium ర్యాండమ్గా మిమ్మల్ని యాక్టివ్గా ఉన్న ఒక ట్రయల్లో ఉంచినట్లయితే, మీ బ్రౌజింగ్ హిస్టరీ మీరు చూసే యాడ్లను, దిగువున అంచనా వేసిన ఆసక్తులపై ప్రభావం చూపుతుంది. మీ గోప్యతను రక్షించడానికి, Chromium ప్రతి నెలా దశల వారీగా మీ ఆసక్తులను తొలగిస్తుంది.</translation> -<translation id="5358375970380395591">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. <ph name="LEARN_MORE" /></translation> +<translation id="5358375970380395591">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Chromium ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chromium డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. <ph name="LEARN_MORE" /></translation> <translation id="5386450000063123300">Chromium నవీకరించబడుతోంది (<ph name="PROGRESS_PERCENT" />)</translation> <translation id="538767207339317086">Chromium సైన్-ఇన్ని అనుమతించండి</translation> <translation id="5398878173008909840">కొత్త Chromium వెర్షన్ అందుబాటులో ఉంది.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 13c8200..d8bdd589 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -229,7 +229,7 @@ <translation id="120368089816228251">Musieknoot</translation> <translation id="1203942045716040624">Gedeelde werker: <ph name="SCRIPT_URL" /></translation> <translation id="1211769675100312947">Kortpaaie word deur jou saamgestel</translation> -<translation id="1213254615020057352">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. Die eienaar kan kies om diagnostiese en gebruikdata van hierdie toestel na Google toe te stuur. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> +<translation id="1213254615020057352">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. Die eienaar kan kies om diagnostiese en gebruikdata van hierdie toestel na Google toe te stuur. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> <translation id="1213726621272705156">Jy sal nie weer kaarte op hierdie bladsy sien nie</translation> <translation id="121384500095351701">Hierdie lêer kan nie veilig afgelaai word nie</translation> <translation id="1215411991991485844">Nuwe agtergrondprogram bygevoeg</translation> @@ -435,7 +435,7 @@ <translation id="1418954524306642206">Blaai om jou drukker-PPD te spesifiseer</translation> <translation id="1420834118113404499">Medialisensies</translation> <translation id="1420920093772172268"><ph name="TURN_ON_BLUETOOTH_LINK" /> om saambinding moontlik te maak</translation> -<translation id="1421934779300263861">Help om Chrome- en Chrome-bedryfstelsel se kenmerke en werkverrigting beter te maak deur outomaties omvalverslae en diagnostiese en gebruiksdata na Google toe te stuur. Sekere aggregaatdata sal Android-programme en Google-vennote ook help. As die Web- en Programaktiwiteit-instelling vir jou Google-rekening aangeskakel is, kan jou Android-data in jou Google-rekening gestoor word.</translation> +<translation id="1421934779300263861">Help om Chrome- en Chrome-bedryfstelsel se kenmerke en werkverrigting beter te maak deur outomaties omvalverslae en diagnostiese en gebruiksdata na Google toe te stuur. Sekere aggregaatdata sal Android-programme en Google-vennote ook help. As die Web- en App-aktiwiteit-instelling vir jou Google-rekening aangeskakel is, kan jou Android-data in jou Google-rekening gestoor word.</translation> <translation id="1422159345171879700">Laai onveilige skripte</translation> <translation id="1423716227250567100">Hierdie handeling sal: <ph name="LINE_BREAKS" /> @@ -1343,7 +1343,7 @@ <translation id="2232751457155581899">Werwe kan vra om jou kameraposisie na te spoor</translation> <translation id="2232876851878324699">Die lêer het een sertifikaat bevat, wat nie ingevoer is nie:</translation> <translation id="2233502537820838181">Meer inligting</translation> -<translation id="223356358902285214">Web- en Programaktiwiteit</translation> +<translation id="223356358902285214">Web- en App-aktiwiteit</translation> <translation id="2234827758954819389">Privaatheidgids</translation> <translation id="2234876718134438132">Sinkronisering en Google-dienste</translation> <translation id="2235344399760031203">Derdepartywebkoekies word geblokkeer</translation> @@ -1496,7 +1496,7 @@ <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – toestemming is versoek; druk Ctrl + Forward om te antwoord</translation> <translation id="234889437187286781">Kon nie data laai nie</translation> <translation id="2349610121459545414">Hou aan om vir hierdie werf toegang tot jou ligging te gee</translation> -<translation id="2349896577940037438">As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. By account.google.com kan jy jou data sien, dit uitvee en jou rekeninginstellings verander.</translation> +<translation id="2349896577940037438">As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. By account.google.com kan jy jou data sien, dit uitvee en jou rekeninginstellings verander.</translation> <translation id="2350133097354918058">Is herlaai</translation> <translation id="2350182423316644347">Begin tans program …</translation> <translation id="235028206512346451">Jou skerm sal outomaties sluit wanneer jy van jou skerm af wegbeweeg. Jou skerm sal langer wakker bly wanneer jy voor jou toestel is. Jou skerm sal slaap pleks van sluit as jy nie ’n sluitskerm gebruik nie.</translation> @@ -2131,7 +2131,7 @@ <translation id="2942279350258725020">Android-boodskappe</translation> <translation id="2942560570858569904">Wag tans …</translation> <translation id="2942581856830209953">Pasmaak hierdie bladsy</translation> -<translation id="2944060181911631861">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK1" />Kom meer te wete<ph name="END_LINK1" /></translation> +<translation id="2944060181911631861">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK1" />Kom meer te wete<ph name="END_LINK1" /></translation> <translation id="2946054015403765210">Gaan na lêers</translation> <translation id="2946119680249604491">Voeg verbinding by</translation> <translation id="2946640296642327832">Aktiveer Bluetooth</translation> @@ -2213,6 +2213,7 @@ <translation id="3021065318976393105">Terwyl dit battery gebruik</translation> <translation id="3021066826692793094">Skoenlapper</translation> <translation id="3021678814754966447">Bekyk raambron</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> sal van hierdie Chromebook verwyder word en sal nie in <ph name="PRIMARY_EMAIL" /> gestoor word nie.</translation> <translation id="3022978424994383087">Kon dit nie hoor nie.</translation> <translation id="3023464535986383522">Hardoplees</translation> <translation id="3024374909719388945">Gebruik 24 uur-horlosie</translation> @@ -2593,7 +2594,7 @@ <translation id="3433507769937235446">Sluit as jy weggaan</translation> <translation id="3433621910545056227">Oeps! Die stelsel kon nie die toestel se kenmerkeslot by installering vasmaak nie.</translation> <translation id="3434107140712555581"><ph name="BATTERY_PERCENTAGE" />%</translation> -<translation id="3434272557872943250">As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.</translation> +<translation id="3434272557872943250">As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.</translation> <translation id="3434475275396485144">Jou foon se administrateur bestuur hierdie instelling</translation> <translation id="3434512374684753970">Oudio en video</translation> <translation id="3435688026795609344">"<ph name="EXTENSION_NAME" />" versoek tans jou <ph name="CODE_TYPE" /></translation> @@ -2649,7 +2650,7 @@ <translation id="3474218480460386727">Gebruik 99 letters of minder vir nuwe woorde</translation> <translation id="3474624961160222204">Gaan voort as <ph name="NAME" /></translation> <translation id="3475843873335999118">Jammer, jou vingerafdruk word steeds nie herken nie. Voer asseblief jou wagwoord in.</translation> -<translation id="3476303763173086583">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. Die eienaar kan kies om diagnostiese en gebruikdata vir hierdie toestel na Google toe te stuur. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> +<translation id="3476303763173086583">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. Die eienaar kan kies om diagnostiese en gebruikdata vir hierdie toestel na Google toe te stuur. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="347670947055184738">Oeps! Die stelsel kon nie die beleid vir jou toestel gaan haal nie.</translation> <translation id="347785443197175480">Hou aan om <ph name="HOST" /> toegang tot jou kamera en mikrofoon te gee</translation> <translation id="3479552764303398839">Nie nou nie</translation> @@ -3419,7 +3420,7 @@ <translation id="4210048056321123003">Laai tans die virtuele masjien af</translation> <translation id="4210380525132844778">Rede: <ph name="RULE" /> is op die "<ph name="LIST_NAME" />"-lys gevind.</translation> <translation id="421182450098841253">Wys boekmerkbalk</translation> -<translation id="4211851069413100178">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. Die eienaar kan kies om diagnostiese en gebruikdata vir hierdie toestel na Google toe te stuur. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> +<translation id="4211851069413100178">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. Die eienaar kan kies om diagnostiese en gebruikdata vir hierdie toestel na Google toe te stuur. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="4211904048067111541">Hou op om saam met Android-programme te gebruik</translation> <translation id="42126664696688958">Voer uit</translation> <translation id="42137655013211669">Toegang tot hierdie hulpbron is deur die bediener verbied.</translation> @@ -3752,6 +3753,7 @@ <translation id="4535127706710932914">Verstekprofiel</translation> <translation id="4535767533210902251">Die vingerafdruksensor is die sleutel bo regs op jou sleutelbord. Raak met enige vinger liggies daaraan.</translation> <translation id="4536140153723794651">Werwe wat altyd webkoekies kan gebruik</translation> +<translation id="4536769240747010177">Verbindingvermoëns:</translation> <translation id="4538417792467843292">Vee woord uit</translation> <translation id="4538792345715658285">Geïnstalleer deur ondernemingbeleid.</translation> <translation id="4541123282641193691">Kon nie jou rekening verifieer nie. Probeer asseblief weer of herbegin jou Chromebook.</translation> @@ -3779,6 +3781,7 @@ <translation id="4561893854334016293">Geen toestemmings wat onlangs verander is nie</translation> <translation id="4562155214028662640">Voeg vingerafdruk by</translation> <translation id="4563210852471260509">Aanvanklike invoertaal is Chinees</translation> +<translation id="4563382028841851106">Verwyder uit rekening</translation> <translation id="4563880231729913339">Vinger 3</translation> <translation id="4564245002465020751">Stel op jou foon klaar op</translation> <translation id="4565377596337484307">Versteek wagwoord</translation> @@ -3989,7 +3992,7 @@ <translation id="4770119228883592393">Toestemming is versoek; druk ⌘ + Option + afpyl om te antwoord</translation> <translation id="4773112038801431077">Gradeer Linux op</translation> <translation id="4774337692467964393">As Smart Lock aangeskakel is, sal jy nie ’n PIN of wagwoord nodig hê nie</translation> -<translation id="4775142426314270551">Help om Chrome- en Chrome-bedryfstelsel se kenmerke en werkverrigting beter te maak deur outomaties omvalverslae en diagnostiese en gebruiksdata na Google toe te stuur. Sekere aggregaatdata sal Android-programme en Google-vennote ook help. As die Web- en Programaktiwiteit-instelling vir jou kind se Google-rekening aangeskakel is, kan jou kind se Android-data in jou kind se Google-rekening gestoor word.</translation> +<translation id="4775142426314270551">Help om Chrome- en Chrome-bedryfstelsel se kenmerke en werkverrigting beter te maak deur outomaties omvalverslae en diagnostiese en gebruiksdata na Google toe te stuur. Sekere aggregaatdata sal Android-programme en Google-vennote ook help. As die Web- en App-aktiwiteit-instelling vir jou kind se Google-rekening aangeskakel is, kan jou kind se Android-data in jou kind se Google-rekening gestoor word.</translation> <translation id="477647109558161443">Skep 'n werkskermkortpad</translation> <translation id="4776594120007763294">Klik die knoppie om 'n bladsy by te voeg om later te lees</translation> <translation id="4777458362738635055">Ander gebruikers van hierdie toestel kan hierdie netwerk gebruik</translation> @@ -4238,7 +4241,7 @@ <translation id="5016491575926936899">Jy kan SMS'e van jou rekenaar af stuur, jou internetverbinding deel, op gesprekkennisgewings antwoord, en jou <ph name="DEVICE_TYPE" /> met jou foon ontsluit.<ph name="FOOTNOTE_POINTER" /> <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="5017643436812738274">Jy kan met 'n tekspyltjie deur bladsye navigeer. Druk Ctrl+Search+7 om dit af te skakel.</translation> <translation id="5018207570537526145">Maak uitbreidingwebwerf oop</translation> -<translation id="5018526990965779848">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> +<translation id="5018526990965779848">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> <translation id="5021750053540820849">Nog nie opgedateer nie</translation> <translation id="5024511550058813796">Jy sal jou geskiedenis op al jou gesinkroniseerde toestelle hê sodat jy kan voortgaan met dit waarmee jy besig was</translation> <translation id="5026492829171796515">Meld aan om 'n Google-rekening by te voeg</translation> @@ -4411,7 +4414,7 @@ <translation id="5195863934285556588"><ph name="BEGIN_PARAGRAPH1" />Google se liggingdienste gebruik bronne soos wi-fi, selnetwerke en sensors om te help om hierdie toestel se ligging te skat.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Jy kan enige tyd Android-ligging op hierdie toestel afskakel deur te gaan na Instellings > Programme > Google Play Winkel > Bestuur Android-voorkeure > Sekuriteit en ligging > Ligging. Jy kan ook die gebruik van wi-fi, selnetwerke en sensors vir Android-ligging afskakel deur "Google Liggingakkuraatheid" op dieselfde kieslys af te skakel.<ph name="END_PARAGRAPH2" /></translation> <translation id="5197255632782567636">Internet</translation> -<translation id="5198430103906431024">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> +<translation id="5198430103906431024">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> <translation id="5199729219167945352">Eksperimente</translation> <translation id="5203920255089865054">{NUM_EXTENSIONS,plural, =1{Klik om die uitbreiding te bekyk}other{Klik om hierdie uitbreidings te bekyk}}</translation> <translation id="5204673965307125349">Powerwash die toestel en probeer weer.</translation> @@ -4688,6 +4691,7 @@ <translation id="5470735824776589490">'n Herbegin word vereis voordat jou toestel met Powerwash teruggestel kan word. <ph name="LINK_BEGIN" />Kom meer te wete<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hallo daar! Ek is jou teks-na-spraak-stem.</translation> <translation id="5472627187093107397">Stoor wagwoorde vir hierdie werf</translation> +<translation id="5473062644742711742">Kry meer toeganklikheidnutsgoed in die Chrome Webwinkel</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Deur voort te gaan, stem jy in dat hierdie toestel ook outomaties opdaterings en programme van Google, jou kind se diensverskaffer en hierdie toestel se vervaardiger af kan aflaai en installeer – moontlik met gebruik van sellulêre data. Sommige van hierdie programme kan inprogramaankope aanbied.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN moet minstens 1 karakter wees}other{PIN moet minstens # karakters wees}}</translation> @@ -4817,7 +4821,7 @@ <translation id="5584915726528712820"><ph name="BEGIN_PARAGRAPH1" />Dit is algemene inligting oor jou toestel en hoe jy dit gebruik (soos batteryvlak, stelsel- en programaktiwiteit, en foute). Die data sal gebruik word om Android te verbeter, en van die saamgestelde inligting sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help om hul programme en produkte beter te maak.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />As hierdie kenmerk afgeskakel word, beïnvloed dit nie jou toestel se vermoë om die inligting te stuur wat vir noodsaaklike dienste soos stelselopdaterings en sekuriteit benodig word nie.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Die eienaar kan hierdie kenmerk beheer in Instellings > Gevorderd > Stuur diagnostiese en gebruiksdata outomaties na Google.<ph name="END_PARAGRAPH3" /> - <ph name="BEGIN_PARAGRAPH4" />As jou instelling vir bykomende Web- en Programaktiwiteit aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. Jy kan jou data by account.google.com sien, dit uitvee en jou rekeninginstellings verander.<ph name="END_PARAGRAPH4" /></translation> + <ph name="BEGIN_PARAGRAPH4" />As jou instelling vir bykomende Web- en App-aktiwiteit aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. Jy kan jou data by account.google.com sien, dit uitvee en jou rekeninginstellings verander.<ph name="END_PARAGRAPH4" /></translation> <translation id="5585019845078534178">Kaarte</translation> <translation id="5585118885427931890">Kon nie boekmerkvouer skep nie.</translation> <translation id="558563010977877295">Maak 'n spesifieke bladsy of 'n stel bladsye oop</translation> @@ -5279,7 +5283,7 @@ <translation id="6051638103735819069"><ph name="BEGIN_PARAGRAPH1" />As jy Chrome-bedryfstelseltoestelle toelaat om outomatiese verslae te stuur, help dit ons om te prioritiseer wat om in Chrome-bedryfstelsel reg te stel en te verbeter. Hierdie verslae kan dinge insluit soos wanneer Chrome-bedryfstelsel omval, watter kenmerke gebruik is, hoeveel geheue tipies gebruik is, en diagnostiese en gebruiksdata oor Android-programme. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Jy kan toestemming vir hierdie verslae enige tyd in die instellings van jou kind se Chrome-bedryfstelseltoestel begin of stop. As jy 'n domeinadministrateur is, kan jy hierdie instelling in die adminkonsole verander.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />As jy hierdie kenmerk afskakel, beïnvloed dit nie hierdie toestel se vermoë om die inligting te stuur wat nodig is vir noodsaaklike dienste soos stelselopdaterings en sekuriteit nie.<ph name="END_PARAGRAPH3" /> - <ph name="BEGIN_PARAGRAPH4" />As die Web- en Programaktiwiteit-instelling vir jou kind se Google-rekening aangeskakel is, kan jou kind se data ook in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.<ph name="END_PARAGRAPH4" /></translation> + <ph name="BEGIN_PARAGRAPH4" />As die Web- en App-aktiwiteit-instelling vir jou kind se Google-rekening aangeskakel is, kan jou kind se data ook in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.<ph name="END_PARAGRAPH4" /></translation> <translation id="6051811090255711417">Jou organisasie het hierdie lêer geblokkeer omdat dit nie aan ’n sekuriteitbeleid voldoen nie</translation> <translation id="6052488962264772833">Tik die toegangskode in om te begin uitsaai</translation> <translation id="6052976518993719690">SSL-sertifikaatoutoriteit</translation> @@ -5978,7 +5982,7 @@ <translation id="6725206449694821596">Internetdrukkerprotokol (IPP)</translation> <translation id="6725970970008349185">Getal kandidate om per bladsy te wys</translation> <translation id="672609503628871915">Sien wat nuut is</translation> -<translation id="67269783048918309">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> +<translation id="67269783048918309">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="6727969043791803658">Gekoppel, <ph name="BATTERY_PERCENTAGE" />% batterykrag</translation> <translation id="6731320427842222405">Dit kan 'n paar minute neem</translation> <translation id="6733620523445262364">"<ph name="BOOKMARK_TITLE" />" is geskep.</translation> @@ -6112,7 +6116,7 @@ <translation id="6848388270925200958">Jy het op die oomblik 'n paar kaarte wat net op hierdie toestel gebruik kan word</translation> <translation id="6848716236260083778">Laat jou kind aan die vingerafdruksensor raak om die vingerafdruk op te stel. Jou kind se vingerafdrukdata word veilig geberg en verlaat nooit hierdie <ph name="DEVICE_TYPE" /> nie.</translation> <translation id="6850286078059909152">Tekskleur</translation> -<translation id="6851181413209322061">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. As bykomende Web- en Programaktiwiteit vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> +<translation id="6851181413209322061">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. As bykomende Web- en App-aktiwiteit vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> <translation id="6851497530878285708">Program is geaktiveer</translation> <translation id="6853029310037965825"><ph name="APP_TYPE" /> is geïnstalleer vanaf <ph name="BEGIN_LINK" /><ph name="INSTALL_SOURCE" /><ph name="END_LINK" /></translation> <translation id="6853388645642883916">Opdateerder slaap tans</translation> @@ -6208,6 +6212,10 @@ <translation id="6943939122536910181">Is ontkoppel van <ph name="DEVICE" /></translation> <translation id="6945221475159498467">Kies</translation> <translation id="694592694773692225">Herleiding is op hierdie bladsy geblokkeer.</translation> +<translation id="6947015141909171112">Jy sien tans resepte op grond van jou onlangse soekaktiwiteit na resepte. + <ph name="BREAK" /> + <ph name="BREAK" /> + Jy kan instellings deur die kaartkieslys bestuur, of meer opsies sien in Pasmaak Chrome.</translation> <translation id="6949434160682548041">Wagwoord (opsioneel)</translation> <translation id="6950627417367801484">Laai programme terug</translation> <translation id="6952242901357037157">Jy kan ook wagwoorde van jou <ph name="BEGIN_LINK" />Google-rekening<ph name="END_LINK" /> af hier wys</translation> @@ -6461,7 +6469,7 @@ <translation id="7203150201908454328">Uitgevou</translation> <translation id="7206693748120342859">Laai tans <ph name="PLUGIN_NAME" /> af …</translation> <translation id="720715819012336933">{NUM_PAGES,plural, =1{Verlaat bladsy}other{Verlaat bladsye}}</translation> -<translation id="7207457272187520234">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> +<translation id="7207457272187520234">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> <translation id="7207631048330366454">Deursoek programme</translation> <translation id="7210499381659830293">Uitbreidingdrukkers</translation> <translation id="7211783048245131419">Geen skakelaar is nog toegeken nie</translation> @@ -7004,6 +7012,7 @@ <translation id="7737115349420013392">Bind tans saam met "<ph name="DEVICE_NAME" />" …</translation> <translation id="7737846262459425222">Jy kan dit enige tyd verander in Instellings > Google Assistent > Skerminhoud.</translation> <translation id="7737948071472253612">Mag nie jou kamera gebruik nie</translation> +<translation id="77381465218432215">Wys aksentmerke en spesiale karakters</translation> <translation id="7740996059027112821">Standaard</translation> <translation id="7741307896921365578">Aktiveer die kantpaneel van 'n blaaivlak om op 'n nuttige en deurlopende manier toegang tot jou Leeslys en Boekmerke te kry.</translation> <translation id="7742558784808143689">Vee werfdata en toestemmings vir <ph name="SITE_NAME" />, alle werwe onder dit, en geïnstalleerde programme uit?</translation> @@ -7130,7 +7139,7 @@ <translation id="7850353716413205957">Deursoek enige deel van die bladsy met <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="7850717413915978159"><ph name="BEGIN_PARAGRAPH1" />As jy jou Chrome-bedryfstelseltoestelle toelaat om outomatiese verslae te stuur, help dit ons om te prioritiseer wat om in Chrome-bedryfstelsel reg te stel en te verbeter. Hierdie verslae kan dinge insluit soos wanneer Chrome-bedryfstelsel omval, watter kenmerke jy gebruik, hoeveel geheue jy gewoonlik gebruik, en diagnostiese en gebruiksdata oor Android-programme. Sekere aggregaatdata sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Jy kan toestemming vir hierdie verslae enige tyd in jou Chrome-bedryfstelseltoestel se instellings begin of stop. As jy 'n domeinadministrateur is, kan jy hierdie instelling in die adminkonsole verander.<ph name="END_PARAGRAPH2" /> - <ph name="BEGIN_PARAGRAPH3" />As die Web- en Programaktiwiteit-instelling vir jou Google-rekening aangeskakel is, kan jou Android-data in jou Google-rekening gestoor word. Jy kan by account.google.com jou data sien, dit uitvee en jou rekeninginstellings verander.<ph name="END_PARAGRAPH3" /></translation> + <ph name="BEGIN_PARAGRAPH3" />As die Web- en App-aktiwiteit-instelling vir jou Google-rekening aangeskakel is, kan jou Android-data in jou Google-rekening gestoor word. Jy kan by account.google.com jou data sien, dit uitvee en jou rekeninginstellings verander.<ph name="END_PARAGRAPH3" /></translation> <translation id="7851021205959621355"><ph name="BEGIN_BOLD" />Let wel<ph name="END_BOLD" />: 'n Soortgelyke stem of opname kan dalk toegang tot jou persoonlike resultate of jou Assistent kry. As jy batterykrag wil bespaar, kan jy in jou Assistent-instellings kies dat "Ok Google" net aan moet wees wanneer hierdie toestel aan 'n kragbron gekoppel is.</translation> <translation id="7851457902707056880">Aanmelding is net tot die eienaarrekening beperk. Herselflaai asseblief en meld met die eienaarrekening aan. Die masjien sal oor 30 sekondes herselflaai.</translation> <translation id="7851716364080026749">Blokkeer altyd toegang tot kamera en mikrofoon</translation> @@ -7582,7 +7591,7 @@ <translation id="8267961145111171918"><ph name="BEGIN_PARAGRAPH1" />Dit is algemene inligting oor hierdie toestel en hoe dit gebruik word (soos batteryvlak, stelsel- en programaktiwiteit, en foute). Die data sal gebruik word om Android te verbeter, en van die saamgestelde inligting sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help om hul programme en produkte beter te maak.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />As hierdie kenmerk afgeskakel word, beïnvloed dit nie hierdie toestel se vermoë om die inligting te stuur wat vir noodsaaklike dienste soos stelselopdaterings en sekuriteit benodig word nie.<ph name="END_PARAGRAPH2" /> <ph name="BEGIN_PARAGRAPH3" />Die eienaar kan hierdie kenmerk beheer in Instellings > Gevorderd > Stuur diagnostiese en gebruiksdata outomaties na Google.<ph name="END_PARAGRAPH3" /> - <ph name="BEGIN_PARAGRAPH4" />As die instelling vir bykomende Web- en Programaktiwiteit vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.<ph name="END_PARAGRAPH4" /></translation> + <ph name="BEGIN_PARAGRAPH4" />As die instelling vir bykomende Web- en App-aktiwiteit vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. Kom by families.google.com meer te wete oor hierdie instellings en hoe om hulle te verstel.<ph name="END_PARAGRAPH4" /></translation> <translation id="826905130698769948">Ongeldige kliëntesertifikaat</translation> <translation id="827097179112817503">Wys tuisknoppie</translation> <translation id="8271268254812352141">Kry definisies, vertalings of eenheidomskakelings wanneer jy regsklik of teks raak en hou. Pasmaak vertaaltale in <ph name="LINK_BEGIN" />Webwerftale<ph name="LINK_END" />.</translation> @@ -7794,6 +7803,7 @@ <translation id="8486666913807228950">Rede: Die omgekeerde reël <ph name="REVERT_RULE" /> is op die "Verplig oopmaak in"-lys gevind.</translation> <translation id="848666842773560761">'n Program probeer tans om toegang tot die kamera te verkry. Skakel die kamera se privaatheidskakelaar af om toegang te gee.</translation> <translation id="8487678622945914333">Zoem in</translation> +<translation id="8487699605742506766">Warmkol</translation> <translation id="8489156414266187072">Persoonlike voorstelle word net in jou rekening gewys</translation> <translation id="8490896350101740396">Die volgende kioskprogramme "<ph name="UPDATED_APPS" />" is opgedateer. Herselflaai die toestel om die opdateringproses te voltooi.</translation> <translation id="8492685019009920170">Raak met jou vinger aan die vingerafdruksensor. Jou data word veilig geberg en verlaat nooit jou <ph name="DEVICE_TYPE" /> nie.</translation> @@ -7883,7 +7893,7 @@ <translation id="8591783563402255548">1 sekonde</translation> <translation id="8592141010104017453">Moet glad nie kennisgewings wys nie</translation> <translation id="859246725979739260">Hierdie werf word gekeer om toegang tot jou ligging te kry</translation> -<translation id="8593121833493516339">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As bykomende Web- en Programaktiwiteit vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK1" />Kom meer te wete<ph name="END_LINK1" /></translation> +<translation id="8593121833493516339">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As bykomende Web- en App-aktiwiteit vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK1" />Kom meer te wete<ph name="END_LINK1" /></translation> <translation id="8594908476761052472">Vang video vas</translation> <translation id="8596540852772265699">Gepasmaakte lêers</translation> <translation id="8597845839771543242">Eiendomsformaat:</translation> @@ -7929,7 +7939,7 @@ <translation id="8636500887554457830">Moenie werwe toelaat om opspringers te stuur of herleidings te gebruik nie</translation> <translation id="8637688295594795546">Stelselopdatering is beskikbaar. Berei tans voor om af te laai …</translation> <translation id="8639047128869322042">Kontroleer tans vir skadelike sagteware …</translation> -<translation id="8639635302972078117">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> +<translation id="8639635302972078117">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> <translation id="8642900771896232685">2 sekondes</translation> <translation id="8642947597466641025">Maak teks groter</translation> <translation id="8643443571868262066"><ph name="FILE_NAME" /> kan gevaarlik wees. Stuur dit na Google Gevorderde Beskerming om te skandeer?</translation> @@ -8022,7 +8032,7 @@ <translation id="8719653885894320876">Kon nie <ph name="PLUGIN_NAME" /> aflaai nie</translation> <translation id="8720200012906404956">Soek tans 'n selnetwerk. <ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /></translation> <translation id="8720816553731218127">Die inisialisering van kenmerke by installering het uitgetel.</translation> -<translation id="8722912030556880711">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> +<translation id="8722912030556880711">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="8724405322205516354">Gebruik jou vingerafdruk vir identifikasie om aankope goed te keur wanneer jy hierdie ikoon sien.</translation> <translation id="8724409975248965964">Vingerafdruk is bygevoeg</translation> <translation id="8724859055372736596">Wys in vouer</translation> @@ -8243,7 +8253,7 @@ <translation id="8929696694736010839">Net huidige Incognito-sessie</translation> <translation id="8930351635855238750">Nuwe webkoekie-instellings sal in werking tree nadat die bladsy herlaai is</translation> <translation id="8930622219860340959">Draadloos</translation> -<translation id="8931076093143205651">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. Die eienaar kan kies om diagnostiese en gebruikdata van hierdie toestel na Google toe te stuur. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> +<translation id="8931076093143205651">Stuur gebruik- en diagnostiese data. Help om jou Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie instelling word deur die eienaar toegepas. Die eienaar kan kies om diagnostiese en gebruikdata van hierdie toestel na Google toe te stuur. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word.</translation> <translation id="8931475688782629595">Bestuur wat jy sinkroniseer</translation> <translation id="8932654652795262306">Kitsverbindingbesonderhede</translation> <translation id="893298445929867520">Mandjies is versteek. Hulle sal weer verskyn wanneer jy veranderinge aanbring.</translation> @@ -8291,6 +8301,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" en 1 ander oortjie}other{"<ph name="TAB_TITLE" />" en # ander oortjies}}</translation> <translation id="8977811652087512276">Verkeerde wagwoord of korrupte lêer</translation> <translation id="8978154919215542464">Aan – sinkroniseer alles</translation> +<translation id="8978670037548431647">Herlaai verbindingvermoëns</translation> <translation id="897939795688207351">Op <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Terugvoerverslae</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – Omgeval</translation> @@ -8502,8 +8513,8 @@ <translation id="9170848237812810038">Ontdoen</translation> <translation id="9170884462774788842">'n Ander program op jou rekenaar het 'n tema bygevoeg wat Chrome se werkwyse kan verander.</translation> <translation id="917350715406657904">Jy het die tydlimiet bereik wat jou ouer vir <ph name="APP_NAME" /> gestel het. Jy kan dit môre <ph name="TIME_LIMIT" /> lank gebruik.</translation> -<translation id="9174401638287877180">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> -<translation id="9176476835295860688">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. As jou bykomende Web- en Programaktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> +<translation id="9174401638287877180">Stuur gebruik- en diagnostiese data. Help om jou kind se Android-ervaring beter te maak deur diagnostiese, toestel- en programgebruikdata outomaties na Google toe te stuur. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word.</translation> +<translation id="9176476835295860688">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. Hierdie <ph name="BEGIN_LINK1" />instelling<ph name="END_LINK1" /> word deur die eienaar afgedwing. As jou bykomende Web- en App-aktiwiteit-instelling aangeskakel is, kan hierdie data in jou Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="9176611096776448349"><ph name="WINDOW_TITLE" /> – Bluetooth-toestel is gekoppel</translation> <translation id="9177949831069307748">Lees Chrome OS Flex-toestelinligting en -toesteldata.</translation> <translation id="9178061802301856367">Vee aanmelddata uit</translation> @@ -8514,7 +8525,7 @@ <translation id="918352324374649435">{COUNT,plural, =1{Program}other{# programme}}</translation> <translation id="9186963452600581158">Meld met jou kind se Google-rekening aan</translation> <translation id="9187967020623675250">Sleutels stem nie ooreen nie. Druk enige sleutel en <ph name="RESPONSE" />.</translation> -<translation id="9188732951356337132">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en Programaktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> +<translation id="9188732951356337132">Stuur gebruik- en diagnostiese data. Hierdie toestel stuur tans diagnostiese, toestel- en programgebruikdata outomaties na Google toe. Dit sal nie gebruik word om jou kind te identifiseer nie en sal met stelsel- en programstabiliteit en ander verbeteringe help. Sekere saamgestelde data sal ook Google-programme en -vennote, soos Android-ontwikkelaars, help. As die bykomende Web- en App-aktiwiteit-instelling vir jou kind aangeskakel is, kan hierdie data in hul Google-rekening gestoor word. <ph name="BEGIN_LINK2" />Kom meer te wete<ph name="END_LINK2" /></translation> <translation id="9192019773545828776">Hoor gesproke terugvoer sodat jy jou toestel kan gebruik sonder om na die skerm te kyk. Braille-terugvoer is beskikbaar met ’n gekoppelde toestel. Gebruik Ctrl + Alt + Z om ChromeVox aan en af te skakel. Gebruik Soek + linkspyl of regspyl om te navigeer. Gebruik Soek + spasiebalk om te kies (aktiveer).</translation> <translation id="919686179725692564">Kom meer te wete oor die rugsteun van jou programme</translation> <translation id="9198090666959937775">Gebruik jou Android-foon as 'n sekuriteitsleutel</translation> @@ -8557,6 +8568,7 @@ <translation id="935854577147268200">Smart Lock-foon het verander. Voer jou wagwoord in om Smart Lock op te dateer. Jou foon sal volgende keer jou <ph name="DEVICE_TYPE" /> ontsluit. Jy kan Smart Lock in Instellings afskakel</translation> <translation id="936646668635477464">Kamera en mikrofoon</translation> <translation id="936801553271523408">Stelsel se diagnostiese data</translation> +<translation id="937053962468712792">Verwyder <ph name="DEVICE" /> van <ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Herstel uitbreiding</translation> <translation id="938568644810664664">Probeer “Ok Google, what song is this?” of “Ok Google, what's on my screen?”</translation> <translation id="938623846785894166">Ongewone lêer</translation>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 46e8412..0b937324 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ማይክሮፎንዎን እና ካሜራዎን ይጠቀማል</translation> <translation id="1005333234656240382">የADB ስሕተት ማረሚያ ይንቃ?</translation> <translation id="1006873397406093306">ይህ ቅጥያ የእርስዎን ውሂብ በጣቢያዎች ላይ ማንበብ እና መለወጥ ይችላል። ቅጥያው የትኛዎቹን ጣቢያዎች መድረስ እንደሚችል መቆጣጠር ይችላሉ።</translation> +<translation id="1007057452468855774">Google Play መደብርን አብራ</translation> <translation id="1008186147501209563">ዕልባቶችን ወደ ውጭ ላክ</translation> <translation id="1008557486741366299">አሁን አይደለም</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> አካባቢ</translation> <translation id="1009663062402466586">የጨዋታ መቆጣጠሪያዎች አሁን ይገኛሉ</translation> <translation id="1010498023906173788">ይህ ትር ከተከታታይ ወደብ ጋር ተገናኝቷል።</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{ገጽ ምላሽ አይሰጥም}one{ገጾች ምላሽ አይሰጡም}other{ገጾች ምላሽ አይሰጡም}}</translation> +<translation id="1011003645819296594">የተቀመጡ መሣሪያዎች</translation> <translation id="1011355516189274711">የጽሑፍ-ወደ-ንግግር ድምጽ መጠን</translation> <translation id="1012794136286421601">የእርስዎ የሰነዶች፣ ሉሆች፣ ተንሸራታቾች እና ስዕሎች ፋይሎች በመመሳሰል ላይ ናቸው። መስመር ላይ ወይም ከመስመር ውጪ እንዲደርሱባቸው የGoogle Drive መተግበሪያውን ይክፈቱ።</translation> <translation id="1012876632442809908">USB-C መሣሪያ (የፊት ወደብ)</translation> @@ -492,6 +494,7 @@ <translation id="1470350905258700113">ይህንን መሣሪያ ይጠቀሙ</translation> <translation id="1470946456740188591">በጽሑፍ ጠቃሚ አሰሳን ለማብራት ወይም ለማጥፋት የCtrl+Search+7 አቋራጩን ይጠቀሙ</translation> <translation id="1472675084647422956">ተጨማሪ አሳይ</translation> +<translation id="1473223074251193484">እንደ ሞደም መሰካት ውቅረትን አቀናብር</translation> <translation id="1474785664565228650">በማይክራፎን ቅንብር ላይ የሚደረግ ለውጥ ዳግም ለመጀመር የትይዩዎች ዴስክቶፕን ይፈልጋል። ለመቀጠል Parallels Desktopን ዳግም ያስጀምሩ።</translation> <translation id="1474893630593443211">እርስዎ የሚመለከቷቸው ማስታወቂያዎች ላይ ተጨማሪ ቁጥጥር</translation> <translation id="1475502736924165259">ከሌሎች ማንኛቸውም መደቦች ጋር የማይገጣጠሙ የእውቅና ማረጋገጫዎች በፋይል ላይ አለዎት</translation> @@ -1121,6 +1124,7 @@ <translation id="2044014337866019681">እባክዎ ክፍለ-ጊዜውን ለመክፈት <ph name="ACCOUNT" />ን እያረጋገጡ መሆንዎን ያረጋግጡ።</translation> <translation id="204497730941176055">Microsoft Certificate Template Name</translation> <translation id="2045117674524495717">የቁልፍ ሰሌዳ አቋራጭ አጋዥ</translation> +<translation id="2045211794962848221">ይህን የተወሰነ መልዕክት በድጋሚ አያዩም</translation> <translation id="2045969484888636535">ኩኪዎች ማገዱን ይቀጥሉ</translation> <translation id="204622017488417136">የእርስዎ መሣሪያ ወደ ቀደም ሲል ተጭኖ የነበረው የChrome ስሪት እንዲመለስ ይደረጋል። ሁሉም የተጠቃሚ መለያዎች እና የአካባቢ ውሂብ ይወገዳሉ። ይህ አንዴ ከተደረገ በኋላ ሊቀለበስ አይችልም።</translation> <translation id="2046702855113914483">ራመን</translation> @@ -3805,6 +3809,7 @@ <translation id="4594577641390224176">ስለ ገጽ ስርዓቱን እየፈለጉ ነው? ይጎብኙ</translation> <translation id="4595560905247879544">መተግበሪያዎች እና ቅጥያዎች በአስተዳዳሪው ብቻ ነው ሊቀየሩ የሚችሉት (<ph name="CUSTODIAN_NAME" />)።</translation> <translation id="4596295440756783523">እነዚህን አገልጋዮች የሚለዩ የዕውቅና ማረጋገጫዎች በፋይሉ ላይ አለዎት</translation> +<translation id="4598345735110653698">የይለፍ ቁልፎችን አስተዳድር</translation> <translation id="4598556348158889687">የማከማቻ አስተዳደር</translation> <translation id="4598776695426288251">Wi-Fi በበርካታ መሣሪያዎች በኩል ይገኛል</translation> <translation id="4601426376352205922">እንዳልተነበበ ምልክት አድርግ</translation> @@ -4030,6 +4035,7 @@ <translation id="4823894915586516138">ይህ ፒን ወይም የይለፍ ቃል ከስልክዎ የሚደርሱት ማንኛውም መረጃን አካትቶ በዚህ <ph name="DEVICE_TYPE" /> ላይ ውሂብዎን ይጠብቃል</translation> <translation id="4824037980212326045">የLinux ምትኬ እና ወደነበረበት መመለስ</translation> <translation id="4824958205181053313">ስምረት ይሰረዝ?</translation> +<translation id="4825532258163983651">የይለፍ ቁልፍን መሰረዝ አልተቻለም</translation> <translation id="4827675678516992122">መገናኘት አልተቻለም</translation> <translation id="4827784381479890589">በChrome አሳሽ ውስጥ የተሻሻለ የፊደል ማረም (የፊደል አጻጻፍ አስተያየቶችን ለማግኘት ጽሑፍ ወደ Google ይላካል)</translation> <translation id="4827904420700932487">ለዚህ ምስል የQR ኮድ ፍጠር</translation> @@ -4292,6 +4298,7 @@ <translation id="5087249366037322692">በሶስተኛ ወገን ታክሏል</translation> <translation id="5087580092889165836">ካርድ አክል</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 ከRSA ምስጠራ ጋር</translation> +<translation id="5089763948477033443">የጎን ፓነል የመጠን መቀየሪያ መያዣ</translation> <translation id="5090637338841444533">የካሜራዎን አቀማመጥ ለመከታተል አልተፈቀደም</translation> <translation id="5093569275467863761">ማንነት የማያሳውቅ የጀርባ/ፊት መሸጎጫ ንዑስ ክፈፍ፦ <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ከፋይሎች መተግበሪያው ወይም ከሌሎች መተግበሪያዎች ሆነው የሚደገፉ ፋይሎችን በዚህ መተግበሪያ መክፈት እና ማርትዕ ይችላሉ። የትኛዎቹ ፋይሎች ይህን መተግበሪያ በነባሪነት እንደሚከፍቱ ለመቆጣጠር <ph name="BEGIN_LINK" />ነባሪ መተግበሪያዎችን በመሣሪያዎ ላይ እንዴት ማቀናበር እንደሚችሉ ይወቁ<ph name="END_LINK" />።</translation> @@ -4457,6 +4464,7 @@ <translation id="5258992782919386492">በዚህ መሣሪያ ላይ ጫን</translation> <translation id="5260334392110301220">ዘመናዊ ጥቅሶች</translation> <translation id="5260508466980570042">ይቅርታ፣ ኢሜይልዎ ወይም የይለፍ ቃልዎ ሊረጋገጥ አልቻለም። እባክዎ እንደገና ይሞክሩ።</translation> +<translation id="5260958083445173099">በተቻለ ጊዜ ድር ጣቢያዎች ይዘትን እርስዎ በመረጧቸው ቋንቋዎች ያሳያሉ</translation> <translation id="5261683757250193089">በድር መደብር ውስጥ ክፈት</translation> <translation id="5262178194499261222">የይለፍ ቃል አስወግድ</translation> <translation id="5262784498883614021">ከአውታረ መረብ ጋር በራስ-ሰር ተገናኝ</translation> @@ -4497,6 +4505,7 @@ <translation id="5294097441441645251">በንዑስ ሆሄ ቁምፊ ወይም የስር መስመር መጀመር አለበት</translation> <translation id="5294618183559481278">ከመሣሪያዎ ፊት ለፊት ሰዎችን ለማግኘት የእርስዎ <ph name="DEVICE_TYPE" /> አብሮገነብ ዳሳሽዎ ይጠቀማል። ሁሉም ውሂብ ወዲያውኑ በመሣሪያዎ ላይ ይሰናዳል እንዲሁም ከዚያ ይሰረዛል። የዳሳሽ ውሂብ ወደ Google በጭራሽ አይላክም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="5296350763804564124">የመሣሪያዎን ማያ ገጽ ሳይመለከቱ መጠቀም እንዲችሉ የቃል ግብረመልስን ይስሙ። የብሬይል ግብረመልስ በተገናኘ መሣሪያ ይገኛል።</translation> +<translation id="5297005732522718715">የእንደ ሞደም መሰካት ውቅረትን አድስ</translation> <translation id="5297082477358294722">የይለፍ ቃል ተቀምጧል። የተቀመጡ የይለፍ ቃላትን በእርስዎ <ph name="SAVED_PASSWORDS_STORE" /> ይመልከቱ እና ያስተዳድሩ።</translation> <translation id="5297946558563358707">ሌላ ሰው የእርስዎን ማያ ገጽን ሲመለከት የግላዊነት አይን አዶ በማያ ገጽዎ ታችኛው ክፍል በስተቀኝ በኩል ያሳዩ</translation> <translation id="5298219193514155779">ገጽታ የተፈጠረው በ</translation> @@ -4667,6 +4676,7 @@ <translation id="5466374726908360271">ይለጥፉና «<ph name="SEARCH_TERMS" />»ን ይፈልጉ</translation> <translation id="5467207440419968613">የታገዱ <ph name="PERMISSION_1" />፣ <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">የፋይል ማጋራቶችን በመፈለግ ላይ</translation> +<translation id="5468330507528805311">የእንደ ሞደም መሰካት ሁኔታ፦</translation> <translation id="5468881191994555667">ፋይል ይምረጡ</translation> <translation id="5469852975082458401">ገጾችን በጽሑፍ ጠቋሚ አማካኝነት ማሰስ ይችላሉ። ለማጥፋት F7ን ይጫኑ።</translation> <translation id="5470735824776589490">መሣሪያዎ በPowerwash ዳግም ሊጀምር ከመቻሉ በፊት ዳግም ማስጀመር ያስፈልጋል። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> @@ -4942,6 +4952,7 @@ <translation id="5734362860645681824">ተግባቦት</translation> <translation id="5734697361979786483">ፋይል አጋራን ያክሉ</translation> <translation id="5736796278325406685">እባክዎ የሚሠራ የተጠቃሚ ስም ያስገቡ</translation> +<translation id="5738093759615225354">ወደ የእርስዎ ኮምፒውተር ለመግባት ይህ የይለፍ ቁልፍ ያስፈልገዎታል</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> የትምህርት መለያ እንዲያክሉ ለማገዝ ወደ መለያ ይግቡ</translation> <translation id="5739235828260127894">ማረጋገጫን በመጠበቅ ላይ። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> <translation id="5739458112391494395">በጣም ትልቅ</translation> @@ -5103,6 +5114,7 @@ <translation id="589541317545606110">ገጹን በ<ph name="VISUAL_SEARCH_PROVIDER" /> ይፈልጉ</translation> <translation id="5896436821193322561">አትፍቀድ</translation> <translation id="5900186025777217044">Smart Lock ተለውጧል</translation> +<translation id="5900243355162006650">የእንደ ሞደም መሰካት ውቅረት፦</translation> <translation id="5900302528761731119">Google የመገለጫ ፎቶ</translation> <translation id="590036993063074298">የጥራት ዝርዝሮችን ማንጸባረቅ</translation> <translation id="5901069264981746702">የጣት አሻራዎ ውሂብ ደህንነቱ በተጠበቀ ሁኔታ ይከማቻል እና በጭራሽ ከእርስዎ <ph name="DEVICE_TYPE" /> አይወጣም። <ph name="LINK_BEGIN" />የበለጠ ለመረዳት<ph name="LINK_END" /></translation> @@ -5407,6 +5419,7 @@ <translation id="6196640612572343990">የሦስተኛ ወገን ኩኪዎችን አግድ</translation> <translation id="6196854373336333322">ይህ «<ph name="EXTENSION_NAME" />» ቅጥያ የተኪ ቅንብሮችዎን ተቆጣጥሯል፣ ይሄ ማለት መስመር ላይ የሚያደርጉት ማንኛውም ነገር ሊቀይር፣ ሊሰብር ወይም በድብቅ ሊከታተል ይችላል። ይሄ ለውጥ ለምን እንደተከሰተ እርግጠኛ ካልሆኑ የማይፈልጉት ነገር ሳይሆን አይቀርም።</translation> <translation id="6197128521826316819">ለዚህ ገጽ የQR ኮድ ፍጠር</translation> +<translation id="6197223946499512637">እነዚህ የይለፍ ቁልፎች በዚህ ኮምፒውተር ላይ በWindows Hello ውስጥ ተከማችተዋል። በእርስዎ የGoogle መለያ ውስጥ አልተቀመጡም።</translation> <translation id="6198252989419008588">ፒን ይቀይሩ</translation> <translation id="6200047250927636406">ፋይልን አስወግድ</translation> <translation id="6200151268994853226">ቅጥያ አቀናብር</translation> @@ -5704,6 +5717,7 @@ <translation id="6482559668224714696">የሙሉ ማያ ገጽ ማጉያ</translation> <translation id="6483485061007832714">ውርድን ይክፈቱ</translation> <translation id="6483805311199035658"><ph name="FILE" /> በመክፈት ላይ…</translation> +<translation id="6486301003991593638">የይለፍ ቁልፎችን ለማስተዳደር አዲስ የሆነ የWindows ስሪትን ይጠቀሙ</translation> <translation id="6488384360522318064">ቋንቋ ምረጥ</translation> <translation id="648927581764831596">ምንም አይገኝም</translation> <translation id="6490471652906364588">USB-C መሣሪያ (የቀኝ ወደብ)</translation> @@ -6292,6 +6306,7 @@ <translation id="7029307918966275733">Crostini አልተጫነም። ምስጋናዎችን ለመመልከት እባክዎ Crostiniን ይጫኑ።</translation> <translation id="7029809446516969842">የይለፍ ቃላት</translation> <translation id="7030304022046916278">ዩአርኤሎችን ለመፈተሽ ወደ ደህንነቱ የተጠበቀ አሰሳ ይልካቸዋል</translation> +<translation id="7030695672997239647">በአንድ ትር ላይ የቀኝ ጠቅታ ያድርጉ እና «ትሩን ወደ ቡድን አክል»ን፣ ከዚያ «አዲስ ቡድን»ን ይምረጡ</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - ተከታታይ ወደብ ተገናኝቷል</translation> <translation id="7033616203784997570">ግብዓት ቢበዛ 62 ቁምፊዎች መሆን አለበት</translation> <translation id="7034692021407794547">የሒሳብ አከፋፈል አስተዳደር ልዩ መብቶች ያሉት አስተዳዳሪ መጀመሪያ በአስተዳዳሪ መሥሪያው የGoogle Meet ሃርድዌር ክፍል ውስጥ የGoogle Meet ሃርድዌር የአገልግሎት ውልን መቀበል አለባቸው።</translation> @@ -7399,6 +7414,7 @@ <translation id="8101987792947961127">በቀጣዩ ዳግም ማስነሳት ላይ Powerwash ያስፈልጋል</translation> <translation id="81020759409809034">አካባቢያዊ አካባቢ</translation> <translation id="8102139037507939978">በግል ሊለይ የሚችል መረጃን ከ system_logs.txt ያውጡ።</translation> +<translation id="810362914482827094">የይለፍ ቁልፎችን ይፈልጉ</translation> <translation id="8104088837833760645">የኢሲም መገለጫ አውርድ</translation> <translation id="8105368624971345109">አጥፋ</translation> <translation id="8107015733319732394">የGoogle Play መደብርን በእርስዎ <ph name="DEVICE_TYPE" /> ላይ በመጫን ላይ። ይሄ ጥቂት ደቂቃዎችን ሊወስድ ይችላል።</translation> @@ -7846,6 +7862,7 @@ <translation id="8557022314818157177">የጣት አሻራዎ እስኪመዘገብ ድረስ የደህንነት ቁልፍዎን መንካቱን ይቀጥሉ</translation> <translation id="8557180006508471423">በእርስዎ Mac ላይ ባሉ የአካባቢ አገልግሎቶች ውስጥ «Google Chrome»ን ያብሩ</translation> <translation id="8557856025359704738">ቀጣዩ ውርድ በ<ph name="NEXT_DATE_DOWNLOAD" /> ላይ ነው።</translation> +<translation id="8559858985063901027">የይለፍ ቁልፎች</translation> <translation id="8560327176991673955">{COUNT,plural, =0{ሁሉንም በ&አዲስ መስኮት ውስጥ ክፈት}=1{በ&አዲስ መስኮት ውስጥ ክፈት}one{ሁሉንም ({COUNT}) በ&አዲስ መስኮት ውስጥ ክፈት}other{ሁሉንም ({COUNT}) በ&አዲስ መስኮት ውስጥ ክፈት}}</translation> <translation id="8561206103590473338">ዝሆን</translation> <translation id="8561565784790166472">በጥንቃቄ ይቀጥሉ</translation> @@ -7972,6 +7989,7 @@ <translation id="8677212948402625567">ሁሉንም ሰብስብ...</translation> <translation id="867767487203716855">ቀጣዩ ዝማኔ</translation> <translation id="8677859815076891398">ምንም አልበሞች የሉም። በ<ph name="LINK_BEGIN" />Google ፎቶዎች<ph name="LINK_END" /> ውስጥ አልበም ይፈጠሩ።</translation> +<translation id="8678378565142776698">እንደገና ጀምር እና የራስ-ሰር ዝማኔዎችን አግኝ</translation> <translation id="8678538439778360739">ውሂብ <ph name="TIME" /> ላይ በስምረት ይለፍ ሐረግዎ ተመስጥሯል። ይህ ከGoogle Pay የመክፈያ ዘዴዎችን እና አድራሻዎችን አያካትትም።</translation> <translation id="8678582529642151449">ትሮች አይሰበሰቡም</translation> <translation id="8678933587484842200">ይህ መተግበሪያ እንዴት እንዲጀምር ይፈልጋሉ?</translation> @@ -8219,6 +8237,7 @@ <translation id="8910987510378294980">የመሣሪያ ዝርዝርን ደብቅ</translation> <translation id="8912362522468806198">የGoogle መለያ</translation> <translation id="8912810933860534797">ራስ-ቃኝን አንቃ</translation> +<translation id="8915307125957890427">በአንድ ትር ላይ የቀኝ ጠቅታ ያድርጉ እና «ትሩን ወደ ቡድን አክል»ን፣ ከዚያ «አዲስ ቡድን»ን ይምረጡ</translation> <translation id="8915370057835397490">የጥቆማ አስተያየት በመጫን ላይ</translation> <translation id="8916476537757519021">ማንነት የማያሳውቅ ንዑስ ክፈፍ፦ <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138">የ<ph name="GIVEN_NAME" /> <ph name="DEVICE_TYPE" /></translation> @@ -8293,6 +8312,7 @@ <translation id="8986362086234534611">እርሳ</translation> <translation id="8986494364107987395">የአጠቃቀም ስታስቲክስ እና የብልሽት ሪፖርቶች በራስ ሰር ወደ Google ይላኩ።</translation> <translation id="8987927404178983737">ወር</translation> +<translation id="8989359959810288806">የእንደ ሞደም መሰካት ሁኔታን አድስ</translation> <translation id="8991520179165052608">ጣቢያ የእርስዎን ማይክሮፎን መጠቀም ይችላል</translation> <translation id="899384117894244799">የተገደበ ተጠቃሚን አስወግድ</translation> <translation id="899403249577094719">የNetscape ሰርቲፊኬት መሰረት</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 302883b..6360aeb 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">استخدام الميكروفون والكاميرا</translation> <translation id="1005333234656240382">هل تريد تفعيل خيار "تصحيح الأخطاء عبر ADB"؟</translation> <translation id="1006873397406093306">يمكن لهذه الإضافة قراءة بياناتك وتغييرها على المواقع. يمكنك التحكُّم في المواقع التي يمكن لهذه الإضافة الوصول إليها.</translation> +<translation id="1007057452468855774">تفعيل "متجر Google Play"</translation> <translation id="1008186147501209563">تصدير الإشارات المرجعية</translation> <translation id="1008557486741366299">ليس الآن</translation> <translation id="1009476156254802388">مكان تنزيل الملفات على <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">عناصر التحكُّم في الألعاب متاحة الآن</translation> <translation id="1010498023906173788">علامة التبويب هذه مرتبطة بمنفذ تسلسلي.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{ صفحة واحدة غير مستجيبة}zero{ صفحات غير مستجيبة}two{صفحتان غير مستجيبتين}few{ صفحات غير مستجيبة}many{ صفحة غير مستجيبة}other{ من الصفحات غير مستجيبة}}</translation> +<translation id="1011003645819296594">الأجهزة المحفوظة</translation> <translation id="1011355516189274711">مستوى صوت "تحويل النص إلى كلام"</translation> <translation id="1012794136286421601">تجري مزامنة المستندات وجداول البيانات والعروض التقديمية والرسومات. افتح تطبيق Google Drive للدخول إليها على الإنترنت أو بلا إنترنت.</translation> <translation id="1012876632442809908">جهاز USB-C (المنفذ الأمامي)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">استخدام هذا الجهاز</translation> <translation id="1470946456740188591">يمكنك استخدام الاختصار Ctrl+Search+7 لتفعيل ميزة "التصفُّح النصي بالمؤشر" أو إيقافها.</translation> <translation id="1472675084647422956">عرض المزيد</translation> +<translation id="1473223074251193484">ضبط إعدادات التوصيل</translation> <translation id="1474785664565228650">يتطلب تغيير إعدادات الميكروفون إعادة تشغيل نظام Parallels Desktop. أعِد تشغيل نظام Parallels Desktop للمتابعة.</translation> <translation id="1474893630593443211">التحكّم بشكل أكبر في الإعلانات التي تظهر لك</translation> <translation id="1475502736924165259">لديك شهادات في الملف لا تندرج تحت أي فئة من الفئات الأخرى</translation> @@ -683,7 +686,7 @@ <translation id="1637224376458524414">الحصول على هذه الإشارة المرجعية على جهاز iPhone</translation> <translation id="1637350598157233081">تم حفظ كلمة المرور الخاصة بك على هذا الجهاز.</translation> <translation id="1637765355341780467">حدث خطأ ما أثناء فتح ملفك الشخصي. وقد تكون بعض الميزات غير متاحة.</translation> -<translation id="1639239467298939599">جارٍ التحميل.</translation> +<translation id="1639239467298939599">جارٍ التحميل</translation> <translation id="1640235262200048077">لا يعمل <ph name="IME_NAME" /> على تطبيقات Linux بعد.</translation> <translation id="1640283014264083726">PKCS #1 MD4 مع ترميز RSA</translation> <translation id="1641113438599504367">التصفح الآمن</translation> @@ -1116,6 +1119,7 @@ <translation id="2044014337866019681">يُرجى إثبات ملكية الحساب <ph name="ACCOUNT" /> حتى تتمكّن من فتح قفل هذا الجهاز.</translation> <translation id="204497730941176055">اسم قالب الشهادات لـ Microsoft</translation> <translation id="2045117674524495717">مساعد اختصارات لوحة المفاتيح</translation> +<translation id="2045211794962848221">لن تظهر لك هذه الرسالة بالتحديد مرة أخرى.</translation> <translation id="2045969484888636535">متابعة حظر تشغيل ملفات تعريف الارتباط</translation> <translation id="204622017488417136">سيتم إرجاع جهازك إلى إصدار Chrome المثبت مسبقًا. ستتم إزالة كل حسابات المستخدمين والبيانات المحلية. ولا يمكن التراجع عن ذلك.</translation> <translation id="2046702855113914483">رامن</translation> @@ -2499,7 +2503,7 @@ <translation id="3348038390189153836">تم اكتشاف جهاز قابل للإزالة</translation> <translation id="3348131053948466246">الرموز التعبيرية المُقترَحة. اضغط على السهم المتّجه للأعلى أو للأسفل للتنقُّل ثم اضغط على Enter للإدخال.</translation> <translation id="3349933790966648062">الذاكرة المستخدَمة</translation> -<translation id="3353786022389205125">يُرجى تفعيل ميزة "عرض شاشة القفل عند التنشيط من وضع السكون" وإعادة المحاولة.</translation> +<translation id="3353786022389205125">يُرجى تفعيل ميزة "عرض شاشة القفل عند الخروج من وضع السكون"، ثمّ إعادة المحاولة.</translation> <translation id="3354972872297836698">تعذّر الإقران بالجهاز <ph name="DEVICE_NAME" />، يرجى اختيار جهاز لإعادة المحاولة</translation> <translation id="3355936511340229503">خطأ الاتصال</translation> <translation id="3356469410714175391">(تم تفعيل البطاقة الافتراضية).</translation> @@ -3801,6 +3805,7 @@ <translation id="4594577641390224176">هل تبحث عن صفحة "لمحة عن" الخاصة بالنظام؟ انتقِل إلى</translation> <translation id="4595560905247879544">لا يمكن تعديل التطبيقات والإضافات إلا من قِبل المدير (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">لديك شهادات في الملف تحدد هذه الخوادم</translation> +<translation id="4598345735110653698">إدارة مفاتيح المرور</translation> <translation id="4598556348158889687">إدارة مساحة التخزين</translation> <translation id="4598776695426288251">اتصال Wi-Fi متاح عبر عدة أجهزة</translation> <translation id="4601426376352205922">وضع علامة "غير مقروءة"</translation> @@ -3920,7 +3925,7 @@ <translation id="4701335814944566468">تم الاطّلاع عليه أمس.</translation> <translation id="470644585772471629">قلب الألوان</translation> <translation id="4707337002099455863">تفعيل الإضافة دائمًا على جميع المواقع الإلكترونية</translation> -<translation id="4708794300267213770">عرض شاشة القفل عند التنبيه من وضع السكون</translation> +<translation id="4708794300267213770">عرض شاشة القفل عند الخروج من وضع السكون</translation> <translation id="4708849949179781599">إنهاء <ph name="PRODUCT_NAME" /></translation> <translation id="4711638718396952945">استعادة الإعدادات</translation> <translation id="47158868804223727">انقر على اسم المجموعة لتوسيعها أو تصغيرها.</translation> @@ -4026,6 +4031,7 @@ <translation id="4823894915586516138">يوفّر رقم التعريف الشخصي أو كلمة المرور حماية لبياناتك على جهاز <ph name="DEVICE_TYPE" /> هذا، بما في ذلك أي معلومات تصل إليها من هاتفك.</translation> <translation id="4824037980212326045">النسخ الاحتياطي واستعادة البيانات من نظام التشغيل Linux</translation> <translation id="4824958205181053313">هل تريد إلغاء المزامنة؟</translation> +<translation id="4825532258163983651">تعذُّر حذف مفتاح المرور</translation> <translation id="4827675678516992122">تعذّر الاتصال</translation> <translation id="4827784381479890589">التدقيق الإملائي المُحسَّن في متصفِّح Chrome (يتم إرسال النص إلى Google للاقتراحات الإملائية)</translation> <translation id="4827904420700932487">إنشاء رمز استجابة سريعة لهذه الصورة</translation> @@ -4288,6 +4294,7 @@ <translation id="5087249366037322692">تمت الإضافة من قبل جهة خارجية</translation> <translation id="5087580092889165836">إضافة بطاقة</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 مع ترميز RSA</translation> +<translation id="5089763948477033443">مقبض تغيير حجم اللوحة الجانبية</translation> <translation id="5090637338841444533">المواقع الإلكترونية التي لا يُسمح لها بتتبّع موضع الكاميرا</translation> <translation id="5093569275467863761">الإطار الفرعي المخزّن من خلال ميزة "التخزين المؤقت للصفحات" في وضع "التصفّح المتخفي": <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">يمكنك فتح الملفات المتوافقة وتعديلها باستخدام هذا التطبيق من تطبيق "الملفات" أو من تطبيقات أخرى. للتحكّم في الملفات التي تفتح هذا التطبيق تلقائيًا، <ph name="BEGIN_LINK" />تعرَّف على كيفية تحديد التطبيقات التلقائية على جهازك<ph name="END_LINK" />.</translation> @@ -4453,6 +4460,7 @@ <translation id="5258992782919386492">تثبيت على هذا الجهاز</translation> <translation id="5260334392110301220">الاقتباسات الذكية</translation> <translation id="5260508466980570042">للأسف، تعذر التحقق من البريد الإلكتروني أو كلمة المرور. يُرجى المحاولة مرة أخرى.</translation> +<translation id="5260958083445173099">سيظهر لك محتوى المواقع الإلكترونية بلغاتك المفضَّلة إن أمكن ذلك.</translation> <translation id="5261683757250193089">فتح في السوق الإلكتروني</translation> <translation id="5262178194499261222">إزالة كلمة المرور</translation> <translation id="5262784498883614021">الاتصال بالشبكة تلقائيًا</translation> @@ -4493,6 +4501,7 @@ <translation id="5294097441441645251">يجب البدء بحرف صغير أو شرطة سفلية.</translation> <translation id="5294618183559481278">يستخدم جهاز <ph name="DEVICE_TYPE" /> أداة استشعار مدمجة لرصد مَن ينظر إلى شاشة جهازك. تتم معالجة جميع البيانات فورًا على جهازك، ثم حذفها. ولا يتم مطلقًا إرسال بيانات جهاز الاستشعار إلى Google. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="5296350763804564124">يمكنك سماع وصف شفهي للشاشة حتى تتمكّن من استخدام جهازك بدون النظر إلى الشاشة. يتوفّر الوصف الشفهي بلغة برايل عند توصيل جهاز متوافق.</translation> +<translation id="5297005732522718715">إعادة تحميل إعدادات التوصيل</translation> <translation id="5297082477358294722">تم حفظ كلمة المرور. يمكنك عرض كلمات المرور المحفوظة وإدارتها في <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">حينما يتطفل أحدهم على محتوى شاشتك، يظهر رمز الخصوصية على شكل عين في أسفل يسار الشاشة.</translation> <translation id="5298219193514155779">مظهر أنشأه</translation> @@ -4663,6 +4672,7 @@ <translation id="5466374726908360271">ل&صق وبحث عن "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">تم حظر إذن <ph name="PERMISSION_1" /> وإذن <ph name="PERMISSION_2" />.</translation> <translation id="5468173180030470402">البحث عن خوادم مشاركة الملفات</translation> +<translation id="5468330507528805311">حالة التوصيل:</translation> <translation id="5468881191994555667">اختيار ملف</translation> <translation id="5469852975082458401">يمكنك التنقُّل بين الصفحات باستخدام مؤشر النص، ويمكنك الضغط على F7 لإيقافه.</translation> <translation id="5470735824776589490">يلزم إعادة تشغيل الجهاز حتى يتسنى لك إعادة ضبطه باستخدام Powerwash. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> @@ -4939,6 +4949,7 @@ <translation id="5734362860645681824">الاتصالات</translation> <translation id="5734697361979786483">إضافة خادم مشاركة الملفات</translation> <translation id="5736796278325406685">يُرجى إدخال اسم مستخدم صالح</translation> +<translation id="5738093759615225354">يجب إدخال مفتاح المرور هذا لتسجيل الدخول إلى جهاز الكمبيوتر.</translation> <translation id="5739017626473506901">سجِّل الدخول لمساعدة <ph name="USER_NAME" /> على إضافة حساب للمؤسسة التعليمية.</translation> <translation id="5739235828260127894">في انتظار التحقُّق من صحة الاتصال. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> <translation id="5739458112391494395">كبير جدًا</translation> @@ -5100,6 +5111,7 @@ <translation id="589541317545606110">البحث في صفحة باستخدام "<ph name="VISUAL_SEARCH_PROVIDER" />"</translation> <translation id="5896436821193322561">عدم السماح</translation> <translation id="5900186025777217044">هناك تغيير في Smart Lock</translation> +<translation id="5900243355162006650">إعدادات التوصيل:</translation> <translation id="5900302528761731119">صورة الملف الشخصي في Google</translation> <translation id="590036993063074298">تفاصيل جودة النسخ المطابق</translation> <translation id="5901069264981746702">يتم تخزين بيانات بصمة الإصبع بشكل آمن وتظلّ محفوظة على جهاز <ph name="DEVICE_TYPE" /> فقط. <ph name="LINK_BEGIN" />مزيد من المعلومات<ph name="LINK_END" /></translation> @@ -5404,6 +5416,7 @@ <translation id="6196640612572343990">حظر ملفات تعريف الارتباط للجهات الخارجية</translation> <translation id="6196854373336333322">أصبح بإمكان الإضافة "<ph name="EXTENSION_NAME" />" التحكم في إعدادات الخادم الوكيل التابعة لك، مما يعني أن بإمكانها تغيير أي إجراء لك على الإنترنت أو قطعه أو التجسس عليه. إذا كنت غير متيقن من سبب حدوث هذا التغيير، فأنت لا ترغب فيه على الأرجح.</translation> <translation id="6197128521826316819">إنشاء رمز استجابة سريعة لهذه الصفحة</translation> +<translation id="6197223946499512637">يتم تخزين مفاتيح المرور هذه في Windows Hello على هذا الكمبيوتر. ولا يتم حفظها في حسابك على Google.</translation> <translation id="6198252989419008588">تغيير رقم التعريف الشخصي</translation> <translation id="6200047250927636406">تجاهل الملف</translation> <translation id="6200151268994853226">إدارة الإضافة</translation> @@ -5701,6 +5714,7 @@ <translation id="6482559668224714696">مُكبِّر بملء الشاشة</translation> <translation id="6483485061007832714">فتح التنزيل</translation> <translation id="6483805311199035658">يجري فتح <ph name="FILE" />...</translation> +<translation id="6486301003991593638">لإدارة مفاتيح المرور، يجب استخدام إصدار أحدث من نظام التشغيل Windows.</translation> <translation id="6488384360522318064">اختيار لغة</translation> <translation id="648927581764831596">ليست هناك وسائط متوفرة</translation> <translation id="6490471652906364588">جهاز USB-C (المنفذ الأيمن)</translation> @@ -6295,6 +6309,7 @@ <translation id="7029307918966275733">نظام التشغيل Crostini غير مثبّت. يُرجى تثبيت نظام التشغيل Crostini لعرض أسماء المساهمين.</translation> <translation id="7029809446516969842">كلمات المرور</translation> <translation id="7030304022046916278">يُرسِل هذا الوضع عناوين URL إلى خدمة "التصفّح الآمن" للتحقّق منها.</translation> +<translation id="7030695672997239647">انقر بزر الماوس الأيمن على علامة تبويب واختَر "إضافة علامة التبويب إلى مجموعة"، ثم اختَر "مجموعة جديدة".</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - تم ربط المنفذ التسلسلي</translation> <translation id="7033616203784997570">يجب ألا يزيد الإدخال عن 62 حرفًا.</translation> <translation id="7034692021407794547">أولاً، يجب أن يوافق أحد المشرفين الذين لديهم امتيازات إدارة الفوترة على بنود خدمة جهاز Goolge Meet في قسم جهاز Goolge Meet ضِمن وحدة تحكُّم المشرف.</translation> @@ -7398,6 +7413,7 @@ <translation id="8101987792947961127">يتطلب إجراء Powerwash بعد عملية إعادة التشغيل التالية</translation> <translation id="81020759409809034">مكان تنزيل الملفات على الجهاز</translation> <translation id="8102139037507939978">إزالة معلومات تحديد الهوية الشخصية من system_logs.txt</translation> +<translation id="810362914482827094">البحث في مفاتيح المرور</translation> <translation id="8104088837833760645">تنزيل الملف الشخصي لشريحة eSIM</translation> <translation id="8105368624971345109">إيقاف</translation> <translation id="8107015733319732394">تثبيت متجر Google Play على <ph name="DEVICE_TYPE" />. قد يستغرق ذلك بضع دقائق.</translation> @@ -7846,6 +7862,7 @@ <translation id="8557022314818157177">يُرجى الاستمرار في لمس مفتاح الأمان إلى أن يتم حِفظ بصمة الإصبع.</translation> <translation id="8557180006508471423">تفعيل "Google Chrome" في "خدمات الموقع الجغرافي" على جهاز يعمل بنظام التشغيل Mac</translation> <translation id="8557856025359704738">سيتم إجراء عملية التنزيل التالية في <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">مفاتيح المرور</translation> <translation id="8560327176991673955">{COUNT,plural, =0{فتح كل العناوين في &نافذة جديدة}=1{فتح في &نافذة جديدة}two{فتح كِلا العنوانَين ({COUNT}) في &نافذة جديدة}few{فتح كل الـ ({COUNT}) عناوين في &نافذة جديدة}many{فتح كل الـ ({COUNT}) عنوانًا في &نافذة جديدة}other{فتح كل الـ ({COUNT}) عنوان في &نافذة جديدة}}</translation> <translation id="8561206103590473338">فيل</translation> <translation id="8561565784790166472">يُرجى المتابعة مع توخّي الحذر</translation> @@ -7972,6 +7989,7 @@ <translation id="8677212948402625567">تصغير الكل...</translation> <translation id="867767487203716855">التحديث التالي</translation> <translation id="8677859815076891398">لا تتوفّر أيّ ألبومات. يمكنك إنشاء ألبوم في <ph name="LINK_BEGIN" />صور Google<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">إعادة التشغيل والحصول على التحديثات التلقائية</translation> <translation id="8678538439778360739">تم ترميز البيانات باستخدام عبارة مرور المزامنة الخاصة بك في <ph name="TIME" />. ولا يتضمَّن ذلك طرق الدفع والعناوين من Google Pay.</translation> <translation id="8678582529642151449">عدم تصغير علامات التبويب</translation> <translation id="8678933587484842200">كيف تريد بدء عمل هذا التطبيق؟</translation> @@ -8222,6 +8240,7 @@ <translation id="8910987510378294980">إخفاء قائمة الأجهزة</translation> <translation id="8912362522468806198">حساب Google</translation> <translation id="8912810933860534797">تفعيل المسح التلقائي</translation> +<translation id="8915307125957890427">انقر بزر الماوس الأيمن على علامة تبويب واختَر "إضافة علامة تبويب إلى مجموعة"، ثم اختَر "مجموعة جديدة".</translation> <translation id="8915370057835397490">جارٍ تحميل الاقتراح</translation> <translation id="8916476537757519021">الإطار الفرعي للتصفح المتخفي: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138">جهاز <ph name="DEVICE_TYPE" /> الخاص بـ <ph name="GIVEN_NAME" /></translation> @@ -8296,6 +8315,7 @@ <translation id="8986362086234534611">حذف</translation> <translation id="8986494364107987395">إرسال إحصاءات الاستخدام وتقارير الأعطال إلى Google تلقائيًا</translation> <translation id="8987927404178983737">شهر</translation> +<translation id="8989359959810288806">إعادة تحميل حالة التوصيل</translation> <translation id="8991520179165052608">يمكن للموقع الإلكتروني استخدام الميكروفون.</translation> <translation id="899384117894244799">إزالة مستخدم محظور</translation> <translation id="899403249577094719">عنوان URL الأساسي لشهادة Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index 891edc2..df5b3eb 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -4688,6 +4688,7 @@ <translation id="5470735824776589490">পাৱাৰৱাশ্বৰ জৰিয়তে আপোনাৰ ডিভাইচটো ৰিছেট কৰিব পৰাৰ পূর্বে এবাৰ ৰিষ্টার্ট কৰাৰ আৱশ্যক। <ph name="LINK_BEGIN" />অধিক জানক<ph name="LINK_END" /></translation> <translation id="5471768120198416576">নমস্কাৰ! মই আপোনাৰ পাঠৰপৰা কথনৰ ভইচ।</translation> <translation id="5472627187093107397">এই ছাইটটোৰ বাবে পাছৱর্ডসমূহ ছেভ কৰক</translation> +<translation id="5473062644742711742">Chrome Web Storeত অধিক সাধ্য সুবিধাৰ সঁজুলি বিচাৰক</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">অব্যাহত ৰাখি আপুনি সন্মতি দিয়ে যে এই ডিভাইচটোৱে স্বয়ংক্ৰিয়ভাৱে Google, আপোনাৰ শিশুৰ বাহক আৰু এই ডিভাইচটোৰ নিৰ্মাতাৰ পৰা সম্ভৱতঃ চেলুলাৰ ডেটা ব্যৱহাৰ কৰি আপডে’ট আৰু এপ্ ডাউনল’ড আৰু ইনষ্টল কৰিবও পাৰে। এই এপ্সমূহৰ কিছুমানে এপৰ ভিতৰত ক্ৰয় কৰাৰ সুবিধা আগবঢ়াব পাৰে।</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{পিনত অতি কমেও এটা বৰ্ণ থাকিবই লাগিব}one{পিনত অতি কমেও # টা বৰ্ণ থাকিবই লাগিব}other{পিনত অতি কমেও # টা বৰ্ণ থাকিবই লাগিব}}</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index ac4053e..01104d38 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -4672,6 +4672,7 @@ <translation id="5470735824776589490">Cihazınız fabrik sıfırlaması etmədən öncə yenidən başladılmalıdır. <ph name="LINK_BEGIN" />Ətraflı məlumat<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Salam! Mən Sizin mətndən-nitqə səsinizəm.</translation> <translation id="5472627187093107397">Bu sayt üçün parolları yadda saxlayın</translation> +<translation id="5473062644742711742">Chrome Veb Marketdə digər əlçatımlılıq alətlərini tapın</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Davam etməklə, bu cihazın mobil data istifadə edərək Google'dan, övladınızın operatorundan və bu cihazın istehsalçısından avtomatik yeniliklər və tətbiqlər endirməsi və quraşdırması ilə razılaşırsınız. Bu tətbiqlərdən bəziləri tətbiqdaxili satınalmalar təklif edə bilər.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN minimum bir simvoldan ibarət olmalıdır}other{PIN minimum # simvoldan ibarət olmalıdır}}</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 67ba23c8..b2db583 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Выкарыстанне мікрафона і камеры</translation> <translation id="1005333234656240382">Уключыць адладку ADB?</translation> <translation id="1006873397406093306">Гэта пашырэнне можа чытаць і змяняць вашы даныя на сайтах. Вы можаце вызначыць, да якіх сайтаў яно мае доступ.</translation> +<translation id="1007057452468855774">Уключыць Краму Google Play</translation> <translation id="1008186147501209563">Экспарт закладак</translation> <translation id="1008557486741366299">Не зараз</translation> <translation id="1009476156254802388">Месцазнаходжанне спамповак сэрвісу "<ph name="WEB_DRIVE" />"</translation> <translation id="1009663062402466586">Цяпер можна кіраваць гульнёй</translation> <translation id="1010498023906173788">Гэта ўкладка падключана да паслядоўнага порта.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Старонка не адказвае}one{Старонкі не адказваюць}few{Старонкі не адказваюць}many{Старонкі не адказваюць}other{Старонкі не адказваюць}}</translation> +<translation id="1011003645819296594">Захаваныя прылады</translation> <translation id="1011355516189274711">Гучнасць сінтэзу маўлення</translation> <translation id="1012794136286421601">Файлы ў Дакументах, Табліцах, Прэзентацыях і Рысунках сінхранізуюцца. Адкрыць іх праз інтэрнэт або па-за сеткай можна ў праграме "Google Дыск".</translation> <translation id="1012876632442809908">Прылада USB-C (пярэдні порт)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Выкарыстаць гэту прыладу</translation> <translation id="1470946456740188591">Каб уключыць або выключыць навігацыю клавішамі, выкарыстоўвайце спалучэнне клавіш Ctrl + Search + 7.</translation> <translation id="1472675084647422956">Разгарнуць</translation> +<translation id="1473223074251193484">Задаць канфігурацыю рэжыму мадэма</translation> <translation id="1474785664565228650">Для змянення налад мікрафона патрабуецца перазапуск Parallels Desktop. Каб працягнуць, перазапусціце Parallels Desktop.</translation> <translation id="1474893630593443211">Шырэйшыя магчымасці кіраваць тым, якая рэклама вам будзе паказвацца</translation> <translation id="1475502736924165259">У вас захоўваюцца сертыфікаты, якія не падпадаюць ні пад адну з іншых катэгорый</translation> @@ -1116,6 +1119,7 @@ <translation id="2044014337866019681">Каб разблакіраваць сеанс, вы павінны спраўдзіць уліковы запіс <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Назва шаблона сертыфіката Microsoft</translation> <translation id="2045117674524495717">Памочнік па спалучэннях клавіш</translation> +<translation id="2045211794962848221">Гэта паведамленне больш паказвацца не будзе</translation> <translation id="2045969484888636535">Блакіраваць файлы cookie</translation> <translation id="204622017488417136">Версія Chrome на прыладзе будзе вернута да папярэдне ўсталяванай. Усе ўліковыя запісы карыстальнікаў і лакальныя даныя будуць выдалены. Адрабіць гэта дзеянне нельга.</translation> <translation id="2046702855113914483">Рамен</translation> @@ -3801,6 +3805,7 @@ <translation id="4594577641390224176">Шукаеце інфармацыю пра сістэму? Наведайце старонку</translation> <translation id="4595560905247879544">Толькі менеджар (<ph name="CUSTODIAN_NAME" />) можа змяняць праграмы і пашырэнні.</translation> <translation id="4596295440756783523">У вас захоўваюцца сертыфікаты, якія ідэнтыфікуюць гэтыя серверы</translation> +<translation id="4598345735110653698">Кіраваць ключамі доступу</translation> <translation id="4598556348158889687">Кіраванне сховішчам</translation> <translation id="4598776695426288251">Даступныя сеткі Wi-Fi на некалькіх прыладах</translation> <translation id="4601426376352205922">Пазначыць як непрачытанае</translation> @@ -4026,6 +4031,7 @@ <translation id="4823894915586516138">PIN-код (пароль) абараняе вашы даныя на прыладзе <ph name="DEVICE_TYPE" />, у тым ліку звесткі, да якіх вы атрымліваеце доступ з тэлефона</translation> <translation id="4824037980212326045">Рэзервовае капіраванне і аднаўленне Linux</translation> <translation id="4824958205181053313">Скасаваць сінхранізацыю?</translation> +<translation id="4825532258163983651">Не ўдалося выдаліць ключ доступу</translation> <translation id="4827675678516992122">Не ўдалося падключыцца</translation> <translation id="4827784381479890589">Палепшаная праверка правапісу ў браўзеры Chrome (тэкст адпраўляецца ў Google для прапаноў правапісных варыянтаў)</translation> <translation id="4827904420700932487">Стварыць QR-код для гэтага відарыса</translation> @@ -4288,6 +4294,7 @@ <translation id="5087249366037322692">Дададзена старонняй праграмай</translation> <translation id="5087580092889165836">Дадаць картку</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 з шыфраваннем RSA</translation> +<translation id="5089763948477033443">Маркер змены памеру бакавой панэлі</translation> <translation id="5090637338841444533">Не дазволена адсочваць становішча камеры</translation> <translation id="5093569275467863761">Субфрэйм у рэжыме інкогніта, захаваны ў кэшы пераходу назад і наперад: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">З дапамогай гэтай праграмы можна адкрываць і змяняць сумяшчальныя файлы ў іншых праграмах (у прыватнасці, у "Файлах"). Каб указаць, якія файлы павінны адкрывацца ў гэтай праграме стандартна, <ph name="BEGIN_LINK" />паглядзіце, як задаць стандартныя праграмы для прылады<ph name="END_LINK" />.</translation> @@ -4453,6 +4460,7 @@ <translation id="5258992782919386492">Усталяваць на гэту прыладу</translation> <translation id="5260334392110301220">Пераўтварэнне двукоссяў</translation> <translation id="5260508466980570042">На жаль, адрас вашай электроннай пошты або ваш пароль спраўдзіць не ўдалося. Паўтарыце спробу.</translation> +<translation id="5260958083445173099">Вэб-сайты будуць паказваць змесціва на мовах, выбраных вамі ў якасці прыярытэтных, калі гэта магчыма</translation> <translation id="5261683757250193089">Адкрыць у Вэб-краме</translation> <translation id="5262178194499261222">Выдаліць пароль</translation> <translation id="5262784498883614021">Падключацца да сеткі аўтаматычна</translation> @@ -4493,6 +4501,7 @@ <translation id="5294097441441645251">У пачатку павінны быць малая літара або сімвал падкрэслівання</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> выкарыстоўвае ўбудаваны датчык, каб выяўляць прысутнасць іншых асоб перад прыладай. Усе даныя апрацоўваюцца на вашай прыладзе і пасля гэтага выдаляюцца. Даныя датчыкаў ніколі не адпраўляюцца ў Google. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Выкарыстоўвайце галасавую зваротную сувязь, дзякуючы якой можна карыстацца прыладай не гледзячы на экран. Каб тэкст паказваўся з дапамогай шрыфту Брайля, неабходна падключыць спецыяльную прыладу.</translation> +<translation id="5297005732522718715">Абнавіць канфігурацыю рэжыму мадэма</translation> <translation id="5297082477358294722">Пароль захаваны. Праглядзець захаваныя паролі і кіраваць імі можна ў раздзеле <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Калі нехта іншы будзе глядзець на экран вашай прылады, паказваць у ніжнім правым вугле экрана значок вока</translation> <translation id="5298219193514155779">Аўтар тэмы</translation> @@ -4663,6 +4672,7 @@ <translation id="5466374726908360271">У&ставіць і шукаць па запыце "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Заблакіравана: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Ідзе пошук файлаабменнікаў</translation> +<translation id="5468330507528805311">Стан рэжыму мадэма:</translation> <translation id="5468881191994555667">Выбраць файл</translation> <translation id="5469852975082458401">Вы можаце перамяшчацца па старонках з дапамогай тэкставага курсора. Каб выключыць гэту функцыю, націсніце клавішу F7.</translation> <translation id="5470735824776589490">Трэба перазапусціць прыладу, перш чым скідваць налады з дапамогай Powerwash. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> @@ -4938,6 +4948,7 @@ <translation id="5734362860645681824">Размовы</translation> <translation id="5734697361979786483">Дадаць файлаабменнік</translation> <translation id="5736796278325406685">Увядзіце сапраўднае імя карыстальніка</translation> +<translation id="5738093759615225354">Гэты ключ доступу патрабуецца для ўваходу ў сістэму на камп'ютары</translation> <translation id="5739017626473506901">Увайдзіце, каб дапамагчы дзіцяці (<ph name="USER_NAME" />) дадаць навучальны ўліковы запіс</translation> <translation id="5739235828260127894">Чаканне спраўджання. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Вельмі вялікі</translation> @@ -5099,6 +5110,7 @@ <translation id="589541317545606110">Пошук па старонцы (выкарыстоўваецца <ph name="VISUAL_SEARCH_PROVIDER" />)</translation> <translation id="5896436821193322561">Не дазваляць</translation> <translation id="5900186025777217044">Функцыя Smart Lock змянілася</translation> +<translation id="5900243355162006650">Канфігурацыя рэжыму мадэма:</translation> <translation id="5900302528761731119">Фота профілю Google</translation> <translation id="590036993063074298">Падрабязныя звесткі пра якасць адлюстравання</translation> <translation id="5901069264981746702">Адбіткі пальцаў надзейна захоўваюцца на вашай прыладзе <ph name="DEVICE_TYPE" /> і нікуды не перадаюцца. <ph name="LINK_BEGIN" />Даведацца больш<ph name="LINK_END" /></translation> @@ -5403,6 +5415,7 @@ <translation id="6196640612572343990">Блакіраваць староннія файлы cookie</translation> <translation id="6196854373336333322">Пашырэнне "<ph name="EXTENSION_NAME" />" узяло пад кантроль налады проксі-сервера: яно можа змяняць, пашкоджваць і праслухоўваць усе даныя падчас вашай працы ў інтэрнэце. Калі вы не ведаеце, чаму гэта адбылося, хутчэй за ўсё, гэта непатрэбная вам змена.</translation> <translation id="6197128521826316819">Стварыць QR-код для гэтай старонкі</translation> +<translation id="6197223946499512637">Гэтыя ключы доступу захоўваюцца ў Windows Hello на гэтым камп'ютары, а не ва Уліковым запісе Google.</translation> <translation id="6198252989419008588">Змяніць PIN-код</translation> <translation id="6200047250927636406">Адхіліць файл</translation> <translation id="6200151268994853226">Кіраваць пашырэннем</translation> @@ -5700,6 +5713,7 @@ <translation id="6482559668224714696">Лупа для поўнаэкраннага рэжыму</translation> <translation id="6483485061007832714">Адкрыццё спампоўкі</translation> <translation id="6483805311199035658">Адкрываецца <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Каб кіраваць ключамі доступу, вам патрабуецца больш новая версія Windows</translation> <translation id="6488384360522318064">Выберыце мову</translation> <translation id="648927581764831596">Даступных няма</translation> <translation id="6490471652906364588">Прылада USB-C (правы порт)</translation> @@ -6292,6 +6306,7 @@ <translation id="7029307918966275733">Crostini не ўсталяваны. Каб праглядаць баланс, усталюйце Crostini.</translation> <translation id="7029809446516969842">Паролі</translation> <translation id="7030304022046916278">Адпраўляе URL-адрасы на праверку ў Бяспечны прагляд</translation> +<translation id="7030695672997239647">Націсніце правай кнопкай мышы на ўкладку, выберыце "Дадаць укладку ў групу", а затым "Новая група"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – паслядоўны порт падключаны</translation> <translation id="7033616203784997570">Максімальна дапушчальная колькасць сімвалаў – 62</translation> <translation id="7034692021407794547">Спачатку адміністратар з правам на кіраванне плацяжамі павінен прыняць Умовы выкарыстання апаратнага забеспячэння Google Meet у раздзеле "Апаратнае забеспячэнне Google Meet" кансолі адміністратара.</translation> @@ -7392,6 +7407,7 @@ <translation id="8101987792947961127">Пры наступнай перазагрузцы патрабуецца Powerwash</translation> <translation id="81020759409809034">Лакальнае месцазнаходжанне</translation> <translation id="8102139037507939978">Выдаліць інфармацыю, якая дазваляе ідэнтыфікаваць асобу, з файла system_logs.txt.</translation> +<translation id="810362914482827094">Пошук ключоў доступу</translation> <translation id="8104088837833760645">Спампаваць профіль eSIM-карты</translation> <translation id="8105368624971345109">Выключыць</translation> <translation id="8107015733319732394">Ідзе ўсталяванне Крамы Google Play на <ph name="DEVICE_TYPE" />. Гэта можа заняць некалькі хвілін.</translation> @@ -7839,6 +7855,7 @@ <translation id="8557022314818157177">Каб дадаць адбітак пальца, націскайце на ключ бяспекі</translation> <translation id="8557180006508471423">Уключыце параметр "Google Chrome" у раздзеле Location Services ("Службы геалакацыі") на камп'ютары Mac</translation> <translation id="8557856025359704738">Наступнае спампоўванне: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Ключы доступу</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Адкрыць усе ў &новым акне}=1{Адкрыць у &новым акне}one{Адкрыць усе ({COUNT}) у &новым акне}few{Адкрыць усе ({COUNT}) у &новым акне}many{Адкрыць усе ({COUNT}) у &новым акне}other{Адкрыць усе ({COUNT}) у &новым акне}}</translation> <translation id="8561206103590473338">Слон</translation> <translation id="8561565784790166472">Будзьце асцярожнымі!</translation> @@ -7965,6 +7982,7 @@ <translation id="8677212948402625567">Згарнуць усё...</translation> <translation id="867767487203716855">Наступнае абнаўленне</translation> <translation id="8677859815076891398">Альбомаў няма. Стварыце альбом у <ph name="LINK_BEGIN" />Google Фота<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Перазапусціць і ўключыць аўтаматычныя абнаўленні</translation> <translation id="8678538439778360739">Даныя зашыфраваны з дапамогай фразы-пароля сінхранізацыі <ph name="TIME" />. Шыфраванне не распаўсюджваецца на спосабы аплаты і адрасы з Google Pay.</translation> <translation id="8678582529642151449">Укладкі не сціскаюцца</translation> <translation id="8678933587484842200">Якім спосабам запускаць гэту праграму?</translation> @@ -8214,6 +8232,7 @@ <translation id="8910987510378294980">Схаваць спіс прылад</translation> <translation id="8912362522468806198">Уліковы запіс Google</translation> <translation id="8912810933860534797">Уключыць аўтаматычнае сканіраванне</translation> +<translation id="8915307125957890427">Націсніце правай кнопкай мышы на ўкладку, выберыце "Дадаць укладку ў групу", а затым "Новая група"</translation> <translation id="8915370057835397490">Загрузка прапановы</translation> <translation id="8916476537757519021">Субфрэйм інкогніта: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> @@ -8288,6 +8307,7 @@ <translation id="8986362086234534611">Забыць</translation> <translation id="8986494364107987395">Аўтаматычна адпраўляць у Google статыстыку выкарыстання і справаздачы аб збоях</translation> <translation id="8987927404178983737">Месяц</translation> +<translation id="8989359959810288806">Абнавіць стан рэжыму мадэма</translation> <translation id="8991520179165052608">Сайт можа выкарыстоўваць ваш мікрафон</translation> <translation id="899384117894244799">Выдаліць карыстальніка з абмежаваннямі</translation> <translation id="899403249577094719">Базавы URL-адрас сертыфіката Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index 9137d2d6..53c75ad 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Използване на микрофона и камерата ви</translation> <translation id="1005333234656240382">Да се активира ли отстраняването на грешки през ADB?</translation> <translation id="1006873397406093306">Това разширение може да чете и променя данните ви на сайтовете. Можете да контролирате кои сайтове да са достъпни за него.</translation> +<translation id="1007057452468855774">Включване на Google Play Магазин</translation> <translation id="1008186147501209563">Експортиране на отметки</translation> <translation id="1008557486741366299">Не сега</translation> <translation id="1009476156254802388">Местоположение в(ъв) <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Вече се предлагат контроли за игри</translation> <translation id="1010498023906173788">Този раздел е свързан със сериен порт.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Блокирала страница}other{Блокирали страници}}</translation> +<translation id="1011003645819296594">Запазени устройства</translation> <translation id="1011355516189274711">Сила на звука на синтезирания говор</translation> <translation id="1012794136286421601">Файловете ви в Документи, Таблици, Презентации и Чертежи се синхронизират. Отворете приложението Google Диск, за да осъществите достъп до тях онлайн или офлайн.</translation> <translation id="1012876632442809908">USB-C устройство (предният порт)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Използване на това устройство</translation> <translation id="1470946456740188591">За да включите или изключите Caret Browsing, използвайте клавишната комбинация Ctrl + клавиша „търсене“ + 7</translation> <translation id="1472675084647422956">Показване на още</translation> +<translation id="1473223074251193484">Задаване на конфигурация за тетъринг</translation> <translation id="1474785664565228650">Промяната в настройката за микрофона изисква повторно стартиране на Parallels Desktop. За да продължите, стартирайте отново Parallels Desktop.</translation> <translation id="1474893630593443211">Повече контрол над рекламите, които виждате</translation> <translation id="1475502736924165259">Разполагате със сертификати, които не отговарят на нито една от другите категории</translation> @@ -1121,6 +1124,7 @@ <translation id="2044014337866019681">За да отключите сесията, трябва да потвърдите <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Име на шаблон за сертификат от Microsoft</translation> <translation id="2045117674524495717">Помощ за клавишните комбинации</translation> +<translation id="2045211794962848221">Повече няма да виждате това конкретно съобщение</translation> <translation id="2045969484888636535">Блокирането на „бисквитките“ да продължи</translation> <translation id="204622017488417136">Устройството ви ще се върне към предишната инсталирана версия на Chrome. Всички профили на потребители и локални данни ще бъдат премахнати. Това действие не може да се отмени.</translation> <translation id="2046702855113914483">Супа „Рамен“</translation> @@ -3811,6 +3815,7 @@ <translation id="4594577641390224176">Търсите страницата с информация за системата? Посетете</translation> <translation id="4595560905247879544">Само мениджърът (<ph name="CUSTODIAN_NAME" />) може да променя приложенията и разширенията.</translation> <translation id="4596295440756783523">Разполагате със сертификати, които идентифицират тези сървъри</translation> +<translation id="4598345735110653698">Управление на кодовете за достъп</translation> <translation id="4598556348158889687">Управление на хранилището</translation> <translation id="4598776695426288251">Налице е Wi-Fi през няколко устройства</translation> <translation id="4601426376352205922">Означаване като непрочетено</translation> @@ -4036,6 +4041,7 @@ <translation id="4823894915586516138">ПИН кодът или паролата защитават данните ви на това устройство <ph name="DEVICE_TYPE" />, включително информацията, до която осъществявате достъп от телефона си</translation> <translation id="4824037980212326045">Резервни копия и възстановяване на Linux</translation> <translation id="4824958205181053313">Да се анулира ли синхронизирането?</translation> +<translation id="4825532258163983651">Кодът за достъп не може да бъде изтрит</translation> <translation id="4827675678516992122">Не можа да се установи връзка</translation> <translation id="4827784381479890589">Подобрена проверка на правописа в браузъра Chrome (текстът се изпраща до Google за получаване на предложения за правопис)</translation> <translation id="4827904420700932487">Създаване на QR код за това изображение</translation> @@ -4298,6 +4304,7 @@ <translation id="5087249366037322692">Добавено от трета страна</translation> <translation id="5087580092889165836">Добавяне на карта</translation> <translation id="5088534251099454936">PKCS 1 SHA-512 с RSA шифроване</translation> +<translation id="5089763948477033443">Манипулатор за преоразмеряване на страничния панел</translation> <translation id="5090637338841444533">Сайтове без разрешение за проследяване на позицията на камерата ви</translation> <translation id="5093569275467863761">Подрамка в режим „инкогнито“, съхранена в кеша за назад/напред: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">От „Файлове“ или други приложения можете да отваряте и редактирате поддържани файлове с това приложение. За да контролирате кои файлове да се отварят с него по подразбиране, <ph name="BEGIN_LINK" />научете как да зададете стандартни приложения на устройството си<ph name="END_LINK" />.</translation> @@ -4463,6 +4470,7 @@ <translation id="5258992782919386492">Инсталиране на това устройство</translation> <translation id="5260334392110301220">Smart Quotes</translation> <translation id="5260508466980570042">За съжаление имейлът или паролата ви не можаха да бъдат потвърдени. Моля, опитайте отново.</translation> +<translation id="5260958083445173099">Когато е възможно, уебсайтовете ще показват съдържание на предпочитаните от вас езици</translation> <translation id="5261683757250193089">Отваряне в уеб магазина</translation> <translation id="5262178194499261222">Премахване на паролата</translation> <translation id="5262784498883614021">Автоматично свързване с мрежа</translation> @@ -4503,6 +4511,7 @@ <translation id="5294097441441645251">Трябва да започва с малка буква или долна черта</translation> <translation id="5294618183559481278">Вашият <ph name="DEVICE_TYPE" /> използва вграден сензор, за да установява дали има хора пред устройството. Всички данни се обработват незабавно на устройството ви, след което се изтриват. Данните от сензорите никога не се изпращат до Google. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Получавайте обратна връзка с говор, за да можете да използвате устройството си, без да гледате екрана. Обратната връзка с брайлово писмо е налице със свързано устройство.</translation> +<translation id="5297005732522718715">Опресняване на конфигурацията на тетъринга</translation> <translation id="5297082477358294722">Паролата е запазена. Преглеждайте и управлявайте запазените пароли в <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Когато друг човек погледне към екрана, долу вдясно на него да се показва иконата на око за поверителност</translation> <translation id="5298219193514155779">Темата е създадена от</translation> @@ -4673,6 +4682,7 @@ <translation id="5466374726908360271">Пост&авяне и търсене на „<ph name="SEARCH_TERMS" />“</translation> <translation id="5467207440419968613">Блокирани са „<ph name="PERMISSION_1" />“ и „<ph name="PERMISSION_2" />“</translation> <translation id="5468173180030470402">Търсят се споделени хранилища</translation> +<translation id="5468330507528805311">Състояние на тетъринга:</translation> <translation id="5468881191994555667">Избор на файл</translation> <translation id="5469852975082458401">Можете да навигирате в страниците с помощта на текстов курсор. Натиснете F7 за изключване на функцията.</translation> <translation id="5470735824776589490">Изисква се да рестартирате устройството си, преди да може да бъде възстановено с Powerwash. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> @@ -4950,6 +4960,7 @@ <translation id="5734362860645681824">Комуникации</translation> <translation id="5734697361979786483">Добавяне на споделено хранилище</translation> <translation id="5736796278325406685">Моля, въведете валидно потребителско име</translation> +<translation id="5738093759615225354">Този код за достъп ви е необходим, за да влезете в профила си на компютъра си</translation> <translation id="5739017626473506901">Влезте в профила си, за да помогнете на <ph name="USER_NAME" /> да добави профил от учебно заведение</translation> <translation id="5739235828260127894">Чака се потвърждение. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Много голям</translation> @@ -5111,6 +5122,7 @@ <translation id="589541317545606110">Търсене в страницата чрез <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Забраняване</translation> <translation id="5900186025777217044">Има промяна в Smart Lock</translation> +<translation id="5900243355162006650">Конфигурация на тетъринга:</translation> <translation id="5900302528761731119">Снимка на потребителския профил в Google</translation> <translation id="590036993063074298">Подробности за качеството на дублиране</translation> <translation id="5901069264981746702">Данните за отпечатъка ви се съхраняват надеждно и никога не напускат устройството ви <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Научете повече<ph name="LINK_END" /></translation> @@ -5415,6 +5427,7 @@ <translation id="6196640612572343990">Блокиране на „бисквитките“ на трети страни</translation> <translation id="6196854373336333322">Разширението „<ph name="EXTENSION_NAME" />“ е поело контрол над настройките ви за прокси сървър. Това означава, че то може да променя, прекъсва или следи всичко, което правите онлайн. Ако не сте сигурни какво е причинило тази промяна, вероятно не искате тя да остава в сила.</translation> <translation id="6197128521826316819">Създаване на QR код за тази страница</translation> +<translation id="6197223946499512637">Тези кодове за достъп се съхраняват в Windows Hello на този компютър. Те не се запазват в профила ви в Google.</translation> <translation id="6198252989419008588">Промяна на ПИН</translation> <translation id="6200047250927636406">Отхвърляне на файла</translation> <translation id="6200151268994853226">Управление на разширението</translation> @@ -5712,6 +5725,7 @@ <translation id="6482559668224714696">Лупа за увеличаване на целия екран</translation> <translation id="6483485061007832714">Отваряне на изтегления файл</translation> <translation id="6483805311199035658"><ph name="FILE" /> се отваря...</translation> +<translation id="6486301003991593638">За да управлявате кодовете за достъп, използвайте по-нова версия на Windows</translation> <translation id="6488384360522318064">Изберете език</translation> <translation id="648927581764831596">Няма</translation> <translation id="6490471652906364588">USB-C устройство (десният порт)</translation> @@ -6298,6 +6312,7 @@ <translation id="7029307918966275733">Не сте инсталирали Crostini. Направете това, за да видите файла за признание.</translation> <translation id="7029809446516969842">Пароли</translation> <translation id="7030304022046916278">URL адресите се изпращат до Безопасно сърфиране за проверка</translation> +<translation id="7030695672997239647">Кликнете с десния бутон на мишката върху даден раздел и изберете „Добавяне на раздела към група“, след което изберете „Нова група“</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – Свързан е сериен порт</translation> <translation id="7033616203784997570">Въведеното трябва да съдържа най-много 62 знака</translation> <translation id="7034692021407794547">Администратор, който има права за управление на таксуването, първо трябва да приеме Общите условия за хардуерните устройства за Google Meet в съответната секция в конзолата за администратори.</translation> @@ -7400,6 +7415,7 @@ <translation id="8101987792947961127">При следващото рестартиране се изисква Powerwash</translation> <translation id="81020759409809034">Локално местоположение</translation> <translation id="8102139037507939978">Премахване на информацията, позволяваща лично идентифициране, от system_logs.txt.</translation> +<translation id="810362914482827094">Търсене в кодовете за достъп</translation> <translation id="8104088837833760645">Изтегляне на потребителския профил на електронната SIM карта</translation> <translation id="8105368624971345109">Изключване</translation> <translation id="8107015733319732394">Google Play Магазин се инсталира на устройството ви <ph name="DEVICE_TYPE" />. Това може да отнеме няколко минути.</translation> @@ -7847,6 +7863,7 @@ <translation id="8557022314818157177">Продължете да докосвате ключа за сигурност, докато отпечатъкът ви бъде записан</translation> <translation id="8557180006508471423">Включете Google Chrome в услугите за местоположение на своя Mac</translation> <translation id="8557856025359704738">Следващото изтегляне е на <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Кодове за достъп</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Отваряне на всички в &нов прозорец}=1{Отваряне в &нов прозорец}other{Отваряне на всички ({COUNT}) в &нов прозорец}}</translation> <translation id="8561206103590473338">Слон</translation> <translation id="8561565784790166472">Внимавайте</translation> @@ -7973,6 +7990,7 @@ <translation id="8677212948402625567">Свиване на всички...</translation> <translation id="867767487203716855">Следваща актуализация</translation> <translation id="8677859815076891398">Няма албуми. Създайте албум в <ph name="LINK_BEGIN" />Google Снимки<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Рестартиране и получаване на автоматични актуализации</translation> <translation id="8678538439778360739">Данните са шифровани с пропуска ви за синхронизиране на <ph name="TIME" />. Това не включва начините на плащане и адресите от Google Pay.</translation> <translation id="8678582529642151449">Разделите не се свиват</translation> <translation id="8678933587484842200">Как искате да се стартира това приложение?</translation> @@ -8219,6 +8237,7 @@ <translation id="8910987510378294980">Скриване на списъка с устройства</translation> <translation id="8912362522468806198">Профил в Google</translation> <translation id="8912810933860534797">Активиране на автоматичното сканиране</translation> +<translation id="8915307125957890427">Кликнете с десния бутон на мишката върху даден раздел и изберете „Добавяне на раздела към група“, след което изберете „Нова група“</translation> <translation id="8915370057835397490">Предложението се зарежда</translation> <translation id="8916476537757519021">Подрамка в режим „инкогнито“: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> на <ph name="GIVEN_NAME" /></translation> @@ -8293,6 +8312,7 @@ <translation id="8986362086234534611">Забравяне</translation> <translation id="8986494364107987395">Автоматично изпращане до Google на статистически данни за използването на Chrome и сигнали за сривове</translation> <translation id="8987927404178983737">Месец</translation> +<translation id="8989359959810288806">Опресняване на състоянието на тетъринга</translation> <translation id="8991520179165052608">Сайтът може да използва микрофона ви</translation> <translation id="899384117894244799">Премахване на потребител с ограничена функционалност</translation> <translation id="899403249577094719">Основен URL адрес на сертификат на Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 61d66e3..d1390f4 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -4693,6 +4693,7 @@ <translation id="5470735824776589490">আপনার ডিভাইস পাওয়ারওয়াশের মাধ্যমে রিসেট করার আগে একবার রিস্টার্ট করা প্রয়োজন। <ph name="LINK_BEGIN" />আরও জানুন<ph name="LINK_END" /></translation> <translation id="5471768120198416576">হ্যালো! আমি হলাম আপনার পাঠ্য থেকে ভাষ্য ভয়েস।</translation> <translation id="5472627187093107397">এই সাইটের জন্য সেভ করা পাসওয়ার্ড</translation> +<translation id="5473062644742711742">Chrome ওয়েব স্টোরে আরও অ্যাক্সেসিবিলিটি টুল খুঁজুন</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">এছাড়াও চালিয়ে যাওয়ার অর্থ আপনি সম্মতি জানাচ্ছেন যে Google, আপনার সন্তানের পরিষেবা প্রদানকারী এবং ডিভাইসের প্রস্তুতকারকের থেকে এই ডিভাইস আপডেট অটোমেটিক ডাউনলোড ও ইনস্টল করতে পারে এবং সেটি করার জন্য খুব সম্ভবত মোবাইল ডেটা ব্যবহার করতে পারে। এর মধ্যে কিছু অ্যাপে অ্যাপ-মধ্যস্থ কেনাকাটা অফার করা হতে পারে।</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{পিন অন্তত একটি অক্ষরের হতে হবে}one{পিন অন্তত # অক্ষরের হতে হবে}other{পিন অন্তত # অক্ষরের হতে হবে}}</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index f8f899f7..5a24b71 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -8,14 +8,14 @@ <translation id="1005274289863221750">Koristiti vaš mikrofon i kameru</translation> <translation id="1005333234656240382">Omogućiti otklanjanje grešaka putem ADB-a?</translation> <translation id="1006873397406093306">Ovo proširenje može čitati i mijenjati vaše podatke na web-lokacijama. Možete upravljati time kojim web-lokacijama proširenje može pristupiti.</translation> -<translation id="1007057452468855774">Uključi Trgovinu Google Play</translation> +<translation id="1007057452468855774">Uključite Google Play trgovinu</translation> <translation id="1008186147501209563">Izvezi oznake</translation> <translation id="1008557486741366299">Ne sada</translation> <translation id="1009476156254802388">Lokacija za: <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Kontrole igre su sada dostupne</translation> <translation id="1010498023906173788">Ova kartica je povezana na serijski priključak.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Stranica ne reagira}one{Stranice ne reagiraju}few{Stranice ne reagiraju}other{Stranice ne reagiraju}}</translation> -<translation id="1011003645819296594">Spremljeni uređaji</translation> +<translation id="1011003645819296594">Sačuvani uređaji</translation> <translation id="1011355516189274711">Jačina zvuka pretvaranja teksta u govor</translation> <translation id="1012794136286421601">Vaši fajlovi na Dokumentima, Tabelama, Slides prezentacijama i Crtežima se trenutno sinhroniziraju. Otvorite aplikaciju Google Disk da im pristupite bez obzira jeste li na mreži ili ne.</translation> <translation id="1012876632442809908">USB-C uređaj (prednji priključak)</translation> @@ -498,7 +498,7 @@ <translation id="1470350905258700113">Koristi ovaj uređaj</translation> <translation id="1470946456740188591">Da uključite ili isključite navigaciju kursorom, koristite prečicu Ctrl+Search+7</translation> <translation id="1472675084647422956">Prikaži više</translation> -<translation id="1473223074251193484">Postavite konfiguraciju modemskog povezivanja</translation> +<translation id="1473223074251193484">Postavite konfiguraciju dijeljenja internetske veze</translation> <translation id="1474785664565228650">Da promijenite postavku mikrofona, potrebno je ponovo pokrenuti Parallels Desktop. Ponovo pokrenite Parallels Desktop da nastavite.</translation> <translation id="1474893630593443211">Više kontrole nad oglasima koji vam se prikazuju</translation> <translation id="1475502736924165259">U arhivi imate certifikate koji ne odgovaraju nijednoj od ostalih kategorija</translation> @@ -1127,7 +1127,7 @@ <translation id="2044014337866019681">Provjerite potvrđujete li račun <ph name="ACCOUNT" /> radi otključavanja sesije.</translation> <translation id="204497730941176055">Naziv šablona za Microsoftovu potvrdu</translation> <translation id="2045117674524495717">Pomoćnik za prečice na tastaturi</translation> -<translation id="2045211794962848221">Više vam se neće prikazivati ta određena poruka</translation> +<translation id="2045211794962848221">Ova određena poruka vam se više neće prikazivati</translation> <translation id="2045969484888636535">Nastavi blokirati kolačiće</translation> <translation id="204622017488417136">Vaš uređaj će se vratiti na prethodno instaliranu verziju Chromea. Uklonit će se računi svih korisnika. Ovu radnju nije moguće opozvati.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3817,7 +3817,7 @@ <translation id="4594577641390224176">Tražite stranicu s informacijama o sistemu? Posjetite</translation> <translation id="4595560905247879544">Aplikacije i ekstenzije može promijeniti samo upravitelj (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">U fajlu imate potvrde koje identificiraju ove servere</translation> -<translation id="4598345735110653698">Upravljaj pristupnim ključevima</translation> +<translation id="4598345735110653698">Upravljajte pristupnim ključevima</translation> <translation id="4598556348158889687">Upravljanje pohranom</translation> <translation id="4598776695426288251">WiFi mreža je dostupna putem više uređaja</translation> <translation id="4601426376352205922">Označi kao nepročitano</translation> @@ -4306,7 +4306,7 @@ <translation id="5087249366037322692">Dodala treća strana</translation> <translation id="5087580092889165836">Dodaj karticu</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 sa RSA šifriranjem</translation> -<translation id="5089763948477033443">Ručica za promjenu veličine bočne ploče</translation> +<translation id="5089763948477033443">Regulator za promjenu veličine bočne ploče</translation> <translation id="5090637338841444533">Nije dozvoljeno praćenje položaja vaše kamere</translation> <translation id="5093569275467863761">Keširana verzija cijele stranice anonimnog načina rada za podokvir: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Možete otvoriti i uređivati podržane fajlove pomoću ove aplikaciju u aplikaciji Files ili u drugim aplikacijama. Da kontrolirate koji fajlovi zadano otvaraju ovu aplikaciju, <ph name="BEGIN_LINK" />saznajte kako postaviti zadane aplikacije na svom uređaju<ph name="END_LINK" />.</translation> @@ -4472,7 +4472,7 @@ <translation id="5258992782919386492">Instaliraj na ovom uređaju</translation> <translation id="5260334392110301220">Pametni navodnici</translation> <translation id="5260508466980570042">Žao nam je, ne možemo potvrditi vašu adresu e-pošte ili lozinku. Pokušajte ponovo.</translation> -<translation id="5260958083445173099">Web-lokacije će prikazivati sadržaj na vašim preferiranim jezicima kad je to moguće.</translation> +<translation id="5260958083445173099">Web lokacije će prikazivati sadržaj na vašim omiljenim jezicima, kada to bude moguće</translation> <translation id="5261683757250193089">Otvori u Web trgovini</translation> <translation id="5262178194499261222">Ukloni lozinku</translation> <translation id="5262784498883614021">Automatski se poveži s mrežom</translation> @@ -4513,7 +4513,7 @@ <translation id="5294097441441645251">Mora početi malim slovom ili donjom crtom</translation> <translation id="5294618183559481278">Vaš uređaj <ph name="DEVICE_TYPE" /> koristi ugrađeni senzor da otkrije osobe koje se nalaze ispred njega. Svi podaci se odmah obrađuju na uređaju, a zatim se brišu. Podaci senzora se nikada ne šalju Googleu. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Slušajte govorne povratne informacije da možete koristiti uređaj bez gledanja u ekran. Povratne informacije na Braillevom pismu su dostupne s povezanim uređajem.</translation> -<translation id="5297005732522718715">Osvježi konfiguraciju modemskog povezivanja</translation> +<translation id="5297005732522718715">Osvježi konfiguraciju dijeljenja internetske veze</translation> <translation id="5297082477358294722">Lozinka je sačuvana. Prikažite i upravljajte lozinkama koje čuva <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Kad netko drugi pogleda vaš ekran, u donjem desnom uglu ekrana prikazat će se ikona oka za zaštitu privatnosti</translation> <translation id="5298219193514155779">Temu je stvorio autor</translation> @@ -4684,7 +4684,7 @@ <translation id="5466374726908360271">Za&lijepi i pretraži pojam “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Traženje dijeljenja fajlova</translation> -<translation id="5468330507528805311">Status modemskog povezivanja:</translation> +<translation id="5468330507528805311">Status dijeljenja internetske veze:</translation> <translation id="5468881191994555667">Odabir fajla</translation> <translation id="5469852975082458401">Možete navigirati stranicama pomoću kursora za tekst. Pritisnite F7 da isključite.</translation> <translation id="5470735824776589490">Prije vraćanja na zadane vrijednosti pomoću Powerwasha potrebno je ponovo pokrenuti uređaj. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> @@ -4961,7 +4961,7 @@ <translation id="5734362860645681824">Komunikacije</translation> <translation id="5734697361979786483">Dodajte dijeljenje fajlova</translation> <translation id="5736796278325406685">Unesite važeće korisničko ime</translation> -<translation id="5738093759615225354">Taj pristupni kôd potreban je za prijavu na računalo</translation> +<translation id="5738093759615225354">Ovaj pristupni ključ je potreban za prijavu na računar</translation> <translation id="5739017626473506901">Prijavite se da <ph name="USER_NAME" /> primi pomoć pri dodavanju školskog računa</translation> <translation id="5739235828260127894">Čeka se potvrda. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Vrlo velik</translation> @@ -5123,7 +5123,7 @@ <translation id="589541317545606110">Pretražite stranicu pomoću usluge <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Nemoj dozvoliti</translation> <translation id="5900186025777217044">Pametno zaključavanje je promijenjeno</translation> -<translation id="5900243355162006650">Konfiguracija modemskog povezivanja:</translation> +<translation id="5900243355162006650">Konfiguracija dijeljenja internetske veze:</translation> <translation id="5900302528761731119">Fotografija Google profila</translation> <translation id="590036993063074298">Detalji o kvalitetu preslikavanja</translation> <translation id="5901069264981746702">Vaši podaci otiska prsta su sigurno pohranjeni i nikada ne napuštaju uređaj <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Saznajte više<ph name="LINK_END" /></translation> @@ -5428,7 +5428,7 @@ <translation id="6196640612572343990">Blokiraj kolačiće trećih strana</translation> <translation id="6196854373336333322">Ekstenzija "<ph name="EXTENSION_NAME" />" je preuzela kontrolu nad postavkama vašeg proksi servera, što znači da može promijeniti, prekinuti ili prisluškivati sve što radite na mreži. Ako niste sigurni zašto je došlo do ove promjene, vjerovatno je i ne želite.</translation> <translation id="6197128521826316819">Kreiraj QR kôd za ovu stranicu</translation> -<translation id="6197223946499512637">Ti su pristupni ključevi pohranjeni u sustavu Windows Hello na ovom računalu. Ne spremaju se na vaš Google račun.</translation> +<translation id="6197223946499512637">Ovi pristupni ključevi su pohranjeni u funkciju Windows Hello na ovom računaru. Nisu pohranjeni na vaš Google račun.</translation> <translation id="6198252989419008588">Promijeni PIN</translation> <translation id="6200047250927636406">Odbaci fajl</translation> <translation id="6200151268994853226">Upravljajte ekstenzijom</translation> @@ -5726,7 +5726,7 @@ <translation id="6482559668224714696">Povećalo za cijeli ekran</translation> <translation id="6483485061007832714">Otvorite preuzimanje</translation> <translation id="6483805311199035658">Otvara se <ph name="FILE" />...</translation> -<translation id="6486301003991593638">Za upravljanje pristupnim ključevima upotrijebite noviju verziju Windowsa</translation> +<translation id="6486301003991593638">Koristite noviju verziju Windowsa da upravljate pristupnim ključevima</translation> <translation id="6488384360522318064">Odaberite jezik</translation> <translation id="648927581764831596">Nema dostupnih</translation> <translation id="6490471652906364588">USB-C uređaj (desni priključak)</translation> @@ -6317,7 +6317,7 @@ <translation id="7029307918966275733">Crostini nije instaliran. Instalirajte Crostini da vidite zahvale.</translation> <translation id="7029809446516969842">Lozinke</translation> <translation id="7030304022046916278">Šalje URL-ove Sigurnom pregledanju na provjeru</translation> -<translation id="7030695672997239647">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u grupu, a zatim odaberite Nova grupa</translation> +<translation id="7030695672997239647">Desnim klikom kliknite na Karticu i odaberite "Dodaj karticu u grupu" a zatim odaberite "Nova grupa"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – serijski priključak je povezan</translation> <translation id="7033616203784997570">Unos može sadržavati najviše 62 znaka</translation> <translation id="7034692021407794547">Administrator s privilegijama upravljanja naplatom najprije mora prihvatiti Uslove korištenja usluge hardvera za Google Meet u odjeljku hardver za Google Meet administratorske konzole.</translation> @@ -7420,7 +7420,7 @@ <translation id="8101987792947961127">Powerwash je obavezan prilikom sljedećeg pokretanja</translation> <translation id="81020759409809034">Lokalna lokacija</translation> <translation id="8102139037507939978">Uklonite informacije koje mogu poslužiti za ličnu identifikaciju iz fajla system_logs.txt.</translation> -<translation id="810362914482827094">Pretraživanje pristupnih ključeva</translation> +<translation id="810362914482827094">Pretražite pristupne ključeve</translation> <translation id="8104088837833760645">Preuzmi eSIM profil</translation> <translation id="8105368624971345109">Isključi</translation> <translation id="8107015733319732394">Instaliranje Google Play trgovine na vašem uređaju <ph name="DEVICE_TYPE" />. To može potrajati nekoliko minuta.</translation> @@ -7995,7 +7995,7 @@ <translation id="8677212948402625567">Suzi sve...</translation> <translation id="867767487203716855">Sljedeće ažuriranje</translation> <translation id="8677859815076891398">Nema albuma. Kreirajte album u <ph name="LINK_BEGIN" />Google Fotografijama<ph name="LINK_END" />.</translation> -<translation id="8678378565142776698">Ponovo pokrenite i primajte automatska ažuriranja</translation> +<translation id="8678378565142776698">Ponovo pokrenite i primite automatska ažuriranja</translation> <translation id="8678538439778360739">Podaci su šifrirani pristupnim izrazom za sinhronizaciju dana <ph name="TIME" />. To ne obuhvata načine plaćanja i adrese iz Google Paya.</translation> <translation id="8678582529642151449">Kartice se ne smanjuju</translation> <translation id="8678933587484842200">Kako želite da se ova aplikacija pokreće?</translation> @@ -8244,7 +8244,7 @@ <translation id="8910987510378294980">Skrivanje liste uređaja</translation> <translation id="8912362522468806198">Google račun</translation> <translation id="8912810933860534797">Omogući automatsko skeniranje</translation> -<translation id="8915307125957890427">Kliknite karticu desnom tipkom i odaberite Dodaj karticu u grupu, a zatim odaberite Nova grupa</translation> +<translation id="8915307125957890427">Desnim klikom kliknite na Karticu i odaberite "Dodaj karticu u grupu" a zatim odaberite "Nova grupa"</translation> <translation id="8915370057835397490">Učitavanje prijedloga</translation> <translation id="8916476537757519021">Podokvir anonimnog načina: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138">Uređaj <ph name="DEVICE_TYPE" /> koji koristi <ph name="GIVEN_NAME" /></translation> @@ -8319,7 +8319,7 @@ <translation id="8986362086234534611">Zaboravi</translation> <translation id="8986494364107987395">Automatski šaljite statistiku korištenja i izvještaje o padovima aplikacije Googleu</translation> <translation id="8987927404178983737">Mjesec</translation> -<translation id="8989359959810288806">Osvježi status modemskog povezivanja</translation> +<translation id="8989359959810288806">Osvježi status dijeljenja internetske veze</translation> <translation id="8991520179165052608">Web lokacija može koristiti vaš mikrofon</translation> <translation id="899384117894244799">Ukloni korisnika s ograničenjem</translation> <translation id="899403249577094719">Osnovni URL Netscape certifikata</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 45074d47..543caed 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Používat mikrofon a fotoaparát</translation> <translation id="1005333234656240382">Aktivovat ladění ADB?</translation> <translation id="1006873397406093306">Toto rozšíření může číst a měnit data na webech. Můžete ovládat, ke kterým webům má rozšíření přístup.</translation> +<translation id="1007057452468855774">Zapnout Obchod Google Play</translation> <translation id="1008186147501209563">Exportovat záložky</translation> <translation id="1008557486741366299">Teď ne</translation> <translation id="1009476156254802388">Umístění ve službě <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">K dispozici jsou ovládací prvky hry</translation> <translation id="1010498023906173788">Tato karta je připojená k sériovému portu.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Stránka nereaguje}few{Stránky nereagují}many{Stránky nereagují}other{Stránky nereagují}}</translation> +<translation id="1011003645819296594">Uložená zařízení</translation> <translation id="1011355516189274711">Hlasitost převodu textu na řeč</translation> <translation id="1012794136286421601">Vaše Dokumenty, Tabulky, Prezentace a Nákresy se synchronizují. Můžete otevřít aplikaci Disk Google a přistupovat k nim online nebo offline.</translation> <translation id="1012876632442809908">Zařízení USB Type-C (přední port)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">Použít toto zařízení</translation> <translation id="1470946456740188591">Procházení pomocí kurzoru zapnete nebo vypnete pomocí kláves Ctrl+Hledat+7</translation> <translation id="1472675084647422956">Zobrazit více</translation> +<translation id="1473223074251193484">Nastavit konfiguraci tetheringu</translation> <translation id="1474785664565228650">Změna nastavení mikrofonu vyžaduje restart nástroje Parallels Desktop. Pokračujte restartováním nástroje Parallels Desktop.</translation> <translation id="1474893630593443211">Větší kontrola nad reklamami, které se vám zobrazují</translation> <translation id="1475502736924165259">Máte založené certifikáty, které se nehodí do žádné z ostatních kategorií</translation> @@ -1115,6 +1118,7 @@ <translation id="2044014337866019681">Pokud tuto relaci chcete odemknout, zkontrolujte, zda ověřujete účet <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Název šablony certifikátu Microsoft</translation> <translation id="2045117674524495717">Nápověda ke klávesovým zkratkám</translation> +<translation id="2045211794962848221">Tato zpráva se vám už nebude zobrazovat</translation> <translation id="2045969484888636535">Pokračovat v blokování souborů cookie</translation> <translation id="204622017488417136">V zařízení bude obnovena předchozí verze prohlížeče Chrome. Budou odstraněny všechny uživatelské účty a místní data. Tuto operaci nelze vrátit zpět.</translation> <translation id="2046702855113914483">Polévka ramen</translation> @@ -3799,6 +3803,7 @@ <translation id="4594577641390224176">Hledáte stránku s informacemi o systému? Přejděte na stránku</translation> <translation id="4595560905247879544">Aplikace a rozšíření může upravit pouze správce (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Máte založené certifikáty, které identifikují tyto servery</translation> +<translation id="4598345735110653698">Spravovat přístupové klíče</translation> <translation id="4598556348158889687">Správa úložiště</translation> <translation id="4598776695426288251">Je k dispozici síť Wi-Fi prostřednictvím několika zařízení</translation> <translation id="4601426376352205922">Označit jako nepřečtené</translation> @@ -4024,6 +4029,7 @@ <translation id="4823894915586516138">Tento PIN nebo heslo chrání vaše data na tomto zařízení <ph name="DEVICE_TYPE" />, včetně údajů, které zobrazujete z telefonu</translation> <translation id="4824037980212326045">Zálohování a obnovení Linuxu</translation> <translation id="4824958205181053313">Zrušit synchronizaci?</translation> +<translation id="4825532258163983651">Přístupový klíč nelze smazat</translation> <translation id="4827675678516992122">Nelze se připojit</translation> <translation id="4827784381479890589">Vylepšená kontrola pravopisu v prohlížeči Chrome (text je odesílán do Googlu a zobrazují se návrhy)</translation> <translation id="4827904420700932487">Vytvořit QR kód pro tento obrázek</translation> @@ -4286,6 +4292,7 @@ <translation id="5087249366037322692">Přidáno třetí stranou</translation> <translation id="5087580092889165836">Přidat kartu</translation> <translation id="5088534251099454936">Šifrování PKCS #1 SHA-512 s RSA</translation> +<translation id="5089763948477033443">Úchyt pro změnu velikosti bočního panelu</translation> <translation id="5090637338841444533">Zákaz sledovat pozici kamery</translation> <translation id="5093569275467863761">Mezipaměť pro přechod zpět nebo vpřed na anonymním dílčím rámci: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Pomocí této aplikace můžete otevírat a upravovat podporované soubory z aplikace Soubory nebo z jiných aplikací. Pokud chcete určit, které soubory se ve výchozím nastavení otevírají v této aplikaci, přečtěte si, <ph name="BEGIN_LINK" />jak na zařízení nastavit výchozí aplikace<ph name="END_LINK" />.</translation> @@ -4451,6 +4458,7 @@ <translation id="5258992782919386492">Nainstalovat na toto zařízení</translation> <translation id="5260334392110301220">Chytré uvozovky</translation> <translation id="5260508466980570042">Litujeme, e-mailovou adresu nebo heslo nelze ověřit. Zkuste to prosím znovu.</translation> +<translation id="5260958083445173099">Pokud to bude možné, obsah se bude zobrazovat ve vašem preferovaném jazyce.</translation> <translation id="5261683757250193089">Otevřít v Internetovém obchodu</translation> <translation id="5262178194499261222">Odstranit heslo</translation> <translation id="5262784498883614021">Automatické připojení k síti</translation> @@ -4491,6 +4499,7 @@ <translation id="5294097441441645251">Musí začínat malým písmenem nebo podtržítkem</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> používá vestavěný senzor k detekci lidí před zařízením. Veškerá data se zpracovávají okamžitě v zařízení a poté se mažou. Data ze senzoru se nikdy neodesílají do Googlu. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Poslouchejte hlasovou odezvu, abyste zařízení mohli používat bez sledování obrazovky. U připojeného zařízení je k dispozici braillská odezva.</translation> +<translation id="5297005732522718715">Obnovit konfiguraci tetheringu</translation> <translation id="5297082477358294722">Heslo bylo uloženo. K zobrazení a správě uložených hesel můžete použít svůj <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Když se na obrazovku dívá někdo další, zobrazit v pravém dolním rohu obrazovky ikona oka</translation> <translation id="5298219193514155779">Autor motivu</translation> @@ -4661,11 +4670,13 @@ <translation id="5466374726908360271">Vl&ožit a vyhledat výraz „<ph name="SEARCH_TERMS" />“</translation> <translation id="5467207440419968613">Zablokována oprávnění <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Vyhledávání sdílených úložišť</translation> +<translation id="5468330507528805311">Stav tetheringu:</translation> <translation id="5468881191994555667">Vybrat soubor</translation> <translation id="5469852975082458401">Stránky můžete procházet pomocí textového kurzoru. Tuto funkci vypnete stisknutím klávesy F7.</translation> <translation id="5470735824776589490">Než bude možné zařízení resetovat pomocí funkce Powerwash, je třeba ho restartovat. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Zdravím vás. Jsem váš hlas převodu textu na řeč.</translation> <translation id="5472627187093107397">Ukládat hesla pro tento web</translation> +<translation id="5473062644742711742">Další nástroje pro usnadnění přístupu v Internetovém obchodu Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Pokračováním vyjadřujete souhlas s tím, že toto zařízení může také automaticky stahovat a instalovat aktualizace a aplikace od společnosti Google, operátora a výrobce zařízení, a v případě potřeby k tomu smí používat mobilní datové připojení. Některé z těchto aplikací mohou nabízet nákupy v aplikaci.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN musí obsahovat nejméně 1 znak}few{PIN musí obsahovat nejméně # znaky}many{PIN musí obsahovat nejméně # znaku}other{PIN musí obsahovat nejméně # znaků}}</translation> @@ -4934,6 +4945,7 @@ <translation id="5734362860645681824">Komunikační příslušenství</translation> <translation id="5734697361979786483">Přidat sdílené úložiště</translation> <translation id="5736796278325406685">Zadejte prosím platné uživatelské jméno</translation> +<translation id="5738093759615225354">K přihlášení do počítače potřebujete tento přístupový klíč</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> potřebuje pomoc s přidáním školního účtu, přihlaste se prosím</translation> <translation id="5739235828260127894">Čeká na ověření. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Velmi velké</translation> @@ -5095,6 +5107,7 @@ <translation id="589541317545606110">Prohledat stránku pomocí <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Nepovolovat</translation> <translation id="5900186025777217044">Funkce Smart Lock se změnila</translation> +<translation id="5900243355162006650">Konfigurace tetheringu:</translation> <translation id="5900302528761731119">Profilová fotka Google</translation> <translation id="590036993063074298">Podrobnosti o kvalitě zrcadlení</translation> <translation id="5901069264981746702">Váš otisk prstu je bezpečně uložen a nikdy neopouští <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Další informace<ph name="LINK_END" /></translation> @@ -5398,6 +5411,7 @@ <translation id="6196640612572343990">Blokovat soubory cookie třetích stran</translation> <translation id="6196854373336333322">Rozšíření <ph name="EXTENSION_NAME" /> převzalo kontrolu nad nastavením proxy serveru, což znamená, že může změnit, narušit nebo sledovat vše, co děláte na internetu. Pokud si nejste jisti, proč k tomu došlo, zřejmě se jedná o nežádoucí změnu.</translation> <translation id="6197128521826316819">Vytvořit QR kód pro tuto stránku</translation> +<translation id="6197223946499512637">Tyto přístupové klíče jsou uloženy ve službě Windows Hello na tomto počítači. Neukládají se do vašeho účtu Google.</translation> <translation id="6198252989419008588">Změnit kód PIN</translation> <translation id="6200047250927636406">Zahodit soubor</translation> <translation id="6200151268994853226">Správa rozšíření</translation> @@ -5695,6 +5709,7 @@ <translation id="6482559668224714696">Lupa celé obrazovky</translation> <translation id="6483485061007832714">Otevřít stažený soubor</translation> <translation id="6483805311199035658">Otevírání souboru <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Ke správě přístupových klíčů použijte novější verzi systému Windows</translation> <translation id="6488384360522318064">Vyberte jazyk</translation> <translation id="648927581764831596">Není k dispozici</translation> <translation id="6490471652906364588">Zařízení USB Type-C (pravý port)</translation> @@ -6285,6 +6300,7 @@ <translation id="7029307918966275733">Plugin Crostini není nainstalován. Chcete-li zobrazit seznam přispěvatelů, nainstalujte Crostini.</translation> <translation id="7029809446516969842">Hesla</translation> <translation id="7030304022046916278">Odesílá adresy URL ke kontrole ve funkci Bezpečné prohlížení</translation> +<translation id="7030695672997239647">Klikněte pravým tlačítkem na kartu, vyberte Přidat kartu do skupiny a zvolte možnost Nová skupina.</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – připojeno k sériovému portu</translation> <translation id="7033616203784997570">Lze zadat maximálně 62 znaků</translation> <translation id="7034692021407794547">Administrátor s oprávněním Správa fakturace musí nejdříve v administrátorské konzoli v sekci Hardware Google Meet přijmout smluvní podmínky hardwaru Google Meet.</translation> @@ -7386,6 +7402,7 @@ <translation id="8101987792947961127">Je vyžadováno použití funkce Powerwash při dalším restartu</translation> <translation id="81020759409809034">Místní umístění</translation> <translation id="8102139037507939978">Odstranit ze souboru system_logs.txt informace umožňující zjištění totožnosti.</translation> +<translation id="810362914482827094">Vyhledat přístupové klíče</translation> <translation id="8104088837833760645">Stáhnout profil eSIM</translation> <translation id="8105368624971345109">Vypnout</translation> <translation id="8107015733319732394">Instalace Obchodu Google Play do zařízení <ph name="DEVICE_TYPE" />. Tato operace může několik minut trvat.</translation> @@ -7833,6 +7850,7 @@ <translation id="8557022314818157177">Dotýkejte se bezpečnostního klíče, dokud se nesejme otisk prstu.</translation> <translation id="8557180006508471423">Na počítači Mac zapněte ve službách určování polohy Google Chrome</translation> <translation id="8557856025359704738">Další stažení proběhne v <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Přístupové klíče</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Otevřít vše v &novém okně}=1{Otevřít v &novém okně}few{Otevřít vše ({COUNT}) v &novém okně}many{Otevřít vše ({COUNT}) v &novém okně}other{Otevřít vše ({COUNT}) v &novém okně}}</translation> <translation id="8561206103590473338">Slon</translation> <translation id="8561565784790166472">Buďte opatrní</translation> @@ -7945,6 +7963,7 @@ <translation id="8666759526542103597">Personalizace reklam na základě prohlížeče</translation> <translation id="8667328578593601900">Stránka <ph name="FULLSCREEN_ORIGIN" /> je teď na celé obrazovce a deaktivovala ukazatel myši.</translation> <translation id="8667760277771450375">Zkoumáme možnosti, jak zabránit sledování mezi weby a zároveň webům umožnit potírání reklamního spamu a podvodů.</translation> +<translation id="8668378421690365723">Vaše zařízení už nemusí pracovat správně a mohou se vyskytnout problémy se zabezpečením a výkonem.</translation> <translation id="8669284339312441707">Teplejší</translation> <translation id="8670537393737592796">Chcete-li se sem rychle vrátit, nainstalujte si aplikaci <ph name="APP_NAME" /> kliknutím na tlačítko instalace</translation> <translation id="867085395664725367">Došlo k dočasné chybě serveru.</translation> @@ -7959,6 +7978,7 @@ <translation id="8677212948402625567">Sbalit vše...</translation> <translation id="867767487203716855">Další aktualizace</translation> <translation id="8677859815076891398">Žádná alba. Vytvořte album ve <ph name="LINK_BEGIN" />Fotkách Google<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Restartovat a stáhnout automatické aktualizace</translation> <translation id="8678538439778360739">Data byla <ph name="TIME" /> zašifrována pomocí heslové fráze pro synchronizaci. Toto šifrování se nevztahuje na platební metody a adresy z Google Pay.</translation> <translation id="8678582529642151449">Karty se nezmenšují</translation> <translation id="8678933587484842200">Jak tuto aplikaci chcete spouštět?</translation> @@ -8207,6 +8227,7 @@ <translation id="8910987510378294980">Skrýt seznam zařízení</translation> <translation id="8912362522468806198">Účet Google</translation> <translation id="8912810933860534797">Zapnout automatické prohledávání</translation> +<translation id="8915307125957890427">Klikněte pravým tlačítkem na kartu, vyberte Přidat kartu do skupiny a zvolte možnost Nová skupina.</translation> <translation id="8915370057835397490">Načítá se návrh</translation> <translation id="8916476537757519021">Anonymní podrámec: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> @@ -8281,6 +8302,7 @@ <translation id="8986362086234534611">Odstranit</translation> <translation id="8986494364107987395">Automaticky posílat společnosti Google statistiky používání a zprávy o selhání</translation> <translation id="8987927404178983737">Měsíc</translation> +<translation id="8989359959810288806">Obnovit stav tetheringu</translation> <translation id="8991520179165052608">Web může použít mikrofon</translation> <translation id="899384117894244799">Odstranit uživatele s omezenými oprávněními</translation> <translation id="899403249577094719">Základní adresa URL certifikátu Netscape</translation> @@ -8427,6 +8449,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Nejlepších výsledků dosáhnete, když systém <ph name="DEVICE_OS" /> nainstalujete na interní disk. Můžete ho také nainstalovat později z přihlašovací obrazovky.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Pokud na instalaci nejste připraveni, můžete ho za účelem vyzkoušení spustit z USB. Váš existující operační systém a data zůstanou zachovány, ale úložiště a výkon mohou být omezeny.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Otevřít jako připnutou kartu</translation> +<translation id="9123287046453017203">Zařízení není aktualizováno</translation> <translation id="9124003689441359348">Zde se zobrazí uložená hesla</translation> <translation id="9126149354162942022">Barva kurzoru</translation> <translation id="9128317794749765148">Instalaci nebylo možné dokončit</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 26dc820..acf503e94 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -4694,6 +4694,7 @@ <translation id="5470735824776589490">Rhaid ailgychwyn cyn y gellir ailosod eich dyfais gyda Powerwash. <ph name="LINK_BEGIN" />Dysgu rhagor<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Shw'mae! Fi yw eich llais testun i leferydd.</translation> <translation id="5472627187093107397">Cadw cyfrineiriau ar gyfer y wefan hon</translation> +<translation id="5473062644742711742">Gallwch ddod o hyd i ragor o offer hygyrchedd yn Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Drwy barhau, rydych yn cytuno y gall y ddyfais hon hefyd lawrlwytho a gosod diweddariadau ac apiau yn awtomatig gan Google, cludydd eich plentyn a gwneuthurwr y ddyfais hon, gan ddefnyddio data symudol o bosib. Mae'n bosib y bydd rhai o'r apiau hyn yn cynnig pryniannau o fewn yr ap.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{Rhaid i'r PIN fod o leiaf un nod}zero{Rhaid i'r PIN fod o leiaf # nod}two{Rhaid i'r PIN fod o leiaf # nod}few{Rhaid i'r PIN fod o leiaf # nod}many{Rhaid i'r PIN fod o leiaf # nod}other{Rhaid i'r PIN fod o leiaf # nod}}</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 9adbed0..39e6785 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -687,7 +687,7 @@ <translation id="1637224376458524414">Få dette bogmærke på din iPhone</translation> <translation id="1637350598157233081">Din adgangskode gemmes på denne enhed</translation> <translation id="1637765355341780467">Noget gik galt ved åbningen af din profil. Nogle funktioner er muligvis ikke tilgængelige.</translation> -<translation id="1639239467298939599">Indlæser...</translation> +<translation id="1639239467298939599">Indlæser</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> fungerer endnu ikke i Linux-apps</translation> <translation id="1640283014264083726">PKCS #1 MD4 med RSA-kryptering</translation> <translation id="1641113438599504367">Beskyttet browsing</translation> @@ -4692,6 +4692,7 @@ <translation id="5470735824776589490">Enheden skal genstartes, før den kan nulstilles med Powerwash. <ph name="LINK_BEGIN" />Få flere oplysninger<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hej! Jeg er din stemme til oplæsning.</translation> <translation id="5472627187093107397">Gem adgangskoder for dette website</translation> +<translation id="5473062644742711742">Find flere hjælpefunktioner i Chrome Webshop</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Hvis du fortsætter, accepterer du, at denne enhed også kan downloade og installere opdateringer og apps automatisk fra Google, dit barns mobilselskab og producenten af enheden, eventuelt ved hjælp af mobildata. Nogle af disse apps tilbyder muligvis køb i appen.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{Pinkoden skal være på mindst ét tegn}one{Pinkoden skal være på mindst # tegn}other{Pinkoden skal være på mindst # tegn}}</translation> @@ -7979,6 +7980,7 @@ <translation id="8666759526542103597">Om browserbaseret annoncetilpasning</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> er nu i fuld skærm og har deaktiveret din musemarkør.</translation> <translation id="8667760277771450375">Vi undersøger mulighederne for at begrænse sporing på tværs af websites og samtidig give websites mulighed for at forhindre annoncespam og -svindel.</translation> +<translation id="8668378421690365723">Din enhed fungerer muligvis ikke længere korrekt, og du kan opleve problemer med sikkerheden og ydeevnen.</translation> <translation id="8669284339312441707">Varm</translation> <translation id="8670537393737592796">Installer <ph name="APP_NAME" /> ved at klikke på knappen til installation, så du hurtigt kan vende tilbage hertil</translation> <translation id="867085395664725367">Der opstod en midlertidig serverfejl.</translation> @@ -8464,6 +8466,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Du får den bedst mulige oplevelse ved at installere <ph name="DEVICE_OS" /> på din interne disk. Du kan også installere det senere via loginskærmen.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Hvis du ikke er klar til at installere, kan du prøvekøre det via USB. På denne måde vil du beholde dit eksisterende OS og dine data, men lagerpladsen og ydeevnen kan være begrænset.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Åbn som fastgjort fane</translation> +<translation id="9123287046453017203">Din enhed er ikke opdateret</translation> <translation id="9124003689441359348">Dine gemte adgangskoder vises her</translation> <translation id="9126149354162942022">Markørfarve</translation> <translation id="9128317794749765148">Konfigurationen kunne ikke gennemføres</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index f391e99..8759e670 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Dein Mikrofon und deine Kamera verwenden</translation> <translation id="1005333234656240382">ADB-Fehlerbehebung aktivieren?</translation> <translation id="1006873397406093306">Diese Erweiterung kann deine Daten auf Websites lesen und ändern. Du kannst festlegen, auf welche Websites die Erweiterung Zugriff hat.</translation> +<translation id="1007057452468855774">Google Play Store aktivieren</translation> <translation id="1008186147501209563">Lesezeichen exportieren</translation> <translation id="1008557486741366299">Jetzt nicht</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" />-Speicherort</translation> <translation id="1009663062402466586">Spielsteuerung jetzt verfügbar</translation> <translation id="1010498023906173788">Dieser Tab ist mit einer seriellen Schnittstelle verbunden.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Seite reagiert nicht}other{Seiten reagieren nicht}}</translation> +<translation id="1011003645819296594">Gespeicherte Geräte</translation> <translation id="1011355516189274711">Lautstärke der Sprachausgabe</translation> <translation id="1012794136286421601">Deine Dateien aus Google Docs, Google Tabellen, Google Präsentationen und Google Zeichnungen werden synchronisiert. Öffne die Google Drive App, um online oder offline auf die Dateien zuzugreifen.</translation> <translation id="1012876632442809908">USB-C-Gerät (Port vorne)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">Dieses Gerät verwenden</translation> <translation id="1470946456740188591">Mit der Tastenkombination Strg + Suchtaste + 7 kann die Tastaturnavigation aktiviert oder deaktiviert werden</translation> <translation id="1472675084647422956">Mehr anzeigen</translation> +<translation id="1473223074251193484">Tethering-Konfiguration festlegen</translation> <translation id="1474785664565228650">Nach dem Ändern der Mikrofoneinstellung muss Parallels Desktop neu gestartet werden. Starte Parallels Desktop neu, um fortzufahren.</translation> <translation id="1474893630593443211">Mehr Kontrolle über angezeigte Werbung</translation> <translation id="1475502736924165259">Einige deiner gespeicherten Zertifikate passen zu keiner der anderen Kategorien</translation> @@ -677,7 +680,7 @@ <translation id="1637224376458524414">Dieses Lesezeichen auf dem iPhone abrufen</translation> <translation id="1637350598157233081">Dein Passwort ist auf diesem Gerät gespeichert</translation> <translation id="1637765355341780467">Beim Öffnen deines Profils ist ein Fehler aufgetreten. Einige Funktionen sind möglicherweise nicht verfügbar.</translation> -<translation id="1639239467298939599">Wird geladen...</translation> +<translation id="1639239467298939599">Wird geladen</translation> <translation id="1640235262200048077">"<ph name="IME_NAME" />" funktioniert noch nicht in Linux-Apps</translation> <translation id="1640283014264083726">PKCS #1 MD4 mit RSA-Verschlüsselung</translation> <translation id="1641113438599504367">Safe Browsing</translation> @@ -1110,6 +1113,7 @@ <translation id="2044014337866019681">Bitte bestätige <ph name="ACCOUNT" />, um die Sitzung zu entsperren.</translation> <translation id="204497730941176055">Name der Microsoft-Zertifikatsvorlage</translation> <translation id="2045117674524495717">Assistent für Tastenkombinationen</translation> +<translation id="2045211794962848221">Diese Meldung wird dir nicht mehr angezeigt</translation> <translation id="2045969484888636535">Cookies weiterhin blockieren</translation> <translation id="204622017488417136">Dein Gerät wird auf die zuvor installierte Chrome-Version zurückgesetzt und alle Nutzerkonten und lokalen Daten werden gelöscht. Dieser Vorgang kann nicht rückgängig gemacht werden.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -2191,6 +2195,7 @@ <translation id="3021065318976393105">Im Akkubetrieb</translation> <translation id="3021066826692793094">Schmetterling</translation> <translation id="3021678814754966447">Frame-Quelltext &anzeigen</translation> +<translation id="3022361196600037287">„<ph name="DEVICE" />“ wird von diesem Chromebook entfernt und nicht in „<ph name="PRIMARY_EMAIL" />“ gespeichert.</translation> <translation id="3022978424994383087">Nicht verstanden.</translation> <translation id="3023464535986383522">Vorlesen</translation> <translation id="3024374909719388945">24-Stunden-Format verwenden</translation> @@ -2490,7 +2495,7 @@ <translation id="3348038390189153836">Externes Gerät erkannt</translation> <translation id="3348131053948466246">Emoji vorgeschlagen. Drücke die Nach-oben- oder Nach-unten-Taste, um ein Emoji auszuwählen und bestätige die Auswahl mit der Eingabetaste.</translation> <translation id="3349933790966648062">Speicherbedarf</translation> -<translation id="3353786022389205125">Aktiviere „Sperrbildschirm anzeigen, wenn der Ruhemodus beendet wird“ und versuch es noch einmal</translation> +<translation id="3353786022389205125">„Sperrbildschirm anzeigen, wenn der Ruhemodus beendet wird“ aktivieren und noch einmal versuchen</translation> <translation id="3354972872297836698">Koppeln mit Gerät „<ph name="DEVICE_NAME" />“ fehlgeschlagen; Gerät auswählen und noch einmal versuchen</translation> <translation id="3355936511340229503">Verbindungsfehler</translation> <translation id="3356469410714175391">(virtuelle Karte aktiviert)</translation> @@ -3729,6 +3734,7 @@ <translation id="4535127706710932914">Standardprofil</translation> <translation id="4535767533210902251">Der Fingerabdrucksensor ist die Taste rechts oben auf der Tastatur. Berühre ihn leicht mit dem Finger.</translation> <translation id="4536140153723794651">Websites, die immer Cookies verwenden dürfen</translation> +<translation id="4536769240747010177">Tethering-Funktionen:</translation> <translation id="4538417792467843292">Wort löschen</translation> <translation id="4538792345715658285">Durch Unternehmensrichtlinie installiert</translation> <translation id="4541123282641193691">Dein Konto konnte nicht bestätigt werden. Bitte versuche es noch einmal oder starte dein Chromebook neu.</translation> @@ -3756,6 +3762,7 @@ <translation id="4561893854334016293">Keine vor Kurzem geänderten Berechtigungen</translation> <translation id="4562155214028662640">Fingerabdruck hinzufügen</translation> <translation id="4563210852471260509">Anfängliche Eingabesprache ist Chinesisch.</translation> +<translation id="4563382028841851106">Aus dem Konto entfernen</translation> <translation id="4563880231729913339">Finger 3</translation> <translation id="4564245002465020751">Einrichtung auf dem Smartphone abschließen</translation> <translation id="4565377596337484307">Passwort ausblenden</translation> @@ -3792,6 +3799,7 @@ <translation id="4594577641390224176">Suchst du die Seite „Über das System“? Gehe zu</translation> <translation id="4595560905247879544">Apps und Erweiterungen können nur vom Administrator, <ph name="CUSTODIAN_NAME" />, geändert werden.</translation> <translation id="4596295440756783523">In deinen gespeicherten Zertifikaten sind folgende Server angegeben</translation> +<translation id="4598345735110653698">Passkeys verwalten</translation> <translation id="4598556348158889687">Speicherplatzverwaltung</translation> <translation id="4598776695426288251">WLAN über mehrere Geräte verfügbar</translation> <translation id="4601426376352205922">Als ungelesen markieren</translation> @@ -4017,6 +4025,7 @@ <translation id="4823894915586516138">Die PIN bzw. das Passwort hilft, die Daten auf diesem Gerät (<ph name="DEVICE_TYPE" />) zu schützen. Dies gilt auch für alle Informationen, die auf deinem Smartphone gespeichert sind und die du dir auf diesem Gerät ansiehst.</translation> <translation id="4824037980212326045">Linux-Sicherung und ‑Wiederherstellung</translation> <translation id="4824958205181053313">Synchronisierung abbrechen?</translation> +<translation id="4825532258163983651">Passkey kann nicht gelöscht werden</translation> <translation id="4827675678516992122">Verbindung nicht möglich</translation> <translation id="4827784381479890589">Erweiterte Rechtschreibprüfung im Chrome-Browser (Texte werden an Google gesendet, um Rechtschreibvorschläge zu erhalten)</translation> <translation id="4827904420700932487">QR-Code für dieses Bild erstellen</translation> @@ -4279,6 +4288,7 @@ <translation id="5087249366037322692">Von einem Drittanbieter hinzugefügt</translation> <translation id="5087580092889165836">Karte hinzufügen</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 mit RSA-Verschlüsselung</translation> +<translation id="5089763948477033443">Ziehpunkt zur Größenanpassung der Seitenleiste</translation> <translation id="5090637338841444533">Dürfen meine Kameraposition nicht erfassen</translation> <translation id="5093569275467863761">Inkognito-Subframe im Back-Forward-Cache: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Du kannst unterstützte Dateien mit dieser App aus „Dateien“ oder anderen Apps öffnen und bearbeiten. Wenn du festlegen möchtest, welche Dateien standardmäßig in dieser App geöffnet werden sollen, <ph name="BEGIN_LINK" />lies diesen Artikel<ph name="END_LINK" />. Darin erfährst du, wie du Standard-Apps auf deinem Gerät einrichtest.</translation> @@ -4444,6 +4454,7 @@ <translation id="5258992782919386492">Auf diesem Gerät installieren</translation> <translation id="5260334392110301220">Intelligente Anführungszeichen</translation> <translation id="5260508466980570042">Deine E-Mail-Adresse oder Dein Passwort konnte nicht bestätigt werden. Bitte versuche es noch einmal.</translation> +<translation id="5260958083445173099">Inhalte auf Websites werden dir nach Möglichkeit in deinen bevorzugten Sprachen angezeigt</translation> <translation id="5261683757250193089">Im Web Store öffnen</translation> <translation id="5262178194499261222">Passwort entfernen</translation> <translation id="5262784498883614021">Automatisch mit Netzwerk verbinden</translation> @@ -4484,6 +4495,7 @@ <translation id="5294097441441645251">Muss mit einem Kleinbuchstaben oder Unterstrich beginnen</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> verwendet einen integrierten Sensor, um Personen vor dem Gerät zu erkennen. Alle Daten werden direkt auf deinem Gerät verarbeitet und anschließend gelöscht. Sensordaten werden nie an Google gesendet. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Du erhältst gesprochenes Feedback, sodass du dein Gerät nutzen kannst, ohne auf das Display sehen zu müssen. Braille-Feedback ist auf einem verbundenen Gerät verfügbar.</translation> +<translation id="5297005732522718715">Tethering-Konfiguration aktualisieren</translation> <translation id="5297082477358294722">Passwort gespeichert. Gespeicherte Passwörter kannst du in deinem <ph name="SAVED_PASSWORDS_STORE" /> aufrufen und verwalten</translation> <translation id="5297946558563358707">Wenn andere auf deinen Bildschirm blicken, wird unten rechts das Augensymbol für die Privatsphäre angezeigt</translation> <translation id="5298219193514155779">Design von</translation> @@ -4654,6 +4666,7 @@ <translation id="5466374726908360271">Ei&nfügen und nach "<ph name="SEARCH_TERMS" />" suchen</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> blockiert</translation> <translation id="5468173180030470402">Nach Dateifreigaben wird gesucht</translation> +<translation id="5468330507528805311">Tethering-Status:</translation> <translation id="5468881191994555667">Datei auswählen</translation> <translation id="5469852975082458401">Du kannst dich mit einem Textcursor auf den Seiten bewegen. Wenn du die Tastaturnavigation deaktivieren möchtest, drücke F7.</translation> <translation id="5470735824776589490">Für das Zurücksetzen deines Geräts mit Powerwash ist ein Neustart erforderlich. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> @@ -4928,6 +4941,7 @@ <translation id="5734362860645681824">Kommunikation</translation> <translation id="5734697361979786483">Dateifreigabe hinzufügen</translation> <translation id="5736796278325406685">Bitte gib einen gültigen Nutzernamen ein</translation> +<translation id="5738093759615225354">Du benötigst diesen Passkey, um dich auf deinem Computer anzumelden</translation> <translation id="5739017626473506901">Melde dich an, damit <ph name="USER_NAME" /> ein Konto einer Bildungseinrichtung hinzufügen kann</translation> <translation id="5739235828260127894">Bestätigung steht aus. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Sehr groß</translation> @@ -5089,6 +5103,7 @@ <translation id="589541317545606110">Mit <ph name="VISUAL_SEARCH_PROVIDER" /> auf der Seite suchen</translation> <translation id="5896436821193322561">Nicht zulassen</translation> <translation id="5900186025777217044">Smart Lock wurde geändert</translation> +<translation id="5900243355162006650">Tethering-Konfiguration:</translation> <translation id="5900302528761731119">Google Profile-Foto</translation> <translation id="590036993063074298">Details zur Qualität der Spiegelung</translation> <translation id="5901069264981746702">Dein Fingerabdruck wird sicher und niemals außerhalb deines Geräts (<ph name="DEVICE_TYPE" />) gespeichert. <ph name="LINK_BEGIN" />Weitere Informationen<ph name="LINK_END" /></translation> @@ -5392,6 +5407,7 @@ <translation id="6196640612572343990">Drittanbieter-Cookies blockieren</translation> <translation id="6196854373336333322">Die Erweiterung <ph name="EXTENSION_NAME" /> hat die Kontrolle über deine Proxyeinstellungen übernommen. Das bedeutet, dass sie sämtliche Onlineaktivitäten ändern, abbrechen oder überwachen kann. Wenn du nicht sicher bist, wie es zu dieser Änderung gekommen ist, war sie wahrscheinlich nicht beabsichtigt.</translation> <translation id="6197128521826316819">QR-Code für diese Seite erstellen</translation> +<translation id="6197223946499512637">Diese Passkeys sind in Windows Hello auf diesem Computer gespeichert. Sie sind nicht in deinem Google-Konto gespeichert.</translation> <translation id="6198252989419008588">PIN ändern</translation> <translation id="6200047250927636406">Datei verwerfen</translation> <translation id="6200151268994853226">Erweiterung verwalten</translation> @@ -5689,6 +5705,7 @@ <translation id="6482559668224714696">Vollbildlupe</translation> <translation id="6483485061007832714">Heruntergeladene Datei öffnen</translation> <translation id="6483805311199035658"><ph name="FILE" /> wird geöffnet...</translation> +<translation id="6486301003991593638">Wenn du Passkeys verwalten möchtest, verwende eine neuere Version von Windows</translation> <translation id="6488384360522318064">Sprache auswählen</translation> <translation id="648927581764831596">Keine verfügbar</translation> <translation id="6490471652906364588">USB-C-Gerät (Port rechts)</translation> @@ -6172,6 +6189,10 @@ <translation id="6943939122536910181">Verbindung zu <ph name="DEVICE" /> getrennt</translation> <translation id="6945221475159498467">Auswählen</translation> <translation id="694592694773692225">Weiterleitung auf dieser Seite blockiert.</translation> +<translation id="6947015141909171112">Du siehst Rezeptvorschläge auf Grundlage deiner letzten Suchaktivitäten zu Rezepten. + <ph name="BREAK" /> + <ph name="BREAK" /> + Du kannst Einstellungen über das Kartenmenü verwalten oder weitere Optionen unter „Chrome anpassen“ aufrufen.</translation> <translation id="6949434160682548041">Passwort (optional)</translation> <translation id="6950627417367801484">Apps wiederherstellen</translation> <translation id="6952242901357037157">Du kannst hier auch Passwörter aus deinem <ph name="BEGIN_LINK" />Google-Konto<ph name="END_LINK" /> anzeigen</translation> @@ -6271,6 +6292,7 @@ <translation id="7029307918966275733">Crostini ist nicht installiert. Bitte installiere Crostini, um die Credits anzuzeigen.</translation> <translation id="7029809446516969842">Passwörter</translation> <translation id="7030304022046916278">Sendet URLs an Safe Browsing, um sie zu prüfen</translation> +<translation id="7030695672997239647">Klicke mit der rechten Maustaste auf einen Tab, wähle „Tab zu Gruppe hinzufügen“ aus und klicke dann auf „Neue Gruppe“</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" />: serielle Schnittstelle verbunden</translation> <translation id="7033616203784997570">Du darfst höchstens 62 Zeichen eingeben</translation> <translation id="7034692021407794547">Ein Administrator mit der Berechtigung „Abrechnungsverwaltung“ muss zuerst im Bereich „Google Meet-Hardware“ in der Admin-Konsole die Nutzungsbedingungen der Google Meet-Hardware akzeptieren.</translation> @@ -6967,6 +6989,7 @@ <translation id="7737115349420013392">Wird mit "<ph name="DEVICE_NAME" />" gekoppelt…</translation> <translation id="7737846262459425222">Du kannst dies jederzeit unter „Einstellungen“ > „Google Assistant“ > „Bildschirmkontext“ ändern.</translation> <translation id="7737948071472253612">Dürfen meine Kamera nicht verwenden</translation> +<translation id="77381465218432215">Akzente und Sonderzeichen anzeigen</translation> <translation id="7740996059027112821">Standard</translation> <translation id="7741307896921365578">Blendet eine Seitenleiste auf Browserebene ein, über die du jederzeit bequem auf deine Leseliste und Lesezeichen zugreifen kannst.</translation> <translation id="7742558784808143689">Websitedaten und Berechtigungen für <ph name="SITE_NAME" />, alle ihr untergeordneten Websites und auf ihr installierten Apps löschen?</translation> @@ -7371,6 +7394,7 @@ <translation id="8101987792947961127">Powerwash beim nächsten Neustart erforderlich</translation> <translation id="81020759409809034">Lokaler Speicherort</translation> <translation id="8102139037507939978">Personenidentifizierbare Informationen aus system_logs.txt entfernen.</translation> +<translation id="810362914482827094">Passkeys durchsuchen</translation> <translation id="8104088837833760645">eSIM-Profil herunterladen</translation> <translation id="8105368624971345109">Deaktivieren</translation> <translation id="8107015733319732394">Google Play Store wird auf deinem <ph name="DEVICE_TYPE" /> installiert. Dies kann ein paar Minuten dauern.</translation> @@ -7756,6 +7780,7 @@ <translation id="8486666913807228950">Grund: Die umgekehrte Regel <ph name="REVERT_RULE" /> wurde in der Liste „Öffnen erzwingen in“ gefunden.</translation> <translation id="848666842773560761">Eine App versucht, auf die Kamera zuzugreifen. Schalte den Vertraulichkeitsmodus der Kamera aus, um den Zugriff zu erlauben.</translation> <translation id="8487678622945914333">Vergrößern</translation> +<translation id="8487699605742506766">Hotspot</translation> <translation id="8489156414266187072">Persönliche Vorschläge werden nur in deinem Konto angezeigt</translation> <translation id="8490896350101740396">Die folgenden Kiosk-Apps wurden aktualisiert: <ph name="UPDATED_APPS" />. Starte das Gerät neu, um die Aktualisierung abzuschließen.</translation> <translation id="8492685019009920170">Berühre den Fingerabdrucksensor mit dem Finger. Deine Daten werden sicher und niemals außerhalb deines <ph name="DEVICE_TYPE" /> gespeichert.</translation> @@ -7817,6 +7842,7 @@ <translation id="8557022314818157177">Berühre mehrmals den Fingerabdrucksensor auf deinem Sicherheitsschlüssel, bis der Fingerabdruck gespeichert ist</translation> <translation id="8557180006508471423">„Google Chrome“ in den Standortdiensten auf deinem Mac einschalten</translation> <translation id="8557856025359704738">Nächster Download am <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Passkeys</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Alle in &neuem Fenster öffnen}=1{In &neuem Fenster öffnen}other{Alle ({COUNT}) in &neuem Fenster öffnen}}</translation> <translation id="8561206103590473338">Elefant</translation> <translation id="8561565784790166472">Vorsicht</translation> @@ -7943,6 +7969,7 @@ <translation id="8677212948402625567">Alle minimieren...</translation> <translation id="867767487203716855">Nächste Aktualisierung</translation> <translation id="8677859815076891398">Keine Alben. Ein Album in <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" /> erstellen.</translation> +<translation id="8678378565142776698">Neu starten und automatische Updates erhalten</translation> <translation id="8678538439778360739">Deine Daten wurden am <ph name="TIME" /> mit deiner Synchronisierungspassphrase verschlüsselt. Davon ausgenommen sind Zahlungsmethoden oder Adressen von Google Pay.</translation> <translation id="8678582529642151449">Tabs werden nicht verkleinert</translation> <translation id="8678933587484842200">Wie soll diese Anwendung gestartet werden?</translation> @@ -8189,6 +8216,7 @@ <translation id="8910987510378294980">Geräteliste ausblenden</translation> <translation id="8912362522468806198">Google-Konto</translation> <translation id="8912810933860534797">Automatischen Scan aktivieren</translation> +<translation id="8915307125957890427">Klicke mit der rechten Maustaste auf einen Tab, wähle „Tab zu Gruppe hinzufügen“ aus und klicke dann auf „Neue Gruppe“</translation> <translation id="8915370057835397490">Vorschläge werden geladen</translation> <translation id="8916476537757519021">Inkognito-Subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> von <ph name="GIVEN_NAME" /></translation> @@ -8249,6 +8277,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{"<ph name="TAB_TITLE" />"}=1{"<ph name="TAB_TITLE" />" und 1 weiterer Tab}other{"<ph name="TAB_TITLE" />" und # weitere Tabs}}</translation> <translation id="8977811652087512276">Falsches Passwort oder beschädigte Datei</translation> <translation id="8978154919215542464">An – alles synchronisieren</translation> +<translation id="8978670037548431647">Tethering-Funktionen aktualisieren</translation> <translation id="897939795688207351">Auf <ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Feedbackberichte</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> – abgestürzt</translation> @@ -8262,6 +8291,7 @@ <translation id="8986362086234534611">Entfernen</translation> <translation id="8986494364107987395">Nutzungsstatistiken und Absturzberichte automatisch an Google senden</translation> <translation id="8987927404178983737">Monat</translation> +<translation id="8989359959810288806">Tethering-Status aktualisieren</translation> <translation id="8991520179165052608">Die Website kann dein Mikrofon verwenden</translation> <translation id="899384117894244799">Nutzer mit eingeschränktem Zugriff entfernen</translation> <translation id="899403249577094719">Basis-URL für Netscape-Zertifikate</translation> @@ -8513,6 +8543,7 @@ <translation id="935854577147268200">Das Smartphone für Smart Lock wurde geändert. Gib dein Passwort ein, um Smart Lock zu aktualisieren. Das nächste Mal wird dein <ph name="DEVICE_TYPE" /> von deinem Smartphone entsperrt. Du kannst Smart Lock in den Einstellungen deaktivieren.</translation> <translation id="936646668635477464">Kamera & Mikrofon</translation> <translation id="936801553271523408">Fehlerberichte des Systems</translation> +<translation id="937053962468712792">Möchtest du das Gerät „<ph name="DEVICE" />“ aus dem Konto „<ph name="PRIMARY_EMAIL" />“ entfernen?</translation> <translation id="93766956588638423">Erweiterung reparieren</translation> <translation id="938568644810664664">Du kannst fragen „Hey Google, welcher Song ist das?“ oder „Hey Google, was ist auf meinem Bildschirm?“</translation> <translation id="938623846785894166">Ungewöhnliche Datei</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index e2870af..4b1dec83 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -686,7 +686,7 @@ <translation id="1637224376458524414">Λάβετε αυτόν τον σελιδοδείκτη στο iPhone</translation> <translation id="1637350598157233081">Ο κωδικός πρόσβασής σας αποθηκεύεται σε αυτήν τη συσκευή.</translation> <translation id="1637765355341780467">Παρουσιάστηκε ένα πρόβλημα κατά το άνοιγμα του προφίλ σας. Μερικές λειτουργίες μπορεί να μην είναι διαθέσιμες.</translation> -<translation id="1639239467298939599">Γίνεται φόρτωση</translation> +<translation id="1639239467298939599">Φόρτωση</translation> <translation id="1640235262200048077">Το <ph name="IME_NAME" /> δεν λειτουργεί ακόμη σε εφαρμογές Linux.</translation> <translation id="1640283014264083726">PKCS #1 MD4 με κρυπτογράφηση RSA</translation> <translation id="1641113438599504367">Ασφαλής περιήγηση</translation> @@ -4691,6 +4691,7 @@ <translation id="5470735824776589490">Απαιτείται επανεκκίνηση προκειμένου να είναι δυνατή η επαναφορά της συσκευής σας με Powerwash. <ph name="LINK_BEGIN" />Μάθετε περισσότερα<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Γεια σας! Είμαι η φωνή της λειτουργίας μετατροπής κειμένου σε ομιλία.</translation> <translation id="5472627187093107397">Αποθήκευση κωδικών πρόσβασης για αυτόν τον ιστότοπο</translation> +<translation id="5473062644742711742">Βρείτε περισσότερα εργαλεία προσβασιμότητας στο Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Εάν συνεχίσετε, αποδέχεστε ότι αυτή η συσκευή θα μπορεί επίσης να κατεβάζει και να εγκαθιστά αυτόματα ενημερώσεις και εφαρμογές από την Google, την εταιρεία κινητής τηλεφωνίας που χρησιμοποιεί το παιδί σας και τον κατασκευαστή αυτής της συσκευής, πιθανόν με τη χρήση δεδομένων κινητής τηλεφωνίας. Μερικές από αυτές τις εφαρμογές μπορεί να προσφέρουν αγορές εντός εφαρμογής.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{Το PIN πρέπει να αποτελείται τουλάχιστον από έναν χαρακτήρα.}other{Το PIN πρέπει να αποτελείται τουλάχιστον από # χαρακτήρες.}}</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 85031b47..04d815b 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -7978,6 +7978,7 @@ <translation id="8666759526542103597">About browser-based ad personalisation</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> is now full screen and has disabled your mouse cursor.</translation> <translation id="8667760277771450375">We’re exploring ways to restrict cross-site tracking while enabling sites to stop ad spam and fraud.</translation> +<translation id="8668378421690365723">Your device may no longer work properly and may experience security and performance issues.</translation> <translation id="8669284339312441707">Warmer</translation> <translation id="8670537393737592796">To get back here quickly, install <ph name="APP_NAME" /> by clicking the install button</translation> <translation id="867085395664725367">Temporary server error occurred.</translation> @@ -8461,6 +8462,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />For the best experience, install <ph name="DEVICE_OS" /> to your internal disk. You can also install it later from the login screen.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />If you're not ready to install, you can run from USB to try it out. This will keep your existing OS and data, but you may see storage and performance limits.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Open as pinned tab</translation> +<translation id="9123287046453017203">Your device is not up to date</translation> <translation id="9124003689441359348">Saved passwords will appear here</translation> <translation id="9126149354162942022">Cursor colour</translation> <translation id="9128317794749765148">Setup couldn't complete</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 0eebdad..fbb1345 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Usar tu micrófono y tu cámara</translation> <translation id="1005333234656240382">¿Quieres habilitar la depuración de adb?</translation> <translation id="1006873397406093306">Esta extensión puede leer y cambiar tus datos en los sitios. Puedes controlar los sitios a los que la extensión puede acceder.</translation> +<translation id="1007057452468855774">Activar Google Play Store</translation> <translation id="1008186147501209563">Exportar favoritos</translation> <translation id="1008557486741366299">Ahora no</translation> <translation id="1009476156254802388">Ubicación en <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Los controles de juego ya están disponibles</translation> <translation id="1010498023906173788">Esta pestaña está conectada a un puerto en serie.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{La página no responde.}other{Las páginas no responden.}}</translation> +<translation id="1011003645819296594">Dispositivos guardados</translation> <translation id="1011355516189274711">Volumen para texto a voz</translation> <translation id="1012794136286421601">Se están sincronizando tus archivos de Documentos de Google, Google Spreadsheets, Diapositivas de Google y Dibujos de Google. Abre la aplicación de Google Drive para acceder a ellos en línea o sin conexión.</translation> <translation id="1012876632442809908">Dispositivo USB-C (puerto delantero)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">Usar este dispositivo</translation> <translation id="1470946456740188591">Para activar o desactivar la navegación por cursor de texto, usa la combinación de teclas Ctrl+Buscar+7</translation> <translation id="1472675084647422956">Mostrar más</translation> +<translation id="1473223074251193484">Establecer la configuración de la conexión mediante dispositivo móvil</translation> <translation id="1474785664565228650">Es necesario que reinicies Parallels Desktop para aplicar los cambios en la configuración del micrófono. Para continuar, reinicia Parallels Desktop.</translation> <translation id="1474893630593443211">Más control sobre los anuncios que ves</translation> <translation id="1475502736924165259">Tienes certificados archivados que no coinciden con ninguna de las demás categorías</translation> @@ -1110,6 +1113,7 @@ <translation id="2044014337866019681">Para desbloquear la sesión, asegúrate de verificar <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Nombre de la plantilla de certificado de Microsoft</translation> <translation id="2045117674524495717">Asistente de combinaciones de teclas</translation> +<translation id="2045211794962848221">No volverás a ver este mensaje específico</translation> <translation id="2045969484888636535">Continuar bloqueando las cookies</translation> <translation id="204622017488417136">El dispositivo volverá a la versión de Chrome instalada anteriormente. Se eliminarán todas las cuentas de usuario y los datos locales. Esta acción no se puede deshacer.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3471,7 +3475,7 @@ <translation id="4284755288573763878">¿Quieres desactivar la seguridad mejorada?</translation> <translation id="4284903252249997120">Seleccionar para pronunciar y lector de pantalla de ChromeVox</translation> <translation id="4285418559658561636">Actualizar contraseña</translation> -<translation id="4285498937028063278">No fijar</translation> +<translation id="4285498937028063278">Dejar de fijar</translation> <translation id="428565720843367874">Se produjo un error inesperado con el software antivirus al examinar este archivo.</translation> <translation id="4287099557599763816">Lector de pantalla</translation> <translation id="428715201724021596">Se está estableciendo conexión con el perfil. Es posible que este proceso demore unos minutos.</translation> @@ -3795,6 +3799,7 @@ <translation id="4594577641390224176">¿Buscas la página de información del sistema? Visita</translation> <translation id="4595560905247879544">Solo el administrador (<ph name="CUSTODIAN_NAME" />) puede modificar las apps y extensiones.</translation> <translation id="4596295440756783523">Tienes certificados archivados que identifican estos servidores</translation> +<translation id="4598345735110653698">Administrar claves de acceso</translation> <translation id="4598556348158889687">Administración de almacenamiento</translation> <translation id="4598776695426288251">Wi-Fi disponible mediante varios dispositivos</translation> <translation id="4601426376352205922">Marcar como no leído</translation> @@ -4020,6 +4025,7 @@ <translation id="4823894915586516138">El PIN o la contraseña protegen los datos que tienes en este dispositivo <ph name="DEVICE_TYPE" />, incluida la información a la que accedes desde el teléfono.</translation> <translation id="4824037980212326045">Copia de seguridad y restablecimiento de Linux</translation> <translation id="4824958205181053313">¿Quieres cancelar la sincronización?</translation> +<translation id="4825532258163983651">No se puede borrar la clave de acceso</translation> <translation id="4827675678516992122">No se pudo establecer conexión</translation> <translation id="4827784381479890589">Corrector ortográfico mejorado en el navegador Chrome (se envía el texto a Google para obtener sugerencias ortográficas)</translation> <translation id="4827904420700932487">Crear un código QR para esta imagen</translation> @@ -4282,6 +4288,7 @@ <translation id="5087249366037322692">Agregada por un tercero</translation> <translation id="5087580092889165836">Agregar tarjeta</translation> <translation id="5088534251099454936">PKCS N. º 1, SHA-512 con encriptación RSA</translation> +<translation id="5089763948477033443">Controlador de cambio de tamaño del panel lateral</translation> <translation id="5090637338841444533">No puede realizar un seguimiento de la posición de la cámara</translation> <translation id="5093569275467863761">Submarco de incógnito en la Memoria caché atrás/adelante: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Puedes abrir y editar los archivos compatibles con esta app desde la app de archivos o desde otras apps. A fin de controlar qué archivos se abren en esta app de forma predeterminada, <ph name="BEGIN_LINK" />obtén más información para establecer apps predeterminadas en tu dispositivo<ph name="END_LINK" />.</translation> @@ -4447,6 +4454,7 @@ <translation id="5258992782919386492">Instalar en este dispositivo</translation> <translation id="5260334392110301220">Comillas inteligentes</translation> <translation id="5260508466980570042">No es posible verificar tu correo electrónico o contraseña. Inténtalo nuevamente.</translation> +<translation id="5260958083445173099">Los sitios web mostrarán contenido en estos idiomas cuando sea posible</translation> <translation id="5261683757250193089">Abrir en Web Store</translation> <translation id="5262178194499261222">Quitar contraseña</translation> <translation id="5262784498883614021">Conectarse a una red de forma automática</translation> @@ -4487,6 +4495,7 @@ <translation id="5294097441441645251">Debe comenzar con una letra minúscula o un guion bajo</translation> <translation id="5294618183559481278">Tu <ph name="DEVICE_TYPE" /> utiliza un sensor integrado para detectar personas que estén frente a tu dispositivo. Toda la información se procesa automáticamente en tu dispositivo y, luego, se borra. Los datos de sensores nunca se envían a Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Escucha comentarios por voz para usar el dispositivo sin mirar la pantalla. Los comentarios en braille están disponibles con un dispositivo conectado.</translation> +<translation id="5297005732522718715">Actualizar la configuración de la conexión mediante dispositivo móvil</translation> <translation id="5297082477358294722">Se guardó la contraseña. Puedes ver y administrar las contraseñas guardadas en tu <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Cuando otra persona observa tu pantalla, se muestra el ícono del ojo (visualización privada) en la esquina inferior derecha de la pantalla</translation> <translation id="5298219193514155779">Tema creado por</translation> @@ -4657,11 +4666,13 @@ <translation id="5466374726908360271">&Pegar y buscar "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Permisos bloqueados: <ph name="PERMISSION_1" /> y <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Buscando archivos compartidos</translation> +<translation id="5468330507528805311">Estado de la conexión mediante dispositivo móvil:</translation> <translation id="5468881191994555667">Elegir archivo</translation> <translation id="5469852975082458401">Puedes navegar páginas con un cursor de texto. Presiona F7 para desactivar esta función.</translation> <translation id="5470735824776589490">Debes reiniciar tu dispositivo para poder restablecerlo con Powerwash. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hola, soy la voz que leerá tus textos.</translation> <translation id="5472627187093107397">Guardar contraseñas para este sitio</translation> +<translation id="5473062644742711742">Encontrar más herramientas de accesibilidad en Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Si continúas, aceptas que este dispositivo pueda descargar e instalar automáticamente actualizaciones y apps de Google, del operador de tu hijo y del fabricante del dispositivo, y que incluso use datos móviles para ello. Es posible que algunas de estas apps ofrezcan compras directas desde la aplicación.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{El PIN debe tener al menos un carácter}other{El PIN debe tener al menos # caracteres}}</translation> @@ -4932,6 +4943,7 @@ <translation id="5734362860645681824">Comunicaciones</translation> <translation id="5734697361979786483">Agregar sistema de archivos compartidos</translation> <translation id="5736796278325406685">Ingresa un nombre de usuario válido</translation> +<translation id="5738093759615225354">Necesitas esta clave de acceso para acceder a tu computadora</translation> <translation id="5739017626473506901">Accede para ayudar a <ph name="USER_NAME" /> a agregar una cuenta de una institución educativa</translation> <translation id="5739235828260127894">La verificación está pendiente. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Muy grande</translation> @@ -5093,6 +5105,7 @@ <translation id="589541317545606110">Buscar en la página con <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">No permitir</translation> <translation id="5900186025777217044">Se modificó Smart Lock</translation> +<translation id="5900243355162006650">Configuración de la conexión mediante dispositivo móvil:</translation> <translation id="5900302528761731119">Foto de perfil de Google</translation> <translation id="590036993063074298">Detalles sobre la calidad de la proyección</translation> <translation id="5901069264981746702">Los datos de las huellas digitales se guardan en un lugar seguro de tu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> @@ -5397,6 +5410,7 @@ <translation id="6196640612572343990">Bloquear cookies de terceros</translation> <translation id="6196854373336333322">La extensión "<ph name="EXTENSION_NAME" />" tomó el control de la configuración de proxy, lo que significa que puede modificar, dañar o espiar cualquier actividad que lleves a cabo en línea. Si no sabes con certeza por qué se produjo este cambio, probablemente no lo desees.</translation> <translation id="6197128521826316819">Crear un código QR para esta página</translation> +<translation id="6197223946499512637">Estas claves de acceso se almacenan en Windows Hello en esta computadora. No se guardan en tu Cuenta de Google.</translation> <translation id="6198252989419008588">Cambiar PIN</translation> <translation id="6200047250927636406">Descartar archivo</translation> <translation id="6200151268994853226">Administrar extensión</translation> @@ -5694,6 +5708,7 @@ <translation id="6482559668224714696">Lupa de pantalla completa</translation> <translation id="6483485061007832714">Abrir el archivo descargado</translation> <translation id="6483805311199035658">Abriendo <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Para administrar las claves de acceso, usa una versión más reciente de Windows</translation> <translation id="6488384360522318064">Seleccionar idioma</translation> <translation id="648927581764831596">Ningún medio disponible</translation> <translation id="6490471652906364588">Dispositivo USB-C (puerto derecho)</translation> @@ -6280,6 +6295,7 @@ <translation id="7029307918966275733">No se instaló Crostini. Instálalo para ver los créditos.</translation> <translation id="7029809446516969842">Contraseñas</translation> <translation id="7030304022046916278">Envía las URL a la Navegación segura para revisarlas.</translation> +<translation id="7030695672997239647">Haz clic con el botón derecho en una pestaña, selecciona "Agregar pestaña al grupo" y, luego, selecciona "Grupo nuevo"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Puerto en serie conectado</translation> <translation id="7033616203784997570">La entrada debe tener como máximo 62 caracteres.</translation> <translation id="7034692021407794547">Un administrador con privilegios de administración de facturación primero debe aceptar las Condiciones del Servicio del hardware de Google Meet en la sección Hardware de Google Meet de la Consola del administrador.</translation> @@ -7382,6 +7398,7 @@ <translation id="8101987792947961127">Se requiere Powerwash en el siguiente reinicio</translation> <translation id="81020759409809034">Ubicación local</translation> <translation id="8102139037507939978">Quita la información de identificación personal del archivo system_logs.txt.</translation> +<translation id="810362914482827094">Buscar claves de acceso</translation> <translation id="8104088837833760645">Descargar el perfil de eSIM</translation> <translation id="8105368624971345109">Desactivar</translation> <translation id="8107015733319732394">Se está instalando Google Play Store en tu <ph name="DEVICE_TYPE" />. Esta acción puede tardar unos minutos.</translation> @@ -7829,6 +7846,7 @@ <translation id="8557022314818157177">Continúa tocando la llave de seguridad hasta que se capture tu huella dactilar</translation> <translation id="8557180006508471423">Activa "Google Chrome" en los Servicios de ubicación de tu Mac</translation> <translation id="8557856025359704738">La próxima descarga será el <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Claves de acceso</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Abrir todo en una ventana &nueva}=1{Abrir en una ventana &nueva}other{Abrir todo ({COUNT}) en una ventana &nueva}}</translation> <translation id="8561206103590473338">Elefante</translation> <translation id="8561565784790166472">Procede con cuidado</translation> @@ -7955,6 +7973,7 @@ <translation id="8677212948402625567">Contraer todo...</translation> <translation id="867767487203716855">Próxima actualización</translation> <translation id="8677859815076891398">No hay álbumes. Crea un álbum en <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Reiniciar y obtener actualizaciones automáticas</translation> <translation id="8678538439778360739">Se encriptaron los datos con tu frase de contraseña de sincronización el <ph name="TIME" />. No se incluyen formas de pago ni direcciones de Google Pay.</translation> <translation id="8678582529642151449">Las pestañas no se achican</translation> <translation id="8678933587484842200">¿Cómo deseas que se ejecute esta app?</translation> @@ -8201,6 +8220,7 @@ <translation id="8910987510378294980">Ocultar lista de dispositivos</translation> <translation id="8912362522468806198">Cuenta de Google</translation> <translation id="8912810933860534797">Habilitar la búsqueda automática</translation> +<translation id="8915307125957890427">Haz clic con el botón derecho en una pestaña, selecciona "Agregar pestaña al grupo" y, luego, selecciona "Grupo nuevo"</translation> <translation id="8915370057835397490">Cargando sugerencia</translation> <translation id="8916476537757519021">Submarco incógnito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> @@ -8275,6 +8295,7 @@ <translation id="8986362086234534611">Borrar</translation> <translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="8987927404178983737">Mes</translation> +<translation id="8989359959810288806">Actualizar el estado de la conexión mediante dispositivo móvil</translation> <translation id="8991520179165052608">El sitio puede usar el micrófono</translation> <translation id="899384117894244799">¿Quieres quitar un usuario restringido?</translation> <translation id="899403249577094719">URL base del certificado Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index df6d9ef..ba36656c 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Utilizar el micrófono y la cámara</translation> <translation id="1005333234656240382">¿Quieres habilitar la depuración ADB?</translation> <translation id="1006873397406093306">Esta extensión puede leer y cambiar tus datos en los sitios. Puedes controlar a qué sitios puede acceder la extensión.</translation> +<translation id="1007057452468855774">Activar Google Play Store</translation> <translation id="1008186147501209563">Exportar marcadores</translation> <translation id="1008557486741366299">Ahora no</translation> <translation id="1009476156254802388">Ubicación de <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Controles de juegos ya disponibles</translation> <translation id="1010498023906173788">Esta pestaña está conectada a un puerto serie.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{La página no responde}other{Las páginas no responden}}</translation> +<translation id="1011003645819296594">Dispositivos guardados</translation> <translation id="1011355516189274711">Volumen de conversión de texto a voz</translation> <translation id="1012794136286421601">Se están sincronizando tus archivos de Documentos, Hojas de cálculo, Presentaciones y Dibujos de Google. Abre la aplicación Google Drive para acceder a ellos con y sin conexión.</translation> <translation id="1012876632442809908">Dispositivo USB-C (puerto frontal)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">Usar este dispositivo</translation> <translation id="1470946456740188591">Para activar o desactivar la navegación por cursor de texto, usa la combinación de teclas Ctrl + tecla de búsqueda + 7</translation> <translation id="1472675084647422956">Mostrar más</translation> +<translation id="1473223074251193484">Configurar conexión compartida</translation> <translation id="1474785664565228650">El cambio en el ajuste del micrófono requiere que se reinicie Parallels Desktop. Reinicia Parallels Desktop para continuar.</translation> <translation id="1474893630593443211">Más control sobre los anuncios que ves</translation> <translation id="1475502736924165259">Tienes certificados registrados que no corresponden a ninguna otra categoría</translation> @@ -1113,6 +1116,7 @@ <translation id="2044014337866019681">Asegúrate de que estás verificando <ph name="ACCOUNT" /> para desbloquear la sesión.</translation> <translation id="204497730941176055">Nombre de plantilla de certificado de Microsoft</translation> <translation id="2045117674524495717">Asistente de combinaciones de teclas</translation> +<translation id="2045211794962848221">No volverás a ver este mensaje concreto</translation> <translation id="2045969484888636535">Continuar bloqueando las cookies</translation> <translation id="204622017488417136">Se restaurará la versión de Chrome instalada previamente en el dispositivo y se eliminarán todas las cuentas de usuario y todos los datos locales. Esta acción no se puede deshacer.</translation> <translation id="2046702855113914483">Fideos</translation> @@ -3798,6 +3802,7 @@ <translation id="4594577641390224176">¿Buscas la página de información del sistema? Visita</translation> <translation id="4595560905247879544">Únicamente el administrador (<ph name="CUSTODIAN_NAME" />) puede modificar las aplicaciones y las extensiones.</translation> <translation id="4596295440756783523">Tienes certificados registrados que identifican a estos servidores</translation> +<translation id="4598345735110653698">Gestionar claves de acceso</translation> <translation id="4598556348158889687">Gestión del almacenamiento</translation> <translation id="4598776695426288251">Wi-Fi disponible a través de varios dispositivos</translation> <translation id="4601426376352205922">Marcar como no leído</translation> @@ -4023,6 +4028,7 @@ <translation id="4823894915586516138">Este PIN o contraseña protegerán los datos que tengas en este <ph name="DEVICE_TYPE" />, incluida cualquier información a la accedas desde tu teléfono</translation> <translation id="4824037980212326045">Copia de seguridad y restauración de Linux</translation> <translation id="4824958205181053313">¿Quieres cancelar la sincronización?</translation> +<translation id="4825532258163983651">No se puede eliminar la clave de acceso</translation> <translation id="4827675678516992122">No se ha podido conectar</translation> <translation id="4827784381479890589">Revisión ortográfica mejorada en el navegador Chrome (el texto se envía a Google para que muestre sugerencias ortográficas)</translation> <translation id="4827904420700932487">Crear código QR para esta imagen</translation> @@ -4285,6 +4291,7 @@ <translation id="5087249366037322692">Añadida por un tercero</translation> <translation id="5087580092889165836">Añadir tarjeta</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 con cifrado RSA</translation> +<translation id="5089763948477033443">Controlador de tamaño del panel lateral</translation> <translation id="5090637338841444533">No puede monitorizar la posición de la cámara</translation> <translation id="5093569275467863761">Submarco de incógnito almacenado en la caché de páginas completas: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Puedes abrir y editar archivos compatibles con esta aplicación desde la aplicación Archivos u otras aplicaciones. Para controlar qué archivos se abren con esta aplicación de forma predeterminada, <ph name="BEGIN_LINK" />consulta cómo establecer aplicaciones predeterminadas en tu dispositivo<ph name="END_LINK" />.</translation> @@ -4450,6 +4457,7 @@ <translation id="5258992782919386492">Instalar en este dispositivo</translation> <translation id="5260334392110301220">Comillas tipográficas</translation> <translation id="5260508466980570042">Tu dirección de correo electrónico y tu contraseña no se han podido verificar. Vuelve a intentarlo.</translation> +<translation id="5260958083445173099">Si es posible, los sitios web mostrarán contenido en tus idiomas preferidos</translation> <translation id="5261683757250193089">Abrir en Web Store</translation> <translation id="5262178194499261222">Quitar contraseña</translation> <translation id="5262784498883614021">Conectarse automáticamente a la red</translation> @@ -4490,6 +4498,7 @@ <translation id="5294097441441645251">Debe comenzar con un carácter en minúscula o un guion bajo</translation> <translation id="5294618183559481278">Tu <ph name="DEVICE_TYPE" /> usa un sensor integrado para detectar si hay alguien que no seas tú frente a tu dispositivo. Todos los datos se procesan inmediatamente en tu dispositivo y después se eliminan. Los datos del sensor nunca se envían a Google. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Escucha mensajes de voz para poder usar el dispositivo sin mirar la pantalla. Se pueden recibir mensajes en braille con un dispositivo conectado.</translation> +<translation id="5297005732522718715">Actualizar configuración de conexión compartida</translation> <translation id="5297082477358294722">Se ha guardado la contraseña. Consulta y gestiona las contraseñas guardadas en tu <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Cuando una persona que no seas tú mire tu pantalla, se mostrará el icono del ojo (visualización privada) en la parte inferior derecha de la pantalla</translation> <translation id="5298219193514155779">Tema creado por</translation> @@ -4660,6 +4669,7 @@ <translation id="5466374726908360271">Pe&gar y buscar "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Con bloqueo: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Buscando sistemas de archivos compartidos</translation> +<translation id="5468330507528805311">Estado de la conexión compartida:</translation> <translation id="5468881191994555667">Seleccionar archivo</translation> <translation id="5469852975082458401">Puedes desplazarte por las páginas con un cursor de texto. Pulsa F7 para desactivar esta opción.</translation> <translation id="5470735824776589490">Es necesario reiniciar el dispositivo antes de poder restablecerlo con Powerwash. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> @@ -4935,6 +4945,7 @@ <translation id="5734362860645681824">Comunicaciones</translation> <translation id="5734697361979786483">Añadir sistema de archivos compartidos</translation> <translation id="5736796278325406685">Introduce un nombre de usuario válido</translation> +<translation id="5738093759615225354">Necesitas esta clave de acceso para iniciar sesión en tu ordenador</translation> <translation id="5739017626473506901">Inicia sesión para ayudar a <ph name="USER_NAME" /> a añadir una cuenta de centro educativo</translation> <translation id="5739235828260127894">Esperando verificación. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" />.</translation> <translation id="5739458112391494395">Muy grande</translation> @@ -5096,6 +5107,7 @@ <translation id="589541317545606110">Buscar en la página con <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">No permitir</translation> <translation id="5900186025777217044">Smart Lock ha cambiado</translation> +<translation id="5900243355162006650">Configuración de conexión compartida:</translation> <translation id="5900302528761731119">Foto de perfil de Google</translation> <translation id="590036993063074298">Detalles sobre la calidad de la proyección</translation> <translation id="5901069264981746702">Los datos de tu huella digital se almacenan de forma segura y nunca salen de tu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Más información<ph name="LINK_END" /></translation> @@ -5400,6 +5412,7 @@ <translation id="6196640612572343990">Bloquear cookies de terceros</translation> <translation id="6196854373336333322">La extensión <ph name="EXTENSION_NAME" /> ahora controla la configuración del proxy, lo que significa que puede cambiar, deshacer o espiar cualquier acción que hagas online. Si no estás seguro de los motivos por los que se ha producido este cambio, probablemente no haya sido intencionado.</translation> <translation id="6197128521826316819">Crear código QR para esta página</translation> +<translation id="6197223946499512637">Estas claves de acceso se almacenan en Windows Hello en este ordenador. No se guardan en tu cuenta de Google.</translation> <translation id="6198252989419008588">Cambiar PIN</translation> <translation id="6200047250927636406">Descartar archivo</translation> <translation id="6200151268994853226">Gestionar extensión</translation> @@ -5697,6 +5710,7 @@ <translation id="6482559668224714696">Lupa de pantalla completa</translation> <translation id="6483485061007832714">Abrir descarga</translation> <translation id="6483805311199035658">Abriendo <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Para gestionar claves de acceso, usa una versión más reciente de Windows</translation> <translation id="6488384360522318064">Seleccionar idioma</translation> <translation id="648927581764831596">Ningún medio disponible</translation> <translation id="6490471652906364588">Dispositivo USB-C (puerto derecho)</translation> @@ -6283,6 +6297,7 @@ <translation id="7029307918966275733">Crostini no está instalado. Para ver los créditos, instala Crostini.</translation> <translation id="7029809446516969842">Contraseñas</translation> <translation id="7030304022046916278">Envía URLs a Navegación segura para comprobarlas.</translation> +<translation id="7030695672997239647">Haz clic con el botón derecho en una pestaña y selecciona "Añadir pestaña al grupo" > "Nuevo grupo"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Puerto serie conectado</translation> <translation id="7033616203784997570">Puedes escribir 62 caracteres como máximo</translation> <translation id="7034692021407794547">Un administrador con privilegios de gestión de facturación debe aceptar antes los Términos del Servicio del Hardware de Google Meet en la sección correspondiente a estos dispositivos en la consola de administración.</translation> @@ -7385,6 +7400,7 @@ <translation id="8101987792947961127">Se requiere Powerwash en el siguiente reinicio</translation> <translation id="81020759409809034">Ubicación local</translation> <translation id="8102139037507939978">Quita la información personal identificable del archivo system_logs.txt.</translation> +<translation id="810362914482827094">Buscar claves de acceso</translation> <translation id="8104088837833760645">Descargar perfil de eSIM</translation> <translation id="8105368624971345109">Desactivar</translation> <translation id="8107015733319732394">Se está instalando Google Play Store en tu <ph name="DEVICE_TYPE" />. Esto puede tardar unos minutos.</translation> @@ -7832,6 +7848,7 @@ <translation id="8557022314818157177">Sigue pulsando tu llave de seguridad hasta que tu huella digital quede registrada.</translation> <translation id="8557180006508471423">Activa Google Chrome en los servicios de localización de tu Mac</translation> <translation id="8557856025359704738">Fecha de la próxima descarga: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Claves de acceso</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Abrir todas en una ventana &nueva}=1{Abrir en una ventana &nueva}other{Abrir todas ({COUNT}) en una ventana &nueva}}</translation> <translation id="8561206103590473338">Elefante</translation> <translation id="8561565784790166472">Ten cuidado</translation> @@ -7958,6 +7975,7 @@ <translation id="8677212948402625567">Ocultar todos...</translation> <translation id="867767487203716855">Próxima actualización</translation> <translation id="8677859815076891398">No hay álbumes. Crea un álbum en <ph name="LINK_BEGIN" />Google Fotos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Reiniciar y recibir actualizaciones automáticas</translation> <translation id="8678538439778360739">Los datos se cifraron con tu frase de contraseña de sincronización el <ph name="TIME" />. Esto no incluye los métodos de pago ni las direcciones de Google Pay.</translation> <translation id="8678582529642151449">el tamaño de las pestañas no se ajusta</translation> <translation id="8678933587484842200">¿Cómo te gustaría que se iniciara esta aplicación?</translation> @@ -8204,6 +8222,7 @@ <translation id="8910987510378294980">Ocultar lista de dispositivos</translation> <translation id="8912362522468806198">cuenta de Google</translation> <translation id="8912810933860534797">Habilitar búsqueda automática</translation> +<translation id="8915307125957890427">Haz clic con el botón derecho en una pestaña y selecciona "Añadir pestaña al grupo" > "Nuevo grupo"</translation> <translation id="8915370057835397490">Cargando sugerencia</translation> <translation id="8916476537757519021">Submarco incógnito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> @@ -8278,6 +8297,7 @@ <translation id="8986362086234534611">Dejar de recordar</translation> <translation id="8986494364107987395">Enviar automáticamente estadísticas de uso e informes sobre fallos a Google</translation> <translation id="8987927404178983737">Mes</translation> +<translation id="8989359959810288806">Actualizar estado de la conexión compartida</translation> <translation id="8991520179165052608">El sitio web puede usar tu micrófono</translation> <translation id="899384117894244799">Quitar usuario restringido</translation> <translation id="899403249577094719">URL base de certificado de Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 6e662aa9..6e65c777 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -4681,6 +4681,7 @@ <translation id="5470735824776589490">Seade tuleb taaskäivitada, enne kui saate selle Powerwashiga lähtestada. <ph name="LINK_BEGIN" />Lisateave<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Tere! Mina olen teie kõnesünteesi hääl.</translation> <translation id="5472627187093107397">Salvesta selle saidi paroolid</translation> +<translation id="5473062644742711742">Leidke Chrome'i veebipoest rohkem juurdepääsetavuse tööriistu</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Jätkamisel nõustute, et see seade võib Google'i, teie lapse operaatori ja seadme tootja värskendusi ning rakendusi automaatselt alla laadida ja installida, kasutades selleks võib-olla teie mobiilset andmesidet. Mõned rakendused võivad pakkuda rakendusesiseseid oste.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN-kood peab koosnema vähemalt ühest tähemärgist}other{PIN-kood peab koosnema vähemalt # tähemärgist}}</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index cf7fc62..970a400 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -4675,6 +4675,7 @@ <translation id="5470735824776589490">Berrabiarazi egin behar da gailuan fabrikako ezarpenak Powerwash bidez berrezarri ahal izateko. <ph name="LINK_BEGIN" />Lortu informazio gehiago<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Kaixo! Testua ahots bihurtzeko eginbidearen ahotsa naiz.</translation> <translation id="5472627187093107397">Gorde webgune honetako pasahitzak</translation> +<translation id="5473062644742711742">Erabilerraztasun-tresna gehiago dituzu Chrome Web Store-n</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Aurrera eginez gero, onartu egingo duzu litekeena dela gailuak automatikoki deskargatu eta instalatzea Google-ren, haurraren operadorearen eta fabrikatzailearen eguneratzeak eta aplikazioak, beharbada datu-konexioa erabilita. Baliteke aplikazio horietako batzuetan erosketak egin ahal izatea.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN kodeak karaktere bat izan behar du gutxienez}other{PIN kodeak # karaktere izan behar ditu gutxienez}}</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index 4129acc..0c23051 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">استفاده از میکروفون و دوربین شما</translation> <translation id="1005333234656240382">اشکالزدایی ADB (پل اشکالزدایی Android) فعال شود؟</translation> <translation id="1006873397406093306">این افزونه میتواند دادههایتان را در سایتها بخواند و تغییر دهد. میتوانید سایتهایی را که این افزونه به آنها دسترسی دارد کنترل کنید.</translation> +<translation id="1007057452468855774">روشن کردن «فروشگاه Google Play»</translation> <translation id="1008186147501209563">صادرکردن نشانکها</translation> <translation id="1008557486741366299">حالا نه</translation> <translation id="1009476156254802388">مکان <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">کنترلهای بازی اکنون دردسترس است</translation> <translation id="1010498023906173788">این برگه به درگاه سریال متصل است.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{صفحه غیرپاسخگو}one{صفحههای غیرپاسخگو}other{صفحههای غیرپاسخگو}}</translation> +<translation id="1011003645819296594">دستگاههای ذخیرهشده</translation> <translation id="1011355516189274711">میزان صدای نوشتار به گفتار</translation> <translation id="1012794136286421601">فایلهای سندنگار، برگهنگار، اسلایدنگار و طرحنگار شما در حال همگامسازی هستند. برنامه Google Drive را باز کنید تا به صورت آنلاین یا آفلاین به آنها دسترسی داشته باشید.</translation> <translation id="1012876632442809908">دستگاه USB-C (درگاه جلو)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">استفاده از این دستگاه</translation> <translation id="1470946456740188591">برای روشن یا خاموش کردن مرور با نشانگر نوشتار، از میانبر Ctrl+Search+7 استفاده کنید</translation> <translation id="1472675084647422956">نمایش بیشتر</translation> +<translation id="1473223074251193484">تنظیم پیکربندی اشتراکگذاری اینترنت</translation> <translation id="1474785664565228650">برای اعمال تغییر ایجادشده در میکروفون، باید Parallels Desktop را راهاندازی مجدد کنید. برای ادامه، Parallels Desktop را راهاندازی مجدد کنید.</translation> <translation id="1474893630593443211">کنترل بیشتر بر آگهیهایی که میبینید</translation> <translation id="1475502736924165259">گواهیهایی برای فایل دارید که در هیچکدام از دستههای دیگر قرار نمیگیرد</translation> @@ -681,7 +684,7 @@ <translation id="1637224376458524414">این نشانک را در iPhone خود دریافت کنید</translation> <translation id="1637350598157233081">گذرواژهتان در این دستگاه ذخیره میشود</translation> <translation id="1637765355341780467">هنگام باز کردن نمایهتان خطایی رخ داد. ممکن است برخی از قابلیتها در دسترس نباشند.</translation> -<translation id="1639239467298939599">بارگیری</translation> +<translation id="1639239467298939599">در حال بارگیری</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> هنوز در برنامههای Linux کار نمیکند</translation> <translation id="1640283014264083726">PKCS #1 MD4 با رمزگذاری RSA</translation> <translation id="1641113438599504367">مرور ایمن</translation> @@ -1122,6 +1125,7 @@ <translation id="2044014337866019681">لطفاً مطمئن شوید <ph name="ACCOUNT" /> را بهتأیید میرسانید تا قفل جلسه باز شود.</translation> <translation id="204497730941176055">نام الگوی گواهی Microsoft</translation> <translation id="2045117674524495717">راهنمای میانبر صفحهکلید</translation> +<translation id="2045211794962848221">دیگر این پیام بهخصوص را نخواهید دید</translation> <translation id="2045969484888636535">ادامه مسدود کردن کوکیها</translation> <translation id="204622017488417136">دستگاه شما به نسخه قبلاً نصب شده Chrome باز میگردد. همه حسابهای کاربری و دادههای محلی حذف میشوند. این کار قابل بازگشت نیست.</translation> <translation id="2046702855113914483">رامن</translation> @@ -3811,6 +3815,7 @@ <translation id="4594577641390224176">بهدنبال صفحه درباره سیستم هستید؟ از این پیوند استفاده کنید:</translation> <translation id="4595560905247879544">برنامهها و افزونهها فقط توسط مدیر (<ph name="CUSTODIAN_NAME" />) قابل تغییر هستند.</translation> <translation id="4596295440756783523">گواهیهایی در فایل دارید که این سرورها را شناسایی میکنند</translation> +<translation id="4598345735110653698">مدیریت گذرکلیدها</translation> <translation id="4598556348158889687">مدیریت فضای ذخیرهسازی</translation> <translation id="4598776695426288251">Wi-Fi ازطریق چند دستگاه دردسترس است</translation> <translation id="4601426376352205922">علامتگذاری بهعنوان خواندهنشده</translation> @@ -4036,6 +4041,7 @@ <translation id="4823894915586516138">این پین یا گذرواژه از دادههای شما در این <ph name="DEVICE_TYPE" /> (ازجمله اطلاعاتی که از تلفنتان به آن دسترسی پیدا میکنید) محافظت میکند</translation> <translation id="4824037980212326045">پشتیبانگیری و بازیابی Linux</translation> <translation id="4824958205181053313">همگامسازی لغو شود؟</translation> +<translation id="4825532258163983651">گذرکلید حذف نشد</translation> <translation id="4827675678516992122">متصل نشد</translation> <translation id="4827784381479890589">غلطگیر املای پیشرفته در مرورگر Chrome (نوشتار برای پیشنهادهای املا به Google ارسال میشود)</translation> <translation id="4827904420700932487">ایجاد رمزینه پاسخسریع برای این تصویر</translation> @@ -4298,6 +4304,7 @@ <translation id="5087249366037322692">توسط یک شخص ثالث اضافه شده است</translation> <translation id="5087580092889165836">افزودن کارت</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 با رمزگذاری RSA</translation> +<translation id="5089763948477033443">دسته تغییر اندازه پانل کناری</translation> <translation id="5090637338841444533">اجازه ندارد موقعیت دوربین را ردیابی کند</translation> <translation id="5093569275467863761">قاب فرعی ناشناس ذخیرهشده در حافظه پنهان عقب-جلو: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">میتوانید فایلهای پشتیبانیشده را با این برنامه ازطریق برنامه Files یا برنامههای دیگر باز کنید و ویرایش کنید. برای کنترل اینکه کدام فایلها این برنامه را بهطور پیشفرض باز کنند، <ph name="BEGIN_LINK" />با نحوه تنظیم برنامههای پیشفرض در دستگاه آشنا شوید<ph name="END_LINK" />.</translation> @@ -4463,6 +4470,7 @@ <translation id="5258992782919386492">نصب در این دستگاه</translation> <translation id="5260334392110301220">نقلقولهای هوشمند</translation> <translation id="5260508466980570042">متأسفانه ایمیل یا گذرواژه شما تأیید نشد. لطفاً دوباره سعی کنید.</translation> +<translation id="5260958083445173099">درصورت امکان، محتوای وبسایتها به زبانهای برگزیدهتان نشان داده میشود</translation> <translation id="5261683757250193089">باز کردن در نتبازار</translation> <translation id="5262178194499261222">حذف گذرواژه</translation> <translation id="5262784498883614021">اتصال خودکار به شبکه</translation> @@ -4503,6 +4511,7 @@ <translation id="5294097441441645251">باید با نویسه حروف کوچک یا زیرخط شروع شود</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> از حسگر داخلی برای شناسایی افراد مقابل دستگاه استفاده میکند. همه دادهها بلافاصله در دستگاهتان پردازش و سپس حذف میشود. دادههای حسگر هرگز به Google ارسال نمیشود. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="5296350763804564124">با شنیدن بازخورد گفتاری میتوانید بدون نگاه کردن به صفحهنمایش از دستگاهتان استفاده کنید. بازخورد بریل ازطریق دستگاه متصل دردسترس است.</translation> +<translation id="5297005732522718715">بازآوری پیکربندی اشتراکگذاری اینترنت</translation> <translation id="5297082477358294722">گذرواژه ذخیره شد. گذرواژههای ذخیرهشدهتان را در <ph name="SAVED_PASSWORDS_STORE" /> مشاهده و مدیریت کنید.</translation> <translation id="5297946558563358707">وقتی فرد دیگری به صفحهنمایشتان نگاه کند، نماد چشم «حریم خصوصی» در پایین سمت چپ صفحهنمایش نشان داده میشود</translation> <translation id="5298219193514155779">ایحاد زمینه توسط</translation> @@ -4673,11 +4682,13 @@ <translation id="5466374726908360271">جایگذاری و جستجوی «<ph name="SEARCH_TERMS" />»</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" /> و <ph name="PERMISSION_2" /> مسدود شدهاند</translation> <translation id="5468173180030470402">درحال یافتن دستگاه ذخیرهسازی متصل به شبکه</translation> +<translation id="5468330507528805311">وضعیت اشتراکگذاری اینترنت:</translation> <translation id="5468881191994555667">انتخاب فایل</translation> <translation id="5469852975082458401">با نشانگر نوشتار میتوانید صفحهها را پیمایش کنید. برای خاموش شدن، F7 را فشار دهید.</translation> <translation id="5470735824776589490">قبل از اینکه دستگاه شما با Powerwash بازنشانی شود، راهاندازی مجدد لازم است. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> <translation id="5471768120198416576">سلام! من صدای نوشتار به گفتار شما هستم.</translation> <translation id="5472627187093107397">ذخیره کردن گذرواژههای این سایت</translation> +<translation id="5473062644742711742">پیدا کردن ابزارهای دسترسپذیری بیشتر در «نتبازار Chrome»</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">با ادامه دادن، موافقت میکنید این دستگاه همچنین میتواند بهطور خودکار بهروزرسانیها و برنامهها را از Google، شرکت مخابراتی فرزندتان، و سازنده این دستگاه بارگیری (احتمالاً بااستفاده از داده شبکه تلفن همراه) و نصب کند. برخیاز این برنامهها ممکن است خریدهای درونبرنامه پیشنهاد دهند.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{پین باید حداقل یک نویسه داشته باشد}one{پین باید حداقل # نویسه داشته باشد}other{پین باید حداقل # نویسه داشته باشد}}</translation> @@ -4948,6 +4959,7 @@ <translation id="5734362860645681824">ارتباطات</translation> <translation id="5734697361979786483">افزودن دستگاه ذخیرهسازی متصل به شبکه</translation> <translation id="5736796278325406685">لطفاً نام کاربری معتبری وارد کنید.</translation> +<translation id="5738093759615225354">برای ورود به سیستم رایانهتان به این گذرکلید نیاز دارید</translation> <translation id="5739017626473506901">به سیستم وارد شوید تا بتوانید به <ph name="USER_NAME" /> در افزودن حساب محل تحصیل کمک کنید</translation> <translation id="5739235828260127894">در انتظار تأیید. <ph name="LINK_BEGIN" />بیشتر بدانید.<ph name="LINK_END" /></translation> <translation id="5739458112391494395">خیلی بزرگ</translation> @@ -5109,6 +5121,7 @@ <translation id="589541317545606110">جستجوی صفحه با <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">اجازه داده نشود</translation> <translation id="5900186025777217044">Smart Lock تغییر کرده است</translation> +<translation id="5900243355162006650">پیکربندی اشتراکگذاری اینترنت:</translation> <translation id="5900302528761731119">عکس نمایهٔ Google</translation> <translation id="590036993063074298">جزئیات کیفیت بازتاب</translation> <translation id="5901069264981746702">دادههای اثر انگشتتان بهصورت ایمن ذخیره میشود و هرگز از <ph name="DEVICE_TYPE" /> شما خارج نمیشود. <ph name="LINK_BEGIN" />بیشتر بدانید<ph name="LINK_END" /></translation> @@ -5413,6 +5426,7 @@ <translation id="6196640612572343990">مسدود کردن کوکیهای شخص ثالث</translation> <translation id="6196854373336333322">افزونه «<ph name="EXTENSION_NAME" />»، کنترل تنظیمات پروکسی شما را در اختیار گرفته است یعنی میتواند هر چیزی که در حالت آنلاین انجام میدهید تغییر دهد، خراب کند یا استراق سمع کند. اگر مطمئن نیستید چرا این تغییر انجام شده است، احتمالاً این افزونه را نمیخواهید.</translation> <translation id="6197128521826316819">ایجاد رمزینه پاسخسریع برای این صفحه</translation> +<translation id="6197223946499512637">این گذرکلیدها در Windows Hello در این رایانه ذخیره میشود. این گذرکلیدها در «حساب Google» شما ذخیره نمیشود.</translation> <translation id="6198252989419008588">تغییر دادن پین</translation> <translation id="6200047250927636406">صرفنظر کردن از فایل</translation> <translation id="6200151268994853226">مدیریت افزونه</translation> @@ -5710,6 +5724,7 @@ <translation id="6482559668224714696">ذرهبین تمامصفحه</translation> <translation id="6483485061007832714">باز کردن بارگیری</translation> <translation id="6483805311199035658">در حال باز کردن <ph name="FILE" />...</translation> +<translation id="6486301003991593638">برای مدیریت گذرکلیدها، از نسخه جدیدتر Windows استفاده کنید</translation> <translation id="6488384360522318064">انتخاب زبان</translation> <translation id="648927581764831596">هیچکدام در دسترس نیست</translation> <translation id="6490471652906364588">دستگاه USB-C (درگاه سمت راست)</translation> @@ -6298,6 +6313,7 @@ <translation id="7029307918966275733">Crostini نصب نشده است. لطفاً برای مشاهده اعتبارها، Crostini را نصب کنید.</translation> <translation id="7029809446516969842">گذرواژهها</translation> <translation id="7030304022046916278">نشانیهای وب را به «مرور ایمن» ارسال میکند تا بررسی شوند</translation> +<translation id="7030695672997239647">روی یکی از برگهها کلیک راست کنید و «افزودن برگه به گروه» و سپس «گروه جدید» را انتخاب کنید</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - متصل به درگاه سریال</translation> <translation id="7033616203784997570">ورودی باید حداکثر ۶۲ نویسه داشته باشد</translation> <translation id="7034692021407794547">سرپرستی که امتیازهای «مدیریت صورتحساب» را دارد باید ابتدا «شرایط خدمات Google Meet Hardware» را در بخش Google Meet Hardware از «کنسول سرپرست» بپذیرد.</translation> @@ -7399,6 +7415,7 @@ <translation id="8101987792947961127">در راهاندازی مجدد بعدی پاکسازی لازم است</translation> <translation id="81020759409809034">مکان محلی</translation> <translation id="8102139037507939978">«اطلاعات قابلشناسایی شخصی» از system_logs.txt حذف شود.</translation> +<translation id="810362914482827094">جستجوی گذرکلیدها</translation> <translation id="8104088837833760645">بارگیری نمایه سیمکارت داخلی</translation> <translation id="8105368624971345109">خاموش کردن</translation> <translation id="8107015733319732394">«فروشگاه Google Play» در <ph name="DEVICE_TYPE" /> شما درحال نصب شدن است. ممکن است این کار چند دقیقه طول بکشد.</translation> @@ -7846,6 +7863,7 @@ <translation id="8557022314818157177">کلید امنیتی را تازمانیکه اثرانگشت ثبت شود، لمس کنید</translation> <translation id="8557180006508471423">روشن کردن «Google Chrome» در خدمات مکان در Mac</translation> <translation id="8557856025359704738">بارگیری بعدی در تاریخ <ph name="NEXT_DATE_DOWNLOAD" /> انجام میشود.</translation> +<translation id="8559858985063901027">گذرکلیدها</translation> <translation id="8560327176991673955">{COUNT,plural, =0{باز کردن همه در پنجره جدید}=1{باز کردن در پنجره جدید}one{باز کردن همه ({COUNT}) در پنجره جدید}other{باز کردن همه ({COUNT}) در پنجره جدید}}</translation> <translation id="8561206103590473338">فیل</translation> <translation id="8561565784790166472">با احتیاط عمل کنید</translation> @@ -7972,6 +7990,7 @@ <translation id="8677212948402625567">کوچک کردن همه...</translation> <translation id="867767487203716855">بهروزرسانی بعدی</translation> <translation id="8677859815076891398">آلبومی وجود ندارد. آلبومی در <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> ایجاد کنید.</translation> +<translation id="8678378565142776698">بازراهاندازی و دریافت بهروزرسانیهای خودکار</translation> <translation id="8678538439778360739">دادهها در <ph name="TIME" /> با گذرعبارت همگامسازیتان رمزگذاری شد. این شامل روشهای پرداخت و نشانیهای Google Pay نمیشود.</translation> <translation id="8678582529642151449">برگهها کوچک نمیشوند</translation> <translation id="8678933587484842200">میخواهید این برنامه چگونه راهاندازی شود؟</translation> @@ -8219,6 +8238,7 @@ <translation id="8910987510378294980">پنهان کردن فهرست دستگاهها</translation> <translation id="8912362522468806198">حساب Google</translation> <translation id="8912810933860534797">فعال کردن اسکن خودکار</translation> +<translation id="8915307125957890427">روی یکی از برگهها کلیک راست کنید و «افزودن برگه به گروه» و سپس «گروه جدید» را انتخاب کنید</translation> <translation id="8915370057835397490">در حال بارگیری پیشنهادات</translation> <translation id="8916476537757519021">قاب فرعی ناشناس: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> <ph name="GIVEN_NAME" /></translation> @@ -8293,6 +8313,7 @@ <translation id="8986362086234534611">فراموش شود</translation> <translation id="8986494364107987395">ارسال خودکار آمار کاربرد و گزارشهای خرابی به Google</translation> <translation id="8987927404178983737">ماه</translation> +<translation id="8989359959810288806">بازآوری وضعیت اشتراکگذاری اینترنت</translation> <translation id="8991520179165052608">سایت میتواند از میکروفن شما استفاده کند</translation> <translation id="899384117894244799">برداشتن کاربر محدودشده</translation> <translation id="899403249577094719">نشانی وب گواهی Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 7ca103e..5cf9263 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -4687,6 +4687,7 @@ <translation id="5470735824776589490">Käynnistä laite uudelleen, jotta siihen voidaan palauttaa tehdasasetukset Powerwashin avulla. <ph name="LINK_BEGIN" />Lue lisää<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hei! Olen tekstistä puheeksi ‑äänesi.</translation> <translation id="5472627187093107397">Tallenna tämän sivuston salasanat</translation> +<translation id="5473062644742711742">Lisää saavutettavuustyökaluja Chrome Web Storesta</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Jatkamalla hyväksyt, että laite voi myös automaattisesti ladata ja asentaa Googlen, lapsen operaattorin tai laitevalmistajan päivityksiä ja sovelluksia, mahdollisesti mobiilidatayhteyden välityksellä. Jotkin näistä sovelluksista voivat tarjota sovelluksen sisäisiä ostoksia.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN-koodissa on oltava ainakin yksi merkki}other{PIN-koodissa on oltava ainakin # merkkiä}}</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index b88be53..d11029e 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Gamitin ang iyong mikropono at camera</translation> <translation id="1005333234656240382">I-enable ang pag-debug ng ADB?</translation> <translation id="1006873397406093306">Maaaring basahin at baguhin ng extension na ito ang iyong data sa mga site. Maaari mong kontrolin kung aling mga site ang maaaring i-access ng extension.</translation> +<translation id="1007057452468855774">I-on ang Google Play Store</translation> <translation id="1008186147501209563">I-export ang mga bookmark</translation> <translation id="1008557486741366299">Hindi Ngayon</translation> <translation id="1009476156254802388">Lokasyon ng <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Available na ngayon ang mga kontrol ng laro</translation> <translation id="1010498023906173788">Nakakonekta ang tab na ito sa isang serial port.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Hindi Tumutugon ang Page}one{Hindi Tumutugon ang Mga Page}other{Hindi Tumutugon ang Mga Page}}</translation> +<translation id="1011003645819296594">Mga na-save na device</translation> <translation id="1011355516189274711">Volume ng text-to-speech</translation> <translation id="1012794136286421601">Sini-sync ang iyong mga file ng Docs, Mga Sheet, Slide at Guhit. Buksan ang Google Drive app upang i-access ang mga ito online o offline.</translation> <translation id="1012876632442809908">USB-C device (port sa harap)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">Gamitin ang device na ito</translation> <translation id="1470946456740188591">Para i-on o i-off ang caret browsing, gamitin ang shortcut na Ctrl+Search+7</translation> <translation id="1472675084647422956">Magpakita ng higit pa</translation> +<translation id="1473223074251193484">Itakda ang Configuration ng Pag-tether</translation> <translation id="1474785664565228650">Hinihingi ng pagbabago sa setting ng mikropono na ilunsad ulit ang Parallels Desktop. Ilunsad ulit ang Parallels Desktop para magpatuloy.</translation> <translation id="1474893630593443211">Higiit pang kontrol sa mga ad na nakikita mo</translation> <translation id="1475502736924165259">Mayroon kang mga certificate sa file na hindi umaangkop sa alinman sa iba pang mga kategorya</translation> @@ -1126,6 +1129,7 @@ <translation id="2044014337866019681">Tiyaking ang <ph name="ACCOUNT" /> ang vine-verify mo para ma-unlock ang session.</translation> <translation id="204497730941176055">Pangalan ng Template ng Certificate sa Microsoft</translation> <translation id="2045117674524495717">Keyboard Shortcut Helper</translation> +<translation id="2045211794962848221">Hindi mo na makikita ulit ang partikular na mensaheng ito</translation> <translation id="2045969484888636535">Ipagpatuloy ang pag-block ng cookies</translation> <translation id="204622017488417136">Ibabalik ang iyong device sa dating naka-install na bersyon ng Chrome. Aalisin ang lahat ng user account at lokal na data. Hindi na ito maaaring bawiin.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3815,6 +3819,7 @@ <translation id="4594577641390224176">Hinahanap ang page na tungkol sa system? Bisitahin ang</translation> <translation id="4595560905247879544">Ang manager (<ph name="CUSTODIAN_NAME" />) lang ang may kakayahang magbago sa mga app at extension.</translation> <translation id="4596295440756783523">Mayroon kang mga certificate sa file na tutukoy sa mga server na ito</translation> +<translation id="4598345735110653698">Pamahalaan ang mga passkey</translation> <translation id="4598556348158889687">Pamamahala sa storage</translation> <translation id="4598776695426288251">Available ang Wi-Fi sa pamamagitan ng maraming device</translation> <translation id="4601426376352205922">Markahan bilang Hindi Pa Nababasa</translation> @@ -4040,6 +4045,7 @@ <translation id="4823894915586516138">Pinoprotektahan ng PIN o password na ito ang iyong data sa <ph name="DEVICE_TYPE" /> na ito, kabilang ang anumang impormasyong ia-access mo mula sa iyong telepono</translation> <translation id="4824037980212326045">Pag-back up at pag-restore ng Linux</translation> <translation id="4824958205181053313">Kanselahin ang pag-sync?</translation> +<translation id="4825532258163983651">Hindi ma-delete ang passkey</translation> <translation id="4827675678516992122">Hindi makakonekta</translation> <translation id="4827784381479890589">Pinahusay na pang-check ng pagbabaybay sa Chrome browser (ipapadala sa Google ang text para sa mga suhestyon sa pagbabaybay)</translation> <translation id="4827904420700932487">Gumawa ng QR Code para sa Larawang ito</translation> @@ -4302,6 +4308,7 @@ <translation id="5087249366037322692">Idinagdag ng isang third-party</translation> <translation id="5087580092889165836">Magdagdag ng card</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 na May RSA Encryption</translation> +<translation id="5089763948477033443">Handle sa Pag-resize ng Panel sa Gilid</translation> <translation id="5090637338841444533">Hindi pinapayagang i-track ang posisyon ng iyong camera</translation> <translation id="5093569275467863761">Back/Forward Cached na Subframe ng Incognito: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Magagawa mong magbukas at mag-edit ng mga sinusuportahang file mula sa Files app o iba pang app gamit ang app na ito. Para kontrolin kung aling mga file ang magbubukas sa app na ito bilang default, <ph name="BEGIN_LINK" />alamin kung paano magtakda ng mga default na app sa iyong device<ph name="END_LINK" />.</translation> @@ -4467,6 +4474,7 @@ <translation id="5258992782919386492">I-install sa device na ito</translation> <translation id="5260334392110301220">Mga Smart na Panipi</translation> <translation id="5260508466980570042">Paumanhin, hindi ma-verify ang iyong email o password. Pakisubukang muli.</translation> +<translation id="5260958083445173099">Ipapakita ng mga website ang content sa iyong mga gustong wika, kapag posible</translation> <translation id="5261683757250193089">Buksan sa Web Store</translation> <translation id="5262178194499261222">Alisin ang password</translation> <translation id="5262784498883614021">Awtomatikong kumonekta sa network</translation> @@ -4507,6 +4515,7 @@ <translation id="5294097441441645251">Dapat ay nagsisimula sa maliit na character o underscore</translation> <translation id="5294618183559481278">Gumagamit ang iyong <ph name="DEVICE_TYPE" /> ng built-in na sensor para ma-detect ang mga tao sa harap ng device mo. Ipoproseso kaagad at pagkatapos ay ide-delete ang lahat ng data sa iyong device. Hindi kailanman ipinapadala sa Google ang data ng sensor. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Makarinig ng pasalitang feedback para magamit mo ang iyong device nang hindi tumitingin sa screen. Available ang braille na feedback gamit ang isang nakakonektang device.</translation> +<translation id="5297005732522718715">I-refresh ang Configuration ng Pag-tether</translation> <translation id="5297082477358294722">Na-save ang password. Tingnan at pamahalaan ang mga naka-save na password sa iyong <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Kapag may ibang tumingin sa iyong screen, ipakita ang icon na mata ng Privacy sa kanang bahagi sa ibaba ng iyong screen</translation> <translation id="5298219193514155779">Ang tema ay nilikha ni</translation> @@ -4677,6 +4686,7 @@ <translation id="5466374726908360271">I-pa&ste at hanapin ang “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Na-block ang <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Naghahanap ng mga file share</translation> +<translation id="5468330507528805311">Status ng Pag-tether:</translation> <translation id="5468881191994555667">Pumili ng file</translation> <translation id="5469852975082458401">Puwede kang mag-navigate sa mga page gamit ang text cursor. Pindutin ang F7 para i-off.</translation> <translation id="5470735824776589490">Kinakailangang mag-restart bago ma-reset ang iyong device gamit ang Powerwash. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> @@ -4952,6 +4962,7 @@ <translation id="5734362860645681824">Komunikasyon</translation> <translation id="5734697361979786483">Magdagdag ng file share</translation> <translation id="5736796278325406685">Mangyaring maglagay ng wastong username</translation> +<translation id="5738093759615225354">Kailangan mo ang passkey na ito para mag-sign in sa iyong computer</translation> <translation id="5739017626473506901">Mag-sign in para matulungan si <ph name="USER_NAME" /> na magdagdag ng pampaaralang account</translation> <translation id="5739235828260127894">Naghihintay ng pag-verify. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Napakalaki</translation> @@ -5113,6 +5124,7 @@ <translation id="589541317545606110">Hanapin ang Page gamit ang <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Huwag Payagan</translation> <translation id="5900186025777217044">Nagbago ang Smart Lock</translation> +<translation id="5900243355162006650">Configuration ng Pag-tether:</translation> <translation id="5900302528761731119">Larawan sa Profile sa Google</translation> <translation id="590036993063074298">Mga Detalye ng Kalidad ng Pag-mirror</translation> <translation id="5901069264981746702">Secure na sino-store ang data ng iyong fingerprint at hindi ito kailanman aalisin sa <ph name="DEVICE_TYPE" /> mo. <ph name="LINK_BEGIN" />Matuto pa<ph name="LINK_END" /></translation> @@ -5417,6 +5429,7 @@ <translation id="6196640612572343990">I-block ang mga third-party na cookie</translation> <translation id="6196854373336333322">Kinokontrol na ng extension na "<ph name="EXTENSION_NAME" />" ang iyong mga setting ng proxy, na ang ibig sabihin ay maaari nitong baguhin, sirain o alamin ang anumang bagay na gagawin mo online. Kung hindi ka sigurado kung bakit naganap ang pagbabagong ito, malamang ay hindi mo ito ginustong mangyari.</translation> <translation id="6197128521826316819">Gumawa ng QR Code para sa Page na ito</translation> +<translation id="6197223946499512637">Naka-store ang mga passkey na ito sa Windows Hello sa computer na ito. Hindi naka-save ang mga ito sa iyong Google Account.</translation> <translation id="6198252989419008588">Palitan ang PIN</translation> <translation id="6200047250927636406">I-discard ang file</translation> <translation id="6200151268994853226">Pamahalaan ang Extension</translation> @@ -5714,6 +5727,7 @@ <translation id="6482559668224714696">Full-screen magnifier</translation> <translation id="6483485061007832714">Buksan ang na-download</translation> <translation id="6483805311199035658">Binubuksan ang <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Para pamahalaan ang mga passkey, gumamit ng mas bagong bersyon ng Windows</translation> <translation id="6488384360522318064">Pumili ng wika</translation> <translation id="648927581764831596">Walang available</translation> <translation id="6490471652906364588">USB-C device (port sa kanan)</translation> @@ -6302,6 +6316,7 @@ <translation id="7029307918966275733">Hindi naka-install ang Crostini. Paki-install ang Crostini para matingnan ang mga credit.</translation> <translation id="7029809446516969842">Mga Password</translation> <translation id="7030304022046916278">Nagpapadala ng mga URL sa Ligtas na Pag-browse para masuri ang mga ito</translation> +<translation id="7030695672997239647">Mag-right click sa isang tab at piliin ang "Idagdag ang Tab Sa Grupo" at pagkatapos ay piliin ang "Bagong Grupo"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Nakakonekta ang serial port</translation> <translation id="7033616203784997570">Dapat ay hanggang 62 character lang ang input</translation> <translation id="7034692021407794547">Dapat munang tanggapin ng administrator na may mga pribilehiyo ng Pamamahala ng Pagsingil ang Mga Tuntunin ng Serbisyo ng Hardware ng Google Meet sa seksyong Hardware ng Google Meet ng Admin console.</translation> @@ -7404,6 +7419,7 @@ <translation id="8101987792947961127">Kinakailangan ng Powerwash sa susunod na reboot</translation> <translation id="81020759409809034">Lokal na Lokasyon</translation> <translation id="8102139037507939978">Alisin ang Impormasyong Nagbibigay ng Personal na Pagkakakilanlan sa system_logs.txt.</translation> +<translation id="810362914482827094">Maghanap sa mga passkey</translation> <translation id="8104088837833760645">I-download ang profile ng eSIM</translation> <translation id="8105368624971345109">I-off</translation> <translation id="8107015733319732394">Ini-install ang Google Play Store sa iyong <ph name="DEVICE_TYPE" />. Maaaring abutin ito nang ilang minuto.</translation> @@ -7852,6 +7868,7 @@ <translation id="8557022314818157177">Patuloy na pindutin ang iyong security key hanggang ma-capture ang fingerprint mo</translation> <translation id="8557180006508471423">I-on ang "Google Chrome" sa Mga Serbisyo ng Lokasyon sa iyong Mac</translation> <translation id="8557856025359704738">Ang susunod na pag-download ay sa <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Mga Passkey</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Buksan Lahat sa &Bagong Window}=1{Buksan sa &Bagong Window}one{Buksan Lahat ({COUNT}) sa &Bagong Window}other{Buksan Lahat ({COUNT}) sa &Bagong Window}}</translation> <translation id="8561206103590473338">Elepante</translation> <translation id="8561565784790166472">Maingat na magpatuloy</translation> @@ -7964,6 +7981,7 @@ <translation id="8666759526542103597">Tungkol sa Pag-personalize ng ad na nakabatay sa browser</translation> <translation id="8667328578593601900">Nasa full screen na ngayon ang <ph name="FULLSCREEN_ORIGIN" /> at hindi pinagana ang cursor ng iyong mouse.</translation> <translation id="8667760277771450375">Nag-e-explore kami ng mga paraan para paghigpitan ang cross-site na pagsubaybay habang binibigyang-daan ang mga site na ihinto ang spam at panloloko sa ad.</translation> +<translation id="8668378421690365723">Posibleng hindi na gumana nang maayos ang iyong device, at posible itong makaranas ng mga isyu sa seguridad at performance.</translation> <translation id="8669284339312441707">Warmer</translation> <translation id="8670537393737592796">Para mabilis na makabalik dito, i-install ang <ph name="APP_NAME" /> sa pamamagitan ng pag-click sa button na i-install</translation> <translation id="867085395664725367">Nagkaroon ng pansamantalang error sa server.</translation> @@ -7978,6 +7996,7 @@ <translation id="8677212948402625567">Tiklupin lahat...</translation> <translation id="867767487203716855">Susunod na update</translation> <translation id="8677859815076891398">Walang album. Gumawa ng album sa <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Mag-restart at makakuha ng mga awtomatikong update</translation> <translation id="8678538439778360739">Na-encrypt ang data gamit ang iyong passphrase sa pag-sync noong <ph name="TIME" />. Hindi kasama rito ang mga paraan ng pagbabayad at address mula sa Google Pay.</translation> <translation id="8678582529642151449">Hindi liliit ang mga tab</translation> <translation id="8678933587484842200">Paano mo gustong ilunsad ang application na ito?</translation> @@ -8226,6 +8245,7 @@ <translation id="8910987510378294980">Itago ang listahan ng device</translation> <translation id="8912362522468806198">Google Account</translation> <translation id="8912810933860534797">I-enable ang awtomatikong pag-scan</translation> +<translation id="8915307125957890427">Mag-right click sa isang tab at piliin ang "Idagdag ang tab sa grupo" at pagkatapos ay piliin ang "Bagong grupo"</translation> <translation id="8915370057835397490">Nilo-load ang suhestiyon</translation> <translation id="8916476537757519021">Incognito na Subframe: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ni <ph name="GIVEN_NAME" /></translation> @@ -8300,6 +8320,7 @@ <translation id="8986362086234534611">Kalimutan</translation> <translation id="8986494364107987395">Awtomatikong ipadala ang mga istatistika ng paggamit at mga ulat ng pag-crash sa Google</translation> <translation id="8987927404178983737">Buwan</translation> +<translation id="8989359959810288806">I-refresh ang Status ng Pag-tether</translation> <translation id="8991520179165052608">Maaaring gamitin ng site ang iyong mikropono</translation> <translation id="899384117894244799">Alisin ang pinaghihigpitang user</translation> <translation id="899403249577094719">URL ng Netscape Certificate Base</translation> @@ -8446,6 +8467,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Para sa pinakamagandang karanasan, i-install ang <ph name="DEVICE_OS" /> sa iyong internal na disk. Puwede mo rin itong i-install sa ibang pagkakataon mula sa screen sa pag-log in.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Kung hindi ka pa handang mag-install, puwede kang magpatakbo mula sa USB para masubukan ito. Papanatilihin nito ang iyong kasalukuyang OS at data, pero puwedeng makakita ka ng mga limitasyon sa storage at performance.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Binuksan bilang na-pin na tab</translation> +<translation id="9123287046453017203">Hindi up to date ang iyong device</translation> <translation id="9124003689441359348">Lalabas dito ang mga na-save na password</translation> <translation id="9126149354162942022">Kulay ng cursor</translation> <translation id="9128317794749765148">Hindi makumpleto ang pag-set up</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index fe968c0..157566db 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Utiliser votre micro et votre caméra</translation> <translation id="1005333234656240382">Activer le débogage ADB ?</translation> <translation id="1006873397406093306">Cette extension peut lire et modifier vos données sur les sites. Vous pouvez contrôler les sites auxquels elle a accès.</translation> +<translation id="1007057452468855774">Activer le Google Play Store</translation> <translation id="1008186147501209563">Exporter les favoris</translation> <translation id="1008557486741366299">Pas maintenant</translation> <translation id="1009476156254802388">Emplacement <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Commandes de jeu désormais disponibles</translation> <translation id="1010498023906173788">Cet onglet est connecté à un port de série.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Page ne répondant pas}one{Page ne répondant pas}other{Pages ne répondant pas}}</translation> +<translation id="1011003645819296594">Appareils enregistrés</translation> <translation id="1011355516189274711">Volume de la synthèse vocale</translation> <translation id="1012794136286421601">Vos fichiers Docs, Sheets, Slides et Drawings sont en cours de synchronisation. Ouvrez l'application Google Drive pour y accéder en ligne ou hors connexion.</translation> <translation id="1012876632442809908">Appareil USB de type C (port situé sur l'avant de l'appareil)</translation> @@ -492,6 +494,7 @@ <translation id="1470350905258700113">Utiliser cet appareil</translation> <translation id="1470946456740188591">Pour activer ou désactiver la navigation au clavier, appuyez sur Ctrl+Recherche+7</translation> <translation id="1472675084647422956">Plus</translation> +<translation id="1473223074251193484">Définir la configuration du partage de connexion</translation> <translation id="1474785664565228650">La modification des paramètres du micro nécessite le redémarrage de Parallels Desktop. Relancez Parallels Desktop pour continuer.</translation> <translation id="1474893630593443211">Meilleur contrôle sur les annonces que vous voyez</translation> <translation id="1475502736924165259">Vous disposez de certificats qui n'appartiennent à aucune autre catégorie.</translation> @@ -681,7 +684,7 @@ <translation id="1637224376458524414">Enregistrer ce favori sur votre iPhone</translation> <translation id="1637350598157233081">Votre mot de passe est enregistré sur cet appareil</translation> <translation id="1637765355341780467">Une erreur s'est produite lors de l'ouverture de votre profil. Il est possible que certaines fonctionnalités ne soient pas disponibles.</translation> -<translation id="1639239467298939599">Chargement en cours</translation> +<translation id="1639239467298939599">Chargement en cours…</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> n'est pas compatible avec les applications Linux pour le moment</translation> <translation id="1640283014264083726">PKCS #1 MD4 avec chiffrement RSA</translation> <translation id="1641113438599504367">Navigation sécurisée</translation> @@ -1114,6 +1117,7 @@ <translation id="2044014337866019681">Pour déverrouiller la session, vérifiez que vous êtes bien en train de valider <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Nom du modèle de certificat Microsoft</translation> <translation id="2045117674524495717">Aide relative aux raccourcis clavier</translation> +<translation id="2045211794962848221">Vous ne verrez plus ce message</translation> <translation id="2045969484888636535">Continuer à bloquer les cookies</translation> <translation id="204622017488417136">La version de Chrome précédemment installée va être rétablie sur votre appareil. Les données locales et les comptes utilisateur vont être supprimés. Cette opération est irréversible.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -2495,7 +2499,7 @@ <translation id="3348038390189153836">Nouveau matériel détecté</translation> <translation id="3348131053948466246">Emoji suggérés. Appuyez sur la flèche vers le haut ou vers le bas pour sélectionner un emoji, puis sur Entrée pour l'insérer.</translation> <translation id="3349933790966648062">Espace mémoire utilisé</translation> -<translation id="3353786022389205125">Activez "Afficher l'écran de verrouillage en sortant du mode veille", puis réessayez</translation> +<translation id="3353786022389205125">Activez "Afficher l'écran de verrouillage en sortant du mode veille", puis réessayez.</translation> <translation id="3354972872297836698">Impossible d'associer à l'appareil <ph name="DEVICE_NAME" /> ; sélectionnez l'appareil pour réessayer</translation> <translation id="3355936511340229503">Erreur de connexion</translation> <translation id="3356469410714175391">(carte virtuelle activée)</translation> @@ -3799,6 +3803,7 @@ <translation id="4594577641390224176">Vous recherchez des informations à propos du système ? Accédez à la page</translation> <translation id="4595560905247879544">Seul l'administrateur (<ph name="CUSTODIAN_NAME" />) est autorisé à modifier les applications et les extensions.</translation> <translation id="4596295440756783523">Certains de vos certificats enregistrés identifient ces serveurs.</translation> +<translation id="4598345735110653698">Gérer les clés d'accès</translation> <translation id="4598556348158889687">Gestion du stockage</translation> <translation id="4598776695426288251">Wi-Fi disponible via plusieurs appareils</translation> <translation id="4601426376352205922">Marquer comme non lu</translation> @@ -4024,6 +4029,7 @@ <translation id="4823894915586516138">Ce code ou mot de passe protège vos données sur ce <ph name="DEVICE_TYPE" />, y compris les informations auxquelles vous accédez depuis votre téléphone</translation> <translation id="4824037980212326045">Sauvegarde et restauration Linux</translation> <translation id="4824958205181053313">Annuler la synchronisation ?</translation> +<translation id="4825532258163983651">Impossible de supprimer la clé d'accès</translation> <translation id="4827675678516992122">Impossible de se connecter</translation> <translation id="4827784381479890589">Correcteur orthographique avancé dans le navigateur Chrome (le texte est envoyé à Google pour vous proposer des suggestions d'orthographe)</translation> <translation id="4827904420700932487">Créer un code QR pour cette image</translation> @@ -4286,6 +4292,7 @@ <translation id="5087249366037322692">Ajoutée par un tiers</translation> <translation id="5087580092889165836">Ajouter une carte</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 avec chiffrement RSA</translation> +<translation id="5089763948477033443">Poignée de redimensionnement du panneau latéral</translation> <translation id="5090637338841444533">Non autorisé à suivre la position de la caméra</translation> <translation id="5093569275467863761">Sous-cadre de navigation privée en cache amélioré : <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Vous pouvez ouvrir et modifier les fichiers compatibles avec cette appli depuis l'appli Fichiers ou d'autres applis. Pour contrôler quels fichiers s'ouvrent dans cette appli par défaut, découvrez comment <ph name="BEGIN_LINK" />définir les applis par défaut sur votre appareil<ph name="END_LINK" />.</translation> @@ -4451,6 +4458,7 @@ <translation id="5258992782919386492">Installer sur cet appareil</translation> <translation id="5260334392110301220">Guillemets courbes</translation> <translation id="5260508466980570042">Adresse e-mail ou mot de passe incorrect. Veuillez réessayer.</translation> +<translation id="5260958083445173099">Les sites Web s'afficheront dans vos langues préférées, si possible</translation> <translation id="5261683757250193089">Ouvrir sur le Web Store</translation> <translation id="5262178194499261222">Supprimer le mot de passe</translation> <translation id="5262784498883614021">Se connecter automatiquement au réseau</translation> @@ -4491,6 +4499,7 @@ <translation id="5294097441441645251">Doit commencer par un caractère minuscule ou un trait de soulignement</translation> <translation id="5294618183559481278">Votre <ph name="DEVICE_TYPE" /> utilise un capteur intégré pour détecter si une personne se trouve devant votre appareil. Toutes les données sont traitées sur votre appareil immédiatement, puis supprimées. Les données du capteur ne sont jamais transmises à Google. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Écoutez les commentaires audio pour utiliser votre appareil sans regarder l'écran. Les commentaires en braille sont disponibles sur un appareil connecté.</translation> +<translation id="5297005732522718715">Actualiser la configuration du partage de connexion</translation> <translation id="5297082477358294722">Mot de passe enregistré. Affichez et gérez les mots de passe enregistrés dans votre <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Lorsque quelqu'un d'autre regarde votre écran, l'icône de confidentialité représentant un œil s'affiche en bas à droite de l'écran</translation> <translation id="5298219193514155779">Thème créé par</translation> @@ -4661,6 +4670,7 @@ <translation id="5466374726908360271">Coller et chercher "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Autorisations bloquées : <ph name="PERMISSION_1" /> et <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Recherche de partages de fichiers…</translation> +<translation id="5468330507528805311">État du partage de connexion :</translation> <translation id="5468881191994555667">Sélectionner un fichier</translation> <translation id="5469852975082458401">Vous pouvez parcourir les pages à l'aide d'un curseur de texte. Pour désactiver la navigation au clavier, appuyez sur F7.</translation> <translation id="5470735824776589490">Vous devez redémarrer votre appareil avant de pouvoir le réinitialiser avec le Powerwash. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> @@ -4937,6 +4947,7 @@ <translation id="5734362860645681824">Communications</translation> <translation id="5734697361979786483">Ajouter un partage de fichiers</translation> <translation id="5736796278325406685">Veuillez saisir un nom d'utilisateur valide</translation> +<translation id="5738093759615225354">Vous avez besoin de cette clé d'accès pour vous connecter à votre ordinateur</translation> <translation id="5739017626473506901">Connectez-vous pour aider <ph name="USER_NAME" /> à ajouter un compte scolaire</translation> <translation id="5739235828260127894">En attente de validation. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Très grande</translation> @@ -5098,6 +5109,7 @@ <translation id="589541317545606110">Rechercher sur une page avec <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Ne pas autoriser</translation> <translation id="5900186025777217044">Smart Lock a été modifié</translation> +<translation id="5900243355162006650">Configuration du partage de connexion :</translation> <translation id="5900302528761731119">Photo du profil Google</translation> <translation id="590036993063074298">Informations sur la qualité de la duplication d'écran</translation> <translation id="5901069264981746702">Les données liées à votre empreinte digitale sont stockées de façon sécurisée et ne quittent jamais votre <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />En savoir plus<ph name="LINK_END" /></translation> @@ -5402,6 +5414,7 @@ <translation id="6196640612572343990">Bloquer les cookies tiers</translation> <translation id="6196854373336333322">L'extension <ph name="EXTENSION_NAME" /> a pris le contrôle de vos paramètres de proxy, ce qui signifie que toutes vos activités en ligne peuvent être modifiées, interrompues ou espionnées. Si vous ne savez pas pourquoi cette modification s'est produite, c'est qu'elle est probablement indésirable.</translation> <translation id="6197128521826316819">Créer un code QR pour cette page</translation> +<translation id="6197223946499512637">Ces clés d'accès sont stockées dans Windows Hello sur cet ordinateur. Elles ne sont pas enregistrées dans votre compte Google.</translation> <translation id="6198252989419008588">Modifier le code</translation> <translation id="6200047250927636406">Supprimer le fichier</translation> <translation id="6200151268994853226">Gérer l'extension</translation> @@ -5699,6 +5712,7 @@ <translation id="6482559668224714696">Loupe plein écran</translation> <translation id="6483485061007832714">Ouvrir le fichier téléchargé</translation> <translation id="6483805311199035658">Ouverture de <ph name="FILE" /> en cours</translation> +<translation id="6486301003991593638">Pour gérer les clés d'accès, utilisez une version plus récente de Windows</translation> <translation id="6488384360522318064">Sélectionner une langue</translation> <translation id="648927581764831596">Aucun média disponible</translation> <translation id="6490471652906364588">Appareil USB de type C (port situé sur la droite de l'appareil)</translation> @@ -6287,6 +6301,7 @@ <translation id="7029307918966275733">Crostini n'est pas installé. Veuillez installer Crostini pour afficher le fichier des crédits.</translation> <translation id="7029809446516969842">Mots de passe</translation> <translation id="7030304022046916278">Les URL sont envoyées à la navigation sécurisée pour vérification</translation> +<translation id="7030695672997239647">Effectuez un clic droit sur un onglet, sélectionnez "Ajouter l'onglet à un groupe", puis "Nouveau groupe"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> (port de série connecté)</translation> <translation id="7033616203784997570">La saisie ne doit pas dépasser 62 caractères</translation> <translation id="7034692021407794547">Un administrateur qui dispose du droit "Gestion de la facturation" doit d'abord accepter les conditions d'utilisation du matériel Google Meet dans la section "Matériel Google Meet" de la Console d'administration.</translation> @@ -7389,6 +7404,7 @@ <translation id="8101987792947961127">Powerwash requis au prochain redémarrage</translation> <translation id="81020759409809034">Emplacement local</translation> <translation id="8102139037507939978">Retirez les informations permettant d'identifier personnellement les utilisateurs du fichier system_logs.txt.</translation> +<translation id="810362914482827094">Rechercher des clés d'accès</translation> <translation id="8104088837833760645">Télécharger le profil eSIM</translation> <translation id="8105368624971345109">Désactiver</translation> <translation id="8107015733319732394">Installation du Google Play Store sur votre <ph name="DEVICE_TYPE" />. Cette opération peut prendre quelques minutes.</translation> @@ -7836,6 +7852,7 @@ <translation id="8557022314818157177">Appuyez sur le lecteur d'empreinte digitale de la clé de sécurité jusqu'à ce que votre empreinte soit enregistrée</translation> <translation id="8557180006508471423">Activez "Google Chrome" dans les services de localisation de votre Mac</translation> <translation id="8557856025359704738">Le prochain téléchargement a lieu à <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Clés d'accès</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Tout ouvrir dans une &nouvelle fenêtre}=1{Ouvrir dans une &nouvelle fenêtre}one{Tout ouvrir ({COUNT}) dans une &nouvelle fenêtre}other{Tout ouvrir ({COUNT}) dans une &nouvelle fenêtre}}</translation> <translation id="8561206103590473338">Éléphant</translation> <translation id="8561565784790166472">Soyez prudent</translation> @@ -7962,6 +7979,7 @@ <translation id="8677212948402625567">Tout réduire...</translation> <translation id="867767487203716855">Prochaine mise à jour</translation> <translation id="8677859815076891398">Aucun album. Créez-en un dans <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Redémarrer et activer les mises à jour automatiques</translation> <translation id="8678538439778360739">Les données ont été chiffrées avec votre phrase secrète de synchronisation le <ph name="TIME" /> Cela ne s'applique pas aux modes de paiement ni aux adresses Google Pay.</translation> <translation id="8678582529642151449">Onglets non réduits</translation> <translation id="8678933587484842200">Comment souhaitez-vous que cette application soit lancée ?</translation> @@ -8209,6 +8227,7 @@ <translation id="8910987510378294980">Masquer la liste des appareils</translation> <translation id="8912362522468806198">Compte Google</translation> <translation id="8912810933860534797">Activer la recherche automatique</translation> +<translation id="8915307125957890427">Effectuez un clic droit sur un onglet, sélectionnez "Ajouter l'onglet à un groupe", puis "Nouveau groupe"</translation> <translation id="8915370057835397490">Chargement des suggestions en cours…</translation> <translation id="8916476537757519021">Sous-cadre de navigation privée : <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> de <ph name="GIVEN_NAME" /></translation> @@ -8283,6 +8302,7 @@ <translation id="8986362086234534611">Retirer</translation> <translation id="8986494364107987395">Envoie automatiquement les statistiques d'utilisation et les rapports d'erreur à Google</translation> <translation id="8987927404178983737">Mois</translation> +<translation id="8989359959810288806">Actualiser l'état du partage de connexion</translation> <translation id="8991520179165052608">Le site peut utiliser votre micro</translation> <translation id="899384117894244799">Supprimer un utilisateur avec accès restreint</translation> <translation id="899403249577094719">URL de base du certificat Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 61356e8f..169e775 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -680,7 +680,7 @@ <translation id="1637224376458524414">આ બુકમાર્ક તમારા iPhone પર મેળવો</translation> <translation id="1637350598157233081">તમારો પાસવર્ડ આ ડિવાઇસ પર સચવાયો છે</translation> <translation id="1637765355341780467">તમારી પ્રોફાઇલ ખોલતી વખતે કંઈક ખોટું થયું. કેટલીક સુવિધાઓ અનુપલબ્ધ હોઈ શકે છે.</translation> -<translation id="1639239467298939599">લોડ કરી રહ્યું છે</translation> +<translation id="1639239467298939599">લોડ થઇ રહી છે</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> હજુ પણ Linux ઍપમાં કામ કરતું નથી</translation> <translation id="1640283014264083726">RSA એન્ક્રિપ્શનવાળું PKCS #1 MD4</translation> <translation id="1641113438599504367">સલામત બ્રાઉઝિંગ</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index 7c8a5fd0..87d1f75 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">अपना माइक्रोफ़ोन और कैमरा उपयोग करें</translation> <translation id="1005333234656240382">ADB डीबग करने की सुविधा चालू करें?</translation> <translation id="1006873397406093306">यह एक्सटेंशन साइटों पर आपका डेटा पढ़ सकता है और बदल सकता है. आप यह नियंत्रित कर सकते हैं कि एक्सटेंशन किन साइटों को ऐक्सेस करे.</translation> +<translation id="1007057452468855774">Google Play Store चालू करें</translation> <translation id="1008186147501209563">बुकमार्क निर्यात करें</translation> <translation id="1008557486741366299">अभी नहीं</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> की लोकेशन</translation> <translation id="1009663062402466586">गेम के कंट्रोल अब उपलब्ध हैं</translation> <translation id="1010498023906173788">यह टैब किसी सीरियल पोर्ट से कनेक्ट है.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{पेज प्रतिसाद नहीं दे रहा है}one{पेज प्रतिसाद नहीं दे रहे हैं}other{पेज प्रतिसाद नहीं दे रहे हैं}}</translation> +<translation id="1011003645819296594">सेव किए गए डिवाइस</translation> <translation id="1011355516189274711">लिखाई को बोली में बदलने की आवाज़ का लेवल</translation> <translation id="1012794136286421601">आपके दस्तावेज़, शीट, स्लाइड, और ड्रॉइंग फ़ाइलें सिंक की जा रही हैं. उन्हें ऑनलाइन या ऑफ़लाइन एक्सेस करने के लिए Google डिस्क ऐप्लिकेशन खोलें.</translation> <translation id="1012876632442809908">USB-C डिवाइस (सामने वाला पोर्ट)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">इस डिवाइस का इस्तेमाल करें</translation> <translation id="1470946456740188591">कैरेट ब्राउज़िंग को चालू या बंद करने के लिए, शॉर्टकट Ctrl+Search+7 का इस्तेमाल करें</translation> <translation id="1472675084647422956">और दिखाएं</translation> +<translation id="1473223074251193484">टेदरिंग कॉन्फ़िगरेशन सेट करें</translation> <translation id="1474785664565228650">माइक्रोफ़ोन की सेटिंग में बदलाव करने के लिए, Parallels Desktop का फिर से लॉन्च होना ज़रूरी है. आगे बढ़ने के लिए, Parallels Desktop को फिर से लॉन्च करें.</translation> <translation id="1474893630593443211">आपको दिखाए जाने वाले विज्ञापनों पर आपका ज़्यादा कंट्रोल</translation> <translation id="1475502736924165259">आपके पास फ़ाइल पर ऐसे प्रमाणपत्र हैं जो किसी भी अन्य श्रेणी में फ़िट नहीं होते</translation> @@ -684,7 +687,7 @@ <translation id="1637224376458524414">यह बुकमार्क अपने iPhone पर पाएं</translation> <translation id="1637350598157233081">आपका पासवर्ड इस डिवाइस में सेव है</translation> <translation id="1637765355341780467">आपकी प्रोफ़ाइल खोलते समय कुछ गलत हो गया. हो सकता है कि कुछ सुविधाएं अनुपलब्ध हों.</translation> -<translation id="1639239467298939599">लोड हो रहा है</translation> +<translation id="1639239467298939599">लोड हो रही है</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> अभी Linux के ऐप्लिकेशन के साथ काम नहीं करता</translation> <translation id="1640283014264083726">RSA सुरक्षित करने के तरीके के साथ PKCS #1 MD4</translation> <translation id="1641113438599504367">सुरक्षित ब्राउज़िंग</translation> @@ -1126,6 +1129,7 @@ <translation id="2044014337866019681">पक्का करें कि आप सत्र को अनलॉक करने के लिए, <ph name="ACCOUNT" /> की पुष्टि कर रहे हैं.</translation> <translation id="204497730941176055">माइक्रोसॉफ्ट प्रमाणपत्र टेम्पलेट नाम</translation> <translation id="2045117674524495717">कीबोर्ड शॉर्टकट सहायक</translation> +<translation id="2045211794962848221">आपको यह मैसेज दोबारा नहीं दिखेगा</translation> <translation id="2045969484888636535">कुकी अवरोधित करना जारी रखें</translation> <translation id="204622017488417136">आपके डिवाइस को Chrome के इसे पहले इंस्टॉल किए गए वर्शन पर वापस ले जाया जाएगा. सभी उपयोगकर्ता खाते और स्थानीय डेटा हटा दिइ जाएंगे. इसे पहले जैसा नहीं किया जा सकता.</translation> <translation id="2046702855113914483">रेमन</translation> @@ -3814,6 +3818,7 @@ <translation id="4594577641390224176">सिस्टम की जानकारी वाला पेज चाहिए? यहां जाएं</translation> <translation id="4595560905247879544">ऐप्स और एक्सटेंशन केवल मैनेजर (<ph name="CUSTODIAN_NAME" />) के द्वारा बदले जा सकते हैं.</translation> <translation id="4596295440756783523">इन सर्वर की पहचान करने वाले प्रमाणपत्र आपके रिकॉर्ड में हैं</translation> +<translation id="4598345735110653698">पासवर्ड मैनेज करें</translation> <translation id="4598556348158889687">डिवाइस की मेमोरी का प्रबंधन</translation> <translation id="4598776695426288251">एक से ज़्यादा डिवाइस के ज़रिए वाई-फ़ाई उपलब्ध है</translation> <translation id="4601426376352205922">'नहीं पढ़ा गया' का निशान लगाएं</translation> @@ -4039,6 +4044,7 @@ <translation id="4823894915586516138">यह पिन या पासवर्ड, आपके <ph name="DEVICE_TYPE" /> पर मौजूद डेटा को सुरक्षित रखता है. इस डेटा में वह जानकारी भी शामिल है जिसे आपने अपने फ़ोन से ऐक्सेस किया है</translation> <translation id="4824037980212326045">Linux का बैक अप लेना और बहाल करना</translation> <translation id="4824958205181053313">सिंक करना रद्द करें?</translation> +<translation id="4825532258163983651">पासवर्ड मिटाया नहीं जा सकता</translation> <translation id="4827675678516992122">जोड़ा नहीं जा सका</translation> <translation id="4827784381479890589">Chrome ब्राउज़र में वर्तनी जांच की बेहतर सुविधा (वर्तनी के सुझावों के लिए Google को टेक्स्ट भेजा जाता है)</translation> <translation id="4827904420700932487">इस इमेज के लिए क्यूआर कोड बनाएं</translation> @@ -4301,6 +4307,7 @@ <translation id="5087249366037322692">किसी तृतीय-पक्ष द्वारा जोड़ा गया</translation> <translation id="5087580092889165836">कार्ड जोड़ें</translation> <translation id="5088534251099454936">RSA सुरक्षित करने के तरीके के साथ PKCS #1 SHA-512</translation> +<translation id="5089763948477033443">साइड पैनल का साइज़ बदलने वाला हैंडल</translation> <translation id="5090637338841444533">कैमरे की स्थिति को ट्रैक करने की अनुमति नहीं है</translation> <translation id="5093569275467863761">बैक/फ़ॉरवर्ड कैश मेमोरी का गुप्त सबफ़्रेम: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">इस ऐप्लिकेशन में इस्तेमाल की जा सकने वाली फ़ाइलों को खोला जा सकता है और उनमें बदलाव किया जा सकता है. ऐसा, Files ऐप्लिकेशन या दूसरे ऐप्लिकेशन में किया जा सकता है. यह कंट्रोल करने के लिए कि कौनसी फ़ाइलें, डिफ़ॉल्ट तौर पर इस ऐप्लिकेशन में खुलेंगी, <ph name="BEGIN_LINK" />अपने डिवाइस पर डिफ़ॉल्ट ऐप्लिकेशन सेट करने का तरीका जानें<ph name="END_LINK" />.</translation> @@ -4466,6 +4473,7 @@ <translation id="5258992782919386492">इस डिवाइस पर इंस्टॉल करें</translation> <translation id="5260334392110301220">Smart Quotes</translation> <translation id="5260508466980570042">क्षमा करें, आपका ईमेल या पासवर्ड सत्यापित नहीं हो सका. कृपया फिर से प्रयास करें.</translation> +<translation id="5260958083445173099">जब भी संभव होगा, वेबसाइटों पर आपकी पसंदीदा भाषाओं में कॉन्टेंट दिखाया जाएगा</translation> <translation id="5261683757250193089">वेब स्टोर में खोलें</translation> <translation id="5262178194499261222">पासवर्ड हटाएं</translation> <translation id="5262784498883614021">नेटवर्क से अपने-आप कनेक्ट हो</translation> @@ -4506,6 +4514,7 @@ <translation id="5294097441441645251">छोटे अक्षर या अंडरस्कोर से शुरू होना चाहिए</translation> <translation id="5294618183559481278">आपका <ph name="DEVICE_TYPE" />, बिल्ट-इन सेंसर की मदद से डिवाइस की स्क्रीन के सामने किसी की मौजूदगी का पता लगाता है. डेटा को तुरंत ही आपके डिवाइस पर प्रोसेस किया जाता है और इसके बाद, इस डेटा को मिटा दिया जाता है. Google को कभी भी सेंसर का डेटा नहीं भेजा जाता है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="5296350763804564124">बोलकर दिया गया जवाब सुनें, ताकि बिना स्क्रीन देखे डिवाइस का इस्तेमाल किया जा सके. कनेक्ट किए गए डिवाइस से, ब्रेल का इस्तेमाल करके सुझाव, शिकायत या राय देने की सुविधा उपलब्ध होती है.</translation> +<translation id="5297005732522718715">टेदरिंग कॉन्फ़िगरेशन को रीफ़्रेश करें</translation> <translation id="5297082477358294722">पासवर्ड सेव किया गया. अपने <ph name="SAVED_PASSWORDS_STORE" /> में सेव किए गए पासवर्ड देखें और उन्हें प्रबंधित करें.</translation> <translation id="5297946558563358707">जब कोई और आपकी स्क्रीन की तरफ़ देखता है, तब आपकी स्क्रीन पर नीचे, दाईं ओर प्राइवेसी आई का आइकॉन दिखता है</translation> <translation id="5298219193514155779">थीम निर्माता</translation> @@ -4676,6 +4685,7 @@ <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” को चिपकाएं और खोजें</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> को ब्लॉक किया गया है</translation> <translation id="5468173180030470402">फ़ाइल शेयर को ढूंढा जा रहा है</translation> +<translation id="5468330507528805311">टेदरिंग का स्टेटस:</translation> <translation id="5468881191994555667">फ़ाइल चुनें</translation> <translation id="5469852975082458401">टेक्स्ट कर्सर की मदद से आप पेजों पर जा सकते हैं. कैरेट ब्राउज़िंग को बंद करने के लिए F7 दबाएं.</translation> <translation id="5470735824776589490">डिवाइस को 'पावरवॉश' से रीसेट करने से पहले रीस्टार्ट करना ज़रूरी है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> @@ -4951,6 +4961,7 @@ <translation id="5734362860645681824">संचार</translation> <translation id="5734697361979786483">फ़ाइल शेयर जोड़ें</translation> <translation id="5736796278325406685">कृपया कोई मान्य उपयोगकर्ता नाम डालें</translation> +<translation id="5738093759615225354">आपको अपने कंप्यूटर में साइन इन करने के लिए, इस पासवर्ड की ज़रूरत है</translation> <translation id="5739017626473506901">साइन इन करके, स्कूल वाला खाता जोड़ने में <ph name="USER_NAME" /> की मदद करें</translation> <translation id="5739235828260127894">पुष्टि होने का इंतज़ार किया जा रहा है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> <translation id="5739458112391494395">बहुत बड़ा</translation> @@ -5112,6 +5123,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> की मदद से पेज खोजें</translation> <translation id="5896436821193322561">अनुमति न दें</translation> <translation id="5900186025777217044">Smart Lock बदल दिया गया है</translation> +<translation id="5900243355162006650">टेदरिंग कॉन्फ़िगरेशन:</translation> <translation id="5900302528761731119">Google प्रोफ़ाइल फ़ोटो</translation> <translation id="590036993063074298">स्क्रीन शेयर करने की सुविधा की क्वालिटी के बारे में जानकारी</translation> <translation id="5901069264981746702">आपके फ़िंगरप्रिंट का डेटा सुरक्षित तरीके से सेव किया जाता है और यह आपके <ph name="DEVICE_TYPE" /> में ही रहता है. <ph name="LINK_BEGIN" />ज़्यादा जानें<ph name="LINK_END" /></translation> @@ -5416,6 +5428,7 @@ <translation id="6196640612572343990">तीसरे पक्ष की कुकी ब्लॉक करें</translation> <translation id="6196854373336333322">एक्सटेंशन "<ph name="EXTENSION_NAME" />" ने आपकी प्रॉक्सी सेटिंग पर नियंत्रण कर लिया है, जिसका अर्थ है कि यह ऑनलाइन किए जाने वाले काम को बदल सकता है, रोक सकता है या उसे छिप कर सुन सकता है. अगर आप पक्का नहीं हैं कि यह बदलाव क्यों हुआ है, तो संभवत: आप उसे नहीं चाहते हैं.</translation> <translation id="6197128521826316819">इस पेज के लिए क्यूआर कोड बनाएं</translation> +<translation id="6197223946499512637">ये पासवर्ड इस कंप्यूटर पर, Windows Hello में सेव किए गए हैं. ये आपके Google खाते में सेव नहीं होते.</translation> <translation id="6198252989419008588">पिन बदलें</translation> <translation id="6200047250927636406">फ़ाइल खारिज करें</translation> <translation id="6200151268994853226">एक्सटेंशन मैनेज करें</translation> @@ -5713,6 +5726,7 @@ <translation id="6482559668224714696">फ़ुल-स्क्रीन पर सामग्री को बड़ा दिखाने वाला</translation> <translation id="6483485061007832714">डाउनलोड खोलें</translation> <translation id="6483805311199035658"><ph name="FILE" /> खोला जा रहा है...</translation> +<translation id="6486301003991593638">पासवर्ड मैनेज करने के लिए, Windows के नए वर्शन का इस्तेमाल करें</translation> <translation id="6488384360522318064">भाषा चुनें</translation> <translation id="648927581764831596">कोई भी उपलब्ध नहीं</translation> <translation id="6490471652906364588">USB-C डिवाइस (दायां पोर्ट)</translation> @@ -6301,6 +6315,7 @@ <translation id="7029307918966275733">Crostini इंस्टॉल नहीं है. क्रेडिट देखने के लिए कृपया Crostini इंस्टॉल करें.</translation> <translation id="7029809446516969842">पासवर्ड</translation> <translation id="7030304022046916278">सुरक्षित ब्राउज़िंग की सेवा को यूआरएल भेजे जाते हैं, ताकि उनकी जांच की जा सके</translation> +<translation id="7030695672997239647">टैब पर दायां क्लिक करें और "टैब को ग्रुप में जोड़ें" चुनें. इसके बाद, "नया ग्रुप" चुनें</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - सीरियल पोर्ट कनेक्ट है</translation> <translation id="7033616203784997570">नाम ज़्यादा से ज़्यादा 62 वर्णों का होना चाहिए</translation> <translation id="7034692021407794547">ऐसा एडमिन जिसके पास बिलिंग मैनेज करने का खास अधिकार है, उसे सबसे पहले Admin console के 'Google Meet हार्डवेयर' सेक्शन में जाकर, Google Meet हार्डवेयर की सेवा की शर्तों को स्वीकार करना होगा.</translation> @@ -7402,6 +7417,7 @@ <translation id="8101987792947961127">अगली बार रीबूट करने पर पावरवॉश ज़रूरी है</translation> <translation id="81020759409809034">डाउनलोड करने के लिए डिफ़ॉल्ट लोकेशन</translation> <translation id="8102139037507939978">system_logs.txt से, व्यक्तिगत पहचान ज़ाहिर करने वाली जानकारी को हटाएं.</translation> +<translation id="810362914482827094">पासवर्ड खोजें</translation> <translation id="8104088837833760645">ई-सिम प्रोफ़ाइल डाउनलोड करें</translation> <translation id="8105368624971345109">बंद करें</translation> <translation id="8107015733319732394">आपके <ph name="DEVICE_TYPE" /> पर Google Play Store इंस्टॉल हो रहा है. इसमें कुछ मिनट लग सकते हैं.</translation> @@ -7849,6 +7865,7 @@ <translation id="8557022314818157177">अपनी सुरक्षा कुंजी को तब तक छूते रहें, जब तक फ़िंगरप्रिंट कैप्चर न हाे जाए</translation> <translation id="8557180006508471423">अपने Mac पर, जगह की जानकारी में "Google Chrome" चालू करें</translation> <translation id="8557856025359704738">अगली बार <ph name="NEXT_DATE_DOWNLOAD" /> को डाउनलोड होंगी.</translation> +<translation id="8559858985063901027">पासवर्ड</translation> <translation id="8560327176991673955">{COUNT,plural, =0{सभी यूआरएल को &नई विंडो में खोलें}=1{यूआरएल को &नई विंडो में खोलें}one{दिया गया ({COUNT}) यूआरएल &नई विंडो में खोलें}other{सभी ({COUNT}) यूआरएल को &नई विंडो में खोलें}}</translation> <translation id="8561206103590473338">हाथी</translation> <translation id="8561565784790166472">सावधानी से आगे बढ़ें</translation> @@ -7975,6 +7992,7 @@ <translation id="8677212948402625567">सभी को छोटा करें...</translation> <translation id="867767487203716855">अगला अपडेट</translation> <translation id="8677859815076891398">कोई एल्बम नहीं. <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> में एल्बम बनाएं.</translation> +<translation id="8678378565142776698">रीस्टार्ट करें और अपने-आप अपडेट होने की सुविधा पाएं</translation> <translation id="8678538439778360739">डेटा को सिंक करने के लिए इस्तेमाल हुए, आपके लंबे पासवर्ड से <ph name="TIME" /> पर एन्क्रिप्ट (सुरक्षित) किया गया था. इसमें Google Pay में शामिल पैसे चुकाने के तरीके और पते शामिल नहीं हैं.</translation> <translation id="8678582529642151449">टैब छोटे नहीं किए जा सकते</translation> <translation id="8678933587484842200">आप इस ऐप्लिकेशन को कैसे लॉन्च करना चाहते हैं?</translation> @@ -8222,6 +8240,7 @@ <translation id="8910987510378294980">डिवाइसों की सूची छिपाएं</translation> <translation id="8912362522468806198">Google खाता</translation> <translation id="8912810933860534797">अपने आप स्कैन करने की सुविधा चालू करें</translation> +<translation id="8915307125957890427">टैब पर दायां क्लिक करें और "टैब को ग्रुप में जोड़ें" चुनें. इसके बाद, "नया ग्रुप" चुनें</translation> <translation id="8915370057835397490">सुझाव लोड हो रहे हैं</translation> <translation id="8916476537757519021">गुप्त सबफ़्रेम: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> का <ph name="DEVICE_TYPE" /></translation> @@ -8296,6 +8315,7 @@ <translation id="8986362086234534611">भूल जाएं</translation> <translation id="8986494364107987395">इस्तेमाल के आंकड़े और खराबी रिपोर्ट अपने आप Google को भेजें</translation> <translation id="8987927404178983737">माह</translation> +<translation id="8989359959810288806">टेदरिंग का स्टेटस रीफ़्रेश करें</translation> <translation id="8991520179165052608">साइट आपके माइक्रोफ़ोन का इस्तेमाल कर सकती है</translation> <translation id="899384117894244799">पाबंदी वाले उपयोगकर्ता को हटाएं</translation> <translation id="899403249577094719">Netscape प्रमाणपत्र आधार URL</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 5aee37b..e8f63845 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Օգտագործել ձեր խոսափողը և տեսախցիկը</translation> <translation id="1005333234656240382">Միացնե՞լ ADB վրիպազերծումը</translation> <translation id="1006873397406093306">Ընդլայնումը կարող է ընթերցել և փոփոխել կայքերում ձեր տվյալները։ Դուք կարող եք նծել, թե որ կայքերը հասանելի լինեն ընդլայնմանը։</translation> +<translation id="1007057452468855774">Միացնել Google Play Խանութը</translation> <translation id="1008186147501209563">Էջանիշների արտահանում</translation> <translation id="1008557486741366299">Հիմա չէ</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Այժմ հասանելի են խաղերի կառավարման տարրեր</translation> <translation id="1010498023906173788">Այս ներդիրը միացված է հերթական միացքին:</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{էջ չի պատասխանում}one{էջ չի պատասխանում}other{էջ չի պատասխանում}}</translation> +<translation id="1011003645819296594">Պահված սարքեր</translation> <translation id="1011355516189274711">Տեքստի հնչեցման ձայնի ուժգնությունը</translation> <translation id="1012794136286421601">Ձեր փաստաթղթերը, աղյուսակները, սլայդները և գծագրերը համաժամացվում են: Բացեք Google Drive հավելվածը՝ այդ ֆայլերից առցանց կամ անցանց ռեժիմներում օգտվելու համար:</translation> <translation id="1012876632442809908">USB-C սարք (առջևի միացք)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">Օգտագործել այս սարքը</translation> <translation id="1470946456740188591">Ստեղնային դիտարկումը միացնելու/անջատելու համար օգտագործեք Ctrl + Search + 7 դյուրանցումը</translation> <translation id="1472675084647422956">Ցույց տալ ավելին</translation> +<translation id="1473223074251193484">Կարգավորել մոդեմի ռեժիմի կազմաձևը</translation> <translation id="1474785664565228650">Վերագործարկեք Parallels Desktop-ը, որպեսզի խոսափողի կարգավորումը փոխվի, և դուք կարողանաք շարունակել աշխատանքը։</translation> <translation id="1474893630593443211">Ավելի շատ վերահսկողություն ձեզ ցուցադրվող գովազդի վրա</translation> <translation id="1475502736924165259">Ֆայլը պարունակում է հավաստագրեր, որոնք չեն համապատասխանում մյուս կատեգորիաներից ոչ մեկին</translation> @@ -1115,6 +1118,7 @@ <translation id="2044014337866019681">Հաստատեք <ph name="ACCOUNT" /> հաշիվը՝ աշխատաշրջանն ապակողպելու համար։</translation> <translation id="204497730941176055">Microsoft-ի վկայագրի ձևանմուշի անունը</translation> <translation id="2045117674524495717">Ստեղնային դյուրանցումների օգնական</translation> +<translation id="2045211794962848221">Դուք այլևս չեք տեսնի այս հատուկ հաղորդագրությունը</translation> <translation id="2045969484888636535">Շարունակել քուքիների արգելափակումը</translation> <translation id="204622017488417136">Սարքը կվերադարձվի Chrome-ի նախկինում տեղադրված տարբերակին: Բոլոր օգտատերերի հաշիվները և տեղային տվյալները կհեռացվեն: Գործողությունը հնարավոր չէ հետարկել:</translation> <translation id="2046702855113914483">Ռամեն</translation> @@ -3799,6 +3803,7 @@ <translation id="4594577641390224176">Համակարգի մասին է՞ջն եք փնտրում։ Անցեք</translation> <translation id="4595560905247879544">Հավելվածներն ու ընդլայնումները միայն կառավարիչը (<ph name="CUSTODIAN_NAME" />) կարող է փոփոխել:</translation> <translation id="4596295440756783523">Դուք ունեք որոշ հավաստագրեր, որոնք նույնականացնում են այս սերվերները</translation> +<translation id="4598345735110653698">Կառավարել անցաբառերը</translation> <translation id="4598556348158889687">Հիշողության կառավարում</translation> <translation id="4598776695426288251">Մի քանի սարքերի միջոցով հասանելի են Wi-Fi ցանցեր</translation> <translation id="4601426376352205922">Նշել որպես չկարդացված</translation> @@ -4023,6 +4028,7 @@ <translation id="4823894915586516138">Այս PIN կոդը կամ գաղտնաբառը կպաշտպանի ձեր տվյալները <ph name="DEVICE_TYPE" /> սարքում, այդ թվում՝ տեղեկությունները, որոնք դուք բացում եք ձեր հեռախոսից</translation> <translation id="4824037980212326045">Լինուքսի պահուստավորում և վերականգնում</translation> <translation id="4824958205181053313">Չեղարկե՞լ համաժամացումը</translation> +<translation id="4825532258163983651">Չհաջողվեց ջնջել անցաբառը</translation> <translation id="4827675678516992122">Չհաջողվեց միանալ</translation> <translation id="4827784381479890589">Ուղղագրության կատարելագործված ստուգում Chrome-ում (տեքստն ուղարկվում է Google-ին՝ ուղղագրության առաջարկներ ստանալու համար)</translation> <translation id="4827904420700932487">Ստեղծել QR կոդ այս պատկերի համար</translation> @@ -4286,6 +4292,7 @@ <translation id="5087249366037322692">Ավելացվել է այլ ծրագրի կողմից</translation> <translation id="5087580092889165836">Ավելացնել քարտ</translation> <translation id="5088534251099454936">PKCS #1 SHA-512՝ RSA գաղտնագրումով</translation> +<translation id="5089763948477033443">Կողային վահանակի չափափոխման բռնիչ</translation> <translation id="5090637338841444533">Չի թույլատրվում հետագծել ձեր տեսախցիկի դիրքը</translation> <translation id="5093569275467863761">Հետադարձ քեշի ենթաշրջանակ ինկոգնիտո ռեժիմում՝ <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Դուք կարող եք բացել և փոփոխել աջակցվող ֆայլերն այս հավելվածի միջոցով Ֆայլեր հավելվածից կամ այլ հավելվածներից։ <ph name="BEGIN_LINK" />Այս էջում<ph name="END_LINK" /> կարող եք իմանալ, թե ինչպես ձեր սարքում կանխադրված հավելվածներ սահմանել և նշել, թե որ ֆայլերը պետք է ըստ կանխադրման բացվեն տվյալ հավելվածով։</translation> @@ -4451,6 +4458,7 @@ <translation id="5258992782919386492">Տեղադրել այս սարքում</translation> <translation id="5260334392110301220">Խելացի չակերտներ</translation> <translation id="5260508466980570042">Ձեր էլ․ հասցեն կամ գաղտնաբառը չհաստատվեցին: Կրկին փորձեք:</translation> +<translation id="5260958083445173099">Կայքերը հնարավորության դեպքում կցուցադրեն բովանդակություն ձեր նախընտրած լեզուներով։</translation> <translation id="5261683757250193089">Բացել Chrome Web Store-ում</translation> <translation id="5262178194499261222">Հեռացնել գաղտնաբառը</translation> <translation id="5262784498883614021">Ավտոմատ միանալ ցանցին</translation> @@ -4493,6 +4501,7 @@ <translation id="5294097441441645251">Պետք է սկսվի փոքրատառով կամ ընդգծման նշանով</translation> <translation id="5294618183559481278">Ձեր <ph name="DEVICE_TYPE" /> սարքն օգտագործում է ներկառուցված տվիչ՝ էկրանի դիմաց հայտնված կողմնակի մարդկանց ներկայությունը հայտնաբերելու համար։ Տվիչի բոլոր տվյալները մշակվում են անմիջապես ձեր սարքում, ինչից հետո հեռացվում են։ Դրանք երբեք չեն ուղարկվում Google-ին։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Լսեք ձայնային ուղեկցումը, որպեսզի կարողանաք օգտագործել սարքն առանց էկրանին նայելու։ Բրայլյան գրերի աջակցումը հասանելի է միացված սարքի հետ։</translation> +<translation id="5297005732522718715">Թարմացնել մոդեմի ռեժիմի կազմաձևը</translation> <translation id="5297082477358294722">Գաղտնաբառը պահվեց: Դիտեք և կառավարեք պահված գաղտնաբառերը ձեր Google հաշվում: Անցեք <ph name="SAVED_PASSWORDS_STORE" />:</translation> <translation id="5297946558563358707">Եթե ձեզնից բացի ինչ-որ մեկը նայի ձեր էկրանին, ներքևի աջ անկյունում կհայտնվի Գաղտնիության պատկերակը, որն աչքի տեսք ունի։</translation> <translation id="5298219193514155779">Թեմայի հեղինակ՝</translation> @@ -4663,11 +4672,13 @@ <translation id="5466374726908360271">Տեղադրել և որոնել «<ph name="SEARCH_TERMS" />»</translation> <translation id="5467207440419968613">Արգելափակված թույլտվություններ՝ <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Ընդհանուր ֆայլերի որոնում</translation> +<translation id="5468330507528805311">Մոդեմի ռեժիմի կարգավիճակ՝</translation> <translation id="5468881191994555667">Ընտրել ֆայլը</translation> <translation id="5469852975082458401">Դուք կարող եք մեկ էջից անցնել մյուսը տեսքտի նշորդի միջոցով։ Սեղմեք F7՝ անջատելու համար։</translation> <translation id="5470735824776589490">Պետք է վերագործարկեք սարքը՝ նախքան Powerwash կատարելը։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Ողջո՛ւյն: Ես տեքստի հնչեցման ձայնն եմ:</translation> <translation id="5472627187093107397">Պահպանել գաղտնաբառերն այս կայքի համար</translation> +<translation id="5473062644742711742">Գտեք ավելի շատ հատուկ հնարավորությունների գործիքներ Chrome Web Store-ում</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Շարունակելով՝ դուք համաձայնում եք, որ այս սարքը նույնպես կարող է ավտոմատ ներբեռնել և տեղադրել Google-ի, ձեր երեխայի օպերատորի և սարքի արտադրողի կողմից տրամադրվող թարմացումները և հավելվածները (նաև բջջային ինտերնետի միջոցով)։ Որոշ հավելվածներում կարող է առաջարկվել վճարովի բովանդակություն։</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN կոդը պետք է կազմված լինի առնվազն 1 նիշից}one{PIN կոդը պետք է կազմված լինի առնվազն # նիշից}other{PIN կոդը պետք է կազմված լինի առնվազն # նիշից}}</translation> @@ -4936,6 +4947,7 @@ <translation id="5734362860645681824">Հաղորդակցում</translation> <translation id="5734697361979786483">Ավելացնել ցանցային պահեստ</translation> <translation id="5736796278325406685">Մուտքագրեք վավեր օգտանուն</translation> +<translation id="5738093759615225354">Այս անցաքարտը պետք է ձեր համակարգիչ մուտք գործելու համար</translation> <translation id="5739017626473506901">Մուտք գործեք, որպեսզի օգնեք <ph name="USER_NAME" />-ին ուսումնական հաշիվ ավելացնել</translation> <translation id="5739235828260127894">Պահանջվում է հաստատում: <ph name="LINK_BEGIN" />Մանրամասն<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Շատ մեծ</translation> @@ -5097,6 +5109,7 @@ <translation id="589541317545606110">Որոնել էջում <ph name="VISUAL_SEARCH_PROVIDER" /> ծառայության միջոցով</translation> <translation id="5896436821193322561">Չթույլատրել</translation> <translation id="5900186025777217044">Smart Lock գործառույթը փոխվել է</translation> +<translation id="5900243355162006650">Մոդեմի ռեժիմի կազմաձև</translation> <translation id="5900302528761731119">Google պրոֆիլի լուսանկար</translation> <translation id="590036993063074298">Հայելապատճենման որակի մանրամասները</translation> <translation id="5901069264981746702">Մատնահետքի տվյալներն ապահով պահվում են ձեր <ph name="DEVICE_TYPE" /> սարքում և երբեք չեն փոխանցվում այլ անձանց։ <ph name="LINK_BEGIN" />Իմանալ ավելին<ph name="LINK_END" /></translation> @@ -5400,6 +5413,7 @@ <translation id="6196640612572343990">Արգելափակել երրորդ կողմի քուքիները</translation> <translation id="6196854373336333322">Ձեր պրոքսիի կարգավորումները վերահսկվում են «<ph name="EXTENSION_NAME" />» ընդլայնման կողմից: Դա նշանակում է, որ այն կարող է փոխել, խափանել կամ աննկատ գրառել այն ամենը, ինչ անում եք առցանց: Եթե չգիտեք, թե ինչու է այդ փոփոխությունը տեղի ունեցել, հավանաբար դուք դա չէիք ուզում:</translation> <translation id="6197128521826316819">Ստեղծել QR կոդ այս էջի համար</translation> +<translation id="6197223946499512637">Անցաբառերը պահվում են այս համակարգչի Windows Hello-ում։ Դրանք չեն պահվում ձեր Google հաշվում։</translation> <translation id="6198252989419008588">Փոխել PIN-ը</translation> <translation id="6200047250927636406">Հեռացնել ֆայլը</translation> <translation id="6200151268994853226">Կառավարել ընդլայնումը</translation> @@ -5697,6 +5711,7 @@ <translation id="6482559668224714696">Լիաէկրան խոշորացույց</translation> <translation id="6483485061007832714">Բացեք ներբեռնումը</translation> <translation id="6483805311199035658"><ph name="FILE" /> ֆայլը բացվում է…</translation> +<translation id="6486301003991593638">Անցաբառերը կառավարելու համար օգտագործեք Windows-ի ավելի նոր տարբերակ</translation> <translation id="6488384360522318064">Ընտրել լեզուն</translation> <translation id="648927581764831596">Ոչ մեկը մատչելի չէ</translation> <translation id="6490471652906364588">USB-C սարք (աջ միացք)</translation> @@ -6285,6 +6300,7 @@ <translation id="7029307918966275733">Crostini-ն տեղադրված չէ։ Տեղադրեք Crostini-ն՝ բոնուսները տեսնելու համար։</translation> <translation id="7029809446516969842">Գաղտնաբառեր</translation> <translation id="7030304022046916278">Ուղարկում է URL-ները Ապահով դիտարկմանը՝ դրանք ստուգելու համար։</translation> +<translation id="7030695672997239647">Մկնիկի աջ կոճակով սեղմեք ներդիրի վրա և ընտրեք «Ավելացնել ներդիրը նոր խմբում», այնուհետև՝ «Նոր խումբ»</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – Միացած է հերթական միացքին</translation> <translation id="7033616203784997570">Թույլատրվում է մուտքագրել առավելագույնը 62 նիշ</translation> <translation id="7034692021407794547">Ադմինիստրատորը, որն ունի վճարումների կառավարման թույլտվություն, նախ պետք է ընդունի Google Meet-ի ծրագրակազմի օգտագործման պայմանները ադմինիստրատորի վահանակի «Google Meet-ի ծրագրակազմ» բաժնում։</translation> @@ -7384,6 +7400,7 @@ <translation id="8101987792947961127">Հաջորդ վերաբեռնման ժամանակ հարկավոր է կատարել Powerwash</translation> <translation id="81020759409809034">Սարքում</translation> <translation id="8102139037507939978">Հեռացնել անձը նույնականացնող տեղեկությունները system_logs.txt ֆայլից։</translation> +<translation id="810362914482827094">Որոնել անցաբառեր</translation> <translation id="8104088837833760645">Ներբեռնել eSIM պրոֆիլը</translation> <translation id="8105368624971345109">Անջատել</translation> <translation id="8107015733319732394">Google Play Խանութը տեղադրվում է <ph name="DEVICE_TYPE" /> սարքում։ Սա կարող է մի քանի րոպե տևել։</translation> @@ -7831,6 +7848,7 @@ <translation id="8557022314818157177">Հպեք անվտանգության բանալուն և պահեք, մինչև ձեր մատնահետքն ավելացվի:</translation> <translation id="8557180006508471423">Միացրեք «Google Chrome»-ը ձեր Mac համակարգչի տեղորոշման ծառայություններում</translation> <translation id="8557856025359704738">Հաջորդ ներբեռնումը կլինի հետևյալ ամսաթվին՝ <ph name="NEXT_DATE_DOWNLOAD" />։</translation> +<translation id="8559858985063901027">Անցաբառեր</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Բացել բոլորը &նոր պատուհանում}=1{Բացել &նոր պատուհանում}one{Բացել բոլորը ({COUNT}) &նոր պատուհանում}other{Բացել բոլորը ({COUNT}) &նոր պատուհանում}}</translation> <translation id="8561206103590473338">Փիղ</translation> <translation id="8561565784790166472">Զգույշ եղեք</translation> @@ -7957,6 +7975,7 @@ <translation id="8677212948402625567">Կոծկել բոլորը…</translation> <translation id="867767487203716855">Հաջորդ թարմացումը</translation> <translation id="8677859815076891398">Ալբոմներ չկան: Ստեղծեք ալբոմ <ph name="LINK_BEGIN" />Google Լուսանկարներում<ph name="LINK_END" />։</translation> +<translation id="8678378565142776698">Վերագործարկել և ստանալ ավտոմատ թարմացումներ</translation> <translation id="8678538439778360739">Տվյալները գաղտնագրվել են ձեր համաժամացման անցաբառի միջոցով <ph name="TIME" />-ին։ Գաղտնագրումը չի կիրառվում վճարման եղանակների և Google Pay-ի հասցեների համար։</translation> <translation id="8678582529642151449">Ներդիրները չեն փոքրացվում</translation> <translation id="8678933587484842200">Ինչպե՞ս գործարկել այս հավելվածը։</translation> @@ -8204,6 +8223,7 @@ <translation id="8910987510378294980">Թաքցնել սարքերի ցանկը</translation> <translation id="8912362522468806198">Google հաշիվ</translation> <translation id="8912810933860534797">Միացնել ավտոմատ որոնումը</translation> +<translation id="8915307125957890427">Մկնիկի աջ կոճակով սեղմեք ներդիրի վրա և ընտրեք «Ավելացնել ներդիրը նոր խմբում», այնուհետև՝ «Նոր խումբ»</translation> <translation id="8915370057835397490">Առաջարկը բեռնվում է</translation> <translation id="8916476537757519021">Ինկոգնիտո ռեժիմի ենթաշրջանակ՝ <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> @@ -8278,6 +8298,7 @@ <translation id="8986362086234534611">Հեռացնել</translation> <translation id="8986494364107987395">Ավտոմատ Google-ին ուղարկել օգտագործման վիճակագրությունները և խափանումների մասին հաշվետվությունները</translation> <translation id="8987927404178983737">Ամիս</translation> +<translation id="8989359959810288806">Թարմացնել մոդեմի ռեժիմի կարգավիճակը</translation> <translation id="8991520179165052608">Կայքը կարող է օգտագործել ձեր խոսափողը</translation> <translation id="899384117894244799">Հեռացնել սահմանափակ հասանելիությամբ օգտատիրոջը</translation> <translation id="899403249577094719">Netscape-ի վկայագրերի բազայի URL</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index a1ee2d91..46b1cef 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -4691,6 +4691,7 @@ <translation id="5470735824776589490">Mulai ulang diperlukan sebelum perangkat Anda dapat direset dengan Powerwash. <ph name="LINK_BEGIN" />Pelajari lebih lanjut<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Halo! Saya suara text to speech Anda.</translation> <translation id="5472627187093107397">Simpan sandi untuk situs ini</translation> +<translation id="5473062644742711742">Temukan alat aksesibilitas lainnya di Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Dengan melanjutkan, Anda setuju bahwa perangkat ini juga dapat otomatis mendownload serta menginstal update dan aplikasi dari Google, operator anak Anda, dan produsen perangkat ini, yang kemungkinan menggunakan data seluler. Beberapa aplikasi ini mungkin menawarkan pembelian dalam aplikasi.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN harus berisi minimal satu karakter}other{PIN harus berisi minimal # karakter}}</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index 54c80f5..0dab7452 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Nota hljóðnemann þinn og myndavél</translation> <translation id="1005333234656240382">Kveikja á ADB-villuleit?</translation> <translation id="1006873397406093306">Þessi viðbót getur lesið og breytt gögnunum þínum á vefsvæðum. Þú getur stjórnað að hvaða vefsvæðum viðbótin fær aðgang.</translation> +<translation id="1007057452468855774">Kveikja á Google Play Store</translation> <translation id="1008186147501209563">Flytja út bókamerki</translation> <translation id="1008557486741366299">Ekki núna</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> staður</translation> <translation id="1009663062402466586">Leikjastýringar eru nú tiltækar</translation> <translation id="1010498023906173788">Þessi flipi er tengdur raðtengi.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Síða svarar ekki}one{Síður svara ekki}other{Síður svara ekki}}</translation> +<translation id="1011003645819296594">Vistuð tæki</translation> <translation id="1011355516189274711">Hljóðstyrkur talgervils</translation> <translation id="1012794136286421601">Verið er að samstilla skrárnar þínar úr Skjölum, Töflureiknum, Skyggnum og Teikningum. Opnaðu Google Drive forritið þitt til að fá aðgang að þeim með eða án nettengingar.</translation> <translation id="1012876632442809908">USB-C-tæki (tengi að framan)</translation> @@ -495,6 +497,7 @@ <translation id="1470350905258700113">Nota þetta tæki</translation> <translation id="1470946456740188591">Notaðu Ctrl+leitarhnapp+7 til að kveikja eða slökkva á skoðun með textabendli</translation> <translation id="1472675084647422956">Sýna meira</translation> +<translation id="1473223074251193484">Stilla tjóðrun</translation> <translation id="1474785664565228650">Breytingin á hljóðnemastillingu krefst þess að Parallels Desktop sé endurræst. Endurræstu Parallels Desktop til að halda áfram.</translation> <translation id="1474893630593443211">Betri stjórn á auglýsingunum sem þú sérð</translation> <translation id="1475502736924165259">Þú ert með skráð vottorð sem passa ekki í aðra flokka</translation> @@ -1126,6 +1129,7 @@ <translation id="2044014337866019681">Gakktu úr skugga um að þú sért að staðfesta <ph name="ACCOUNT" /> til að taka lotuna úr lás.</translation> <translation id="204497730941176055">Sniðmátsheiti Microsoft-vottorðs</translation> <translation id="2045117674524495717">Flýtilyklahjálp</translation> +<translation id="2045211794962848221">Þú munt ekki sjá þessi skilaboð aftur</translation> <translation id="2045969484888636535">Halda áfram að útiloka fótspor</translation> <translation id="204622017488417136">Tækið verður fært aftur í áður uppsetta útgáfu af Chrome. Allir notendareikningar og staðbundin gögn verða fjarlægð. Ekki er hægt að afturkalla þessa aðgerð.</translation> <translation id="2046702855113914483">Ramen-núðlur</translation> @@ -3815,6 +3819,7 @@ <translation id="4594577641390224176">Ertu að leita að upplýsingasíðu kerfisins? Opna</translation> <translation id="4595560905247879544">Aðeins stjórnandinn (<ph name="CUSTODIAN_NAME" />) getur breytt forritum og viðbótum.</translation> <translation id="4596295440756783523">Þú ert með vottorð á skrá sem auðkenna þessa þjóna</translation> +<translation id="4598345735110653698">Stjórna aðgangslyklum</translation> <translation id="4598556348158889687">Stjórnun geymslu</translation> <translation id="4598776695426288251">Wi-Fi aðgengilegt gegnum mörg tæki</translation> <translation id="4601426376352205922">Merkja sem ólesið</translation> @@ -4040,6 +4045,7 @@ <translation id="4823894915586516138">Þetta PIN-númer eða aðgangsorð verndar gögnin þín í þessari <ph name="DEVICE_TYPE" />, þ.m.t. upplýsingar sem þú nálgast úr símanum.</translation> <translation id="4824037980212326045">Afritun og endurheimt í Linux</translation> <translation id="4824958205181053313">Hætta við samstillingu?</translation> +<translation id="4825532258163983651">Ekki tókst að eyða aðgangslykli</translation> <translation id="4827675678516992122">Tenging mistókst</translation> <translation id="4827784381479890589">Bætt villuleit í Chrome vafra (texti er sendur til Google til að fá tillögur að stafsetningu)</translation> <translation id="4827904420700932487">Búa til QR-kóða fyrir þessa mynd</translation> @@ -4302,6 +4308,7 @@ <translation id="5087249366037322692">Bætt við af þriðja aðila</translation> <translation id="5087580092889165836">Bæta við korti</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 með RSA-dulkóðun</translation> +<translation id="5089763948477033443">Stærðarhandfang hliðarglugga</translation> <translation id="5090637338841444533">Mega ekki fylgjast með stöðu myndavélarinnar</translation> <translation id="5093569275467863761">Undirrammi huliðsstillingar í skyndiminni til baka / áfram: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Þú getur opnað og breytt studdum skrám með þessu forriti úr forritinu „Skrár“ eða öðrum forritum. Til að stýra því hvaða skrár opna þetta forrit sjálfkrafa skaltu <ph name="BEGIN_LINK" />kynna þér hvernig sjálfgefin forrit eru sett upp í tækinu þínu<ph name="END_LINK" />.</translation> @@ -4467,6 +4474,7 @@ <translation id="5258992782919386492">Setja upp í þessu tæki</translation> <translation id="5260334392110301220">Sjálfvirkar gæsalappir</translation> <translation id="5260508466980570042">Því miður tókst ekki að staðfesta netfangið þitt eða aðgangsorðið. Reyndu aftur.</translation> +<translation id="5260958083445173099">Vefsvæði birta efni á kjörtungumálum ef mögulegt er</translation> <translation id="5261683757250193089">Opna í vefverslun</translation> <translation id="5262178194499261222">Fjarlægja aðgangsorð</translation> <translation id="5262784498883614021">Tengjast netkerfi sjálfkrafa</translation> @@ -4507,6 +4515,7 @@ <translation id="5294097441441645251">Verður að byrja á lágstaf eða undirstriki</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> notar innbyggðan skynjara til að greina fólk fyrir framan tækið þitt. Öll gögn eru meðhöndluð samstundis í tækinu þínu og þeim er svo eytt. Skynjaragögn eru aldrei send til Google. <ph name="LINK_BEGIN" />Nánar<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Fáðu raddsvörun svo þú getir notað tækið þitt án þess að horfa á skjáinn. Blindraleturssvörun er í boði með tengdu tæki.</translation> +<translation id="5297005732522718715">Endurnýja tjóðrunarstillingar</translation> <translation id="5297082477358294722">Aðgangsorðið var vistað. Þú getur skoðað og haft umsjón með vistuðum aðgangsorðum á <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Þegar einhver annar lítur á skjáinn hjá þér birtist augatáknið fyrir persónuvernd neðst til hægri á skjánum</translation> <translation id="5298219193514155779">Höfundur þema:</translation> @@ -4677,11 +4686,13 @@ <translation id="5466374726908360271">Lí&ma og leita að „<ph name="SEARCH_TERMS" />“</translation> <translation id="5467207440419968613">Lokaði á <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Leitar að skráageymslum</translation> +<translation id="5468330507528805311">Tjóðrunarstaða:</translation> <translation id="5468881191994555667">Velja skrá</translation> <translation id="5469852975082458401">Þú getur skoðað síður með textabendli. Ýttu á F7 til að slökkva.</translation> <translation id="5470735824776589490">Endurræsa þarf tækið áður er hægt er að endurstilla það með djúphreinsun. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hæ! Ég er talgervilsröddin þín.</translation> <translation id="5472627187093107397">Vista aðgangsorð fyrir þetta vefsvæði</translation> +<translation id="5473062644742711742">Finna fleiri aðgengisverkfæri í Vefverslun Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Með því að halda áfram samþykkirðu að þetta tæki geti sjálfkrafa sótt og sett upp uppfærslur og forrit frá Google, símafyrirtæki barnsins og framleiðanda tækisins, mögulega með því að nota farsímagögn. Einhver þessara forrita kunna að bjóða upp á innkaup í forriti.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN-númer verður að vera minnst einn stafur}one{PIN-númer verður að vera að minnst # stafur}other{PIN-númer verður að vera að minnst # stafir}}</translation> @@ -4952,6 +4963,7 @@ <translation id="5734362860645681824">Samskipti</translation> <translation id="5734697361979786483">Bæta samnýttri skráageymslu við</translation> <translation id="5736796278325406685">Sláðu inn gilt notendanafn</translation> +<translation id="5738093759615225354">Þú þarft þennan aðgangslykil til að skrá þig inn í tölvuna þína</translation> <translation id="5739017626473506901">Skráðu þig inn til að hjálpa <ph name="USER_NAME" /> að bæta við skólareikningi</translation> <translation id="5739235828260127894">Bíður eftir staðfestingu. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Mjög stórt</translation> @@ -5113,6 +5125,7 @@ <translation id="589541317545606110">Leita á síðu með <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Ekki leyfa</translation> <translation id="5900186025777217044">Smart Lock breyttist</translation> +<translation id="5900243355162006650">Tjóðrunarstilling:</translation> <translation id="5900302528761731119">Google prófílmynd</translation> <translation id="590036993063074298">Upplýsingar um gæði speglunar</translation> <translation id="5901069264981746702">Fingrafaragögnin þín eru í öruggri geymslu og fara aldrei út fyrir <ph name="DEVICE_TYPE" /> tækið þitt. <ph name="LINK_BEGIN" />Frekari upplýsingar<ph name="LINK_END" /></translation> @@ -5417,6 +5430,7 @@ <translation id="6196640612572343990">Loka á fótspor frá þriðja aðila</translation> <translation id="6196854373336333322">Viðbótin „<ph name="EXTENSION_NAME" />“ hefur tekið að sér stjórn yfir proxy-stillingunum þínum, sem þýðir að hún getur breytt, slitið eða hlerað allt sem þú gerir á netinu. Ef þú veist ekki hvernig þetta gerðist er þetta líklega eitthvað sem þú vilt ekki.</translation> <translation id="6197128521826316819">Búa til QR-kóða fyrir þessa síðu</translation> +<translation id="6197223946499512637">Þessir aðgangslyklar eru geymdir í Windows Hello í þessari tölvu. Þeir eru ekki vistaðir á Google reikningnum þínum.</translation> <translation id="6198252989419008588">Breyta PIN-númeri</translation> <translation id="6200047250927636406">Fleygja skrá</translation> <translation id="6200151268994853226">Stjórna viðbót</translation> @@ -5714,6 +5728,7 @@ <translation id="6482559668224714696">Stækkunargler á öllum skjánum</translation> <translation id="6483485061007832714">Opna niðurhal</translation> <translation id="6483805311199035658">Opnar <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Notaðu nýrri útgáfu af Windows til að stjórna aðgangslyklum</translation> <translation id="6488384360522318064">Velja tungumál</translation> <translation id="648927581764831596">Ekki í boði</translation> <translation id="6490471652906364588">USB-C-tæki (hægra tengi)</translation> @@ -6302,6 +6317,7 @@ <translation id="7029307918966275733">Crostini er ekki sett upp. Settu upp Crostini til að skoða einingar.</translation> <translation id="7029809446516969842">Aðgangsorð</translation> <translation id="7030304022046916278">Sendir vefslóðir til athugunar í öruggri vefskoðun</translation> +<translation id="7030695672997239647">Hægrismelltu á flipa og veldu „Bæta flipa við hóp“ og veldu síðan „Nýr hópur“</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – raðtengi tengt</translation> <translation id="7033616203784997570">Hámarkið er 62 stafir</translation> <translation id="7034692021407794547">Stjórnandi með heimild til að innheimta verður fyrst að samþykkja þjónustuskilmála Google Meet vélbúnaðar í hlutanum „Google Meet vélbúnaður“ á stjórnborði stjórnanda.</translation> @@ -7403,6 +7419,7 @@ <translation id="8101987792947961127">Djúphreinsunar er krafist við næstu endurræsingu</translation> <translation id="81020759409809034">Staðsetning staðar</translation> <translation id="8102139037507939978">Fjarlægja persónugreinanlegar upplýsingar úr system_logs.txt.</translation> +<translation id="810362914482827094">Leita að aðgangslyklum</translation> <translation id="8104088837833760645">Sækja eSIM-prófíl</translation> <translation id="8105368624971345109">Slökkva</translation> <translation id="8107015733319732394">Setur Google Play Store upp á <ph name="DEVICE_TYPE" />. Þetta gæti tekið nokkrar mínútur.</translation> @@ -7850,6 +7867,7 @@ <translation id="8557022314818157177">Haltu áfram að ýta á öryggislykilinn þinn þangað til fingrafarið greinist</translation> <translation id="8557180006508471423">Kveiktu á „Google Chrome“ í staðsetningarþjónustum Mac-tölvunnar</translation> <translation id="8557856025359704738">Næst verður hlaðið niður <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Aðgangslyklar</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Opna allt í &nýjum glugga}=1{Opna í &nýjum glugga}one{Opna allt ({COUNT}) í &nýjum glugga}other{Opna allt ({COUNT}) í &nýjum glugga}}</translation> <translation id="8561206103590473338">Fíll</translation> <translation id="8561565784790166472">Farðu varlega</translation> @@ -7976,6 +7994,7 @@ <translation id="8677212948402625567">Minnka allt...</translation> <translation id="867767487203716855">Næsta uppfærsla</translation> <translation id="8677859815076891398">Engin albúm. Búðu til albúm í <ph name="LINK_BEGIN" />Google myndum<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Endurræsa og fá sjálfvirkar uppfærslur</translation> <translation id="8678538439778360739">Gögnin voru dulkóðuð með aðgangsorði samstillingar <ph name="TIME" />. Þetta gildir ekki um greiðslumáta og heimilisföng á Google Pay.</translation> <translation id="8678582529642151449">Flipar minnka ekki</translation> <translation id="8678933587484842200">Hvernig á þetta forrit að opnast?</translation> @@ -8223,6 +8242,7 @@ <translation id="8910987510378294980">Fela tækjalista</translation> <translation id="8912362522468806198">Google reikningur</translation> <translation id="8912810933860534797">Kveikja á sjálfvirkri skönnun</translation> +<translation id="8915307125957890427">Hægrismelltu á flipa og veldu „Bæta flipa við hóp“ og veldu síðan „Nýr hópur“</translation> <translation id="8915370057835397490">Hleður tillögu</translation> <translation id="8916476537757519021">Huliðsundirrammi: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> @@ -8297,6 +8317,7 @@ <translation id="8986362086234534611">Gleyma</translation> <translation id="8986494364107987395">Senda sjálfkrafa talnagögn um notkun og tilkynningar um hrun til Google</translation> <translation id="8987927404178983737">Mánuður</translation> +<translation id="8989359959810288806">Endurnýja tjóðrunarstöðu</translation> <translation id="8991520179165052608">Vefsvæði getur notað hljóðnemann þinn</translation> <translation id="899384117894244799">Fjarlægja takmarkaðan notanda</translation> <translation id="899403249577094719">Grunnslóð Netscape-vottorðs</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 61e55c5a..7c700cc 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -4691,6 +4691,7 @@ <translation id="5470735824776589490">כדי לבצע איפוס באמצעות Powerwash, יש להפעיל תחילה את המכשיר מחדש. <ph name="LINK_BEGIN" />מידע נוסף<ph name="LINK_END" /></translation> <translation id="5471768120198416576">שלום. זהו הקול של המרת טקסט לדיבור.</translation> <translation id="5472627187093107397">שמירת סיסמאות עבור האתר הזה</translation> +<translation id="5473062644742711742">אפשר למצוא כלי נגישות נוספים בחנות האינטרנט של Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">המשך הפעולה מבטא את הסכמתך לכך שהמכשיר הזה יוכל גם להוריד ולהתקין עדכונים ואפליקציות באופן אוטומטי מ-Google, מהספק של הילד או הילדה שלך ומיצרן המכשיר, גם אם ייעשה לשם כך שימוש בחבילת הגלישה. חלק מהאפליקציות האלו עשויות להציע רכישות מתוך האפליקציה.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{קוד האימות חייב להיות באורך של תו אחד לפחות}two{קוד האימות חייב להיות באורך של # תווים לפחות}many{קוד האימות חייב להיות באורך של # תווים לפחות}other{קוד האימות חייב להיות באורך של # תווים לפחות}}</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index 396042e..52ba2b8e 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -679,7 +679,7 @@ <translation id="1637224376458524414">このブックマークは iPhone でも使用できます</translation> <translation id="1637350598157233081">パスワードはこのデバイスに保存されています</translation> <translation id="1637765355341780467">プロフィールを開こうとして問題が発生しました。一部の機能を使用できない可能性があります。</translation> -<translation id="1639239467298939599">読み込み中</translation> +<translation id="1639239467298939599">読み込んでいます</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> は現在のところ Linux アプリでは使用できません</translation> <translation id="1640283014264083726">PKCS #1 MD4 with RSA 暗号化</translation> <translation id="1641113438599504367">セーフ ブラウジング</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index d09bedc6..d7152566 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -7959,6 +7959,7 @@ <translation id="8666759526542103597">ბრაუზერზე დაფუძნებული რეკლამის პერსონალიზების შესახებ</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ახლა სრულეკრანიან რეჟიმშია და მაუსის კურსორი გამოირთო.</translation> <translation id="8667760277771450375">ჩვენ ვმუშაობთ ახალ ხერხებზე, რომელთა მეშვეობითაც შეიზღუდება საიტებს შორის თვალის მიდევნების მექანიზმები, საიტებს კი მაინც ექნება სარეკლამო სპამისა და თაღლითობის აღკვეთის შესაძლებლობა.</translation> +<translation id="8668378421690365723">თქვენმა მოწყობილობამ, შესაძლოა, სათანადოდ აღარ იმუშაოს, უსაფრთხოებასა და წარმადობასთან დაკავშირებით კი გარკვეული პრობლემები შეგექმნათ.</translation> <translation id="8669284339312441707">უფრო თბილი</translation> <translation id="8670537393737592796">აქ უფრო სწრაფად რომ დაბრუნდეთ ხოლმე, დააინსტალირეთ <ph name="APP_NAME" /> — ამისთვის დააწკაპუნეთ ინსტალაციის ღილაკზე</translation> <translation id="867085395664725367">წარმოიშვა სერვერთან დაკავშირებული დროებითი შეცდომა.</translation> @@ -8442,6 +8443,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />საუკეთესო შედეგების მისაღებად დააინსტალირეთ <ph name="DEVICE_OS" /> თქვენს შიდა დისკზე. მისი ინსტალაცია მოგვიანებითაც შეგიძლიათ შესვლის ეკრანიდან.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />თუ ინსტალაციისთვის მზად არ ხართ, საცდელად USB-დან მისი გაშვებაც შეგიძლიათ. ამ შემთხვევაში თქვენი არსებული ოპერაციული სისტემა და მონაცემები შენარჩუნდება, თუმცა შეიძლება მეხსიერებისა და წარმადობის ლიმიტები იხილოთ.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">გახსნა ჩამაგრებული ჩანართის სახით</translation> +<translation id="9123287046453017203">თქვენი მოწყობილობა არ არის განახლებული</translation> <translation id="9124003689441359348">შენახული პაროლები აქ გამოჩნდება</translation> <translation id="9126149354162942022">კურსორის ფერი</translation> <translation id="9128317794749765148">დაყენება ვერ შესრულდა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 985a1e2..9e2053d 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Микрофоныңыз бен камераңызды пайдалану</translation> <translation id="1005333234656240382">ADB түзетуін қосу қажет пе?</translation> <translation id="1006873397406093306">Бұл кеңейтім сайттардағы деректеріңізді оқуы және өзгертуі мүмкін. Кеңейтімнің қай сайттарға кіре алатынын басқаруыңызға болады.</translation> +<translation id="1007057452468855774">Google Play Store қызметін қосу</translation> <translation id="1008186147501209563">Бетбелгілерді экспорттау</translation> <translation id="1008557486741366299">Қазір емес</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> орны</translation> <translation id="1009663062402466586">Енді ойынның басқару элементтері қолжетімді</translation> <translation id="1010498023906173788">Бұл қойынды сериялық ұяшыққа жалғанған.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Бет жауап бермейді}other{Бет жауап бермейді}}</translation> +<translation id="1011003645819296594">Сақталған құрылғылар</translation> <translation id="1011355516189274711">Мәтінді дыбыстаудың дыбыс деңгейі</translation> <translation id="1012794136286421601">Docs, Sheets, Slides және Drawings файлдарыңыз синхрондалуда. Оларды желіде немесе желіден тыс пайдалану үшін Google Drive қолданбасын ашыңыз.</translation> <translation id="1012876632442809908">USB-C құрылғысы (алдыңғы ұяшық)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">Осы құрылғыны пайдалану</translation> <translation id="1470946456740188591">Перне арқылы қозғалу функциясын қосу немесе өшіру үшін Ctrl+Search+7 пернелер тіркесімін пайдаланыңыз.</translation> <translation id="1472675084647422956">Толық көрсету</translation> +<translation id="1473223074251193484">Тетеринг конфигурациясын орнату</translation> <translation id="1474785664565228650">Микрофонның параметріне өзгеріс енгізілгендіктен, Parallels Desktop қайта іске қосылуы қажет. Жалғастыру үшін Parallels Desktop қолданбасын қайта іске қосыңыз.</translation> <translation id="1474893630593443211">Көретін жарнамаларды көбірек бақылау</translation> <translation id="1475502736924165259">Файлда басқа ешбір санатқа сәйкес келмейтін сертификаттар бар</translation> @@ -1110,6 +1113,7 @@ <translation id="2044014337866019681">Сеанстың құлпын ашу үшін <ph name="ACCOUNT" /> аккаунтының расталғанын тексеріңіз.</translation> <translation id="204497730941176055">Microsoft Certificate Template Name</translation> <translation id="2045117674524495717">Пернелер тіркесімі бойынша көмекші</translation> +<translation id="2045211794962848221">Бұл арнайы хабар қайта көрсетілмейді.</translation> <translation id="2045969484888636535">Cookie файлдарына салынған тыйымды сақтау</translation> <translation id="204622017488417136">Құрылғыңыз бұрын орнатылған Chrome нұсқасына қайтарылады. Барлық пайдаланушы аккаунттары мен жергілікті деректер жойылады. Бұл әрекетті кері қайтару мүмкін емес.</translation> <translation id="2046702855113914483">Рамен</translation> @@ -3795,6 +3799,7 @@ <translation id="4594577641390224176">Жүйе туралы бетті іздеп жатырсыз ба? Келесіге бетке өтіңіз:</translation> <translation id="4595560905247879544">Қолданбалар мен кеңейтімдерді басқарушы (<ph name="CUSTODIAN_NAME" />) ғана өзгерте алады.</translation> <translation id="4596295440756783523">Файлда осы серверлерді анықтайтын сертификаттарыңыз бар</translation> +<translation id="4598345735110653698">Кіру кілттерін басқару</translation> <translation id="4598556348158889687">Жадты басқару</translation> <translation id="4598776695426288251">Wi-Fi желісі бірнеше құрылғыдан қолжетімді</translation> <translation id="4601426376352205922">Оқылмаған деп белгілеу</translation> @@ -4020,6 +4025,7 @@ <translation id="4823894915586516138">Бұл PIN коды немесе құпия сөз <ph name="DEVICE_TYPE" /> құрылғысындағы деректі, соның ішінде телефоннан пайдаланылатын барлық ақпаратты қорғайды.</translation> <translation id="4824037980212326045">Linux қолданбалары мен файлдарының сақтық көшірмесін жасау және оларды қалпына келтіру</translation> <translation id="4824958205181053313">Синхрондауды тоқтату қажет пе?</translation> +<translation id="4825532258163983651">Кіру кілтін жою мүмкін емес</translation> <translation id="4827675678516992122">Жалғанбады</translation> <translation id="4827784381479890589">Chrome браузеріндегі емле тексерісі жақсартылған (жазылу ұсыныстары үшін тексеру үшін мәтін Google-ға жіберіледі).</translation> <translation id="4827904420700932487">Осы суретке QR кодын жасау</translation> @@ -4282,6 +4288,7 @@ <translation id="5087249366037322692">Үшінші тарап қосқан</translation> <translation id="5087580092889165836">Несие картасын қосу</translation> <translation id="5088534251099454936">RSA шифрлауына ие PKCS #1 SHA-512</translation> +<translation id="5089763948477033443">Бүйірлік панельдің өлшемін өзгерту маркері</translation> <translation id="5090637338841444533">Камераңыздың орнын қадағалауға рұқсаты жоқтар</translation> <translation id="5093569275467863761">Алға-артқа өту кэшінде сақталған инкогнито ішкі жақтауы: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Қолдау көрсетілетін файлдарды осы қолданба арқылы Files қолданбасынан не басқа қолданбалар арқылы ашып, өңдей аласыз. Осы қолданбада қандай файлдардың әдепкісінше ашылатынын басқару үшін <ph name="BEGIN_LINK" />құрылғыңызда әдепкі қолданбалар орнату туралы толығырақ біліңіз<ph name="END_LINK" />.</translation> @@ -4447,6 +4454,7 @@ <translation id="5258992782919386492">Осы құрылғыда орнату</translation> <translation id="5260334392110301220">Смарт тырнақшалар</translation> <translation id="5260508466980570042">Кешіріңіз, электрондық поштаңызды немесе құпия сөзіңіз растау мүмкін болмады. Әрекетті қайталап көріңіз.</translation> +<translation id="5260958083445173099">Мүмкін болған кезде веб-сайттар мазмұнды өзіңізге ыңғайлы тілде көрсетіледі.</translation> <translation id="5261683757250193089">Веб-дүкеннен ашу</translation> <translation id="5262178194499261222">Құпия сөзді өшіру</translation> <translation id="5262784498883614021">Желіге автоматты қосылу</translation> @@ -4487,6 +4495,7 @@ <translation id="5294097441441645251">Кіші әріптен немесе астыңғы сызықтан басталуы тиіс.</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> құрылғысы экранның алдындағы адамды анықтау үшін ендірілген датчикті пайдаланады. Барлық дерек дереу өңделіп, кейін жойылады. Датчик деректері Google-ға ешқашан жіберілмейді. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Дауыстап айтылуын тыңдап, құрылғыны экранға қарамай пайдалана бересіз. Брайль қарібін жалғанған құрылғымен қолдануға болады.</translation> +<translation id="5297005732522718715">Тетеринг конфигурациясын жаңарту</translation> <translation id="5297082477358294722">Құпия сөз сақталды. Сақталған құпия сөздерді <ph name="SAVED_PASSWORDS_STORE" /> бетінен көріңіз және басқарыңыз.</translation> <translation id="5297946558563358707">Егер әлдебіреу экраныңызға қараса, экранның оң жақ төменгі бөлігінде көз белгішесі шығады.</translation> <translation id="5298219193514155779">Тақырыпты жасаған</translation> @@ -4657,11 +4666,13 @@ <translation id="5466374726908360271">"<ph name="SEARCH_TERMS" />" сұрауын қою және іздеу</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> бөгелді.</translation> <translation id="5468173180030470402">Ортақ каталогтер ізделіп жатыр.</translation> +<translation id="5468330507528805311">Тетеринг күйі:</translation> <translation id="5468881191994555667">Файлды таңдау</translation> <translation id="5469852975082458401">Мәтін курсорымен бір беттен екінші бетке өте аласыз. Оны өшіру үшін F7 пернесін басыңыз.</translation> <translation id="5470735824776589490">Powerwash арқылы қалпына келтіру үшін құрылғыңызды қайта іске қосу қажет. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Сәлеметсіз бе! Мен сізге мәтінді дыбыстап беремін.</translation> <translation id="5472627187093107397">Осы сайт үшін құпия сөздерді сақтау</translation> +<translation id="5473062644742711742">Chrome Web Store-дан басқа да арнайы мүмкіндік құралдарын табыңыз</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Жалғастыру арқылы бұл құрылғының жаңартылған нұсқаларды және қолданбаларды Google, балаңыздың операторы және осы құрылғы өндірушісінен автоматты түрде жүктеп алып орнатуына (мобильдік интернет арқылы болуы мүмкін) келісесіз. Бұл қолданбалардың кейбірінде ақылы мазмұн ұсынылуы мүмкін.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN коды кемі 1 таңбадан тұруы керек.}other{PIN коды ең кемі # таңбадан тұруы керек.}}</translation> @@ -4930,6 +4941,7 @@ <translation id="5734362860645681824">Байланыстар</translation> <translation id="5734697361979786483">Файл бөлісу функциясын қосу</translation> <translation id="5736796278325406685">Жарамды пайдаланушы атын енгізіңіз</translation> +<translation id="5738093759615225354">Компьютерде аккаунтқа кіру үшін осы кіру кілті қажет.</translation> <translation id="5739017626473506901">Балаңызға (<ph name="USER_NAME" />) оқу аккаунтын енгізуге көмектесіңіз.</translation> <translation id="5739235828260127894">Расталуы керек. <ph name="LINK_BEGIN" />Толығырақ ақпарат<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Тым үлкен</translation> @@ -5091,6 +5103,7 @@ <translation id="589541317545606110">Бетті <ph name="VISUAL_SEARCH_PROVIDER" /> арқылы іздеу</translation> <translation id="5896436821193322561">Рұқсат бермеу</translation> <translation id="5900186025777217044">Smart Lock өзгерді</translation> +<translation id="5900243355162006650">Тетеринг конфигурациясы:</translation> <translation id="5900302528761731119">Google профиль фотосуреті</translation> <translation id="590036993063074298">Экран көшірмесін көрсету сапасы туралы мәліметтер</translation> <translation id="5901069264981746702">Саусағыңыздың ізі туралы деректер қауіпсіз сақталған және <ph name="DEVICE_TYPE" /> құрылғысынан басқа ешқайда жіберілмейді. <ph name="LINK_BEGIN" />Толығырақ<ph name="LINK_END" /></translation> @@ -5394,6 +5407,7 @@ <translation id="6196640612572343990">Үшінші тарап cookie файлдарын бөгеу</translation> <translation id="6196854373336333322">«<ph name="EXTENSION_NAME" />» кеңейтімі прокси-сервер параметрлерін бақылауға алды, яғни сіздің онлайн орындайтын кез келген әрекетіңізді өзгерте, бұза немесе ұстап қала алады. Ондай бақылаудың жасалуын қаламасаңыз, кеңейтімді өшіргеніңіз жөн болар.</translation> <translation id="6197128521826316819">Осы бетке QR кодын жасау</translation> +<translation id="6197223946499512637">Бұл кіру кілттері осы компьютердегі Windows Hello қызметінде сақталған. Олар Google аккаунтыңызға сақталмаған.</translation> <translation id="6198252989419008588">PIN кодын өзгерту</translation> <translation id="6200047250927636406">Файлды қабылдамау</translation> <translation id="6200151268994853226">Кеңейтімді басқару</translation> @@ -5691,6 +5705,7 @@ <translation id="6482559668224714696">Толық экран ұлғайтқышы</translation> <translation id="6483485061007832714">Жүктеп алынған файлды ашу</translation> <translation id="6483805311199035658"><ph name="FILE" /> ашылуда…</translation> +<translation id="6486301003991593638">Кіру кілттерін басқару үшін Windows жүйесінің жаңарақ нұсқасын пайдаланыңыз.</translation> <translation id="6488384360522318064">Тілді таңдау</translation> <translation id="648927581764831596">Жоқ</translation> <translation id="6490471652906364588">USB-C құрылғысы (оң жақ ұяшық)</translation> @@ -6277,6 +6292,7 @@ <translation id="7029307918966275733">Crostini орнатылмаған. Балансты көру үшін Crostini қолданбасын орнатыңыз.</translation> <translation id="7029809446516969842">Құпия сөздер</translation> <translation id="7030304022046916278">URL сілтемелерін тексеру үшін Safe Browsing қызметіне жібереді.</translation> +<translation id="7030695672997239647">Қойындыны тінтуірдің оң жақ түймесімен басып, "Қойындыны топқа қосу" түймесін, одан кейін "Жаңа топ" түймесін таңдаңыз.</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – сериялық ұяшық жалғанған.</translation> <translation id="7033616203784997570">62 таңбадан аспауы керек.</translation> <translation id="7034692021407794547">Төлемдерді басқару құқығы бар әкімші, алдымен Әкімші консолінің "Google Meet жабдығы" бөлімінде Google Meet жабдығының Қызмет көрсету шарттарын қабылдауы керек.</translation> @@ -7377,6 +7393,7 @@ <translation id="8101987792947961127">Келесі қайта жүктеу кезінде Powerwash қажет</translation> <translation id="81020759409809034">Құрылғыдағы орны</translation> <translation id="8102139037507939978">Жеке тұлғаны анықтау ақпаратын system_logs.txt файлынан өшіру.</translation> +<translation id="810362914482827094">Кіру кілттерінен іздеу</translation> <translation id="8104088837833760645">eSIM профилін жүктеп алу</translation> <translation id="8105368624971345109">Өшіру</translation> <translation id="8107015733319732394">Google Play Store дүкені <ph name="DEVICE_TYPE" /> құрылғысына орнатылуда. Бұл бірнеше минут алады.</translation> @@ -7824,6 +7841,7 @@ <translation id="8557022314818157177">Саусақ ізі түскенше, қауіпсіздік кілтін басып тұрыңыз.</translation> <translation id="8557180006508471423">Mac құрылғысының "Локация қызметтері" бөлімінен Google Chrome-ды қосыңыз</translation> <translation id="8557856025359704738">Келесі жүктеп алу күні: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Кіру кілттері</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Барлығын &жаңа терезеден ашу}=1{&Жаңа терезеден ашу}other{Барлығын ({COUNT}) &жаңа терезеден ашу}}</translation> <translation id="8561206103590473338">Піл</translation> <translation id="8561565784790166472">Жалғастыратын болсаңыз, абайлаңыз</translation> @@ -7950,6 +7968,7 @@ <translation id="8677212948402625567">Барлығын жию…</translation> <translation id="867767487203716855">Келесі жаңарту</translation> <translation id="8677859815076891398">Альбомдар жоқ. <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /> қызметінде альбом жасаңыз.</translation> +<translation id="8678378565142776698">Өшіріп қосу және автоматты жаңартылған нұсқа алу</translation> <translation id="8678538439778360739">Деректер <ph name="TIME" /> күні сақталған синхрондау құпия фразаңызбен шифрланған. Google Pay қызметіндегі төлеу әдістері мен мекенжайлар құпия фразамен шифрланбайды.</translation> <translation id="8678582529642151449">қойындылар кішіреймейді</translation> <translation id="8678933587484842200">Бұл қолданбаны қалай іске қосқыңыз келеді?</translation> @@ -8196,6 +8215,7 @@ <translation id="8910987510378294980">Құрылғылар тізімін жасыру</translation> <translation id="8912362522468806198">Google аккаунты</translation> <translation id="8912810933860534797">Автоматты түрде іздеу функциясын қосу</translation> +<translation id="8915307125957890427">Қойындыны тінтуірдің оң жақ түймесімен басып, "Қойындыны топқа қосу" түймесін, одан кейін "Жаңа топ" түймесін таңдаңыз.</translation> <translation id="8915370057835397490">Ұсынысты жүктеу</translation> <translation id="8916476537757519021">Инкогнито режиміндегі ішкі жақтау: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> иелік ететін <ph name="DEVICE_TYPE" /></translation> @@ -8270,6 +8290,7 @@ <translation id="8986362086234534611">Ұмыту</translation> <translation id="8986494364107987395">Қолданыс статистикасы мен жаңылыс туралы есептерді Google компаниясына автоматты түрде жіберу</translation> <translation id="8987927404178983737">Ай</translation> +<translation id="8989359959810288806">Тетеринг күйін жаңарту</translation> <translation id="8991520179165052608">Сайт микрофонды пайдалана алады</translation> <translation id="899384117894244799">Шектелген пайдаланушыны өшіру</translation> <translation id="899403249577094719">Netscape сертификатының негізгі URL мекенжайы</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 7bb9c47..fc13521 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ប្រើម៉ៃក្រូហ្វូន និងកាមេរ៉ារបស់អ្នក</translation> <translation id="1005333234656240382">បើកការជួសជុល ADB ឬ?</translation> <translation id="1006873397406093306">កម្មវិធីបន្ថែមនេះអាចអាន និងប្ដូរទិន្នន័យរបស់អ្នកនៅលើគេហទំព័រ។ អ្នកអាចគ្រប់គ្រងគេហទំព័រណា ដែលកម្មវិធីបន្ថែមអាចចូលប្រើបាន។</translation> +<translation id="1007057452468855774">បើក Google Play Store</translation> <translation id="1008186147501209563">នាំចេញចំណាំ</translation> <translation id="1008557486741366299">មិនមែនឥឡូវនេះទេ</translation> <translation id="1009476156254802388">ទីតាំង <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">ឥឡូវនេះ មានការបញ្ជាហ្គេមហើយ</translation> <translation id="1010498023906173788">ផ្ទាំងនេះត្រូវបានភ្ជាប់ទៅរន្ធស៊េរី។</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{ទំព័រមិនឆ្លើយតបទេ}other{ទំព័រមិនឆ្លើយតបទេ}}</translation> +<translation id="1011003645819296594">ឧបករណ៍ដែលបានរក្សាទុក</translation> <translation id="1011355516189274711">កម្រិតសំឡេងបំប្លែងអត្ថបទទៅជាការនិយាយ</translation> <translation id="1012794136286421601">ឯកសារ តារាងបញ្ជី ស្លាយ៍ និងឯកសារគំនូររបស់អ្នកកំពុងត្រូវបានធ្វើសមកម្ម។ បើកកម្មវិធី Google Drive ដើម្បីចូលប្រើពួកវានៅលើអ៊ីនធឺណិត ឬនៅក្រៅបណ្តាញ។</translation> <translation id="1012876632442809908">ឧបករណ៍ USB-C (រន្ធខាងមុខ)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">ប្រើឧបករណ៍នេះ</translation> <translation id="1470946456740188591">ដើម្បីបើក ឬបិទមុខងារ caret browsing សូមប្រើផ្លូវកាត់ Ctrl+Search+7</translation> <translation id="1472675084647422956">បង្ហាញច្រើនទៀត</translation> +<translation id="1473223074251193484">កំណត់ការកំណត់រចនាសម្ព័ន្ធនៃការភ្ជាប់</translation> <translation id="1474785664565228650">ការផ្លាស់ប្ដូរនៅក្នុងការកំណត់មីក្រូហ្វូនតម្រូវឱ្យចាប់ផ្ដើម Parallels Desktop ឡើងវិញ។ ចាប់ផ្ដើម Parallels Desktop ឡើងវិញ ដើម្បីបន្ត។</translation> <translation id="1474893630593443211">ការគ្រប់គ្រងបន្ថែមលើការផ្សាយពាណិជ្ជកម្មដែលអ្នកមើលឃើញ</translation> <translation id="1475502736924165259">អ្នកមានវិញ្ញាបនបត្រនៅលើឯកសារដែលមិនសមនឹងប្រភេទដ៏ទៃទៀត</translation> @@ -1125,6 +1128,7 @@ <translation id="2044014337866019681">សូមប្រាកដថា អ្នកកំពុងផ្ទៀងផ្ទាត់ <ph name="ACCOUNT" /> ដើម្បីដោះសោវគ្គនេះ។</translation> <translation id="204497730941176055">ឈ្មោះពុម្ពវិញ្ញាបនប័ត្រ Microsoft</translation> <translation id="2045117674524495717">ឧបករណ៍ជំនួយផ្លូវកាត់ក្ដារចុច</translation> +<translation id="2045211794962848221">អ្នកនឹងមិនឃើញសារជាក់លាក់នេះម្ដងទៀតទេ</translation> <translation id="2045969484888636535">បន្តរារាំងខុកឃី</translation> <translation id="204622017488417136">ឧបករណ៍របស់អ្នកនឹងត្រូវបានត្រលប់ទៅកំណែ Chrome ដែលបានតំឡើងពីមុនវិញ។ គណនីអ្នកប្រើទាំងអស់ និងទិន្នន័យមូលដ្ឋាននឹងត្រូវបានយកចេញ។ វាមិនអាចបកក្រោយបានទេ។</translation> <translation id="2046702855113914483">មីរ៉ាមេន</translation> @@ -3814,6 +3818,7 @@ <translation id="4594577641390224176">កំពុងរកមើលទំព័រ "អំពី" របស់ប្រព័ន្ធឬ? ចូលមើល</translation> <translation id="4595560905247879544">កម្មវិធី និងផ្នែកបន្ថែមអាចកែសម្រួលបានដោយអ្នកគ្រប់គ្រងតែប៉ុណ្ណោះ (<ph name="CUSTODIAN_NAME" />)។</translation> <translation id="4596295440756783523">អ្នកមានវិញ្ញាបនបត្រនៅលើឯកសារដែលកំណត់អត្តសញ្ញាណម៉ាស៊ីនមេទាំងនេះ</translation> +<translation id="4598345735110653698">គ្រប់គ្រងកូដសម្ងាត់</translation> <translation id="4598556348158889687">ការគ្រប់គ្រងទំហំផ្ទុក</translation> <translation id="4598776695426288251">មាន Wi-Fi តាមរយៈឧបករណ៍ជាច្រើន</translation> <translation id="4601426376352205922">សម្គាល់ថាមិនទាន់អាន</translation> @@ -4039,6 +4044,7 @@ <translation id="4823894915586516138">កូដ PIN ឬពាក្យសម្ងាត់នេះការពារទិន្នន័យរបស់អ្នកនៅលើ <ph name="DEVICE_TYPE" /> នេះ រួមទាំងព័ត៌មានទាំងឡាយដែលអ្នកចូលប្រើប្រាស់ពីទូរសព្ទរបស់អ្នក</translation> <translation id="4824037980212326045">ការបម្រុងទុក និងការស្ដារ Linux</translation> <translation id="4824958205181053313">បោះបង់ការធ្វើសមកាលកម្ម?</translation> +<translation id="4825532258163983651">មិនអាចលុបកូដសម្ងាត់បានទេ</translation> <translation id="4827675678516992122">មិនអាចភ្ជាប់បានទេ</translation> <translation id="4827784381479890589">បានបើកការពិនិត្យអក្ខរាវិរុទ្ធនៅក្នុងកម្មវិធីរុករកតាមអ៊ីនធឺណិត Chrome (អត្ថបទត្រូវបានផ្ញើទៅ Google ដើម្បីទទួលបានការណែនាំអំពីអក្ខរាវិរុទ្ធ)</translation> <translation id="4827904420700932487">បង្កើតកូដ QR សម្រាប់រូបភាពនេះ</translation> @@ -4301,6 +4307,7 @@ <translation id="5087249366037322692">បានបន្ថែមដោយភាគីទីបី</translation> <translation id="5087580092889165836">បន្ថែមកាត</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 ជាមួយនឹងការអ៊ិនគ្រីប RSA</translation> +<translation id="5089763948477033443">ដងប្ដូរទំហំផ្ទាំងចំហៀង</translation> <translation id="5090637338841444533">មិនអនុញ្ញាតឱ្យតាមដានទីតាំងកាមេរ៉ារបស់អ្នកទេ</translation> <translation id="5093569275467863761">ស៊ុមរងឯកជនដែលបានរក្សាទុកក្នុងឃ្លាំងបម្រុងទុកទំព័រក្នុងសភាពដើមទាំងស្រុង៖ <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">អ្នកអាចបើក និងកែឯកសារដែលអាចប្រើបានជាមួយកម្មវិធីនេះពីកម្មវិធី Files ឬកម្មវិធីផ្សេងទៀត។ ដើម្បីគ្រប់គ្រងថាឯកសារណាខ្លះដែលបើកកម្មវិធីនេះតាមលំនាំដើម <ph name="BEGIN_LINK" />សូមស្វែងយល់ពីរបៀបកំណត់កម្មវិធីលំនាំដើមនៅលើឧបករណ៍របស់អ្នក<ph name="END_LINK" />។</translation> @@ -4466,6 +4473,7 @@ <translation id="5258992782919386492">ដំឡើងនៅលើឧបករណ៍នេះ</translation> <translation id="5260334392110301220">សម្រង់សម្ដីឆ្លាតវៃ</translation> <translation id="5260508466980570042">សូមទោស អ៊ីមែល ឫ ពាក្យសម្ងាត់របស់អ្នកមិនអាចផ្ទៀងផ្ទាត់បានទេ។ សូមព្យាយាមម្តងទៀត។</translation> +<translation id="5260958083445173099">គេហទំព័រនឹងបង្ហាញខ្លឹមសារជាភាសាដែលអ្នកចង់បាន នៅពេលដែលអាច</translation> <translation id="5261683757250193089">បើកនៅក្នុង Web Store</translation> <translation id="5262178194499261222">លុបពាក្យសម្ងាត់</translation> <translation id="5262784498883614021">ភ្ជាប់បណ្ដាញដោយស្វ័យប្រវត្តិ</translation> @@ -4506,6 +4514,7 @@ <translation id="5294097441441645251">ត្រូវតែចាប់ផ្ដើមដោយតួអក្សរតូច ឬសញ្ញា (_)</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> របស់អ្នកប្រើឧបករណ៍ចាប់សញ្ញាដែលភ្ជាប់មកជាមួយស្រាប់ ដើម្បីចាប់ដឹងថាមានមនុស្សនៅពីមុខឧបករណ៍របស់អ្នក។ ទិន្នន័យទាំងអស់ត្រូវបានដំណើរការនៅលើឧបករណ៍របស់អ្នកភ្លាមៗ បន្ទាប់មកត្រូវបានលុប។ ទិន្នន័យឧបករណ៍ចាប់សញ្ញាមិនត្រូវបានផ្ញើទៅ Google ទេ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ស្ដាប់ការអានអេក្រង់ ដើម្បីឱ្យអ្នកអាចប្រើប្រាស់ឧបករណ៍របស់អ្នក ដោយមិនចាំបាច់មើលអេក្រង់។ ការអានអក្សរស្ទាបអាចប្រើបានជាមួយឧបករណ៍ដែលបានភ្ជាប់។</translation> +<translation id="5297005732522718715">ផ្ទុកការកំណត់រចនាសម្ព័ន្ធនៃការភ្ជាប់ឡើងវិញ</translation> <translation id="5297082477358294722">បានរក្សាទុកពាក្យសម្ងាត់។ សូមមើល និងគ្រប់គ្រងពាក្យសម្ងាត់ដែលបានរក្សាទុកនៅក្នុង <ph name="SAVED_PASSWORDS_STORE" /> របស់អ្នក។</translation> <translation id="5297946558563358707">នៅពេលនរណាម្នាក់ផ្សេងទៀតមើលទៅអេក្រង់របស់អ្នក សូមបង្ហាញរូបភ្នែកឯកជនភាពនៅខាងក្រោមផ្នែកខាងស្ដាំនៃអេក្រង់របស់អ្នក</translation> <translation id="5298219193514155779">ធីមបានបង្កើតដោយ</translation> @@ -4676,6 +4685,7 @@ <translation id="5466374726908360271">ដាក់ចូល ហើយស្វែងរក “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">បានទប់ស្កាត់ <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">កំពុងរកមើលឧបករណ៍ចែករំលែកឯកសារ</translation> +<translation id="5468330507528805311">ស្ថានភាពនៃការភ្ជាប់៖</translation> <translation id="5468881191994555667">ជ្រើសរើសឯកសារ</translation> <translation id="5469852975082458401">អ្នកអាចរុករកទំព័រដោយប្រើទស្សន៍ទ្រនិចអក្សរ។ សូមចុច F7 ដើម្បីបិទ។</translation> <translation id="5470735824776589490">តម្រូវឱ្យចាប់ផ្តើមឡើងវិញ មុនពេលអាចកំណត់ឧបករណ៍របស់អ្នកឡើងវិញដោយប្រើ Powerwash។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> @@ -4953,6 +4963,7 @@ <translation id="5734362860645681824">ការប្រាស្រ័យទាក់ទង</translation> <translation id="5734697361979786483">បញ្ចូលឧបករណ៍ចែករំលែកឯកសារ</translation> <translation id="5736796278325406685">សូមបញ្ចូលឈ្មោះអ្នកប្រើប្រាស់ដែលត្រឹមត្រូវ</translation> +<translation id="5738093759615225354">អ្នកត្រូវការកូដសម្ងាត់នេះ ដើម្បីចូលកុំព្យូទ័ររបស់អ្នក</translation> <translation id="5739017626473506901">ចូលគណនី ដើម្បីជួយ <ph name="USER_NAME" /> ក្នុងការបញ្ចូលគណនីសាលារៀន</translation> <translation id="5739235828260127894">កំពុងរង់ចាំធ្វើការផ្ទៀងផ្ទាត់។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ធំខ្លាំង</translation> @@ -5114,6 +5125,7 @@ <translation id="589541317545606110">ស្វែងរកទំព័រដោយប្រើ <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">មិនអនុញ្ញាត</translation> <translation id="5900186025777217044">Smart Lock បានផ្លាស់ប្ដូរ</translation> +<translation id="5900243355162006650">ការកំណត់រចនាសម្ព័ន្ធនៃការភ្ជាប់៖</translation> <translation id="5900302528761731119">រូបថត Google ទម្រង់</translation> <translation id="590036993063074298">ព័ត៌មានលម្អិតអំពីគុណភាពនៃការបញ្ចាំង</translation> <translation id="5901069264981746702">ទិន្នន័យស្នាមម្រាមដៃរបស់អ្នកត្រូវបានរក្សាទុកយ៉ាងមានសុវត្ថិភាព និងមិនចេញពី <ph name="DEVICE_TYPE" /> របស់អ្នកឡើយ។ <ph name="LINK_BEGIN" />ស្វែងយល់បន្ថែម<ph name="LINK_END" /></translation> @@ -5418,6 +5430,7 @@ <translation id="6196640612572343990">រារាំងខូគីភាគីទីបី</translation> <translation id="6196854373336333322">កម្មវិធីបន្ថែម "<ph name="EXTENSION_NAME" />" បានគ្រប់គ្រងការកំណត់ប្រូកស៊ីរបស់អ្នក មានន័យថាវាអាចប្តូរ បំបែក និងលួចតាមដានអ្វីទាំងអស់ដែលអ្នកធ្វើនៅលើអ៊ីនធឺណិត។ ប្រសិនបើអ្នកមិនប្រាកដថាហេតុអ្វីការប្តូរនេះបានកើតឡើង អ្នកប្រហែលជាមិនចង់បានវាទេ។</translation> <translation id="6197128521826316819">បង្កើតកូដ QR សម្រាប់ទំព័រនេះ</translation> +<translation id="6197223946499512637">កូដសម្ងាត់ទាំងនេះត្រូវបានរក្សាទុកក្នុង Windows Hello នៅលើកុំព្យូទ័រនេះ។ កូដសម្ងាត់ទាំងនេះមិនត្រូវបានរក្សាទុកទៅគណនី Google របស់អ្នកទេ។</translation> <translation id="6198252989419008588">ប្តូរលេខសម្គាល់</translation> <translation id="6200047250927636406">លុបចោលឯកសារ</translation> <translation id="6200151268994853226">គ្រប់គ្រងកម្មវិធីបន្ថែម</translation> @@ -5715,6 +5728,7 @@ <translation id="6482559668224714696">កែវពង្រីកពេញអេក្រង់</translation> <translation id="6483485061007832714">បើកការទាញយក</translation> <translation id="6483805311199035658">កំពុងបើក <ph name="FILE" />...</translation> +<translation id="6486301003991593638">ដើម្បីគ្រប់គ្រងកូដសម្ងាត់ សូមប្រើកំណែ Windows ថ្មីជាងនេះ</translation> <translation id="6488384360522318064">ជ្រើសរើសភាសា</translation> <translation id="648927581764831596">មិនមានអ្វីនៅទីនេះទេ</translation> <translation id="6490471652906364588">ឧបករណ៍ USB-C (រន្ធខាងស្តាំ)</translation> @@ -6301,6 +6315,7 @@ <translation id="7029307918966275733">Crostini មិនត្រូវបានដំឡើងទេ។ សូមដំឡើង Crostini ដើម្បីមើលបញ្ជីឈ្មោះអ្នកបង្កើត។</translation> <translation id="7029809446516969842">ពាក្យសម្ងាត់</translation> <translation id="7030304022046916278">បញ្ជូន URL ទៅការរុករកដោយសុវត្ថិភាព ដើម្បីពិនិត្យមើល</translation> +<translation id="7030695672997239647">ចុចកណ្ដុរខាងស្ដាំលើផ្ទាំងណាមួយ រួចជ្រើសរើស "បញ្ចូលផ្ទាំងទៅក្រុម" រួចហើយជ្រើសរើស "ក្រុមថ្មី"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" />៖ បានភ្ជាប់រន្ធស៊េរី</translation> <translation id="7033616203784997570">អក្សរបញ្ចូលត្រូវមានច្រើនបំផុត 62 តួ</translation> <translation id="7034692021407794547">អ្នកគ្រប់គ្រងដែលមានសិទ្ធិគ្រប់គ្រងការទូទាត់វិក្កយបត្រត្រូវតែទទួលយកលក្ខខណ្ឌប្រើប្រាស់ហាតវែរ Google Meet ជាមុនសិន នៅក្នុងផ្នែកហាតវែរ Google Meet នៃកុងសូលអ្នកគ្រប់គ្រង។</translation> @@ -7402,6 +7417,7 @@ <translation id="8101987792947961127">តម្រូវឲ្យមាន Powerwash នៅលើពេលបិទបើកដំណើរការឡើងវិញនៅពេលបន្ទាប់</translation> <translation id="81020759409809034">ទីតាំងក្នុងឧបករណ៍</translation> <translation id="8102139037507939978">លុបព័ត៌មានបញ្ជាក់អត្តសញ្ញាណបុគ្គលពី system_logs.txt។</translation> +<translation id="810362914482827094">ស្វែងរកកូដសម្ងាត់</translation> <translation id="8104088837833760645">ទាញយកកម្រងព័ត៌មាន eSIM</translation> <translation id="8105368624971345109">បិទ</translation> <translation id="8107015733319732394">កំពុងដំឡើង Google Play Store នៅលើ <ph name="DEVICE_TYPE" /> របស់អ្នក។ វាអាចចំណាយពេលពីរបីនាទី។</translation> @@ -7850,6 +7866,7 @@ <translation id="8557022314818157177">បន្តចុចសោសុវត្ថិភាព រហូតទាល់តែថតបានស្នាមម្រាមដៃរបស់អ្នក</translation> <translation id="8557180006508471423">បើក "Google Chrome" នៅក្នុងសេវាកម្មទីតាំងនៅលើ Mac របស់អ្នក</translation> <translation id="8557856025359704738">ការទាញយកបន្ទាប់គឺនៅ <ph name="NEXT_DATE_DOWNLOAD" />។</translation> +<translation id="8559858985063901027">កូដសម្ងាត់</translation> <translation id="8560327176991673955">{COUNT,plural, =0{បើកទាំងអស់នៅក្នុង&វិនដូថ្មី}=1{បើកនៅក្នុង&វិនដូថ្មី}other{បើកទាំងអស់ ({COUNT}) នៅក្នុង&វិនដូថ្មី}}</translation> <translation id="8561206103590473338">ដំរី</translation> <translation id="8561565784790166472">បន្តដោយប្រុងប្រយ័ត្ន</translation> @@ -7962,6 +7979,7 @@ <translation id="8666759526542103597">អំពីការកំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យស្របតាមបុគ្គលដោយផ្អែកលើកម្មវិធីរុករកតាមអ៊ីនធឺណិត</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> ឥឡូវនេះពេញអេក្រង់ហើយ ហើយបានបិទដំណើរការសញ្ញាព្រួញរបស់អ្នក។</translation> <translation id="8667760277771450375">យើងកំពុងរុករកវិធីក្នុងការរឹតបន្តឹងការប្រមូលទិន្នន័យរុករកនៅលើគេហទំព័រនានា ដោយផ្ដល់លទ្ធភាពឱ្យគេហទំព័របញ្ឈប់ការគៃបន្លំ និងសារឥតបានការនៅក្នុងការផ្សាយពាណិជ្ជកម្ម។</translation> +<translation id="8668378421690365723">ឧបករណ៍របស់អ្នកប្រហែលជាលែងដំណើរការត្រឹមត្រូវទៀតហើយ និងប្រហែលជាជួបបញ្ហាពាក់ព័ន្ធនឹងសុវត្ថិភាព និងប្រតិបត្តិការ។</translation> <translation id="8669284339312441707">កាន់តែលឿង</translation> <translation id="8670537393737592796">ដើម្បីត្រឡប់មកទីនេះវិញឱ្យបានរហ័ស សូមដំឡើង <ph name="APP_NAME" /> ដោយចុចប៊ូតុងដំឡើង</translation> <translation id="867085395664725367">ម៉ាស៊ីនមេមានបញ្ហាជាបណ្ដោះអាសន្ន។</translation> @@ -7976,6 +7994,7 @@ <translation id="8677212948402625567">បង្រួមចូលទាំងអស់...</translation> <translation id="867767487203716855">ការដំឡើងកំណែបន្ទាប់</translation> <translation id="8677859815076891398">គ្មានអាល់ប៊ុមទេ។ សូមបង្កើតអាល់ប៊ុមនៅក្នុង <ph name="LINK_BEGIN" />Google រូបថត<ph name="LINK_END" />។</translation> +<translation id="8678378565142776698">ចាប់ផ្ដើមឡើងវិញ និងទទួលបានការដំឡើងកំណែដោយស្វ័យប្រវត្តិ</translation> <translation id="8678538439778360739">ទិន្នន័យត្រូវបានអ៊ីនគ្រីបដោយប្រើឃ្លាសម្ងាត់សមកាលកម្មរបស់អ្នកនៅថ្ងៃទី <ph name="TIME" />។ ទិន្នន័យនេះមិនរួមបញ្ចូលអាសយដ្ឋាន និងវិធីបង់ប្រាក់ពី Google Pay ទេ។</translation> <translation id="8678582529642151449">ផ្ទាំងមិនបង្រួមទេ</translation> <translation id="8678933587484842200">តើអ្នកចង់ឱ្យកម្មវិធីនេះចាប់ផ្តើមយ៉ាងដូចម្តេច?</translation> @@ -8222,6 +8241,7 @@ <translation id="8910987510378294980">លាក់បញ្ជីឧបករណ៍</translation> <translation id="8912362522468806198">គណនី Google</translation> <translation id="8912810933860534797">បើកការស្កេនស្វ័យប្រវត្តិ</translation> +<translation id="8915307125957890427">ចុចកណ្ដុរខាងស្ដាំលើផ្ទាំងណាមួយ រួចជ្រើសរើស "បញ្ចូលផ្ទាំងទៅក្រុម" រួចហើយជ្រើសរើស "ក្រុមថ្មី"</translation> <translation id="8915370057835397490">កំពុងដំណើរការការផ្តល់យោបល់</translation> <translation id="8916476537757519021">ហ្វ្រេមរងអនាមិក៖ <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> របស់ <ph name="GIVEN_NAME" /></translation> @@ -8296,6 +8316,7 @@ <translation id="8986362086234534611">បំភ្លេច</translation> <translation id="8986494364107987395">ផ្ញើស្ថិតិការប្រើប្រាស់ និងរបាយការណ៍ការគាំងទៅ Google ដោយស្វ័យប្រវត្តិ</translation> <translation id="8987927404178983737">ខែ</translation> +<translation id="8989359959810288806">ផ្ទុកស្ថានភាពនៃការភ្ជាប់ឡើងវិញ</translation> <translation id="8991520179165052608">ទំព័រអាចប្រើមីក្រូហ្វូនរបស់អ្នកបាន</translation> <translation id="899384117894244799">ដកអ្នកប្រើប្រាស់ដែលត្រូវបានរឹតបន្តឹងចេញ</translation> <translation id="899403249577094719">URL វិញ្ញាបនប័ត្រគោល Netscape</translation> @@ -8442,6 +8463,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />ដើម្បីទទួលបានបទពិសោធន៍ប្រើប្រាស់ល្អបំផុត សូមដំឡើង <ph name="DEVICE_OS" /> នៅក្នុងថាសខាងក្នុងរបស់អ្នក។ អ្នកក៏អាចដំឡើងវានៅពេលក្រោយពីអេក្រង់ចូលបានផងដែរ។<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />ប្រសិនបើអ្នកមិនទាន់អាចដំឡើងបាននៅឡើយទេ អ្នកអាចដំណើរការពី USB ដើម្បីសាកល្បងវា។ ការធ្វើបែបនេះនឹងរក្សាទិន្នន័យ និងប្រព័ន្ធប្រតិបត្តិការដែលមានស្រាប់របស់អ្នក ប៉ុន្តែអ្នកអាចជួបប្រទះការកំហិតលើប្រតិបត្តិការ និងទំហំផ្ទុក។<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">បើកជាផ្ទាំងដែលបានដៅ</translation> +<translation id="9123287046453017203">ឧបករណ៍របស់អ្នកមិនមានបច្ចុប្បន្នភាពទេ</translation> <translation id="9124003689441359348">ពាក្យសម្ងាត់ដែលបានរក្សាទុកនឹងបង្ហាញនៅទីនេះ</translation> <translation id="9126149354162942022">ពណ៌ទស្សន៍ទ្រនិច</translation> <translation id="9128317794749765148">មិនអាចបញ្ចប់ការរៀបចំបានទេ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index 1071f80..d6757735 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -4685,6 +4685,7 @@ <translation id="5470735824776589490">ಪವರ್ವಾಶ್ ಮೂಲಕ ನಿಮ್ಮ ಸಾಧನವನ್ನು ಮರುಹೊಂದಿಸುವ ಮೊದಲು ಮರುಪ್ರಾರಂಭಿಸುವ ಅಗತ್ಯವಿದೆ. <ph name="LINK_BEGIN" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">ನಮಸ್ಕಾರ! ನಾನು ನಿಮ್ಮ ಪಠ್ಯದಿಂದ ಧ್ವನಿಯ ಧ್ವನಿ.</translation> <translation id="5472627187093107397">ಈ ಸೈಟ್ಗಾಗಿ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿ</translation> +<translation id="5473062644742711742">Chrome ವೆಬ್ ಸ್ಟೋರ್ನಲ್ಲಿ ಹೆಚ್ಚಿನ ಆ್ಯಕ್ಸೆಸ್ಸಿಬಿಲಿಟಿ ಟೂಲ್ಗಳನ್ನು ಹುಡುಕಿ</translation> <translation id="5473075389972733037">ಐಬಿಎಮ್</translation> <translation id="5473099001878321374">ಮುಂದುವರೆಯುವ ಮೂಲಕ, ಈ ಸಾಧನವು ಸಂಭಾವ್ಯವಾಗಿ ಸೆಲ್ಯುಲರ್ ಡೇಟಾ ಬಳಸಿಕೊಂಡು Google ನಿಂದ, ನಿಮ್ಮ ಮಗುವಿನ ವಾಹಕದಿಂದ ಮತ್ತು ಈ ಸಾಧನದ ತಯಾರಕರಿಂದ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಅಪ್ಡೇಟ್ಗಳು ಮತ್ತು ಆ್ಯಪ್ಗಳನ್ನು ಸಹ ಡೌನ್ಲೋಡ್ ಮಾಡಬಹುದು ಹಾಗೂ ಇನ್ಸ್ಟಾಲ್ ಮಾಡಬಹುದು ಎನ್ನುವುದಕ್ಕೆ ನೀವು ಸಮ್ಮತಿಸುತ್ತೀರಿ. ಈ ಆ್ಯಪ್ಗಳ ಪೈಕಿ ಕೆಲವು ಆ್ಯಪ್ಗಳು, ಆ್ಯಪ್ನಲ್ಲಿ ಖರೀದಿಸುವ ಸೌಲಭ್ಯ ಒದಗಿಸಬಹುದು.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{ಪಿನ್ ಕನಿಷ್ಠ ಒಂದು ಅಕ್ಷರವನ್ನು ಹೊಂದಿರಬೇಕು}one{ಪಿನ್ ಕನಿಷ್ಠ # ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು}other{ಪಿನ್ ಕನಿಷ್ಠ # ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು}}</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index f9fc564..c44cd10 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -4690,6 +4690,7 @@ <translation id="5470735824776589490">기기를 파워워시로 재설정하기 전에 다시 시작해야 합니다. <ph name="LINK_BEGIN" />자세히 알아보기<ph name="LINK_END" /></translation> <translation id="5471768120198416576">안녕하세요. 텍스트 음성 변환의 음성입니다.</translation> <translation id="5472627187093107397">이 사이트의 비밀번호 저장</translation> +<translation id="5473062644742711742">Chrome 웹 스토어에서 더 많은 접근성 도구 찾기</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">계속하면 이 기기에서 Google, 자녀의 이동통신사, 기기 제조업체로부터 업데이트와 앱을 자동으로 다운로드하고 설치하는 데 동의하는 것으로 간주됩니다(이때 모바일 데이터가 사용될 수도 있음). 일부 앱에서는 인앱 구매가 제공될 수도 있습니다.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN은 1자 이상이어야 합니다.}other{PIN은 #자 이상이어야 합니다.}}</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 0c01396..c6c9eff9 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Микрофон менен камераңызды колдонуңуз</translation> <translation id="1005333234656240382">ADB аркылуу мүчүлүштүктөрдү аныктоо иштетилсинби?</translation> <translation id="1006873397406093306">Бул кеңейтүү сайттын дайындарын окуп, өзгөртө алат. Кеңейтүү кайсы сайттарга кире аларын көзөмөлдөй албайсыз.</translation> +<translation id="1007057452468855774">Google Play Store'ду күйгүзүү</translation> <translation id="1008186147501209563">Кыстармаларды экспорттоо</translation> <translation id="1008557486741366299">Азыр эмес</translation> <translation id="1009476156254802388">Жайгашкан жери: <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Оюндун башкаруу элементтери эми жеткиликтүү</translation> <translation id="1010498023906173788">Бул өтмөк сериялык портко туташтырылган.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Бул бет жооп бербейт}other{Бул бет жооп бербейт}}</translation> +<translation id="1011003645819296594">Сакталган түзмөктөр</translation> <translation id="1011355516189274711">Кеп синтезаторунун үн деңгээли</translation> <translation id="1012794136286421601">Документтериңиз, иш кагаздарыңыз, слайддарыңыз жана чиймелериңиз шайкештештирилүүдө. Аларды онлайн же офлайн режиминде колдонуу үчүн Google Drive колдонмолорун ачыңыз.</translation> <translation id="1012876632442809908">USB-C түзмөгү (маңдайкы оюкча)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Ушул түзмөктү колдонуу</translation> <translation id="1470946456740188591">Caret серептөөсүн күйгүзүү же өчүрүү үчүн Ctrl+Search+7 ыкчам баскычын колдонуңуз</translation> <translation id="1472675084647422956">Дагы көрсөтүү</translation> +<translation id="1473223074251193484">Байланыш түйүнүн конфигурациялоо</translation> <translation id="1474785664565228650">Микрофондун жөндөөлөрүнө өзгөртүүлөр киргизилгендиктен Parallels Desktop'ту кайра иштетүү керек. Улантуу үчүн Parallels Desktop'ту кайра иштетиңиз.</translation> <translation id="1474893630593443211">Көрсөтүлгөн жарнамаларды көзөмөлдөөнүн кошумча параметрлери</translation> <translation id="1475502736924165259">Файлда башка категорияларга туура келбеген тастыктамалар бар</translation> @@ -1125,6 +1128,7 @@ <translation id="2044014337866019681">Сеансты бөгөттөн чыгаруу үчүн <ph name="ACCOUNT" /> аккаунтун ырастап жатканыңызды текшериңиз.</translation> <translation id="204497730941176055">Microsoft тастыктамасынын калыбынын аталышы</translation> <translation id="2045117674524495717">Ыкчам баскычтар боюнча жардам алуу</translation> +<translation id="2045211794962848221">Ушул билдирүү экинчи көрсөтүлбөйт</translation> <translation id="2045969484888636535">Кукилер бөгөттөлө берсин</translation> <translation id="204622017488417136">Түзмөгүңүз Chrome'дун буга чейин орнотулган версиясына кайтарылат. Колдонуучу аккаунттарынын жана жергиликтүү дайындардын баары өчөт. Бул аракетти артка кайруу мүмкүн эмес.</translation> <translation id="2046702855113914483">Рамён</translation> @@ -3814,6 +3818,7 @@ <translation id="4594577641390224176">Барак жөнүндө тутум маалыматын издеп жатасызбы? Төмөнкүгө өтүңүз:</translation> <translation id="4595560905247879544">Колдонмолор менен кеңейтүүлөрдү башкаруучу гана өзгөртө алат (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Сизде ушул серверлерди аныктаган файл тастыктамалары бар</translation> +<translation id="4598345735110653698">Мүмкүндүк алуу ачкычтарын тескөө</translation> <translation id="4598556348158889687">Сактагычты башкаруу</translation> <translation id="4598776695426288251">Wi-Fi'га бир нече түзмөк аркылуу туташса болот</translation> <translation id="4601426376352205922">Окула элек деп белгилөө</translation> @@ -4039,6 +4044,7 @@ <translation id="4823894915586516138">Бул PIN код же сырсөз ушул <ph name="DEVICE_TYPE" /> түзмөгүндөгү, анын ичинде телефонуңуздан кире турган бардык маалыматты коргойт</translation> <translation id="4824037980212326045">Linux'тун камдык көчүрмөсүн сактоо жана калыбына келтирүү</translation> <translation id="4824958205181053313">Шайкештештирүү жокко чыгарылсынбы?</translation> +<translation id="4825532258163983651">Мүмкүндүк алуу ачкычы өчүрүлгөн жок</translation> <translation id="4827675678516992122">Туташпай койду</translation> <translation id="4827784381479890589">Chrome серепчисинде жакшыртылган орфографиялык текшерүү (орфографиялык сунуштарды түзүү үчүн текст Google'га жөнөтүлөт)</translation> <translation id="4827904420700932487">Бул сүрөттүн QR кодун түзүү</translation> @@ -4301,6 +4307,7 @@ <translation id="5087249366037322692">Үчүнчү тарап кошкон</translation> <translation id="5087580092889165836">Карточка кошуу</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 RSA шифрлөөсү менен</translation> +<translation id="5089763948477033443">Капталдагы тилкенин өлчөмүн өзгөртүү маркери</translation> <translation id="5090637338841444533">Камераңыздын абалына көз сала албайт</translation> <translation id="5093569275467863761">Кештелген жашыруун көмөкчү фрейм: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Бул колдонмодо колдоого алынган файлдарды Files же башка колдонмолордо ачып, түзөтө аласыз. Бул колдонмодо демейки шартта кайсы файлдар ачыларын көзөмөлдөө үчүн <ph name="BEGIN_LINK" />түзмөктө демейки колдонмолорду жөндөө жөнүндө билип алыңыз<ph name="END_LINK" />.</translation> @@ -4466,6 +4473,7 @@ <translation id="5258992782919386492">Ушул түзмөккө орнотуу</translation> <translation id="5260334392110301220">Акылдуу тырмакчалар</translation> <translation id="5260508466980570042">Кечиресиз, электрондук почта дарегиңиз же сырсөзүңүз тастыкталган жок. Дагы аракет кылыңыз.</translation> +<translation id="5260958083445173099">Мүмкүн болгон учурда вебсайттар контентти ошол тилдерде көрсөтүшөт</translation> <translation id="5261683757250193089">Желе дүкөнүнөн ачуу</translation> <translation id="5262178194499261222">Сырсөздү алып салуу</translation> <translation id="5262784498883614021">Тармакка автоматтык түрдө туташуу</translation> @@ -4506,6 +4514,7 @@ <translation id="5294097441441645251">Кичинекей тамгалар же ылдыйкы сызык менен башталышы керек</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> түзмөгүңүз алдын ала орнотулган сенсор аркылуу маңдай жагындагы адамдарды аныктап турат. Бардык нерселер түзмөгүңүздө дароо иштетилип, андан соң өчүрүлөт. Сенсордун дайындары эч качан Google'га жөнөтүлбөйт. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Экрандагы текст окулуп берилгендиктен, түзмөгүңүздү экранын карабай колдоносуз. Туташкан түзмөктөрдө Брайль тили жеткиликтүү.</translation> +<translation id="5297005732522718715">Байланыш түйүнүнүн конфигурациясын жаңыртуу</translation> <translation id="5297082477358294722">Сырсөз сакталды. Сакталган сырсөздөрдү <ph name="SAVED_PASSWORDS_STORE" /> дарегинен көрүп, башкарыңыз.</translation> <translation id="5297946558563358707">Кимдир бирөө экраныңызды карап турганда, экраныңыздын ылдыйкы оң жагында Купуялык көзүнүн сүрөтчөсү көрсөтүлөт</translation> <translation id="5298219193514155779">Төмөнкү түзгөн тема</translation> @@ -4676,6 +4685,7 @@ <translation id="5466374726908360271">"<ph name="SEARCH_TERMS" />" дегенди ча&птап, издөө</translation> <translation id="5467207440419968613">Төмөнкүлөр бөгөттөлдү: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Бөлүшүлгөн файлдар изделүүдө</translation> +<translation id="5468330507528805311">Байланыш түйүнүнүн статусу:</translation> <translation id="5468881191994555667">Файл тандоо</translation> <translation id="5469852975082458401">Барактарды текст курсору менен көрө аласыз. Өчүрүү үчүн F7 баскычын басыңыз.</translation> <translation id="5470735824776589490">Түзмөктү "жууп салып" баштапкы абалга келтирээрден мурун, аны өчүрүп күйгүзүү керек. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> @@ -4952,6 +4962,7 @@ <translation id="5734362860645681824">Байланыштар</translation> <translation id="5734697361979786483">Файлды бөлүшүү жөндөөсүн кошуу</translation> <translation id="5736796278325406685">Жарактуу колдонуучунун атын киргизиңиз</translation> +<translation id="5738093759615225354">Компьютерге ушул мүмкүндүк алуу ачкычы менен киришиңиз керек</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> балаңызга мектеп аккаунтун кошууга жардам берүү үчүн аккаунтуңузга кириңиз.</translation> <translation id="5739235828260127894">Ырастоо күтүлүүдө. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Өтө чоң</translation> @@ -5113,6 +5124,7 @@ <translation id="589541317545606110">Баракты <ph name="VISUAL_SEARCH_PROVIDER" /> менен издөө</translation> <translation id="5896436821193322561">Тыюу салуу</translation> <translation id="5900186025777217044">Smart Lock функциясы өзгөрдү</translation> +<translation id="5900243355162006650">Байланыш түйүнүнүн конфигурациясы:</translation> <translation id="5900302528761731119">Google профиль сүрөтү</translation> <translation id="590036993063074298">Күзгүдөй чагылдыруу сапаты</translation> <translation id="5901069264981746702">Манжа изиңиздин маалыматы <ph name="DEVICE_TYPE" /> түзмөгүңүздө коопсуз сакталат. <ph name="LINK_BEGIN" />Кеңири маалымат<ph name="LINK_END" /></translation> @@ -5417,6 +5429,7 @@ <translation id="6196640612572343990">Үчүнчү жактын кукилери бөгөттөлсүн</translation> <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" кеңейтүүсү прокси жөндөөлөрүңүздү көзөмөлдөйт, демек, ал аны өзгөртүп, бузуп же онлайн абалындагы аракеттериңизге көз салып тура алат. Бул эмне болгон өзгөрүү экендигин түшүнбөсөңүз, анын сизге кереги жок болушу мүмкүн.</translation> <translation id="6197128521826316819">Бул барактын QR кодун түзүү</translation> +<translation id="6197223946499512637">Бул мүмкүндүк алуу ачкычтары ушул компьютердеги Windows Hello функциясында сакталган. Алар Google аккаунтуңузда сакталбайт.</translation> <translation id="6198252989419008588">PIN'ди өзгөртүү</translation> <translation id="6200047250927636406">Файлды жоюу</translation> <translation id="6200151268994853226">Кеңейтүүнү башкаруу</translation> @@ -5714,6 +5727,7 @@ <translation id="6482559668224714696">Толук экран режиминдеги лупа</translation> <translation id="6483485061007832714">Жүктөлүп алынган файлды ачуу</translation> <translation id="6483805311199035658"><ph name="FILE" /> ачылууда…</translation> +<translation id="6486301003991593638">Мүмкүндүк алуу ачкычтарын тескөө үчүн Windows'тун жаңы версиясын колдонуңуз</translation> <translation id="6488384360522318064">Тил тандоо</translation> <translation id="648927581764831596">Эч бири жеткиликтүү эмес</translation> <translation id="6490471652906364588">USB-C түзмөгү (оң жактагы оюкча)</translation> @@ -6300,6 +6314,7 @@ <translation id="7029307918966275733">Crostini орнотулган эмес. Насыяларды көрүү үчүн Crostini'ни орнотуңуз.</translation> <translation id="7029809446516969842">Сырсөздөр</translation> <translation id="7030304022046916278">URL даректерин текшерүү үчүн Коопсуз серептөөгө жөнөтөт</translation> +<translation id="7030695672997239647">Өтмөктү чычкандын оң баскычы менен чыкылдатып, "Өтмөктү жаңы топко кошуу", андан соң "Жаңы топ" дегенди тандаңыз</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – Сериялык порт туташтырылды</translation> <translation id="7033616203784997570">62 символдон ашпашы керек</translation> <translation id="7034692021407794547">Адегенде Эсеп коюуну башкаруу артыкчылыгы берилген администратор Администратордун консолундагы Google Meet аппараттык камсыздоо бөлүмүнө өтүп, Google Meet аппараттык камсыздоо түзмөгүнүн Тейлөө шарттарын кабыл алышы керек.</translation> @@ -7401,6 +7416,7 @@ <translation id="8101987792947961127">Жууп салуу аракети кийинки жолу кайра жүктөөдө т</translation> <translation id="81020759409809034">Жергиликтүү жайгашкан жери</translation> <translation id="8102139037507939978">Адамдын инсандыгын аныктоочу маалыматты system_logs.txt таржымалынан өчүрүү.</translation> +<translation id="810362914482827094">Мүмкүндүк алуу ачкычтары издөө</translation> <translation id="8104088837833760645">eSIM-карта профилин жүктөп алуу</translation> <translation id="8105368624971345109">Өчүрүү</translation> <translation id="8107015733319732394"><ph name="DEVICE_TYPE" /> түзмөгүңүзгө Google Play Store орнотулууда. Бир нече мүнөт кетиши мүмкүн.</translation> @@ -7848,6 +7864,7 @@ <translation id="8557022314818157177">Манжаңыздын изин тартуу үчүн коопсуздук ачкычына бир нече жолу тийиңиз</translation> <translation id="8557180006508471423">Mac түзмөгүңүздөгү Жайгашкан жерди аныктоо кызматтарында "Google Chrome'ду" күйгүзүңүз</translation> <translation id="8557856025359704738">Кийинки жолу <ph name="NEXT_DATE_DOWNLOAD" /> жүктөлүп алынат.</translation> +<translation id="8559858985063901027">Мүмкүндүк алуу ачкычтары</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Баарын &жаңы терезеде ачуу}=1{&Жаңы терезеде ачуу}other{Баарын ({COUNT}) &жаңы терезеде ачуу}}</translation> <translation id="8561206103590473338">Пил</translation> <translation id="8561565784790166472">Этият болуңуз</translation> @@ -7974,6 +7991,7 @@ <translation id="8677212948402625567">Баарын жыйнап коюу…</translation> <translation id="867767487203716855">Кийинки жаңыртуу</translation> <translation id="8677859815076891398">Альбомдор жок. <ph name="LINK_BEGIN" />Google Фотодо<ph name="LINK_END" /> альбом түзүңүз.</translation> +<translation id="8678378565142776698">Өчүрүп күйгүзүп, автоматтык жаңыртууларды алуу</translation> <translation id="8678538439778360739">Дайын-даректер сырсүйлөм менен <ph name="TIME" /> күнү шифрленген. Бул Google Pay'деги төлөм ыкмалары менен даректерге карата колдонулбайт.</translation> <translation id="8678582529642151449">Өтмөктөр кичирейбейт</translation> <translation id="8678933587484842200">Бул колдонмону кандай жол менен ачкыңыз келет?</translation> @@ -8220,6 +8238,7 @@ <translation id="8910987510378294980">Түзмөктөрдүн тизмесин жашыруу</translation> <translation id="8912362522468806198">Google аккаунту</translation> <translation id="8912810933860534797">Авто-скандоону иштетүү</translation> +<translation id="8915307125957890427">Өтмөктү чычкандын оң баскычы менен чыкылдатып, "Өтмөктү жаңы топко кошуу", андан соң "Жаңы топ" дегенди тандаңыз</translation> <translation id="8915370057835397490">Сунуш жүктөлүүдө</translation> <translation id="8916476537757519021">Жашыруун көмөкчү алкак: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> аттуу колдонуучунун <ph name="DEVICE_TYPE" /> түзмөгү</translation> @@ -8294,6 +8313,7 @@ <translation id="8986362086234534611">Унутуу</translation> <translation id="8986494364107987395">Google'га автоматтык түрдө колдонуу статистикасы жана каталар жөнүндө кабар берүү.</translation> <translation id="8987927404178983737">Ай</translation> +<translation id="8989359959810288806">Байланыш түйүнүнүн статусун жаңыртуу</translation> <translation id="8991520179165052608">Сайт микрофонуңузду колдоно алат</translation> <translation id="899384117894244799">Чектелген колдонуучулардын тизмесинен алып салуу</translation> <translation id="899403249577094719">Netscape тастыктама негизинин URL</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index cc6e6f3aa..ccb84bc 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -4694,6 +4694,7 @@ <translation id="5470735824776589490">Kad įrenginį būtų galima nustatyti iš naujo naudojant „Powerwash“, reikia paleisti iš naujo. <ph name="LINK_BEGIN" />Sužinokite daugiau<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Sveiki, tai – jūsų teksto į kalbą balsas.</translation> <translation id="5472627187093107397">Išsaugoti šios svetainės slaptažodžius</translation> +<translation id="5473062644742711742">Daugiau pritaikomumo įrankių rasite „Chrome“ internetinėje parduotuvėje</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Tęsdami sutinkate, kad šis įrenginys taip pat gali automatiškai atsisiųsti ir įdiegti naujinius bei programas iš „Google“, jūsų vaiko operatoriaus ir šio įrenginio gamintojo (gali būti naudojami mobiliojo ryšio duomenys). Kai kurios programos gali siūlyti įsigyti pirkinių programoje.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN kodą turi sudaryti bent vienas simbolis}one{PIN kodą turi sudaryti bent # simbolis}few{PIN kodą turi sudaryti bent # simboliai}many{PIN kodą turi sudaryti bent # simbolio}other{PIN kodą turi sudaryti bent # simbolių}}</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index a3ae097..19b0f5f 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Izmantot jūsu mikrofonu un videokameru</translation> <translation id="1005333234656240382">Vai iespējot ADB atkļūdošanu?</translation> <translation id="1006873397406093306">Šis paplašinājums vietnēs var lasīt un mainīt jūsu datus. Varat kontrolēt, kurām vietnēm paplašinājums var piekļūt.</translation> +<translation id="1007057452468855774">Ieslēgt Google Play veikalu</translation> <translation id="1008186147501209563">Grāmatzīmju eksportēšana</translation> <translation id="1008557486741366299">Vēlāk</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> atrašanās vieta</translation> <translation id="1009663062402466586">Tagad ir pieejamas spēļu vadīklas</translation> <translation id="1010498023906173788">Šī cilne ir savienota ar seriālo portu.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Nereaģējoša lapa}zero{Nereaģējošas lapas}one{Nereaģējošas lapas}other{Nereaģējošas lapas}}</translation> +<translation id="1011003645819296594">Saglabātās ierīces</translation> <translation id="1011355516189274711">Teksta pārvēršanas runā skaļums</translation> <translation id="1012794136286421601">Jūsu Dokumentu, Izklājlapu, Prezentāciju un Zīmējumu faili tiek sinhronizēti. Atveriet lietotni “Google disks”, lai piekļūtu šiem failiem tiešsaistē vai bezsaistē.</translation> <translation id="1012876632442809908">USB-C ierīce (priekšējā pieslēgvieta)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">Izmantot šo ierīci</translation> <translation id="1470946456740188591">Lai ieslēgtu vai izslēgtu taustiņpārlūkošanu, izmantojiet īsinājumtaustiņu Ctrl+Search+7.</translation> <translation id="1472675084647422956">Rādīt vairāk</translation> +<translation id="1473223074251193484">Iestatīt piesaistes konfigurāciju</translation> <translation id="1474785664565228650">Lai mikrofona iestatījuma izmaiņas stātos spēkā, ir atkārtoti jāpalaiž programmatūra Parallels Desktop. Atkārtoti palaidiet programmatūru Parallels Desktop, lai turpinātu.</translation> <translation id="1474893630593443211">Lielāka kontrole pār jums rādītajām reklāmām</translation> <translation id="1475502736924165259">Sistēmā ir sertifikāti, kas neiederas nevienā no citām kategorijām</translation> @@ -1115,6 +1118,7 @@ <translation id="2044014337866019681">Lai atbloķētu sesiju, verificējiet kontu <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Microsoft sertifikāta veidnes nosaukums</translation> <translation id="2045117674524495717">Īsinājumtaustiņu palīgs</translation> +<translation id="2045211794962848221">Šis konkrētais ziņojums vairs netiks rādīts.</translation> <translation id="2045969484888636535">Turpināt bloķēt sīkfailus</translation> <translation id="204622017488417136">Ierīcē tiks atjaunota iepriekš instalētā Chrome versija. Visi lietotāju konti un ierīcē glabātie dati tiks noņemti. Šo darbību nevar atsaukt.</translation> <translation id="2046702855113914483">Nūdeļu zupa</translation> @@ -3800,6 +3804,7 @@ <translation id="4594577641390224176">Vai meklējat sistēmas lapu “Par”? Apmeklējiet vietni</translation> <translation id="4595560905247879544">Lietotnes un paplašinājumus var pārveidot tikai pārvaldnieks (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Sistēmā ir sertifikāti, kas identificē šos serverus</translation> +<translation id="4598345735110653698">Pārvaldīt piekļuves atslēgas</translation> <translation id="4598556348158889687">Krātuves pārvaldība</translation> <translation id="4598776695426288251">Ir pieejams Wi-Fi no vairākām ierīcēm</translation> <translation id="4601426376352205922">Atzīmēt kā nelasītu</translation> @@ -4025,6 +4030,7 @@ <translation id="4823894915586516138">Ar šo PIN vai paroli tiks aizsargāti jūsu dati šajā ierīcē (<ph name="DEVICE_TYPE" />), tostarp jebkāda informācija, kurai piekļūstat no sava tālruņa.</translation> <translation id="4824037980212326045">Linux datu dublēšana un atjaunošana</translation> <translation id="4824958205181053313">Vai atcelt sinhronizāciju?</translation> +<translation id="4825532258163983651">Nevar dzēst piekļuves atslēgu</translation> <translation id="4827675678516992122">Nevarēja izveidot savienojumu</translation> <translation id="4827784381479890589">Uzlabotā pareizrakstības pārbaude pārlūkā Chrome (teksts tiek nosūtīts uzņēmumam Google, lai iegūtu pareizrakstības ieteikumus)</translation> <translation id="4827904420700932487">Izveidot kvadrātkodu šim attēlam</translation> @@ -4287,6 +4293,7 @@ <translation id="5087249366037322692">Pievienoja trešā puse</translation> <translation id="5087580092889165836">Pievienot karti</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 ar RSA šifrējumu</translation> +<translation id="5089763948477033443">Sānu paneļa lieluma maiņas turis</translation> <translation id="5090637338841444533">Nedrīkst izsekot kameras pozīciju</translation> <translation id="5093569275467863761">Pilnīgas saglabāšanas kešatmiņā saglabātais inkognito apakšrāmis: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Izmantojot šo lietotni, varat atvērt un rediģēt atbalstītus failus no lietotnes Faili vai citām lietotnēm. Lai pārvaldītu, kurus failus pēc noklusējuma atvērt šajā lietotnē, <ph name="BEGIN_LINK" />uzziniet, kā ierīcē iestatīt noklusējuma lietotnes<ph name="END_LINK" />.</translation> @@ -4452,6 +4459,7 @@ <translation id="5258992782919386492">Instalēt šajā ierīcē</translation> <translation id="5260334392110301220">Viedās pēdiņas</translation> <translation id="5260508466980570042">Diemžēl jūsu e-pasta adresi vai paroli nevarēja verificēt. Lūdzu, mēģiniet vēlreiz.</translation> +<translation id="5260958083445173099">Kad vien iespējams, vietņu saturs tiks rādīts jūsu vēlamajās valodās.</translation> <translation id="5261683757250193089">Atvērt interneta veikalā</translation> <translation id="5262178194499261222">Noņemt paroli</translation> <translation id="5262784498883614021">Automātiska savienojuma izveide ar tīklu</translation> @@ -4492,6 +4500,7 @@ <translation id="5294097441441645251">Lietotājvārdam ir jāsākas ar mazo rakstzīmi vai pasvītru.</translation> <translation id="5294618183559481278">Jūsu ierīcē (<ph name="DEVICE_TYPE" />) tiek izmantots iebūvēts sensors, lai konstatētu, ka uz jūsu ierīci skatās cilvēki. Visi dati tiek nekavējoties apstrādāti jūsu ierīcē un pēc tam tiek dzēsti. Sensoru dati nekad netiek sūtīti uzņēmumam Google. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="5296350763804564124">Klausieties balss komentārus, lai varētu izmantot ierīci, neskatoties ekrānā. Braila raksts ir pieejams, izmantojot pievienotu ierīci.</translation> +<translation id="5297005732522718715">Atsvaidzināt piesaistes konfigurāciju</translation> <translation id="5297082477358294722">Parole ir saglabāta. Skatiet un pārvaldiet saglabātās paroles šeit: <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Rādīt konfidencialitātes acs ikonu ekrāna apakšējā labajā stūrī, kad uz jūsu ekrānu skatās cita persona</translation> <translation id="5298219193514155779">Tematu izveidoja</translation> @@ -4662,11 +4671,13 @@ <translation id="5466374726908360271">Ielīmēt un meklēt “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Bloķēts: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Notiek failu kopīgošanas ierīču meklēšana</translation> +<translation id="5468330507528805311">Piesaistes statuss:</translation> <translation id="5468881191994555667">Izvēlēties failu</translation> <translation id="5469852975082458401">Lapās varat pārvietoties, izmantojot teksta kursoru. Lai izslēgtu šo funkciju, nospiediet taustiņu F7.</translation> <translation id="5470735824776589490">Lai ierīces atiestatīšanai izmantotu funkciju Powerwash, ierīci ir nepieciešams restartēt. <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Sveiki! Šī ir balss jūsu teksta pārvēršanai runā.</translation> <translation id="5472627187093107397">Šajā vietnē saglabāt paroles</translation> +<translation id="5473062644742711742">Atrodiet vairāk pieejamības rīku Chrome interneta veikalā</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Turpinot jūs piekrītat, ka šajā ierīcē drīkst arī automātiski lejupielādēt un instalēt atjauninājumus un lietotnes no Google, jūsu bērna mobilo sakaru operatora un šīs ierīces ražotāja, iespējams, izmantojot mobilos datus. Dažās lietotnēs var tikt piedāvāti pirkumi.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN kodā ir jābūt vismaz vienai rakstzīmei.}zero{PIN kodā ir jābūt vismaz # rakstzīmēm.}one{PIN kodā ir jābūt vismaz # rakstzīmei.}other{PIN kodā ir jābūt vismaz # rakstzīmēm.}}</translation> @@ -4935,6 +4946,7 @@ <translation id="5734362860645681824">Saziņa</translation> <translation id="5734697361979786483">Pievienot failu kopīgošanu</translation> <translation id="5736796278325406685">Lūdzu, ievadiet derīgu lietotājvārdu.</translation> +<translation id="5738093759615225354">Šī piekļuves atslēga jums ir nepieciešama, lai pierakstītos datorā.</translation> <translation id="5739017626473506901">Pierakstieties, lai palīdzētu lietotājam <ph name="USER_NAME" /> pievienot mācību iestādes kontu</translation> <translation id="5739235828260127894">Tiek gaidīta verifikācija. <ph name="LINK_BEGIN" />Uzziniet vairāk<ph name="LINK_END" />.</translation> <translation id="5739458112391494395">Ļoti liels</translation> @@ -5096,6 +5108,7 @@ <translation id="589541317545606110">Meklēt lapā, izmantojot <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Neatļaut</translation> <translation id="5900186025777217044">Izmaiņas Smart Lock funkcijās</translation> +<translation id="5900243355162006650">Piesaistes konfigurācija:</translation> <translation id="5900302528761731119">Google profila fotoattēls</translation> <translation id="590036993063074298">Detalizēta informācija par spoguļošanas kvalitāti</translation> <translation id="5901069264981746702">Jūsu pirkstu nospiedumu dati tiek glabāti drošībā un vienmēr atrodas tikai jūsu ierīcē (<ph name="DEVICE_TYPE" />). <ph name="LINK_BEGIN" />Uzzināt vairāk<ph name="LINK_END" /></translation> @@ -5399,6 +5412,7 @@ <translation id="6196640612572343990">Bloķēt trešo pušu sīkfailus</translation> <translation id="6196854373336333322">Paplašinājums “<ph name="EXTENSION_NAME" />” pārvalda jūsu starpniekservera iestatījumus. Tas nozīmē, ka tas var mainīt, pārtraukt vai izsekot visas jūsu darbības tiešsaistē. Ja neesat pārliecināts, kāpēc notika šīs izmaiņas, visticamāk, jūs tās nevēlaties.</translation> <translation id="6197128521826316819">Izveidot kvadrātkodu šai lapai</translation> +<translation id="6197223946499512637">Šīs piekļuves atslēgas tiek glabātas šajā datorā programmā Windows Hello. Tās nav saglabātas jūsu Google kontā.</translation> <translation id="6198252989419008588">Mainīt PIN</translation> <translation id="6200047250927636406">Atmest failu</translation> <translation id="6200151268994853226">Pārvaldīt paplašinājumu</translation> @@ -5696,6 +5710,7 @@ <translation id="6482559668224714696">Pilnekrāna lupa</translation> <translation id="6483485061007832714">Lejupielādes atvēršana</translation> <translation id="6483805311199035658">Tiek atvērts fails <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Lai pārvaldītu piekļuves atslēgas, izmantojiet jaunāku Windows versiju.</translation> <translation id="6488384360522318064">Atlasīt valodu</translation> <translation id="648927581764831596">Nav pieejama neviena ierīce</translation> <translation id="6490471652906364588">USB-C ierīce (pieslēgvieta pa labi)</translation> @@ -6286,6 +6301,7 @@ <translation id="7029307918966275733">Rīks Crostini nav instalēts. Lai skatītu izstrādātāju informāciju, instalējiet Crostini.</translation> <translation id="7029809446516969842">Paroles</translation> <translation id="7030304022046916278">Vietrāži URL tiek sūtīti uz funkciju Droša pārlūkošana, lai tos pārbaudītu.</translation> +<translation id="7030695672997239647">Ar peles labo pogu noklikšķiniet uz cilnes, atlasiet vienumu “Pievienot cilni grupai” un pēc tam atlasiet “Jauna grupa”.</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> — Seriālais ports pievienots</translation> <translation id="7033616203784997570">Ievadītā teksta garums nedrīkst pārsniegt 62 rakstzīmes</translation> <translation id="7034692021407794547">Vispirms administratoram ar norēķinu pārvaldības atļauju ir jāpiekrīt Google Meet aparatūras pakalpojumu sniegšanas noteikumiem, kas pieejami administrēšanas konsoles sadaļā par Google Meet aparatūru.</translation> @@ -7387,6 +7403,7 @@ <translation id="8101987792947961127">Nākamajā atkārtotas palaišanas reizē jāizpilda funkcija Powerwash</translation> <translation id="81020759409809034">Lokālā atrašanās vieta</translation> <translation id="8102139037507939978">Izņemt personu identificējošu informāciju no faila system_logs.txt.</translation> +<translation id="810362914482827094">Meklējiet piekļuves atslēgas</translation> <translation id="8104088837833760645">Lejupielādēt eSIM profilu</translation> <translation id="8105368624971345109">Izslēgt</translation> <translation id="8107015733319732394">Notiek Google Play veikala instalēšana jūsu ierīcē (<ph name="DEVICE_TYPE" />). Tas var ilgt dažas minūtes.</translation> @@ -7834,6 +7851,7 @@ <translation id="8557022314818157177">Turpiniet pieskarties drošības atslēgai, līdz tiek reģistrēts jūsu pirksta nospiedums.</translation> <translation id="8557180006508471423">Mac datora sadaļā Location Services (Atrašanās vietu pakalpojumi) ieslēdziet opciju “Google Chrome”</translation> <translation id="8557856025359704738">Nākamās lejupielādes datums: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Piekļuves atslēgas</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Atvērt visas &jaunā logā}=1{Atvērt &jaunā logā}zero{Atvērt visas ({COUNT}) &jaunā logā}one{Atvērt visas ({COUNT}) &jaunā logā}other{Atvērt visas ({COUNT}) &jaunā logā}}</translation> <translation id="8561206103590473338">Zilonis</translation> <translation id="8561565784790166472">Esiet uzmanīgs!</translation> @@ -7960,6 +7978,7 @@ <translation id="8677212948402625567">Sakļaut visu...</translation> <translation id="867767487203716855">Nākamais atjauninājums</translation> <translation id="8677859815076891398">Nav albumu. Varat izveidot albumu pakalpojumā <ph name="LINK_BEGIN" />Google fotoattēli<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Restartēt un saņemt automātiskus atjauninājumus</translation> <translation id="8678538439778360739">Dati tika šifrēti, izmantojot sinhronizācijas ieejas frāzi (sinhronizācijas laiks: <ph name="TIME" />). Nav iekļauti maksājumu veidi un adreses no pakalpojuma Google Pay.</translation> <translation id="8678582529642151449">Cilnes netiek samazinātas</translation> <translation id="8678933587484842200">Kā vēlaties palaist šo lietojumprogrammu?</translation> @@ -8208,6 +8227,7 @@ <translation id="8910987510378294980">Paslēpt ierīču sarakstu</translation> <translation id="8912362522468806198">Google konts</translation> <translation id="8912810933860534797">Iespējot automātisko meklēšanu</translation> +<translation id="8915307125957890427">Ar peles labo pogu noklikšķiniet uz cilnes, atlasiet vienumu “Pievienot cilni grupai” un pēc tam atlasiet “Jauna grupa”.</translation> <translation id="8915370057835397490">Notiek ieteikumu ielāde...</translation> <translation id="8916476537757519021">Inkognito apakšrāmis: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" />, ko izmanto <ph name="GIVEN_NAME" /></translation> @@ -8282,6 +8302,7 @@ <translation id="8986362086234534611">Aizmirst</translation> <translation id="8986494364107987395">Automātiski sūtīt lietošanas statistiku un avāriju pārskatus uzņēmumam Google</translation> <translation id="8987927404178983737">Mēnesis</translation> +<translation id="8989359959810288806">Atsvaidzināt piesaistes statusu</translation> <translation id="8991520179165052608">Vietne var izmantot jūsu mikrofonu.</translation> <translation id="899384117894244799">Lietotāja ar ierobežotām iespējām noņemšana</translation> <translation id="899403249577094719">Netscape sertifikāta Base URL</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index 3b31523..1af1cdc 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -7983,6 +7983,7 @@ <translation id="8666759526542103597">За персоналзирањето реклами според прелистувач</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> е сега на цел екран и го оневозможи покажувачот на глувчето.</translation> <translation id="8667760277771450375">Истражуваме начини како да го ограничиме следењето меѓу сајтовите, а притоа да им овозможуваме на сајтовите да ги сопрат спамот и измамите со реклами.</translation> +<translation id="8668378421690365723">Можно е уредот да не ви функционира правилно и може да наидете на проблеми со безбедноста и изведбата.</translation> <translation id="8669284339312441707">Потопли</translation> <translation id="8670537393737592796">За да се вратите брзо тука, инсталирајте ја <ph name="APP_NAME" /> со кликнување на копчето за инсталирање</translation> <translation id="867085395664725367">Настана привремена грешка на серверот.</translation> @@ -8467,6 +8468,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />За најдобро доживување, инсталирајте <ph name="DEVICE_OS" /> на вашиот внатрешен диск. Може да го инсталирате и подоцна од екранот за најавување.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Ако не сте подготвени за инсталирање, може да го извршите од USB за да го испробате. Така ќе се задржи постојниот OS и податоците, но можеби ќе забележите ограничувања во капацитетот и изведбата.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Отвори како прикачена картичка</translation> +<translation id="9123287046453017203">Вашиот уред не е ажуриран</translation> <translation id="9124003689441359348">Зачуваните лозинки ќе се појават тука</translation> <translation id="9126149354162942022">Боја на курсор</translation> <translation id="9128317794749765148">Поставувањето не може да се заврши</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index f2bff974..14cb8da5 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -685,7 +685,7 @@ <translation id="1637224376458524414">आपल्या iPhone वर हा बुकमार्क मिळवा</translation> <translation id="1637350598157233081">तुमचा पासवर्ड या डिव्हाइसवर सेव्ह केला गेला</translation> <translation id="1637765355341780467">तुमचे प्रोफाइल उघडताना काहीतरी चूक झाली. काही वैशिष्ट्ये अनुपलब्ध असू शकतात.</translation> -<translation id="1639239467298939599">लोड करीत आहे</translation> +<translation id="1639239467298939599">लोड करत आहे</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> सध्या Linux ॲप्समध्ये काम करत नाही</translation> <translation id="1640283014264083726">PKCS #1 RSA एंक्रिप्शनसह MD4</translation> <translation id="1641113438599504367">सुरक्षित ब्राउझिंग</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index 318b0f0..78a470d 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -4691,6 +4691,7 @@ <translation id="5470735824776589490">Mula semula diperlukan sebelum peranti anda boleh ditetapkan semula dengan Powerwash. <ph name="LINK_BEGIN" />Ketahui lebih lanjut<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Hai! Saya ialah suara teks ke pertuturan anda.</translation> <translation id="5472627187093107397">Simpan kata laluan untuk tapak ini</translation> +<translation id="5473062644742711742">Cari lebih banyak alat kebolehaksesan dalam Gedung Web Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Dengan meneruskan penggunaan, anda bersetuju bahawa peranti ini juga mungkin memuat turun dan memasang kemas kini dan apl daripada Google, pembawa anak anda dan pengeluar peranti ini secara automatik dan mungkin menggunakan data selular. Sesetengah apl ini mungkin menawarkan pembelian dalam apl.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN mestilah sekurang-kurangnya satu aksara}other{PIN mestilah sekurang-kurangnya # aksara}}</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 7edf55d..5fdc9ed 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -7952,6 +7952,7 @@ <translation id="8666759526542103597">Over browsergebaseerde advertentiepersonalisatie</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> is nu een volledig scherm en heeft je muisaanwijzer uitgezet.</translation> <translation id="8667760277771450375">We testen nieuwe manieren om tracering op meerdere sites te voorkomen en tegelijkertijd te zorgen dat sites advertentiespam en fraude kunnen bestrijden.</translation> +<translation id="8668378421690365723">Je apparaat werkt misschien niet meer goed en kan beveiligings- en prestatieproblemen ondervinden.</translation> <translation id="8669284339312441707">Warmer</translation> <translation id="8670537393737592796">Klik op de installatieknop om <ph name="APP_NAME" /> te installeren zodat je hier snel kunt terugkomen</translation> <translation id="867085395664725367">Er is een tijdelijke serverfout opgetreden.</translation> @@ -8436,6 +8437,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Installeer <ph name="DEVICE_OS" /> op de interne schijf voor de beste functionaliteit. Je kunt het besturingssysteem ook later installeren via het inlogscherm.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Als je nog niet klaar bent om te installeren, kun je het OS uitvoeren via USB om het eerst uit te proberen. Je houdt dan je bestaande OS en gegevens, maar je ziet misschien wel opslag- en prestatielimieten.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Openen als vastgezet tabblad</translation> +<translation id="9123287046453017203">Je apparaat is niet up-to-date</translation> <translation id="9124003689441359348">Opgeslagen wachtwoorden zie je hier</translation> <translation id="9126149354162942022">Kleur van cursor</translation> <translation id="9128317794749765148">Installatie is niet voltooid</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index ae129c6..b591740 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍ ଓ କ୍ୟାମେରା ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="1005333234656240382">ADB ଡିବଗିଂ ସକ୍ଷମ କରିବେ?</translation> <translation id="1006873397406093306">ସାଇଟ୍ଗୁଡ଼ିକରେ ଏହି ଏକ୍ସଟେନ୍ସନ୍ ଆପଣଙ୍କର ଡାଟା ପଢ଼ିପାରିବ ଏବଂ ପରିବର୍ତ୍ତନ କରିପାରିବ। ଏହା ଆପଣ ନିୟନ୍ତ୍ରଣ କରିପାରିବେ ଯେ କେଉଁ ସାଇଟ୍ଗୁଡ଼ିକୁ ଏକ୍ସଟେନ୍ସନ୍ ଆକ୍ସେସ୍ କରିପାରିବ।</translation> +<translation id="1007057452468855774">Google Play Store ଚାଲୁ କରନ୍ତୁ</translation> <translation id="1008186147501209563">ବୁକମାର୍କଗୁଡ଼ିକ ଏକ୍ସପୋର୍ଟ କରନ୍ତୁ</translation> <translation id="1008557486741366299">ଏବେ ନୁହେଁ</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> ଲୋକେସନ୍</translation> <translation id="1009663062402466586">ବର୍ତ୍ତମାନ ଗେମ ନିୟନ୍ତ୍ରଣଗୁଡ଼ିକ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="1010498023906173788">ଏହି ଟାବ୍ଟି ଏକ ସିରିଏଲ୍ ପୋର୍ଟକୁ ସଂଯୋଗ ହୋଇଛି।</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{ପୃଷ୍ଠା ଅପ୍ରତିକ୍ରିୟାଶୀଳ}other{ପୃଷ୍ଠାଗୁଡିକ ଅପ୍ରତିକ୍ରିୟାଶୀଳ}}</translation> +<translation id="1011003645819296594">ସେଭ କରାଯାଇଥିବା ଡିଭାଇସଗୁଡ଼ିକ</translation> <translation id="1011355516189274711">ଟେକ୍ସଟ୍-ଟୁ-ସ୍ପିଚ୍ ଭଲ୍ୟୁମ୍</translation> <translation id="1012794136286421601">ଆପଣଙ୍କର ଡକ୍, ସୀଟ୍, ସ୍ଳାଇଡ୍, ଏବଂ ଡ୍ରଇଂ ଫାଇଲ୍ଗୁଡ଼ିକ ସିଙ୍କ୍ କରାଯାଉଛି। Google ଡ୍ରାଇଭ୍ ଆପ୍କୁ ଅନ୍ଲାଇନ୍ ବା ଅଫ୍ଲାଇନ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଖୋଲନ୍ତୁ।</translation> <translation id="1012876632442809908">USB-C ଡିଭାଇସ୍ (ସାମ୍ନା ପୋର୍ଟ)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">ଏହି ଡିଭାଇସ୍ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="1470946456740188591">କ୍ୟାରେଟ୍ ବ୍ରାଉଜିଂ ଚାଲୁ କିମ୍ବା ବନ୍ଦ କରିବାକୁ, Ctrl+Search+7 ସର୍ଟକଟ୍ କୀ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="1472675084647422956">ଅଧିକ ଦେଖାନ୍ତୁ</translation> +<translation id="1473223074251193484">ଟିଥରିଂ କନଫିଗରେସନ ସେଟ କରନ୍ତୁ</translation> <translation id="1474785664565228650">ମାଇକ୍ରୋଫୋନ୍ ସେଟିଂରେ ହୋଇଥିବା ପରିବର୍ତ୍ତନ Parallels Desktopକୁ ପୁଣି ଲଞ୍ଚ କରିବା ଆବଶ୍ୟକ କରେ। ଆଗକୁ ବଢ଼ିବା ପାଇଁ Parallels Desktop ପୁଣି ଲଞ୍ଚ କରନ୍ତୁ।</translation> <translation id="1474893630593443211">ଆପଣ ଦେଖୁଥିବା ବିଜ୍ଞାପନଗୁଡ଼ିକ ଉପରେ ଅଧିକ ନିୟନ୍ତ୍ରଣ</translation> <translation id="1475502736924165259">ଅନ୍ୟ କୌଣସି ବର୍ଗଗୁଡ଼ିକରେ ଫିଟ୍ ହେଉନଥିବା ଫାଇଲ୍ରେ ଆପଣଙ୍କର ସାର୍ଟିଫିକେଟ୍ ଅଛି</translation> @@ -1110,6 +1113,7 @@ <translation id="2044014337866019681">ଦୟାକରି ସେସନକୁ ଅନଲକ୍ କରିବା ପାଇଁ ଆପଣ <ph name="ACCOUNT" />କୁ ଯାଞ୍ଚ କରୁଥିବା ନିଶ୍ଚିତ କରନ୍ତୁ।</translation> <translation id="204497730941176055">Microsoft ସର୍ଟିଫିକେଟ୍ ଟେମ୍ପଲେଟ୍ର ନାମ</translation> <translation id="2045117674524495717">କୀବୋର୍ଡ ସର୍ଟକଟ ସାହାଯ୍ୟକାରୀ</translation> +<translation id="2045211794962848221">ଆପଣ ଏହି ନିର୍ଦ୍ଦିଷ୍ଟ ମେସେଜ ପୁଣି ଦେଖିବେ ନାହିଁ</translation> <translation id="2045969484888636535">କୁକୀଗୁଡ଼ିକୁ ଅବରୋଧ କରିବା ପ୍ରକ୍ରିୟା ଜାରି ରଖନ୍ତୁ</translation> <translation id="204622017488417136">Chromeର ପୂର୍ବରୁ ଇନ୍ଷ୍ଟଲ୍ ହୋଇଥିବା ସଂସ୍କରଣକୁ ଆପଣଙ୍କ ଡିଭାଇସ୍ ଫେରିଆସିବ। ସମସ୍ତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କ ଆକାଉଣ୍ଟ ଏବଂ ସ୍ଥାନୀୟ ଡାଟା କାଢ଼ିଦିଆଯିବ। ଏହାକୁ ପୂର୍ବାବସ୍ଥାକୁ ଫେରାଇ ଅଣାଯାଇପାରିବ ନାହିଁ।</translation> <translation id="2046702855113914483">ରାମେନ୍</translation> @@ -3796,6 +3800,7 @@ <translation id="4594577641390224176">ସିଷ୍ଟମ ବିଷୟରେ ପୃଷ୍ଠାକୁ ଖୋଜୁଛନ୍ତି କି? ଭିଜିଟ କରନ୍ତୁ</translation> <translation id="4595560905247879544">ଆପ୍ ଏବଂ ଏକ୍ସଟେନ୍ସନ୍ଗୁଡ଼ିକ କେବଳ ପରିଚାଳକ (<ph name="CUSTODIAN_NAME" />) ଦ୍ୱାରା ପରିବର୍ତ୍ତିତ କରାଯାଇପାରେ।</translation> <translation id="4596295440756783523">ଫାଇଲ୍ରେ ଆପଣଙ୍କର ପ୍ରମାଣପତ୍ର ଅଛି ଯାହା ଏହି ସର୍ଭରଗୁଡ଼ିକୁ ଚିହ୍ନଟ କରିଥାଏ</translation> +<translation id="4598345735110653698">ପାସକୀଗୁଡ଼ିକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> <translation id="4598556348158889687">ଷ୍ଟୋରେଜ୍ ପରିଚାଳନା</translation> <translation id="4598776695426288251">ଏକାଧିକ ଡିଭାଇସ୍ ଜରିଆରେ Wi-Fi ଉପଲବ୍ଧ</translation> <translation id="4601426376352205922">ଅପଠିତ ଭାବେ ଚିହ୍ନଟ କରନ୍ତୁ</translation> @@ -4021,6 +4026,7 @@ <translation id="4823894915586516138">ଏହି PIN କିମ୍ବା ପାସୱାର୍ଡ ଆପଣ ଆପଣଙ୍କ ଫୋନରୁ ଆକ୍ସେସ କରୁଥିବା ଯେ କୌଣସି ସୂଚନା ସମେତ ଏହି <ph name="DEVICE_TYPE" />ରେ ଥିବା ଆପଣଙ୍କ ଡାଟାକୁ ସୁରକ୍ଷିତ ରଖେ</translation> <translation id="4824037980212326045">Linux ବ୍ୟାକଅପ୍ ଓ ରିଷ୍ଟୋର୍</translation> <translation id="4824958205181053313">ସିଙ୍କ୍ ବାତିଲ୍ କରିବେ?</translation> +<translation id="4825532258163983651">ପାସକୀ ଡିଲିଟ କରାଯାଇପାରିବ ନାହିଁ</translation> <translation id="4827675678516992122">ସଂଯୋଗ କରିହେଲା ନାହିଁ</translation> <translation id="4827784381479890589">Chrome ବ୍ରାଉଜରରେ ଉନ୍ନତ ବନାନ ଯାଞ୍ଚ (ବନାନ ସମ୍ବନ୍ଧିତ ପରାମର୍ଶଗୁଡ଼ିକ ପାଇଁ ଟେକ୍ସଟ୍ Googleକୁ ପଠାଯାଇଛି)</translation> <translation id="4827904420700932487">ଏହି ଛବି ପାଇଁ QR କୋଡ୍ ତିଆରି କରନ୍ତୁ</translation> @@ -4283,6 +4289,7 @@ <translation id="5087249366037322692">ତୃତୀୟ ପକ୍ଷ ଦ୍ଵାରା ଯୋଗ କରାଗଲା</translation> <translation id="5087580092889165836">କାର୍ଡ ଯୋଗ କରନ୍ତୁ</translation> <translation id="5088534251099454936">RSA ଏନକ୍ରିପ୍ସନ୍ ସହିତ PKCS #1 SHA-512</translation> +<translation id="5089763948477033443">ସାଇଡ ପ୍ୟାନେଲ ହ୍ୟାଣ୍ଡେଲ ରିସାଇଜ</translation> <translation id="5090637338841444533">ଆପଣଙ୍କ କ୍ୟାମେରାର ସ୍ଥିତିକୁ ଟ୍ରାକ୍ କରିବାକୁ ଅନୁମତି ଦିଆଯାଇନାହିଁ</translation> <translation id="5093569275467863761">ଇନକଗ୍ନିଟୋ ବ୍ୟାକ୍/ଫରୱାର୍ଡ୍ କ୍ୟାଶ୍ ସବଫ୍ରେମ୍: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ଆପଣ ଏହି ଆପ ମାଧ୍ୟମରେ ଫାଇଲ୍ସ ଆପ କିମ୍ବା ଅନ୍ୟ ଆପ୍ସରୁ ସମର୍ଥିତ ଫାଇଲଗୁଡ଼ିକୁ ଖୋଲିପାରିବେ ଏବଂ ଏଡିଟ କରିପାରିବେ। କେଉଁ ଫାଇଲଗୁଡ଼ିକ ଡିଫଲ୍ଟ ଭାବେ ଏହି ଆପକୁ ଖୋଲିବ ତାହା ନିୟନ୍ତ୍ରଣ କରିବା ପାଇଁ, <ph name="BEGIN_LINK" />ଆପଣଙ୍କ ଡିଭାଇସରେ ଡିଫଲ୍ଟ ଆପ୍ସ କିପରି ସେଟ କରିବେ ତାହା ଜାଣନ୍ତୁ<ph name="END_LINK" />।</translation> @@ -4448,6 +4455,7 @@ <translation id="5258992782919386492">ଏହି ଡିଭାଇସ୍ରେ ଇନ୍ଷ୍ଟଲ୍ କରନ୍ତୁ</translation> <translation id="5260334392110301220">ସ୍ମାର୍ଟ କ୍ୱୋଟ୍</translation> <translation id="5260508466980570042">କ୍ଷମା କରିବେ, ଆପଣଙ୍କର ଇମେଲ୍ ଏବଂ ପାସ୍ୱର୍ଡ ଯାଞ୍ଚ କରାଯାଇପାରିଲା ନାହିଁ। ଦୟାକରି ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> +<translation id="5260958083445173099">ଯେତେବେଳେ ସମ୍ଭବ ହେବ, ସେତେବେଳେ ୱେବସାଇଟଗୁଡ଼ିକ ଆପଣଙ୍କ ପସନ୍ଦର ଭାଷାଗୁଡ଼ିକରେ ବିଷୟବସ୍ତୁ ଦେଖାଇବେ</translation> <translation id="5261683757250193089">ୱେବ୍ ଷ୍ଟୋର୍ରେ ଖୋଲନ୍ତୁ</translation> <translation id="5262178194499261222">ପାସୱାର୍ଡ କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="5262784498883614021">ସ୍ୱଚାଳିତ ଭାବେ ନେଟୱାର୍କ ସହିତ ସଂଯୋଗ କରନ୍ତୁ</translation> @@ -4488,6 +4496,7 @@ <translation id="5294097441441645251">ଏକ ସାନ ଅକ୍ଷର କିମ୍ବା ଅଣ୍ଡରସ୍କୋର୍ ସହିତ ଆରମ୍ଭ ହେବା ଉଚିତ</translation> <translation id="5294618183559481278">ଆପଣଙ୍କ ଡିଭାଇସ ସମ୍ମୁଖରେ ଥିବା ଲୋକମାନଙ୍କୁ ଚିହ୍ନଟ କରିବା ପାଇଁ ଆପଣଙ୍କ <ph name="DEVICE_TYPE" /> ଏକ ବିଲ୍ଟ-ଇନ ସେନ୍ସର ବ୍ୟବହାର କରେ। ସମସ୍ତ ଡାଟାକୁ ଆପଣଙ୍କ ଡିଭାଇସରେ ତୁରନ୍ତ ପ୍ରକ୍ରିୟାନ୍ୱିତ କରି ଡିଲିଟ କରାଯାଏ। ସେନ୍ସର ଡାଟାକୁ କେବେ ବି Googleକୁ ପଠାଯାଏ ନାହିଁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="5296350763804564124">କଥିତ ମତାମତ ଶୁଣନ୍ତୁ ଯାହା ଫଳରେ ଆପଣ ସ୍କ୍ରିନକୁ ନଦେଖି ଆପଣଙ୍କ ଡିଭାଇସ ବ୍ୟବହାର କରିପାରିବେ। ଏକ କନେକ୍ଟ ହୋଇଥିବା ଡିଭାଇସରେ ବ୍ରେଲି ମତାମତ ଉପଲବ୍ଧ ଅଛି।</translation> +<translation id="5297005732522718715">ଟିଥରିଂ କନଫିଗରେସନକୁ ରିଫ୍ରେସ କରନ୍ତୁ</translation> <translation id="5297082477358294722">ପାସ୍ୱର୍ଡ ସେଭ୍ କରାଯାଇଛି। ଆପଣଙ୍କର <ph name="SAVED_PASSWORDS_STORE" />ରେ ସେଭ୍ ହୋଇଥିବା ପାସ୍ୱର୍ଡଗୁଡ଼ିକ ଦେଖନ୍ତୁ ଏବଂ ପରିଚାଳନା କରନ୍ତୁ।</translation> <translation id="5297946558563358707">ଯେତେବେଳେ ଅନ୍ୟ କୌଣସି ବ୍ୟକ୍ତି ଆପଣଙ୍କ ସ୍କ୍ରିନକୁ ଦେଖନ୍ତି, ସେତେବେଳେ ଆପଣଙ୍କ ସ୍କ୍ରିନର ନିମ୍ନ ଡାହାଣ ପାର୍ଶ୍ୱରେ ଗୋପନୀୟତା ଆଖି ଆଇକନ ଦେଖାନ୍ତୁ</translation> <translation id="5298219193514155779">ଦ୍ଵାରା ଥିମ୍ ସୃଷ୍ଟି ହୋଇଛି</translation> @@ -4658,11 +4667,13 @@ <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />”କୁ ପେଷ୍ଟ କରନ୍ତୁ ଏବଂ ଖୋଜନ୍ତୁ</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />କୁ ବ୍ଲକ୍ କରାଯାଇଛି</translation> <translation id="5468173180030470402">ଫାଇଲ୍ ସେୟାର୍ ଖୋଜାଯାଉଛି</translation> +<translation id="5468330507528805311">ଟିଥରିଂ ସ୍ଥିତି:</translation> <translation id="5468881191994555667">ଫାଇଲ ଚୟନ କରନ୍ତୁ</translation> <translation id="5469852975082458401">ଆପଣ ଏକ ଟେକ୍ସଟ୍ କର୍ସର୍ ସାହାଯ୍ୟରେ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ନାଭିଗେଟ୍ କରିପାରିବେ। ବନ୍ଦ କରିବାକୁ F7 ଦବାନ୍ତୁ।</translation> <translation id="5470735824776589490">ପାୱର୍ୱାସ୍ ସହିତ ଆପଣଙ୍କର ଡିଭାଇସ୍କୁ ରିସେଟ୍ କରିବା ପୂର୍ବରୁ ରିଷ୍ଟାର୍ଟ କରିବା ଆବଶ୍ୟକ ଅଟେ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="5471768120198416576">ଆଜ୍ଞା ନମସ୍କାର! ମୁଁ ଆପଣଙ୍କ ଲେଖାକୁ ସ୍ପୀଚ୍ରେ ପରିବର୍ତ୍ତନ କରୁଥିବା ଭଏସ୍ ଅଟେ।</translation> <translation id="5472627187093107397">ଏହି ସାଇଟ୍ ପାଇଁ ପାସୱାର୍ଡଗୁଡ଼ିକ ସେଭ୍ କରନ୍ତୁ</translation> +<translation id="5473062644742711742">Chrome ୱେବ ଷ୍ଟୋରରେ ଅଧିକ ଆକ୍ସେସିବିଲିଟୀ ଟୁଲ ପାଆନ୍ତୁ</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">ଜାରି ରଖି, ଏହି ଡିଭାଇସ ସମ୍ଭବତଃ ସେଲ୍ୟୁଲାର ଡାଟା ବ୍ୟବହାର କରି, Google, ଆପଣଙ୍କ ପିଲାର କ୍ୟାରିଅର ଏବଂ ଏହି ଡିଭାଇସର ନିର୍ମାତାଙ୍କଠାରୁ, ଅପଡେଟ ଓ ଆପଗୁଡ଼ିକୁ ମଧ୍ୟ ସ୍ଵଚାଳିତ ଭାବେ ଡାଉନଲୋଡ ଏବଂ ଇନଷ୍ଟଲ କରିପାରିବ ବୋଲି ଆପଣ ସମ୍ମତ ହୁଅନ୍ତି। ଏହି ଆପଗୁଡ଼ିକ ମଧ୍ୟରୁ କିଛି ଆପ ଇନ-ଆପ କ୍ରୟଗୁଡ଼ିକ ଅଫର କରିପାରେ।</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PINରେ ଅତିକମରେ ଗୋଟିଏ ଅକ୍ଷର ରହିବା ଆବଶ୍ୟକ}other{PINରେ ଅତିକମରେ #ଟି ଅକ୍ଷର ରହିବା ଆବଶ୍ୟକ}}</translation> @@ -4931,6 +4942,7 @@ <translation id="5734362860645681824">ଯୋଗାଯୋଗ</translation> <translation id="5734697361979786483">ଫାଇଲ୍ ସେୟାର୍ ଯୋଗ କରନ୍ତୁ</translation> <translation id="5736796278325406685">ଦୟାକରି ଏକ ବୈଧ ଉପଯୋଗକର୍ତ୍ତାନାମ ଲେଖନ୍ତୁ</translation> +<translation id="5738093759615225354">ଆପଣ ଆପଣଙ୍କ କମ୍ପ୍ୟୁଟରରେ ସାଇନ ଇନ କରିବା ପାଇଁ ଏହି ପାସକୀ ଆବଶ୍ୟକ କରନ୍ତି</translation> <translation id="5739017626473506901">ଏକ ସ୍କୁଲ୍ ଆକାଉଣ୍ଟ ଯୋଗ କରିବାରେ <ph name="USER_NAME" />କୁ ସାହାଯ୍ୟ କରିବାକୁ ସାଇନ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="5739235828260127894">ଯାଞ୍ଚକରଣ ପାଇଁ ଅପେକ୍ଷାରତ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ବହୁତ ବଡ଼</translation> @@ -5092,6 +5104,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> ମାଧ୍ୟମରେ ପୃଷ୍ଠା ସନ୍ଧାନ କରନ୍ତୁ</translation> <translation id="5896436821193322561">ଅନୁମତି ଦିଅନ୍ତୁ ନାହିଁ</translation> <translation id="5900186025777217044">Smart Lock ପରିବର୍ତ୍ତନ ହୋଇଯାଇଛି</translation> +<translation id="5900243355162006650">ଟିଥରିଂ କନଫିଗରେସନ:</translation> <translation id="5900302528761731119">Google ପ୍ରୋଫାଇଲ୍ ଫଟୋ</translation> <translation id="590036993063074298">ମିରରିଂ ଗୁଣବତ୍ତା ବିବରଣୀ</translation> <translation id="5901069264981746702">ଆପଣଙ୍କ ଟିପଚିହ୍ନ ସମ୍ବନ୍ଧିତ ଡାଟା ସୁରକ୍ଷିତ ଭାବେ ଷ୍ଟୋର୍ କରାଯାଇଛି ଏବଂ ଏହା କେବେ ବି ଆପଣଙ୍କ <ph name="DEVICE_TYPE" />ରୁ କାଢ଼ି ଦିଆଯାଏ ନାହିଁ। <ph name="LINK_BEGIN" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="LINK_END" /></translation> @@ -5395,6 +5408,7 @@ <translation id="6196640612572343990">ତୃତୀୟ ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="6196854373336333322">ଏକ୍ସଟେନ୍ସନ୍ "<ph name="EXTENSION_NAME" />" ଆପଣଙ୍କର ପ୍ରୋକ୍ସି ସେଟିଂସ୍କୁ ନିୟନ୍ତ୍ରଣକୁ ନେଇଛି, ଯାହାର ଅର୍ଥ ଆପଣ ଅନ୍ଲାଇନ୍ରେ ଯାହା କିଛି କରନ୍ତି, ସେଥିରେ ଏହା ପରିବର୍ତ୍ତନ କରିପାରେ, ଭାଙ୍ଗିପାରେ କିମ୍ବା ଲୁଚି ଶୁଣିପାରେ। ଯଦି ଆପଣ ସୁନିଶ୍ଚିତ ନୁହଁନ୍ତି ଯେ ଏହି ପରିବର୍ତ୍ତନ କ’ଣ ପାଇଁ ହେଲା, ତେବେ ସମ୍ଭବତଃ ଆପଣ ଏହା ଚାହାନ୍ତି ନାହିଁ।</translation> <translation id="6197128521826316819">ଏହି ପୃଷ୍ଠା ପାଇଁ QR କୋଡ୍ ତିଆରି କରନ୍ତୁ</translation> +<translation id="6197223946499512637">ଏହି କମ୍ପ୍ୟୁଟରରେ ଥିବା Windows Helloରେ ଏହି ପାସକୀଗୁଡ଼ିକୁ ଷ୍ଟୋର କରାଯାଇଛି। ସେଗୁଡ଼ିକୁ ଆପଣଙ୍କ Google Accountରେ ସେଭ କରାଯାଇନାହିଁ।</translation> <translation id="6198252989419008588">PIN ବଦଳାନ୍ତୁ</translation> <translation id="6200047250927636406">ଫାଇଲକୁ ଖାରଜ କରନ୍ତୁ</translation> <translation id="6200151268994853226">ଏକ୍ସଟେନସନକୁ ପରିଚାଳନା କରନ୍ତୁ</translation> @@ -5692,6 +5706,7 @@ <translation id="6482559668224714696">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ ମ୍ୟାଗ୍ନିଫାୟର୍</translation> <translation id="6483485061007832714">ଡାଉନ୍ଲୋଡ୍ ଖୋଲନ୍ତୁ</translation> <translation id="6483805311199035658"><ph name="FILE" /> ଖୋଲୁଛି...</translation> +<translation id="6486301003991593638">ପାସକୀଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ପାଇଁ Windowsର ଏକ ନୂଆ ସଂସ୍କରଣ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="6488384360522318064">ଭାଷା ଚୟନ କରନ୍ତୁ</translation> <translation id="648927581764831596">କେହି ମଧ୍ୟ ଉପଲବ୍ଧ ନାହାନ୍ତି</translation> <translation id="6490471652906364588">USB-C ଡିଭାଇସ୍ (ଡାହାଣ ପୋର୍ଟ)</translation> @@ -6280,6 +6295,7 @@ <translation id="7029307918966275733">Crostini ଇନଷ୍ଟଲ୍ କରାଯାଇନାହିଁ। କ୍ରେଡିଟ୍ ଦେଖିବାକୁ, ଦୟାକରି Crostini ଇନଷ୍ଟଲ୍ କରନ୍ତୁ।</translation> <translation id="7029809446516969842">ପାସୱାର୍ଡଗୁଡିକ</translation> <translation id="7030304022046916278">URLଗୁଡ଼ିକ ଯାଞ୍ଚ କରିବା ପାଇଁ ସେଗୁଡ଼ିକୁ ସୁରକ୍ଷିତ ବ୍ରାଉଜିଂକୁ ପଠାଏ</translation> +<translation id="7030695672997239647">ଏକ ଟାବରେ ଡାହାଣ-କ୍ଲିକ କରି "ଗୋଷ୍ଠୀରେ ଟାବ ଯୋଗ କରନ୍ତୁ"କୁ ଚୟନ କରନ୍ତୁ ଏବଂ ତା'ପରେ "ନୂଆ ଗୋଷ୍ଠୀ" ଚୟନ କରନ୍ତୁ</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - ସିରିଏଲ୍ ପୋର୍ଟ ସଂଯୁକ୍ତ କରାଗଲା</translation> <translation id="7033616203784997570">ଇନପୁଟରେ ସର୍ବାଧିକ 62ଟି ଅକ୍ଷର ରହିବା ଆବଶ୍ୟକ</translation> <translation id="7034692021407794547">ବିଲିଂ ପରିଚାଳନା ବିଶେଷ ଅଧିକାର ଥିବା ଜଣେ ଆଡମିନିଷ୍ଟ୍ରେଟର୍ ପ୍ରଥମେ ଆଡମିନ୍ କନସୋଲର Google Meet ହାର୍ଡୱେର୍ ବିଭାଗରେ Google Meet ହାର୍ଡୱେରର ସେବାର ସର୍ତ୍ତାବଳୀ ଗ୍ରହଣ କରିବା ଉଚିତ।</translation> @@ -7379,6 +7395,7 @@ <translation id="8101987792947961127">ପରବର୍ତ୍ତୀ ରିବୁଟ୍ରେ ପାୱାର୍ୱାସ୍ ଆବଶ୍ୟକ</translation> <translation id="81020759409809034">ସ୍ଥାନୀୟ ଲୋକେସନ୍</translation> <translation id="8102139037507939978">System_logs.txtରୁ ବ୍ୟକ୍ତିଗତ ରୂପେ ଚିହ୍ନଟ କରାଯାଇପାରୁଥିବା ସୂଚନାକୁ କାଢ଼ି ଦିଅନ୍ତୁ।</translation> +<translation id="810362914482827094">ପାସକୀଗୁଡ଼ିକୁ ସନ୍ଧାନ କରନ୍ତୁ</translation> <translation id="8104088837833760645">eSIM ପ୍ରୋଫାଇଲ୍ ଡାଉନଲୋଡ୍ କରନ୍ତୁ</translation> <translation id="8105368624971345109">ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="8107015733319732394">ଆପଣଙ୍କର <ph name="DEVICE_TYPE" />ରେ Google Play Store ଇନ୍ଷ୍ଟଲ୍ ହେଉଛି। ଏଥିରେ କିଛି ସମୟ ଲାଗିପାରେ।</translation> @@ -7826,6 +7843,7 @@ <translation id="8557022314818157177">ଆପଣଙ୍କର ଟିପଚିହ୍ନ କ୍ୟାପଚର୍ ନହେବା ପର୍ଯ୍ୟନ୍ତ ଆପଣଙ୍କ ସୁରକ୍ଷା କୀକୁ ସ୍ପର୍ଶ କରି ଧରି ରଖନ୍ତୁ</translation> <translation id="8557180006508471423">ଆପଣଙ୍କ Macରେ ଥିବା ଲୋକେସନ୍ ସମ୍ପର୍କିତ ସେବାଗୁଡ଼ିକରେ "Google Chrome"କୁ ଚାଲୁ କରନ୍ତୁ</translation> <translation id="8557856025359704738">ପରବର୍ତ୍ତୀ ଡାଉନଲୋଡ <ph name="NEXT_DATE_DOWNLOAD" />ରେ ଅଛି।</translation> +<translation id="8559858985063901027">ପାସକୀଗୁଡ଼ିକ</translation> <translation id="8560327176991673955">{COUNT,plural, =0{ସମସ୍ତ URLକୁ &ନୂଆ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ}=1{&ନୂଆ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ}other{ସମସ୍ତ ({COUNT})ଟି &ନୂଆ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ}}</translation> <translation id="8561206103590473338">ହାତୀ</translation> <translation id="8561565784790166472">ସତର୍କତାର ସହ ଆଗକୁ ବଢ଼ନ୍ତୁ</translation> @@ -7952,6 +7970,7 @@ <translation id="8677212948402625567">ସମସ୍ତ ସଙ୍କୁଚିତ କରନ୍ତୁ...</translation> <translation id="867767487203716855">ପରବର୍ତ୍ତୀ ଅପଡେଟ୍</translation> <translation id="8677859815076891398">କୌଣସି ଆଲବମ୍ ନାହିଁ। <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />ରେ ଏକ ଆଲବମ୍ ତିଆରି କରନ୍ତୁ।</translation> +<translation id="8678378565142776698">ରିଷ୍ଟାର୍ଟ କରି ସ୍ୱଚାଳିତ ଅପଡେଟଗୁଡ଼ିକ ପାଆନ୍ତୁ</translation> <translation id="8678538439778360739"><ph name="TIME" />ରେ ଆପଣଙ୍କ ସିଙ୍କ୍ ପାସଫ୍ରେଜ୍ ମାଧ୍ୟମରେ ଡାଟା ଏନକ୍ରିପ୍ଟ କରାଯାଇଛି। ଏଥିରେ Google Payରୁ ପେମେଣ୍ଟ ପଦ୍ଧତି ଏବଂ ଠିକଣାଗୁଡ଼ିକ ଅନ୍ତର୍ଭୁକ୍ତ ହୋଇନାହିଁ।</translation> <translation id="8678582529642151449">ଟାବଗୁଡ଼ିକ ସଙ୍କୁଚିତ ହୁଏ ନାହିଁ</translation> <translation id="8678933587484842200">ଆପଣ ଏହି ଆପ୍ଲିକେସନ୍କୁ କିପରି ଲଞ୍ଚ କରିବାକୁ ଚାହିଁବେ?</translation> @@ -8198,6 +8217,7 @@ <translation id="8910987510378294980">ଡିଭାଇସ୍ ତାଲିକାକୁ ଲୁଚାନ୍ତୁ</translation> <translation id="8912362522468806198">Google ଆକାଉଣ୍ଟ</translation> <translation id="8912810933860534797">ସ୍ୱତଃ-ସ୍କାନ୍ ସକ୍ଷମ କରନ୍ତୁ</translation> +<translation id="8915307125957890427">ଏକ ଟାବରେ ଡାହାଣ-କ୍ଲିକ କରି "ଗୋଷ୍ଠୀରେ ଟାବ ଯୋଗ କରନ୍ତୁ"କୁ ଚୟନ କରନ୍ତୁ ଏବଂ ତା'ପରେ "ନୂଆ ଗୋଷ୍ଠୀ" ଚୟନ କରନ୍ତୁ</translation> <translation id="8915370057835397490">ପରାମର୍ଶ ଲୋଡ୍ ହେଉଛି</translation> <translation id="8916476537757519021">ଇନ୍କଗ୍ନିଟୋ ସବଫ୍ରେମ୍: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ଙ୍କ <ph name="DEVICE_TYPE" /></translation> @@ -8272,6 +8292,7 @@ <translation id="8986362086234534611">ଭୁଲିଗଲେ</translation> <translation id="8986494364107987395">ସ୍ୱଚାଳିତରୂପେ Googleକୁ ବ୍ୟବହାରର ପରିସଂଖ୍ୟାନ ଏବଂ କ୍ରାସ୍ ରିପୋର୍ଟ ପଠାନ୍ତୁ</translation> <translation id="8987927404178983737">ମାସ</translation> +<translation id="8989359959810288806">ଟିଥରିଂ ସ୍ଥିତିକୁ ରିଫ୍ରେସ କରନ୍ତୁ</translation> <translation id="8991520179165052608">ଆପଣଙ୍କର ମାଇକ୍ରୋଫୋନ୍କୁ ସାଇଟ୍ ବ୍ୟବହାର କରିପାରେ</translation> <translation id="899384117894244799">ପ୍ରତିବନ୍ଧିତ ଉପଯୋଗକର୍ତ୍ତାଙ୍କୁ କାଢ଼ି ଦିଅନ୍ତୁ</translation> <translation id="899403249577094719">Netscape ସାର୍ଟିଫିକେଟ୍ ଉପରେ ଆଧାରିତ URL</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index a2497c4..78a8461 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Korzystanie z Twojego mikrofonu i kamery</translation> <translation id="1005333234656240382">Włączyć debugowanie ADB?</translation> <translation id="1006873397406093306">To rozszerzenie może odczytywać i zmieniać Twoje dane na stronach. Możesz określić, do których stron rozszerzenie ma dostęp.</translation> +<translation id="1007057452468855774">Włącz Sklep Google Play</translation> <translation id="1008186147501209563">Eksportuj zakładki</translation> <translation id="1008557486741366299">Nie teraz</translation> <translation id="1009476156254802388">Lokalizacja w usłudze <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Opcje gry są już dostępne</translation> <translation id="1010498023906173788">Ta karta jest podłączona do portu szeregowego.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Strona nie odpowiada}few{Strony nie odpowiadają}many{Strony nie odpowiadają}other{Strony nie odpowiadają}}</translation> +<translation id="1011003645819296594">Zapisane urządzenia</translation> <translation id="1011355516189274711">Głośność zamiany tekstu na mowę</translation> <translation id="1012794136286421601">Twoje pliki z Dokumentów, Arkuszy, Prezentacji i Rysunków są teraz synchronizowane. Otwórz aplikację Dysk Google, aby używać ich online lub offline.</translation> <translation id="1012876632442809908">Urządzenie USB-C (przedni port)</translation> @@ -493,6 +495,7 @@ <translation id="1470350905258700113">Użyj tego urządzenia</translation> <translation id="1470946456740188591">Aby włączyć lub wyłączyć przeglądanie przy użyciu kursora tekstowego, użyj skrótu Ctrl+Search+7</translation> <translation id="1472675084647422956">Pokaż więcej</translation> +<translation id="1473223074251193484">Skonfiguruj tethering</translation> <translation id="1474785664565228650">Zmiana ustawienia mikrofonu wymaga ponownego uruchomienia aplikacji Parallels Desktop. Aby kontynuować, uruchom ponownie Parallels Desktop.</translation> <translation id="1474893630593443211">Większa kontrola nad wyświetlanymi reklamami</translation> <translation id="1475502736924165259">Masz zapisane certyfikaty, które nie pasują do żadnej z pozostałych kategorii</translation> @@ -1111,6 +1114,7 @@ <translation id="2044014337866019681">Aby odblokować sesję, upewnij się, że potwierdzasz własność konta <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Nazwa szablonu certyfikatu firmy Microsoft</translation> <translation id="2045117674524495717">Informacje o skrótach klawiszowych</translation> +<translation id="2045211794962848221">Nie zobaczysz więcej tego komunikatu</translation> <translation id="2045969484888636535">Nadal blokuj pliki cookie</translation> <translation id="204622017488417136">Na Twoim urządzeniu zostanie przywrócona poprzednia wersja Chrome. Wszystkie zapisane lokalnie konta użytkowników i dane zostaną usunięte. Tej czynności nie można cofnąć.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3785,6 +3789,7 @@ <translation id="4594577641390224176">Szukasz strony z informacjami o systemie? Wejdź na</translation> <translation id="4595560905247879544">Aplikacje i rozszerzenia może zmieniać tylko menedżer (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Masz zapisane certyfikaty, które potwierdzają tożsamość tych serwerów</translation> +<translation id="4598345735110653698">Zarządzaj kluczami</translation> <translation id="4598556348158889687">Zarządzanie pamięcią</translation> <translation id="4598776695426288251">Sieć Wi-Fi jest dostępna przez wiele urządzeń</translation> <translation id="4601426376352205922">Oznacz jako nieprzeczytane</translation> @@ -4010,6 +4015,7 @@ <translation id="4823894915586516138">Kod PIN lub hasło chronią dane znajdujące się na urządzeniu <ph name="DEVICE_TYPE" />, w tym wszystkie informacje, do których uzyskujesz dostęp z telefonu</translation> <translation id="4824037980212326045">Tworzenie i przywracanie kopii zapasowej Linuksa</translation> <translation id="4824958205181053313">Anulować synchronizację?</translation> +<translation id="4825532258163983651">Nie udało się usunąć klucza</translation> <translation id="4827675678516992122">Nie udało się połączyć</translation> <translation id="4827784381479890589">Ulepszone sprawdzanie pisowni w przeglądarce Chrome (tekst jest wysyłany do Google, by uzyskać sugestie pisowni)</translation> <translation id="4827904420700932487">Utwórz kod QR powiązany z tym obrazem</translation> @@ -4272,6 +4278,7 @@ <translation id="5087249366037322692">Dodane przez inną firmę</translation> <translation id="5087580092889165836">Dodaj kartę</translation> <translation id="5088534251099454936">PKCS #1, SHA-512 z szyfrowaniem RSA</translation> +<translation id="5089763948477033443">Uchwyt zmiany rozmiaru panelu bocznego</translation> <translation id="5090637338841444533">Nie zezwolono na śledzenie pozycji kamery</translation> <translation id="5093569275467863761">Ramka podrzędna w trybie incognito w pamięci podręcznej stanu strony internetowej: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">W tej aplikacji możesz otwierać i edytować obsługiwane pliki, do których uzyskujesz dostęp za pomocą aplikacji Pliki lub innych aplikacji. Aby określić, które pliki powinny się domyślnie otwierać w tej aplikacji, <ph name="BEGIN_LINK" />dowiedz się, jak ustawić domyślne aplikacje na urządzeniu<ph name="END_LINK" />.</translation> @@ -4437,6 +4444,7 @@ <translation id="5258992782919386492">Zainstaluj na tym urządzeniu</translation> <translation id="5260334392110301220">Inteligentne cudzysłowy</translation> <translation id="5260508466980570042">Niestety, nie udało się zweryfikować Twojego adresu e-mail lub hasła. Spróbuj ponownie.</translation> +<translation id="5260958083445173099">Gdy będzie to możliwe, zawartość stron internetowych będzie się wyświetlać w wybranych językach</translation> <translation id="5261683757250193089">Otwórz w Chrome Web Store</translation> <translation id="5262178194499261222">Usuń hasło</translation> <translation id="5262784498883614021">Automatycznie łącz z siecią</translation> @@ -4477,6 +4485,7 @@ <translation id="5294097441441645251">Musi zaczynać się od małej litery lub podkreślenia</translation> <translation id="5294618183559481278">Twoje urządzenie <ph name="DEVICE_TYPE" /> korzysta z wbudowanego czujnika, który wykrywa osoby znajdujące się przed ekranem. Wszystkie dane są od razu przetwarzane na urządzeniu i potem usuwane. Czujnik nigdy nie wysyła zebranych danych do Google. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Umożliwia odtwarzanie komunikatów głosowych, aby można było korzystać z urządzenia bez patrzenia na ekran. Komunikaty brajlowskie są dostępne na połączonych urządzeniach.</translation> +<translation id="5297005732522718715">Aktualizuj konfigurację tetheringu</translation> <translation id="5297082477358294722">Hasło zostało zapisane. Swoje zapisane hasła znajdziesz tutaj: <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Kiedy ktoś inny spogląda na Twój ekran, pokaż ikonę oka symbolizującą prywatność w prawym dolnym rogu ekranu</translation> <translation id="5298219193514155779">Motyw utworzony przez</translation> @@ -4646,11 +4655,13 @@ <translation id="5466374726908360271">&Wklej i wyszukaj „<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Zablokowano uprawnienia: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Wyszukuję udziały plików</translation> +<translation id="5468330507528805311">Stan tetheringu:</translation> <translation id="5468881191994555667">Wybierz plik</translation> <translation id="5469852975082458401">Możesz poruszać się po stronach przy użyciu kursora tekstowego. Aby wyłączyć tę opcję, naciśnij F7.</translation> <translation id="5470735824776589490">Przed zresetowaniem urządzenia przy użyciu Powerwash trzeba je zrestartować. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Cześć, jestem Twoim głosem do czytania tekstu.</translation> <translation id="5472627187093107397">Zapisuj hasła używane na tej stronie</translation> +<translation id="5473062644742711742">Więcej narzędzi ułatwień dostępu znajdziesz w Chrome Web Store</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Przechodząc dalej, zgadzasz się, że to urządzenie może też automatycznie pobierać i instalować aktualizacje oraz aplikacje od Google, operatora urządzenia Twojego dziecka i producenta urządzenia oraz że może się to odbywać z użyciem komórkowej transmisji danych. Niektóre z tych aplikacji mogą oferować zakupy w aplikacji.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{Kod PIN musi mieć co najmniej 1 znak}few{Kod PIN musi mieć co najmniej # znaki}many{Kod PIN musi mieć co najmniej # znaków}other{Kod PIN musi mieć co najmniej # znaku}}</translation> @@ -4921,6 +4932,7 @@ <translation id="5734362860645681824">Komunikacja</translation> <translation id="5734697361979786483">Dodaj udział plików</translation> <translation id="5736796278325406685">Wpisz prawidłową nazwę użytkownika</translation> +<translation id="5738093759615225354">Ten klucz jest potrzebny do zalogowania się na komputerze</translation> <translation id="5739017626473506901">Zaloguj się, by pomóc użytkownikowi <ph name="USER_NAME" /> w dodawaniu konta szkolnego</translation> <translation id="5739235828260127894">Czekam na weryfikację. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Bardzo duży</translation> @@ -5082,6 +5094,7 @@ <translation id="589541317545606110">Przeszukaj stronę za pomocą <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Nie zezwalaj</translation> <translation id="5900186025777217044">Funkcja Smart Lock zmieniła się</translation> +<translation id="5900243355162006650">Konfiguracja tetheringu:</translation> <translation id="5900302528761731119">Zdjęcie z profilu Google</translation> <translation id="590036993063074298">Ocena jakości funkcji odbicia lustrzanego</translation> <translation id="5901069264981746702">Odcisk palca jest przechowywany w bezpieczny sposób i jest dostępny tylko na Twoim urządzeniu <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Więcej informacji<ph name="LINK_END" /></translation> @@ -5386,6 +5399,7 @@ <translation id="6196640612572343990">Blokuj pliki cookie innych firm</translation> <translation id="6196854373336333322">Rozszerzenie „<ph name="EXTENSION_NAME" />” przejęło kontrolę nad ustawieniami serwera proxy, co oznacza, że może zmieniać, przerywać lub podglądać wszystko, co robisz online. Jeśli nie masz pewności, skąd wzięła się ta zmiana, prawdopodobnie jej nie chcesz.</translation> <translation id="6197128521826316819">Utwórz kod QR powiązany z tą stroną</translation> +<translation id="6197223946499512637">Te klucze są przechowywane w systemie Windows Hello na tym komputerze. Nie są one zapisywane na Twoim koncie Google.</translation> <translation id="6198252989419008588">Zmień kod PIN</translation> <translation id="6200047250927636406">Odrzuć plik</translation> <translation id="6200151268994853226">Zarządzaj rozszerzeniem</translation> @@ -5683,6 +5697,7 @@ <translation id="6482559668224714696">Lupa pełnoekranowa</translation> <translation id="6483485061007832714">Otwieranie pobranego pliku</translation> <translation id="6483805311199035658">Otwieram <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Aby zarządzać kluczami, użyj nowszej wersji systemu Windows</translation> <translation id="6488384360522318064">Wybierz język</translation> <translation id="648927581764831596">Brak dostępnych</translation> <translation id="6490471652906364588">Urządzenie USB-C (prawy port)</translation> @@ -6271,6 +6286,7 @@ <translation id="7029307918966275733">Nie zainstalowano Crostini. Zainstaluj Crostini, by zobaczyć autorów.</translation> <translation id="7029809446516969842">Hasła</translation> <translation id="7030304022046916278">Wysyła adresy URL do sprawdzenia przez usługę Bezpieczne przeglądanie.</translation> +<translation id="7030695672997239647">Kliknij kartę prawym przyciskiem i wybierz „Dodaj kartę do grupy”, a następnie „Nowa grupa”</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – podłączono port szeregowy</translation> <translation id="7033616203784997570">Wpisany tekst może mieć maksymalnie 62 znaki</translation> <translation id="7034692021407794547">Administrator z uprawnieniami do zarządzania płatnościami musi najpierw zaakceptować Warunki korzystania ze sprzętu do Google Meet w sekcji Sprzęt do Google Meet w konsoli administracyjnej.</translation> @@ -7373,6 +7389,7 @@ <translation id="8101987792947961127">Przy następnym uruchomieniu trzeba wykonać Powerwash</translation> <translation id="81020759409809034">Lokalizacja lokalna</translation> <translation id="8102139037507939978">Usuń informacje umożliwiające identyfikację z pliku system_logs.txt.</translation> +<translation id="810362914482827094">Wyszukaj klucze</translation> <translation id="8104088837833760645">Pobierz profil eSIM</translation> <translation id="8105368624971345109">Wyłącz</translation> <translation id="8107015733319732394">Instaluję Sklep Google Play na urządzeniu <ph name="DEVICE_TYPE" />. Może to potrwać kilka minut.</translation> @@ -7820,6 +7837,7 @@ <translation id="8557022314818157177">Dotykaj klucza bezpieczeństwa, dopóki Twój odcisk nie zostanie zarejestrowany</translation> <translation id="8557180006508471423">Włącz „Google Chrome” w usługach lokalizacyjnych na Macu</translation> <translation id="8557856025359704738">Następne pobieranie: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Klucze</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Otwórz wszystkie w &nowym oknie}=1{Otwórz w &nowym oknie}few{Otwórz wszystkie ({COUNT}) w &nowym oknie}many{Otwórz wszystkie ({COUNT}) w &nowym oknie}other{Otwórz wszystkie ({COUNT}) w &nowym oknie}}</translation> <translation id="8561206103590473338">Słoń</translation> <translation id="8561565784790166472">Zachowaj ostrożność</translation> @@ -7946,6 +7964,7 @@ <translation id="8677212948402625567">Zwiń wszystko...</translation> <translation id="867767487203716855">Następna aktualizacja</translation> <translation id="8677859815076891398">Brak albumów. Utwórz album w <ph name="LINK_BEGIN" />Zdjęciach Google<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Uruchom ponownie otrzymywanie automatycznych aktualizacji</translation> <translation id="8678538439778360739">Dane zostały zaszyfrowane Twoim hasłem synchronizacji w dniu <ph name="TIME" />. Nie obejmuje to form płatności ani adresów w Google Pay.</translation> <translation id="8678582529642151449">Karty się nie zmniejszają</translation> <translation id="8678933587484842200">Jak chcesz uruchamiać tę aplikację?</translation> @@ -8194,6 +8213,7 @@ <translation id="8910987510378294980">Ukryj listę urządzeń</translation> <translation id="8912362522468806198">Konta Google</translation> <translation id="8912810933860534797">Włącz automatyczne skanowanie</translation> +<translation id="8915307125957890427">Kliknij kartę prawym przyciskiem i wybierz „Dodaj kartę do grupy”, a następnie „Nowa grupa”</translation> <translation id="8915370057835397490">Ładuję sugestie</translation> <translation id="8916476537757519021">Ramka podrzędna incognito: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />: <ph name="DEVICE_TYPE" /></translation> @@ -8268,6 +8288,7 @@ <translation id="8986362086234534611">Zapomnij</translation> <translation id="8986494364107987395">Automatycznie przesyłaj do Google statystyki użytkowania i raporty o awariach</translation> <translation id="8987927404178983737">Miesiąc</translation> +<translation id="8989359959810288806">Aktualizuj stan tetheringu</translation> <translation id="8991520179165052608">Strona może używać mikrofonu</translation> <translation id="899384117894244799">Usuwanie użytkownika z ograniczonym dostępem</translation> <translation id="899403249577094719">Podstawowy adres URL certyfikatu firmy Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 4c14e92..1687e8d 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -7983,6 +7983,7 @@ <translation id="8666759526542103597">Sobre a personalização de anúncios com base no navegador</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> está agora em modo de tela inteira e desativou o cursor do mouse.</translation> <translation id="8667760277771450375">Estamos desenvolvendo meios para restringir o rastreamento entre sites e também possibilitar que sites evitem anúncios de spam e fraudes.</translation> +<translation id="8668378421690365723">Seu dispositivo pode deixar de funcionar corretamente e enfrentar problemas de segurança e performance.</translation> <translation id="8669284339312441707">Mais quentes</translation> <translation id="8670537393737592796">Para voltar aqui rapidamente, instale o app <ph name="APP_NAME" /> clicando no botão de instalação</translation> <translation id="867085395664725367">Ocorreu um erro temporário no servidor.</translation> @@ -8467,6 +8468,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Para ter a melhor experiência possível, instale o <ph name="DEVICE_OS" /> no seu disco interno. Você também pode o instalar mais tarde na tela de login.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Se ainda não quiser fazer a instalação, é possível o executar no dispositivo USB para conhecer o sistema. Essa opção garantirá que o SO e seus dados sejam mantidos, mas talvez haja limitações de armazenamento e desempenho.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Abrir como guia fixada</translation> +<translation id="9123287046453017203">O dispositivo não está atualizado</translation> <translation id="9124003689441359348">As senhas salvas aparecerão aqui</translation> <translation id="9126149354162942022">Cor do cursor</translation> <translation id="9128317794749765148">Não foi possível concluir a configuração</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 917b721..0b2950c 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -683,7 +683,7 @@ <translation id="1637224376458524414">Obter este marcador no seu iPhone</translation> <translation id="1637350598157233081">A sua palavra-passe foi guardada neste dispositivo.</translation> <translation id="1637765355341780467">Ocorreu um erro ao abrir o perfil. Algumas funcionalidades podem estar indisponíveis.</translation> -<translation id="1639239467298939599">A carregar</translation> +<translation id="1639239467298939599">A carregar…</translation> <translation id="1640235262200048077">O <ph name="IME_NAME" /> ainda não funciona em aplicações Linux.</translation> <translation id="1640283014264083726">PKCS #1 MD4 Com encriptação RSA</translation> <translation id="1641113438599504367">Navegação segura</translation> @@ -7964,6 +7964,7 @@ <translation id="8666759526542103597">Acerca da personalização de anúncios com base no navegador</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> está agora em ecrã inteiro e desativou o cursor do rato.</translation> <translation id="8667760277771450375">Estamos a explorar formas de restringir a monitorização entre sites enquanto permitimos que os sites acabem com as fraudes e o spam de anúncios.</translation> +<translation id="8668378421690365723">O seu dispositivo pode deixar de funcionar corretamente e sofrer problemas de segurança e desempenho.</translation> <translation id="8669284339312441707">Mais quente</translation> <translation id="8670537393737592796">Para voltar aqui rapidamente, instale a app <ph name="APP_NAME" /> ao clicar no botão de instalação.</translation> <translation id="867085395664725367">Ocorreu um erro temporário no servidor.</translation> @@ -8447,6 +8448,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Para obter a melhor experiência, instale o <ph name="DEVICE_OS" /> no seu disco interno. Também pode instalá-lo mais tarde a partir do ecrã de início de sessão.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Se não tiver tudo pronto para instalar, pode executar a partir de uma unidade USB para o experimentar. Deste modo, mantém o seu SO e dados existentes, mas pode verificar limites ao nível do armazenamento e desempenho.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Abrir como separador fixo</translation> +<translation id="9123287046453017203">O dispositivo não está atualizado</translation> <translation id="9124003689441359348">As palavras-passe guardadas aparecem aqui</translation> <translation id="9126149354162942022">Cor do cursor</translation> <translation id="9128317794749765148">Não foi possível concluir a configuração</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index fef5df2c..89c0441 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -7964,6 +7964,7 @@ <translation id="8666759526542103597">Despre Personalizarea anunțurilor bazată pe browser</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> este acum în modul ecran complet și a dezactivat cursorul mouse-ului dvs.</translation> <translation id="8667760277771450375">Explorăm noi moduri de a restricționa urmărirea pe mai multe site-uri, permițând site-urilor să prevină spamul cu anunțuri și frauda.</translation> +<translation id="8668378421690365723">Este posibil ca dispozitivul să nu mai funcționeze corespunzător și să întâmpini probleme de securitate și de performanță.</translation> <translation id="8669284339312441707">Mai caldă</translation> <translation id="8670537393737592796">Ca să revii rapid aici, instalează <ph name="APP_NAME" /> dând clic pe butonul de instalare</translation> <translation id="867085395664725367">A apărut o eroare temporară de server.</translation> @@ -8448,6 +8449,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Pentru o experiență optimă, instalează <ph name="DEVICE_OS" /> pe discul intern. Poți să instalezi și mai târziu din ecranul de conectare.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Dacă nu ești gata de instalare, poți să rulezi serviciul de pe USB pentru a-l încerca. Astfel, vei păstra sistemul de operare și datele existente, dar pot să existe limitări ale spațiului de stocare și ale performanței.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Deschide ca filă fixată</translation> +<translation id="9123287046453017203">Dispozitivul tău nu este actualizat</translation> <translation id="9124003689441359348">Parolele salvate vor fi afișate aici</translation> <translation id="9126149354162942022">Culoarea cursorului</translation> <translation id="9128317794749765148">Nu s-a putut finaliza configurarea</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 9f57545b..e9f660e 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Использование микрофона и камеры</translation> <translation id="1005333234656240382">Включить отладку с ADB?</translation> <translation id="1006873397406093306">Расширению разрешено просматривать и изменять ваши данные на сайтах. Вы можете выбрать, к каким сайтам у него будет доступ.</translation> +<translation id="1007057452468855774">Включить Google Play</translation> <translation id="1008186147501209563">Экспортировать закладки</translation> <translation id="1008557486741366299">Не сейчас</translation> <translation id="1009476156254802388">Папка в сервисе "<ph name="WEB_DRIVE" />"</translation> <translation id="1009663062402466586">Теперь доступны средства управления играми</translation> <translation id="1010498023906173788">Эта вкладка подключена к последовательному порту.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Страница не отвечает}one{Страницы не отвечают}few{Страницы не отвечают}many{Страницы не отвечают}other{Страницы не отвечают}}</translation> +<translation id="1011003645819296594">Сохраненные устройства</translation> <translation id="1011355516189274711">Громкость озвучивания текста</translation> <translation id="1012794136286421601">Ваши документы, таблицы, презентации и рисунки синхронизируются. Запустите приложение "Google Диск", чтобы получить к ним доступ в режиме онлайн или офлайн.</translation> <translation id="1012876632442809908">Устройство USB-C (порт спереди)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Использовать это устройство</translation> <translation id="1470946456740188591">Чтобы включить или отключить режим активного курсора, нажмите Ctrl + Поиск + 7</translation> <translation id="1472675084647422956">Показать больше...</translation> +<translation id="1473223074251193484">Настроить режим модема</translation> <translation id="1474785664565228650">Изменено разрешение на доступ к микрофону. Чтобы продолжить, перезапустите Parallels Desktop.</translation> <translation id="1474893630593443211">Больше возможностей для управления рекламой</translation> <translation id="1475502736924165259">У вас имеются сертификаты, которые не попадают ни в одну из других категорий</translation> @@ -682,7 +685,7 @@ <translation id="1637224376458524414">Получите эту закладку на iPhone</translation> <translation id="1637350598157233081">Пароль сохранен на этом устройстве.</translation> <translation id="1637765355341780467">Не удалось открыть профиль. Некоторые функции могут быть недоступны.</translation> -<translation id="1639239467298939599">Загрузка</translation> +<translation id="1639239467298939599">Загрузка…</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> пока не работает в приложениях для Linux.</translation> <translation id="1640283014264083726">PKCS #1 MD4 с шифрованием RSA</translation> <translation id="1641113438599504367">Безопасный просмотр</translation> @@ -1115,6 +1118,7 @@ <translation id="2044014337866019681">Чтобы разблокировать сеанс, подтвердите аккаунт <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Название шаблона сертификата Microsoft</translation> <translation id="2045117674524495717">Справка по быстрым клавишам</translation> +<translation id="2045211794962848221">Вы больше не увидите это сообщение.</translation> <translation id="2045969484888636535">Всегда блокировать сохранение cookie</translation> <translation id="204622017488417136">Устройство вернется к предыдущей версии Chrome. Локальные данные и аккаунты пользователей будут удалены. Это действие нельзя отменить.</translation> <translation id="2046702855113914483">Рамен</translation> @@ -3800,6 +3804,7 @@ <translation id="4594577641390224176">Ищете информацию о системе? Перейдите на страницу</translation> <translation id="4595560905247879544">Изменять приложения и расширения может только менеджер (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">У вас есть сертификаты, идентифицирующие эти серверы</translation> +<translation id="4598345735110653698">Настроить ключи доступа</translation> <translation id="4598556348158889687">Управление хранилищем</translation> <translation id="4598776695426288251">Доступно подключение к Wi-Fi через несколько устройств</translation> <translation id="4601426376352205922">Отметить как непрочитанное</translation> @@ -4025,6 +4030,7 @@ <translation id="4823894915586516138">Этот PIN-код или пароль будут защищать ваши данные на текущем устройстве <ph name="DEVICE_TYPE" />, в том числе информацию, получаемую с телефона.</translation> <translation id="4824037980212326045">Резервное копирование и восстановление Linux</translation> <translation id="4824958205181053313">Отключить синхронизацию?</translation> +<translation id="4825532258163983651">Не удается удалить ключ доступа</translation> <translation id="4827675678516992122">Ошибка подключения</translation> <translation id="4827784381479890589">Использовать расширенную проверку правописания в браузере Chrome (для создания подсказок текст будет отправляться в Google)</translation> <translation id="4827904420700932487">Создать QR-код для этого изображения</translation> @@ -4287,6 +4293,7 @@ <translation id="5087249366037322692">Добавлено сторонней программой</translation> <translation id="5087580092889165836">Добавить карту</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 с шифрованием RSA</translation> +<translation id="5089763948477033443">Маркер, который позволяет изменить размер боковой панели</translation> <translation id="5090637338841444533">Запретить сайтам отслеживать положение камеры</translation> <translation id="5093569275467863761">Субфрейм возвратного кеша в режиме инкогнито: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Вы можете открывать и редактировать поддерживаемые файлы в этом приложении из Google Файлов и других приложений. Указать, какие типы файлов по умолчанию будут открываться в этом приложении, можно в <ph name="BEGIN_LINK" />настройках приложений по умолчанию на устройстве<ph name="END_LINK" />.</translation> @@ -4452,6 +4459,7 @@ <translation id="5258992782919386492">Установить на этом устройстве</translation> <translation id="5260334392110301220">Умные кавычки</translation> <translation id="5260508466980570042">Вы указали неверный адрес электронной почты или пароль. Повторите попытку.</translation> +<translation id="5260958083445173099">Содержимое сайтов будет по возможности показываться на предпочитаемых языках.</translation> <translation id="5261683757250193089">Открыть в Интернет-магазине</translation> <translation id="5262178194499261222">Удалить пароль</translation> <translation id="5262784498883614021">Автоматически подключаться к сети</translation> @@ -4492,6 +4500,7 @@ <translation id="5294097441441645251">Имя должно начинаться со строчной буквы или символа подчеркивания.</translation> <translation id="5294618183559481278">Ваше устройство <ph name="DEVICE_TYPE" /> использует встроенный датчик, чтобы распознавать человека, находящегося перед экраном. Все полученные данные сразу обрабатываются и удаляются. Они не отправляются в Google. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Озвучивать текст, чтобы вы могли использовать устройство, не глядя на экран. Чтобы представлять текст с помощью шрифта Брайля, нужно подключить специальное устройство.</translation> +<translation id="5297005732522718715">Обновить конфигурацию режима модема</translation> <translation id="5297082477358294722">Пароль сохранен. Просматривать сохраненные пароли и управлять ими можно на странице <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Если другой человек посмотрит на экран вашего устройства, в правом нижнем углу вы увидите значок глаза.</translation> <translation id="5298219193514155779">Автор темы:</translation> @@ -4662,6 +4671,7 @@ <translation id="5466374726908360271">Вст&авить и найти "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Отключены разрешения "<ph name="PERMISSION_1" />" и "<ph name="PERMISSION_2" />"</translation> <translation id="5468173180030470402">Поиск общих папок…</translation> +<translation id="5468330507528805311">Статус режима модема</translation> <translation id="5468881191994555667">Выбрать файл</translation> <translation id="5469852975082458401">Вы сможете использовать курсор для навигации по страницам. Нажмите F7, чтобы отключить эту функцию.</translation> <translation id="5470735824776589490">Перед сбросом настроек с помощью функции Powerwash необходимо перезагрузить устройство. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> @@ -4937,6 +4947,7 @@ <translation id="5734362860645681824">Оборудование</translation> <translation id="5734697361979786483">Добавить общую папку</translation> <translation id="5736796278325406685">Введите действительное имя пользователя</translation> +<translation id="5738093759615225354">Этот ключ доступа нужен, чтобы входить в систему на компьютере.</translation> <translation id="5739017626473506901">Войдите в систему, чтобы помочь пользователю <ph name="USER_NAME" /> добавить учебный аккаунт.</translation> <translation id="5739235828260127894">Требуется подтверждение. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Очень крупный</translation> @@ -5098,6 +5109,7 @@ <translation id="589541317545606110">Искать по странице, используя <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Запретить</translation> <translation id="5900186025777217044">Функция Smart Lock изменена</translation> +<translation id="5900243355162006650">Конфигурация режима модема</translation> <translation id="5900302528761731119">Фотография профиля Google</translation> <translation id="590036993063074298">Сведения о качестве трансляции</translation> <translation id="5901069264981746702">Данные отпечатков пальцев хранятся только на устройстве <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Подробнее…<ph name="LINK_END" /></translation> @@ -5402,6 +5414,7 @@ <translation id="6196640612572343990">Блокировать сторонние файлы cookie</translation> <translation id="6196854373336333322">Расширение "<ph name="EXTENSION_NAME" />" контролирует настройки прокси-сервера. Это значит, что оно может отследить или изменить передаваемые вами данные, а также оборвать интернет-соединение. Если вы не знали об этом, вам следует отключить расширение.</translation> <translation id="6197128521826316819">Создать QR-код для этой страницы</translation> +<translation id="6197223946499512637">Эти ключи доступа хранятся на этом компьютере в приложении Windows Hello. Они не сохранены в вашем аккаунте Google.</translation> <translation id="6198252989419008588">Изменить PIN-код</translation> <translation id="6200047250927636406">Удалить файл</translation> <translation id="6200151268994853226">Настройки расширения</translation> @@ -5699,6 +5712,7 @@ <translation id="6482559668224714696">Полноэкранная лупа</translation> <translation id="6483485061007832714">Открыть скачанный файл?</translation> <translation id="6483805311199035658">Открывается <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Чтобы управлять ключами доступа, обновите Windows.</translation> <translation id="6488384360522318064">Выбрать язык</translation> <translation id="648927581764831596">Отсутствуют</translation> <translation id="6490471652906364588">Устройство USB-C (порт справа)</translation> @@ -6291,6 +6305,7 @@ <translation id="7029307918966275733">Установка Crostini не была выполнена. Чтобы посмотреть список участников, установите Crostini.</translation> <translation id="7029809446516969842">Пароли</translation> <translation id="7030304022046916278">Обеспечивает отправку URL на проверку по критериям Безопасного просмотра.</translation> +<translation id="7030695672997239647">Нажмите правой кнопкой мыши на вкладку и выберите "Добавить вкладку в группу", а затем "Новая группа".</translation> <translation id="7031608529463141342">К вкладке "<ph name="WINDOW_TITLE" />" подключен последовательный порт</translation> <translation id="7033616203784997570">В названии должно быть не более 62 символов.</translation> <translation id="7034692021407794547">Сначала администратор с правом на управление платежами должен принять Условия использования оборудования Google Meet в разделе "Оборудование Google Meet" консоли администратора.</translation> @@ -7392,6 +7407,7 @@ <translation id="8101987792947961127">При следующей перезагрузке устройства необходимо выполнить Powerwash</translation> <translation id="81020759409809034">Папка на устройстве</translation> <translation id="8102139037507939978">Удалять из файла system_logs.txt информацию, позволяющую идентифицировать личность</translation> +<translation id="810362914482827094">Поиск ключей доступа</translation> <translation id="8104088837833760645">Скачать профиль eSIM</translation> <translation id="8105368624971345109">Отключить</translation> <translation id="8107015733319732394">Установка Google Play Маркета на устройство <ph name="DEVICE_TYPE" /> (может занять несколько минут)…</translation> @@ -7839,6 +7855,7 @@ <translation id="8557022314818157177">Продолжайте прикасаться к сканеру отпечатков пальцев на электронном ключе, пока отпечаток не будет сохранен.</translation> <translation id="8557180006508471423">Включите Google Chrome в службах геолокации на устройстве Mac</translation> <translation id="8557856025359704738">Следующее скачивание запланировано <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Ключи доступа</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Открыть все URL в &новом окне}=1{Открыть URL в &новом окне}one{Открыть все URL ({COUNT}) в &новом окне}few{Открыть все URL ({COUNT}) в &новом окне}many{Открыть все URL ({COUNT}) в &новом окне}other{Открыть все URL ({COUNT}) в &новом окне}}</translation> <translation id="8561206103590473338">Слон</translation> <translation id="8561565784790166472">Будьте осторожны!</translation> @@ -7965,6 +7982,7 @@ <translation id="8677212948402625567">Свернуть все...</translation> <translation id="867767487203716855">Следующее обновление</translation> <translation id="8677859815076891398">Альбомов нет. Создайте альбом в <ph name="LINK_BEGIN" />Google Фото<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Перезапустить и включить автоматическое обновление</translation> <translation id="8678538439778360739">Данные зашифрованы с помощью кодовой фразы <ph name="TIME" />. Шифрование не применяется к способам оплаты и адресам из Google Pay.</translation> <translation id="8678582529642151449">вкладки не уменьшаются</translation> <translation id="8678933587484842200">Как запустить это приложение?</translation> @@ -8214,6 +8232,7 @@ <translation id="8910987510378294980">Скрыть список устройств</translation> <translation id="8912362522468806198">Аккаунт Google</translation> <translation id="8912810933860534797">Включить автосканирование</translation> +<translation id="8915307125957890427">Нажмите правой кнопкой мыши на вкладку и выберите "Добавить вкладку в группу", а затем "Новая группа".</translation> <translation id="8915370057835397490">Загрузка подсказки</translation> <translation id="8916476537757519021">Субфрейм в режиме инкогнито: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> пользователя <ph name="GIVEN_NAME" /></translation> @@ -8288,6 +8307,7 @@ <translation id="8986362086234534611">Удалить</translation> <translation id="8986494364107987395">Автоматически отправлять в Google статистику использования и отчеты о сбоях</translation> <translation id="8987927404178983737">Месяц</translation> +<translation id="8989359959810288806">Обновить статус режима модема</translation> <translation id="8991520179165052608">Сайт может использовать микрофон</translation> <translation id="899384117894244799">Удалить пользователя с ограниченным доступом</translation> <translation id="899403249577094719">URL базы сертификатов Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index fbdab3c..1c04293 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ඔබේ මයික්රෆෝනය සහ කැමරාව භාවිතා කරන්න</translation> <translation id="1005333234656240382">ADB නිදොස් කිරීම සබල කරන්නද?</translation> <translation id="1006873397406093306">මෙම දිගුවට වෙබ් අඩවි මත ඔබේ දත්ත කියවීමටත් වෙනස් කිරීමටත් හැකි වෙයි ඔබට දිගුවට ප්රවේශ විය හැක්කේ කුමන වෙබ් අඩවිවලටද යන්න පාලන කළ හැක.</translation> +<translation id="1007057452468855774">Google Play Store ක්රියාත්මක කරන්න</translation> <translation id="1008186147501209563">පිටුසන් නිර්යාත කරන්න</translation> <translation id="1008557486741366299">දැන් නොවේ</translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> ස්ථානය</translation> <translation id="1009663062402466586">ක්රීඩා පාලන දැන් ලබා ගත හැකිය</translation> <translation id="1010498023906173788">මෙම පටිත්ත අනුක්රමික තොටකට සම්බන්ධ කර ඇත.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{පිටුව ප්රතිචාර නොදක්වයි}one{පිටු ප්රතිචාර නොදක්වයි}other{පිටු ප්රතිචාර නොදක්වයි}}</translation> +<translation id="1011003645819296594">සුරැකි උපාංග</translation> <translation id="1011355516189274711">කථනයට පාඨය හඬ පරිමාව</translation> <translation id="1012794136286421601">ඔබේ ලේඛන, පත්රිකා, ස්ලයිඩ, සහ චිත්ර ගොනු සමමු කෙරෙමින් පවතී. ඒවා වෙත ඔන්ලයින් හෝ ඕෆ්ලයින් ලෙස පිවිසීමට Google Drive විවෘත කරන්න.</translation> <translation id="1012876632442809908">USB-C උපාංගය (ඉදිරිපස තොට)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">මෙම උපාංගය භාවිත කරන්න</translation> <translation id="1470946456740188591">කැරට් බ්රවුස් කිරීම ක්රියාත්මක හෝ ක්රියාවිරහිත කිරීමට, Ctrl+Search+7 කෙටි මග භාවිත කරන්න</translation> <translation id="1472675084647422956">තවත් පෙන්වන්න</translation> +<translation id="1473223074251193484">ටෙදරින් වින්යාසය සකසන්න</translation> <translation id="1474785664565228650">මයික්රෆෝන සැකසීම තුළ වෙනස් කිරීමට Parallels Desktop නැවත දියත් කිරීමට අවශ්ය වේ. ඉදිරියට යාමට Parallels Desktop නැවත දියත් කරන්න.</translation> <translation id="1474893630593443211">ඔබ දකින වෙළඳ දැන්වීම් පිළිබඳ වැඩි පාලනයක්</translation> <translation id="1475502736924165259">ඔබට වෙනත් ප්රවර්ග කිසිවකට නොගැළපෙන සහතික ගොනුවෙහි ඇත</translation> @@ -1114,6 +1117,7 @@ <translation id="2044014337866019681">සැසිය අගුලු හැරීමට ඔබ <ph name="ACCOUNT" /> සත්යාපනය කරන බවට සහතික කර ගන්න.</translation> <translation id="204497730941176055">Microsoft සහතික ආකෘති නාමය</translation> <translation id="2045117674524495717">යතුරුපුවරු කෙටිමං උපකාරකය</translation> +<translation id="2045211794962848221">ඔබට මෙම නිශ්චිත පණිවිඩය නැවත නොපෙනේ</translation> <translation id="2045969484888636535">කුකීස් අවහිර කිරීම දිගටම කරන්න</translation> <translation id="204622017488417136">ඔබේ උපාංගය පෙර ස්ථාපිත Chrome අනුවාදනය වෙත යළි පත්වේ. සියළු පරිශීලක ගිනුම් හා දේශීය දත්ත ඉවත් වේ. මෙය අවලංගු කළ නොහැක.</translation> <translation id="2046702855113914483">රාමෙන්</translation> @@ -3803,6 +3807,7 @@ <translation id="4594577641390224176">පිටුව ගැන පද්ධතිය සඳහා සොයන්නේද? පිවිසෙන්න</translation> <translation id="4595560905247879544">යෙදුම් සහ දිගු විකරණය කළ හැක්කේ කළමනාකරුට පමණි (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">මෙම සේවාදායක හඳුනා ගන්නා සහතික ඔබට ගොනුව තුළ තිබේ</translation> +<translation id="4598345735110653698">මුරයතුරු කළමනාකරණය කරන්න</translation> <translation id="4598556348158889687">ගබඩාව කළමනාකරණය</translation> <translation id="4598776695426288251">Wi-Fi බහුවිධ උපාංග හරහා ලබා ගත හැකිය</translation> <translation id="4601426376352205922">නොකියවූ ලෙස ලකුණු කරන්න</translation> @@ -4028,6 +4033,7 @@ <translation id="4823894915586516138">මෙම PIN හෝ මුරපදය ඔබ ඔබගේ දුරකථනයෙන් ප්රවේශ වන තොරතුරු ඇතුළුව, <ph name="DEVICE_TYPE" /> හි ඔබගේ දත්ත ආරක්ෂා කරයි.</translation> <translation id="4824037980212326045">ලිනක්ස් උපස්ථය සහ ප්රතිසාධනය</translation> <translation id="4824958205181053313">සමමුහූර්තය අවලංගු කරන්නේද?</translation> +<translation id="4825532258163983651">මුරයතුර මකා දැමිය නොහැක</translation> <translation id="4827675678516992122">සම්බන්ධ කළ නොහැකි විය</translation> <translation id="4827784381479890589">Chrome බ්රව්සරය තුළ වැඩි දියුණු කළ අක්ෂර වින්යාස පරීක්ෂාව (අක්ෂර වින්යාස යෝජනා සඳහා පෙළ Google වෙත යවනු ලැබේ)</translation> <translation id="4827904420700932487">මෙම රූපය සඳහා QR කේතය තනන්න</translation> @@ -4290,6 +4296,7 @@ <translation id="5087249366037322692">තුන් වන පාර්ශ්වයක් විසින් එක් කර ඇත</translation> <translation id="5087580092889165836">කාඩ්පත එක් කරන්න</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 With RSA සංකේතනය</translation> +<translation id="5089763948477033443">පැති පැනලයේ ප්රතිප්රමාණ කිරීමේ හසුරුව</translation> <translation id="5090637338841444533">ඔබගේ කැමරා පිහිටුම හඹා යාමට ඉඩ නොදේ</translation> <translation id="5093569275467863761">අප්රසිද්ධ පසුපසට/ඉදිරියට හැඹිලිගත කළ උපරාමුව: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">ඔබට Files යෙදුමෙන් හෝ වෙනත් යෙදුම්වලින් මෙම යෙදුම සමග සහාය දක්වන ගොනු විවෘත කිරීමට සහ සංස්කරණය කිරීමට හැකිය. පෙරනිමියෙන් මෙම යෙදුම විවෘත කරන්නේ කුමන ගොනුද යන්න පාලනය කිරීමට, <ph name="BEGIN_LINK" />ඔබගේ උපාංගයේ පෙරනිමි යෙදුම් සකසන ආකාරය දැන ගන්න<ph name="END_LINK" />.</translation> @@ -4455,6 +4462,7 @@ <translation id="5258992782919386492">මෙම උපාංගයේ ස්ථාපන කරන්න</translation> <translation id="5260334392110301220">ස්මාර්ට් මිල ගණන්</translation> <translation id="5260508466980570042">කණගාටුයි, ඔබේ ඊමේල් ලිපිනය හෝ මුරපදය තහවුරු කරගත නොහැක. නැවත උත්සාහ කරන්න.</translation> +<translation id="5260958083445173099">වෙබ් අඩවි හැකි විට, ඔබ කැමති භාෂාවලින් අන්තර්ගතය පෙන්වනු ඇත</translation> <translation id="5261683757250193089">Web Store හි විවෘත කරන්න</translation> <translation id="5262178194499261222">මුරපදය ඉවත් කරන්න</translation> <translation id="5262784498883614021">ජාලට ස්වයංක්රීයව සම්බන්ධ කරන්න</translation> @@ -4495,6 +4503,7 @@ <translation id="5294097441441645251">ඉංග්රීසි සිම්පල් අකුරකින් හෝ යටි ඉරකින් ආරම්භ විය යුතුමයි</translation> <translation id="5294618183559481278">ඔබගේ උපාංගය ඉදිරිපිට සිටින පුද්ගලයින් හඳුනා ගැනීමට ඔබගේ <ph name="DEVICE_TYPE" /> ආවේණික සංවේදකයක් භාවිත කරයි. සියලු දත්ත ඔබගේ උපාංගයේ වහාම සකසන අතර පසුව මකනු ලැබේ. සංවේදක දත්ත කිසි විටෙක Google වෙත යවනු නොලැබේ. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ඔබට තිරය දෙස නොබලා ඔබේ උපාංගය භාවිතා කළ හැකි පරිදි කථන ප්රතිපෝෂණයට සවන් දෙන්න. සම්බන්ධිත උපාංගයක් සමග බ්රේල් ප්රතිපෝෂණය ලබා ගත හැක.</translation> +<translation id="5297005732522718715">ටෙදරින් වින්යාසය නැවුම් කරන්න</translation> <translation id="5297082477358294722">මුරපදය සුරකින ලදි. ඔබගේ <ph name="SAVED_PASSWORDS_STORE" /> හි සුරකින ලද මුරපද බලන්න සහ කළමනාකරණය කරන්න.</translation> <translation id="5297946558563358707">වෙනත් යම් කෙනෙකු ඔබගේ තිරය දෙස බලන විට, ඔබගේ තිරයේ පහළ දකුණේ ඇති පෞද්ගලිකත්ව අක්ෂි නිරූපකය පෙන්වන්න</translation> <translation id="5298219193514155779">මෙමගින් සාදන ල තේමාව</translation> @@ -4665,6 +4674,7 @@ <translation id="5466374726908360271">අලවා “<ph name="SEARCH_TERMS" />” සොයන්න</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> අවහිර කරන ලදි</translation> <translation id="5468173180030470402">ගොනු බෙදා ගැනීම් සඳහා සොයමින්</translation> +<translation id="5468330507528805311">ටෙදරින් තත්ත්වය:</translation> <translation id="5468881191994555667">ගොනුව තෝරන්න</translation> <translation id="5469852975082458401">ඔබට පෙළ කර්සරයක් සමගින් පිටුවල සංචාලනය කළ හැකිය. ක්රියාවිරහිත කිරීමට F7 ඔබන්න.</translation> <translation id="5470735824776589490">ඔබේ උපාංගය පවර්වොෂ් එකකින් නැවත සැකසීමට යළි ඇරඹුමක් අවශ්ය විය හැක. <ph name="LINK_BEGIN" />තවත් දැන ගන්න<ph name="LINK_END" /></translation> @@ -4941,6 +4951,7 @@ <translation id="5734362860645681824">සන්නිවේදන</translation> <translation id="5734697361979786483">ගොනු බෙදා ගැනීම එක් කරන්න</translation> <translation id="5736796278325406685">වලංගු පරිශීලක නාමයක් ඇතුළු කරන්න</translation> +<translation id="5738093759615225354">ඔබේ පරිගණකයට පුරනය වීමට ඔබට මෙම මුරයතුර අවශ්ය වේ</translation> <translation id="5739017626473506901"><ph name="USER_NAME" /> හට පාසල් ගිණුමක් එක් කිරීමට උදවු කිරීමට පුරන්න</translation> <translation id="5739235828260127894">සත්යාපනය බලාපොරොත්තුවෙන් <ph name="LINK_BEGIN" />තවත් දැන ගන්න.<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ඉතා විශාල</translation> @@ -5102,6 +5113,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> සමග පිටුව සොයන්න</translation> <translation id="5896436821193322561">ඉඩ නොදෙන්න</translation> <translation id="5900186025777217044">Smart Lock වෙනස් වී ඇත</translation> +<translation id="5900243355162006650">ටෙදරින් වින්යාසය:</translation> <translation id="5900302528761731119">Google පැතිකට ඡායාරූපය</translation> <translation id="590036993063074298">දර්පණය කිරීමේ ගුණත්ව විස්තර</translation> <translation id="5901069264981746702">ඔබගේ ඇඟිලි සලකුණු දත්ත ආරක්ෂිතව සුරකින අතර කිසි විට ඔබගේ <ph name="DEVICE_TYPE" /> හැර නොයයි. <ph name="LINK_BEGIN" />තව දැන ගන්න<ph name="LINK_END" /></translation> @@ -5406,6 +5418,7 @@ <translation id="6196640612572343990">තෙවන-පාර්ශ්ව කුකී අවහිර කරන්න</translation> <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" දිගුව ඔබගේ ප්රොක්සි සැකසීම්වල පාලනය ගෙන ඇත, ඉන් අදහස් වන්නේ ඔබ සබැඳිව කරන ඕනෑම දෙයක් වෙනස් කිරීමට, බිඳී යාමට, හෝ හොරෙන් අසා සිටීමට හැකි බවයි. මෙම වෙනස් වීම සිදු වූයේ ඇයිදැයි ඔබට ව්ශ්වාස නැතිනම්, ඔබට බොහෝ විට එය අවශ්ය නොවිය හැකිය.</translation> <translation id="6197128521826316819">මෙම පිටුව සඳහා QR කේතය තනන්න</translation> +<translation id="6197223946499512637">මෙම මුරයතුරු මෙම පරිගණකයෙහි Windows Hello මත ගබඩා කර ඇත. ඒවා ඔබේ Google ගිණුමට සුරැකෙන්නේ නැත.</translation> <translation id="6198252989419008588">PIN අංකය වෙනස් කරන්න</translation> <translation id="6200047250927636406">ගොනුව ඉවත ලන්න</translation> <translation id="6200151268994853226">දිගුව කළමනාකරණය කරන්න</translation> @@ -5703,6 +5716,7 @@ <translation id="6482559668224714696">පූර්ණ තිර විශාලකය</translation> <translation id="6483485061007832714">බාගැනීම විවෘත කරන්න</translation> <translation id="6483805311199035658"><ph name="FILE" /> විවෘත කෙරෙමින්...</translation> +<translation id="6486301003991593638">මුරයතුරු කළමනාකරණය කිරීම සඳහා, Windows හි නවතම අනුවාදයක් භාවිතා කරන්න</translation> <translation id="6488384360522318064">භාෂාව තෝරන්න</translation> <translation id="648927581764831596">කිසිත් ලද නොහැක</translation> <translation id="6490471652906364588">USB-C උපාංගය (දකුණු තොට)</translation> @@ -6289,6 +6303,7 @@ <translation id="7029307918966275733">Crostini ස්ථාපනය කර නැත. ක්රෙඩිට් බැලීමට කරුණාකර Crostini ස්ථාපනය කරන්න.</translation> <translation id="7029809446516969842">මුරපද</translation> <translation id="7030304022046916278">URL පරීක්ෂා කිරීමට ඒවා ආරක්ෂිත බ්රවුස් කිරීම වෙත යවයි</translation> +<translation id="7030695672997239647">පටිත්තක් මත දකුණු-ක්ලික් කර "සමූහයට පටිත්ත එක් කරන්න" තෝරන්න, ඉන්පසු "නව සමූහය" තෝරන්න</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - අනුක්රමික තොට සම්බන්ධිතයි</translation> <translation id="7033616203784997570">ආදානය උපරිම වශයෙන් අනුලකුණු 62ක් විය යුතුය</translation> <translation id="7034692021407794547">බිල්පත් කළමණාකරණ වරප්රසාද සහිත පරිපාලකයෙකු පළමුව පරිපාලන කොන්සෝලයේ Google Meet දෘඪාංග කොටසේ Google Meet දෘඪාංග සේවා නියම පිළිගත යුතුය.</translation> @@ -7388,6 +7403,7 @@ <translation id="8101987792947961127">ඊළඟ පණගැන්වීමේදී Powerwash අවශ්යයි</translation> <translation id="81020759409809034">දේශීය ස්ථානය</translation> <translation id="8102139037507939978">system_logs.txt වෙතින් පුද්ගලිකව හඳුනා ගත හැකි තොරතුරු ඉවත් කරන්න.</translation> +<translation id="810362914482827094">මුරයතුරු සොයන්න</translation> <translation id="8104088837833760645">eSIM පැතිකඩ බාගන්න</translation> <translation id="8105368624971345109">ක්රියා විරහිත කරන්න</translation> <translation id="8107015733319732394">ඔබේ <ph name="DEVICE_TYPE" /> මත Google Play Store ස්ථාපනය කරමින්. මේ සඳහා විනාඩි කිහිපයක් ගත විය හැකිය.</translation> @@ -7835,6 +7851,7 @@ <translation id="8557022314818157177">ඔබේ ඇඟිලි සලකුණ ග්රහණ කරන තෙක් ඔබේ ආරක්ෂක යතුර ස්පර්ශ කරමින් සිටින්න</translation> <translation id="8557180006508471423">ඔබගේ Mac හි ස්ථාන සේවාවල "Google Chrome" ක්රියාත්මක කරන්න</translation> <translation id="8557856025359704738">ඊළඟ බාගැනීම <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">මුරයතුරු</translation> <translation id="8560327176991673955">{COUNT,plural, =0{සියල්ල &නව කවුළුවක විවෘත කරන්න}=1{&නව කවුළුවක විවෘත කරන්න}one{සියල්ල ({COUNT}) &නව කවුළුවක විවෘත කරන්න}other{සියල්ල ({COUNT}) &නව කවුළුවක විවෘත කරන්න}}</translation> <translation id="8561206103590473338">අලියා</translation> <translation id="8561565784790166472">පරිස්සමින් ඉදිරියට යන්න</translation> @@ -7961,6 +7978,7 @@ <translation id="8677212948402625567">සියල්ල හකුළන්න...</translation> <translation id="867767487203716855">ඊළඟ යාවත්කාලීනය</translation> <translation id="8677859815076891398">ඇල්බම නොමැත. <ph name="LINK_BEGIN" />Google ඡායාරූප<ph name="LINK_END" /> තුළ ඇල්බමයක් තනන්න.</translation> +<translation id="8678378565142776698">යළි අරඹා ස්වයංක්රීය යාවත්කාලීන ලබා ගන්න</translation> <translation id="8678538439778360739"><ph name="TIME" />ට ඔබගේ සමමුහුර්ත මුර-වැකිකඩ සමඟ දත්ත සංකේතන කරන ලදි. මෙයට Google Pay වෙතින් ගෙවීමේ ක්රම සහ ලිපින ඇතුළත් නොවේ.</translation> <translation id="8678582529642151449">නොහැකිළෙන ටැබ</translation> <translation id="8678933587484842200">ඔබ මෙම යෙදුම දියත් කිරීමට කැමති කෙසේ ද?</translation> @@ -8208,6 +8226,7 @@ <translation id="8910987510378294980">උපාංග ලැයිස්තුව සඟවන්න</translation> <translation id="8912362522468806198">Google ගිණුම</translation> <translation id="8912810933860534797">ස්වයංක්රීය ස්කෑන් සබල කරන්න</translation> +<translation id="8915307125957890427">පටිත්තක් මත දකුණු-ක්ලික් කර "සමූහයට පටිත්ත එක් කරන්න" තෝරන්න, ඉන්පසු "නව සමූහය" තෝරන්න</translation> <translation id="8915370057835397490">යෝජනාව පූර්ණය වෙමින්</translation> <translation id="8916476537757519021">අප්රකට උපරාමුව: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" />ගේ <ph name="DEVICE_TYPE" /></translation> @@ -8282,6 +8301,7 @@ <translation id="8986362086234534611">අමතක</translation> <translation id="8986494364107987395">ස්වයංක්රීයව භාවිත සංඛ්යා ලේඛන සහ කඩිනම් වාර්තා Google වෙත යවන්න</translation> <translation id="8987927404178983737">මාසය</translation> +<translation id="8989359959810288806">ටෙදරින් තත්ත්වය නැවුම් කරන්න</translation> <translation id="8991520179165052608">අඩවියට ඔබේ මයික්රෆෝනය භාවිත කළ හැකිය</translation> <translation id="899384117894244799">සීමා කළ පරිශීලකයා ඉවත් කරන්න</translation> <translation id="899403249577094719">Netscape සහතික මත පදනම් වූ URL</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 862673e2..848e1b3 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -685,7 +685,7 @@ <translation id="1637224376458524414">Uložte si túto záložku do zariadenia iPhone</translation> <translation id="1637350598157233081">Heslo je uložené v tomto zariadení</translation> <translation id="1637765355341780467">Pri pokuse o otvorenie profilu sa vyskytla chyba. Niektoré funkcie nemusia byť k dispozícii.</translation> -<translation id="1639239467298939599">Prebieha načítavanie</translation> +<translation id="1639239467298939599">Načítava sa</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> v aplikáciách pre systém Linux ešte nefunguje</translation> <translation id="1640283014264083726">Štandard PKCS #1 MD4 so šifrovaním RSA</translation> <translation id="1641113438599504367">Bezpečné prehliadanie</translation> @@ -2500,7 +2500,7 @@ <translation id="3348038390189153836">Bolo zistené odnímateľné zariadenie</translation> <translation id="3348131053948466246">Navrhované emodži. Pohybujte sa klávesami so šípkou nahor alebo nadol a stlačením klávesa Enter emodži vložte.</translation> <translation id="3349933790966648062">Množstvo využívanej pamäte</translation> -<translation id="3353786022389205125">Zapnite možnosť „Pri prebúdzaní z režimu spánku spúšťať uzamknutú obrazovku“ a skúste to znova</translation> +<translation id="3353786022389205125">Zapnite možnosť „Po ukončení režimu spánku zobraziť uzamknutú obrazovku“ a skúste to znova</translation> <translation id="3354972872297836698">Zariadenie <ph name="DEVICE_NAME" /> sa nepodarilo spárovať. Ak to chcete skúsiť znova, vyberte zariadenie.</translation> <translation id="3355936511340229503">Chyba pripojenia</translation> <translation id="3356469410714175391">(Virtuálna karta je povolená)</translation> @@ -3924,7 +3924,7 @@ <translation id="4701335814944566468">Zobrazené včera</translation> <translation id="470644585772471629">Inverzia farieb</translation> <translation id="4707337002099455863">Vždy zapnuté na všetkých weboch</translation> -<translation id="4708794300267213770">Pri prebúdzaní z režimu spánku spúšťať uzamknutú obrazovku</translation> +<translation id="4708794300267213770">Po ukončení režimu spánku zobraziť uzamknutú obrazovku</translation> <translation id="4708849949179781599">Ukončiť aplikáciu <ph name="PRODUCT_NAME" /></translation> <translation id="4711638718396952945">Obnoviť nastavenia</translation> <translation id="47158868804223727">Kliknutím na názov skupiny ju rozbaľte alebo zbaľte</translation> @@ -5037,7 +5037,7 @@ <translation id="5828545842856466741">Pridať profil…</translation> <translation id="5828633471261496623">Prebieha tlač...</translation> <translation id="5828797982387013521">Vybrať príručku</translation> -<translation id="5830205393314753525">Aplikáciu <ph name="APP_NAME" /> nie je možné otvoriť</translation> +<translation id="5830205393314753525"><ph name="APP_NAME" /> sa nedá otvoriť</translation> <translation id="5830720307094128296">Uložiť stránku &ako...</translation> <translation id="5832813618714645810">Profily</translation> <translation id="583281660410589416">Neznáme</translation> @@ -7966,6 +7966,7 @@ <translation id="8666759526542103597">Prispôsobenie reklám založené na prehliadači</translation> <translation id="8667328578593601900">Stránka <ph name="FULLSCREEN_ORIGIN" /> je teraz zobrazená na celú obrazovku a zakázala kurzor myši.</translation> <translation id="8667760277771450375">Skúmame spôsoby, ako obmedziť sledovanie na rôznych weboch a zároveň webom umožniť bojovať proti reklamnému spamu a podvodom.</translation> +<translation id="8668378421690365723">Vaše zariadenie už nemusí fungovať správne a môže dochádzať k problémom so zabezpečením a výkonom.</translation> <translation id="8669284339312441707">Teplejšie</translation> <translation id="8670537393737592796">Ak sa sem chcete rýchlo vrátiť, nainštalujte si aplikáciu <ph name="APP_NAME" /> kliknutím na tlačidlo inštalácie</translation> <translation id="867085395664725367">Vyskytla sa dočasná chyba servera.</translation> @@ -8451,6 +8452,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Najlepšie prostredie získate inštaláciou operačného systému <ph name="DEVICE_OS" /> na interný disk. Môžete si ho nainštalovať aj neskôr na prihlasovacej obrazovke.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Ak si ho zatiaľ nechcete nainštalovať, môžete ho spustiť z kľúča USB a vyskúšať ho. Ponecháte si tak súčasný operačný systém aj údaje, ale môžete naraziť na obmedzenia ukladacieho priestoru a výkonnosti.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Otvoriť ako pevnú kartu</translation> +<translation id="9123287046453017203">Vaše zariadenie nie je aktuálne</translation> <translation id="9124003689441359348">Tu sa zobrazia uložené heslá</translation> <translation id="9126149354162942022">Farba kurzora</translation> <translation id="9128317794749765148">Nastavenie sa nepodarilo dokončiť</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 37d2f45..4af41cc 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Uporabite mikrofon in kamero</translation> <translation id="1005333234656240382">Želite omogočiti odpravljanje napak z mostom za odpravljanje težav s sistemom Android (ADB)?</translation> <translation id="1006873397406093306">Ta razširitev lahko bere in spreminja vaše podatke na spletnih mestih. Nadzirate lahko, do katerih spletnih mest lahko razširitev dostopa.</translation> +<translation id="1007057452468855774">Vklopi Trgovino Google Play</translation> <translation id="1008186147501209563">Izvoz zaznamkov</translation> <translation id="1008557486741366299">Ne zdaj</translation> <translation id="1009476156254802388">Lokacija v storitvi <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Zdaj so na voljo kontrolniki za igre</translation> <translation id="1010498023906173788">Ta zavihek je povezan s serijskimi vrati.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Stran se ne odziva}one{Strani se ne odzivajo}two{Strani se ne odzivajo}few{Strani se ne odzivajo}other{Strani se ne odzivajo}}</translation> +<translation id="1011003645819296594">Shranjene naprave</translation> <translation id="1011355516189274711">Glasnost pretvorbe besedila v govor</translation> <translation id="1012794136286421601">Datoteke v Google Dokumentih, Google Preglednicah, Google Predstavitvah in Google Risbah se sinhronizirajo. Če želite dostopati do njih, ko imate internetno povezavo ali ste brez nje, odprite aplikacijo Google Drive.</translation> <translation id="1012876632442809908">Naprava USB-C (sprednja vrata)</translation> @@ -136,7 +138,7 @@ <translation id="1126809382673880764">Ne ščiti pred nevarnimi spletnimi mesti, prenosi in razširitvami. Še vedno boste deležni zaščite Varnega brskanja, kjer je na voljo, v drugih Googlovih storitvah, kot sta Gmail in Iskanje Google.</translation> <translation id="1128090040635299943">Linux se trenutno konfigurira. Konfiguriranje bo trajalo nekaj minut.</translation> <translation id="1128591060186966949">Urejanje iskalnika</translation> -<translation id="1129420403709586868">Ogled fotografij in predstavnosti telefona</translation> +<translation id="1129420403709586868">Ogled fotografij in predstavnosti v telefonu.</translation> <translation id="1129850422003387628">Upravljanje aplikacij</translation> <translation id="113050636487300043">Zaradi razlikovanja med profili izberite ime in barvno temo.</translation> <translation id="1130589222747246278"><ph name="WINDOW_TITLE" /> – del skupine <ph name="GROUP_NAME" /></translation> @@ -497,6 +499,7 @@ <translation id="1470350905258700113">Uporabi to napravo</translation> <translation id="1470946456740188591">Če želite vklopiti ali izklopiti brskanje s kazalko, uporabite bližnjico Ctrl + Search + 7</translation> <translation id="1472675084647422956">Pokaži več</translation> +<translation id="1473223074251193484">Nastavitev konfiguracije povezave računalnika z internetom prek mobilnega telefona</translation> <translation id="1474785664565228650">Sprememba nastavitve mikrofona zahteva vnovičen zagon programa Parallels Desktop. Znova zaženite program Parallels Desktop, če želite nadaljevati.</translation> <translation id="1474893630593443211">Več nadzora nad prikazanimi oglasi</translation> <translation id="1475502736924165259">V dokumentu so potrdila, ki ne sodijo v nobeno od drugih kategorij</translation> @@ -1128,6 +1131,7 @@ <translation id="2044014337866019681">Prepričajte se, da zaradi odklepanja seje preverjate račun <ph name="ACCOUNT" />.</translation> <translation id="204497730941176055">Microsoftovo ime predloge potrdila</translation> <translation id="2045117674524495717">Pomočnik za bližnjične tipke</translation> +<translation id="2045211794962848221">To sporočilo ne bo več prikazano.</translation> <translation id="2045969484888636535">Še naprej blokiraj piškotke</translation> <translation id="204622017488417136">Naprava bo povrnjena na prej nameščeno različico Chroma. Vsi uporabniški računi in lokalni podatki bodo odstranjeni. Tega ni mogoče razveljaviti.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -2790,7 +2794,7 @@ <translation id="3616741288025931835">&Izbriši podatke brskanja ...</translation> <translation id="3617891479562106823">Ozadja niso na voljo. Poskusite znova pozneje.</translation> <translation id="3619115746895587757">Kapučino</translation> -<translation id="3619962278978697442">Izberite katero koli možnost pri vsaki prijavi</translation> +<translation id="3619962278978697442">Izberite eno od možnosti pri vsaki prijavi.</translation> <translation id="3621807901162200696">Pomagajte izboljšati funkcije sistema Chrome OS in njegovo delovanje</translation> <translation id="362266093274784978">{COUNT,plural, =1{aplikacijo}one{# aplikacijo}two{# aplikaciji}few{# aplikacije}other{# aplikacij}}</translation> <translation id="362333465072914957">Čakanje, da overitelj potrdil izda potrdilo</translation> @@ -3526,7 +3530,7 @@ <translation id="431076611119798497">&Podrobnosti</translation> <translation id="4312701113286993760">{COUNT,plural, =1{1 račun Google}one{<ph name="EXTRA_ACCOUNTS" /> račun Google}two{<ph name="EXTRA_ACCOUNTS" /> računa Google}few{<ph name="EXTRA_ACCOUNTS" /> računi Google}other{<ph name="EXTRA_ACCOUNTS" /> računov Google}}</translation> <translation id="4312866146174492540">Blokira (privzeto)</translation> -<translation id="4314497418046265427">Bodite bolj produktivni, ko telefon povežete z napravo <ph name="DEVICE_TYPE" /></translation> +<translation id="4314497418046265427">Povežite telefon z napravo <ph name="DEVICE_TYPE" /> in povečajte storilnost</translation> <translation id="4314815835985389558">Upravljanje sinhronizacije</translation> <translation id="4315933848520197627">Prekinitev povezave z računom</translation> <translation id="4316850752623536204">Spletno mesto razvijalca</translation> @@ -3817,6 +3821,7 @@ <translation id="4594577641390224176">Ali iščete stran z vizitko sistema? Obiščite</translation> <translation id="4595560905247879544">Aplikacije in razširitve lahko spreminja samo skrbnik (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">V datoteki so potrdila, ki identificirajo te strežnike</translation> +<translation id="4598345735110653698">Upravljanje gesel</translation> <translation id="4598556348158889687">Upravljanje shrambe</translation> <translation id="4598776695426288251">Wi-Fi je na voljo prek več naprav</translation> <translation id="4601426376352205922">Označi kot neprebrano</translation> @@ -4039,9 +4044,10 @@ <translation id="4820236583224459650">Nastavi kot aktiven kartonček</translation> <translation id="4821935166599369261">&Profiliranje je omogočeno</translation> <translation id="4823484602432206655">Branje in spreminjanje nastavitev funkcij za ljudi s posebnimi potrebami</translation> -<translation id="4823894915586516138">Ta koda PIN ali geslo ščiti vaše podatke v napravi <ph name="DEVICE_TYPE" />, vključno z vsemi podatki, do katerih dostopate v telefonu.</translation> +<translation id="4823894915586516138">Ta koda PIN ali geslo ščiti vaše podatke v tej napravi <ph name="DEVICE_TYPE" />, vključno z vsemi podatki, do katerih dostopate iz telefona.</translation> <translation id="4824037980212326045">Varnostno kopiranje in obnova v Linuxu</translation> <translation id="4824958205181053313">Želite preklicati sinhronizacijo?</translation> +<translation id="4825532258163983651">Gesla ni mogoče izbrisati.</translation> <translation id="4827675678516992122">Povezava ni mogoča</translation> <translation id="4827784381479890589">Izboljšano preverjanje črkovanja v brskalniku Chrome (besedilo je poslano Googlu, ki zagotovi predloge za črkovanje)</translation> <translation id="4827904420700932487">Ustvari kodo QR za to sliko</translation> @@ -4304,6 +4310,7 @@ <translation id="5087249366037322692">Dodal drug ponudnik</translation> <translation id="5087580092889165836">Dodaj kartico</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 s šifriranjem RSA</translation> +<translation id="5089763948477033443">Ročica za spreminjanje velikosti stranskega podokna</translation> <translation id="5090637338841444533">Ni dovoljeno spremljanje položaja kamere</translation> <translation id="5093569275467863761">Anonimni podokvir v predpomnilniku za hitro obnovitev strani: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Podprte datoteke lahko s to aplikacijo odpirate in urejate v aplikaciji Datoteke ali drugih aplikacijah. Če želite upravljati, katere datoteke to aplikacijo privzeto odprejo, <ph name="BEGIN_LINK" />preberite, kako nastavite privzete aplikacije v napravi<ph name="END_LINK" />.</translation> @@ -4469,6 +4476,7 @@ <translation id="5258992782919386492">Namesti v to napravo</translation> <translation id="5260334392110301220">Pametni navedki</translation> <translation id="5260508466980570042">Žal vašega e-poštnega naslova ali gesla ni bilo mogoče preveriti. Poskusite znova.</translation> +<translation id="5260958083445173099">Vsebina na spletnih mestih bo prikazana v jezikih, ki ste jih izbrali, če je mogoče.</translation> <translation id="5261683757250193089">Odpiranje v Spletni trgovini</translation> <translation id="5262178194499261222">Odstrani geslo</translation> <translation id="5262784498883614021">Samodejna povezava z omrežjem</translation> @@ -4509,6 +4517,7 @@ <translation id="5294097441441645251">Začeti se mora z majhnim znakom ali podčrtajem</translation> <translation id="5294618183559481278">Naprava <ph name="DEVICE_TYPE" /> uporablja vgrajeno tipalo za zaznavanje oseb pred napravo. Vsi podatki so v napravi takoj obdelani in nato izbrisani. Podatki tipal niso nikoli poslani Googlu. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Poslušajte glasovni odziv, da lahko napravo uporabljate, ne da bi gledali na njen zaslon. Povratne informacije v braillovi pisavi so na voljo v povezani napravi.</translation> +<translation id="5297005732522718715">Osveži konfiguracijo povezave računalnika z internetom prek mobilnega telefona</translation> <translation id="5297082477358294722">Geslo je shranjeno. Shranjena gesla si lahko ogledate in jih upravljate tukaj: <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Ko nekdo drug pogleda na vaš zaslon, se v spodnjem desnem kotu zaslona prikaže ikona očesa za zaščito zasebnosti.</translation> <translation id="5298219193514155779">Avtor teme</translation> @@ -4679,11 +4688,13 @@ <translation id="5466374726908360271">&Prilepi in poišči »<ph name="SEARCH_TERMS" />«</translation> <translation id="5467207440419968613">Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Iskanje datotečnih sredstev v skupni rabi</translation> +<translation id="5468330507528805311">Stanje povezave računalnika z internetom prek mobilnega telefona:</translation> <translation id="5468881191994555667">Izberite datoteko</translation> <translation id="5469852975082458401">Po straneh se lahko premikate s kazalcem besedila. Pritisnite F7 za izklop.</translation> <translation id="5470735824776589490">Pred ponastavitvijo naprave s funkcijo Powerwash je potreben vnovičen zagon. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Pozdravljeni! Jaz sem glas za pretvorbo besedila v govor.</translation> <translation id="5472627187093107397">Shrani gesla za to spletno mesto</translation> +<translation id="5473062644742711742">Poiščite več orodij za ljudi s posebnimi potrebami v Spletni trgovini Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Če nadaljujete, se strinjate, da lahko ta naprava tudi samodejno prenaša in namešča posodobitve in aplikacije Googla, operaterja in proizvajalca te otrokove naprave – morda s prenosom podatkov v mobilnih omrežjih. Nekatere od teh aplikacij morda ponujajo nakupe v aplikaciji.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{Koda PIN mora vsebovati najmanj en znak}one{Koda PIN mora vsebovati najmanj # znak}two{Koda PIN mora vsebovati najmanj # znaka}few{Koda PIN mora vsebovati najmanj # znake}other{Koda PIN mora vsebovati najmanj # znakov}}</translation> @@ -4956,6 +4967,7 @@ <translation id="5734362860645681824">Komunikacije</translation> <translation id="5734697361979786483">Dodajanje datotečnega sredstva v skupni rabi</translation> <translation id="5736796278325406685">Vnesite veljavno uporabniško ime</translation> +<translation id="5738093759615225354">Za prijavo v računalnik potrebujete to geslo.</translation> <translation id="5739017626473506901">Prijavite se, če želite uporabniku <ph name="USER_NAME" /> pomagati dodati šolski račun</translation> <translation id="5739235828260127894">Čakanje na potrditev. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Zelo velika</translation> @@ -5117,6 +5129,7 @@ <translation id="589541317545606110">Išči po strani s tem: <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Ne dovoli</translation> <translation id="5900186025777217044">Funkcija Smart Lock je spremenjena</translation> +<translation id="5900243355162006650">Konfiguracija povezave računalnika z internetom prek mobilnega telefona:</translation> <translation id="5900302528761731119">Fotografija profila Google</translation> <translation id="590036993063074298">Podrobnosti o kakovosti zrcaljenja</translation> <translation id="5901069264981746702">Podatki o prstnih odtisih so varno shranjeni in nikoli ne zapustijo naprave <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Več o tem<ph name="LINK_END" /></translation> @@ -5421,6 +5434,7 @@ <translation id="6196640612572343990">Blokiraj piškotke drugih spletnih mest</translation> <translation id="6196854373336333322">Razširitev »<ph name="EXTENSION_NAME" />« je prevzela nadzor nad nastavitvami strežnika proxy, kar pomeni, da lahko spremeni, prekine ali nadzoruje vse, kar počnete v spletu. Če ne veste, zakaj je prišlo do te spremembe, je verjetno nezaželena.</translation> <translation id="6197128521826316819">Ustvari kodo QR za to stran</translation> +<translation id="6197223946499512637">Ta gesla so v tem računalniku shranjena v funkciji Windows Hello. Niso shranjena v vašem računu Google.</translation> <translation id="6198252989419008588">Spremeni PIN</translation> <translation id="6200047250927636406">Zavrzi datoteko</translation> <translation id="6200151268994853226">Upravljanje razširitve</translation> @@ -5718,6 +5732,7 @@ <translation id="6482559668224714696">Celozaslonska lupa</translation> <translation id="6483485061007832714">Odpiranje prenosa</translation> <translation id="6483805311199035658">Odpiranje datoteke <ph name="FILE" /> ...</translation> +<translation id="6486301003991593638">Če želite upravljati gesla, uporabite novejšo različico sistema Windows.</translation> <translation id="6488384360522318064">Izbira jezika</translation> <translation id="648927581764831596">Ni na voljo</translation> <translation id="6490471652906364588">Naprava USB-C (desna vrata)</translation> @@ -6310,6 +6325,7 @@ <translation id="7029307918966275733">Crostini ni nameščen. Namestite ga, če si želite ogledati datoteko z ustvarjalci.</translation> <translation id="7029809446516969842">Gesla</translation> <translation id="7030304022046916278">Pošlje URL-je Varnemu brskanju, da jih ta preveri.</translation> +<translation id="7030695672997239647">Z desnim gumbom kliknite zavihek in izberite »Dodaj zavihek skupini«, nato pa izberite »Nova skupina«.</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – povezana so serijska vrata</translation> <translation id="7033616203784997570">Vnos ima lahko največ 62 znakov.</translation> <translation id="7034692021407794547">Skrbnik s pravicami za upravljanje obračunavanja mora najprej sprejeti pogoje storitve za strojno opremo za Google Meet v razdelku Strojna oprema za Google Meet v skrbniški konzoli.</translation> @@ -6482,7 +6498,7 @@ <translation id="7227458944009118910">Spodaj navedene aplikacije lahko obravnavajo tudi povezave za protokol. Druge aplikacije bodo zahtevale dovoljenje.</translation> <translation id="7228523857728654909">Zaklepanje zaslona in prijava</translation> <translation id="7230222852462421043">&Obnovi okno</translation> -<translation id="7231260028442989757">Oglejte si obvestila telefona, jih opustite ali odgovorite nanje.</translation> +<translation id="7231260028442989757">Ogled obvestil telefona, njihovo opuščanje in odgovarjanje nanje.</translation> <translation id="7232750842195536390">Preimenovanje ni uspelo</translation> <translation id="723343421145275488">Išči slike s tem: <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="7234010996000898150">Preklic obnovitve vsebnika za Linux</translation> @@ -7335,7 +7351,7 @@ <translation id="8037357227543935929">Zahteva (privzeto)</translation> <translation id="803771048473350947">Datoteka</translation> <translation id="8041089156583427627">Pošlji povratne informacije</translation> -<translation id="8041267120753677077">Pretočno predvajanje aplikacij telefona</translation> +<translation id="8041267120753677077">Pretočno predvajanje aplikacij telefona.</translation> <translation id="8042142357103597104">Neprosojnost besedila</translation> <translation id="8042331986490021244">Gesla so šifrirana v napravi, preden se shranijo v Google Upravitelju gesel.</translation> <translation id="8044262338717486897"><ph name="LINUX_APP_NAME" /> se ne odziva.</translation> @@ -7412,6 +7428,7 @@ <translation id="8101987792947961127">Pri naslednjem zagonu je treba izvesti Powerwash</translation> <translation id="81020759409809034">Lokalna lokacija</translation> <translation id="8102139037507939978">Odstrani podatke, ki omogočajo osebno prepoznavo, iz datoteke system_logs.txt.</translation> +<translation id="810362914482827094">Iskanje gesel</translation> <translation id="8104088837833760645">Prenesi profil za e-SIM</translation> <translation id="8105368624971345109">Izklop</translation> <translation id="8107015733319732394">Nameščanje Trgovine Google Play v napravi <ph name="DEVICE_TYPE" />. To lahko traja nekaj minut.</translation> @@ -7859,6 +7876,7 @@ <translation id="8557022314818157177">Varnostnega ključa se dotikajte, dokler ne bo prstni odtis zabeležen</translation> <translation id="8557180006508471423">Vklopite Google Chrome v lokacijskih storitvah v Macu</translation> <translation id="8557856025359704738">Naslednji prenos: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Gesla</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Odpri vse v &novem oknu}=1{Odpri v &novem oknu}one{Odpri vse ({COUNT}) v &novem oknu}two{Odpri vse ({COUNT}) v &novem oknu}few{Odpri vse ({COUNT}) v &novem oknu}other{Odpri vse ({COUNT}) v &novem oknu}}</translation> <translation id="8561206103590473338">Slon</translation> <translation id="8561565784790166472">Nadaljujte previdno</translation> @@ -7985,6 +8003,7 @@ <translation id="8677212948402625567">Strni vse ...</translation> <translation id="867767487203716855">Naslednja posodobitev</translation> <translation id="8677859815076891398">Ni albumov. Ustvarite album v <ph name="LINK_BEGIN" />Googlu Foto<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Znova zaženi in prenesi samodejne posodobitve</translation> <translation id="8678538439778360739">Podatki so šifrirani z vašim geslom za sinhronizacijo ob <ph name="TIME" />. To ne vključuje plačilnih sredstev in naslovov iz Googla Pay.</translation> <translation id="8678582529642151449">Zavihki se ne skrčijo.</translation> <translation id="8678933587484842200">Kako želite, da se zažene ta aplikacija?</translation> @@ -8234,6 +8253,7 @@ <translation id="8910987510378294980">Skrivanje seznama naprav</translation> <translation id="8912362522468806198">Račun Google</translation> <translation id="8912810933860534797">Omogočanje samodejnega iskanja</translation> +<translation id="8915307125957890427">Z desnim gumbom kliknite zavihek in izberite »Dodaj zavihek skupini«, nato pa izberite »Nova skupina«.</translation> <translation id="8915370057835397490">Nalaganje predloga</translation> <translation id="8916476537757519021">Podokvir za anonimni način: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> – <ph name="DEVICE_TYPE" /></translation> @@ -8308,6 +8328,7 @@ <translation id="8986362086234534611">Pozabi</translation> <translation id="8986494364107987395">Samodejno pošlji statistične podatke o uporabi in poročila o zrušitvah Googlu</translation> <translation id="8987927404178983737">Mesec</translation> +<translation id="8989359959810288806">Osveži stanje povezave računalnika z internetom prek mobilnega telefona</translation> <translation id="8991520179165052608">Spletno mesto lahko uporablja vaš mikrofon</translation> <translation id="899384117894244799">Odstranitev omejenega uporabnika</translation> <translation id="899403249577094719">Osnovni spletni naslov Netscapeovega potrdila</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index 28d9339..663ff09 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Përdor mikrofonin dhe kamerën</translation> <translation id="1005333234656240382">Të aktivizohet korrigjimi i ADB-së?</translation> <translation id="1006873397406093306">Kjo shtesë mund të lexojë dhe të ndryshojë të dhënat në sajte. Mund të kontrollosh se në cilat sajte mund të qaset shtesa.</translation> +<translation id="1007057452468855774">Aktivizo "Dyqanin e Google Play"</translation> <translation id="1008186147501209563">Eksporto faqeshënuesit</translation> <translation id="1008557486741366299">Jo tani</translation> <translation id="1009476156254802388">Vendndodhja e <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Kontrollet e lojës janë të disponueshme tani</translation> <translation id="1010498023906173788">Kjo skedë është e lidhur me një portë seriale.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{faqe nuk reagon}other{faqe nuk reagojnë}}</translation> +<translation id="1011003645819296594">Pajisjet e ruajtura</translation> <translation id="1011355516189274711">Volumi për "tekstin në ligjërim"</translation> <translation id="1012794136286421601">Skedarët e dokumenteve, fletëllogaritëset dhe vizatimeve po sinkronizohen. Hap aplikacionin "Disku i Google" për të pasur qasje te to në linjë ose jashtë linje.</translation> <translation id="1012876632442809908">Pajisja USB-C (porta përpara)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">Përdor këtë pajisje</translation> <translation id="1470946456740188591">Për të aktivizuar ose çaktivizuar shfletimin me kursor teksti, përdor shkurtoren "Ctrl+Kërko+7"</translation> <translation id="1472675084647422956">Shfaq më shumë</translation> +<translation id="1473223074251193484">Cakto konfigurimin e ndarjes së internetit</translation> <translation id="1474785664565228650">Ndryshimi në cilësimin e mikrofonit kërkon që të riniset Parallels Desktop. Rinis Parallels Desktop për të vazhduar.</translation> <translation id="1474893630593443211">Më shumë kontroll mbi reklamat që shikon</translation> <translation id="1475502736924165259">Ke certifikata në skedar që nuk përputhen në asnjë nga kategoritë e tjera</translation> @@ -1110,6 +1113,7 @@ <translation id="2044014337866019681">Sigurohu që po verifikon <ph name="ACCOUNT" /> për të shkyçur sesionin.</translation> <translation id="204497730941176055">Microsoft Certificate Template Name</translation> <translation id="2045117674524495717">Ndihmësi i shkurtoreve të tastierës</translation> +<translation id="2045211794962848221">Nuk do ta shikosh më këtë mesazh specifik</translation> <translation id="2045969484888636535">Vazhdo bllokimin e kukive</translation> <translation id="204622017488417136">Pajisja do të kthehet në versionin e instaluar më parë të Chrome. Të gjitha llogaritë e përdoruesit dhe të dhënat lokale do të hiqen. Kjo nuk mund të zhbëhet.</translation> <translation id="2046702855113914483">Ramen</translation> @@ -3796,6 +3800,7 @@ <translation id="4594577641390224176">Po kërkon për faqen e informacioneve të sistemit? Vizito</translation> <translation id="4595560905247879544">Aplikacionet dhe shtesat mund të modifikohen vetëm nga menaxheri (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Ke certifikata në skedar që identifikojnë këta serverë</translation> +<translation id="4598345735110653698">Menaxho çelësat e kalimit</translation> <translation id="4598556348158889687">Menaxhimi i hapësirës ruajtëse</translation> <translation id="4598776695426288251">Wi-Fi i disponueshëm nëpërmjet shumë pajisjeve</translation> <translation id="4601426376352205922">Shëno si të palexuar</translation> @@ -4021,6 +4026,7 @@ <translation id="4823894915586516138">Ky kod PIN ose fjalëkalim i mbron të dhënat e tua në këtë <ph name="DEVICE_TYPE" />, duke përfshirë çdo informacion ku ke qasje nga telefoni yt.</translation> <translation id="4824037980212326045">Rezervimi dhe restaurimi i Linux</translation> <translation id="4824958205181053313">Të anulohet sinkronizimi?</translation> +<translation id="4825532258163983651">Çelësi i kalimit nuk mund të fshihet</translation> <translation id="4827675678516992122">Nuk mund të lidhej</translation> <translation id="4827784381479890589">Kontrolli drejtshkrimor i përmirësuar në shfletuesin Chrome (teksti dërgohet te Google për sugjerime për drejtshkrimin)</translation> <translation id="4827904420700932487">Krijo kodin QR për këtë imazh</translation> @@ -4283,6 +4289,7 @@ <translation id="5087249366037322692">Shtuar nga një palë e tretë</translation> <translation id="5087580092889165836">Shto kartë</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 me enkriptim RSA</translation> +<translation id="5089763948477033443">Doreza e ndryshimit të përmasave për panelin anësor</translation> <translation id="5090637338841444533">Nuk lejohen të monitorojnë pozicionin e kamerës</translation> <translation id="5093569275467863761">Nënkorniza e memories specifike të faqes së plotë "të fshehtë": <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Mund të hapësh dhe të modifikosh skedarët e mbështetur me këtë aplikacion nga aplikacioni "Skedarët" ose aplikacione të tjera. Për të kontrolluar se cilët skedarë hapin këtë aplikacion si parazgjedhje, <ph name="BEGIN_LINK" />mëso se si të caktosh aplikacionet e parazgjedhura në pajisjen tënde<ph name="END_LINK" />.</translation> @@ -4448,6 +4455,7 @@ <translation id="5258992782919386492">Instaloje në këtë pajisje</translation> <translation id="5260334392110301220">Citimet inteligjente</translation> <translation id="5260508466980570042">Na vjen keq, mail-i yt ose fjalëkalimi nuk mundën të verifikoheshin. Provo sërish.</translation> +<translation id="5260958083445173099">Sajtet e uebit do t'i shfaqin përmbajtjet në gjuhët e tua të preferuara, kur të jetë e mundur</translation> <translation id="5261683757250193089">Hap te "Dyqani i uebit"</translation> <translation id="5262178194499261222">Hiq fjalëkalimin</translation> <translation id="5262784498883614021">Lidhu automatikisht me rrjetin</translation> @@ -4488,6 +4496,7 @@ <translation id="5294097441441645251">Duhet të fillojë me një shkronjë të vogël ose vizë poshtë</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> përdor një sensor të integruar për të zbuluar personat përpara pajisjes sate. Të gjitha të dhënat përpunohen në pajisjen tënde menjëherë dhe më pas fshihen. Të dhënat e sensorit nuk i dërgohen asnjëherë Google. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Dëgjo komentet me zë që të mund ta përdorësh pajisjen pa shikuar në ekran. Komentet në breil ofrohen me një pajisje të lidhur.</translation> +<translation id="5297005732522718715">Rifresko konfigurimin e ndarjes së internetit</translation> <translation id="5297082477358294722">Fjalëkalimi u ruajt. Shfaq dhe menaxho fjalëkalimet e ruajtura në <ph name="SAVED_PASSWORDS_STORE" />.</translation> <translation id="5297946558563358707">Kur dikush tjetër shikon ekranin tënd, shfaq ikonën e "Syrit të privatësisë" në pjesën e poshtme djathtas të ekranit</translation> <translation id="5298219193514155779">Tema u krijua nga</translation> @@ -4658,6 +4667,7 @@ <translation id="5466374726908360271">Ngj&it dhe kërko për “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Të bllokuara: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Po kërkon për ndarjet e skedarëve</translation> +<translation id="5468330507528805311">Statusi i ndarjes së internetit:</translation> <translation id="5468881191994555667">Zgjidh skedarin</translation> <translation id="5469852975082458401">Mund t'i navigosh faqet me një kursor teksti. Shtyp F7 për ta çaktivizuar.</translation> <translation id="5470735824776589490">Kërkohet një rinisje para se pajisja jote të mund të rivendoset me Powerwash. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> @@ -4933,6 +4943,7 @@ <translation id="5734362860645681824">Komunikimet</translation> <translation id="5734697361979786483">Shto një ndarje të skedarit</translation> <translation id="5736796278325406685">Fut një emër të vlefshëm përdoruesi</translation> +<translation id="5738093759615225354">Të duhet ky çelës kalimi për t'u identifikuar në kompjuterin tënd</translation> <translation id="5739017626473506901">Identifikohu për të ndihmuar që <ph name="USER_NAME" /> të shtojë një llogari të shkollës</translation> <translation id="5739235828260127894">Në pritje të verifikimit. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Shumë të mëdha</translation> @@ -5094,6 +5105,7 @@ <translation id="589541317545606110">Kërko në faqe me <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Mos lejo</translation> <translation id="5900186025777217044">Smart Lock ka ndryshuar</translation> +<translation id="5900243355162006650">Konfigurimi i ndarjes së internetit:</translation> <translation id="5900302528761731119">Fotografia e profilit të Google</translation> <translation id="590036993063074298">Detajet e cilësisë së pasqyrimit</translation> <translation id="5901069264981746702">Të dhënat e gjurmëve të tua të gishtave ruhen në mënyrë të sigurt dhe asnjëherë nuk largohen nga pajisja jote <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Mëso më shumë<ph name="LINK_END" /></translation> @@ -5398,6 +5410,7 @@ <translation id="6196640612572343990">Blloko kukit e palëve të treta</translation> <translation id="6196854373336333322">Shtesa <ph name="EXTENSION_NAME" /> ka marrë nën kontroll cilësimet e përfaqësuesit, që do të thotë se mund të ndryshojë, shkelë ose përgjojë çdo gjë që ti bën në linjë. Nëse s'je i sigurt se pse ndodhi ky ndryshim, ndoshta nuk e do.</translation> <translation id="6197128521826316819">Krijo kodin QR për këtë faqe</translation> +<translation id="6197223946499512637">Këta çelësa kalimi janë ruajtur në Windows Hello në këtë kompjuter. Ata nuk janë ruajtur në "Llogarinë tënde të Google".</translation> <translation id="6198252989419008588">Ndrysho kodin PIN</translation> <translation id="6200047250927636406">Hiq skedarin</translation> <translation id="6200151268994853226">Menaxho shtesën</translation> @@ -5695,6 +5708,7 @@ <translation id="6482559668224714696">Zmadhuesi në ekran të plotë</translation> <translation id="6483485061007832714">Hap shkarkimin</translation> <translation id="6483805311199035658">Po hap <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Për të menaxhuar çelësat e kalimit, përdor një version më të ri të Windows</translation> <translation id="6488384360522318064">Zgjidh gjuhën</translation> <translation id="648927581764831596">Nuk ofrohet asnjë</translation> <translation id="6490471652906364588">Pajisja USB-C (porta djathtas)</translation> @@ -6281,6 +6295,7 @@ <translation id="7029307918966275733">Crostini nuk është instaluar. Instalo Crostini për të parë kreditet.</translation> <translation id="7029809446516969842">Fjalëkalimet</translation> <translation id="7030304022046916278">I dërgon URL-të te "Shfletimi i sigurt" për t'i kontrolluar</translation> +<translation id="7030695672997239647">Kliko me butonin djathtas në një skedë, zgjidh "Shto skedën te grupi" dhe më pas zgjidh "Grup i ri"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Porta seriale e lidhur</translation> <translation id="7033616203784997570">Hyrja duhet të jetë maksimumi 62 karaktere</translation> <translation id="7034692021407794547">Një administrator me privilegjet e "Menaxhimit të faturimit" duhet të pranojë në fillim Kushtet e shërbimit të Google Meet Hardware në seksionin Google Meet Hardware të panelit të administratorit.</translation> @@ -7380,6 +7395,7 @@ <translation id="8101987792947961127">Kërkohet Powerwash me rindezjen e ardhshme</translation> <translation id="81020759409809034">Vendndodhja lokale</translation> <translation id="8102139037507939978">Hiq informacionin e idetifikueshëm personalisht nga system_logs.txt.</translation> +<translation id="810362914482827094">Kërko te çelësat e kalimit</translation> <translation id="8104088837833760645">Shkarko profilin e kartës eSIM</translation> <translation id="8105368624971345109">Çaktivizo</translation> <translation id="8107015733319732394">Po instalon Google Play Store në pajisjen tënde <ph name="DEVICE_TYPE" />. Kjo mund të kërkojë disa minuta kohë.</translation> @@ -7827,6 +7843,7 @@ <translation id="8557022314818157177">Vazhdo të prekësh çelësin e sigurisë deri sa gjurma e gishtit tënd të regjistrohet</translation> <translation id="8557180006508471423">Aktivizo "Google Chrome" te "Shërbimet e vendndodhjes" në kompjuterin tënd Mac</translation> <translation id="8557856025359704738">Shkarkimi tjetër është më <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Çelësat e kalimit</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Hapi të gjitha në &dritare të re}=1{Hape në &dritare të re}other{Hapi të gjitha ({COUNT}) në &dritare të re}}</translation> <translation id="8561206103590473338">Elefant</translation> <translation id="8561565784790166472">Vazhdo me kujdes</translation> @@ -7953,6 +7970,7 @@ <translation id="8677212948402625567">Palosi të gjitha...</translation> <translation id="867767487203716855">Përditësimi tjetër</translation> <translation id="8677859815076891398">Nuk ka albume. Krijo një album te <ph name="LINK_BEGIN" />Fotografitë e Google<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Rinis dhe merr përditësimet automatike</translation> <translation id="8678538439778360739">Të dhënat janë enkriptuar me frazën tënde të kalimit në datën <ph name="TIME" />. Kjo nuk përfshin mënyrat e pagesës dhe adresat nga Google Pay.</translation> <translation id="8678582529642151449">Skedat nuk tkurren</translation> <translation id="8678933587484842200">Si dëshiron që të hapet ky aplikacion?</translation> @@ -8199,6 +8217,7 @@ <translation id="8910987510378294980">Fshih listën e pajisjeve</translation> <translation id="8912362522468806198">Llogaria e Google</translation> <translation id="8912810933860534797">Aktivizo skanimin automatik</translation> +<translation id="8915307125957890427">Kliko me butonin djathtas në një skedë, zgjidh "Shto skedën te grupi" dhe më pas zgjidh "Grup i ri"</translation> <translation id="8915370057835397490">Po ngarkon sugjerimin</translation> <translation id="8916476537757519021">Nënkorniza "e fshehtë": <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> që ka <ph name="GIVEN_NAME" /></translation> @@ -8273,6 +8292,7 @@ <translation id="8986362086234534611">Harro</translation> <translation id="8986494364107987395">Dërgo automatikisht te Google statistikat e përdorimit dhe raportet e ndërprerjeve aksidentale</translation> <translation id="8987927404178983737">Muaji</translation> +<translation id="8989359959810288806">Rifresko statusin e ndarjes së internetit</translation> <translation id="8991520179165052608">Sajti mund të përdorë mikrofonin tënd</translation> <translation id="899384117894244799">Hiq përdoruesin e kufizuar</translation> <translation id="899403249577094719">URL-ja e bazës së certifikatës së Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 52d8526..de4b183 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -682,7 +682,7 @@ <translation id="1637224376458524414">Koristite ovaj obeleživač na iPhone-u</translation> <translation id="1637350598157233081">Lozinka je sačuvana na ovom uređaju</translation> <translation id="1637765355341780467">Došlo je do problema pri otvaranju profila. Neke funkcije će možda biti nedostupne.</translation> -<translation id="1639239467298939599">Učitavanje</translation> +<translation id="1639239467298939599">Učitava se</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> još uvek ne radi u Linux aplikacijama</translation> <translation id="1640283014264083726">PKCS #1 MD4 sa RSA šifrovanjem</translation> <translation id="1641113438599504367">Bezbedno pregledanje</translation> @@ -7964,6 +7964,7 @@ <translation id="8666759526542103597">O personalizaciji oglasa na osnovu pregledača</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> je sada u režimu celog ekrana i onemogućio je kursor.</translation> <translation id="8667760277771450375">Istražujemo načine da ograničimo praćenje na različitim sajtovima i istovremeno omogućimo sajtovima da zaustave nepoželjne oglase i prevare.</translation> +<translation id="8668378421690365723">Uređaj možda više neće raditi kako treba i možda će imati problema sa bezbednošću i performansama.</translation> <translation id="8669284339312441707">Toplije</translation> <translation id="8670537393737592796">Da biste se ovde brzo vraćali, instalirajte aplikaciju <ph name="APP_NAME" /> klikom na dugme Instaliraj</translation> <translation id="867085395664725367">Došlo je do privremene greške servera.</translation> @@ -8449,6 +8450,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Za najbolji doživljaj instalirajte <ph name="DEVICE_OS" /> na interni disk. Možete i da ga instalirate kasnije sa ekrana za prijavljivanje.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Ako niste spremni za instalaciju, možete da ga pokrenete sa USB-a da biste ga isprobali. Time ćete zadržati postojeći OS i podatke, ali možda ćete primetiti ograničenja u pogledu memorijskog prostora i performansi.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Otvori kao zakačenu karticu</translation> +<translation id="9123287046453017203">Uređaj nije ažuriran</translation> <translation id="9124003689441359348">Sačuvane lozinke će se pojaviti ovde</translation> <translation id="9126149354162942022">Boja kursora</translation> <translation id="9128317794749765148">Podešavanje nije dovršeno</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index 5d7900a..6806695 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -682,7 +682,7 @@ <translation id="1637224376458524414">Користите овај обележивач на iPhone-у</translation> <translation id="1637350598157233081">Лозинка је сачувана на овом уређају</translation> <translation id="1637765355341780467">Дошло је до проблема при отварању профила. Неке функције ће можда бити недоступне.</translation> -<translation id="1639239467298939599">Учитавање</translation> +<translation id="1639239467298939599">Учитава се</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> још увек не ради у Linux апликацијама</translation> <translation id="1640283014264083726">PKCS #1 MD4 са RSA шифровањем</translation> <translation id="1641113438599504367">Безбедно прегледање</translation> @@ -7964,6 +7964,7 @@ <translation id="8666759526542103597">О персонализацији огласа на основу прегледача</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> је сада у режиму целог екрана и онемогућио је курсор.</translation> <translation id="8667760277771450375">Истражујемо начине да ограничимо праћење на различитим сајтовима и истовремено омогућимо сајтовима да зауставе непожељне огласе и преваре.</translation> +<translation id="8668378421690365723">Уређај можда више неће радити како треба и можда ће имати проблема са безбедношћу и перформансама.</translation> <translation id="8669284339312441707">Топлије</translation> <translation id="8670537393737592796">Да бисте се овде брзо враћали, инсталирајте апликацију <ph name="APP_NAME" /> кликом на дугме Инсталирај</translation> <translation id="867085395664725367">Дошло је до привремене грешке сервера.</translation> @@ -8449,6 +8450,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />За најбољи доживљај инсталирајте <ph name="DEVICE_OS" /> на интерни диск. Можете и да га инсталирате касније са екрана за пријављивање.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Ако нисте спремни за инсталацију, можете да га покренете са USB-а да бисте га испробали. Тиме ћете задржати постојећи ОС и податке, али можда ћете приметити ограничења у погледу меморијског простора и перформанси.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Отвори као закачену картицу</translation> +<translation id="9123287046453017203">Уређај није ажуриран</translation> <translation id="9124003689441359348">Сачуване лозинке ће се појавити овде</translation> <translation id="9126149354162942022">Боја курсора</translation> <translation id="9128317794749765148">Подешавање није довршено</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index 6adc34b67..410d71b 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Använd mikrofonen och kameran</translation> <translation id="1005333234656240382">Vill du aktivera felsökning med ADB?</translation> <translation id="1006873397406093306">Det här tillägget kan läsa och ändra dina uppgifter på webbplatser. Du kan styra vilka webbplatser som tillägget har tillgång till.</translation> +<translation id="1007057452468855774">Aktivera Google Play Butik</translation> <translation id="1008186147501209563">Exportera bokmärken</translation> <translation id="1008557486741366299">Inte nu</translation> <translation id="1009476156254802388">Plats på <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Nu är spelkontroller tillgängliga</translation> <translation id="1010498023906173788">Fliken är kopplad till en serieport.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{sida svarar inte}other{sidor svarar inte}}</translation> +<translation id="1011003645819296594">Sparade enheter</translation> <translation id="1011355516189274711">Volym för text till tal</translation> <translation id="1012794136286421601">Dina dokument, kalkylark, bildspelsbilder och ritningar synkroniseras. Öppna appen Google Drive om du vill öppna dem online eller offline.</translation> <translation id="1012876632442809908">USB-C-enhet (främre port)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Använd den här enheten</translation> <translation id="1470946456740188591">Aktivera eller inaktivera textmarkörläge med kortkommandot Ctrl+Sök+7</translation> <translation id="1472675084647422956">Visa fler</translation> +<translation id="1473223074251193484">Konfigurera internetdelning</translation> <translation id="1474785664565228650">Ändringen av mikrofoninställning kräver att Parallels Desktop startas om. Starta om Parallels Desktop för att fortsätta.</translation> <translation id="1474893630593443211">Mer kontroll över vilka annonser som visas</translation> <translation id="1475502736924165259">Du har certifikat i din dator som inte passar i några av de andra kategorierna</translation> @@ -683,7 +686,7 @@ <translation id="1637224376458524414">Få det här bokmärket till din iPhone</translation> <translation id="1637350598157233081">Lösenordet har sparats på den här enheten</translation> <translation id="1637765355341780467">Något gick snett när profilen skulle öppnas. Vissa funktioner kanske inte är tillgängliga.</translation> -<translation id="1639239467298939599">Läser in</translation> +<translation id="1639239467298939599">Profilen läses in</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> fungerar inte i Linux-appar ännu</translation> <translation id="1640283014264083726">PKCS #1 MD4 med RSA-kryptering</translation> <translation id="1641113438599504367">Säker webbsökning</translation> @@ -1125,6 +1128,7 @@ <translation id="2044014337866019681">Kontrollera att du verifierar <ph name="ACCOUNT" /> om du vill låsa upp sessionen.</translation> <translation id="204497730941176055">Namn på Microsoft-certifikatmall</translation> <translation id="2045117674524495717">Hjälp med kortkommandon</translation> +<translation id="2045211794962848221">Det här meddelandet visas inte igen</translation> <translation id="2045969484888636535">Fortsätt att blockera cookies</translation> <translation id="204622017488417136">Enheten kommer att återgå till den tidigare installerade versionen av Chrome. Alla användarkonton och lokala uppgifter kommer att tas bort. Det går inte att ångra åtgärden.</translation> <translation id="2046702855113914483">Ramen (nudelsoppa)</translation> @@ -3814,6 +3818,7 @@ <translation id="4594577641390224176">Letar du systemets about-sida? Besök</translation> <translation id="4595560905247879544">Appar och tillägg kan bara ändras av den ansvariga (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Du har sparade certifikat som identifierar dessa servrar</translation> +<translation id="4598345735110653698">Hantera nycklar</translation> <translation id="4598556348158889687">Lagringshantering</translation> <translation id="4598776695426288251">wifi är tillgängligt via flera enheter</translation> <translation id="4601426376352205922">Markera som oläst</translation> @@ -4039,6 +4044,7 @@ <translation id="4823894915586516138">Med pinkoden eller lösenordet skyddas din data på denna <ph name="DEVICE_TYPE" />, inklusive information du kommer åt från telefonen.</translation> <translation id="4824037980212326045">Säkerhetskopiering och återställning i Linux</translation> <translation id="4824958205181053313">Vill du avbryta synkroniseringen?</translation> +<translation id="4825532258163983651">Det gick inte att radera nyckeln</translation> <translation id="4827675678516992122">Det gick inte att ansluta</translation> <translation id="4827784381479890589">Utökad stavningskontroll i webbläsaren Chrome (texten skickas till Google för stavningsförslag)</translation> <translation id="4827904420700932487">Skapa QR-kod för den här bilden</translation> @@ -4301,6 +4307,7 @@ <translation id="5087249366037322692">Har lagts till av tredje part</translation> <translation id="5087580092889165836">Lägg till kort</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 med RSA-kryptering</translation> +<translation id="5089763948477033443">Storlekshandtag för sidopanel</translation> <translation id="5090637338841444533">Får inte registrera kamerans position</translation> <translation id="5093569275467863761">Inkognitounderram i vilocacheminne: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Du kan öppna och redigera filer som stöds i den här appen via appen Filer eller andra appar. <ph name="BEGIN_LINK" />Läs mer om hur du ställer in standardappar på enheten<ph name="END_LINK" /> om du vill styra vilka filer som öppnas i den här appen som standard.</translation> @@ -4466,6 +4473,7 @@ <translation id="5258992782919386492">Installera på den här enheten</translation> <translation id="5260334392110301220">Smarta citattecken</translation> <translation id="5260508466980570042">Det gick inte att verifiera e-postadressen eller lösenordet. Försök igen.</translation> +<translation id="5260958083445173099">När det är möjligt visas innehåll på webbplatser på de önskade språken</translation> <translation id="5261683757250193089">Öppna i Web Store</translation> <translation id="5262178194499261222">Ta bort lösenordet</translation> <translation id="5262784498883614021">Anslut till ett nätverk automatiskt</translation> @@ -4506,6 +4514,7 @@ <translation id="5294097441441645251">Det måste börja med en gemen eller ett understreck</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> registrerar om någon befinner sig framför enheten med hjälp av en inbyggd sensor. All data bearbetas direkt på enheten och raderas sedan. Ingen sensordata skickas till Google. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Få talad feedback så att du kan använda enheten utan att titta på skärmen. Punktskriftsfeedback är tillgängligt med en ansluten enhet.</translation> +<translation id="5297005732522718715">Uppdatera konfigurationen för internetdelning</translation> <translation id="5297082477358294722">Lösenordet sparades. Visa och hantera sparade lösenord i <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="5297946558563358707">Visa ögonikonen för integritet nere till höger på skärmen när någon annan tittar på skärmen</translation> <translation id="5298219193514155779">Temat skapades av</translation> @@ -4676,6 +4685,7 @@ <translation id="5466374726908360271">Kli&stra in och sök efter <ph name="SEARCH_TERMS" /></translation> <translation id="5467207440419968613">Behörighet till <ph name="PERMISSION_1" /> och <ph name="PERMISSION_2" /> har blockerats</translation> <translation id="5468173180030470402">Söker efter filresurser</translation> +<translation id="5468330507528805311">Status för internetdelning:</translation> <translation id="5468881191994555667">Välj fil</translation> <translation id="5469852975082458401">Du kan navigera på sidor med en textmarkör. Tryck på F7 om du vill inaktivera detta.</translation> <translation id="5470735824776589490">En omstart krävs innan enheten kan återställas med Powerwash. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> @@ -4951,6 +4961,7 @@ <translation id="5734362860645681824">Kommunikation</translation> <translation id="5734697361979786483">Lägg till filresurs</translation> <translation id="5736796278325406685">Ange ett giltigt användarnamn</translation> +<translation id="5738093759615225354">Du behöver den här nyckeln för att logga in på datorn</translation> <translation id="5739017626473506901">Logga in för att hjälpa <ph name="USER_NAME" /> att lägga till ett skolkonto</translation> <translation id="5739235828260127894">Väntar på verifiering. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Mycket stor</translation> @@ -5112,6 +5123,7 @@ <translation id="589541317545606110">Sök på sidan med <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Tillåt inte</translation> <translation id="5900186025777217044">Smart Lock har ändrats</translation> +<translation id="5900243355162006650">Konfiguration för internetdelning:</translation> <translation id="5900302528761731119">Profilbild i Google Profiler</translation> <translation id="590036993063074298">Information om speglingskvalitet</translation> <translation id="5901069264981746702">Fingeravtrycksdata lagras på ett säkert sätt och lämnar aldrig din <ph name="DEVICE_TYPE" />. <ph name="LINK_BEGIN" />Läs mer<ph name="LINK_END" /></translation> @@ -5416,6 +5428,7 @@ <translation id="6196640612572343990">Blockera cookies från tredje part</translation> <translation id="6196854373336333322">Tillägget <ph name="EXTENSION_NAME" /> har tagit kontroll över dina proxyinställningar, vilket innebär att det kan ändra, knäcka eller tjuvlyssna på allt du gör på webben. Om du inte vet varför den här ändringen inträffade är den troligen inte önskvärd.</translation> <translation id="6197128521826316819">Skapa QR-kod för den här sidan</translation> +<translation id="6197223946499512637">De här nycklarna lagras i Windows Hello på den här datorn. De sparas inte i Google-kontot.</translation> <translation id="6198252989419008588">Byt pinkod</translation> <translation id="6200047250927636406">Släng filen</translation> <translation id="6200151268994853226">Hantera tillägg</translation> @@ -5713,6 +5726,7 @@ <translation id="6482559668224714696">Helskärmsförstoring</translation> <translation id="6483485061007832714">Öppna nedladdning</translation> <translation id="6483805311199035658">Öppnar <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Använd en nyare version av Windows för att hantera nycklar</translation> <translation id="6488384360522318064">Välj språk</translation> <translation id="648927581764831596">Inte tillgängligt</translation> <translation id="6490471652906364588">USB-C-enhet (höger port)</translation> @@ -6299,6 +6313,7 @@ <translation id="7029307918966275733">Crostini har inte installerats. Installera Crostini för att visa upphovspersoner.</translation> <translation id="7029809446516969842">Lösenord</translation> <translation id="7030304022046916278">Webbadresser skickas till Säker webbsökning för kontroll</translation> +<translation id="7030695672997239647">Högerklicka på en flik och välj Lägg till fliken i gruppen, och välj sedan Ny grupp</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> – Serieporten är ansluten</translation> <translation id="7033616203784997570">Ange högst 62 tecken</translation> <translation id="7034692021407794547">En administratör med behörigheten Fakturahantering måste först godkänna användarvillkoren för Google Meet-maskinvara i avsnittet Google Meet-maskinvara i administratörskonsolen.</translation> @@ -7401,6 +7416,7 @@ <translation id="8101987792947961127">Powerwash krävs vid nästa omstart</translation> <translation id="81020759409809034">Plats lokalt</translation> <translation id="8102139037507939978">Ta bort uppgifter som kan kopplas till en specifik individ från system_logs.txt.</translation> +<translation id="810362914482827094">Sök efter nycklar</translation> <translation id="8104088837833760645">Ladda ned eSIM-profil</translation> <translation id="8105368624971345109">Inaktivera</translation> <translation id="8107015733319732394">Google Play Butik installeras på din <ph name="DEVICE_TYPE" />. Det kan ta några minuter.</translation> @@ -7848,6 +7864,7 @@ <translation id="8557022314818157177">Fortsätt att trycka på säkerhetsnyckeln tills fingeravtrycket registreras</translation> <translation id="8557180006508471423">Aktivera Google Chrome under Platstjänster på Mac-datorn.</translation> <translation id="8557856025359704738">Nästa nedladdning: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Nycklar</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Öppna alla i ett &nytt fönster}=1{Öppna i &nytt fönster}other{Öppna alla ({COUNT}) i ett &nytt fönster}}</translation> <translation id="8561206103590473338">Elefant</translation> <translation id="8561565784790166472">Tänk dig för innan du fortsätter</translation> @@ -7974,6 +7991,7 @@ <translation id="8677212948402625567">Dölj alla...</translation> <translation id="867767487203716855">Nästa uppdatering</translation> <translation id="8677859815076891398">Du har inga album. Skapa ett album i <ph name="LINK_BEGIN" />Google Foto<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Starta om och få automatiska uppdateringar</translation> <translation id="8678538439778360739">Data krypterades med din lösenfras för synkronisering den <ph name="TIME" />. Betalningsmetoder och adresser från Google Pay omfattas inte.</translation> <translation id="8678582529642151449">Flikar förminskas inte</translation> <translation id="8678933587484842200">Hur vill du att det här programmet ska startas?</translation> @@ -8220,6 +8238,7 @@ <translation id="8910987510378294980">Dölj enhetslista</translation> <translation id="8912362522468806198">Google-konto</translation> <translation id="8912810933860534797">Aktivera automatisk genomsökning</translation> +<translation id="8915307125957890427">Högerklicka på en flik och välj Lägg till fliken i gruppen, och välj sedan Ny grupp</translation> <translation id="8915370057835397490">Läser in förslag</translation> <translation id="8916476537757519021">Underram i inkognitoläge: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> som tillhör <ph name="GIVEN_NAME" /></translation> @@ -8294,6 +8313,7 @@ <translation id="8986362086234534611">Glöm</translation> <translation id="8986494364107987395">Skicka användningsstatistik och kraschrapporter till Google automatiskt</translation> <translation id="8987927404178983737">Månad</translation> +<translation id="8989359959810288806">Uppdatera status för internetdelning</translation> <translation id="8991520179165052608">Webbplatsen har åtkomst till din mikrofon</translation> <translation id="899384117894244799">Ta bort begränsad användare</translation> <translation id="899403249577094719">Basadress för Netscape-certifikat</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 6c5dfca2..11984ab 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Tumia kipazasauti na kamera yako</translation> <translation id="1005333234656240382">Ungependa kuwasha utatuzi wa ADB?</translation> <translation id="1006873397406093306">Kiendelezi hiki kinaweza kusoma na kubadilisha data yako kwenye tovuti. Unaweza kudhibiti tovuti ambazo kiendelezi kinaweza kufikia.</translation> +<translation id="1007057452468855774">Washa Kipengele cha Duka la Google Play</translation> <translation id="1008186147501209563">Hamisha alamisho</translation> <translation id="1008557486741366299">Si Sasa</translation> <translation id="1009476156254802388">Sehemu kwenye <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Vidhibiti vya mchezo sasa vinapatikana</translation> <translation id="1010498023906173788">Kichupo hiki kimeunganishwa kwenye mlango wa kuingiza vifaa.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Ukurasa Umekwama}other{Kurasa Zimekwama}}</translation> +<translation id="1011003645819296594">Vifaa vilivyohifadhiwa</translation> <translation id="1011355516189274711">Kiwango cha sauti ya kusoma maandishi kwa sauti</translation> <translation id="1012794136286421601">Faili zako za Hati, Majedwali, Slaidi, na Michoro zinasawazishwa. Fungua programu ya Hifadhi ya Google ili uzifikie mtandaoni ama nje ya mtandao.</translation> <translation id="1012876632442809908">Kifaa cha USB-C (mlango wa mbele)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">Tumia kifaa hiki</translation> <translation id="1470946456740188591">Ili uwashe au uzime mipangilio ya kuvinjari kwa kibodi, tumia njia ya mkato ya Ctrl+Search+7</translation> <translation id="1472675084647422956">Onyesha zaidi</translation> +<translation id="1473223074251193484">Weka Mipangilio ya Kusambaza Mtandao</translation> <translation id="1474785664565228650">Mabadiliko kwenye mipangilio ya maikrofoni yanahitaji ufungue tena Parallels Desktop. Fungua tena Parallels Desktop ili uendelee.</translation> <translation id="1474893630593443211">Udhibiti zaidi wa matangazo unayoyaona</translation> <translation id="1475502736924165259">Una vyeti kwenye faili ambavyo havilangani na aina nyingine yoyote</translation> @@ -1121,6 +1124,7 @@ <translation id="2044014337866019681">Tafadhali hakikisha unathibitisha <ph name="ACCOUNT" /> ili uweze kufungua kipindi.</translation> <translation id="204497730941176055">Jina la Kiolezo cha Cheti kutoka Microsoft</translation> <translation id="2045117674524495717">Kisaidizi cha Mikato ya Kibodi</translation> +<translation id="2045211794962848221">Hutaona tena ujumbe huu mahususi</translation> <translation id="2045969484888636535">Endelea kuzuia vidakuzi</translation> <translation id="204622017488417136">Kifaa chako kitarejeshwa kwenye toleo la awali lililosakinishwa la Chrome. Akaunti za watumiaji na data zote za karibu zitaondolewa. Hili haliwezi kutenduliwa.</translation> <translation id="2046702855113914483">Rameni</translation> @@ -3809,6 +3813,7 @@ <translation id="4594577641390224176">Je, unatafuta ukurasa wa 'kuhusu' wa mfumo? Tembelea</translation> <translation id="4595560905247879544">Programu na viendelezi vinaweza kubadilishwa na msimamizi pekee (<ph name="CUSTODIAN_NAME" />).</translation> <translation id="4596295440756783523">Una vyeti kwenye faili vinavyotambua seva hizi</translation> +<translation id="4598345735110653698">Dhibiti manenosiri</translation> <translation id="4598556348158889687">Udhibiti wa hifadhi</translation> <translation id="4598776695426288251">Wi-Fi inapatikana kupitia vifaa vingi</translation> <translation id="4601426376352205922">Tia alama kuwa Hujasoma</translation> @@ -3928,7 +3933,7 @@ <translation id="4701335814944566468">Ilitazamwa jana</translation> <translation id="470644585772471629">Ugeuzaji rangi</translation> <translation id="4707337002099455863">Imewashwa wakati wote kwenye Tovuti Zote</translation> -<translation id="4708794300267213770">Onyesha skrini iliyofungwa unapoamsha kutoka hali tuli</translation> +<translation id="4708794300267213770">Onyesha skrini iliyofungwa inapowaka kutoka katika hali tuli</translation> <translation id="4708849949179781599">Ondoka <ph name="PRODUCT_NAME" /></translation> <translation id="4711638718396952945">Rejesha mipangilio</translation> <translation id="47158868804223727">Bofya jina la kikundi ili ulipanue au ulikunje</translation> @@ -4034,6 +4039,7 @@ <translation id="4823894915586516138">PIN au nenosiri hili linalinda data yako kwenye <ph name="DEVICE_TYPE" /> hii, ikijumuisha taarifa yoyote unayoifikia kutoka kwenye simu yako</translation> <translation id="4824037980212326045">Kuhifadhi na kurejesha nakala kwenye Linux</translation> <translation id="4824958205181053313">Ungependa kughairi usawazishaji?</translation> +<translation id="4825532258163983651">Imeshindwa kufuta nenosiri</translation> <translation id="4827675678516992122">Imeshindwa kuunganisha</translation> <translation id="4827784381479890589">Kikagua maendelezo kilichoboreshwa katika kivinjari cha Chrome (maandishi hutumwa kwa Google ili ikupe mapendekezo ya maendelezo)</translation> <translation id="4827904420700932487">Tunga Msimbo wa QR wa picha hii</translation> @@ -4296,6 +4302,7 @@ <translation id="5087249366037322692">Kimeongezwa na mhusika mwingine</translation> <translation id="5087580092889165836">Ongeza kadi</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 Na Usimbaji wa RSA</translation> +<translation id="5089763948477033443">Badilisha Ukubwa wa Ncha ya Kidirisha cha Pembeni</translation> <translation id="5090637338841444533">Zisizoruhusiwa kufuatilia mkao wa kamera yako</translation> <translation id="5093569275467863761">Fremu ndogo fiche Iliyohifadhiwa kwenye Kipengele cha Kuakibisha Ukurasa Kamili: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Unaweza kufungua na kubadilisha faili zinazotumika ukitumia programu hii kutoka katika programu ya File Explorer au programu nyinginezo. Ili kudhibiti faili zipi zinazofungua programu hii kwa chaguomsingi, <ph name="BEGIN_LINK" />pata maelezo ya jinsi ya kuweka programu chaguomsingi kwenye kifaa chako<ph name="END_LINK" />.</translation> @@ -4461,6 +4468,7 @@ <translation id="5258992782919386492">Sakinisha kwenye kifaa hiki</translation> <translation id="5260334392110301220">Manukuu Mahiri</translation> <translation id="5260508466980570042">Samahani, barua pepe au nenosiri lako havikuthibitishwa. Tafadhali jaribu tena.</translation> +<translation id="5260958083445173099">Inapowezekana, tovuti zitaonyesha maudhui katika lugha unazopendelea</translation> <translation id="5261683757250193089">Fungua katika Duka la Chrome kwenye Wavuti</translation> <translation id="5262178194499261222">Ondoa nenosiri</translation> <translation id="5262784498883614021">Unganisha kiotomatiki kwenye mtandao</translation> @@ -4501,6 +4509,7 @@ <translation id="5294097441441645251">Ni lazima lianze kwa herufi ndogo au mstari wa chini</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> yako inatumia kitambuzi kilicho ndani ya kifaa ili kutambua watu walio mbele ya kifaa chako. Data yote inachakatwa kwenye kifaa chako papo hapo kisha inafutwa. Data ya vitambuzi haitumwi Google. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Sikiliza maelezo yanayotamkwa ili uweze kutumia kifaa chako bila kuangalia kwenye skrini. Maelezo ya nukta nundu yanapatikana katika kifaa kilichounganishwa.</translation> +<translation id="5297005732522718715">Onyesha Upya Mipangilio ya Kusambaza Mtandao</translation> <translation id="5297082477358294722">Imehifadhi nenosiri. Angalia na udhibiti manenosiri yaliyohifadhiwa kwenye <ph name="SAVED_PASSWORDS_STORE" /> yako.</translation> <translation id="5297946558563358707">Pale mtu mwingine anapoangalia kwenye skrini yako, onyesha aikoni ya jicho la Faragha kwenye sehemu ya chini kulia mwa skrini yako</translation> <translation id="5298219193514155779">Mandhari imeunda na</translation> @@ -4671,6 +4680,7 @@ <translation id="5466374726908360271">Ba&ndika na utafute “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">Umezuia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Inatafuta faili za kushiriki</translation> +<translation id="5468330507528805311">Hali ya Kusambaza Mtandao:</translation> <translation id="5468881191994555667">Chagua faili</translation> <translation id="5469852975082458401">Unaweza kupitia kurasa kwa kutumia kiteuzi. Bonyeza F7 ili uzime.</translation> <translation id="5470735824776589490">Unahitaji kuwasha upya kabla ya kuweka mipangilio kwenye kifaa chako ukitumia Powerwash. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> @@ -4947,6 +4957,7 @@ <translation id="5734362860645681824">Mawasiliano</translation> <translation id="5734697361979786483">Ongeza faili ya kushiriki</translation> <translation id="5736796278325406685">Tafadhali andika jina sahihi la mtumiaji</translation> +<translation id="5738093759615225354">Unahitaji nenosiri hili ili uingie katika akaunti kwenye kompyuta yako</translation> <translation id="5739017626473506901">Ingia katika akaunti ili umsaidie <ph name="USER_NAME" /> aweke akaunti ya shuleni</translation> <translation id="5739235828260127894">Inasubiri uthibitishaji. <ph name="LINK_BEGIN" />Pata maelezo zaidi.<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Kubwa sana</translation> @@ -5108,6 +5119,7 @@ <translation id="589541317545606110">Tafuta Ukurasa ukitumia <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Usiruhusu</translation> <translation id="5900186025777217044">Smart Lock imebadilishwa</translation> +<translation id="5900243355162006650">Mipangilio ya Kusambaza Mtandao:</translation> <translation id="5900302528761731119">Picha ya Wasifu katika Google</translation> <translation id="590036993063074298">Maelezo ya Ubora wa Kuakisi</translation> <translation id="5901069264981746702">Data ya alama yako ya kidole itahifadhiwa kwa usalama na itasalia kwenye <ph name="DEVICE_TYPE" /> yako. <ph name="LINK_BEGIN" />Pata maelezo zaidi<ph name="LINK_END" /></translation> @@ -5412,6 +5424,7 @@ <translation id="6196640612572343990">Zuia vidakuzi vya tovuti nyingine</translation> <translation id="6196854373336333322">Kiendelezi hiki "<ph name="EXTENSION_NAME" />" kinadhibiti mipangilio yako ya seva mbadala, kumaanisha kuwa kinaweza kubadilisha, kuvunja, au kufuatilia chochote unachokifanya mtandaoni. Ikiwa huna uhakika kwa nini mabadiliko haya yamefanyika, huenda huyahitaji.</translation> <translation id="6197128521826316819">Tunga Msimbo wa QR wa Ukurasa huu</translation> +<translation id="6197223946499512637">Manenosiri haya yamehifadhiwa katika Windows Hello kwenye kompyuta hii. Hayajahifadhiwa kwenye Akaunti yako ya Google.</translation> <translation id="6198252989419008588">Badilisha PIN</translation> <translation id="6200047250927636406">Ondoa faili</translation> <translation id="6200151268994853226">Dhibiti Kiendelezi</translation> @@ -5709,6 +5722,7 @@ <translation id="6482559668224714696">Kikuzaji cha skrini nzima</translation> <translation id="6483485061007832714">Fungua faili uliyopakua</translation> <translation id="6483805311199035658"><ph name="FILE" /> inafunguliwa...</translation> +<translation id="6486301003991593638">Ili udhibiti manenosiri, tumia toleo jipya zaidi la Windows</translation> <translation id="6488384360522318064">Chagua lugha</translation> <translation id="648927581764831596">Hakuna inayopatikana</translation> <translation id="6490471652906364588">Kifaa cha USB-C (mlango wa kulia)</translation> @@ -6295,6 +6309,7 @@ <translation id="7029307918966275733">Crostini haijasakinishwa. Tafadhali sakinisha Crostini ili uone waliohusika.</translation> <translation id="7029809446516969842">Manenosiri</translation> <translation id="7030304022046916278">Hutuma URL kwenye kipengele cha Kuvinjari Salama ili zikaguliwe</translation> +<translation id="7030695672997239647">Bofya kulia kwenye kichupo na uchague "Weka Kichupo kwenye Kikundi" kisha chagua "Kikundi Kipya"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - Imeunganisha kwenye mlango wa kuchomeka vifaa</translation> <translation id="7033616203784997570">Thamani unayoweka ni lazima iwe na herufi zisizozidi 62</translation> <translation id="7034692021407794547">Ni lazima msimamizi aliye na mamlaka ya Kudhibiti Malipo akubali Sheria na Masharti ya Google Meet Hardware katika sehemu ya Google Meet Hardware kwenye dashibodi ya Msimamizi.</translation> @@ -7398,6 +7413,7 @@ <translation id="8101987792947961127">Powerwash inahitajika kwenye kuwasha kunakofuata</translation> <translation id="81020759409809034">Sehemu kwenye kifaa</translation> <translation id="8102139037507939978">Ondoa Maelezo ya Kumtambulisha Mtu Binafsi kwenye system_logs.txt.</translation> +<translation id="810362914482827094">Tafuta manenosiri</translation> <translation id="8104088837833760645">Pakua wasifu wa eSIM</translation> <translation id="8105368624971345109">Zima</translation> <translation id="8107015733319732394">Inasakinisha duka la Google Play kwenye <ph name="DEVICE_TYPE" />. Huenda hatua hii ikachukua dakika chache.</translation> @@ -7845,6 +7861,7 @@ <translation id="8557022314818157177">Endelea kugusa ufunguo wako wa usalama hadi alama yako ya kidole inaswe</translation> <translation id="8557180006508471423">Washa "Google Chrome" katika Huduma za Mahali kwenye Mac yako</translation> <translation id="8557856025359704738">Upakuaji unaofuata utafanyika <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Manenosiri</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Fungua Zote katika &Dirisha Jipya}=1{Fungua katika &Dirisha Jipya}other{Fungua Zote ({COUNT}) katika &Dirisha Jipya}}</translation> <translation id="8561206103590473338">Tembo</translation> <translation id="8561565784790166472">Endelea kwa tahadhari</translation> @@ -7971,6 +7988,7 @@ <translation id="8677212948402625567">Kunja zote...</translation> <translation id="867767487203716855">Sasisho lijalo</translation> <translation id="8677859815076891398">Hakuna albamu. Anzisha albamu mpya katika <ph name="LINK_BEGIN" />Picha kwenye Google<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Zima kisha uwashe ili upate masasisho ya kiotomatiki</translation> <translation id="8678538439778360739">Data yako imesimbwa kwa njia fiche kwa kutumia kauli siri yako ya usawazishaji <ph name="TIME" />. Data hii haijumuishi njia za kulipa na anwani kutoka Google Pay.</translation> <translation id="8678582529642151449">Ukubwa wa vichupo haupunguzwi</translation> <translation id="8678933587484842200">Je, ungependa kuanzisha programu hii kwa njia gani?</translation> @@ -8217,6 +8235,7 @@ <translation id="8910987510378294980">Ficha orodha ya vifaa</translation> <translation id="8912362522468806198">Akaunti ya Google</translation> <translation id="8912810933860534797">Washa ukaguzi wa kiotomatiki</translation> +<translation id="8915307125957890427">Bofya kulia kwenye kichupo na uchague "Weka Kichupo kwenye Kikundi" kisha chagua "Kikundi Kipya"</translation> <translation id="8915370057835397490">Inapakia pendekezo</translation> <translation id="8916476537757519021">Fremu ndogo ya Hali Fiche: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ya <ph name="GIVEN_NAME" /></translation> @@ -8291,6 +8310,7 @@ <translation id="8986362086234534611">Sahau</translation> <translation id="8986494364107987395">Tumia Google takwimu za matumizi na ripoti za mara ambazo kivinjari kinaacha kufanya kazi, moja kwa moja</translation> <translation id="8987927404178983737">Mwezi</translation> +<translation id="8989359959810288806">Onyesha Upya Hali ya Kusambaza Mtandao</translation> <translation id="8991520179165052608">Tovuti inaweza kutumia maikrofoni yako</translation> <translation id="899384117894244799">Ondoa mtumiaji anayedhibitiwa</translation> <translation id="899403249577094719">URL ya Msingi wa Vyeti wa Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 5f083e27..aa15af6 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">உங்கள் மைக்ரோஃபோன் மற்றும் கேமராவைப் பயன்படுத்தலாம்</translation> <translation id="1005333234656240382">ADB பிழைதிருத்தத்தை இயக்கவா?</translation> <translation id="1006873397406093306">இந்த நீட்டிப்பால் தளங்களிலுள்ள உங்கள் தரவைப் படிக்கவும் மாற்றவும் முடியும். நீட்டிப்பால் அணுகக்கூடிய தளங்களை நீங்கள் கட்டுப்படுத்தலாம்.</translation> +<translation id="1007057452468855774">Google Play Storeரை இயக்கும்</translation> <translation id="1008186147501209563">புத்தகக்குறிகளை ஏற்று</translation> <translation id="1008557486741366299">இப்போது இல்லை </translation> <translation id="1009476156254802388"><ph name="WEB_DRIVE" /> சேமிப்பிடம்</translation> <translation id="1009663062402466586">கேம் கண்ட்ரோல்கள் இப்போது கிடைக்கின்றன</translation> <translation id="1010498023906173788">இந்தத் தாவல் ஒரு சீரியல் போர்ட்டுடன் இணைக்கப்பட்டுள்ளது.</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{பக்கம் செயலிழந்தது}other{பக்கங்கள் செயலிழந்தன}}</translation> +<translation id="1011003645819296594">சேமிக்கப்பட்ட சாதனங்கள்</translation> <translation id="1011355516189274711">’உரையிலிருந்து பேச்சு’ ஒலியளவு</translation> <translation id="1012794136286421601">உங்கள் 'ஆவணங்கள்', 'தாள்கள்', 'ஸ்லைடுகள்' மற்றும் 'வரைபடக்' ஃபைல்கள் ஒத்திசைக்கப்படுகின்றன. அவற்றை ஆன்லைனிலோ ஆஃப்லைனிலோ அணுக Google இயக்கக ஆப்ஸைத் திறக்கவும்.</translation> <translation id="1012876632442809908">USB-C சாதனம் (முன்பக்கப் போர்ட்)</translation> @@ -494,6 +496,7 @@ <translation id="1470350905258700113">இந்தச் சாதனத்தைப் பயன்படுத்து</translation> <translation id="1470946456740188591">சுட்டி உலாவலை இயக்கவோ முடக்கவோ ‘Ctrl+Search+7’ என்ற ஷார்ட்கட் விசைகளைப் பயன்படுத்தவும்</translation> <translation id="1472675084647422956">மேலும் காண்பி</translation> +<translation id="1473223074251193484">இணைப்பு முறை உள்ளமைவை அமை</translation> <translation id="1474785664565228650">மைக்ரோஃபோன் அமைப்பில் செய்த மாற்றத்தைச் செயல்படுத்த Parallels Desktopபை மீண்டும் தொடங்க வேண்டும். தொடர Parallels Desktopபை மீண்டும் தொடங்கவும்.</translation> <translation id="1474893630593443211">நீங்கள் பார்க்கும் விளம்பரங்களுக்கான கூடுதல் கட்டுப்பாடு</translation> <translation id="1475502736924165259">பிற வகைகள் எவற்றிலும் பொருந்தாத சான்றிதழ்கள் ஃபைலில் உள்ளன</translation> @@ -1125,6 +1128,7 @@ <translation id="2044014337866019681">சாதனத்தை அன்லாக் செய்ய, <ph name="ACCOUNT" /> கணக்கைச் சரிபார்த்திருப்பதை உறுதிசெய்துகொள்ளவும்.</translation> <translation id="204497730941176055">Microsoft சான்றிதழ் டெம்பிளேட் பெயர்</translation> <translation id="2045117674524495717">கீபோர்டு ஷார்ட்கட் உதவி</translation> +<translation id="2045211794962848221">இந்த மெசேஜ் மீண்டும் காட்டப்படாது</translation> <translation id="2045969484888636535">தொடர்ந்து குக்கீகளைத் தடுக்கவும்</translation> <translation id="204622017488417136">ஏற்கனவே நிறுவப்பட்ட Chrome இன் பதிப்பிற்கு உங்கள் சாதனம் மாற்றியமைக்கப்படும். எல்லா பயனர் கணக்குகளும் அகத் தரவும் அகற்றப்படும். இதைச் செயல்தவிர்க்க முடியாது.</translation> <translation id="2046702855113914483">ரேமன்</translation> @@ -3814,6 +3818,7 @@ <translation id="4594577641390224176">சிஸ்டத்தின் அறிமுகப் பக்கத்தைத் தேடுகிறீர்களா? இந்தத் தளத்திற்குச் செல்க</translation> <translation id="4595560905247879544">பயன்பாடுகளையும் நீட்டிப்புகளையும் நிர்வாகியால் (<ph name="CUSTODIAN_NAME" />) மட்டுமே மாற்ற முடியும்.</translation> <translation id="4596295440756783523">இந்தச் சேவையகங்களை அடையாளங்காணும் சான்றிதழ்கள் ஃபைலில் உள்ளன</translation> +<translation id="4598345735110653698">கடவுக்குறியீடுகளை நிர்வகியுங்கள்</translation> <translation id="4598556348158889687">சேமிப்பிட மேலாண்மை</translation> <translation id="4598776695426288251">பல சாதனங்களின் மூலமாக வைஃபை கிடைக்கிறது</translation> <translation id="4601426376352205922">படிக்காததாகக் குறி</translation> @@ -4039,6 +4044,7 @@ <translation id="4823894915586516138"><ph name="DEVICE_TYPE" /> இல் உள்ள உங்கள் தரவை (ஃபோனில் இருந்து நீங்கள் அணுகும் தகவல் உட்பட) இந்தப் பின் (PIN) அல்லது கடவுச்சொல் பாதுகாக்கும்</translation> <translation id="4824037980212326045">Linux காப்புப் பிரதி மற்றும் மீட்டெடுப்பு</translation> <translation id="4824958205181053313">ஒத்திசைவை ரத்துசெய்யவா?</translation> +<translation id="4825532258163983651">கடவுக்குறியீடுகளை நீக்க முடியவில்லை</translation> <translation id="4827675678516992122">இணைக்க முடியவில்லை</translation> <translation id="4827784381479890589">Chrome உலாவியில் உள்ள மேம்பட்ட எழுத்துப் பிழை சரிபார்ப்பான் (எழுத்துச் சரிபார்ப்புப் பரிந்துரைகளுக்காக உரை Googleளுக்கு அனுப்பப்படும்)</translation> <translation id="4827904420700932487">இந்தப் படத்திற்கு QR குறியீட்டை உருவாக்கு</translation> @@ -4301,6 +4307,7 @@ <translation id="5087249366037322692">மூன்றாம் தரப்பு சேர்த்தது</translation> <translation id="5087580092889165836">கார்டைச் சேர்</translation> <translation id="5088534251099454936">RSA என்க்ரிப்ஷனுடன் PKCS #1 SHA-512</translation> +<translation id="5089763948477033443">பக்கவாட்டுப் பேனலின் அளவை மாற்றுவதற்கான ஹேண்டில்</translation> <translation id="5090637338841444533">உங்கள் கேமராவின் நிலையைக் கண்காணிக்க அனுமதி இல்லாத தளங்கள்</translation> <translation id="5093569275467863761">‘முன் பின் பக்கங்களைத் தற்காலிகமாகச் சேமித்தல்’ அம்சத்தில் சேமிக்கப்பட்ட மறைநிலை உப ஃபிரேம்: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">இந்த ஆப்ஸ் மூலம் Files ஆப்ஸில் இருந்தோ பிற ஆப்ஸில் இருந்தோ, ஆதரிக்கப்படும் ஃபைல்களைத் திறந்து அவற்றில் மாற்றம் செய்யலாம். எந்தெந்த ஃபைல்கள் இந்த ஆப்ஸில் இயல்பாகத் திறக்கப்பட வேண்டும் என்பதைக் கட்டுப்படுத்த, <ph name="BEGIN_LINK" />உங்கள் சாதனத்தில் இயல்பு ஆப்ஸை எப்படி அமைப்பது என அறிக<ph name="END_LINK" />.</translation> @@ -4466,6 +4473,7 @@ <translation id="5258992782919386492">இந்தச் சாதனத்தில் நிறுவு</translation> <translation id="5260334392110301220">ஸ்மார்ட் கொட்டேஷன் மார்க்ஸ்</translation> <translation id="5260508466980570042">மன்னிக்கவும், உங்கள் மின்னஞ்சலையும் கடவுச்சொல்லையும் சரிபார்க்க முடியவில்லை. தயவுசெய்து மீண்டும் முயற்சி செய்க.</translation> +<translation id="5260958083445173099">கிடைக்கும்பட்சத்தில், இணையதளங்கள் அவற்றின் உள்ளடக்கத்தை நீங்கள் விரும்பும் மொழியில் காட்டும்</translation> <translation id="5261683757250193089">இணைய அங்காடியில் திற</translation> <translation id="5262178194499261222">கடவுச்சொல்லை அகற்று</translation> <translation id="5262784498883614021">நெட்வொர்க்குடன் தானாக இணை</translation> @@ -4506,6 +4514,7 @@ <translation id="5294097441441645251">சிற்றெழுத்தையோ அடிக்கோட்டையோ கொண்டு தொடங்க வேண்டும்</translation> <translation id="5294618183559481278">உங்கள் சாதனத்திற்கு முன்பாக யாரேனும் இருப்பதைக் கண்டறிய, <ph name="DEVICE_TYPE" /> உள்ளமைந்த சென்சாரைப் பயன்படுத்துகிறது. அனைத்துத் தரவும் உங்கள் சாதனத்தில் உடனடியாகச் செயலாக்கப்பட்டு பின்னர் நீக்கப்படும். சென்சார் தரவு ஒருபோதும் Googleளுக்கு அனுப்பப்படாது. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="5296350763804564124">பேச்சுவடிவத்தில் விளக்கம் அளிக்கப்படுவதால் திரையைப் பார்க்காமலேயே நீங்கள் சாதனத்தைப் பயன்படுத்த முடியும். இணைக்கப்பட்ட சாதனத்தின் மூலம் பிரெய்ல் கருத்தைப் பெறலாம்.</translation> +<translation id="5297005732522718715">இணைப்பு முறை உள்ளமைவை ரெஃப்ரெஷ் செய்</translation> <translation id="5297082477358294722">கடவுச்சொல் சேமிக்கப்பட்டது. சேமிக்கப்பட்ட கடவுச்சொற்களை <ph name="SAVED_PASSWORDS_STORE" /> இல் பார்க்கலாம், நிர்வகிக்கலாம்.</translation> <translation id="5297946558563358707">உங்கள் திரையை வேறு யாராவது பார்த்தால் திரையின் கீழ் வலதுபுறத்தில் தனியுரிமை தொடர்பான கண் ஐகான் காட்டப்படும்</translation> <translation id="5298219193514155779">தீம் – ஐ உருவாக்கியவர்</translation> @@ -4676,11 +4685,13 @@ <translation id="5466374726908360271">“<ph name="SEARCH_TERMS" />” வினவலை ஒட்டி, தேடு</translation> <translation id="5467207440419968613"><ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> ஆகிய அனுமதிகள் தடுக்கப்பட்டுள்ளன</translation> <translation id="5468173180030470402">ஃபைல் பகிர்வுகளைத் தேடுகிறது</translation> +<translation id="5468330507528805311">இணைப்புமுறையின் நிலை:</translation> <translation id="5468881191994555667">ஃபைலைத் தேர்வுசெய்க</translation> <translation id="5469852975082458401">உரை-கர்சரைப் பயன்படுத்திப் பக்கங்களுக்குச் செல்லலாம். இதை முடக்க ‘F7’ விசையை அழுத்தவும்.</translation> <translation id="5470735824776589490">பவர்வாஷால் உங்கள் சாதனம் மீட்டமைக்கப்படுவதற்கு முன்பு மறுதொடக்கம் அவசியம். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="5471768120198416576">வணக்கம்! நான் தான் உங்கள் உரையைப் பேசும் குரல்</translation> <translation id="5472627187093107397">இந்தத் தளத்திற்காகக் கடவுச்சொற்களைச் சேமி</translation> +<translation id="5473062644742711742">மேலும் அணுகல் கருவிகளை Chrome ஆன்லைன் ஸ்டோரில் கண்டறிக</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">தொடர்வதன் மூலம், Google, உங்கள் பிள்ளையின் மொபைல் நிறுவனம், இந்தச் சாதனத்தின் உற்பத்தியாளர் ஆகியோரிடமிருந்து புதுப்பிப்புகளையும் ஆப்ஸையும் மொபைல் டேட்டா மூலம் இந்தச் சாதனம் தானாகவே பதிவிறக்கி, நிறுவக்கூடும் என்பதை ஏற்கிறீர்கள். 'ஆப்ஸில் வாங்குதல்' வசதி சில ஆப்ஸில் இருக்கலாம்.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{பின்(PIN) குறைந்தது 1 எழுத்தைக் கொண்டிருக்க வேண்டும்}other{பின்(PIN) குறைந்தது # எழுத்துகளைக் கொண்டிருக்க வேண்டும்}}</translation> @@ -4952,6 +4963,7 @@ <translation id="5734362860645681824">தகவல்தொடர்புகள்</translation> <translation id="5734697361979786483">ஃபைல் பகிர்வைச் சேர்</translation> <translation id="5736796278325406685">சரியான பயனர்பெயரை உள்ளிடவும்</translation> +<translation id="5738093759615225354">உங்கள் கம்ப்யூட்டரில் உள்நுழைய இந்தக் கடவுக்குறியீடு தேவை</translation> <translation id="5739017626473506901">பள்ளிக் கணக்கை சேர்க்க <ph name="USER_NAME" />க்கு உதவ, உள்நுழையவும்</translation> <translation id="5739235828260127894">சரிபார்ப்புக்காகக் காத்திருக்கிறது. <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> <translation id="5739458112391494395">மிகப் பெரியது</translation> @@ -5113,6 +5125,7 @@ <translation id="589541317545606110"><ph name="VISUAL_SEARCH_PROVIDER" /> மூலம் பக்கத்தைத் தேடு</translation> <translation id="5896436821193322561">அனுமதிக்காதே</translation> <translation id="5900186025777217044">Smart Lock அம்சம் நிறுத்தப்பட்டுவிட்டது</translation> +<translation id="5900243355162006650">இணைப்பு முறை உள்ளமைவு:</translation> <translation id="5900302528761731119">Google சுயவிவரப் புகைப்படம்</translation> <translation id="590036993063074298">பிரதிபலித்தலின் தர விவரங்கள்</translation> <translation id="5901069264981746702">உங்கள் கைரேகைத் தரவு பாதுகாப்பாகச் சேமிக்கப்படுவதுடன் <ph name="DEVICE_TYPE" /> சாதனத்திலேயே இருக்கும். <ph name="LINK_BEGIN" />மேலும் அறிக<ph name="LINK_END" /></translation> @@ -5417,6 +5430,7 @@ <translation id="6196640612572343990">மூன்றாம் தரப்புக் குக்கீகளைத் தடு</translation> <translation id="6196854373336333322">"<ph name="EXTENSION_NAME" />" நீட்டிப்பு உங்கள் ப்ராக்ஸி அமைப்புகளைக் கட்டுப்படுத்துகிறது, அதாவது நீங்கள் ஆன்லைனில் செய்யும் எல்லாவற்றையும் அதனால் மாற்ற முடியும், தடுக்க முடியும் அல்லது அறிந்து கொள்ள முடியும். இது ஏன் நடந்தது எனத் தெரியவில்லை எனில், உங்களுக்கு இந்த தேவைப்படாதது என்று அர்த்தம்.</translation> <translation id="6197128521826316819">இந்தப் பக்கத்திற்கு QR குறியீட்டை உருவாக்கு</translation> +<translation id="6197223946499512637">இந்தக் கம்ப்யூட்டரில் உள்ள Windows Helloவில் கடவுக்குறியீடுகள் சேமிக்கப்பட்டுள்ளன. உங்கள் Google கணக்கில் சேமிக்கப்படவில்லை.</translation> <translation id="6198252989419008588">PIN ஐ மாற்றவும்</translation> <translation id="6200047250927636406">ஃபைலை நிராகரி</translation> <translation id="6200151268994853226">நீட்டிப்பை நிர்வகி</translation> @@ -5714,6 +5728,7 @@ <translation id="6482559668224714696">முழுத்திரைப் பெரிதாக்கி</translation> <translation id="6483485061007832714">பதிவிறக்கிய கோப்பைத் திற</translation> <translation id="6483805311199035658"><ph name="FILE" /> ஐத் திறக்கிறது...</translation> +<translation id="6486301003991593638">கடவுக்குறியீடுகளை நிர்வகிக்க Windowsஸின் சமீபத்திய பதிப்பைப் பயன்படுத்தவும்</translation> <translation id="6488384360522318064">மொழியைத் தேர்ந்தெடுக்கவும்</translation> <translation id="648927581764831596">எதுவும் இல்லை</translation> <translation id="6490471652906364588">USB-C சாதனம் (வலது போர்ட்)</translation> @@ -6300,6 +6315,7 @@ <translation id="7029307918966275733">Crostini நிறுவப்படவில்லை. கிரெடிட்டுகளைப் பார்க்க Crostiniயை நிறுவுங்கள்.</translation> <translation id="7029809446516969842">கடவுச்சொற்கள்</translation> <translation id="7030304022046916278">சரிபார்ப்புக்காக URLகளைப் பாதுகாப்பு உலாவலுக்கு அனுப்பும்</translation> +<translation id="7030695672997239647">பக்கத்தின் மீது வலது கிளிக் செய்து "குழுவில் பக்கத்தைச் சேர்" என்பதைத் தேர்ந்தெடுத்தப் பிறகு "புதிய குழு" என்பதைத் தேர்ந்தெடுக்கவும்</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - சீரியல் போர்ட் இணைக்கப்பட்டது</translation> <translation id="7033616203784997570">அதிகபட்சம் 62 எழுத்துகள் இருக்க வேண்டும்</translation> <translation id="7034692021407794547">பில்லிங்கை நிர்வகிப்பதற்கான சிறப்புரிமைகளைக் கொண்ட நிர்வாகி முதலில் Google Meet வன்பொருளுக்கான சேவை விதிமுறைகளை ஏற்க வேண்டும். இவை நிர்வாகிக் கன்சோலின் Google Meet வன்பொருள் பிரிவில் இருக்கும்.</translation> @@ -7402,6 +7418,7 @@ <translation id="8101987792947961127">அடுத்த மறுதொடக்கத்திற்கு பவர்வாஷ் தேவைப்படுகிறது</translation> <translation id="81020759409809034">சாதனச் சேமிப்பிடம்</translation> <translation id="8102139037507939978">system_logs.txt ஃபைலில் இருக்கும், தனிப்பட்ட ஒருவரை அடையாளம் காணக்கூடியத் தகவலைக் கோடிட்டு மறைக்கும்.</translation> +<translation id="810362914482827094">கடவுக்குறியீடுகளைத் தேடுக</translation> <translation id="8104088837833760645">eSIM சுயவிவரத்தைப் பதிவிறக்குதல்</translation> <translation id="8105368624971345109">முடக்கு</translation> <translation id="8107015733319732394">உங்கள் <ph name="DEVICE_TYPE" /> இல் Google Play Storeரை நிறுவுகிறது. இதற்குச் சில நிமிடங்கள் ஆகலாம்.</translation> @@ -7849,6 +7866,7 @@ <translation id="8557022314818157177">உங்கள் கைரேகையைப் பதிவுசெய்யும் வரை உங்கள் பாதுகாப்பு விசையைத் தொடர்ந்து அழுத்தவும்</translation> <translation id="8557180006508471423">Mac சாதனத்தில் இருப்பிடச் சேவைகள் அமைப்பில் "Google Chrome" உலாவிக்கு இருப்பிடச் சேவையை இயக்கவும்</translation> <translation id="8557856025359704738"><ph name="NEXT_DATE_DOWNLOAD" /> அன்று அடுத்த பதிவிறக்கம் நிகழும்.</translation> +<translation id="8559858985063901027">கடவுக்குறியீடுகள்</translation> <translation id="8560327176991673955">{COUNT,plural, =0{எல்லாவற்றையும் &புதிய சாளரத்தில் திற}=1{&புதிய சாளரத்தில் திற}other{எல்லாவற்றையும் ({COUNT}) &புதிய சாளரத்தில் திற}}</translation> <translation id="8561206103590473338">யானை</translation> <translation id="8561565784790166472">எச்சரிக்கையுடன் தொடர்க</translation> @@ -7975,6 +7993,7 @@ <translation id="8677212948402625567">அனைத்தையும் சுருக்கு...</translation> <translation id="867767487203716855">அடுத்த புதுப்பிப்பு</translation> <translation id="8677859815076891398">ஆல்பங்கள் எதுவுமில்லை. <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" />ஸில் ஓர் ஆல்பத்தை உருவாக்குங்கள்.</translation> +<translation id="8678378565142776698">மீண்டும் தொடங்கி தானாகவே புதுப்பிப்புகளைப் பெறு</translation> <translation id="8678538439778360739"><ph name="TIME" /> அன்று உங்கள் ஒத்திசைவுக் கடவுச்சொற்றொடர் மூலம் தரவு என்க்ரிப்ட் செய்யப்பட்டது. இதில் Google Payயிலுள்ள பேமெண்ட் முறைகளும் முகவரிகளும் சேர்க்கப்படவில்லை.</translation> <translation id="8678582529642151449">தாவல்களைச் சுருக்காது</translation> <translation id="8678933587484842200">இந்த ஆப்ஸை எப்படித் துவக்க விரும்புகிறீர்கள்?</translation> @@ -8221,6 +8240,7 @@ <translation id="8910987510378294980">சாதனப் பட்டியலை மறைக்கும்</translation> <translation id="8912362522468806198">Google கணக்கு</translation> <translation id="8912810933860534797">தானியங்கு ஸ்கேனை இயக்கு</translation> +<translation id="8915307125957890427">பக்கத்தின் மீது வலது கிளிக் செய்து "குழுவில் பக்கத்தைச் சேர்" என்பதைத் தேர்ந்தெடுத்தப் பிறகு "புதிய குழு" என்பதைத் தேர்ந்தெடுக்கவும்</translation> <translation id="8915370057835397490">பரிந்துரைகளை ஏற்றுகிறது</translation> <translation id="8916476537757519021">மறைநிலை துணைச்சட்டகம்: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="GIVEN_NAME" /> இன் <ph name="DEVICE_TYPE" /></translation> @@ -8295,6 +8315,7 @@ <translation id="8986362086234534611">மற</translation> <translation id="8986494364107987395">பயன்பாட்டுப் புள்ளிவிவரங்களையும் சிதைவு அறிக்கைகளையும் தானாகவே Google க்கு அனுப்பு</translation> <translation id="8987927404178983737">மாதம்</translation> +<translation id="8989359959810288806">இணைப்புமுறையின் நிலையைப் ரெஃப்ரெஷ் செய்</translation> <translation id="8991520179165052608">தளத்தால் உங்கள் மைக்ரோஃபோனைப் பயன்படுத்த முடியும்</translation> <translation id="899384117894244799">வரம்பிடப்பட்ட பயனரை அகற்றுதல்</translation> <translation id="899403249577094719">Netscape சான்றிதழ் அடிப்படை URL</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index 7d1d52f..4715098 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -328,7 +328,7 @@ <translation id="1313405956111467313">ఆటోమేటిక్ ప్రాక్సీ కాన్ఫిగరేషన్</translation> <translation id="131364520783682672">Caps Lock</translation> <translation id="1313660246522271310">తెరిచిన ట్యాబ్లతో సహా, అన్ని సైట్ల నుండి మీరు సైన్ అవుట్ చేయబడతారు</translation> -<translation id="1313705515580255288">మీ బుక్మార్క్లు, చరిత్ర, ఇతర సెట్టింగ్లు మీ Google ఖాతాకు సింక్ చేయబడతాయి.</translation> +<translation id="1313705515580255288">మీ బుక్మార్క్లు, హిస్టరీ, ఇతర సెట్టింగ్లు మీ Google ఖాతాకు సింక్ చేయబడతాయి.</translation> <translation id="1316136264406804862">శోధిస్తోంది...</translation> <translation id="1316248800168909509"><ph name="DEVICE" />కు కనెక్ట్ చేయలేకపోయింది. మళ్లీ ట్రై చేయండి.</translation> <translation id="1316495628809031177">సింక్ పాజ్ చేయబడింది</translation> @@ -686,7 +686,7 @@ <translation id="1637224376458524414">ఈ బుక్మార్క్ను మీ iPhoneలో పొందండి</translation> <translation id="1637350598157233081">మీ పాస్వర్డ్ ఈ పరికరంలో సేవ్ చేయబడింది</translation> <translation id="1637765355341780467">మీ ప్రొఫైల్ను తెరుస్తున్నప్పుడు ఏదో తప్పు జరిగింది. కొన్ని ఫీచర్లు అందుబాటులో ఉండకపోవచ్చు.</translation> -<translation id="1639239467298939599">లోడ్ అవుతోంది</translation> +<translation id="1639239467298939599">లోడ్ చేస్తోంది</translation> <translation id="1640235262200048077"><ph name="IME_NAME" /> ఇంకా యాప్లలో పనిచేయడం లేదు</translation> <translation id="1640283014264083726">RSA ఎన్క్రిప్షన్తో PKCS #1 MD4</translation> <translation id="1641113438599504367">సురక్షిత బ్రౌజింగ్</translation> @@ -877,7 +877,7 @@ మీరు కొనుగోలు చేసిన సినిమాలు, టీవీ షోలు, సంగీతం, పుస్తకాలు లేదా ఇతర యాప్లో కొనుగోళ్లు కూడా తొలగించబడవచ్చు. <ph name="LINE_BREAKS2" /> ఇది ఇతర పరికరాల్లో యాప్లు లేదా కంటెంట్ను ప్రభావితం చేయదు.</translation> -<translation id="1809734401532861917">నా బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను <ph name="USER_EMAIL_ADDRESS" />కి జోడించు</translation> +<translation id="1809734401532861917">నా బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను <ph name="USER_EMAIL_ADDRESS" />కి జోడించు</translation> <translation id="1810366086647840386">ఇమేజ్ సర్వర్</translation> <translation id="1811908311154949291">అజ్ఞాత ఫెన్స్డ్ ఫ్రేమ్: <ph name="FENCEDFRAME_SITE" /></translation> <translation id="1813278315230285598">సేవలు</translation> @@ -1470,7 +1470,7 @@ <translation id="2327920026543055248"><ph name="TOTAL" />లో <ph name="CHARACTER" />వ అక్షరాన్ని ఎంటర్ చేయండి</translation> <translation id="2328561734797404498"><ph name="APP_NAME" />ను ఉపయోగించడానికి దయచేసి మీ పరికరాన్ని రీస్టార్ట్ చేయండి.</translation> <translation id="2328636661627946415">మీరు అజ్ఞాత మోడ్లో ఉన్నప్పుడు, సైట్లు తమ సొంత సైట్లో మీ బ్రౌజింగ్ యాక్టివిటీని చూడటానికి కుక్కీలను మాత్రమే ఉపయోగించగలవు. అజ్ఞాత సెషన్ చివరిలో కుక్కీలు తొలగించబడతాయి.</translation> -<translation id="2329597144923131178">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్లను మీ అన్ని పరికరాలలో పొందడానికి సైన్ ఇన్ చేయండి.</translation> +<translation id="2329597144923131178">మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్లను మీ అన్ని పరికరాలలో పొందడానికి సైన్ ఇన్ చేయండి.</translation> <translation id="2332131598580221120">స్టోర్లో చూడండి</translation> <translation id="2332192922827071008">ప్రాధాన్యతలను తెరువు</translation> <translation id="2332515770639153015">మెరుగైన సురక్షిత బ్రౌజింగ్ ఆన్లో ఉంది</translation> @@ -1783,7 +1783,7 @@ <translation id="2633212996805280240">"<ph name="EXTENSION_NAME" />"ను తీసివేయాలా?</translation> <translation id="263325223718984101"><ph name="PRODUCT_NAME" /> ఇనస్టలేషన్ పూర్తి కాలేదు, కానీ డిస్క్ ఇమేజ్ నుండి రన్ అవడం కొనసాగుతుంది.</translation> <translation id="2633764681656412085">FIDO</translation> -<translation id="2634199532920451708">ప్రింట్ చరిత్ర</translation> +<translation id="2634199532920451708">ప్రింట్ హిస్టరీ</translation> <translation id="2635094637295383009">Twitter</translation> <translation id="2635276683026132559">సంతకం చేస్తోంది</translation> <translation id="2637313651144986786">ట్యాబ్లలో సెర్చ్ చేయండి...</translation> @@ -2071,7 +2071,7 @@ <translation id="2891922230654533301"><ph name="APP_NAME" />కు సైన్ ఇన్ చేయడానికి మీ పరికరాన్ని ఉపయోగించాలా?</translation> <translation id="2893013536106749396">మీరు ముఖ్యం అనుకునే విషయాల గురించి మీకు తెలియజేసే కార్డ్లను ఎంచుకోండి</translation> <translation id="2893168226686371498">ఆటోమేటిక్ బ్రౌజర్</translation> -<translation id="2893180576842394309">శోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation> +<translation id="2893180576842394309">శోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ హిస్టరీని ఉపయోగించే అవకాశం ఉంటుంది</translation> <translation id="2894757982205307093">గ్రూప్లో కొత్త ట్యాబ్</translation> <translation id="289695669188700754">కీ ID: <ph name="KEY_ID" /></translation> <translation id="2897713966423243833">మీరు మీ అన్ని అజ్ఞాత విండోలను మూసివేసినప్పుడు, ఈ అనుకూల సెట్టింగ్ తీసివేయబడుతుంది</translation> @@ -2148,7 +2148,7 @@ <translation id="296026337010986570">పూర్తయింది! హానికరమైన సాఫ్ట్వేర్ తీసివేయబడింది. ఎక్స్టెన్షన్లను తిరిగి ఆన్ చేయడానికి, <a href="chrome://extensions">ఎక్స్టెన్షన్లు</a> సందర్శించండి.</translation> <translation id="2961090598421146107"><ph name="CERTIFICATE_NAME" /> (ఎక్స్టెన్షన్ అందించినది)</translation> <translation id="2961210776189273067">టైటిల్</translation> -<translation id="2961695502793809356">ముందుకు వెళ్ళడానికి క్లిక్ చేయండి. చరిత్రను చూడటానికి నొక్కి ఉంచండి</translation> +<translation id="2961695502793809356">ముందుకు వెళ్ళడానికి క్లిక్ చేయండి. హిస్టరీని చూడటానికి నొక్కి ఉంచండి</translation> <translation id="2963151496262057773">కింది ప్లగ్ఇన్ ప్రతిస్పందించడం లేదు: <ph name="PLUGIN_NAME" />మీరు దీనిని ఆపివేయాలనుకుంటున్నారా?</translation> <translation id="2964193600955408481">Wi-Fiని నిలిపివేయి</translation> <translation id="2964245677645334031">సమీప షేరింగ్ విజిబిలిటీ</translation> @@ -2334,7 +2334,7 @@ <translation id="3150927491400159470">నిర్బంధంగా మళ్లీ లోడ్ చేయి</translation> <translation id="315116470104423982">మొబైల్ డేటా</translation> <translation id="3151539355209957474">ప్రారంభ సమయం</translation> -<translation id="3151562827395986343">చరిత్ర, కుక్కీలు, కాష్ మొదలైన వాటిని తీసివేస్తుంది</translation> +<translation id="3151562827395986343">హిస్టరీ, కుక్కీలు, కాష్ మొదలైన వాటిని తీసివేస్తుంది</translation> <translation id="3151786313568798007">దృగ్విన్యాసం</translation> <translation id="3152356229013609796">మీ ఫోన్ నోటిఫికేషన్లను చూడడం, విస్మరించడం, వాటికి రిప్లయి ఇవ్వడం చేయగలదు</translation> <translation id="3157387275655328056">పఠన లిస్ట్కు జోడించు</translation> @@ -3087,7 +3087,7 @@ <translation id="3893536212201235195">మీ యాక్సెస్ సౌలభ్య సెట్టింగ్లను చదవడానికి మరియు మార్చడానికి అనుమతి</translation> <translation id="3893630138897523026">ChromeVox (చదవబడే అభిప్రాయం)</translation> <translation id="3893764153531140319"><ph name="DOWNLOADED_SIZE" />/<ph name="DOWNLOAD_SIZE" /></translation> -<translation id="3894123633473837029">ఇటీవలి అసిస్టెంట్ చరిత్రను Sherlog ద్వారా చేర్చండి. ఇందులో మీ గుర్తింపు, స్థానం, డీబగ్ సమాచారం ఉండవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> +<translation id="3894123633473837029">ఇటీవలి అసిస్టెంట్ హిస్టరీని Sherlog ద్వారా చేర్చండి. ఇందులో మీ గుర్తింపు, స్థానం, డీబగ్ సమాచారం ఉండవచ్చు. <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="3894427358181296146">ఫోల్డర్ను జోడించండి</translation> <translation id="3894770151966614831">Google ఖాతాకు తరలించాలా?</translation> <translation id="3895076768659607631">సెర్చ్ ఇంజిన్లను &మేనేజ్ చేయండి...</translation> @@ -3962,7 +3962,7 @@ <translation id="473546211690256853">ఈ ఖాతాను <ph name="DOMAIN" /> మేనేజ్ చేస్తోంది</translation> <translation id="4735506354605317060">గుండ్రటి పాయింటర్</translation> <translation id="4735803855089279419">ఈ పరికర ఐడెంటిఫైయర్లను గుర్తించడంలో సిస్టమ్ విఫలమైంది.</translation> -<translation id="4736292055110123391">మీ బుక్మార్క్లు, పాస్వర్డ్లు, చరిత్ర మరియు మరిన్నింటిని మీ అన్ని పరికరాల్లోనూ సింక్ చేయండి</translation> +<translation id="4736292055110123391">మీ బుక్మార్క్లు, పాస్వర్డ్లు, హిస్టరీ మరియు మరిన్నింటిని మీ అన్ని పరికరాల్లోనూ సింక్ చేయండి</translation> <translation id="473775607612524610">అప్డేట్</translation> <translation id="473936925429402449"><ph name="TOTAL_ELEMENTS" />లో <ph name="CURRENT_ELEMENT" />వ అదనపు కంటెంట్ ఎంచుకోబడింది</translation> <translation id="4739639199548674512">టిక్కెట్లు</translation> @@ -4145,7 +4145,7 @@ <translation id="4907161631261076876">ఈ ఫైల్ సాధారణ పద్ధతిలో డౌన్లోడ్ కాలేదు, ఇది అపాయకరమైనది కావచ్చు.</translation> <translation id="4907306957610201395">అనుమతి వర్గం</translation> <translation id="4908811072292128752">ఒకేసారి రెండు సైట్లను బ్రౌజ్ చేయడానికి కొత్త ట్యాబ్ను తెరవండి</translation> -<translation id="4909038193460299775">ఈ ఖాతా <ph name="DOMAIN" /> నిర్వహణలో ఉన్నందున, మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లు ఈ పరికరం నుండి తీసివేయబడతాయి. అయితే, మీ డేటా మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది, దానిని <ph name="BEGIN_LINK" />Google డాష్బోర్డ్<ph name="END_LINK" />లో నిర్వహించవచ్చు.</translation> +<translation id="4909038193460299775">ఈ ఖాతా <ph name="DOMAIN" /> నిర్వహణలో ఉన్నందున, మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లు ఈ పరికరం నుండి తీసివేయబడతాయి. అయితే, మీ డేటా మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది, దానిని <ph name="BEGIN_LINK" />Google డాష్బోర్డ్<ph name="END_LINK" />లో నిర్వహించవచ్చు.</translation> <translation id="4912643508233590958">ఇన్యాక్టివ్ మేల్కొలుపులు</translation> <translation id="4915961947098019832">ఇమేజ్లను చూపించడానికి అనుమతించబడింది</translation> <translation id="4916542008280060967"><ph name="FILE_NAME" />ను ఎడిట్ చేయడానికి సైట్ను అనుమతించాలనుకుంటున్నారా?</translation> @@ -4553,7 +4553,7 @@ <translation id="5331975486040154427">USB-C పరికరం (ఎడమవైపు వెనుక పోర్ట్)</translation> <translation id="5333896723098573627">యాప్లను తీసివేయడానికి, సెట్టింగ్లు > యాప్లు > Google Play Store > Android ప్రాధాన్యతలను మేనేజ్ చేయండి > యాప్లు లేదా యాప్ మేనేజర్కు వెళ్లండి. ఆ తర్వాత, మీరు అన్ఇన్స్టాల్ చేయాలనుకుంటున్న యాప్ను ట్యాప్ చేయండి (మీరు యాప్ను కనుగొనడానికి ఎడమ లేదా కుడి వైపునకు స్వైప్ చేయాల్సి ఉంటుంది). ఆపై, అన్ఇన్స్టాల్ చేయండి లేదా డిజేబుల్ చేయండిని ట్యాప్ చేయండి.</translation> <translation id="5334142896108694079">స్క్రిప్ట్ క్యాష్</translation> -<translation id="5336688142483283574">మీ చరిత్ర, <ph name="SEARCH_ENGINE" /> యాక్టివిటీ నుండి కూడా ఈ పేజీ తీసివేయబడుతుంది.</translation> +<translation id="5336688142483283574">మీ హిస్టరీ, <ph name="SEARCH_ENGINE" /> యాక్టివిటీ నుండి కూడా ఈ పేజీ తీసివేయబడుతుంది.</translation> <translation id="5336689872433667741">కర్సర్, టచ్ప్యాడ్</translation> <translation id="5337771866151525739">మూడవ పక్షం ద్వారా ఇన్స్టాల్ చేయబడింది.</translation> <translation id="5337926771328966926">ప్రస్తుత పరికరం యొక్క పేరు <ph name="DEVICE_NAME" /></translation> @@ -4594,7 +4594,7 @@ <translation id="5372579129492968947">ఎక్స్టెన్షన్ పిన్ను తీసివేయండి</translation> <translation id="5372632722660566343">ఖాతా లేకుండా కొనసాగించు</translation> <translation id="5375318608039113175">ఈ కాంటాక్ట్లతో సమీప షేరింగ్ను ఉపయోగించడానికి, వారి Google ఖాతాతో లింక్ చేయబడిన ఈమెయిల్ అడ్రస్ను మీ కాంటాక్ట్లకు జోడించండి.</translation> -<translation id="5376169624176189338">వెనుకకు వెళ్లడానికి క్లిక్ చేయండి. చరిత్రను చూడటానికి నొక్కి ఉంచండి</translation> +<translation id="5376169624176189338">వెనుకకు వెళ్లడానికి క్లిక్ చేయండి. హిస్టరీని చూడటానికి నొక్కి ఉంచండి</translation> <translation id="5376931455988532197">ఫైల్ చాలా పెద్దదిగా ఉంది</translation> <translation id="5379140238605961210">మైక్రోఫోన్ యాక్సెస్ను బ్లాక్ చేయడాన్ని కొనసాగించు</translation> <translation id="5382591305415226340">మద్దతు గల లింక్లను నిర్వహించండి</translation> @@ -4837,7 +4837,7 @@ <translation id="5600706100022181951"><ph name="UPDATE_SIZE_MB" /> MB మొబైల్ డేటాను ఉపయోగించి అప్డేట్ డౌన్లోడ్ చేయబడుతుంది. మీరు కొనసాగాలని అనుకుంటున్నారా?</translation> <translation id="5601503069213153581">PIN</translation> <translation id="5601823921345337195">MIDI పరికరాలకు కనెక్ట్ చేయడానికి అనుమతించబడలేదు</translation> -<translation id="5602765853043467355">ఈ పరికరం నుండి బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు వంటివాటిని తీసివేయండి</translation> +<translation id="5602765853043467355">ఈ పరికరం నుండి బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు వంటివాటిని తీసివేయండి</translation> <translation id="5605758115928394442">మీరేనని నిర్ధారించుకోవడానికి మీ ఫోన్కు ఒక నోటిఫికేషన్ పంపబడింది.</translation> <translation id="5606849116180480101">{NUM_EXTENSIONS,plural, =1{ఈ ఎక్స్టెన్షన్ బ్లాక్ చేయబడింది}other{ఈ ఎక్స్టెన్షన్లు బ్లాక్ చేయబడ్డాయి}}</translation> <translation id="560834977503641186">Wi-Fi సింక్, మరింత తెలుసుకోండి</translation> @@ -4866,10 +4866,10 @@ <translation id="5627676517703583263">Chromeతో స్మార్ట్గా బ్రౌజ్ చేయండి</translation> <translation id="5627832140542566187">డిస్ప్లే ఓరియంటేషన్</translation> <translation id="5628393161682339323">నేను ఎక్స్టెన్షన్ను క్లిక్ చేసినప్పుడు</translation> -<translation id="562935524653278697">మీ నిర్వాహకుడు మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల సింక్ను నిలిపివేశారు.</translation> +<translation id="562935524653278697">మీ నిర్వాహకుడు మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల సింక్ను నిలిపివేశారు.</translation> <translation id="5631017369956619646">CPU ఉపయోగం</translation> <translation id="5632059346822207074">అనుమతి కోసం రిక్వెస్ట్ చేశారు, ప్రతిస్పందించడానికి Ctrl + Forwardను నొక్కండి</translation> -<translation id="5632566673632479864">మీ ఖాతా <ph name="EMAIL" /> ఇకపై ప్రాథమిక ఖాతాగా అనుమతించబడదు. ఈ ఖాతా <ph name="DOMAIN" /> ద్వారా నిర్వహించబడుతోంది కాబట్టి, మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లు ఈ పరికరం నుండి తొలగించబడతాయి.</translation> +<translation id="5632566673632479864">మీ ఖాతా <ph name="EMAIL" /> ఇకపై ప్రాథమిక ఖాతాగా అనుమతించబడదు. ఈ ఖాతా <ph name="DOMAIN" /> ద్వారా నిర్వహించబడుతోంది కాబట్టి, మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లు ఈ పరికరం నుండి తొలగించబడతాయి.</translation> <translation id="5632592977009207922">డౌన్లోడ్ చేస్తోంది, <ph name="PERCENT_REMAINING" />% మిగిలి ఉంది</translation> <translation id="563371367637259496">మొబైల్</translation> <translation id="5634446357546764049">మీ ఇటీవలి ట్రిప్ల జ్ఞాపకాలను, మరిన్నింటిని చూడండి</translation> @@ -5771,7 +5771,7 @@ <translation id="652492607360843641">మీరు <ph name="NETWORK_TYPE" /> నెట్వర్క్కు కనెక్ట్ చేయబడ్డారు.</translation> <translation id="6527303717912515753">షేర్ చేయండి</translation> <translation id="6528179044667508675">అంతరాయం వద్దు</translation> -<translation id="652948702951888897">Chrome చరిత్ర</translation> +<translation id="652948702951888897">Chrome హిస్టరీ</translation> <translation id="6530186581263215931">ఈ సెట్టింగ్లు మీ నిర్వాహకుడి ద్వారా అమలు చేయబడ్డాయి</translation> <translation id="6531282281159901044">అపాయకరమైన ఫైల్ను అలాగే ఉంచు</translation> <translation id="6532101170117367231">Google డిస్క్కు సేవ్ చేయండి</translation> @@ -7017,7 +7017,7 @@ <translation id="7742706086992565332">మీరు ఎంత దగ్గరగా లేదా దూరంగా జూమ్ చేయాలనే దానిని కొన్ని నిర్దిష్ట వెబ్సైట్లలో మీరు సెట్ చేసుకోవచ్చు</translation> <translation id="7742879569460013116">దీనికి లింక్ను షేర్ చేయండి</translation> <translation id="774377079771918250">ఎక్కడ సేవ్ చేయాలో ఎంచుకోండి</translation> -<translation id="7744047395460924128">మీ ప్రింటింగ్ చరిత్రను చూడండి</translation> +<translation id="7744047395460924128">మీ ప్రింటింగ్ హిస్టరీని చూడండి</translation> <translation id="7744192722284567281">డేటా ఉల్లంఘనలో కనుగొనబడింది</translation> <translation id="7744649840067671761">అసైన్మెంట్ను ప్రారంభించడానికి కొత్త స్విచ్ను లేదా కీబోర్డ్ కీని నొక్కండి. అసైన్మెంట్ను తీసివేయడానికి అసైన్ చేయబడిన స్విచ్ను లేదా కీని నొక్కండి.</translation> @@ -7277,7 +7277,7 @@ <translation id="7974936243149753750">ఓవర్స్కాన్ సర్దుబాటు</translation> <translation id="7975504106303186033">మీరు ఈ Chrome Education పరికరాన్ని ఎడ్యుకేషన్ ఖాతాలో తప్పనిసరిగా ఎన్రోల్ చేయాలి. కొత్త ఖాతా కోసం సైన్ అప్ చేయడానికి, దయచేసి g.co/workspace/edusignupను సందర్శించండి.</translation> <translation id="7978412674231730200">వ్యక్తిగత కీ</translation> -<translation id="7978450511781612192">ఇది మిమ్మల్ని మీ Google ఖాతాల నుండి సైన్ అవుట్ చేస్తుంది. మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు మరిన్ని ఇకపై సింక్ చేయబడవు.</translation> +<translation id="7978450511781612192">ఇది మిమ్మల్ని మీ Google ఖాతాల నుండి సైన్ అవుట్ చేస్తుంది. మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు మరిన్ని ఇకపై సింక్ చేయబడవు.</translation> <translation id="7980084013673500153">అసెట్ ID: <ph name="ASSET_ID" /></translation> <translation id="7981313251711023384">బ్రౌజింగ్, సెర్చ్లను మరింత వేగవంతం చేయడం కోసం పేజీలను ముందస్తుగా లోడ్ చేస్తుంది</translation> <translation id="798145602633458219"><ph name="SUGGESTION_NAME" /> సూచనను శోధన పెట్టెకు అనుబంధించండి</translation> @@ -7876,7 +7876,7 @@ <translation id="8577052309681449949">ఆటోమేటిక్ క్లిక్లు, కర్సర్ సైజ్, కర్సర్ కలర్, మరెన్నో</translation> <translation id="8578639784464423491">99 అక్షరాలను మించకూడదు</translation> <translation id="857943718398505171">అనుమతించబడింది (సిఫార్సు చేయబడింది)</translation> -<translation id="8581809080475256101">ముందుకు వెళ్లడానికి నొక్కండి, చరిత్రను చూసేందుకు సందర్భ మెనూను నొక్కండి</translation> +<translation id="8581809080475256101">ముందుకు వెళ్లడానికి నొక్కండి, హిస్టరీని చూసేందుకు సందర్భ మెనూను నొక్కండి</translation> <translation id="8584280235376696778">&వీడియోను కొత్త ట్యాబ్లో తెరువు</translation> <translation id="8584427708066927472">ఈ పరికరం నుండి పాస్వర్డ్ తొలగించబడింది</translation> <translation id="8584843865238667486"><ph name="USAGE_PAGE" /> వినియోగ పేజీలో <ph name="USAGE" /> వినియోగం ఉన్న HID పరికరాలు</translation> @@ -7991,7 +7991,7 @@ <translation id="8678538439778360739"><ph name="TIME" />లో సింక్ రహస్య పదబంధంతో డేటా ఎన్క్రిప్ట్ చేయబడింది. Google Payలోని పేమెంట్ ఆప్షన్లు, అడ్రస్లు ఇందులో ఉండవు.</translation> <translation id="8678582529642151449">ట్యాబ్లు కుదించబడవు</translation> <translation id="8678933587484842200">మీరు ఈ అప్లికేషన్ను ఎలా ప్రారంభించాలనుకుంటున్నారు?</translation> -<translation id="8680251145628383637">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను మీ అన్ని పరికరాలలో పొందడానికి సైన్ ఇన్ చేయండి. మీరు మీ Google సేవలకు కూడా ఆటోమేటిక్గా సైన్ ఇన్ చేయబడతారు.</translation> +<translation id="8680251145628383637">మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను మీ అన్ని పరికరాలలో పొందడానికి సైన్ ఇన్ చేయండి. మీరు మీ Google సేవలకు కూడా ఆటోమేటిక్గా సైన్ ఇన్ చేయబడతారు.</translation> <translation id="8681614230122836773">మీ కంప్యూటర్లో హానికరమైన సాప్ఠ్వేర్ను Chrome కనుగొన్నది</translation> <translation id="8682730193597992579"><ph name="PRINTER_NAME" /> కనెక్ట్ చేయబడింది మరియు సిద్ధంగా ఉంది</translation> <translation id="8683081248374354009">గ్రూప్ను రీసెట్ చేయండి</translation> @@ -8230,7 +8230,7 @@ <translation id="8907906903932240086">హానికరమైన సాఫ్ట్వేర్ కోసం Chrome మీ కంప్యూటర్ను చెక్ చేయగలదు</translation> <translation id="8909298138148012791"><ph name="APP_NAME" /> అన్ఇన్స్టాల్ చేయబడింది</translation> <translation id="8909833622202089127">సైట్ మీ స్థానాన్ని ట్రాక్ చేస్తోంది</translation> -<translation id="8910222113987937043">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్లలో మార్పులు మీ Google ఖాతాకు ఇకపై సింక్ చేయబడవు. అయినప్పటికీ, ఇప్పటికే ఉన్న మీ డేటా Google ఖాతాలో నిల్వ చేయబడుతుంది. <ph name="BEGIN_LINK" />Google డాష్బోర్డ్<ph name="END_LINK" />లో నిర్వహించబడుతుంది.</translation> +<translation id="8910222113987937043">మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్లలో మార్పులు మీ Google ఖాతాకు ఇకపై సింక్ చేయబడవు. అయినప్పటికీ, ఇప్పటికే ఉన్న మీ డేటా Google ఖాతాలో నిల్వ చేయబడుతుంది. <ph name="BEGIN_LINK" />Google డాష్బోర్డ్<ph name="END_LINK" />లో నిర్వహించబడుతుంది.</translation> <translation id="8910987510378294980">పరికర లిస్ట్ను దాచండి</translation> <translation id="8912362522468806198">Google ఖాతా</translation> <translation id="8912810933860534797">ఆటోమేటిక్ స్కాన్ను ప్రారంభించు</translation> @@ -8430,7 +8430,7 @@ <translation id="9101691533782776290">యాప్ను ప్రారంభించు</translation> <translation id="9102610709270966160">ఎక్స్టెన్షన్ను ప్రారంభించు</translation> <translation id="9103479157856427471">దగ్గరగా జూమ్ చేసిన స్క్రీన్ కీబోర్డ్ ఫోకస్ను ఫాలో చేస్తుంది</translation> -<translation id="9103868373786083162">చరిత్రను చూసేందుకు వెనుకకు వెళ్లు, సందర్భ మెనూ నొక్కండి</translation> +<translation id="9103868373786083162">హిస్టరీని చూసేందుకు వెనుకకు వెళ్లు, సందర్భ మెనూ నొక్కండి</translation> <translation id="9108035152087032312">పేరు &విండో...</translation> <translation id="9108072915170399168">ప్రస్తుతం డేటా వినియోగం ఇంటర్నెట్ లేనప్పుడు జరిగేలా సెట్ చేయబడి ఉంది</translation> <translation id="9108294543511800041">మీరు ఇప్పుడు మీ ఫోన్లోని ఇటీవలి ఫోటోలు, మీడియా, ఇంకా నోటిఫికేషన్లను చూడవచ్చు</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index c5dec69e..d40dda83 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">ใช้ไมโครโฟนและกล้องถ่ายรูปของคุณ</translation> <translation id="1005333234656240382">เปิดใช้การแก้ไขข้อบกพร่อง ADB ใช่ไหม</translation> <translation id="1006873397406093306">ส่วนขยายนี้อ่านและเปลี่ยนแปลงข้อมูลของคุณในเว็บไซต์ต่างๆ ได้ คุณควบคุมได้ว่าส่วนขยายนี้จะเข้าถึงเว็บไซต์ใดได้บ้าง</translation> +<translation id="1007057452468855774">เปิด Google Play Store</translation> <translation id="1008186147501209563">ส่งออกบุ๊กมาร์ก</translation> <translation id="1008557486741366299">ไม่ใช่ตอนนี้</translation> <translation id="1009476156254802388">ตำแหน่ง <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">การควบคุมเกมพร้อมใช้งานแล้ว</translation> <translation id="1010498023906173788">แท็บนี้เชื่อมต่ออยู่กับพอร์ตอนุกรม</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{หน้าไม่ตอบสนอง}other{หน้าไม่ตอบสนอง}}</translation> +<translation id="1011003645819296594">อุปกรณ์ที่บันทึกไว้</translation> <translation id="1011355516189274711">ระดับเสียงของการอ่านออกเสียงข้อความ</translation> <translation id="1012794136286421601">ไฟล์เอกสาร แผ่นงาน สไลด์ และภาพวาดกำลังซิงค์ เปิดแอป Google ไดรฟ์เพื่อเข้าถึงไฟล์แบบออนไลน์หรือออฟไลน์</translation> <translation id="1012876632442809908">อุปกรณ์ USB-C (พอร์ตด้านหน้า)</translation> @@ -491,6 +493,7 @@ <translation id="1470350905258700113">ใช้อุปกรณ์นี้</translation> <translation id="1470946456740188591">ใช้แป้นพิมพ์ลัด Ctrl+Search+7 เพื่อเปิดหรือปิดการเรียกดูด้วยแป้นพิมพ์</translation> <translation id="1472675084647422956">แสดงเพิ่มเติม</translation> +<translation id="1473223074251193484">ตั้งการกำหนดค่าการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ</translation> <translation id="1474785664565228650">ต้องเปิด Parallels Desktop อีกครั้งเพื่อให้การเปลี่ยนแปลงการตั้งค่าไมโครโฟนมีผล เปิด Parallels Desktop อีกครั้งเพื่อดำเนินการต่อ</translation> <translation id="1474893630593443211">ควบคุมโฆษณาที่คุณเห็นได้มากขึ้น</translation> <translation id="1475502736924165259">คุณมีใบรับรองของไฟล์ที่ไม่เข้ากับหมวดหมู่อื่นๆ</translation> @@ -1113,6 +1116,7 @@ <translation id="2044014337866019681">โปรดยืนยันบัญชี <ph name="ACCOUNT" /> เพื่อปลดล็อกเซสชัน</translation> <translation id="204497730941176055">ชื่อแม่แบบใบรับรองของ Microsoft</translation> <translation id="2045117674524495717">ตัวช่วยเหลือสำหรับแป้นพิมพ์ลัด</translation> +<translation id="2045211794962848221">คุณจะไม่เห็นข้อความที่เจาะจงแบบนี้อีก</translation> <translation id="2045969484888636535">ปิดกั้นคุกกี้ต่อไป</translation> <translation id="204622017488417136">อุปกรณ์จะเปลี่ยนกลับเป็นเวอร์ชันก่อนหน้าของ Chrome ที่ติดตั้งไว้ บัญชีผู้ใช้ทั้งหมดและข้อมูลในเครื่องจะถูกนำออก โดยขั้นตอนนี้ไม่สามารถยกเลิกได้</translation> <translation id="2046702855113914483">ราเม็ง</translation> @@ -3798,6 +3802,7 @@ <translation id="4594577641390224176">หากต้องการดูหน้าข้อมูลเกี่ยวกับระบบ โปรดไปที่</translation> <translation id="4595560905247879544">แอปและส่วนขยายสามารถแก้ไขได้โดยผู้จัดการ (<ph name="CUSTODIAN_NAME" />) เท่านั้น</translation> <translation id="4596295440756783523">คุณมีใบรับรองของไฟล์ซึ่งระบุตัวตนของเซิร์ฟเวอร์เหล่านี้:</translation> +<translation id="4598345735110653698">จัดการพาสคีย์</translation> <translation id="4598556348158889687">การจัดการพื้นที่เก็บข้อมูล</translation> <translation id="4598776695426288251">มี Wi-Fi พร้อมใช้งานผ่านอุปกรณ์หลายเครื่อง</translation> <translation id="4601426376352205922">ทำเครื่องหมายว่ายังไม่อ่าน</translation> @@ -4023,6 +4028,7 @@ <translation id="4823894915586516138">PIN หรือรหัสผ่านนี้ช่วยปกป้องข้อมูลใน <ph name="DEVICE_TYPE" /> เครื่องนี้ รวมถึงข้อมูลที่คุณเข้าถึงจากโทรศัพท์</translation> <translation id="4824037980212326045">การสำรองและกู้คืนข้อมูลใน Linux</translation> <translation id="4824958205181053313">ยกเลิกการซิงค์ใช่ไหม</translation> +<translation id="4825532258163983651">ลบพาสคีย์ไม่ได้</translation> <translation id="4827675678516992122">เชื่อมต่อไม่ได้</translation> <translation id="4827784381479890589">การตรวจตัวสะกดที่ผ่านการเพิ่มประสิทธิภาพในเบราว์เซอร์ Chrome (ระบบจะส่งข้อความไปยัง Google เพื่อรับคำแนะนำในการสะกด)</translation> <translation id="4827904420700932487">สร้างคิวอาร์โค้ดสำหรับรูปภาพนี้</translation> @@ -4285,6 +4291,7 @@ <translation id="5087249366037322692">เพิ่มโดยบุคคลที่สาม</translation> <translation id="5087580092889165836">เพิ่มบัตร</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 พร้อมการเข้ารหัส RSA</translation> +<translation id="5089763948477033443">แฮนเดิลปรับขนาดแผงด้านข้าง</translation> <translation id="5090637338841444533">ไม่ได้รับอนุญาตให้ติดตามตำแหน่งของกล้อง</translation> <translation id="5093569275467863761">ซับเฟรมแคชย้อนหลังในโหมดไม่ระบุตัวตน: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">คุณสามารถเปิดและแก้ไขไฟล์ที่ระบบรองรับด้วยแอปนี้ได้จากแอป Files หรือจากแอปอื่นๆ หากต้องการควบคุมว่ามีไฟล์ใดบ้างที่เปิดในแอปนี้ได้โดยค่าเริ่มต้น ให้<ph name="BEGIN_LINK" />ดูวิธีตั้งค่าแอปเริ่มต้นในอุปกรณ์<ph name="END_LINK" /></translation> @@ -4450,6 +4457,7 @@ <translation id="5258992782919386492">ติดตั้งในอุปกรณ์นี้</translation> <translation id="5260334392110301220">เครื่องหมายคำพูดอัจฉริยะ</translation> <translation id="5260508466980570042">ขออภัย ไม่สามารถยืนยันอีเมลหรือรหัสผ่านของคุณได้ โปรดลองอีกครั้ง</translation> +<translation id="5260958083445173099">เว็บไซต์จะแสดงเนื้อหาในภาษาที่คุณต้องการ เมื่อเป็นไปได้</translation> <translation id="5261683757250193089">เปิดในเว็บสโตร์</translation> <translation id="5262178194499261222">นำรหัสผ่านออก</translation> <translation id="5262784498883614021">เชื่อมต่อกับเครือข่ายโดยอัตโนมัติ</translation> @@ -4490,6 +4498,7 @@ <translation id="5294097441441645251">ต้องขึ้นต้นด้วยอักขระตัวพิมพ์เล็กหรือขีดล่าง</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> ของคุณใช้เซ็นเซอร์ในตัวเพื่อตรวจจับผู้คนที่อยู่ด้านหน้าอุปกรณ์ของคุณ อุปกรณ์จะประมวลผลข้อมูลทั้งหมดในทันที จากนั้นจะลบข้อมูลออก และจะไม่มีการส่งข้อมูลเซ็นเซอร์ให้ Google <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="5296350763804564124">ฟังการอธิบายและอ่านออกเสียงเพื่อให้คุณใช้อุปกรณ์ได้โดยไม่ต้องมองหน้าจอ การอธิบายและอ่านออกเสียงอักษรเบรลล์จะพร้อมใช้งานกับอุปกรณ์ที่เชื่อมต่อ</translation> +<translation id="5297005732522718715">รีเฟรชการกำหนดค่าการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ</translation> <translation id="5297082477358294722">บันทึกรหัสผ่านแล้ว ดูและจัดการรหัสผ่านที่บันทึกไว้ได้ใน<ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="5297946558563358707">เมื่อผู้อื่นดูหน้าจอของคุณ ไอคอนความเป็นส่วนตัวรูปดวงตาจะแสดงขึ้นที่มุมขวาล่างของหน้าจอ</translation> <translation id="5298219193514155779">ธีมที่สร้างโดย</translation> @@ -4660,6 +4669,7 @@ <translation id="5466374726908360271">ว&างและค้นหา “<ph name="SEARCH_TERMS" />”</translation> <translation id="5467207440419968613">บล็อก<ph name="PERMISSION_1" />และ<ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">กำลังมองหาพื้นที่แชร์ไฟล์</translation> +<translation id="5468330507528805311">สถานะการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ</translation> <translation id="5468881191994555667">เลือกไฟล์</translation> <translation id="5469852975082458401">คุณไปยังส่วนต่างๆ ของหน้าได้ด้วยเคอร์เซอร์ข้อความ กด F7 เพื่อปิด</translation> <translation id="5470735824776589490">ต้องรีสตาร์ทก่อน จึงจะรีเซ็ตอุปกรณ์ของคุณด้วย Powerwash ได้ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> @@ -4933,6 +4943,7 @@ <translation id="5734362860645681824">การสื่อสาร</translation> <translation id="5734697361979786483">เพิ่มพื้นที่แชร์ไฟล์</translation> <translation id="5736796278325406685">โปรดป้อนชื่อผู้ใช้ที่ถูกต้อง</translation> +<translation id="5738093759615225354">คุณต้องมีพาสคีย์นี้เพื่อลงชื่อเข้าใช้คอมพิวเตอร์</translation> <translation id="5739017626473506901">ลงชื่อเข้าใช้เพื่อช่วย <ph name="USER_NAME" /> เพิ่มบัญชีโรงเรียน</translation> <translation id="5739235828260127894">กำลังรอการยืนยัน <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> <translation id="5739458112391494395">ใหญ่มาก</translation> @@ -5094,6 +5105,7 @@ <translation id="589541317545606110">ค้นหาหน้าด้วย <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">ไม่อนุญาต</translation> <translation id="5900186025777217044">Smart Lock มีการเปลี่ยนแปลง</translation> +<translation id="5900243355162006650">การกำหนดค่าการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ</translation> <translation id="5900302528761731119">รูปภาพ Google โปรไฟล์</translation> <translation id="590036993063074298">รายละเอียดคุณภาพการมิเรอร์</translation> <translation id="5901069264981746702">ข้อมูลลายนิ้วมือจะจัดเก็บไว้อย่างปลอดภัยและอยู่ใน <ph name="DEVICE_TYPE" /> ของคุณเสมอ <ph name="LINK_BEGIN" />ดูข้อมูลเพิ่มเติม<ph name="LINK_END" /></translation> @@ -5397,6 +5409,7 @@ <translation id="6196640612572343990">บล็อกคุกกี้ของบุคคลที่สาม</translation> <translation id="6196854373336333322">ส่วนขยาย "<ph name="EXTENSION_NAME" />" ได้เข้าควบคุมการตั้งค่าพร็อกซีของคุณ ซึ่งหมายความว่าส่วนขยายนี้จะสามารถเปลี่ยนแปลง ทำให้เสียหาย หรือดักฟังทุกอย่างที่คุณทำทางออนไลน์ได้ หากคุณไม่แน่ใจว่าการเปลี่ยนแปลงนี้เกิดขึ้นได้อย่างไร คุณอาจไม่ต้องการส่วนขยายนี้</translation> <translation id="6197128521826316819">สร้างคิวอาร์โค้ดสำหรับหน้านี้</translation> +<translation id="6197223946499512637">พาสคีย์เหล่านี้จะจัดเก็บไว้ใน Windows Hello บนคอมพิวเตอร์เครื่องนี้ โดยจะไม่บันทึกไว้ในบัญชี Google ของคุณ</translation> <translation id="6198252989419008588">เปลี่ยน PIN</translation> <translation id="6200047250927636406">ทิ้งไฟล์</translation> <translation id="6200151268994853226">จัดการส่วนขยาย</translation> @@ -5694,6 +5707,7 @@ <translation id="6482559668224714696">แว่นขยายทั้งหน้าจอ</translation> <translation id="6483485061007832714">เปิดไฟล์ที่ดาวน์โหลด</translation> <translation id="6483805311199035658">กำลังเปิด <ph name="FILE" />...</translation> +<translation id="6486301003991593638">หากต้องการจัดการพาสคีย์ ให้ใช้ Windows เวอร์ชันใหม่กว่า</translation> <translation id="6488384360522318064">เลือกภาษา</translation> <translation id="648927581764831596">ไม่มีให้ใช้งาน</translation> <translation id="6490471652906364588">อุปกรณ์ USB-C (พอร์ตด้านขวา)</translation> @@ -6280,6 +6294,7 @@ <translation id="7029307918966275733">ไม่ได้ติดตั้ง Crostini โปรดติดตั้ง Crostini เพื่อดูเครดิต</translation> <translation id="7029809446516969842">รหัสผ่าน</translation> <translation id="7030304022046916278">ส่ง URL ให้ Google Safe Browsing ตรวจสอบ</translation> +<translation id="7030695672997239647">คลิกขวาที่แท็บแล้วเลือก "เพิ่มแท็บไปยังกลุ่ม" จากนั้นเลือก "กลุ่มใหม่"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" /> - เชื่อมต่อพอร์ตอนุกรมอยู่</translation> <translation id="7033616203784997570">ข้อมูลที่ป้อนต้องมีความยาวไม่เกิน 62 อักขระ</translation> <translation id="7034692021407794547">ผู้ดูแลระบบที่มีสิทธิ์จัดการการเรียกเก็บเงินต้องยอมรับข้อกำหนดในการให้บริการฮาร์ดแวร์ของ Google Meet ในส่วน "ฮาร์ดแวร์ของ Google Meet" ของคอนโซลผู้ดูแลระบบก่อน</translation> @@ -7381,6 +7396,7 @@ <translation id="8101987792947961127">ต้องใช้ Powerwash ในการรีบูตครั้งถัดไป</translation> <translation id="81020759409809034">ตำแหน่งในเครื่อง</translation> <translation id="8102139037507939978">นำข้อมูลส่วนบุคคลที่ระบุตัวบุคคลนั้นได้ออกจาก system_logs.txt</translation> +<translation id="810362914482827094">ค้นหาพาสคีย์</translation> <translation id="8104088837833760645">ดาวน์โหลดโปรไฟล์ eSIM</translation> <translation id="8105368624971345109">ปิด</translation> <translation id="8107015733319732394">กำลังติดตั้ง Google Play Store ใน <ph name="DEVICE_TYPE" /> อาจใช้เวลาสักครู่</translation> @@ -7828,6 +7844,7 @@ <translation id="8557022314818157177">แตะคีย์ความปลอดภัยซ้ำๆ จนกว่าระบบจะบันทึกลายนิ้วมือของคุณได้</translation> <translation id="8557180006508471423">เปิด "Google Chrome" ใน Location Services ของ Mac</translation> <translation id="8557856025359704738">ดาวน์โหลดครั้งถัดไปในวันที่ <ph name="NEXT_DATE_DOWNLOAD" /></translation> +<translation id="8559858985063901027">พาสคีย์</translation> <translation id="8560327176991673955">{COUNT,plural, =0{เปิดทั้งหมดใน&หน้าต่างใหม่}=1{เปิดใน&หน้าต่างใหม่}other{เปิดทั้งหมด ({COUNT}) ใน&หน้าต่างใหม่}}</translation> <translation id="8561206103590473338">ช้าง</translation> <translation id="8561565784790166472">โปรดดำเนินการด้วยความระมัดระวัง</translation> @@ -7955,6 +7972,7 @@ <translation id="8677212948402625567">ยุบทั้งหมด...</translation> <translation id="867767487203716855">การอัปเดตถัดไป</translation> <translation id="8677859815076891398">ไม่มีอัลบั้ม สร้างอัลบั้มใน <ph name="LINK_BEGIN" />Google Photos<ph name="LINK_END" /></translation> +<translation id="8678378565142776698">รีสตาร์ทและรับการอัปเดตอัตโนมัติ</translation> <translation id="8678538439778360739">มีการเข้ารหัสข้อมูลด้วยรหัสผ่านการซิงค์เมื่อ <ph name="TIME" /> ข้อมูลนี้ไม่รวมถึงวิธีการชำระเงินและที่อยู่จาก Google Pay</translation> <translation id="8678582529642151449">แท็บจะไม่ย่อ</translation> <translation id="8678933587484842200">คุณต้องการเปิดแอปพลิเคชันนี้ด้วยวิธีใด</translation> @@ -8201,6 +8219,7 @@ <translation id="8910987510378294980">ซ่อนรายการอุปกรณ์</translation> <translation id="8912362522468806198">บัญชี Google</translation> <translation id="8912810933860534797">เปิดใช้การสแกนอัตโนมัติ</translation> +<translation id="8915307125957890427">คลิกขวาที่แท็บแล้วเลือก "เพิ่มแท็บไปยังกลุ่ม" จากนั้นเลือก "กลุ่มใหม่"</translation> <translation id="8915370057835397490">กำลังโหลดคำแนะนำ</translation> <translation id="8916476537757519021">เฟรมย่อยแบบไม่ระบุตัวตน: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> ของ <ph name="GIVEN_NAME" /></translation> @@ -8275,6 +8294,7 @@ <translation id="8986362086234534611">เลิกจำ</translation> <translation id="8986494364107987395">ส่งสถิติการใช้งานและรายงานข้อขัดข้องไปยัง Google โดยอัตโนมัติ</translation> <translation id="8987927404178983737">เดือน</translation> +<translation id="8989359959810288806">รีเฟรชสถานะการเชื่อมต่ออินเทอร์เน็ตผ่านมือถือ</translation> <translation id="8991520179165052608">เว็บไซต์ใช้ไมโครโฟนของคุณได้</translation> <translation id="899384117894244799">นำผู้ใช้ที่ถูกจำกัดออก</translation> <translation id="899403249577094719">URL ที่อ้างอิงใบรับรองของ Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 42e6f41..ec10ce9 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -4673,6 +4673,7 @@ <translation id="5470735824776589490">Cihazınızın Powerwash ile sıfırlanabilmesi için yeniden başlatılması gerekir. <ph name="LINK_BEGIN" />Daha fazla bilgi<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Merhaba! Ben sizin metin okuma sesinizim.</translation> <translation id="5472627187093107397">Bu site için şifreleri kaydet</translation> +<translation id="5473062644742711742">Chrome Web Mağazası'nda daha fazla erişilebilirlik aracı bulun</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Devam ederek bu cihazın Google'dan, çocuğunuzun operatöründen ve bu cihazın üreticisinden güncellemeleri ve uygulamaları, muhtemelen hücresel veri üzerinden otomatik olarak indirip yükleyebileceğini kabul etmiş olursunuz. Bu uygulamalardan bazıları uygulama içi satın alma seçenekleri sunabilir.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN en az bir karakter olmalıdır}other{PIN en az # karakter olmalıdır}}</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index b3a0c784..4137607c 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -8,12 +8,14 @@ <translation id="1005274289863221750">Використовувати ваш мікрофон і камеру</translation> <translation id="1005333234656240382">Увімкнути налагодження ADB?</translation> <translation id="1006873397406093306">Це розширення може переглядати й змінювати ваші дані на сайтах. Ви можете вибирати, до яких сайтів воно має доступ.</translation> +<translation id="1007057452468855774">Увімкнути Google Play</translation> <translation id="1008186147501209563">Експортувати закладки</translation> <translation id="1008557486741366299">Не зараз</translation> <translation id="1009476156254802388">Розташування в сервісі <ph name="WEB_DRIVE" /></translation> <translation id="1009663062402466586">Тепер доступні елементи керування іграми</translation> <translation id="1010498023906173788">Цю вкладку підключено до послідовного порту</translation> <translation id="1010833424573920260">{NUM_PAGES,plural, =1{Сторінка не відповідає}one{Сторінки не відповідають}few{Сторінки не відповідають}many{Сторінки не відповідають}other{Сторінки не відповідають}}</translation> +<translation id="1011003645819296594">Збережені пристрої</translation> <translation id="1011355516189274711">Гучність синтезу мовлення</translation> <translation id="1012794136286421601">Ваші файли Документів, Таблиць, Презентацій і Малюнків синхронізуються. Відкрийте програму Диск Google, щоб отримати до них доступ онлайн чи офлайн.</translation> <translation id="1012876632442809908">Пристрій із портом USB типу C (на передній панелі)</translation> @@ -497,6 +499,7 @@ <translation id="1470350905258700113">Використовувати цей пристрій</translation> <translation id="1470946456740188591">Щоб увімкнути або вимкнути клавішну навігацію, натисніть Ctrl + Search + 7</translation> <translation id="1472675084647422956">Показати більше</translation> +<translation id="1473223074251193484">Налаштувати конфігурацію точки доступу</translation> <translation id="1474785664565228650">Щоб зміни в налаштуваннях мікрофона почали діяти й ви могли продовжити роботу, перезапустіть додаток Parallels Desktop.</translation> <translation id="1474893630593443211">Краще керування оголошеннями, які вам показуються</translation> <translation id="1475502736924165259">У вас є сертифікати, які не відповідають іншим категоріям</translation> @@ -1128,6 +1131,7 @@ <translation id="2044014337866019681">Переконайтеся, що підтверджуєте обліковий запис <ph name="ACCOUNT" />, щоб розблокувати цей сеанс.</translation> <translation id="204497730941176055">Ім'я шаблону сертифіката Microsoft</translation> <translation id="2045117674524495717">Довідник із комбінацій клавіш</translation> +<translation id="2045211794962848221">Ви більше не бачитимете це повідомлення</translation> <translation id="2045969484888636535">Продовжити блокування файлів cookie</translation> <translation id="204622017488417136">Ваш пристрій повернеться до попередньо встановленої версії Chrome. Усі облікові записи користувачів і локальні дані буде видалено. Цю дію не можна відмінити.</translation> <translation id="2046702855113914483">Рамен</translation> @@ -3817,6 +3821,7 @@ <translation id="4594577641390224176">Шукаєте сторінку з інформацією про систему? Перейдіть на сторінку</translation> <translation id="4595560905247879544">Лише адміністратор (<ph name="CUSTODIAN_NAME" />) може змінювати додатки та розширення.</translation> <translation id="4596295440756783523">У вас є сертифікати, які ідентифікують ці сервери</translation> +<translation id="4598345735110653698">Керувати ключами доступу</translation> <translation id="4598556348158889687">Керування пам’яттю</translation> <translation id="4598776695426288251">Доступне з’єднання Wi-Fi через кілька пристроїв</translation> <translation id="4601426376352205922">Позначити як непрочитане</translation> @@ -4042,6 +4047,7 @@ <translation id="4823894915586516138">PIN-код або пароль захищають ваші дані на цьому пристрої <ph name="DEVICE_TYPE" /> (зокрема інформацію, до якої ви маєте доступ із телефона).</translation> <translation id="4824037980212326045">Резервне копіювання й відновлення Linux</translation> <translation id="4824958205181053313">Скасувати синхронізацію?</translation> +<translation id="4825532258163983651">Не вдалося видалити ключ доступу</translation> <translation id="4827675678516992122">Не вдалося під’єднатись</translation> <translation id="4827784381479890589">Покращена перевірка орфографії у веб-переглядачі Chrome (текст надсилається в Google для пропозицій написання)</translation> <translation id="4827904420700932487">Створити QR-код для цього зображення</translation> @@ -4304,6 +4310,7 @@ <translation id="5087249366037322692">Додано сторонньою програмою</translation> <translation id="5087580092889165836">Додати картку</translation> <translation id="5088534251099454936">PKCS #1 SHA-512 із шифруванням RSA</translation> +<translation id="5089763948477033443">Маркер для змінення розміру бічної панелі</translation> <translation id="5090637338841444533">Заборонено відстежувати положення камери</translation> <translation id="5093569275467863761">Додатковий фрейм зворотного кешу в анонімному режимі: <ph name="BACK_FORWARD_CACHE_INCOGNITO_PAGE_URL" /></translation> <translation id="5094176498302660097">Ви можете відкривати й редагувати підтримувані файли в цьому додатку через додаток Файли або інші додатки. Щоб указати, які файли будуть відкриватися в цьому додатку за умовчанням, <ph name="BEGIN_LINK" />дізнайтеся, як налаштувати стандартні додатки на пристрої<ph name="END_LINK" />.</translation> @@ -4469,6 +4476,7 @@ <translation id="5258992782919386492">Установити на цьому пристрої</translation> <translation id="5260334392110301220">Розумні лапки</translation> <translation id="5260508466980570042">На жаль, не вдалося підтвердити вашу електронну адресу чи пароль. Повторіть спробу.</translation> +<translation id="5260958083445173099">Вміст веб-сайтів відображатиметься вибраними мовами, коли це можливо</translation> <translation id="5261683757250193089">Відкрити у Веб-магазині</translation> <translation id="5262178194499261222">Видалити пароль</translation> <translation id="5262784498883614021">Автоматично підключатися до мережі</translation> @@ -4509,6 +4517,7 @@ <translation id="5294097441441645251">Має починатися з малої літери або символу підкреслення</translation> <translation id="5294618183559481278"><ph name="DEVICE_TYPE" /> використовує вбудований датчик, щоб виявляти присутність людей перед екраном. Усі дані відразу обробляються на пристрої та видаляються. Вони ніколи не надсилаються в Google. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="5296350763804564124">Слухайте голосові підказки, щоб користуватися пристроєм, не дивлячись на екран. Якщо підключено брайлівський пристрій, можна ввімкнути відгук.</translation> +<translation id="5297005732522718715">Оновити конфігурацію точки доступу</translation> <translation id="5297082477358294722">Пароль збережено. Переглядайте збережені паролі й керуйте ними на сторінці <ph name="SAVED_PASSWORDS_STORE" /></translation> <translation id="5297946558563358707">Якщо хтось дивиться на ваш екран, у нижньому правому куті екрана відображається значок ока</translation> <translation id="5298219193514155779">Автор теми:</translation> @@ -4679,11 +4688,13 @@ <translation id="5466374726908360271">Вставити й шукати "<ph name="SEARCH_TERMS" />"</translation> <translation id="5467207440419968613">Заблоковано: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /></translation> <translation id="5468173180030470402">Пошук файлообмінників</translation> +<translation id="5468330507528805311">Статус точки доступу:</translation> <translation id="5468881191994555667">Вибрати файл</translation> <translation id="5469852975082458401">Ви можете оглядати сторінки за допомогою текстового курсора. Щоб вимкнути цей режим, натисніть F7.</translation> <translation id="5470735824776589490">Перш ніж скинути налаштування за допомогою функції Powerwash, потрібно перезапустити пристрій. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="5471768120198416576">Вітаю! Я – голос для синтезу мовлення.</translation> <translation id="5472627187093107397">Зберігати паролі для цього сайту</translation> +<translation id="5473062644742711742">Знайти інші інструменти спеціальних можливостей у Веб-магазині Chrome</translation> <translation id="5473075389972733037">IBM</translation> <translation id="5473099001878321374">Продовжуючи, ви дозволяєте цьому пристрою автоматично завантажувати та встановлювати оновлення й додатки від Google, оператора дитини та виробника пристрою, зокрема через мобільний трафік. У деяких додатках можуть пропонуватися покупки.</translation> <translation id="5473156705047072749">{NUM_CHARACTERS,plural, =1{PIN-код має містити принаймні один символ}one{PIN-код має містити принаймні # символ}few{PIN-код має містити принаймні # символи}many{PIN-код має містити принаймні # символів}other{PIN-код має містити принаймні # символу}}</translation> @@ -4952,6 +4963,7 @@ <translation id="5734362860645681824">Зв’язок</translation> <translation id="5734697361979786483">Додати файлообмінник</translation> <translation id="5736796278325406685">Введіть дійсне ім’я користувача</translation> +<translation id="5738093759615225354">Цей ключ доступу потрібен, щоб входити в обліковий запис на комп’ютері</translation> <translation id="5739017626473506901">Увійдіть, і тоді <ph name="USER_NAME" /> зможе додати обліковий запис закладу освіти</translation> <translation id="5739235828260127894">Очікується підтвердження. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> <translation id="5739458112391494395">Дуже великий</translation> @@ -5113,6 +5125,7 @@ <translation id="589541317545606110">Шукати сторінку за допомогою <ph name="VISUAL_SEARCH_PROVIDER" /></translation> <translation id="5896436821193322561">Не дозволяти</translation> <translation id="5900186025777217044">Функцію Smart Lock змінено</translation> +<translation id="5900243355162006650">Конфігурація точки доступу:</translation> <translation id="5900302528761731119">Фото профілю Google</translation> <translation id="590036993063074298">Відомості про якість трансляції</translation> <translation id="5901069264981746702"><ph name="DEVICE_TYPE" /> надійно зберігатиме дані про відбиток пальця та нікуди не надсилатиме їх. <ph name="LINK_BEGIN" />Докладніше<ph name="LINK_END" /></translation> @@ -5416,6 +5429,7 @@ <translation id="6196640612572343990">Блокувати сторонні файли cookie</translation> <translation id="6196854373336333322">Розширення "<ph name="EXTENSION_NAME" />" керує налаштуваннями проксі-сервера, тобто може змінювати та переривати будь-які ваші дії онлайн, а також стежити за ними. Якщо ви не знаєте причини такої зміни, імовірно, вона небажана.</translation> <translation id="6197128521826316819">Створити QR-код для цієї сторінки</translation> +<translation id="6197223946499512637">Ці ключі доступу зберігаються в додатку Windows Hello на комп’ютері, а не у вашому обліковому записі Google.</translation> <translation id="6198252989419008588">Змінити PIN-код</translation> <translation id="6200047250927636406">Відхилити файл</translation> <translation id="6200151268994853226">Керувати розширенням</translation> @@ -5713,6 +5727,7 @@ <translation id="6482559668224714696">Лупа для всього екрана</translation> <translation id="6483485061007832714">Відкрити завантаження</translation> <translation id="6483805311199035658">Відкривається файл <ph name="FILE" />...</translation> +<translation id="6486301003991593638">Щоб керувати ключами доступу, оновіть Windows</translation> <translation id="6488384360522318064">Виберіть мову</translation> <translation id="648927581764831596">Нічого не доступно</translation> <translation id="6490471652906364588">Пристрій із портом USB типу C (праворуч)</translation> @@ -6305,6 +6320,7 @@ <translation id="7029307918966275733">Crostini не встановлено. Установіть це рішення, щоб переглянути дані про розробників.</translation> <translation id="7029809446516969842">Паролі</translation> <translation id="7030304022046916278">Надсилає URL-адреси в Безпечний перегляд на перевірку</translation> +<translation id="7030695672997239647">Натисніть правою кнопкою миші на вкладку й виберіть "Додати вкладку в групу", а потім – "Нова група"</translation> <translation id="7031608529463141342"><ph name="WINDOW_TITLE" />: підключено послідовний порт</translation> <translation id="7033616203784997570">Дозволено щонайбільше 62 символи</translation> <translation id="7034692021407794547">Адміністратор, що має право керувати платежами, спершу повинен прийняти Умови використання обладнання для Google Meet у відповідному розділі в Консолі адміністратора.</translation> @@ -7407,6 +7423,7 @@ <translation id="8101987792947961127">Під час наступного перезавантаження потрібно виконати Powerwash</translation> <translation id="81020759409809034">Локальне розташування</translation> <translation id="8102139037507939978">Вилучити ідентифікаційну інформацію з файлу system_logs.txt.</translation> +<translation id="810362914482827094">Пошук ключів доступу</translation> <translation id="8104088837833760645">Завантажити профіль eSIM-карти</translation> <translation id="8105368624971345109">Вимкнути</translation> <translation id="8107015733319732394">Встановлення додатка Google Play Store на ваш <ph name="DEVICE_TYPE" />. Це може зайняти кілька хвилин.</translation> @@ -7854,6 +7871,7 @@ <translation id="8557022314818157177">Торкайтеся ключа безпеки, поки відбиток пальця не відсканується</translation> <translation id="8557180006508471423">Увімкніть параметр "Google Chrome" у Службах локації на пристрої Mac</translation> <translation id="8557856025359704738">Наступне завантаження: <ph name="NEXT_DATE_DOWNLOAD" />.</translation> +<translation id="8559858985063901027">Ключі доступу</translation> <translation id="8560327176991673955">{COUNT,plural, =0{Відкрити всі в &новому вікні}=1{Відкрити в &новому вікні}one{Відкрити всі ({COUNT}) у &новому вікні}few{Відкрити всі ({COUNT}) у &новому вікні}many{Відкрити всі ({COUNT}) у &новому вікні}other{Відкрити всі ({COUNT}) у &новому вікні}}</translation> <translation id="8561206103590473338">Слон</translation> <translation id="8561565784790166472">Будьте обережні</translation> @@ -7980,6 +7998,7 @@ <translation id="8677212948402625567">Згорнути все...</translation> <translation id="867767487203716855">Наступне оновлення</translation> <translation id="8677859815076891398">Немає альбомів. Створіть їх у <ph name="LINK_BEGIN" />Google Фото<ph name="LINK_END" />.</translation> +<translation id="8678378565142776698">Перезапустити й увімкнути автоматичні оновлення</translation> <translation id="8678538439778360739">Дані зашифровано за допомогою парольної фрази для синхронізації <ph name="TIME" />. Це не стосується способів оплати й адрес із Google Pay.</translation> <translation id="8678582529642151449">Вкладки не зменшуються</translation> <translation id="8678933587484842200">Як запускати цей додаток?</translation> @@ -8229,6 +8248,7 @@ <translation id="8910987510378294980">Сховати список пристроїв</translation> <translation id="8912362522468806198">Обліковий запис Google</translation> <translation id="8912810933860534797">Увімкнути автоматичне сканування</translation> +<translation id="8915307125957890427">Натисніть правою кнопкою миші на вкладку й виберіть "Додати вкладку в групу", а потім – "Нова група"</translation> <translation id="8915370057835397490">Завантаження пропозиції</translation> <translation id="8916476537757519021">Додатковий анонімний фрейм: <ph name="SUBFRAME_SITE" /></translation> <translation id="8918637186205009138"><ph name="DEVICE_TYPE" /> (<ph name="GIVEN_NAME" />)</translation> @@ -8303,6 +8323,7 @@ <translation id="8986362086234534611">Видалити</translation> <translation id="8986494364107987395">Автоматично надсилати статистику використання та звіти про аварійне завершення роботи в Google</translation> <translation id="8987927404178983737">Місяць</translation> +<translation id="8989359959810288806">Оновити статус точки доступу</translation> <translation id="8991520179165052608">Сайт може використовувати мікрофон</translation> <translation id="899384117894244799">Видалити користувача з обмеженими правами</translation> <translation id="899403249577094719">Основна URL-адреса сертифіката Netscape</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 81ab62ab..0144f64 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -2513,7 +2513,7 @@ <translation id="3348038390189153836">Phát hiện thiết bị di động</translation> <translation id="3348131053948466246">Đã đề xuất biểu tượng cảm xúc. Hãy nhấn phím mũi tên lên hoặc xuống để di chuyển và nhấn phím Enter để chèn.</translation> <translation id="3349933790966648062">Mức sử dụng bộ nhớ</translation> -<translation id="3353786022389205125">Bật "Hiển thị màn hình khóa khi thức dậy từ chế độ ngủ" và thử lại</translation> +<translation id="3353786022389205125">Hãy bật tuỳ chọn "Hiển thị màn hình khóa khi đánh thức từ chế độ ngủ" và thử lại</translation> <translation id="3354972872297836698">Không ghép nối được với thiết bị <ph name="DEVICE_NAME" />; hãy chọn thiết bị để thử lại</translation> <translation id="3355936511340229503">Lỗi kết nối</translation> <translation id="3356469410714175391">(Đã bật tính năng Thẻ ảo)</translation> @@ -7978,6 +7978,7 @@ <translation id="8666759526542103597">Giới thiệu về tính năng cá nhân hoá quảng cáo dựa vào trình duyệt</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> hiện ở chế độ toàn màn hình và đã tắt con trỏ chuột của bạn.</translation> <translation id="8667760277771450375">Chúng tôi đang nghiên cứu các cách để hạn chế hoạt động theo dõi qua nhiều trang web đồng thời giúp các trang web ngăn chặn hành vi lừa đảo và quảng cáo không liên quan.</translation> +<translation id="8668378421690365723">Thiết bị của bạn có thể không còn hoạt động bình thường và có thể gặp phải các vấn đề về hiệu suất và bảo mật.</translation> <translation id="8669284339312441707">Ấm hơn</translation> <translation id="8670537393737592796">Để quay lại đây nhanh chóng, hãy cài đặt <ph name="APP_NAME" /> bằng cách nhấp vào nút cài đặt</translation> <translation id="867085395664725367">Đã xảy ra lỗi máy chủ tạm thời.</translation> @@ -8461,6 +8462,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />Để có trải nghiệm tốt nhất, hãy cài đặt <ph name="DEVICE_OS" /> vào ổ đĩa trong của bạn. Bạn cũng có thể cài đặt ứng dụng vào lúc khác trên màn hình đăng nhập.<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />Nếu chưa sẵn sàng cài đặt, bạn có thể chạy ứng dụng từ USB để dùng thử trước. Thao tác này sẽ giữ lại hệ điều hành và dữ liệu hiện có, nhưng bạn có thể gặp phải các giới hạn về dung lượng lưu trữ và hiệu suất.<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">Mở dưới dạng thẻ được ghim</translation> +<translation id="9123287046453017203">Thiết bị của bạn chưa được cập nhật</translation> <translation id="9124003689441359348">Mật khẩu đã lưu của bạn sẽ xuất hiện ở đây</translation> <translation id="9126149354162942022">Màu con trỏ</translation> <translation id="9128317794749765148">Không thể hoàn tất quá trình thiết lập</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index 0e9919d6..e002a06 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -2213,7 +2213,7 @@ <translation id="3021065318976393105">使用電池時</translation> <translation id="3021066826692793094">蝴蝶</translation> <translation id="3021678814754966447">檢視頁框原始碼(&V)</translation> -<translation id="3022361196600037287"><ph name="DEVICE" /> 將從這部 Chromebook 中移除,且不會儲存至 <ph name="PRIMARY_EMAIL" />。</translation> +<translation id="3022361196600037287"><ph name="DEVICE" /> 將會從此 Chromebook 移除,且不會儲存至 <ph name="PRIMARY_EMAIL" />。</translation> <translation id="3022978424994383087">無法辨識語音。</translation> <translation id="3023464535986383522">選取以朗讀</translation> <translation id="3024374909719388945">使用 24 小時制時鐘</translation> @@ -3753,7 +3753,7 @@ <translation id="4535127706710932914">預設設定檔</translation> <translation id="4535767533210902251">指紋感應器位於鍵盤右上方。請用任何一隻手指輕觸指紋感應器。</translation> <translation id="4536140153723794651">一律可以使用 Cookie 的網站</translation> -<translation id="4536769240747010177">網路共用功能:</translation> +<translation id="4536769240747010177">網絡共享功能:</translation> <translation id="4538417792467843292">刪除文字</translation> <translation id="4538792345715658285">由公司政策安裝</translation> <translation id="4541123282641193691">無法驗證您的帳戶,請再試一次,或重新啟動 Chromebook。</translation> @@ -6209,10 +6209,10 @@ <translation id="6943939122536910181">中斷咗同 <ph name="DEVICE" /> 嘅連線</translation> <translation id="6945221475159498467">選取</translation> <translation id="694592694773692225">已在此網頁禁止重新導向。</translation> -<translation id="6947015141909171112">系統會根據你最近搜尋的食譜,向你顯示食譜。 +<translation id="6947015141909171112">系統會根據您最近搜尋的食譜,為您顯示食譜。 <ph name="BREAK" /> <ph name="BREAK" /> - 你可以透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> + 您可透過資訊卡選單管理設定,或前往「自訂 Chrome」查看更多選項。</translation> <translation id="6949434160682548041">密碼 (選填)</translation> <translation id="6950627417367801484">還原應用程式</translation> <translation id="6952242901357037157">您亦可在此顯示 <ph name="BEGIN_LINK" />Google 帳戶<ph name="END_LINK" />的密碼</translation> @@ -7801,7 +7801,7 @@ <translation id="8486666913807228950">原因:在「強制開啟方式」清單中找到反轉規則 <ph name="REVERT_RULE" />。</translation> <translation id="848666842773560761">一個應用程式正在嘗試存取攝錄機。如要允許存取,請將攝錄機的私隱開關切換至關閉。</translation> <translation id="8487678622945914333">放大</translation> -<translation id="8487699605742506766">無線基地台</translation> +<translation id="8487699605742506766">熱點</translation> <translation id="8489156414266187072">個人建議只會在您的帳戶上顯示</translation> <translation id="8490896350101740396">下列 Kiosk 應用程式 (<ph name="UPDATED_APPS" />) 已更新。請重新啟動裝置以完成更新程序。</translation> <translation id="8492685019009920170">用手指輕觸指紋感應器。系統會妥善地將您的資料儲存在 <ph name="DEVICE_TYPE" /> 上,絕不會外洩。</translation> @@ -7976,6 +7976,7 @@ <translation id="8666759526542103597">關於基於瀏覽器的廣告個人化</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> 已顯示為全螢幕,並且停用了滑鼠游標。</translation> <translation id="8667760277771450375">我們正在探索方法,讓網站阻止垃圾廣告和欺詐行為,同時限制跨網站追蹤功能。</translation> +<translation id="8668378421690365723">裝置可能無法再正常運作,並可能會遇到安全性和效能問題。</translation> <translation id="8669284339312441707">暖色調</translation> <translation id="8670537393737592796">如要快速返回此處,請按一下安裝按鈕來安裝「<ph name="APP_NAME" />」</translation> <translation id="867085395664725367">伺服器暫時發生錯誤。</translation> @@ -8298,7 +8299,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{「<ph name="TAB_TITLE" />」}=1{「<ph name="TAB_TITLE" />」和另外 1 個標籤}other{「<ph name="TAB_TITLE" />」和另外 # 個標籤}}</translation> <translation id="8977811652087512276">密碼不正確或檔案損毀</translation> <translation id="8978154919215542464">開啟 - 同步所有內容</translation> -<translation id="8978670037548431647">重新整理網路共用功能</translation> +<translation id="8978670037548431647">重新整理網絡共享功能</translation> <translation id="897939795688207351">在 <ph name="ORIGIN" /> 上</translation> <translation id="8980345560318123814">意見反映報告</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - 已當機</translation> @@ -8459,6 +8460,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />為獲得最佳體驗,請將 <ph name="DEVICE_OS" /> 安裝至內置磁碟。您亦可稍後從登入畫面進行安裝。<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />如果現在還不想安裝,可透過 USB 執行並試用 CloudReady 2.0。此操作會保留您現有的作業系統和資料,但系統的儲存空間和效能可能受限。<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">在固定分頁中開啟</translation> +<translation id="9123287046453017203">您的裝置不是最新版本</translation> <translation id="9124003689441359348">已儲存的密碼將會在這裡顯示</translation> <translation id="9126149354162942022">游標顏色</translation> <translation id="9128317794749765148">無法完成設定</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index d2364fb9..b3a32c0 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -7958,6 +7958,7 @@ <translation id="8666759526542103597">關於以瀏覽器為主的廣告個人化</translation> <translation id="8667328578593601900"><ph name="FULLSCREEN_ORIGIN" /> 已顯示為全螢幕,並且停用了滑鼠游標。</translation> <translation id="8667760277771450375">我們正在開發限制跨網站追蹤的方法,同時讓網站能夠防範廣告垃圾內容和欺詐行為。</translation> +<translation id="8668378421690365723">裝置可能無法再正常運作,而且可能會有安全性和效能問題。</translation> <translation id="8669284339312441707">暖色調</translation> <translation id="8670537393737592796">如要快速返回此處,請點選安裝按鈕來安裝「<ph name="APP_NAME" />」</translation> <translation id="867085395664725367">伺服器發生暫時性錯誤。</translation> @@ -8441,6 +8442,7 @@ <translation id="9120693811286642342"><ph name="BEGIN_PARAGRAPH1" />為獲得最佳體驗,請將 <ph name="DEVICE_OS" /> 安裝至內部磁碟。你也可以之後再透過登入畫面安裝。<ph name="END_PARAGRAPH1" /> <ph name="BEGIN_PARAGRAPH2" />如果現在還不想安裝,可透過 USB 執行並試用此作業系統。這種做法可保留現有作業系統和資料,但儲存空間及效能可能會有所限制。<ph name="END_PARAGRAPH2" /></translation> <translation id="9121814364785106365">在固定分頁中開啟</translation> +<translation id="9123287046453017203">這部裝置不是最新版本</translation> <translation id="9124003689441359348">你所儲存的密碼會顯示在這裡</translation> <translation id="9126149354162942022">游標顏色</translation> <translation id="9128317794749765148">無法完成設定</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index 4745cc52..31b1380c 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -2214,6 +2214,7 @@ <translation id="3021065318976393105">Ngenkathi ikwibhethri</translation> <translation id="3021066826692793094">Umvemvane</translation> <translation id="3021678814754966447">&Buka umthombo wozimele</translation> +<translation id="3022361196600037287">I-<ph name="DEVICE" /> izosuswa kule Chromebook futhi ngeke ilondolozwe ku-<ph name="PRIMARY_EMAIL" />.</translation> <translation id="3022978424994383087">Awukuzwanga lokho.</translation> <translation id="3023464535986383522">Khetha ukuze ukhulume</translation> <translation id="3024374909719388945">Sebenzisa iwashi lamahora angu-24</translation> @@ -3752,6 +3753,7 @@ <translation id="4535127706710932914">Iphrofayela yokuzenzakalelayo</translation> <translation id="4535767533210902251">Inzwa yezigxivizo zeminwe ukhiye ophezulu osesandleni sangakwesokudla kukhibhodi yakho. Ithinte kancane nganoma imuphi umunwe.</translation> <translation id="4536140153723794651">Amasayithi angakwazi ukusebenzisa njalo amakhukhi</translation> +<translation id="4536769240747010177">Amandla Okusebenzisa Ifoni Njengemodemu:</translation> <translation id="4538417792467843292">Susa igama</translation> <translation id="4538792345715658285">Kufakwe ngenqubomgomo yebhizinisi.</translation> <translation id="4541123282641193691">Ayikwazanga ukuqinisekisa i-akhawunti yakho. Sicela uzame futhi noma uqalise kabusha i-Chromebook yakho.</translation> @@ -3779,6 +3781,7 @@ <translation id="4561893854334016293">Azikho izimvume ezishintshwe kamuva</translation> <translation id="4562155214028662640">Engeza izigxivizo zeminwe</translation> <translation id="4563210852471260509">Ulimi lokufaka lasekuqaleni Chinese</translation> +<translation id="4563382028841851106">Susa ku-akhawunti</translation> <translation id="4563880231729913339">Umunwe 3</translation> <translation id="4564245002465020751">Qedela ukusetha efonini yakho</translation> <translation id="4565377596337484307">Fihla iphasiwedi</translation> @@ -6212,6 +6215,10 @@ <translation id="6943939122536910181">Inqanyuliwe ku-<ph name="DEVICE" /></translation> <translation id="6945221475159498467">Khetha</translation> <translation id="694592694773692225">Ukuqondiswa kabusha kuvinjiwe kuleli khasi.</translation> +<translation id="6947015141909171112">Ubona amarisiphu ngokusekelwe emsebenzini wakho wakamuva Wokusesha wamarisiphu. + <ph name="BREAK" /> + <ph name="BREAK" /> + Ungaphatha amasethingi kusukela kumenyu yekhadi noma ubone izinketho eziningi ku-Yenza i-Chrome ngendlela oyifisayo.</translation> <translation id="6949434160682548041">Iphasiwedi (kuyakhetheka)</translation> <translation id="6950627417367801484">Buyisa izinhlelo zokusebenza</translation> <translation id="6952242901357037157">Ungakwazi nokubonisa amaphasiwedi avela ku-<ph name="BEGIN_LINK" />Akhawunti yakho ye-Google<ph name="END_LINK" /> lapha</translation> @@ -7008,6 +7015,7 @@ <translation id="7737115349420013392">Imatanisa ne-"<ph name="DEVICE_NAME" />" ...</translation> <translation id="7737846262459425222">Ungashintsha lokhu noma kunini kokuthi Amasethingi > Umsizi we-Google > Okuqukethwe kwesikrini.</translation> <translation id="7737948071472253612">Ayivumelekile ukusebenzisa ikhamera yakho</translation> +<translation id="77381465218432215">Bonisa izimpawu zokuphimisela nezinhlamvu ezikhethekile</translation> <translation id="7740996059027112821">Okujwayelekile</translation> <translation id="7741307896921365578">Inika amandla iphaneli eseceleni esezingeni lesiphequluli ngendlela ewusizo nephikelelayo yokufinyelela Kuhlu lwakho Lokufunda Namabhukhimakhi.</translation> <translation id="7742558784808143689">Sula idatha yesayithi nezimvume ze-<ph name="SITE_NAME" />, wonke amasayithi angaphansi kwayo, nama-app afakiwe?</translation> @@ -7797,6 +7805,7 @@ <translation id="8486666913807228950">Isizathu: Isimiso esiphenduliwe esithi <ph name="REVERT_RULE" /> sitholwe ohlwini oluthi "Vula ngempoqo kokuthi".</translation> <translation id="848666842773560761">I-App izama ukufinyelela kukhamera. Vala iswishi yekhamera yobumfihlo ukuze uvumele ukufinyelela.</translation> <translation id="8487678622945914333">Sondeza isithombe</translation> +<translation id="8487699605742506766">I-Hotspot</translation> <translation id="8489156414266187072">Iziphakamiso zomuntu siqu ziboniswa ku-akhawunti yakho kuphela</translation> <translation id="8490896350101740396">Izinhlelo zokusebenza ezilandelayo ze-kiosk ze-"<ph name="UPDATED_APPS" />" zibuyekeziwe. Sicela uqalise idivayisi ukuze uqedelele inqubo yokubuyekeza.</translation> <translation id="8492685019009920170">Thinta inzwa yezigxivizo zeminwe ngomunwe wakho. Idatha yakho igcinwe ngokuvikelekile futhi ayilokothi ishiye i-<ph name="DEVICE_TYPE" /> yakho.</translation> @@ -8294,6 +8303,7 @@ <translation id="8975562453115131273">{NUM_OTHER_TABS,plural, =0{I-"<ph name="TAB_TITLE" />"}=1{I-"<ph name="TAB_TITLE" />" nenye ithebhu engu-1}one{I-"<ph name="TAB_TITLE" />" namanye amathebhu angu-#}other{I-"<ph name="TAB_TITLE" />" namanye amathebhu angu-#}}</translation> <translation id="8977811652087512276">Iphasiwedi engalungile noma ifayela elimoshekile</translation> <translation id="8978154919215542464">Kuvuliwe - vumelanisa yonke into</translation> +<translation id="8978670037548431647">Vuselela Amandla Okusebenzisa Ifoni Njengemodemu</translation> <translation id="897939795688207351">Ku-<ph name="ORIGIN" /></translation> <translation id="8980345560318123814">Imibiko yempendulo</translation> <translation id="8980951173413349704"><ph name="WINDOW_TITLE" /> - Ikhubazekile</translation> @@ -8559,6 +8569,7 @@ <translation id="935854577147268200">Ifoni ye-Smart Lock ishintshiwe. Faka iphasiwedi yakho ukuze ubuyekeze i-Smart Lock. Ngesikhathi esilandelayo, ifoni yakho izovula i-<ph name="DEVICE_TYPE" /> yakho. Ungavala i-Smart Lock kuzilungiselelo</translation> <translation id="936646668635477464">Ikhamera nemakrofoni</translation> <translation id="936801553271523408">Idatha yokuxilonga yesistimu</translation> +<translation id="937053962468712792">Susa i-<ph name="DEVICE" /> ku-<ph name="PRIMARY_EMAIL" />?</translation> <translation id="93766956588638423">Lungisa isandiso</translation> <translation id="938568644810664664">Zama “Ok Google, iyiphi le ngoma" noma “Ok Google, yini ekusikrini sami?"</translation> <translation id="938623846785894166">Ifayela elingajwayelekile</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index 824a3bbec..e5822d66 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -160,7 +160,7 @@ <translation id="4053720452172726777">Google Chromeను అనుకూలంగా మార్చండి మరియు నియంత్రించండి</translation> <translation id="4106587138345390261">Chrome మీ సమాచారాన్ని తక్కువగా ఉపయోగిస్తూ అదే బ్రౌజింగ్ అనుభవాన్ని అందించడానికి సైట్లను అనుమతించే కొత్త ఫీచర్ల కోసం అన్వేషిస్తోంది</translation> <translation id="4110895483821904099">మీ కొత్త Chrome ప్రొఫైల్ని సెట్ అప్ చేయండి</translation> -<translation id="4147555960264124640">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Google Chrome ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chrome డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. <ph name="LEARN_MORE" /></translation> +<translation id="4147555960264124640">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Google Chrome ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chrome డేటా శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు. కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. <ph name="LEARN_MORE" /></translation> <translation id="4148957013307229264">వ్యవస్థాపిస్తోంది...</translation> <translation id="4149882025268051530">ఆర్కైవ్ను విస్తరించడంలో ఇన్స్టాలర్ విఫలమైంది. దయచేసి Google Chromeను మళ్లీ డౌన్లోడ్ చేయండి.</translation> <translation id="4191857738314598978">{0,plural, =1{ఒక రోజులోపు Chromeను తిరిగి ప్రారంభించండి}other{# రోజులలోపు Chromeను తిరిగి ప్రారంభించండి}}</translation> @@ -182,7 +182,7 @@ <translation id="4458462641685292929">Google Chromeలో మరొక వ్యవస్థాపన జరుగుతోంది. దయచేసి తర్వాత మళ్లీ ప్రయత్నించండి.</translation> <translation id="4459234553906210702">మీరు సందర్శించే సైట్లను Chrome నుండి సమాచారాన్ని రిక్వెస్ట్ చేసేలా 'యాడ్ల అంచనా' అనుమతిస్తుంది, ఇది యాడ్ల పనితీరును అంచనా వేయడంలో సైట్కు సహాయపడుతుంది. 'యాడ్ల అంచనా', సైట్ల మధ్య వీలయినంత తక్కువ సమాచారాన్ని బదిలీ చేసి, క్రాస్-సైట్ ట్రాకింగ్ను తగ్గిస్తుంది.</translation> <translation id="4561051373932531560">మీరు Google Chrome వెబ్లో ఫోన్ నంబర్ క్లిక్ చేసేలా అవకాశం ఇస్తుంది మరియు Skypeతో కాల్ చేస్తుంది!</translation> -<translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేశారు. ఇప్పుడు మీరు సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్మార్క్లు, చరిత్ర మరియు ఇతర సెట్టింగ్లను యాక్సెస్ చేయవచ్చు.</translation> +<translation id="4567424176335768812">మీరు <ph name="USER_EMAIL_ADDRESS" />గా సైన్ ఇన్ చేశారు. ఇప్పుడు మీరు సైన్ ఇన్ చేసిన అన్ని పరికరాల్లో మీ బుక్మార్క్లు, హిస్టరీ మరియు ఇతర సెట్టింగ్లను యాక్సెస్ చేయవచ్చు.</translation> <translation id="4571503333518166079">Chrome నోటిఫికేషన్ సెట్టింగ్లలోకి వెళ్లు</translation> <translation id="459622048091363950">ఓసారి Chromeకి యాక్సెస్ లభించాక, ఆపై వెబ్సైట్లకు ఏమైనా యాక్సెస్ కావాలంటే అవి మిమ్మల్ని అడగవచ్చు.</translation> <translation id="4600710005438004015">Chromeను తాజా వెర్షన్కు అప్డేట్ చేయడం సాధ్యం కాలేదు, కాబట్టి మీరు కొత్త ఫీచర్లు మరియు భద్రతా పరిష్కారాలను పొందలేరు.</translation> @@ -213,7 +213,7 @@ <translation id="5163087008893166964">Chromeకు స్వాగతం; కొత్త బ్రౌజర్ విండో తెరవబడింది</translation> <translation id="5170938038195470297">మీ ప్రొఫైల్ను ఉపయోగించడం సాధ్యపడదు, ఎందుకంటే ఇది ఒక కొత్త Google Chrome వెర్షన్ నుండి తీసుకోబడింది. కొన్ని ఫీచర్లు అందుబాటులో ఉండకపోవచ్చు. దయచేసి వేరొక ప్రొఫైల్ డైరెక్టరీని పేర్కొనండి లేదా Chrome కొత్త వెర్షన్ను ఉపయోగించండి.</translation> <translation id="521447420733633466">మీరు పరికరాన్ని షేర్ చేస్తే, ఫ్రెండ్స్, ఫ్యామిలీ విడివిడిగా బ్రౌజ్ చేయవచ్చు, Chromeను వారికి నచ్చిన విధంగా సెటప్ చేసుకోవచ్చు</translation> -<translation id="5251420635869119124">అతిథులు ఎటువంటి చరిత్రను వదలకుండానే Chromeను ఉపయోగించవచ్చు.</translation> +<translation id="5251420635869119124">అతిథులు ఎటువంటి హిస్టరీని వదలకుండానే Chromeను ఉపయోగించవచ్చు.</translation> <translation id="5334309298019785904">మీ డొమైన్ కోసం సింక్ అందుబాటులో లేనందున ChromeOS మీ డేటాను సింక్ చేయలేకపోయింది.</translation> <translation id="5334487786912937552">ఫైళ్లను డౌన్లోడ్ చేయడానికి Chromeకు స్టోరేజ్ యాక్సెస్కు సంబంధించిన అనుమతి అవసరం</translation> <translation id="5337648990166757586">ఆప్షనల్: Googleకు సమస్య విశ్లేషణ, అలాగే వినియోగ డేటాను ఆటోమేటిక్గా పంపడం ద్వారా ChromeOS ఫీచర్లు, ఇంకా పనితీరును మెరుగుపరచడంలో సహాయపడండి.</translation> @@ -293,7 +293,7 @@ <translation id="7155997830309522122">అలా అయితే, Chromeలో సేవ్ అయిన మీ పాస్వర్డ్ ను దయచేసి ఎడిట్ చేయండి, అప్పుడు అది మీ కొత్త పాస్వర్డ్తో మ్యాచ్ అవుతుంది.</translation> <translation id="7161904924553537242">Google Chromeకు స్వాగతం</translation> <translation id="7177959540995930968">మీరు ఈ ఫీచర్ల గురించి Chrome సెట్టింగ్లలో మరింత తెలుసుకోవచ్చు.</translation> -<translation id="7242029209006116544">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Google Chrome ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chrome డేటా, శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు, కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. మీరు ప్రస్తుతం ఉన్న మీ Chrome డేటాను వేరుగా ఉంచడానికి ఐచ్ఛికంగా కొత్త ప్రొఫైల్ను సృష్టించవచ్చు. <ph name="LEARN_MORE" /></translation> +<translation id="7242029209006116544">మీరు నిర్వహించబడే ఖాతాతో సైన్ ఇన్ చేస్తున్నారు. దీని నిర్వాహకునికి మీ Google Chrome ప్రొఫైల్పై నియంత్రణను అందిస్తున్నారు. మీ యాప్లు, బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్ల వంటి మీ Chrome డేటా, శాశ్వతంగా <ph name="USER_NAME" />కు అనుబంధించబడుతుంది. మీరు Google ఖాతాల డ్యాష్బోర్డ్ ద్వారా ఈ డేటాను తొలగించవచ్చు, కానీ ఈ డేటాను మరో ఖాతాతో అనుబంధించలేరు. మీరు ప్రస్తుతం ఉన్న మీ Chrome డేటాను వేరుగా ఉంచడానికి ఐచ్ఛికంగా కొత్త ప్రొఫైల్ను సృష్టించవచ్చు. <ph name="LEARN_MORE" /></translation> <translation id="7295052994004373688">Google Chrome UIను చూపడానికి ఈ భాష ఉపయోగించబడింది</translation> <translation id="7296210096911315575">ముఖ్యమైన వినియోగ, భద్రతా సమాచారం</translation> <translation id="7308322188646931570">ఫైళ్లను డౌన్లోడ్ చేయడానికి Chromeకు నిల్వ యాక్సెస్ అవసరం</translation>
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 072b536..4d2d74b 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2226,7 +2226,6 @@ "//components/reporting/storage:storage_uploader_interface", "//components/reporting/storage_selector", "//components/reporting/util:backoff_settings", - "//components/reporting/util:shared_queue", "//components/reporting/util:status", "//components/reporting/util:status_macros", "//components/reporting/util:status_proto", @@ -5197,6 +5196,7 @@ "//chromeos/ash/components/dbus/userdataauth:userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", "//chromeos/ash/components/feature_usage", + "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/local_search_service", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/local_search_service/public/mojom", @@ -5523,6 +5523,8 @@ "lacros/snap_controller_lacros.h", "lacros/standalone_browser_test_controller.cc", "lacros/standalone_browser_test_controller.h", + "lacros/sync/sync_crosapi_manager_lacros.cc", + "lacros/sync/sync_crosapi_manager_lacros.h", "lacros/sync/sync_explicit_passphrase_client_lacros.cc", "lacros/sync/sync_explicit_passphrase_client_lacros.h", "lacros/sync/sync_user_settings_client_lacros.cc", @@ -7325,8 +7327,7 @@ ] } - # TODO(crbug.com/1306610): Split out files that only need `enable_plugins`. - if (enable_ppapi) { + if (enable_plugins) { sources += [ "plugins/chrome_content_browser_client_plugins_part.cc", "plugins/chrome_content_browser_client_plugins_part.h", @@ -7358,16 +7359,23 @@ "plugins/plugin_utils.h", "plugins/reload_plugin_infobar_delegate.cc", "plugins/reload_plugin_infobar_delegate.h", + ] + deps += [ + "//media:media_buildflags", + "//services/network/public/mojom", + ] + } + + if (enable_ppapi) { + sources += [ "renderer_host/pepper/chrome_browser_pepper_host_factory.cc", "renderer_host/pepper/chrome_browser_pepper_host_factory.h", "renderer_host/pepper/pepper_isolated_file_system_message_filter.cc", "renderer_host/pepper/pepper_isolated_file_system_message_filter.h", ] deps += [ - "//media:media_buildflags", "//ppapi/host", "//ppapi/proxy:ipc", - "//services/network/public/mojom", ] if (is_chromeos_ash) { deps += [ "//ash/components/cryptohome" ]
diff --git a/chrome/browser/android/compositor/layer/tab_handle_layer.cc b/chrome/browser/android/compositor/layer/tab_handle_layer.cc index 6184b5eae..9417f12 100644 --- a/chrome/browser/android/compositor/layer/tab_handle_layer.cc +++ b/chrome/browser/android/compositor/layer/tab_handle_layer.cc
@@ -19,10 +19,6 @@ namespace android { -const char TAB_WIDTH_SMALL[] = "108"; -const char TAB_WIDTH_MEDIUM[] = "156"; -const char TAB_STRIP_IMPROVEMENTS_FEATURE_PARAMETER[] = "min_tab_width"; - // static scoped_refptr<TabHandleLayer> TabHandleLayer::Create( LayerTitleCache* layer_title_cache) { @@ -140,13 +136,9 @@ // For the min_tab_width experiments, if close button is not shown, fill // the remaining space with the title text if (base::FeatureList::IsEnabled(chrome::android::kTabStripImprovements)) { - std::string tab_width_param = base::GetFieldTrialParamValueByFeature( - chrome::android::kTabStripImprovements, - TAB_STRIP_IMPROVEMENTS_FEATURE_PARAMETER); - bool is_tab_width_experiment = (tab_width_param == TAB_WIDTH_SMALL || - tab_width_param == TAB_WIDTH_MEDIUM); - if (is_tab_width_experiment && close_button_alpha == 0.f) + if (close_button_alpha == 0.f) { close_width = 0.f; + } } if (title_layer) {
diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc index 27870f8..b273d21 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc +++ b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.cc
@@ -328,6 +328,7 @@ jfloat close_button_alpha, jboolean is_loading, jfloat spinner_rotation, + jfloat brightness, const JavaParamRef<jobject>& jlayer_title_cache, const JavaParamRef<jobject>& jresource_manager) { LayerTitleCache* layer_title_cache = @@ -348,7 +349,7 @@ tab_handle_outline_resource, foreground, close_pressed, toolbar_width, x, y, width, height, content_offset_x, close_button_alpha, is_loading, spinner_rotation, - background_tab_brightness_); + brightness); } scoped_refptr<TabHandleLayer> TabStripSceneLayer::GetNextLayer(
diff --git a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h index d99a882..3b36b91a 100644 --- a/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h +++ b/chrome/browser/android/compositor/scene_layer/tab_strip_scene_layer.h
@@ -127,6 +127,7 @@ jfloat close_button_alpha, jboolean is_loading, jfloat spinner_rotation, + jfloat brightness, const base::android::JavaParamRef<jobject>& jlayer_title_cache, const base::android::JavaParamRef<jobject>& jresource_manager);
diff --git a/chrome/browser/apps/app_service/app_icon/app_icon_source.cc b/chrome/browser/apps/app_service/app_icon/app_icon_source.cc index 9e02b1fd..09de796a 100644 --- a/chrome/browser/apps/app_service/app_icon/app_icon_source.cc +++ b/chrome/browser/apps/app_service/app_icon/app_icon_source.cc
@@ -87,7 +87,7 @@ if (query_position != std::string::npos) size_param = size_param.substr(0, query_position); int size_in_dip = 0; - if (!base::StringToInt(size_param, &size_in_dip)) { + if (!base::StringToInt(size_param, &size_in_dip) || size_in_dip < 1) { LoadDefaultImage(std::move(callback)); return; }
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index 8d58dd16..9c65e52 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -1598,6 +1598,7 @@ "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", "//chromeos/ash/components/feature_usage", + "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/memory", "//chromeos/ash/components/network", "//chromeos/ash/components/network/portal_detector",
diff --git a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc index e42eb7c..b566e7c 100644 --- a/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc +++ b/chrome/browser/ash/accessibility/spoken_feedback_browsertest.cc
@@ -1755,6 +1755,18 @@ sm_.ExpectSpeechPattern("Desk 1"); sm_.ExpectSpeech("Edit text"); + // Reverse tab to focus back on the template card. + sm_.Call([this]() { SendKeyPressWithShift(ui::VKEY_TAB); }); + + // Trigger a delete template dialog by pressing Ctrl+W. + sm_.Call([this]() { SendKeyPressWithControl(ui::VKEY_W); }); + sm_.ExpectSpeech("Delete template?"); + sm_.ExpectSpeech("Dialog"); + sm_.ExpectSpeech("Delete"); + sm_.ExpectSpeech("default"); + sm_.ExpectSpeech("Button"); + sm_.ExpectSpeech("Press Search plus Space to activate"); + sm_.Replay(); }
diff --git a/chrome/browser/ash/app_mode/kiosk_app_manager.h b/chrome/browser/ash/app_mode/kiosk_app_manager.h index c0368cc..d40e4849 100644 --- a/chrome/browser/ash/app_mode/kiosk_app_manager.h +++ b/chrome/browser/ash/app_mode/kiosk_app_manager.h
@@ -10,7 +10,6 @@ #include <string> #include <vector> -#include "ash/components/tpm/install_attributes.h" #include "base/callback_forward.h" #include "base/no_destructor.h" #include "base/time/time.h" @@ -20,6 +19,7 @@ #include "chrome/browser/chromeos/app_mode/chrome_kiosk_external_loader_broker.h" #include "chrome/browser/chromeos/extensions/external_cache.h" #include "chrome/browser/chromeos/extensions/external_cache_delegate.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/crosapi/mojom/chrome_app_kiosk_service.mojom.h" #include "components/account_id/account_id.h" #include "components/pref_registry/pref_registry_syncable.h"
diff --git a/chrome/browser/ash/arc/arc_util_unittest.cc b/chrome/browser/ash/arc/arc_util_unittest.cc index b6b3ef4..3c804e6 100644 --- a/chrome/browser/ash/arc/arc_util_unittest.cc +++ b/chrome/browser/ash/arc/arc_util_unittest.cc
@@ -8,7 +8,6 @@ #include "ash/components/arc/arc_features.h" #include "ash/components/arc/arc_prefs.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/command_line.h" #include "base/system/sys_info.h" @@ -33,6 +32,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "chromeos/ash/components/dbus/concierge/concierge_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/arc/auth/arc_active_directory_enrollment_token_fetcher.cc b/chrome/browser/ash/arc/auth/arc_active_directory_enrollment_token_fetcher.cc index 843ba009..793524f 100644 --- a/chrome/browser/ash/arc/auth/arc_active_directory_enrollment_token_fetcher.cc +++ b/chrome/browser/ash/arc/auth/arc_active_directory_enrollment_token_fetcher.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/logging.h" #include "chrome/browser/ash/arc/arc_optin_uma.h" @@ -16,6 +15,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/net/system_network_context_manager.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/cloud/dm_auth.h" #include "components/policy/core/common/cloud/dmserver_job_configurations.h"
diff --git a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc index e1b72de5..6c75c66 100644 --- a/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc +++ b/chrome/browser/ash/arc/nearby_share/nearby_share_session_impl.cc
@@ -72,8 +72,8 @@ } } -void DoDeleteShareCacheFilePaths(base::FilePath profile_path, - base::FilePath user_cache_file_path) { +void DoDeleteShareCacheFilePaths(const base::FilePath& profile_path, + const base::FilePath& user_cache_file_path) { // Up until M99, shared files were stored in <user_cache_dir>/.NearbyShare. // We should remove this obsolete directory path if it is still present. base::FilePath cache_base_path; @@ -86,7 +86,7 @@ // Calculate the amount of disk space, in bytes, needed in |share_dir| to // stream |total_file_size| bytes from Android to the Chrome OS file system. -static int64_t CalculateRequiredSpace(const base::FilePath share_dir, +static int64_t CalculateRequiredSpace(const base::FilePath& share_dir, const uint64_t total_file_size) { DVLOG(1) << __func__; int64_t free_disk_space = base::SysInfo::AmountOfFreeDiskSpace(share_dir);
diff --git a/chrome/browser/ash/attestation/tpm_challenge_key_subtle.cc b/chrome/browser/ash/attestation/tpm_challenge_key_subtle.cc index 2cc591dd..d9f1d48 100644 --- a/chrome/browser/ash/attestation/tpm_challenge_key_subtle.cc +++ b/chrome/browser/ash/attestation/tpm_challenge_key_subtle.cc
@@ -7,7 +7,6 @@ #include "ash/components/attestation/attestation_flow_adaptive.h" #include "ash/components/cryptohome/cryptohome_parameters.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "base/base64.h" #include "base/bind.h" #include "base/check_op.h" @@ -29,6 +28,7 @@ #include "chrome/common/pref_names.h" #include "chromeos/ash/components/dbus/attestation/attestation_client.h" #include "chromeos/ash/components/dbus/attestation/interface.pb.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/constants/attestation_constants.h" #include "chromeos/dbus/tpm_manager/tpm_manager.pb.h" #include "chromeos/dbus/tpm_manager/tpm_manager_client.h"
diff --git a/chrome/browser/ash/authpolicy/authpolicy_helper.cc b/chrome/browser/ash/authpolicy/authpolicy_helper.cc index af2235c..12b8aa5 100644 --- a/chrome/browser/ash/authpolicy/authpolicy_helper.cc +++ b/chrome/browser/ash/authpolicy/authpolicy_helper.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/authpolicy/authpolicy_helper.h" -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/logging.h" @@ -14,6 +13,7 @@ #include "chrome/browser/ash/authpolicy/data_pipe_utils.h" #include "chromeos/ash/components/dbus/authpolicy/authpolicy_client.h" #include "chromeos/ash/components/dbus/upstart/upstart_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/account_id/account_id.h" #include "crypto/encryptor.h"
diff --git a/chrome/browser/ash/authpolicy/authpolicy_helper_unittest.cc b/chrome/browser/ash/authpolicy/authpolicy_helper_unittest.cc index 2ecbb982..3e9f96d1 100644 --- a/chrome/browser/ash/authpolicy/authpolicy_helper_unittest.cc +++ b/chrome/browser/ash/authpolicy/authpolicy_helper_unittest.cc
@@ -4,10 +4,10 @@ #include "chrome/browser/ash/authpolicy/authpolicy_helper.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_install_attributes_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ash/borealis/borealis_features.cc b/chrome/browser/ash/borealis/borealis_features.cc index 3b2a62e..bcfa3906 100644 --- a/chrome/browser/ash/borealis/borealis_features.cc +++ b/chrome/browser/ash/borealis/borealis_features.cc
@@ -8,7 +8,6 @@ #include <string> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "base/callback.h" #include "base/location.h" @@ -26,6 +25,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/common/channel_info.h" #include "chrome/common/chrome_features.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/prefs/pref_service.h" #include "components/version_info/channel.h"
diff --git a/chrome/browser/ash/chrome_browser_main_parts_ash.cc b/chrome/browser/ash/chrome_browser_main_parts_ash.cc index dfbf776..07594d0 100644 --- a/chrome/browser/ash/chrome_browser_main_parts_ash.cc +++ b/chrome/browser/ash/chrome_browser_main_parts_ash.cc
@@ -26,7 +26,6 @@ #include "ash/components/peripheral_notification/peripheral_notification_manager.h" #include "ash/components/power/dark_resume_controller.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/components/tpm/tpm_token_loader.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" @@ -204,6 +203,7 @@ #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/local_search_service/public/cpp/local_search_service_proxy_factory.h" #include "chromeos/ash/components/network/fast_transition_observer.h" #include "chromeos/ash/components/network/network_cert_loader.h"
diff --git a/chrome/browser/ash/crosapi/BUILD.gn b/chrome/browser/ash/crosapi/BUILD.gn index 12ab2a6..4a45e46 100644 --- a/chrome/browser/ash/crosapi/BUILD.gn +++ b/chrome/browser/ash/crosapi/BUILD.gn
@@ -271,6 +271,7 @@ "//chromeos/ash/components/dbus/update_engine", "//chromeos/ash/components/dbus/upstart", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", + "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/network", "//chromeos/components/cdm_factory_daemon:cdm_factory_daemon_browser", "//chromeos/components/quick_answers/public/cpp:prefs",
diff --git a/chrome/browser/ash/crosapi/crosapi_util.cc b/chrome/browser/ash/crosapi/crosapi_util.cc index b52f4f99..933b142 100644 --- a/chrome/browser/ash/crosapi/crosapi_util.cc +++ b/chrome/browser/ash/crosapi/crosapi_util.cc
@@ -8,7 +8,6 @@ #include "ash/components/arc/arc_util.h" #include "ash/components/settings/cros_settings_provider.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" @@ -33,6 +32,7 @@ #include "chrome/browser/speech/tts_crosapi_util.h" #include "chrome/browser/ui/webui/chrome_web_ui_controller_factory.h" #include "chrome/browser/web_applications/web_app_utils.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/components/cdm_factory_daemon/mojom/browser_cdm_factory.mojom.h" #include "chromeos/components/remote_apps/mojom/remote_apps.mojom.h" #include "chromeos/components/sensors/mojom/cros_sensor_service.mojom.h"
diff --git a/chrome/browser/ash/crosapi/environment_provider.cc b/chrome/browser/ash/crosapi/environment_provider.cc index df1a936..00f3534 100644 --- a/chrome/browser/ash/crosapi/environment_provider.cc +++ b/chrome/browser/ash/crosapi/environment_provider.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/crosapi/environment_provider.h" -#include "ash/components/tpm/install_attributes.h" #include "base/files/file_util.h" #include "base/path_service.h" #include "base/system/sys_info.h" @@ -15,6 +14,7 @@ #include "chrome/browser/profiles/profiles_state.h" #include "chrome/browser/web_applications/preinstalled_web_app_config_utils.h" #include "chromeos/ash/components/dbus/cros_disks/cros_disks_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/crosapi/mojom/crosapi.mojom.h" #include "chromeos/crosapi/mojom/policy_namespace.mojom.h" #include "components/account_id/account_id.h"
diff --git a/chrome/browser/ash/crostini/crostini_port_forwarder.cc b/chrome/browser/ash/crostini/crostini_port_forwarder.cc index 4942fb7..076e135 100644 --- a/chrome/browser/ash/crostini/crostini_port_forwarder.cc +++ b/chrome/browser/ash/crostini/crostini_port_forwarder.cc
@@ -92,17 +92,15 @@ const std::string& label) { PrefService* pref_service = profile_->GetPrefs(); ListPrefUpdate update(pref_service, crostini::prefs::kCrostiniPortForwarding); - base::Value* all_ports = update.Get(); - base::Value new_port_metadata(base::Value::Type::DICTIONARY); - new_port_metadata.SetIntKey(kPortNumberKey, key.port_number); - new_port_metadata.SetIntKey(kPortProtocolKey, - static_cast<int>(key.protocol_type)); - new_port_metadata.SetStringKey(kPortLabelKey, label); - new_port_metadata.SetStringKey(guest_os::prefs::kVmNameKey, - key.container_id.vm_name); - new_port_metadata.SetStringKey(guest_os::prefs::kContainerNameKey, - key.container_id.container_name); - all_ports->Append(std::move(new_port_metadata)); + base::Value::List& all_ports = update.Get()->GetList(); + base::Value::Dict new_port_metadata; + new_port_metadata.Set(kPortNumberKey, key.port_number); + new_port_metadata.Set(kPortProtocolKey, static_cast<int>(key.protocol_type)); + new_port_metadata.Set(kPortLabelKey, label); + new_port_metadata.Set(guest_os::prefs::kVmNameKey, key.container_id.vm_name); + new_port_metadata.Set(guest_os::prefs::kContainerNameKey, + key.container_id.container_name); + all_ports.Append(std::move(new_port_metadata)); } bool CrostiniPortForwarder::RemovePortPreference(const PortRuleKey& key) { @@ -363,8 +361,8 @@ DeactivateAllActivePorts(container_id); } -base::ListValue CrostiniPortForwarder::GetActivePorts() { - base::ListValue forwarded_ports_list; +base::Value::List CrostiniPortForwarder::GetActivePorts() { + base::Value::List forwarded_ports_list; for (const auto& port : forwarded_ports_) { base::Value::Dict port_info; port_info.Set(kPortNumberKey, port.first.port_number);
diff --git a/chrome/browser/ash/crostini/crostini_port_forwarder.h b/chrome/browser/ash/crostini/crostini_port_forwarder.h index 3129c61..9f969bf 100644 --- a/chrome/browser/ash/crostini/crostini_port_forwarder.h +++ b/chrome/browser/ash/crostini/crostini_port_forwarder.h
@@ -34,7 +34,7 @@ class Observer : public base::CheckedObserver { public: // Called when a port's active state changes. - virtual void OnActivePortsChanged(const base::ListValue& activePorts) = 0; + virtual void OnActivePortsChanged(const base::Value::List& activePorts) = 0; }; enum class Protocol { @@ -104,7 +104,7 @@ // re-forwarded on re-startup. This is called on container shutdown. void DeactivateAllActivePorts(const guest_os::GuestId& container_id); - base::ListValue GetActivePorts(); + base::Value::List GetActivePorts(); size_t GetNumberOfForwardedPortsForTesting(); absl::optional<base::Value> ReadPortPreferenceForTesting(
diff --git a/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc b/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc index 994b0f9..6b51ac8 100644 --- a/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc +++ b/chrome/browser/ash/crostini/crostini_port_forwarder_unittest.cc
@@ -80,7 +80,7 @@ public: MOCK_METHOD(void, OnActivePortsChanged, - (const base::ListValue& activePorts), + (const base::Value::List& activePorts), (override)); }; @@ -127,11 +127,13 @@ return; } EXPECT_EQ(key.port_number, - pref.value().FindIntKey(crostini::kPortNumberKey).value()); - EXPECT_EQ(static_cast<int>(key.protocol_type), - pref.value().FindIntKey(crostini::kPortProtocolKey).value()); + pref.value().GetDict().FindInt(crostini::kPortNumberKey).value()); + EXPECT_EQ( + static_cast<int>(key.protocol_type), + pref.value().GetDict().FindInt(crostini::kPortProtocolKey).value()); EXPECT_EQ(key.container_id, guest_os::GuestId(pref.value())); - EXPECT_EQ(label, *pref.value().FindStringKey(crostini::kPortLabelKey)); + EXPECT_EQ(label, + *pref.value().GetDict().FindString(crostini::kPortLabelKey)); } void MakePortExistenceExpectation(CrostiniPortForwarder::PortRuleKey port, @@ -517,16 +519,16 @@ 3U); // Get active ports. - base::ListValue forwarded_ports = crostini_port_forwarder_->GetActivePorts(); - EXPECT_EQ(forwarded_ports.GetListDeprecated().size(), ports_to_add.size()); + base::Value::List forwarded_ports = + crostini_port_forwarder_->GetActivePorts(); + EXPECT_EQ(forwarded_ports.size(), ports_to_add.size()); for (unsigned int i = 0; i < ports_to_add.size(); i++) { unsigned int reverse_index = ports_to_add.size() - i - 1; - EXPECT_EQ(*(forwarded_ports.GetListDeprecated()[i].FindPath("port_number")), + EXPECT_EQ(*(forwarded_ports[i].GetDict().Find("port_number")), base::Value(ports_to_add.at(reverse_index).port_number)); - EXPECT_EQ( - *(forwarded_ports.GetListDeprecated()[i].FindPath("protocol_type")), - base::Value( - static_cast<int>(ports_to_add.at(reverse_index).protocol_type))); + EXPECT_EQ(*(forwarded_ports[i].GetDict().Find("protocol_type")), + base::Value(static_cast<int>( + ports_to_add.at(reverse_index).protocol_type))); } }
diff --git a/chrome/browser/ash/dbus/ash_dbus_helper.cc b/chrome/browser/ash/dbus/ash_dbus_helper.cc index e4db42d..ba2053be 100644 --- a/chrome/browser/ash/dbus/ash_dbus_helper.cc +++ b/chrome/browser/ash/dbus/ash_dbus_helper.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/ash/dbus/ash_dbus_helper.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_paths.h" #include "ash/webui/shimless_rma/shimless_rma.h" @@ -75,6 +74,7 @@ #include "chromeos/ash/components/dbus/virtual_file_provider/virtual_file_provider_client.h" #include "chromeos/ash/components/dbus/vm_plugin_dispatcher/vm_plugin_dispatcher_client.h" #include "chromeos/ash/components/hibernate/buildflags.h" // ENABLE_HIBERNATE +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/constants/dbus_paths.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/dlcservice/dlcservice_client.h"
diff --git a/chrome/browser/ash/dbus/chrome_features_service_provider.cc b/chrome/browser/ash/dbus/chrome_features_service_provider.cc index a971c4a..d79a88c 100644 --- a/chrome/browser/ash/dbus/chrome_features_service_provider.cc +++ b/chrome/browser/ash/dbus/chrome_features_service_provider.cc
@@ -12,7 +12,6 @@ #include "ash/components/arc/arc_features.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "base/bind.h" @@ -26,6 +25,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/chrome_features.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/prefs/pref_service.h" #include "dbus/bus.h" #include "dbus/message.h"
diff --git a/chrome/browser/ash/dbus/proxy_resolution_service_provider_unittest.cc b/chrome/browser/ash/dbus/proxy_resolution_service_provider_unittest.cc index 444a279..71cc26b 100644 --- a/chrome/browser/ash/dbus/proxy_resolution_service_provider_unittest.cc +++ b/chrome/browser/ash/dbus/proxy_resolution_service_provider_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" @@ -15,6 +14,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/services/service_provider_test_helper.h" #include "chromeos/ash/components/dbus/system_proxy/system_proxy_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "dbus/message.h" #include "dbus/object_path.h"
diff --git a/chrome/browser/ash/first_party_sets/OWNERS b/chrome/browser/ash/first_party_sets/OWNERS new file mode 100644 index 0000000..001f481 --- /dev/null +++ b/chrome/browser/ash/first_party_sets/OWNERS
@@ -0,0 +1 @@ +file://chrome/browser/first_party_sets/OWNERS
diff --git a/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc b/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc new file mode 100644 index 0000000..dc835939 --- /dev/null +++ b/chrome/browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc
@@ -0,0 +1,194 @@ +// 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 "ash/constants/ash_switches.h" +#include "base/json/json_reader.h" +#include "base/run_loop.h" +#include "base/test/bind.h" +#include "base/values.h" +#include "chrome/browser/ash/login/login_manager_test.h" +#include "chrome/browser/ash/login/test/login_manager_mixin.h" +#include "chrome/browser/first_party_sets/first_party_sets_policy_service.h" +#include "chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h" +#include "chrome/browser/first_party_sets/first_party_sets_pref_names.h" +#include "chrome/browser/profiles/profile.h" +#include "components/account_id/account_id.h" +#include "components/keyed_service/core/keyed_service.h" +#include "components/policy/core/browser/browser_policy_connector.h" +#include "components/policy/core/common/mock_configuration_policy_provider.h" +#include "components/policy/core/common/policy_map.h" +#include "components/policy/policy_constants.h" +#include "components/prefs/pref_service.h" +#include "content/public/test/browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace ash::first_party_sets { + +// This class is used to test how and when First-Party Sets policies are used +// during ash-ChromeOS startup. The expected behavior is that the policies +// aren't read from prefs until after user-login. +class FirstPartySetsPolicyInitializationTest : public LoginManagerTest { + public: + FirstPartySetsPolicyInitializationTest() { + login_mixin_.AppendRegularUsers(1); + test_account_id_ = login_mixin_.users()[0].account_id; + } + + protected: + // InProcessBrowserTest: + void SetUp() override { + policy_provider_.SetDefaultReturns( + /*is_initialization_complete_return=*/true, + /*is_first_policy_load_complete_return=*/true); + policy::BrowserPolicyConnector::SetPolicyProviderForTesting( + &policy_provider_); + LoginManagerTest::SetUp(); + } + + void SetUpCommandLine(base::CommandLine* command_line) override { + LoginManagerTest::SetUpCommandLine(command_line); + // Allow policy fetches to fail so that these tests retrieve policy from a + // MockConfigurationPolicyProvider. + command_line->AppendSwitch(ash::switches::kAllowFailedPolicyFetchForTest); + } + + // If `overrides` is provided, this sets the FirstPartySetsEnabled and + // FirstPartySetsOverrides policies with `true` and `overrides` respectively. + // + // If `overrides` is nullopt, this disables the FirstPartySetsEnabled policy. + void SetFirstPartySetsPolicies(absl::optional<base::Value::Dict> overrides) { + policy_.Set( + policy::key::kFirstPartySetsEnabled, policy::POLICY_LEVEL_MANDATORY, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + absl::make_optional(base::Value(overrides.has_value())), nullptr); + if (overrides.has_value()) { + policy_.Set( + policy::key::kFirstPartySetsOverrides, policy::POLICY_LEVEL_MANDATORY, + policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_ENTERPRISE_DEFAULT, + absl::make_optional(base::Value(std::move(overrides.value()))), + nullptr); + } + policy_provider_.UpdateChromePolicy(policy_); + } + + AccountId test_account_id() { return test_account_id_; }; + + private: + ash::LoginManagerMixin login_mixin_{&mixin_host_}; + testing::NiceMock<policy::MockConfigurationPolicyProvider> policy_provider_; + policy::PolicyMap policy_; + AccountId test_account_id_; +}; + +// Verifies that policy defaults are used when not specified. +IN_PROC_BROWSER_TEST_F(FirstPartySetsPolicyInitializationTest, PolicyDefaults) { + base::RunLoop loop; + BrowserContextKeyedServiceFactory::TestingFactory factory = + base::BindLambdaForTesting([&](content::BrowserContext* context) { + Profile* profile = Profile::FromBrowserContext(context); + EXPECT_TRUE( + profile->GetPrefs() + ->FindPreference(::first_party_sets::kFirstPartySetsEnabled) + ->IsDefaultValue()); + EXPECT_TRUE( + profile->GetPrefs() + ->FindPreference(::first_party_sets::kFirstPartySetsOverrides) + ->IsDefaultValue()); + loop.Quit(); + return base::WrapUnique<KeyedService>( + new ::first_party_sets::FirstPartySetsPolicyService( + context, base::Value::Dict())); + }); + + ::first_party_sets::FirstPartySetsPolicyServiceFactory::GetInstance() + ->SetTestingFactoryForTesting(std::move(factory)); + + LoginUser(test_account_id()); + loop.Run(); +} + +// Set FirstPartySetsEnabled policy and check that it's ready in time for +// creation of the FirstPartySetsPolicyService for a user. +IN_PROC_BROWSER_TEST_F(FirstPartySetsPolicyInitializationTest, + EnabledPolicySetAndUsed) { + base::RunLoop loop; + BrowserContextKeyedServiceFactory::TestingFactory factory = + base::BindLambdaForTesting([&](content::BrowserContext* context) { + Profile* profile = Profile::FromBrowserContext(context); + // Only the FirstPartySetsEnabled pref was set. + EXPECT_FALSE( + profile->GetPrefs() + ->FindPreference(::first_party_sets::kFirstPartySetsEnabled) + ->IsDefaultValue()); + EXPECT_TRUE( + profile->GetPrefs() + ->FindPreference(::first_party_sets::kFirstPartySetsOverrides) + ->IsDefaultValue()); + // Check the expected value of FirstPartySetsEnabled the pref. + EXPECT_EQ(profile->GetPrefs()->GetBoolean( + ::first_party_sets::kFirstPartySetsEnabled), + false); + loop.Quit(); + return base::WrapUnique<KeyedService>( + new ::first_party_sets::FirstPartySetsPolicyService( + context, base::Value::Dict())); + }); + + ::first_party_sets::FirstPartySetsPolicyServiceFactory::GetInstance() + ->SetTestingFactoryForTesting(std::move(factory)); + + SetFirstPartySetsPolicies( + /*overrides=*/absl::nullopt); + LoginUser(test_account_id()); + loop.Run(); +} + +// Set both First-Party Sets policies and check that they are ready in time for +// creation of the FirstPartySetsPolicyService for a user. +IN_PROC_BROWSER_TEST_F(FirstPartySetsPolicyInitializationTest, + BothPoliciesSetAndUsed) { + base::RunLoop loop; + base::Value expected_overrides = base::JSONReader::Read(R"( + { + "replacements": [], + "additions": [] + } + )") + .value(); + BrowserContextKeyedServiceFactory::TestingFactory factory = + base::BindLambdaForTesting([&](content::BrowserContext* context) { + Profile* profile = Profile::FromBrowserContext(context); + // Both prefs were set. + EXPECT_FALSE( + profile->GetPrefs() + ->FindPreference(::first_party_sets::kFirstPartySetsEnabled) + ->IsDefaultValue()); + EXPECT_FALSE( + profile->GetPrefs() + ->FindPreference(::first_party_sets::kFirstPartySetsOverrides) + ->IsDefaultValue()); + // Both prefs have the expected value. + EXPECT_EQ(profile->GetPrefs()->GetBoolean( + ::first_party_sets::kFirstPartySetsEnabled), + true); + EXPECT_TRUE( + profile->GetPrefs() + ->GetDictionary(::first_party_sets::kFirstPartySetsOverrides) + ->GetDict() == expected_overrides.GetDict()); + loop.Quit(); + return base::WrapUnique<KeyedService>( + new ::first_party_sets::FirstPartySetsPolicyService( + context, base::Value::Dict())); + }); + + ::first_party_sets::FirstPartySetsPolicyServiceFactory::GetInstance() + ->SetTestingFactoryForTesting(std::move(factory)); + + SetFirstPartySetsPolicies( + /*overrides=*/std::move(expected_overrides.Clone().GetDict())); + LoginUser(test_account_id()); + loop.Run(); +} + +} // namespace ash::first_party_sets
diff --git a/chrome/browser/ash/hats/OWNERS b/chrome/browser/ash/hats/OWNERS index a25db21c..f1a879e5 100644 --- a/chrome/browser/ash/hats/OWNERS +++ b/chrome/browser/ash/hats/OWNERS
@@ -1,2 +1,3 @@ mutexlox@chromium.org iby@chromium.org +jackshira@google.com
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc index d2d7205..ef76f2c 100644 --- a/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc +++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager.cc
@@ -55,7 +55,8 @@ default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 - forwardable = true)"; + forwardable = true +)"; // Backoff policy used to control managed accounts addition retries. const net::BackoffEntry::Policy kBackoffPolicyForManagedAccounts = { @@ -384,6 +385,8 @@ registry->RegisterBooleanPref(prefs::kKerberosAddAccountsAllowed, true); registry->RegisterListPref(prefs::kKerberosAccounts); registry->RegisterStringPref(prefs::kKerberosDomainAutocomplete, ""); + registry->RegisterStringPref(prefs::kKerberosDefaultConfiguration, + kDefaultKerberosConfig); } void KerberosCredentialsManager::RegisterProfilePrefs( @@ -400,11 +403,6 @@ }); } -// static -const char* KerberosCredentialsManager::GetDefaultKerberosConfig() { - return kDefaultKerberosConfig; -} - bool KerberosCredentialsManager::IsKerberosEnabled() const { return local_state_->GetBoolean(prefs::kKerberosEnabled); } @@ -725,11 +723,11 @@ } const std::string& KerberosCredentialsManager::GetActivePrincipalName() const { - // Using Get()->GetString() instead of GetString() directly to prevent a + // Using GetValue().GetString() instead of GetString() directly to prevent a // string copy. return primary_profile_->GetPrefs() - ->Get(prefs::kKerberosActivePrincipalName) - ->GetString(); + ->GetValue(prefs::kKerberosActivePrincipalName) + .GetString(); } void KerberosCredentialsManager::SetActivePrincipalName( @@ -943,4 +941,9 @@ add_managed_account_callback_for_testing_ = std::move(callback); } +// static +const char* KerberosCredentialsManager::GetDefaultKerberosConfigForTesting() { + return kDefaultKerberosConfig; +} + } // namespace ash
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager.h b/chrome/browser/ash/kerberos/kerberos_credentials_manager.h index a26bdb2f..7eed03b 100644 --- a/chrome/browser/ash/kerberos/kerberos_credentials_manager.h +++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager.h
@@ -85,9 +85,6 @@ // Helper method for ignoring the results of method calls. static ResultCallback EmptyResultCallback(); - // Returns the default Kerberos configuration (krb5.conf). - static const char* GetDefaultKerberosConfig(); - // Returns true if the Kerberos feature is enabled. bool IsKerberosEnabled() const; @@ -170,6 +167,9 @@ void SetAddManagedAccountCallbackForTesting( base::RepeatingCallback<void(kerberos::ErrorType)> callback); + // Used on tests. Returns the default Kerberos configuration (krb5.conf). + static const char* GetDefaultKerberosConfigForTesting(); + private: friend class KerberosAddAccountRunner; using RepeatedAccountField =
diff --git a/chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc b/chrome/browser/ash/kerberos/kerberos_credentials_manager_unittest.cc similarity index 98% rename from chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc rename to chrome/browser/ash/kerberos/kerberos_credentials_manager_unittest.cc index d5dec14..441717a 100644 --- a/chrome/browser/ash/kerberos/kerberos_credentials_manager_test.cc +++ b/chrome/browser/ash/kerberos/kerberos_credentials_manager_unittest.cc
@@ -87,13 +87,6 @@ // Password placeholder. constexpr char kLoginPasswordPlaceholder[] = "${PASSWORD}"; -// Default config. -constexpr char kDefaultConfig[] = R"([libdefaults] - default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 - default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 - permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96 - forwardable = true)"; - // A long time delta, used to fast forward the task environment until all // pending operations are completed. This value should be equal to the maximum // time to delay requests on |kBackoffPolicyForManagedAccounts|. @@ -385,7 +378,8 @@ // The default config sets strong crypto and allows forwardable tickets. TEST_F(KerberosCredentialsManagerTest, GetDefaultKerberosConfig) { - const std::string default_config = mgr_->GetDefaultKerberosConfig(); + const std::string default_config = + local_state_.Get()->GetString(::prefs::kKerberosDefaultConfiguration); // Enforce strong crypto. EXPECT_TRUE(base::Contains(default_config, "default_tgs_enctypes")); @@ -1002,7 +996,7 @@ EXPECT_EQ(kNormalizedPrincipal, accounts[0].principal_name()); EXPECT_EQ(expected_config, accounts[0].krb5conf()); EXPECT_EQ(kNormalizedOtherPrincipal, accounts[1].principal_name()); - EXPECT_EQ(kDefaultConfig, accounts[1].krb5conf()); + EXPECT_EQ(mgr_->GetDefaultKerberosConfigForTesting(), accounts[1].krb5conf()); EXPECT_EQ(kNormalizedPrincipal, mgr_->GetActiveAccount()); }
diff --git a/chrome/browser/ash/login/app_mode/test/auto_launched_kiosk_browsertest.cc b/chrome/browser/ash/login/app_mode/test/auto_launched_kiosk_browsertest.cc index b753f784..f0da0550a 100644 --- a/chrome/browser/ash/login/app_mode/test/auto_launched_kiosk_browsertest.cc +++ b/chrome/browser/ash/login/app_mode/test/auto_launched_kiosk_browsertest.cc
@@ -7,7 +7,6 @@ #include <vector> #include "apps/test/app_window_waiter.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/callback_list.h" #include "base/command_line.h" @@ -33,6 +32,7 @@ #include "chrome/common/chrome_constants.h" #include "chrome/common/pref_names.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/shill/shill_manager_client.h" #include "components/crx_file/crx_verifier.h"
diff --git a/chrome/browser/ash/login/configuration_based_oobe_browsertest.cc b/chrome/browser/ash/login/configuration_based_oobe_browsertest.cc index b5dd275..23c2f00 100644 --- a/chrome/browser/ash/login/configuration_based_oobe_browsertest.cc +++ b/chrome/browser/ash/login/configuration_based_oobe_browsertest.cc
@@ -3,7 +3,6 @@ // found in the LICENSE file. #include "ash/components/attestation/attestation_flow_utils.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/test/scoped_chromeos_version_info.h" #include "build/build_config.h" @@ -28,6 +27,7 @@ #include "chrome/browser/ui/webui/chromeos/login/welcome_screen_handler.h" #include "chromeos/ash/components/dbus/attestation/fake_attestation_client.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/dbus/constants/dbus_switches.h" #include "chromeos/dbus/shill/shill_manager_client.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_resources_remover_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_mode_resources_remover_unittest.cc index 06316e8..93ff7a8b 100644 --- a/chrome/browser/ash/login/demo_mode/demo_mode_resources_remover_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_mode_resources_remover_unittest.cc
@@ -8,7 +8,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/files/file_util.h" #include "base/test/simple_test_tick_clock.h" @@ -16,6 +15,7 @@ #include "chrome/browser/ash/login/demo_mode/demo_mode_test_helper.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/prefs/testing_pref_service.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "components/user_manager/scoped_user_manager.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc index fa9429d1..ca05fd87 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -7,7 +7,6 @@ #include <algorithm> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/locale_update_controller.h" @@ -45,6 +44,7 @@ #include "chrome/common/extensions/extension_constants.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/system/statistics_provider.h" #include "components/language/core/browser/pref_names.h" #include "components/prefs/pref_registry_simple.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc index facba49..9ccdad9 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
@@ -162,7 +162,7 @@ test::WaitForWelcomeScreen(); IsConfirmationDialogHidden(); - InvokeDemoModeWithAccelerator(); + InvokeDemoModeWithTaps(); IsConfirmationDialogShown(); ClickOkOnConfirmationDialog(); @@ -432,8 +432,9 @@ } }; +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - ShowConfirmationDialogAndProceed) { + DISABLED_ShowConfirmationDialogAndProceed) { IsConfirmationDialogHidden(); InvokeDemoModeWithAccelerator(); @@ -444,15 +445,9 @@ OobeScreenWaiter(NetworkScreenView::kScreenId).Wait(); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_ShowConfirmationDialogAndCancel \ - DISABLED_ShowConfirmationDialogAndCancel -#else -#define MAYBE_ShowConfirmationDialogAndCancel ShowConfirmationDialogAndCancel -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_ShowConfirmationDialogAndCancel) { + DISABLED_ShowConfirmationDialogAndCancel) { IsConfirmationDialogHidden(); InvokeDemoModeWithAccelerator(); @@ -464,13 +459,8 @@ test::OobeJS().ExpectHiddenPath(kDemoPreferencesScreen); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_InvokeWithTaps DISABLED_InvokeWithTaps -#else -#define MAYBE_InvokeWithTaps InvokeWithTaps -#endif -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, MAYBE_InvokeWithTaps) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, DISABLED_InvokeWithTaps) { // Use fake time to avoid flakiness. SetFakeTimeForMultiTapDetector(base::Time::UnixEpoch()); IsConfirmationDialogHidden(); @@ -479,16 +469,9 @@ IsConfirmationDialogShown(); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_DoNotInvokeWithNonConsecutiveTaps \ - DISABLED_DoNotInvokeWithNonConsecutiveTaps -#else -#define MAYBE_DoNotInvokeWithNonConsecutiveTaps \ - DoNotInvokeWithNonConsecutiveTaps -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_DoNotInvokeWithNonConsecutiveTaps) { + DISABLED_DoNotInvokeWithNonConsecutiveTaps) { // Use fake time to avoid flakiness. const base::Time kFakeTime = base::Time::UnixEpoch(); SetFakeTimeForMultiTapDetector(kFakeTime); @@ -505,14 +488,9 @@ IsConfirmationDialogHidden(); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_OnlineSetupFlowSuccess DISABLED_OnlineSetupFlowSuccess -#else -#define MAYBE_OnlineSetupFlowSuccess OnlineSetupFlowSuccess -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_OnlineSetupFlowSuccess) { + DISABLED_OnlineSetupFlowSuccess) { // Simulate successful online setup. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -537,16 +515,10 @@ EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); } -// Disabled due to test failure. http://crbug.com/1350365 -#if BUILDFLAG(IS_CHROMEOS_ASH) -#define MAYBE_OnlineSetupFlowSuccessWithCountryCustomization \ - DISABLED_OnlineSetupFlowSuccessWithCountryCustomization -#else -#define MAYBE_OnlineSetupFlowSuccessWithCountryCustomization \ - OnlineSetupFlowSuccessWithCountryCustomization -#endif -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_OnlineSetupFlowSuccessWithCountryCustomization) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F( + DemoSetupArcSupportedTest, + DISABLED_OnlineSetupFlowSuccessWithCountryCustomization) { // Simulate successful online setup. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -572,8 +544,9 @@ SelectFranceAndFinishSetup(); } +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - OnlineSetupFlowSuccessWithRetailerAndStoreId) { + DISABLED_OnlineSetupFlowSuccessWithRetailerAndStoreId) { // Simulate successful online setup. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -612,7 +585,9 @@ EXPECT_TRUE(StartupUtils::IsDeviceRegistered()); } -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, OnlineSetupFlowErrorDefault) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, + DISABLED_OnlineSetupFlowErrorDefault) { // Simulate online setup failure. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -641,16 +616,9 @@ EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_OnlineSetupFlowErrorPowerwashRequired \ - DISABLED_OnlineSetupFlowErrorPowerwashRequired -#else -#define MAYBE_OnlineSetupFlowErrorPowerwashRequired \ - OnlineSetupFlowErrorPowerwashRequired -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_OnlineSetupFlowErrorPowerwashRequired) { + DISABLED_OnlineSetupFlowErrorPowerwashRequired) { // Simulate online setup failure that requires powerwash. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -678,17 +646,9 @@ EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); } -// TODO(crbug.com/1150349, crbug.com/1324447): Flaky on ChromeOS ASAN and on -// builder "linux-chromeos-dbg". -#if defined(ADDRESS_SANITIZER) || !defined(NDEBUG) -#define MAYBE_OnlineSetupFlowCrosComponentFailure \ - DISABLED_OnlineSetupFlowCrosComponentFailure -#else -#define MAYBE_OnlineSetupFlowCrosComponentFailure \ - OnlineSetupFlowCrosComponentFailure -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_OnlineSetupFlowCrosComponentFailure) { + DISABLED_OnlineSetupFlowCrosComponentFailure) { // Simulate failure to load demo resources CrOS component. // There is no enrollment attempt, as process fails earlier. enrollment_helper_.ExpectNoEnrollment(); @@ -715,14 +675,9 @@ EXPECT_FALSE(StartupUtils::IsDeviceRegistered()); } -// Flake on ASAN: crbug.com/1234593 -#if defined(ADDRESS_SANITIZER) -#define MAYBE_OfflineDemoModeUnavailable DISABLED_OfflineDemoModeUnavailable -#else -#define MAYBE_OfflineDemoModeUnavailable OfflineDemoModeUnavailable -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_OfflineDemoModeUnavailable) { + DISABLED_OfflineDemoModeUnavailable) { SimulateNetworkDisconnected(); TriggerDemoModeOnWelcomeScreen(); @@ -730,14 +685,9 @@ test::OobeJS().ExpectDisabledPath(kNetworkNextButton); } -// Flake on ASAN: crbug.com/1234593 -#if defined(ADDRESS_SANITIZER) -#define MAYBE_ClickNetworkOnNetworkScreen DISABLED_ClickNetworkOnNetworkScreen -#else -#define MAYBE_ClickNetworkOnNetworkScreen ClickNetworkOnNetworkScreen -#endif +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - MAYBE_ClickNetworkOnNetworkScreen) { + DISABLED_ClickNetworkOnNetworkScreen) { TriggerDemoModeOnWelcomeScreen(); test::WaitForNetworkSelectionScreen(); @@ -756,8 +706,9 @@ } } +// TODO(crbug.com/1341234): flaky. IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, - ClickConnectedNetworkOnNetworkScreen) { + DISABLED_ClickConnectedNetworkOnNetworkScreen) { SimulateNetworkConnected(); TriggerDemoModeOnWelcomeScreen(); @@ -779,7 +730,9 @@ } } -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, BackOnNetworkScreen) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, + DISABLED_BackOnNetworkScreen) { SimulateNetworkConnected(); TriggerDemoModeOnWelcomeScreen(); @@ -789,15 +742,8 @@ OobeScreenWaiter(WelcomeView::kScreenId).Wait(); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -// TODO(crbug.com/1350105,crbug.com/1341234,crbug.com/1350117): Flaky on -// ubuntu and chromeos -#if defined(ADDRESS_SANITIZER) || BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) -#define MAYBE_BackOnTermsScreen DISABLED_BackOnTermsScreen -#else -#define MAYBE_BackOnTermsScreen BackOnTermsScreen -#endif -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, MAYBE_BackOnTermsScreen) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, DISABLED_BackOnTermsScreen) { SimulateNetworkConnected(); TriggerDemoModeOnWelcomeScreen(); @@ -820,13 +766,8 @@ OobeScreenWaiter(DemoPreferencesScreenView::kScreenId).Wait(); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_BackOnErrorScreen DISABLED_BackOnErrorScreen -#else -#define MAYBE_BackOnErrorScreen BackOnErrorScreen -#endif -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, MAYBE_BackOnErrorScreen) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, DISABLED_BackOnErrorScreen) { // Simulate online setup failure. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION); @@ -849,13 +790,8 @@ OobeScreenWaiter(WelcomeView::kScreenId).Wait(); } -// TODO(crbug.com/1150349): Flaky on ChromeOS ASAN. -#if defined(ADDRESS_SANITIZER) -#define MAYBE_RetryOnErrorScreen DISABLED_RetryOnErrorScreen -#else -#define MAYBE_RetryOnErrorScreen RetryOnErrorScreen -#endif -IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, MAYBE_RetryOnErrorScreen) { +// TODO(crbug.com/1341234): flaky. +IN_PROC_BROWSER_TEST_F(DemoSetupArcSupportedTest, DISABLED_RetryOnErrorScreen) { // Simulate online setup failure. enrollment_helper_.ExpectEnrollmentMode( policy::EnrollmentConfig::MODE_ATTESTATION);
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc index babe612..0235818 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
@@ -9,7 +9,6 @@ #include <utility> #include "ash/components/arc/arc_util.h" -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/callback.h" #include "base/command_line.h" @@ -36,6 +35,7 @@ #include "chrome/browser/browser_process_platform_part.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/system/statistics_provider.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc index 24d11ac1..db387458 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/files/file_path.h" @@ -25,6 +24,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/system/fake_statistics_provider.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h b/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h index 65f860e4..cee1608 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h +++ b/chrome/browser/ash/login/demo_mode/demo_setup_test_utils.h
@@ -7,11 +7,11 @@ #include <string> -#include "ash/components/tpm/install_attributes.h" #include "base/files/scoped_temp_dir.h" #include "chrome/browser/ash/login/enrollment/enterprise_enrollment_helper.h" #include "chrome/browser/ash/login/enrollment/enterprise_enrollment_helper_mock.h" #include "chrome/browser/ash/policy/enrollment/enrollment_config.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc b/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc index de04699e..fa62c5d9 100644 --- a/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc +++ b/chrome/browser/ash/login/enrollment/auto_enrollment_controller.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback_helpers.h" @@ -32,6 +31,7 @@ #include "chromeos/ash/components/dbus/system_clock/system_clock_client.h" #include "chromeos/ash/components/dbus/system_clock/system_clock_sync_observation.h" #include "chromeos/ash/components/dbus/userdataauth/install_attributes_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/cryptohome/rpc.pb.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/system/statistics_provider.h"
diff --git a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc index e4ce203..714a792 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_embedded_policy_server_browsertest.cc
@@ -6,7 +6,6 @@ #include "ash/components/attestation/attestation_flow_utils.h" #include "ash/components/attestation/mock_attestation_flow.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h" @@ -53,6 +52,7 @@ #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/system/fake_statistics_provider.h" #include "components/policy/core/common/cloud/device_management_service.h"
diff --git a/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc b/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc index 7c04601..82a131f 100644 --- a/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc +++ b/chrome/browser/ash/login/enrollment/enrollment_screen_unittest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/login/enrollment/enrollment_screen.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback.h" @@ -22,6 +21,7 @@ #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/test/base/testing_browser_process.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/system/fake_statistics_provider.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/prefs/testing_pref_service.h"
diff --git a/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc b/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc index 91481685..82506bd 100644 --- a/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc +++ b/chrome/browser/ash/login/enterprise_user_session_metrics_unittest.cc
@@ -7,12 +7,12 @@ #include <memory> #include "ash/components/login/auth/public/user_context.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/test/metrics/histogram_tester.h" #include "base/time/time.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chrome/browser/ash/login/lock/screen_locker_unittest.cc b/chrome/browser/ash/login/lock/screen_locker_unittest.cc index 0ae5db30..94806ba 100644 --- a/chrome/browser/ash/login/lock/screen_locker_unittest.cc +++ b/chrome/browser/ash/login/lock/screen_locker_unittest.cc
@@ -9,7 +9,6 @@ #include "ash/components/audio/cras_audio_handler.h" #include "ash/components/cryptohome/system_salt_getter.h" #include "ash/components/login/session/session_termination_manager.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/public/cpp/login_screen_model.h" #include "ash/public/cpp/login_types.h" #include "base/bind.h" @@ -40,6 +39,7 @@ #include "chromeos/ash/components/dbus/concierge/concierge_client.h" #include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/dbus/tpm_manager/tpm_manager_client.h" #include "chromeos/login/login_state/login_state.h" #include "chromeos/system/fake_statistics_provider.h"
diff --git a/chrome/browser/ash/login/saml/public_saml_url_fetcher.cc b/chrome/browser/ash/login/saml/public_saml_url_fetcher.cc index e664844..d653b0e 100644 --- a/chrome/browser/ash/login/saml/public_saml_url_fetcher.cc +++ b/chrome/browser/ash/login/saml/public_saml_url_fetcher.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/logging.h" #include "chrome/browser/ash/arc/arc_optin_uma.h" @@ -18,6 +17,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/net/system_network_context_manager.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/cloud/dm_auth.h"
diff --git a/chrome/browser/ash/login/saml/saml_browsertest.cc b/chrome/browser/ash/login/saml/saml_browsertest.cc index 85eb06e..1981557c 100644 --- a/chrome/browser/ash/login/saml/saml_browsertest.cc +++ b/chrome/browser/ash/login/saml/saml_browsertest.cc
@@ -12,7 +12,6 @@ #include "ash/components/login/auth/public/key.h" #include "ash/components/login/auth/public/saml_password_attributes.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h" @@ -76,6 +75,7 @@ #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_userdataauth_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/dbus/constants/attestation_constants.h" #include "chromeos/dbus/cryptohome/key.pb.h" #include "chromeos/dbus/cryptohome/rpc.pb.h"
diff --git a/chrome/browser/ash/login/screens/hid_detection_screen.cc b/chrome/browser/ash/login/screens/hid_detection_screen.cc index 4f0ebc0a..66aa8e90 100644 --- a/chrome/browser/ash/login/screens/hid_detection_screen.cc +++ b/chrome/browser/ash/login/screens/hid_detection_screen.cc
@@ -614,8 +614,6 @@ view_->SetMouseState(GetDeviceUiState(status.pointer_metadata.state)); view_->SetPointingDeviceName(status.pointer_metadata.detected_hid_name); - // TODO(b/232851163): Handle showing pairing dialog. - std::string keyboard_state = GetDeviceUiState(status.keyboard_metadata.state); // Unlike pointing devices, which can be connected through serial IO or some @@ -627,6 +625,14 @@ view_->SetContinueButtonEnabled(status.touchscreen_detected || IsInputConnected(status.pointer_metadata) || IsInputConnected(status.keyboard_metadata)); + + view_->SetPinDialogVisible(status.pairing_state.has_value()); + if (status.pairing_state.has_value()) { + view_->SetKeyboardPinCode(status.pairing_state.value().code); + view_->SetNumKeysEnteredPinCode( + status.pairing_state.value().num_keys_entered); + return; + } } void HIDDetectionScreen::InitializeAdapter(
diff --git a/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc b/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc index 786bcb7..03b9270 100644 --- a/chrome/browser/ash/login/screens/hid_detection_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/hid_detection_screen_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 "ash/components/hid_detection/bluetooth_hid_detector.h" #include "ash/components/hid_detection/fake_hid_detection_manager.h" #include "ash/components/hid_detection/hid_detection_manager.h" #include "ash/components/hid_detection/hid_detection_utils.h" @@ -52,12 +53,15 @@ const char kTestPointerName[] = "pointer"; const char kTestKeyboardName[] = "keyboard"; +const char kTestPinCode[] = "pincode"; + const test::UIPath kHidContinueButton = {"hid-detection", "hid-continue-button"}; const test::UIPath kHidTouchscreenEntry = {"hid-detection", "hid-touchscreen-entry"}; const test::UIPath kHidMouseTick = {"hid-detection", "mouse-tick"}; const test::UIPath kHidKeyboardTick = {"hid-detection", "keyboard-tick"}; +const test::UIPath kHidPairingDialog = {"hid-detection", "hid-pin-popup"}; InputState GetHidInputState( device::mojom::InputDeviceType connected_hid_device_type) { @@ -263,6 +267,25 @@ hid_detection_screen_->DeviceAdded(/*adapter=*/nullptr, mock_device.get()); } + void SimulatePairingCodeRequired() { + // This is not applicable to the legacy screen. + if (!GetParam()) + return; + + fake_hid_detection_manager_->SetPairingState( + hid_detection::BluetoothHidPairingState{ + kTestPinCode, static_cast<uint8_t>(std::strlen(kTestPinCode))}); + } + + void SimulatePairingCodeNotRequired() { + // This is not applicable to the legacy screen. + if (!GetParam()) + return; + + fake_hid_detection_manager_->SetPairingState( + /*pairing_state=*/absl::nullopt); + } + // HID detection must be stopped before HidDetectionManager is destroyed. This // should be called in tests that start HID detection but don't continue to // the next screen. @@ -484,6 +507,40 @@ }; IN_PROC_BROWSER_TEST_P(HIDDetectionScreenChromeboxTest, + BluetoothPairingDialog) { + // This test is not applicable to the legacy screen. + if (!GetParam()) + return; + + OobeScreenWaiter(HIDDetectionView::kScreenId).Wait(); + + SimulateBluetoothDeviceDiscovered(device::BluetoothDeviceType::KEYBOARD); + EXPECT_EQ("pairing", handler()->keyboard_state_for_test()); + EXPECT_EQ(kTestKeyboardName, handler()->keyboard_device_name_for_test()); + EXPECT_FALSE(handler()->num_keys_entered_expected_for_test()); + EXPECT_EQ(0, handler()->num_keys_entered_pin_code_for_test()); + EXPECT_TRUE(handler()->keyboard_pin_code_for_test().empty()); + test::OobeJS().ExpectDialogClosed(kHidPairingDialog); + + SimulatePairingCodeRequired(); + EXPECT_EQ("pairing", handler()->keyboard_state_for_test()); + EXPECT_EQ(kTestKeyboardName, handler()->keyboard_device_name_for_test()); + EXPECT_TRUE(handler()->num_keys_entered_expected_for_test()); + EXPECT_EQ(static_cast<uint8_t>(std::strlen(kTestPinCode)), + handler()->num_keys_entered_pin_code_for_test()); + EXPECT_EQ(kTestPinCode, handler()->keyboard_pin_code_for_test()); + test::OobeJS().ExpectDialogOpen(kHidPairingDialog); + + SimulatePairingCodeNotRequired(); + EXPECT_EQ("pairing", handler()->keyboard_state_for_test()); + EXPECT_EQ(kTestKeyboardName, handler()->keyboard_device_name_for_test()); + EXPECT_FALSE(handler()->num_keys_entered_expected_for_test()); + test::OobeJS().ExpectDialogClosed(kHidPairingDialog); + + ForceStopHidDetectionIfRevamp(); +} + +IN_PROC_BROWSER_TEST_P(HIDDetectionScreenChromeboxTest, AddRemoveDevicesAfterScreen) { // This test is not applicable after the revamp. if (GetParam()) {
diff --git a/chrome/browser/ash/login/screens/update_required_screen_unittest.cc b/chrome/browser/ash/login/screens/update_required_screen_unittest.cc index f3ebaee..2c1e2aa 100644 --- a/chrome/browser/ash/login/screens/update_required_screen_unittest.cc +++ b/chrome/browser/ash/login/screens/update_required_screen_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/callback_helpers.h" #include "base/command_line.h" @@ -22,6 +21,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/ash/components/network/portal_detector/mock_network_portal_detector.h" #include "chromeos/ash/components/network/portal_detector/network_portal_detector.h"
diff --git a/chrome/browser/ash/login/session/chrome_session_manager_browsertest.cc b/chrome/browser/ash/login/session/chrome_session_manager_browsertest.cc index 61e04d79..8e653d79 100644 --- a/chrome/browser/ash/login/session/chrome_session_manager_browsertest.cc +++ b/chrome/browser/ash/login/session/chrome_session_manager_browsertest.cc
@@ -4,7 +4,6 @@ #include <memory> -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/session/session_controller_impl.h" @@ -32,6 +31,7 @@ #include "chrome/common/chrome_switches.h" #include "chromeos/ash/components/dbus/rmad/fake_rmad_client.h" #include "chromeos/ash/components/dbus/rmad/rmad_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/system/fake_statistics_provider.h" #include "chromeos/system/statistics_provider.h" #include "components/user_manager/user_names.h"
diff --git a/chrome/browser/ash/login/session/user_session_initializer.cc b/chrome/browser/ash/login/session/user_session_initializer.cc index 017b37b..0de719a3 100644 --- a/chrome/browser/ash/login/session/user_session_initializer.cc +++ b/chrome/browser/ash/login/session/user_session_initializer.cc
@@ -6,7 +6,6 @@ #include "ash/components/audio/cras_audio_handler.h" #include "ash/components/peripheral_notification/peripheral_notification_manager.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_pref_names.h" #include "base/feature_list.h" @@ -48,6 +47,7 @@ #include "chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.h" #include "chrome/common/pref_names.h" #include "chromeos/ash/components/dbus/pciguard/pciguard_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/network/network_cert_loader.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_task_traits.h"
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc index 126f6c6..0265f099 100644 --- a/chrome/browser/ash/login/wizard_controller_browsertest.cc +++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -8,7 +8,6 @@ #include "ash/components/geolocation/simple_geolocation_provider.h" #include "ash/components/settings/timezone_settings.h" #include "ash/components/timezone/timezone_request.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_screen_test_api.h" @@ -92,6 +91,7 @@ #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/ash/components/dbus/system_clock/system_clock_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_install_attributes_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_state.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/constants/chromeos_features.h"
diff --git a/chrome/browser/ash/net/network_pref_state_observer.cc b/chrome/browser/ash/net/network_pref_state_observer.cc index 44c966d..fc2ad4e 100644 --- a/chrome/browser/ash/net/network_pref_state_observer.cc +++ b/chrome/browser/ash/net/network_pref_state_observer.cc
@@ -4,12 +4,12 @@ #include "chrome/browser/ash/net/network_pref_state_observer.h" -#include "ash/components/tpm/install_attributes.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/wifi_configuration_sync_service_factory.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_metadata_store.h" #include "chromeos/components/sync_wifi/wifi_configuration_sync_service.h"
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc index addd85d..d972807e 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "base/barrier_closure.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -19,6 +18,7 @@ #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/network/managed_network_configuration_handler.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_profile_handler.h"
diff --git a/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc b/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc index bd8ab45f..f1ec8804 100644 --- a/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc +++ b/chrome/browser/ash/net/rollback_network_config/rollback_network_config_unittest.cc
@@ -4,7 +4,6 @@ #include <string> -#include "ash/components/tpm/stub_install_attributes.h" #include "base/json/json_reader.h" #include "base/run_loop.h" #include "base/test/bind.h" @@ -21,6 +20,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/managed_network_configuration_handler.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/ash/components/network/network_state.h"
diff --git a/chrome/browser/ash/net/system_proxy_manager_browsertest.cc b/chrome/browser/ash/net/system_proxy_manager_browsertest.cc index b344777..0fea3ef 100644 --- a/chrome/browser/ash/net/system_proxy_manager_browsertest.cc +++ b/chrome/browser/ash/net/system_proxy_manager_browsertest.cc
@@ -8,7 +8,6 @@ #include <string> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/run_loop.h" #include "base/strings/stringprintf.h" @@ -32,6 +31,7 @@ #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/ash/components/dbus/system_proxy/system_proxy_client.h" #include "chromeos/ash/components/dbus/system_proxy/system_proxy_service.pb.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_state.h" #include "chromeos/ash/components/network/network_state_handler.h"
diff --git a/chrome/browser/ash/notifications/update_required_notification_unittest.cc b/chrome/browser/ash/notifications/update_required_notification_unittest.cc index 43308a6..13ac32f 100644 --- a/chrome/browser/ash/notifications/update_required_notification_unittest.cc +++ b/chrome/browser/ash/notifications/update_required_notification_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/run_loop.h" #include "base/strings/utf_string_conversions.h" #include "base/test/bind.h" @@ -24,6 +23,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/dbus/shill/shill_service_client.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc index 0964e88..643fcd6 100644 --- a/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc +++ b/chrome/browser/ash/os_feedback/chrome_os_feedback_delegate.cc
@@ -224,6 +224,11 @@ // by posting a task to thread pool. The |feedback_data| will manage waiting // for all tasks to complete. feedback_data->AttachAndCompressFileData(std::move(file_data)); + // Records whether the file is included when the feedback report is + // submitted. + ash::os_feedback_ui::metrics::EmitFeedbackAppIncludedFile(true); + } else { + ash::os_feedback_ui::metrics::EmitFeedbackAppIncludedFile(false); } // Handle Feedback Metrics @@ -231,6 +236,18 @@ // submitted. ash::os_feedback_ui::metrics::EmitFeedbackAppIncludedScreenshot( report->include_screenshot); + // Records whether the email is included when the feedback report is + // submitted. + ash::os_feedback_ui::metrics::EmitFeedbackAppIncludedEmail( + feedback_context->email.has_value()); + // Records whether the page url is included when the feedback report is + // submitted. + ash::os_feedback_ui::metrics::EmitFeedbackAppIncludedUrl( + feedback_context->page_url.has_value()); + // Records whether the system and information is included when the feedback + // report is submitted. + ash::os_feedback_ui::metrics::EmitFeedbackAppIncludedSystemInfo( + report->include_system_logs_and_histograms); feedback_service_->SendFeedback( feedback_params, feedback_data,
diff --git a/chrome/browser/ash/ownership/fake_owner_settings_service.cc b/chrome/browser/ash/ownership/fake_owner_settings_service.cc index d32a96d..22723b45 100644 --- a/chrome/browser/ash/ownership/fake_owner_settings_service.cc +++ b/chrome/browser/ash/ownership/fake_owner_settings_service.cc
@@ -4,10 +4,10 @@ #include "chrome/browser/ash/ownership/fake_owner_settings_service.h" -#include "ash/components/tpm/install_attributes.h" #include "base/check.h" #include "chrome/browser/ash/ownership/owner_settings_service_ash_factory.h" #include "chrome/browser/ash/settings/stub_cros_settings_provider.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/ownership/mock_owner_key_util.h" namespace ash {
diff --git a/chrome/browser/ash/ownership/owner_settings_service_ash.cc b/chrome/browser/ash/ownership/owner_settings_service_ash.cc index 38c3a14..1b54eaa 100644 --- a/chrome/browser/ash/ownership/owner_settings_service_ash.cc +++ b/chrome/browser/ash/ownership/owner_settings_service_ash.cc
@@ -11,7 +11,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "ash/components/tpm/tpm_token_loader.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" @@ -33,6 +32,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/ownership/owner_key_util.h" #include "components/prefs/pref_service.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_features.cc b/chrome/browser/ash/plugin_vm/plugin_vm_features.cc index 3e36267..ff0f682 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_features.cc +++ b/chrome/browser/ash/plugin_vm/plugin_vm_features.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/ash/plugin_vm/plugin_vm_features.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "base/feature_list.h" #include "base/system/sys_info.h" #include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h" @@ -14,6 +13,7 @@ #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/profiles/profile.h" #include "chrome/common/chrome_features.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/prefs/pref_service.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc b/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc index dd2af7f1..e391f796 100644 --- a/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc +++ b/chrome/browser/ash/plugin_vm/plugin_vm_util_unittest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/plugin_vm/plugin_vm_util.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/plugin_vm/plugin_vm_features.h" #include "chrome/browser/ash/plugin_vm/plugin_vm_pref_names.h" #include "chrome/browser/ash/plugin_vm/plugin_vm_test_helper.h" @@ -12,6 +11,7 @@ #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" #include "chrome/test/base/testing_profile.h" #include "chromeos/ash/components/dbus/concierge/concierge_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "content/public/test/browser_task_environment.h"
diff --git a/chrome/browser/ash/policy/active_directory/active_directory_policy_manager_unittest.cc b/chrome/browser/ash/policy/active_directory/active_directory_policy_manager_unittest.cc index d473d60..d2eddda 100644 --- a/chrome/browser/ash/policy/active_directory/active_directory_policy_manager_unittest.cc +++ b/chrome/browser/ash/policy/active_directory/active_directory_policy_manager_unittest.cc
@@ -8,7 +8,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/check.h" #include "base/run_loop.h" @@ -17,6 +16,7 @@ #include "base/time/time.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/cloud/mock_cloud_external_data_manager.h"
diff --git a/chrome/browser/ash/policy/active_directory/component_active_directory_policy_browsertest.cc b/chrome/browser/ash/policy/active_directory/component_active_directory_policy_browsertest.cc index e6845b5..e3560e6 100644 --- a/chrome/browser/ash/policy/active_directory/component_active_directory_policy_browsertest.cc +++ b/chrome/browser/ash/policy/active_directory/component_active_directory_policy_browsertest.cc
@@ -5,7 +5,6 @@ #include <string> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -17,6 +16,7 @@ #include "chrome/common/chrome_paths.h" #include "chromeos/ash/components/dbus/login_manager/policy_descriptor.pb.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/core/common/cloud/test/policy_builder.h" #include "components/policy/core/common/policy_service.h"
diff --git a/chrome/browser/ash/policy/affiliation/user_affiliation_browsertest.cc b/chrome/browser/ash/policy/affiliation/user_affiliation_browsertest.cc index ef6464d..621da3c2 100644 --- a/chrome/browser/ash/policy/affiliation/user_affiliation_browsertest.cc +++ b/chrome/browser/ash/policy/affiliation/user_affiliation_browsertest.cc
@@ -6,7 +6,6 @@ #include <ostream> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback_helpers.h" @@ -24,6 +23,7 @@ #include "chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.h" #include "chromeos/ash/components/dbus/upstart/upstart_client.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/cloud/device_management_service.h"
diff --git a/chrome/browser/ash/policy/core/browser_policy_connector_ash.cc b/chrome/browser/ash/policy/core/browser_policy_connector_ash.cc index 231e5cc..d194be96 100644 --- a/chrome/browser/ash/policy/core/browser_policy_connector_ash.cc +++ b/chrome/browser/ash/policy/core/browser_policy_connector_ash.cc
@@ -13,7 +13,6 @@ #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" #include "ash/components/settings/timezone_settings.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_paths.h" #include "base/bind.h" #include "base/check.h" @@ -74,6 +73,7 @@ #include "chrome/common/pref_names.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "chromeos/ash/components/dbus/upstart/upstart_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/network/network_cert_loader.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/onc/onc_certificate_importer_impl.h"
diff --git a/chrome/browser/ash/policy/core/device_attributes_browsertest.cc b/chrome/browser/ash/policy/core/device_attributes_browsertest.cc index 5c2caf0..aab4cb5 100644 --- a/chrome/browser/ash/policy/core/device_attributes_browsertest.cc +++ b/chrome/browser/ash/policy/core/device_attributes_browsertest.cc
@@ -6,13 +6,13 @@ #include "base/run_loop.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.h" #include "chrome/browser/ash/policy/core/device_cloud_policy_store_ash.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part_ash.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/core/common/cloud/mock_cloud_policy_store.h" #include "components/policy/core/common/cloud/test/policy_builder.h"
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc index 9c04acf..6b778d2 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash.cc
@@ -9,7 +9,6 @@ #include <memory> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_paths.h" #include "ash/constants/ash_switches.h" @@ -43,6 +42,7 @@ #include "chrome/browser/ash/policy/uploading/system_log_uploader.h" #include "chrome/browser/browser_process.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/system/statistics_provider.h" #include "components/policy/core/common/cloud/cloud_external_data_manager.h" #include "components/policy/core/common/cloud/cloud_policy_core.h"
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc index 43d5ad9..f690fd3 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_manager_ash_unittest.cc
@@ -13,7 +13,6 @@ #include "ash/components/attestation/fake_certificate.h" #include "ash/components/attestation/mock_attestation_flow.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/callback_helpers.h" @@ -42,6 +41,7 @@ #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_install_attributes_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/system/fake_statistics_provider.h" #include "chromeos/system/statistics_provider.h"
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc index cb74b83..54ed342 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash.cc
@@ -6,7 +6,6 @@ #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" @@ -17,6 +16,7 @@ #include "chrome/browser/ash/policy/core/device_policy_decoder.h" #include "chrome/browser/ash/policy/dev_mode/dev_mode_policy_util.h" #include "chrome/browser/ash/policy/value_validation/onc_device_policy_value_validator.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/ownership/owner_key_util.h" #include "components/policy/core/common/cloud/cloud_external_data_manager.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc index abca4c5..b0bd3f3c 100644 --- a/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc +++ b/chrome/browser/ash/policy/core/device_cloud_policy_store_ash_unittest.cc
@@ -8,7 +8,6 @@ #include <memory> #include <string> -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -20,6 +19,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/userdataauth/fake_install_attributes_client.h" #include "chromeos/ash/components/dbus/userdataauth/install_attributes_util.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/components/onc/onc_test_utils.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/ash/policy/core/device_policy_cros_browser_test.cc b/chrome/browser/ash/policy/core/device_policy_cros_browser_test.cc index 30d3c206..0b517e76 100644 --- a/chrome/browser/ash/policy/core/device_policy_cros_browser_test.cc +++ b/chrome/browser/ash/policy/core/device_policy_cros_browser_test.cc
@@ -8,7 +8,6 @@ #include <string> -#include "ash/components/tpm/install_attributes.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/core/device_policy_builder.h" #include "chrome/browser/browser_process.h"
diff --git a/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc b/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc index 94399fd..78f1e72 100644 --- a/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc +++ b/chrome/browser/ash/policy/core/user_cloud_policy_manager_ash_unittest.cc
@@ -8,7 +8,6 @@ #include <utility> #include <vector> -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/callback.h" #include "base/callback_helpers.h" @@ -38,6 +37,7 @@ #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" #include "chromeos/ash/components/dbus/concierge/concierge_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/enterprise/browser/reporting/common_pref_names.h" #include "components/enterprise/browser/reporting/report_scheduler.h" #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
diff --git a/chrome/browser/ash/policy/core/user_policy_manager_builder_ash.cc b/chrome/browser/ash/policy/core/user_policy_manager_builder_ash.cc index f17a86ba..18a2160f 100644 --- a/chrome/browser/ash/policy/core/user_policy_manager_builder_ash.cc +++ b/chrome/browser/ash/policy/core/user_policy_manager_builder_ash.cc
@@ -7,7 +7,6 @@ #include <utility> #include "ash/components/arc/arc_features.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -34,6 +33,7 @@ #include "chrome/common/chrome_features.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" #include "chromeos/ash/components/dbus/userdataauth/cryptohome_misc_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/constants/dbus_paths.h" #include "components/policy/core/browser/browser_policy_connector.h" #include "components/policy/core/common/cloud/cloud_external_data_manager.h"
diff --git a/chrome/browser/ash/policy/enrollment/account_status_check_fetcher.cc b/chrome/browser/ash/policy/enrollment/account_status_check_fetcher.cc index 38930b2..9816ab6 100644 --- a/chrome/browser/ash/policy/enrollment/account_status_check_fetcher.cc +++ b/chrome/browser/ash/policy/enrollment/account_status_check_fetcher.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/guid.h" #include "base/logging.h" @@ -19,6 +18,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/net/system_network_context_manager.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/cloud/dm_auth.h"
diff --git a/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc b/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc index a2c0217..316aa21 100644 --- a/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc +++ b/chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.cc
@@ -8,7 +8,6 @@ #include <utility> #include "ash/components/cryptohome/cryptohome_parameters.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/logging.h" @@ -18,6 +17,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/net/system_network_context_manager.h" #include "chrome/common/chrome_content_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/system/statistics_provider.h" #include "components/policy/core/common/cloud/cloud_policy_core.h" #include "components/policy/core/common/cloud/device_management_service.h"
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_config.cc b/chrome/browser/ash/policy/enrollment/enrollment_config.cc index a23b43c..d9740c1 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_config.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_config.cc
@@ -6,7 +6,6 @@ #include <string> -#include "ash/components/tpm/install_attributes.h" #include "base/logging.h" #include "base/values.h" #include "chrome/browser/ash/login/login_pref_names.h" @@ -16,6 +15,7 @@ #include "chrome/browser/ash/policy/server_backed_state/server_backed_device_state.h" #include "chrome/browser/browser_process.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/system/statistics_provider.h" #include "components/prefs/pref_service.h" #include "third_party/abseil-cpp/absl/types/optional.h"
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_config_unittest.cc b/chrome/browser/ash/policy/enrollment/enrollment_config_unittest.cc index d0bdb36..ebd6745 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_config_unittest.cc +++ b/chrome/browser/ash/policy/enrollment/enrollment_config_unittest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/policy/enrollment/device_cloud_policy_initializer.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/command_line.h" #include "base/test/task_environment.h" @@ -14,6 +13,7 @@ #include "chrome/browser/ash/policy/server_backed_state/server_backed_device_state.h" #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/system/fake_statistics_provider.h" #include "chromeos/system/statistics_provider.h" #include "components/prefs/testing_pref_service.h"
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_handler.h b/chrome/browser/ash/policy/enrollment/enrollment_handler.h index b5c4ed3..26cf6d1 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_handler.h +++ b/chrome/browser/ash/policy/enrollment/enrollment_handler.h
@@ -8,7 +8,6 @@ #include <memory> #include <string> -#include "ash/components/tpm/install_attributes.h" #include "base/callback.h" #include "base/callback_forward.h" #include "base/memory/ref_counted.h" @@ -18,6 +17,7 @@ #include "chrome/browser/policy/device_account_initializer.h" #include "chromeos/ash/components/dbus/authpolicy/authpolicy_client.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/constants/attestation_constants.h" #include "components/policy/core/common/cloud/cloud_policy_client.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/ash/policy/enrollment/enrollment_status.h b/chrome/browser/ash/policy/enrollment/enrollment_status.h index 5f676f8..3012a46 100644 --- a/chrome/browser/ash/policy/enrollment/enrollment_status.h +++ b/chrome/browser/ash/policy/enrollment/enrollment_status.h
@@ -11,7 +11,7 @@ #include "components/policy/core/common/cloud/cloud_policy_validator.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/install_attributes.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #endif namespace policy {
diff --git a/chrome/browser/ash/policy/fuzzer/policy_fuzzer.cc b/chrome/browser/ash/policy/fuzzer/policy_fuzzer.cc index 4755ed6..f09685d 100644 --- a/chrome/browser/ash/policy/fuzzer/policy_fuzzer.cc +++ b/chrome/browser/ash/policy/fuzzer/policy_fuzzer.cc
@@ -4,7 +4,6 @@ #include <string> -#include "ash/components/tpm/install_attributes.h" #include "base/at_exit.h" #include "base/check_op.h" #include "base/command_line.h" @@ -25,6 +24,7 @@ #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/policy/configuration_policy_handler_list_factory.h" #include "chrome/common/chrome_paths.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/policy/core/browser/configuration_policy_handler_list.h" #include "components/policy/core/browser/policy_conversions_client.h" #include "components/policy/core/browser/policy_error_map.h"
diff --git a/chrome/browser/ash/policy/handlers/device_i18n_shortcuts_enabled_browsertest.cc b/chrome/browser/ash/policy/handlers/device_i18n_shortcuts_enabled_browsertest.cc index 23642752..d975d72 100644 --- a/chrome/browser/ash/policy/handlers/device_i18n_shortcuts_enabled_browsertest.cc +++ b/chrome/browser/ash/policy/handlers/device_i18n_shortcuts_enabled_browsertest.cc
@@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_pref_names.h" #include "base/run_loop.h" #include "chrome/browser/ash/policy/core/device_policy_builder.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" #include "chrome/browser/browser_process.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/prefs/pref_observer.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl.cc b/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl.cc index edf4a80..817ba005 100644 --- a/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl.cc +++ b/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl.cc
@@ -6,13 +6,13 @@ #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "base/bind.h" #include "chrome/browser/ash/policy/core/browser_policy_connector_ash.h" #include "chrome/browser/ash/policy/handlers/device_name_policy_handler_name_generator.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/network/device_state.h" namespace policy {
diff --git a/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc b/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc index 4bcbe260..61428de4 100644 --- a/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc +++ b/chrome/browser/ash/policy/handlers/device_name_policy_handler_impl_unittest.cc
@@ -4,12 +4,12 @@ #include "chrome/browser/ash/policy/handlers/device_name_policy_handler_impl.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "chrome/browser/ash/settings/scoped_testing_cros_settings.h" #include "chrome/browser/ash/settings/stub_cros_settings_provider.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/system/fake_statistics_provider.h" #include "components/policy/core/common/cloud/test/policy_builder.h"
diff --git a/chrome/browser/ash/policy/handlers/device_system_wide_tracing_enabled_browsertest.cc b/chrome/browser/ash/policy/handlers/device_system_wide_tracing_enabled_browsertest.cc index 0e64906a..4bd40ea 100644 --- a/chrome/browser/ash/policy/handlers/device_system_wide_tracing_enabled_browsertest.cc +++ b/chrome/browser/ash/policy/handlers/device_system_wide_tracing_enabled_browsertest.cc
@@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_pref_names.h" #include "base/run_loop.h" #include "chrome/browser/ash/policy/core/device_policy_builder.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/tracing/chrome_tracing_delegate.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/prefs/pref_observer.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc index e51fcdf..64f644f 100644 --- a/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc +++ b/chrome/browser/ash/policy/handlers/minimum_version_policy_handler_unittest.cc
@@ -7,7 +7,6 @@ #include <memory> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/run_loop.h" #include "base/test/bind.h" @@ -23,6 +22,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/dbus/shill/shill_service_client.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler_unittest.cc b/chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler_unittest.cc index 59c7167b..b1c5e57 100644 --- a/chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler_unittest.cc +++ b/chrome/browser/ash/policy/handlers/tpm_auto_update_mode_policy_handler_unittest.cc
@@ -7,7 +7,6 @@ #include <utility> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/callback_helpers.h" #include "base/memory/ptr_util.h" @@ -21,6 +20,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/account_id/account_id.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/policy/login/blocking_login_browsertest.cc b/chrome/browser/ash/policy/login/blocking_login_browsertest.cc index 31d22b60..7df0b91 100644 --- a/chrome/browser/ash/policy/login/blocking_login_browsertest.cc +++ b/chrome/browser/ash/policy/login/blocking_login_browsertest.cc
@@ -5,7 +5,6 @@ #include <string> #include <vector> -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -21,6 +20,7 @@ #include "chrome/browser/ui/webui/chromeos/login/signin_screen_handler.h" #include "chrome/common/chrome_switches.h" #include "chrome/test/base/in_process_browser_test.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/policy/core/common/cloud/device_management_service.h" #include "components/policy/core/common/policy_switches.h" #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc index cd0e8f6..3997855 100644 --- a/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc +++ b/chrome/browser/ash/policy/reporting/metrics_reporting/network/network_telemetry_sampler.cc
@@ -78,14 +78,19 @@ NetworkConnectionState GetNetworkConnectionState( const ash::NetworkState* network) { - if (network->IsConnectedState() && network->IsCaptivePortal()) { - return NetworkConnectionState::PORTAL; - } - if (network->IsConnectedState() && network->IsOnline()) { - return NetworkConnectionState::ONLINE; - } if (network->IsConnectedState()) { - return NetworkConnectionState::CONNECTED; + auto portal_state = network->GetPortalState(); + switch (portal_state) { + case ash::NetworkState::PortalState::kUnknown: + return NetworkConnectionState::CONNECTED; + case ash::NetworkState::PortalState::kOnline: + return NetworkConnectionState::ONLINE; + case ash::NetworkState::PortalState::kPortalSuspected: + case ash::NetworkState::PortalState::kPortal: + case ash::NetworkState::PortalState::kProxyAuthRequired: + case ash::NetworkState::PortalState::kNoInternet: + return NetworkConnectionState::PORTAL; + } } if (network->IsConnectingState()) { return NetworkConnectionState::CONNECTING;
diff --git a/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc b/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc index 786da2fd..06ab501 100644 --- a/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc +++ b/chrome/browser/ash/policy/scheduled_task_handler/test/device_scheduled_update_checker_unittest.cc
@@ -11,7 +11,6 @@ #include <utility> #include "ash/components/settings/timezone_settings.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/callback_helpers.h" #include "base/json/json_reader.h" #include "base/logging.h" @@ -36,6 +35,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/ash/components/network/network_state_test_helper.h"
diff --git a/chrome/browser/ash/policy/server_backed_state/active_directory_device_state_uploader.cc b/chrome/browser/ash/policy/server_backed_state/active_directory_device_state_uploader.cc index 1326261..374f69e1 100644 --- a/chrome/browser/ash/policy/server_backed_state/active_directory_device_state_uploader.cc +++ b/chrome/browser/ash/policy/server_backed_state/active_directory_device_state_uploader.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/logging.h" #include "chrome/browser/ash/attestation/enrollment_certificate_uploader_impl.h" @@ -19,6 +18,7 @@ #include "chrome/common/pref_names.h" #include "chromeos/ash/components/dbus/login_manager/policy_descriptor.pb.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/policy/core/common/cloud/cloud_policy_client.h" #include "components/policy/core/common/cloud/dmserver_job_configurations.h" #include "components/prefs/pref_registry_simple.h"
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc index 781acfa..46d67630 100644 --- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc +++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -18,7 +18,6 @@ #include "ash/components/disks/mock_disk_mount_manager.h" #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/timezone_settings.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/environment.h" @@ -74,6 +73,7 @@ #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" #include "chromeos/ash/components/dbus/userdataauth/userdataauth_client.h" #include "chromeos/ash/components/dbus/vm_applications/apps.pb.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/ash/components/network/network_state.h"
diff --git a/chrome/browser/ash/printing/cups_printers_manager_unittest.cc b/chrome/browser/ash/printing/cups_printers_manager_unittest.cc index f59200d..6c96846c 100644 --- a/chrome/browser/ash/printing/cups_printers_manager_unittest.cc +++ b/chrome/browser/ash/printing/cups_printers_manager_unittest.cc
@@ -680,7 +680,7 @@ // SavePrinter() will simply do nothing. TEST_F(CupsPrintersManagerTest, SavePrinterUserNativePrintersDisabled) { // Start by installing a saved printer to be used to test than any - // changes made to the printer will not be propogated. + // changes made to the printer will not be propagated. Printer existing_saved("Saved"); synced_printers_manager_.AddSavedPrinters({existing_saved}); usb_detector_->AddDetections({MakeDiscoveredPrinter("Discovered")});
diff --git a/chrome/browser/ash/settings/cros_settings_unittest.cc b/chrome/browser/ash/settings/cros_settings_unittest.cc index 1409f7e6..e030d4c 100644 --- a/chrome/browser/ash/settings/cros_settings_unittest.cc +++ b/chrome/browser/ash/settings/cros_settings_unittest.cc
@@ -9,7 +9,6 @@ #include <string> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/memory/weak_ptr.h" @@ -26,6 +25,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/ownership/mock_owner_key_util.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/policy/proto/chrome_device_policy.pb.h"
diff --git a/chrome/browser/ash/settings/device_settings_provider.cc b/chrome/browser/ash/settings/device_settings_provider.cc index 3a5953b..d488a20 100644 --- a/chrome/browser/ash/settings/device_settings_provider.cc +++ b/chrome/browser/ash/settings/device_settings_provider.cc
@@ -11,7 +11,6 @@ #include <utility> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/callback.h" @@ -33,6 +32,7 @@ #include "chrome/browser/ash/settings/hardware_data_usage_controller.h" #include "chrome/browser/ash/settings/stats_reporting_controller.h" #include "chrome/browser/ash/tpm_firmware_update.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "components/policy/core/common/chrome_schema.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/chrome/browser/ash/settings/device_settings_provider_unittest.cc b/chrome/browser/ash/settings/device_settings_provider_unittest.cc index 799df139d..57a1b53 100644 --- a/chrome/browser/ash/settings/device_settings_provider_unittest.cc +++ b/chrome/browser/ash/settings/device_settings_provider_unittest.cc
@@ -9,7 +9,6 @@ #include <utility> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_features.h" #include "base/bind.h" #include "base/callback.h" @@ -27,6 +26,7 @@ #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/core/common/cloud/test/policy_builder.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/policy/proto/device_management_backend.pb.h"
diff --git a/chrome/browser/ash/settings/scoped_cros_settings_test_helper.h b/chrome/browser/ash/settings/scoped_cros_settings_test_helper.h index 2d625a84..04a9f7f 100644 --- a/chrome/browser/ash/settings/scoped_cros_settings_test_helper.h +++ b/chrome/browser/ash/settings/scoped_cros_settings_test_helper.h
@@ -9,9 +9,9 @@ #include <string> #include "ash/components/settings/cros_settings_provider.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/settings/stub_cros_settings_provider.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" class Profile;
diff --git a/chrome/browser/ash/shortcut_mapping_pref_service.cc b/chrome/browser/ash/shortcut_mapping_pref_service.cc index 3fcd0b3..44cce46 100644 --- a/chrome/browser/ash/shortcut_mapping_pref_service.cc +++ b/chrome/browser/ash/shortcut_mapping_pref_service.cc
@@ -4,9 +4,9 @@ #include "chrome/browser/ash/shortcut_mapping_pref_service.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_pref_names.h" #include "chrome/browser/browser_process.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/prefs/pref_service.h" namespace ash {
diff --git a/chrome/browser/ash/system/device_disabling_manager.cc b/chrome/browser/ash/system/device_disabling_manager.cc index 6d118e1..330fae8 100644 --- a/chrome/browser/ash/system/device_disabling_manager.cc +++ b/chrome/browser/ash/system/device_disabling_manager.cc
@@ -6,7 +6,6 @@ #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" #include "base/command_line.h" @@ -18,6 +17,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/system/statistics_provider.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/system/timezone_util.cc b/chrome/browser/ash/system/timezone_util.cc index 0fb87c1..4b1d049 100644 --- a/chrome/browser/ash/system/timezone_util.cc +++ b/chrome/browser/ash/system/timezone_util.cc
@@ -12,7 +12,6 @@ #include "ash/components/settings/timezone_settings.h" #include "ash/components/timezone/timezone_request.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_switches.h" #include "base/command_line.h" #include "base/i18n/rtl.h" @@ -31,6 +30,7 @@ #include "chrome/browser/profiles/profile_manager.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/prefs/pref_service.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/ash/tpm_firmware_update_unittest.cc b/chrome/browser/ash/tpm_firmware_update_unittest.cc index 660df525..19812f3 100644 --- a/chrome/browser/ash/tpm_firmware_update_unittest.cc +++ b/chrome/browser/ash/tpm_firmware_update_unittest.cc
@@ -7,7 +7,6 @@ #include <utility> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/callback.h" #include "base/files/file_util.h" @@ -21,6 +20,7 @@ #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_paths.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/system/fake_statistics_provider.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "testing/gmock/include/gmock/gmock-matchers.h"
diff --git a/chrome/browser/autofill/autofill_uitest_util.cc b/chrome/browser/autofill/autofill_uitest_util.cc index b7333ee..b788a4c 100644 --- a/chrome/browser/autofill/autofill_uitest_util.cc +++ b/chrome/browser/autofill/autofill_uitest_util.cc
@@ -14,7 +14,9 @@ #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/personal_data_manager_observer.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "content/public/test/test_utils.h" +#include "testing/gtest/include/gtest/gtest.h" namespace autofill { @@ -137,9 +139,13 @@ ContentAutofillDriver* driver = static_cast<ContentAutofillDriver*>( absl::get<AutofillDriver*>(autofill_external_delegate->GetDriver())); + TestAutofillManagerWaiter waiter( + *driver->autofill_manager(), + {&AutofillManager::Observer::OnAfterAskForValuesToFill}); driver->AskForValuesToFill(form, form.fields.front(), bounds, query_id, /*autoselect_first_suggestion=*/false, TouchToFillEligible(false)); + ASSERT_TRUE(waiter.Wait()); std::vector<Suggestion> suggestions = {Suggestion(u"Test suggestion")}; autofill_external_delegate->OnSuggestionsReturned(
diff --git a/chrome/browser/autofill/form_structure_browsertest.cc b/chrome/browser/autofill/form_structure_browsertest.cc index 918538d..a6a57bd 100644 --- a/chrome/browser/autofill/form_structure_browsertest.cc +++ b/chrome/browser/autofill/form_structure_browsertest.cc
@@ -17,6 +17,7 @@ #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" #include "build/build_config.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" @@ -25,9 +26,11 @@ #include "chrome/test/base/ui_test_utils.h" #include "components/autofill/content/browser/content_autofill_driver.h" #include "components/autofill/content/browser/content_autofill_driver_factory.h" +#include "components/autofill/content/browser/test_autofill_manager_injector.h" #include "components/autofill/core/browser/autofill_experiments.h" #include "components/autofill/core/browser/browser_autofill_manager.h" #include "components/autofill/core/browser/form_structure.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" #include "components/autofill/core/common/unique_ids.h" @@ -163,16 +166,38 @@ // DataDrivenTest: void GenerateResults(const std::string& input, std::string* output) override; - private: - std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request); + content::WebContents* web_contents() { + return browser()->tab_strip_model()->GetActiveWebContents(); + } - base::test::ScopedFeatureList feature_list_; + private: + class TestAutofillManager : public BrowserAutofillManager { + public: + TestAutofillManager(ContentAutofillDriver* driver, AutofillClient* client) + : BrowserAutofillManager(driver, + client, + "en-US", + EnableDownloadManager(false)) {} + + TestAutofillManagerWaiter& waiter() { return waiter_; } + + private: + TestAutofillManagerWaiter waiter_{ + *this, + {&AutofillManager::Observer::OnAfterFormsSeen}}; + }; + + std::unique_ptr<HttpResponse> HandleRequest(const HttpRequest& request); // The response content to be returned by the embedded test server. Note that // this is populated in the main thread as a part of the setup in the // GenerateResults method but it is consumed later in the IO thread by the // embedded test server to generate the response. std::string html_content_; + + std::unique_ptr<TestAutofillManagerInjector<TestAutofillManager>> + autofill_manager_injector_; + base::test::ScopedFeatureList feature_list_; }; FormStructureBrowserTest::FormStructureBrowserTest() @@ -218,6 +243,10 @@ void FormStructureBrowserTest::SetUpOnMainThread() { InProcessBrowserTest::SetUpOnMainThread(); + autofill_manager_injector_ = + std::make_unique<TestAutofillManagerInjector<TestAutofillManager>>( + web_contents()); + embedded_test_server()->RegisterRequestHandler(base::BindRepeating( &FormStructureBrowserTest::HandleRequest, base::Unretained(this))); ASSERT_TRUE(embedded_test_server()->Start()); @@ -238,19 +267,13 @@ html_content_.push_back(c); } - // Navigate to the test html content. ASSERT_NO_FATAL_FAILURE(ASSERT_TRUE(ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/test.html")))); // Dump the form fields (and their inferred field types). - content::WebContents* web_contents = - browser()->tab_strip_model()->GetActiveWebContents(); - ContentAutofillDriver* autofill_driver = - ContentAutofillDriverFactory::FromWebContents(web_contents) - ->DriverForFrame(web_contents->GetPrimaryMainFrame()); - ASSERT_NE(nullptr, autofill_driver); - AutofillManager* autofill_manager = autofill_driver->autofill_manager(); - ASSERT_NE(nullptr, autofill_manager); + TestAutofillManager* autofill_manager = + autofill_manager_injector_->GetForPrimaryMainFrame(); + ASSERT_TRUE(autofill_manager->waiter().Wait(1)); *output = FormStructuresToString(autofill_manager->form_structures()); }
diff --git a/chrome/browser/background_fetch/background_fetch_browsertest.cc b/chrome/browser/background_fetch/background_fetch_browsertest.cc index ac0e0f7..491cf2d 100644 --- a/chrome/browser/background_fetch/background_fetch_browsertest.cc +++ b/chrome/browser/background_fetch/background_fetch_browsertest.cc
@@ -119,21 +119,24 @@ } // download::Logger::Observer implementation: - void OnServiceStatusChanged(const base::Value& service_status) override {} + void OnServiceStatusChanged( + const base::Value::Dict& service_status) override {} void OnServiceDownloadsAvailable( - const base::Value& service_downloads) override {} - void OnServiceDownloadChanged(const base::Value& service_download) override {} - void OnServiceDownloadFailed(const base::Value& service_download) override {} - void OnServiceRequestMade(const base::Value& service_request) override { - const std::string& client = service_request.FindKey("client")->GetString(); - const std::string& guid = service_request.FindKey("guid")->GetString(); - const std::string& result = service_request.FindKey("result")->GetString(); + const base::Value::List& service_downloads) override {} + void OnServiceDownloadChanged( + const base::Value::Dict& service_download) override {} + void OnServiceDownloadFailed( + const base::Value::Dict& service_download) override {} + void OnServiceRequestMade(const base::Value::Dict& service_request) override { + const std::string* client = service_request.FindString("client"); + const std::string* guid = service_request.FindString("guid"); + const std::string* result = service_request.FindString("result"); - if (client != kBackgroundFetchClient) + if (*client != kBackgroundFetchClient) return; // This event is not targeted to us. - if (result == kResultAccepted && download_accepted_callback_) - std::move(download_accepted_callback_).Run(guid); + if (*result == kResultAccepted && download_accepted_callback_) + std::move(download_accepted_callback_).Run(*guid); } private:
diff --git a/chrome/browser/chromeos/BUILD.gn b/chrome/browser/chromeos/BUILD.gn index 4fbbe15..769908a 100644 --- a/chrome/browser/chromeos/BUILD.gn +++ b/chrome/browser/chromeos/BUILD.gn
@@ -311,6 +311,7 @@ "//chromeos/ash/components/dbus/vm_plugin_dispatcher:proto", "//chromeos/ash/components/feature_usage", "//chromeos/ash/components/hibernate:buildflags", + "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/memory", "//chromeos/ash/components/network", @@ -3056,7 +3057,7 @@ "../ash/input_method/ui/input_method_menu_manager_unittest.cc", "../ash/input_method/ui/suggestion_window_view_unittest.cc", "../ash/input_method/ui/undo_window_unittest.cc", - "../ash/kerberos/kerberos_credentials_manager_test.cc", + "../ash/kerberos/kerberos_credentials_manager_unittest.cc", "../ash/kerberos/kerberos_ticket_expiry_notification_test.cc", "../ash/locale_change_guard_unittest.cc", "../ash/lock_screen_apps/app_manager_impl_unittest.cc", @@ -3590,7 +3591,6 @@ "//ash/components/settings", "//ash/components/tether:test_support", "//ash/components/tpm", - "//ash/components/tpm:test_support", "//ash/constants", "//ash/public/cpp", "//ash/public/cpp:test_support", @@ -3644,6 +3644,7 @@ "//chromeos/ash/components/dbus/upstart", "//chromeos/ash/components/dbus/virtual_file_provider", "//chromeos/ash/components/dbus/vm_plugin_dispatcher", + "//chromeos/ash/components/install_attributes:test_support", "//chromeos/ash/components/network", "//chromeos/ash/components/network:test_support", "//chromeos/ash/components/network/portal_detector:test_support",
diff --git a/chrome/browser/chromeos/extensions/info_private_apitest.cc b/chrome/browser/chromeos/extensions/info_private_apitest.cc index dac3f7d..7f51fd8a0 100644 --- a/chrome/browser/chromeos/extensions/info_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/info_private_apitest.cc
@@ -4,7 +4,6 @@ #include "ash/components/arc/test/arc_util_test_support.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/stylus_utils.h" @@ -17,6 +16,7 @@ #include "chrome/browser/ui/browser_window.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/pref_names.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/prefs/pref_service.h" #include "content/public/test/browser_test.h" #include "ui/aura/window.h"
diff --git a/chrome/browser/chromeos/extensions/install_limiter_unittest.cc b/chrome/browser/chromeos/extensions/install_limiter_unittest.cc index 00de384..a2ecd1d 100644 --- a/chrome/browser/chromeos/extensions/install_limiter_unittest.cc +++ b/chrome/browser/chromeos/extensions/install_limiter_unittest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/chromeos/extensions/install_limiter.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/files/file_path.h" #include "base/files/file_util.h" #include "base/test/task_environment.h" @@ -16,6 +15,7 @@ #include "chrome/browser/extensions/crx_installer.h" #include "chrome/browser/extensions/extension_service.h" #include "chrome/browser/extensions/extension_service_test_base.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/user_manager/scoped_user_manager.h" #include "content/public/browser/notification_service.h" #include "content/public/test/browser_task_environment.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler.cc b/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler.cc index e9445ea..cdc3dc1 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler.cc
@@ -7,7 +7,6 @@ #include <algorithm> #include <iterator> -#include "ash/components/tpm/install_attributes.h" #include "ash/public/cpp/login_screen.h" #include "ash/public/cpp/login_screen_model.h" #include "ash/public/cpp/login_types.h" @@ -15,6 +14,7 @@ #include "chrome/browser/ash/login/ui/login_screen_extension_ui/window.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/profiles/profile.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/session_manager/core/session_manager.h" #include "content/public/browser/browser_thread.h" #include "extensions/common/constants.h"
diff --git a/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler_unittest.cc b/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler_unittest.cc index 3483194..40c091f 100644 --- a/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler_unittest.cc +++ b/chrome/browser/chromeos/extensions/login_screen/login_screen_ui/ui_handler_unittest.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "ash/components/tpm/stub_install_attributes.h" #include "base/test/gtest_util.h" #include "base/test/mock_callback.h" #include "chrome/browser/ash/login/ui/login_screen_extension_ui/create_options.h" @@ -16,6 +15,7 @@ #include "chrome/common/chrome_constants.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/session_manager/core/session_manager.h" #include "components/version_info/version_info.h" #include "content/public/test/browser_task_environment.h"
diff --git a/chrome/browser/chromeos/extensions/users_private/users_private_apitest.cc b/chrome/browser/chromeos/extensions/users_private/users_private_apitest.cc index a189606c..05206c19 100644 --- a/chrome/browser/chromeos/extensions/users_private/users_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/users_private/users_private_apitest.cc
@@ -6,7 +6,6 @@ #include <vector> #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/command_line.h" #include "base/memory/ptr_util.h" @@ -24,6 +23,7 @@ #include "chrome/browser/extensions/extension_apitest.h" #include "chrome/common/chrome_switches.h" #include "chrome/common/extensions/api/users_private.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/keyed_service/core/keyed_service.h" #include "components/ownership/mock_owner_key_util.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/client_hints/client_hints_browsertest.cc b/chrome/browser/client_hints/client_hints_browsertest.cc index 574609a..96d8cd0 100644 --- a/chrome/browser/client_hints/client_hints_browsertest.cc +++ b/chrome/browser/client_hints/client_hints_browsertest.cc
@@ -509,8 +509,7 @@ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); feature_list->InitializeFromCommandLine( "UserAgentClientHint,CriticalClientHint," - "AcceptCHFrame,PrefersColorSchemeClientHintHeader," - "ViewportHeightClientHintHeader", + "AcceptCHFrame,PrefersColorSchemeClientHintHeader", ""); return feature_list; } @@ -3027,9 +3026,7 @@ std::unique_ptr<base::FeatureList> feature_list(new base::FeatureList); feature_list->InitializeFromCommandLine( - "UserAgentClientHint,PrefersColorSchemeClientHintHeader," - "ViewportHeightClientHintHeader", - ""); + "UserAgentClientHint,PrefersColorSchemeClientHintHeader", ""); feature_list->RegisterFieldTrialOverride( features::kNetworkQualityEstimatorWebHoldback.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get());
diff --git a/chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos_unittest.cc b/chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos_unittest.cc index 2042f1beb..3bd71bf 100644 --- a/chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos_unittest.cc +++ b/chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos_unittest.cc
@@ -5,7 +5,6 @@ #include "chrome/browser/device_identity/chromeos/device_oauth2_token_store_chromeos.h" #include "ash/components/cryptohome/system_salt_getter.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/run_loop.h" #include "base/task/thread_pool/thread_pool_instance.h" #include "base/test/bind.h" @@ -19,6 +18,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/session_manager/fake_session_manager_client.h" #include "chromeos/ash/components/dbus/userdataauth/fake_cryptohome_misc_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/ownership/mock_owner_key_util.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_utils.h"
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm index 2306020..58ba9cc 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_client_impl.mm
@@ -28,6 +28,12 @@ namespace { +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Issues the SecAccessCreate API to create the ACL for the secure key. // This ACL allows all Chrome applications access to modify this key // so all Chrome applications can perform the mac key rotation process. @@ -46,6 +52,8 @@ return access_ref; } +#pragma clang diagnostic pop + // Creates and returns the secure enclave private key attributes used // for key creation. base::ScopedCFTypeRef<CFMutableDictionaryRef> CreateAttributesForKey() {
diff --git a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm index f9363288..f8bab1a 100644 --- a/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm +++ b/chrome/browser/enterprise/connectors/device_trust/key_management/core/mac/secure_enclave_helper_impl.mm
@@ -41,6 +41,12 @@ return key != nullptr; } +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + bool SecureEnclaveHelperImpl::CheckKeychainUnlocked() { base::ScopedCFTypeRef<SecKeychainRef> keychain; auto status = SecKeychainCopyDefault(keychain.InitializeInto()); @@ -55,6 +61,8 @@ return keychain_status & kSecUnlockStateStatus; } +#pragma clang diagnostic pop + bool SecureEnclaveHelperImpl::IsSecureEnclaveSupported() { base::scoped_nsobject<TKTokenWatcher> token_watcher( [[TKTokenWatcher alloc] init]);
diff --git a/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc b/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc index a80a81d..7690c58 100644 --- a/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc +++ b/chrome/browser/enterprise/connectors/reporting/realtime_reporting_client_unittest.cc
@@ -31,11 +31,11 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/login/users/scoped_test_user_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/keychain_data_helper_mac.mm b/chrome/browser/extensions/api/enterprise_reporting_private/keychain_data_helper_mac.mm index ca810f8..05e95be 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/keychain_data_helper_mac.mm +++ b/chrome/browser/extensions/api/enterprise_reporting_private/keychain_data_helper_mac.mm
@@ -15,6 +15,12 @@ namespace extensions { namespace { +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Creates an access for a generic password item to share it with other Google // applications with teamid:EQHXZ8M8AV (taken from the signing certificate). OSStatus CreateTargetAccess(NSString* service_name, SecAccessRef* access_ref) { @@ -116,4 +122,6 @@ return VerifyKeychainUnlocked(keychain, unlocked); } +#pragma clang diagnostic pop + } // namespace extensions
diff --git a/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.h b/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.h index 95e2dd47..f6a400f5 100644 --- a/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.h +++ b/chrome/browser/extensions/api/force_installed_affiliated_extension_apitest.h
@@ -7,7 +7,6 @@ #include <string> -#include "ash/components/tpm/stub_install_attributes.h" #include "base/values.h" #include "chrome/browser/ash/login/test/cryptohome_mixin.h" #include "chrome/browser/ash/policy/affiliation/affiliation_mixin.h" @@ -15,6 +14,7 @@ #include "chrome/browser/extensions/mixin_based_extension_apitest.h" #include "chrome/browser/policy/extension_force_install_mixin.h" #include "chrome/test/base/mixin_based_in_process_browser_test.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "extensions/common/extension_id.h" #include "url/gurl.h"
diff --git a/chrome/browser/extensions/api/identity/identity_apitest.cc b/chrome/browser/extensions/api/identity/identity_apitest.cc index 363452f..cf2a1e5 100644 --- a/chrome/browser/extensions/api/identity/identity_apitest.cc +++ b/chrome/browser/extensions/api/identity/identity_apitest.cc
@@ -84,9 +84,9 @@ #include "url/gurl.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/login/users/mock_user_manager.h" #include "chrome/browser/ash/net/network_portal_detector_test_impl.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_state.h" #include "chromeos/ash/components/network/network_state_handler.h"
diff --git a/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h b/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h index eeac4c4..594b882 100644 --- a/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h +++ b/chrome/browser/extensions/api/platform_keys/platform_keys_test_base.h
@@ -7,10 +7,10 @@ #include <memory> -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/login/test/cryptohome_mixin.h" #include "chrome/browser/ash/policy/core/device_policy_cros_browser_test.h" #include "chrome/browser/extensions/mixin_based_extension_apitest.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "components/policy/core/common/mock_configuration_policy_provider.h" #include "google_apis/gaia/fake_gaia.h"
diff --git a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc index 8fb0f8a..58992a4 100644 --- a/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc +++ b/chrome/browser/extensions/api/safe_browsing_private/safe_browsing_private_event_router_unittest.cc
@@ -48,11 +48,11 @@ #include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/login/users/scoped_test_user_manager.h" #include "chrome/browser/ash/profiles/profile_helper.h" #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user.h"
diff --git a/chrome/browser/extensions/chrome_extension_browser_constants.cc b/chrome/browser/extensions/chrome_extension_browser_constants.cc index 8060d14..32e3ed9 100644 --- a/chrome/browser/extensions/chrome_extension_browser_constants.cc +++ b/chrome/browser/extensions/chrome_extension_browser_constants.cc
@@ -10,4 +10,8 @@ const char kRuntimeHostPermissionsHelpURL[] = "https://support.google.com/chrome?p=enable_extensions"; +// The link to the site permissions settings page. +const char kExtensionsSitePermissionsURL[] = + "chrome://extensions/sitePermissions"; + } // namespace chrome_extension_constants
diff --git a/chrome/browser/extensions/chrome_extension_browser_constants.h b/chrome/browser/extensions/chrome_extension_browser_constants.h index 0ddb3d6..b7e343d 100644 --- a/chrome/browser/extensions/chrome_extension_browser_constants.h +++ b/chrome/browser/extensions/chrome_extension_browser_constants.h
@@ -10,6 +10,7 @@ namespace chrome_extension_constants { extern const char kRuntimeHostPermissionsHelpURL[]; +extern const char kExtensionsSitePermissionsURL[]; } // namespace chrome_extension_constants
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.cc b/chrome/browser/extensions/chrome_extensions_browser_client.cc index e2af634..db935ee 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.cc +++ b/chrome/browser/extensions/chrome_extensions_browser_client.cc
@@ -714,10 +714,9 @@ Profile::FromBrowserContext(browser_context), extension); } -std::unique_ptr<const PermissionSet> -ChromeExtensionsBrowserClient::AddAdditionalAllowedHosts( +void ChromeExtensionsBrowserClient::AddAdditionalAllowedHosts( const PermissionSet& desired_permissions, - const PermissionSet& granted_permissions) const { + PermissionSet* granted_permissions) const { auto get_new_host_patterns = [](const URLPatternSet& desired_patterns, const URLPatternSet& granted_patterns) { URLPatternSet new_patterns = granted_patterns.Clone(); @@ -738,15 +737,12 @@ URLPatternSet new_explicit_hosts = get_new_host_patterns(desired_permissions.explicit_hosts(), - granted_permissions.explicit_hosts()); + granted_permissions->explicit_hosts()); URLPatternSet new_scriptable_hosts = get_new_host_patterns(desired_permissions.scriptable_hosts(), - granted_permissions.scriptable_hosts()); - - return std::make_unique<PermissionSet>( - granted_permissions.apis().Clone(), - granted_permissions.manifest_permissions().Clone(), - std::move(new_explicit_hosts), std::move(new_scriptable_hosts)); + granted_permissions->scriptable_hosts()); + granted_permissions->SetExplicitHosts(std::move(new_explicit_hosts)); + granted_permissions->SetScriptableHosts(std::move(new_scriptable_hosts)); } } // namespace extensions
diff --git a/chrome/browser/extensions/chrome_extensions_browser_client.h b/chrome/browser/extensions/chrome_extensions_browser_client.h index 88df9d8..675b68a 100644 --- a/chrome/browser/extensions/chrome_extensions_browser_client.h +++ b/chrome/browser/extensions/chrome_extensions_browser_client.h
@@ -193,9 +193,9 @@ std::vector<content::BrowserContext*> GetRelatedContextsForExtension( content::BrowserContext* browser_context, const Extension& extension) const override; - std::unique_ptr<const PermissionSet> AddAdditionalAllowedHosts( + void AddAdditionalAllowedHosts( const PermissionSet& desired_permissions, - const PermissionSet& granted_permissions) const override; + PermissionSet* granted_permissions) const override; private: friend struct base::LazyInstanceTraitsBase<ChromeExtensionsBrowserClient>;
diff --git a/chrome/browser/extensions/extension_context_menu_model.cc b/chrome/browser/extensions/extension_context_menu_model.cc index 0ccd4872..cd35c90 100644 --- a/chrome/browser/extensions/extension_context_menu_model.cc +++ b/chrome/browser/extensions/extension_context_menu_model.cc
@@ -8,6 +8,7 @@ #include "base/bind.h" #include "base/containers/contains.h" +#include "base/feature_list.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" @@ -49,6 +50,7 @@ #include "extensions/browser/permissions_manager.h" #include "extensions/browser/uninstall_reason.h" #include "extensions/common/extension.h" +#include "extensions/common/extension_features.h" #include "extensions/common/manifest_handlers/options_page_info.h" #include "extensions/common/manifest_url_handlers.h" #include "ui/base/l10n/l10n_util.h" @@ -144,6 +146,8 @@ return ContextMenuAction::kPageAccessRunOnSite; case ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_ALL_SITES: return ContextMenuAction::kPageAccessRunOnAllSites; + case ExtensionContextMenuModel::PAGE_ACCESS_PERMISSIONS_PAGE: + return ContextMenuAction::kPageAccessPermissionsPage; case ExtensionContextMenuModel::PAGE_ACCESS_LEARN_MORE: return ContextMenuAction::kPageAccessLearnMore; case ExtensionContextMenuModel::PAGE_ACCESS_CANT_ACCESS: @@ -172,6 +176,43 @@ return SitePermissionsHelper::SiteAccess::kOnClick; } +// Logs a user action when an option is selected in the page access section of +// the context menu. +void LogPageAccessAction(int command_id) { + switch (command_id) { + case ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_CLICK: + base::RecordAction(base::UserMetricsAction( + "Extensions.ContextMenu.Hosts.OnClickClicked")); + break; + case ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_SITE: + base::RecordAction(base::UserMetricsAction( + "Extensions.ContextMenu.Hosts.OnSiteClicked")); + break; + case ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_ALL_SITES: + base::RecordAction(base::UserMetricsAction( + "Extensions.ContextMenu.Hosts.OnAllSitesClicked")); + break; + case ExtensionContextMenuModel::PAGE_ACCESS_PERMISSIONS_PAGE: + base::RecordAction(base::UserMetricsAction( + "Extensions.ContextMenu.Hosts.PermissionsPageClicked")); + break; + case ExtensionContextMenuModel::PAGE_ACCESS_LEARN_MORE: + base::RecordAction(base::UserMetricsAction( + "Extensions.ContextMenu.Hosts.LearnMoreClicked")); + break; + default: + NOTREACHED() << "Unknown option: " << command_id; + break; + } +} + +void OpenUrl(Browser& browser, const GURL& url) { + content::OpenURLParams params( + url, content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, + ui::PAGE_TRANSITION_LINK, /*is_renderer_initiated=*/false); + browser.OpenURL(params); +} + // A stub for the uninstall dialog. // TODO(devlin): Ideally, we would just have the uninstall dialog take a // base::OnceCallback, but that's a bunch of churn. @@ -302,6 +343,7 @@ case PAGE_ACCESS_RUN_ON_CLICK: case PAGE_ACCESS_RUN_ON_SITE: case PAGE_ACCESS_RUN_ON_ALL_SITES: + case PAGE_ACCESS_PERMISSIONS_PAGE: case PAGE_ACCESS_LEARN_MORE: { return IsPageAccessCommandEnabled(*extension, command_id); } @@ -337,11 +379,7 @@ switch (command_id) { case HOME_PAGE: { - content::OpenURLParams params(ManifestURL::GetHomepageURL(extension), - content::Referrer(), - WindowOpenDisposition::NEW_FOREGROUND_TAB, - ui::PAGE_TRANSITION_LINK, false); - browser_->OpenURL(params); + OpenUrl(*browser_, ManifestURL::GetHomepageURL(extension)); break; } case OPTIONS: @@ -369,6 +407,7 @@ case PAGE_ACCESS_RUN_ON_CLICK: case PAGE_ACCESS_RUN_ON_SITE: case PAGE_ACCESS_RUN_ON_ALL_SITES: + case PAGE_ACCESS_PERMISSIONS_PAGE: case PAGE_ACCESS_LEARN_MORE: HandlePageAccessCommand(command_id, extension); break; @@ -506,6 +545,7 @@ case PAGE_ACCESS_SUBMENU: case PAGE_ACCESS_LEARN_MORE: + case PAGE_ACCESS_PERMISSIONS_PAGE: // When these commands are shown, they are always enabled. return true; @@ -541,73 +581,115 @@ content::WebContents* web_contents) { auto url = web_contents->GetLastCommittedURL(); - // User site setting takes preference over extension settings. Therefore, we - // only show the page access submenu with change extension settings options if - // the site settings is set to "customize by extension". Otherwise, shows a - // message that informs the user about the site setting. - auto site_setting = PermissionsManager::Get(profile_)->GetUserSiteSetting( - url::Origin::Create(url)); - switch (site_setting) { - case PermissionsManager::UserSiteSetting::kGrantAllExtensions: - AddItem( - PAGE_ACCESS_ALL_EXTENSIONS_GRANTED, - l10n_util::GetStringFUTF16( - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_ALL_EXTENSIONS_GRANTED, - GetCurrentSite(web_contents))); - AddSeparator(ui::NORMAL_SEPARATOR); - AddItemWithStringId(PAGE_ACCESS_LEARN_MORE, - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_LEARN_MORE); - return; - - case PermissionsManager::UserSiteSetting::kBlockAllExtensions: - AddItem( - PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED, - l10n_util::GetStringFUTF16( - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED, - GetCurrentSite(web_contents))); - AddSeparator(ui::NORMAL_SEPARATOR); - AddItemWithStringId(PAGE_ACCESS_LEARN_MORE, - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_LEARN_MORE); - return; - - case PermissionsManager::UserSiteSetting::kCustomizeByExtension: - // The extension wants site access but cant't run on the page if it does - // not have at least "on click" access. - if (!SitePermissionsHelper(profile_).CanSelectSiteAccess( - *extension, url, SitePermissionsHelper::SiteAccess::kOnClick)) { - AddItemWithStringId(PAGE_ACCESS_CANT_ACCESS, - IDS_EXTENSIONS_CONTEXT_MENU_CANT_ACCESS_PAGE); - return; - } - - // The extension wants site access and can ran on the page. Add the three - // options for "on click", "on this site", "on all sites". Though we - // always add these three, some may be disabled. - const int kRadioGroup = 0; - page_access_submenu_ = std::make_unique<ui::SimpleMenuModel>(this); - - page_access_submenu_->AddRadioItemWithStringId( - PAGE_ACCESS_RUN_ON_CLICK, - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK, kRadioGroup); - page_access_submenu_->AddRadioItem( - PAGE_ACCESS_RUN_ON_SITE, - l10n_util::GetStringFUTF16( - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE, - GetCurrentSite(web_contents)), - kRadioGroup); - page_access_submenu_->AddRadioItemWithStringId( - PAGE_ACCESS_RUN_ON_ALL_SITES, - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES, - kRadioGroup); - - page_access_submenu_->AddSeparator(ui::NORMAL_SEPARATOR); - page_access_submenu_->AddItemWithStringId( + if (base::FeatureList::IsEnabled( + extensions_features::kExtensionsMenuAccessControl)) { + auto add_page_access_secondary_buttons = [](ui::SimpleMenuModel* parent) { + parent->AddSeparator(ui::NORMAL_SEPARATOR); + parent->AddItemWithStringId( + PAGE_ACCESS_PERMISSIONS_PAGE, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_PERMISSIONS_PAGE); + parent->AddItemWithStringId( PAGE_ACCESS_LEARN_MORE, IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_LEARN_MORE); + }; - AddSubMenuWithStringId(PAGE_ACCESS_SUBMENU, - IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS, - page_access_submenu_.get()); + // User site setting takes preference over extension settings. Therefore, we + // only show the page access submenu with change extension settings options + // if the site settings is set to "customize by extension". Otherwise, shows + // a message that informs the user about the site setting. + auto site_setting = PermissionsManager::Get(profile_)->GetUserSiteSetting( + url::Origin::Create(url)); + switch (site_setting) { + case PermissionsManager::UserSiteSetting::kGrantAllExtensions: + AddItem( + PAGE_ACCESS_ALL_EXTENSIONS_GRANTED, + l10n_util::GetStringFUTF16( + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_ALL_EXTENSIONS_GRANTED, + GetCurrentSite(web_contents))); + add_page_access_secondary_buttons(this); + return; + + case PermissionsManager::UserSiteSetting::kBlockAllExtensions: + AddItem( + PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED, + l10n_util::GetStringFUTF16( + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED, + GetCurrentSite(web_contents))); + add_page_access_secondary_buttons(this); + return; + + case PermissionsManager::UserSiteSetting::kCustomizeByExtension: + // The extension wants site access but cant't run on the page if it does + // not have at least "on click" access. + if (!SitePermissionsHelper(profile_).CanSelectSiteAccess( + *extension, url, SitePermissionsHelper::SiteAccess::kOnClick)) { + AddItemWithStringId(PAGE_ACCESS_CANT_ACCESS, + IDS_EXTENSIONS_CONTEXT_MENU_CANT_ACCESS_PAGE); + return; + } + + // The extension wants site access and can ran on the page. Add the + // three options for "on click", "on this site", "on all sites". Though + // we always add these three, some may be disabled. + const int kRadioGroup = 0; + page_access_submenu_ = std::make_unique<ui::SimpleMenuModel>(this); + page_access_submenu_->AddRadioItemWithStringId( + PAGE_ACCESS_RUN_ON_CLICK, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK_V2, + kRadioGroup); + page_access_submenu_->AddRadioItem( + PAGE_ACCESS_RUN_ON_SITE, + l10n_util::GetStringFUTF16( + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE_V2, + GetCurrentSite(web_contents)), + kRadioGroup); + page_access_submenu_->AddRadioItemWithStringId( + PAGE_ACCESS_RUN_ON_ALL_SITES, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES_V2, + kRadioGroup); + add_page_access_secondary_buttons(page_access_submenu_.get()); + + AddSubMenuWithStringId(PAGE_ACCESS_SUBMENU, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS, + page_access_submenu_.get()); + } + } else { + // The extension wants site access but cant't run on the page if it does + // not have at least "on click" access. + if (!SitePermissionsHelper(profile_).CanSelectSiteAccess( + *extension, url, SitePermissionsHelper::SiteAccess::kOnClick)) { + AddItemWithStringId(PAGE_ACCESS_CANT_ACCESS, + IDS_EXTENSIONS_CONTEXT_MENU_CANT_ACCESS_PAGE); + return; + } + + // The extension wants site access and can ran on the page. Add the three + // options for "on click", "on this site", "on all sites". Though we + // always add these three, some may be disabled. + const int kRadioGroup = 0; + page_access_submenu_ = std::make_unique<ui::SimpleMenuModel>(this); + + page_access_submenu_->AddRadioItemWithStringId( + PAGE_ACCESS_RUN_ON_CLICK, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_CLICK, kRadioGroup); + page_access_submenu_->AddRadioItem( + PAGE_ACCESS_RUN_ON_SITE, + l10n_util::GetStringFUTF16( + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_SITE, + GetCurrentSite(web_contents)), + kRadioGroup); + page_access_submenu_->AddRadioItemWithStringId( + PAGE_ACCESS_RUN_ON_ALL_SITES, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_RUN_ON_ALL_SITES, kRadioGroup); + + page_access_submenu_->AddSeparator(ui::NORMAL_SEPARATOR); + page_access_submenu_->AddItemWithStringId( + PAGE_ACCESS_LEARN_MORE, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS_LEARN_MORE); + + AddSubMenuWithStringId(PAGE_ACCESS_SUBMENU, + IDS_EXTENSIONS_CONTEXT_MENU_PAGE_ACCESS, + page_access_submenu_.get()); } } @@ -620,12 +702,14 @@ LogPageAccessAction(command_id); + if (command_id == PAGE_ACCESS_PERMISSIONS_PAGE) { + OpenUrl(*browser_, + GURL(chrome_extension_constants::kExtensionsSitePermissionsURL)); + return; + } if (command_id == PAGE_ACCESS_LEARN_MORE) { - content::OpenURLParams params( - GURL(chrome_extension_constants::kRuntimeHostPermissionsHelpURL), - content::Referrer(), WindowOpenDisposition::NEW_FOREGROUND_TAB, - ui::PAGE_TRANSITION_LINK, false); - browser_->OpenURL(params); + OpenUrl(*browser_, + GURL(chrome_extension_constants::kRuntimeHostPermissionsHelpURL)); return; } @@ -634,30 +718,6 @@ CommandIdToSiteAccess(command_id)); } -void ExtensionContextMenuModel::LogPageAccessAction(int command_id) const { - switch (command_id) { - case PAGE_ACCESS_LEARN_MORE: - base::RecordAction(base::UserMetricsAction( - "Extensions.ContextMenu.Hosts.LearnMoreClicked")); - break; - case PAGE_ACCESS_RUN_ON_CLICK: - base::RecordAction(base::UserMetricsAction( - "Extensions.ContextMenu.Hosts.OnClickClicked")); - break; - case PAGE_ACCESS_RUN_ON_SITE: - base::RecordAction(base::UserMetricsAction( - "Extensions.ContextMenu.Hosts.OnSiteClicked")); - break; - case PAGE_ACCESS_RUN_ON_ALL_SITES: - base::RecordAction(base::UserMetricsAction( - "Extensions.ContextMenu.Hosts.OnAllSitesClicked")); - break; - default: - NOTREACHED() << "Unknown option: " << command_id; - break; - } -} - content::WebContents* ExtensionContextMenuModel::GetActiveWebContents() const { return browser_->tab_strip_model()->GetActiveWebContents(); }
diff --git a/chrome/browser/extensions/extension_context_menu_model.h b/chrome/browser/extensions/extension_context_menu_model.h index 8ed2457..1398696c 100644 --- a/chrome/browser/extensions/extension_context_menu_model.h +++ b/chrome/browser/extensions/extension_context_menu_model.h
@@ -43,6 +43,7 @@ PAGE_ACCESS_LEARN_MORE, PAGE_ACCESS_ALL_EXTENSIONS_GRANTED, PAGE_ACCESS_ALL_EXTENSIONS_BLOCKED, + PAGE_ACCESS_PERMISSIONS_PAGE, // NOTE: If you update this, you probably need to update the // ContextMenuAction enum below. }; @@ -67,7 +68,8 @@ kPageAccessRunOnSite = 9, kPageAccessRunOnAllSites = 10, kPageAccessLearnMore = 11, - kMaxValue = kPageAccessLearnMore, + kPageAccessPermissionsPage = 12, + kMaxValue = kPageAccessPermissionsPage, }; // Location where the context menu is open from. @@ -143,10 +145,6 @@ void HandlePageAccessCommand(int command_id, const Extension* extension) const; - // Logs a user action when an option is selected in the page access section of - // the context menu. - void LogPageAccessAction(int command_id) const; - // Gets the extension we are displaying the menu for. Returns NULL if the // extension has been uninstalled and no longer exists. const Extension* GetExtension() const;
diff --git a/chrome/browser/extensions/extension_context_menu_model_unittest.cc b/chrome/browser/extensions/extension_context_menu_model_unittest.cc index 3c900f86..4cbf1cd9 100644 --- a/chrome/browser/extensions/extension_context_menu_model_unittest.cc +++ b/chrome/browser/extensions/extension_context_menu_model_unittest.cc
@@ -90,6 +90,8 @@ const MenuEntries kOnSite = ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_SITE; const MenuEntries kOnAllSites = ExtensionContextMenuModel::PAGE_ACCESS_RUN_ON_ALL_SITES; +const MenuEntries kPermissionsPage = + ExtensionContextMenuModel::PAGE_ACCESS_PERMISSIONS_PAGE; const MenuEntries kLearnMore = ExtensionContextMenuModel::PAGE_ACCESS_LEARN_MORE; @@ -401,7 +403,7 @@ int command) const { // Check this method is called only for submenu page access commands. DCHECK(command == kOnClick || command == kOnSite || command == kOnAllSites || - command == kLearnMore); + command == kLearnMore || command == kPermissionsPage); // Every page access command is absent if there is no page access submenu. if (!HasPageAccessSubmenu(menu)) @@ -876,82 +878,6 @@ ExtensionRegistry::EVERYTHING)); } -TEST_F(ExtensionContextMenuModelTest, - PageAccessItemsVisibilityBasedOnSiteSettings) { - InitializeEmptyExtensionService(); - - const Extension* extension = - AddExtensionWithHostPermission("extension", manifest_keys::kBrowserAction, - ManifestLocation::kInternal, "<all_urls>"); - - // Add a tab to the browser. - const GURL url("http://www.example.com/"); - AddTab(url); - - { - // By default, the site permission is set to "customize by extension". - // Verify page access submenu is visible and enabled, and the "learn more" - // item is in in the submenu. - ExtensionContextMenuModel menu(extension, GetBrowser(), - ExtensionContextMenuModel::PINNED, nullptr, - true, ContextMenuSource::kToolbarAction); - EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), - CommandState::kAbsent); - EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), - CommandState::kAbsent); - EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), - CommandState::kEnabled); - EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kAbsent); - EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), - CommandState::kEnabled); - } - - { - // Add site as a user permitted site. - auto* manager = extensions::PermissionsManager::Get(profile()); - extensions::PermissionsManagerWaiter manager_waiter(manager); - manager->AddUserPermittedSite(url::Origin::Create(url)); - manager_waiter.WaitForUserPermissionsSettingsChange(); - - // Verify "grant all extensions" item is visible and disabled, and the - // "learn more" item is in the context menu. - ExtensionContextMenuModel menu(extension, GetBrowser(), - ExtensionContextMenuModel::PINNED, nullptr, - true, ContextMenuSource::kToolbarAction); - EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), - CommandState::kDisabled); - EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), - CommandState::kAbsent); - EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), CommandState::kAbsent); - EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kEnabled); - EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), - CommandState::kAbsent); - } - - { - // Add site as a user restricted site. Note that adding a site as restricted - // site removes it from the permitted sites. - auto* manager = extensions::PermissionsManager::Get(profile()); - extensions::PermissionsManagerWaiter manager_waiter(manager); - manager->AddUserRestrictedSite(url::Origin::Create(url)); - manager_waiter.WaitForUserPermissionsSettingsChange(); - - // Verify "block all extensions" item is visible and disabled, and the - // "learn more" item is in the context menu. - ExtensionContextMenuModel menu(extension, GetBrowser(), - ExtensionContextMenuModel::PINNED, nullptr, - true, ContextMenuSource::kToolbarAction); - EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), - CommandState::kAbsent); - EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), - CommandState::kDisabled); - EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), CommandState::kAbsent); - EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kEnabled); - EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), - CommandState::kAbsent); - } -} - TEST_F(ExtensionContextMenuModelTest, PageAccess_CustomizeByExtension_Submenu) { base::UserActionTester user_action_tester; constexpr char kOnClickAction[] = @@ -1974,4 +1900,213 @@ ActionInfo::TYPE_BROWSER, ActionInfo::TYPE_ACTION)); +class ExtensionContextMenuModelWithUserHostControlsTest + : public ExtensionContextMenuModelTest, + public testing::WithParamInterface<bool> { + public: + ExtensionContextMenuModelWithUserHostControlsTest() { + const base::Feature& feature = + extensions_features::kExtensionsMenuAccessControl; + if (GetParam()) + feature_list_.InitAndEnableFeature(feature); + else + feature_list_.InitAndDisableFeature(feature); + } + ~ExtensionContextMenuModelWithUserHostControlsTest() override = default; + + private: + base::test::ScopedFeatureList feature_list_; +}; + +INSTANTIATE_TEST_SUITE_P(All, + ExtensionContextMenuModelWithUserHostControlsTest, + testing::Bool()); + +TEST_P(ExtensionContextMenuModelWithUserHostControlsTest, + PageAccessItemsVisibilityBasedOnSiteSettings) { + InitializeEmptyExtensionService(); + + const Extension* extension = + AddExtensionWithHostPermission("extension", manifest_keys::kBrowserAction, + ManifestLocation::kInternal, "<all_urls>"); + + // Add a tab to the browser. + const GURL url("http://www.example.com/"); + AddTab(url); + + { + // By default, the site permission is set to "customize by extension". + // Verify page access submenu is visible and enabled, and the "learn more" + // item is in in the submenu. + ExtensionContextMenuModel menu(extension, GetBrowser(), + ExtensionContextMenuModel::PINNED, nullptr, + true, ContextMenuSource::kToolbarAction); + EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), + CommandState::kEnabled); + EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kAbsent); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kEnabled); + // The "permissions page" item is in the submenu only if the feature is + // enabled. + EXPECT_EQ(GetCommandState(menu, kPermissionsPage), CommandState::kAbsent); + CommandState permission_page_state = + GetParam() ? CommandState::kEnabled : CommandState::kAbsent; + EXPECT_EQ(GetPageAccessCommandState(menu, kPermissionsPage), + permission_page_state); + } + + // User site settings are only taken into account for site access computations + // when the feature is enabled, even if they are added by the manager. + // Therefore, the context menu should not take into account user site settings + // when the feature is disabled. + auto* manager = extensions::PermissionsManager::Get(profile()); + + { + // Add site as a user permitted site. + extensions::PermissionsManagerWaiter manager_waiter(manager); + manager->AddUserPermittedSite(url::Origin::Create(url)); + manager_waiter.WaitForUserPermissionsSettingsChange(); + + ExtensionContextMenuModel menu(extension, GetBrowser(), + ExtensionContextMenuModel::PINNED, nullptr, + true, ContextMenuSource::kToolbarAction); + + if (GetParam()) { + // Verify "grant all extensions" item is visible and disabled, and the + // "learn more" and "permissions page" item are in the context menu. + EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), + CommandState::kDisabled); + EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kEnabled); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kPermissionsPage), + CommandState::kEnabled); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kAbsent); + } else { + // Even though we added a site as a user permitted site, the site + // permission behaves as "customize by extension". Verify page access + // submenu is visible and enabled, the "learn more" item is in in the + // submenu and the "permissions page" item is nowhere visible. + EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), + CommandState::kEnabled); + EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kAbsent); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kEnabled); + EXPECT_EQ(GetCommandState(menu, kPermissionsPage), CommandState::kAbsent); + EXPECT_EQ(GetPageAccessCommandState(menu, kPermissionsPage), + CommandState::kAbsent); + } + } + + { + // Add site as a user restricted site. Note that adding a site as restricted + // site removes it from the permitted sites. + extensions::PermissionsManagerWaiter manager_waiter(manager); + manager->AddUserRestrictedSite(url::Origin::Create(url)); + manager_waiter.WaitForUserPermissionsSettingsChange(); + + ExtensionContextMenuModel menu(extension, GetBrowser(), + ExtensionContextMenuModel::PINNED, nullptr, + true, ContextMenuSource::kToolbarAction); + + if (GetParam()) { + // Verify "block all extensions" item is + // visible and disabled, and the "learn more" and "permissions page" item + // are in the context menu. + EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), + CommandState::kDisabled); + EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kEnabled); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kPermissionsPage), + CommandState::kEnabled); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kAbsent); + } else { + // Even though we added a site as a user restricted site, the site + // permission behaves as "customize by extension". Verify page access + // submenu is visible and enabled, the "learn more" item is in in the + // submenu and the "permissions page" item is nowhere visible. + EXPECT_EQ(GetCommandState(menu, kGrantAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kBlockAllExtensions), + CommandState::kAbsent); + EXPECT_EQ(GetCommandState(menu, kPageAccessSubmenu), + CommandState::kEnabled); + EXPECT_EQ(GetCommandState(menu, kLearnMore), CommandState::kAbsent); + EXPECT_EQ(GetPageAccessCommandState(menu, kLearnMore), + CommandState::kEnabled); + EXPECT_EQ(GetCommandState(menu, kPermissionsPage), CommandState::kAbsent); + EXPECT_EQ(GetPageAccessCommandState(menu, kPermissionsPage), + CommandState::kAbsent); + } + } +} + +// Test clicking on the "permissions page" item opens the correct link. +TEST_P(ExtensionContextMenuModelWithUserHostControlsTest, + TestClickingPageAccessPermissionsPage) { + base::UserActionTester user_action_tester; + constexpr char kPermissionsPageAction[] = + "Extensions.ContextMenu.Hosts.PermissionsPageClicked"; + InitializeEmptyExtensionService(); + + // Add an extension that wants access to a.com. + scoped_refptr<const Extension> extension = + ExtensionBuilder("extension").AddPermission("*://a.com/*").Build(); + InitializeAndAddExtension(*extension); + EXPECT_FALSE(ScriptingPermissionsModifier(profile(), extension) + .HasWithheldHostPermissions()); + + AddTab(GURL("https://a.com")); + + Browser* browser = GetBrowser(); + ExtensionContextMenuModel menu(extension.get(), browser, + ExtensionContextMenuModel::PINNED, nullptr, + true, ContextMenuSource::kToolbarAction); + EXPECT_EQ(user_action_tester.GetActionCount(kPermissionsPageAction), 0); + + // "permissions page" button is not visible when the enhanced host controls + // feature is disabled. + if (!GetParam()) { + EXPECT_EQ(GetPageAccessCommandState(menu, kPermissionsPage), + CommandState::kAbsent); + // There's nothing more we need to test in this case. + return; + } + + EXPECT_EQ(GetPageAccessCommandState(menu, kPermissionsPage), + CommandState::kEnabled); + menu.ExecuteCommand(kPermissionsPage, 0); + + EXPECT_EQ(browser->tab_strip_model()->count(), 2); + content::WebContents* web_contents = + browser->tab_strip_model()->GetActiveWebContents(); + EXPECT_EQ(user_action_tester.GetActionCount(kPermissionsPageAction), 1); + + // Test web contents need a poke to commit. + content::NavigationController& controller = web_contents->GetController(); + content::RenderFrameHostTester::CommitPendingLoad(&controller); + + EXPECT_EQ(web_contents->GetLastCommittedURL(), + GURL(chrome_extension_constants::kExtensionsSitePermissionsURL)); +} + } // namespace extensions
diff --git a/chrome/browser/extensions/scripting_permissions_modifier.cc b/chrome/browser/extensions/scripting_permissions_modifier.cc index 4d9759a..e1fff5d 100644 --- a/chrome/browser/extensions/scripting_permissions_modifier.cc +++ b/chrome/browser/extensions/scripting_permissions_modifier.cc
@@ -212,29 +212,27 @@ &extension_->permissions_data()->active_permissions(); } - std::unique_ptr<const PermissionSet> unrevokable_permissions; + // Unrevokable permissions include granted API permissions, manifest + // permissions, and host permissions that are always allowed. + PermissionSet unrevokable_permissions( + current_granted_permissions->apis().Clone(), + current_granted_permissions->manifest_permissions().Clone(), + URLPatternSet(), URLPatternSet()); { - PermissionSet apis_and_manifest( - current_granted_permissions->apis().Clone(), - current_granted_permissions->manifest_permissions().Clone(), - URLPatternSet(), URLPatternSet()); // TODO(devlin): We do this pattern of "required + optional" enough. Make it // a part of PermissionsParser and stop duplicating the set each time. - std::unique_ptr<const PermissionSet> requested_permissions = + std::unique_ptr<PermissionSet> requested_permissions = PermissionSet::CreateUnion( PermissionsParser::GetRequiredPermissions(extension_.get()), PermissionsParser::GetOptionalPermissions(extension_.get())); - // Unrevokable permissions include API permissions, manifest permissions, - // and host permissions that are always allowed. - unrevokable_permissions = - ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( - *requested_permissions, apis_and_manifest); + ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( + *requested_permissions, &unrevokable_permissions); } // Revokable permissions are, predictably, any in the current set that aren't // considered unrevokable. return PermissionSet::CreateDifference(*current_granted_permissions, - *unrevokable_permissions); + unrevokable_permissions); } void ScriptingPermissionsModifier::GrantWithheldHostPermissions() {
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.cc index 2126d773..df80df7 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/profiles/incognito_helpers.h" #include "chrome/browser/profiles/profile.h" #include "components/keyed_service/content/browser_context_dependency_manager.h" +#include "components/keyed_service/content/browser_context_keyed_service_factory.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_context.h" @@ -17,6 +18,16 @@ namespace first_party_sets { +namespace { + +BrowserContextKeyedServiceFactory::TestingFactory* GetTestingFactory() { + static base::NoDestructor<BrowserContextKeyedServiceFactory::TestingFactory> + instance; + return instance.get(); +} + +} // namespace + // static FirstPartySetsPolicyService* FirstPartySetsPolicyServiceFactory::GetForBrowserContext( @@ -48,6 +59,11 @@ first_party_sets::kFirstPartySetsOverrides); } +void FirstPartySetsPolicyServiceFactory::SetTestingFactoryForTesting( + TestingFactory test_factory) { + *GetTestingFactory() = std::move(test_factory); +} + FirstPartySetsPolicyServiceFactory::FirstPartySetsPolicyServiceFactory() : BrowserContextKeyedServiceFactory( "FirstPartySetsPolicyService", @@ -64,6 +80,9 @@ KeyedService* FirstPartySetsPolicyServiceFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { + if (!GetTestingFactory()->is_null()) { + return GetTestingFactory()->Run(context).release(); + } Profile* profile = Profile::FromBrowserContext(context); if (const base::Value::Dict* policy = GetPolicyIfEnabled(*profile); policy) { return new FirstPartySetsPolicyService(context, *policy);
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h index 17f69ee8..021ea81a 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h
@@ -46,6 +46,9 @@ // PrefService. static const base::Value::Dict* GetPolicyIfEnabled(const Profile& profile); + // Stores `test_factory` to inject test logic into BuildServiceInstanceFor. + void SetTestingFactoryForTesting(TestingFactory test_factory); + private: friend struct base::DefaultSingletonTraits< FirstPartySetsPolicyServiceFactory>;
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 1428a0d..b17a45b 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -349,6 +349,7 @@ &omnibox::kAdaptiveSuggestionsCount, &omnibox::kAndroidAuxiliarySearch, &omnibox::kMostVisitedTiles, + &omnibox::kMostVisitedTilesDynamicSpacing, &omnibox::kMostVisitedTilesTitleWrapAround, &omnibox::kOmniboxAssistantVoiceSearch, &omnibox::kOmniboxRemoveSuggestionHeaderCapitalization,
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index d7c97093..aaa89fa5 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -430,6 +430,8 @@ "AndroidAuxiliarySearch"; public static final String OMNIBOX_ASSISTANT_VOICE_SEARCH = "OmniboxAssistantVoiceSearch"; public static final String OMNIBOX_MODERNIZE_VISUAL_UPDATE = "OmniboxModernizeVisualUpdate"; + public static final String OMNIBOX_MOST_VISITED_TILES_DYNAMIC_SPACING = + "OmniboxMostVisitedTilesDynamicSpacing"; public static final String OMNIBOX_MOST_VISITED_TILES_TITLE_WRAP_AROUND = "OmniboxMostVisitedTilesTitleWrapAround"; public static final String OMNIBOX_REMOVE_SUGGESTION_HEADER_CHEVRON =
diff --git a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc index 69966ca..c6a4d18 100644 --- a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc +++ b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.cc
@@ -27,7 +27,7 @@ #include "chrome/browser/lacros/net/network_change_manager_bridge.h" #include "chrome/browser/lacros/screen_orientation_delegate_lacros.h" #include "chrome/browser/lacros/standalone_browser_test_controller.h" -#include "chrome/browser/lacros/sync/sync_explicit_passphrase_client_lacros.h" +#include "chrome/browser/lacros/sync/sync_crosapi_manager_lacros.h" #include "chrome/browser/lacros/task_manager_lacros.h" #include "chrome/browser/lacros/ui_throughput_recorder_lacros.h" #include "chrome/browser/lacros/vpn_extension_tracker_lacros.h" @@ -37,46 +37,16 @@ #include "chrome/browser/memory/oom_kills_monitor.h" #include "chrome/browser/metrics/structured/chrome_structured_metrics_recorder.h" #include "chrome/browser/profiles/profiles_state.h" -#include "chrome/browser/sync/sync_service_factory.h" #include "chrome/browser/ui/quick_answers/quick_answers_controller_impl.h" #include "chromeos/components/quick_answers/public/cpp/controller/quick_answers_controller.h" #include "chromeos/components/quick_answers/quick_answers_client.h" #include "chromeos/lacros/lacros_service.h" #include "chromeos/startup/browser_params_proxy.h" #include "components/arc/common/intent_helper/arc_icon_cache_delegate.h" -#include "components/sync/base/features.h" #include "extensions/common/features/feature_session_type.h" namespace { -// Creates SyncExplicitPassphraseClientLacros for |profile| if preconditions -// are met, returns nullptr otherwise. Preconditions are: -// 1. Sync passphrase sharing feature is enabled. -// 2. |profile| is the main profile. -// 3. SyncService crosapi is available. -// 4. Lacros SyncService exists (can be not created due to command line config). -std::unique_ptr<SyncExplicitPassphraseClientLacros> -MaybeCreateSyncExplicitPassphraseClient(Profile* profile) { - if (!base::FeatureList::IsEnabled( - syncer::kSyncChromeOSExplicitPassphraseSharing)) { - return nullptr; - } - - if (!profile->IsMainProfile()) - return nullptr; - - auto* lacros_service = chromeos::LacrosService::Get(); - if (!lacros_service->IsAvailable<crosapi::mojom::SyncService>()) - return nullptr; - - auto* sync_service = SyncServiceFactory::GetForProfile(profile); - if (!sync_service) - return nullptr; - - return std::make_unique<SyncExplicitPassphraseClientLacros>( - sync_service, &lacros_service->GetRemote<crosapi::mojom::SyncService>()); -} - extensions::mojom::FeatureSessionType GetExtSessionType() { using extensions::mojom::FeatureSessionType; @@ -209,10 +179,7 @@ void ChromeBrowserMainExtraPartsLacros::PostProfileInit( Profile* profile, bool is_initial_profile) { - if (!sync_explicit_passphrase_client_) { - sync_explicit_passphrase_client_ = - MaybeCreateSyncExplicitPassphraseClient(profile); - } + sync_crosapi_manager_.PostProfileInit(profile); // The setup below is intended to run for only the initial profile. if (!is_initial_profile)
diff --git a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h index f976473..b1ba8cdb 100644 --- a/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h +++ b/chrome/browser/lacros/chrome_browser_main_extra_parts_lacros.h
@@ -9,6 +9,8 @@ #include <memory> +#include "chrome/browser/lacros/sync/sync_crosapi_manager_lacros.h" + class ArcIconCache; class AutomationManagerLacros; class BrowserServiceLacros; @@ -26,7 +28,6 @@ class NetworkChangeManagerBridge; class QuickAnswersController; class StandaloneBrowserTestController; -class SyncExplicitPassphraseClientLacros; class TabletModePageBehavior; class UiThroughputRecorderLacros; class VpnExtensionTrackerLacros; @@ -142,10 +143,6 @@ std::unique_ptr<content::ScreenOrientationDelegate> screen_orientation_delegate_; - // Responsible for sharing sync explicit passphrase between Ash and Lacros. - std::unique_ptr<SyncExplicitPassphraseClientLacros> - sync_explicit_passphrase_client_; - // Handles WebAuthn request id generation. std::unique_ptr<WebAuthnRequestRegistrarLacros> webauthn_request_registrar_lacros_; @@ -161,6 +158,9 @@ // Records UI metrics such as dropped frame percentage. std::unique_ptr<UiThroughputRecorderLacros> ui_throughput_recorder_; + + // Controls sync-related Crosapi clients. + SyncCrosapiManagerLacros sync_crosapi_manager_; }; #endif // CHROME_BROWSER_LACROS_CHROME_BROWSER_MAIN_EXTRA_PARTS_LACROS_H_
diff --git a/chrome/browser/lacros/sync/sync_crosapi_manager_lacros.cc b/chrome/browser/lacros/sync/sync_crosapi_manager_lacros.cc new file mode 100644 index 0000000..1ad4923 --- /dev/null +++ b/chrome/browser/lacros/sync/sync_crosapi_manager_lacros.cc
@@ -0,0 +1,63 @@ +// 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 "chrome/browser/lacros/sync/sync_crosapi_manager_lacros.h" + +#include <memory> + +#include "base/feature_list.h" +#include "chrome/browser/lacros/sync/sync_explicit_passphrase_client_lacros.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/sync/sync_service_factory.h" +#include "chromeos/lacros/lacros_service.h" +#include "components/sync/base/features.h" + +namespace { + +// Creates SyncExplicitPassphraseClientLacros for `profile` if preconditions +// are met, returns nullptr otherwise. Preconditions are: +// 1. Sync passphrase sharing feature is enabled. +// 2. SyncService crosapi is available. +// 3. Lacros SyncService exists (can be not created due to command line config). +// `profile` must be main profile. +std::unique_ptr<SyncExplicitPassphraseClientLacros> +MaybeCreateSyncExplicitPassphraseClient(Profile* profile) { + DCHECK(profile->IsMainProfile()); + if (!base::FeatureList::IsEnabled( + syncer::kSyncChromeOSExplicitPassphraseSharing)) { + return nullptr; + } + + auto* lacros_service = chromeos::LacrosService::Get(); + if (!lacros_service->IsAvailable<crosapi::mojom::SyncService>()) { + return nullptr; + } + + auto* sync_service = SyncServiceFactory::GetForProfile(profile); + if (!sync_service) { + return nullptr; + } + + // TODO(crbug.com/1327602): move high-level Crosapi initialization logic to + // SyncCrosapiManagerLacros and make SyncExplicitPassphraseClientLacros + // working with crosapi::mojom::SyncExplicitPassphraseClient directly. + return std::make_unique<SyncExplicitPassphraseClientLacros>( + sync_service, &lacros_service->GetRemote<crosapi::mojom::SyncService>()); +} + +} // namespace + +SyncCrosapiManagerLacros::SyncCrosapiManagerLacros() = default; + +SyncCrosapiManagerLacros::~SyncCrosapiManagerLacros() = default; + +void SyncCrosapiManagerLacros::PostProfileInit(Profile* profile) { + if (!profile->IsMainProfile()) { + return; + } + + DCHECK(!sync_explicit_passphrase_client_); + sync_explicit_passphrase_client_ = + MaybeCreateSyncExplicitPassphraseClient(profile); +}
diff --git a/chrome/browser/lacros/sync/sync_crosapi_manager_lacros.h b/chrome/browser/lacros/sync/sync_crosapi_manager_lacros.h new file mode 100644 index 0000000..cd1492e --- /dev/null +++ b/chrome/browser/lacros/sync/sync_crosapi_manager_lacros.h
@@ -0,0 +1,29 @@ +// 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 CHROME_BROWSER_LACROS_SYNC_SYNC_CROSAPI_MANAGER_LACROS_H_ +#define CHROME_BROWSER_LACROS_SYNC_SYNC_CROSAPI_MANAGER_LACROS_H_ + +#include <memory> + +class Profile; +class SyncExplicitPassphraseClientLacros; + +// Controls lifetime of sync-related Crosapi clients. +class SyncCrosapiManagerLacros { + public: + SyncCrosapiManagerLacros(); + ~SyncCrosapiManagerLacros(); + + void PostProfileInit(Profile* profile); + + private: + // TODO(crbug.com/1327602): Destroy `sync_explicit_passphrase_client_` upon + // main profile SyncService shutdown and remove handling of SyncService + // from the client code. + std::unique_ptr<SyncExplicitPassphraseClientLacros> + sync_explicit_passphrase_client_; +}; + +#endif // CHROME_BROWSER_LACROS_SYNC_SYNC_CROSAPI_MANAGER_LACROS_H_
diff --git a/chrome/browser/metrics/metrics_reporting_state_browsertest.cc b/chrome/browser/metrics/metrics_reporting_state_browsertest.cc index 17b74173..a32a339 100644 --- a/chrome/browser/metrics/metrics_reporting_state_browsertest.cc +++ b/chrome/browser/metrics/metrics_reporting_state_browsertest.cc
@@ -37,8 +37,8 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/settings/device_settings_cache.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/proto/chrome_device_policy.pb.h" #include "components/policy/proto/device_management_backend.pb.h" #endif
diff --git a/chrome/browser/metrics/variations/chrome_variations_service_client.cc b/chrome/browser/metrics/variations/chrome_variations_service_client.cc index 36ad69a9..7601bd2 100644 --- a/chrome/browser/metrics/variations/chrome_variations_service_client.cc +++ b/chrome/browser/metrics/variations/chrome_variations_service_client.cc
@@ -20,8 +20,8 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/install_attributes.h" #include "chrome/browser/ash/settings/cros_settings.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC)
diff --git a/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc b/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc index b24334af..c8eb8e8 100644 --- a/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc +++ b/chrome/browser/navigation_predictor/anchor_element_preloader_browsertest.cc
@@ -70,7 +70,6 @@ test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); ukm_entry_builder_ = std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( - content::PreloadingType::kPreconnect, ToPreloadingPredictor( ChromePreloadingPredictor::kPointerDownOnAnchor)); ASSERT_TRUE(loading_predictor); @@ -178,7 +177,8 @@ content::test::kPreloadingAttemptUkmMetrics); EXPECT_EQ(ukm_entries.size(), 1u); UkmEntry expected_entry = ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, content::PreloadingFailureReason::kUnspecified, @@ -212,7 +212,8 @@ content::test::kPreloadingAttemptUkmMetrics); EXPECT_EQ(ukm_entries.size(), 1u); UkmEntry expected_entry = ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, content::PreloadingFailureReason::kUnspecified, @@ -250,21 +251,24 @@ std::vector<UkmEntry> expected_entries = { // Successful preconnect to first origin. ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, content::PreloadingFailureReason::kUnspecified, /*accurate=*/true), // Duplicate preconnect to first origin. ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kDuplicate, content::PreloadingFailureReason::kUnspecified, /*accurate=*/true), // Preconnect to first second origin. ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, content::PreloadingFailureReason::kUnspecified, @@ -344,7 +348,8 @@ content::test::kPreloadingAttemptUkmMetrics); EXPECT_EQ(ukm_entries.size(), 1u); UkmEntry expected_entry = ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kPreloadingDisabled, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kPreloadingDisabled, content::PreloadingHoldbackStatus::kUnspecified, content::PreloadingTriggeringOutcome::kUnspecified, content::PreloadingFailureReason::kUnspecified, @@ -395,7 +400,8 @@ content::test::kPreloadingAttemptUkmMetrics); EXPECT_EQ(ukm_entries.size(), 1u); UkmEntry expected_entry = ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kHoldback, content::PreloadingTriggeringOutcome::kUnspecified, content::PreloadingFailureReason::kUnspecified, @@ -440,14 +446,16 @@ std::vector<UkmEntry> expected_entries = { // Successful preconnect to first origin. ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, content::PreloadingFailureReason::kUnspecified, /*accurate=*/true), // LimitExceeded for second origin. ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPreconnect, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kFailure, ToFailureReason(AnchorPreloadingFailureReason::kLimitExceeded),
diff --git a/chrome/browser/page_load_metrics/observers/formfill_page_load_metrics_observer_browsertest.cc b/chrome/browser/page_load_metrics/observers/formfill_page_load_metrics_observer_browsertest.cc index 4eaf7f2..6dfaefc 100644 --- a/chrome/browser/page_load_metrics/observers/formfill_page_load_metrics_observer_browsertest.cc +++ b/chrome/browser/page_load_metrics/observers/formfill_page_load_metrics_observer_browsertest.cc
@@ -7,6 +7,10 @@ #include "chrome/browser/ui/browser.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" +#include "components/autofill/content/browser/content_autofill_driver.h" +#include "components/autofill/content/browser/test_autofill_manager_injector.h" +#include "components/autofill/core/browser/browser_autofill_manager.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "content/public/browser/browsing_data_remover.h" #include "content/public/browser/render_widget_host_view.h" #include "content/public/test/browser_test.h" @@ -28,6 +32,23 @@ email_input.blur(); )"; +class TestAutofillManager : public autofill::BrowserAutofillManager { + public: + TestAutofillManager(autofill::ContentAutofillDriver* driver, + autofill::AutofillClient* client) + : BrowserAutofillManager(driver, + client, + "en-US", + EnableDownloadManager(false)) {} + + autofill::TestAutofillManagerWaiter& waiter() { return waiter_; } + + private: + autofill::TestAutofillManagerWaiter waiter_{ + *this, + {&AutofillManager::Observer::OnAfterFormsSeen}}; +}; + } // namespace class FormfillPageLoadMetricsObserverBrowserTest : public InProcessBrowserTest { @@ -57,9 +78,14 @@ UserDataFieldFilledUseCounter) { base::HistogramTester histogram_tester; + // When loading the page, wait until OnFormsSeen(). + autofill::TestAutofillManagerInjector<TestAutofillManager> + autofill_manager_injector(web_contents()); ASSERT_TRUE(ui_test_utils::NavigateToURL( browser(), embedded_test_server()->GetURL("/autofill/autofill_test_form.html"))); + ASSERT_TRUE( + autofill_manager_injector.GetForPrimaryMainFrame()->waiter().Wait(1)); ASSERT_TRUE( content::ExecuteScript(web_contents(), kEditPhoneAndEmailFieldScript));
diff --git a/chrome/browser/policy/BUILD.gn b/chrome/browser/policy/BUILD.gn index af55f39..6bff7bc 100644 --- a/chrome/browser/policy/BUILD.gn +++ b/chrome/browser/policy/BUILD.gn
@@ -87,9 +87,9 @@ if (is_chromeos_ash) { deps += [ "//ash/components/settings:settings", - "//ash/components/tpm", "//ash/constants:constants", "//base", + "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/network", "//chromeos/system:system", "//components/policy/core/common:common_constants",
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 4df9088..69fd90bc 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1180,6 +1180,9 @@ { key::kKerberosDomainAutocomplete, prefs::kKerberosDomainAutocomplete, base::Value::Type::STRING }, + { key::kKerberosDefaultConfiguration, + prefs::kKerberosDefaultConfiguration, + base::Value::Type::STRING }, { key::kStartupBrowserWindowLaunchSuppressed, prefs::kStartupBrowserWindowLaunchSuppressed, base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/policy/messaging_layer/util/reporting_server_connector_unittest.cc b/chrome/browser/policy/messaging_layer/util/reporting_server_connector_unittest.cc index 0d8e82a..e0fa496 100644 --- a/chrome/browser/policy/messaging_layer/util/reporting_server_connector_unittest.cc +++ b/chrome/browser/policy/messaging_layer/util/reporting_server_connector_unittest.cc
@@ -24,7 +24,7 @@ #include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #endif using ::testing::_;
diff --git a/chrome/browser/policy/networking/device_network_configuration_updater_ash.cc b/chrome/browser/policy/networking/device_network_configuration_updater_ash.cc index 7a56112..9f0bdf0 100644 --- a/chrome/browser/policy/networking/device_network_configuration_updater_ash.cc +++ b/chrome/browser/policy/networking/device_network_configuration_updater_ash.cc
@@ -6,7 +6,6 @@ #include "ash/components/settings/cros_settings_names.h" #include "ash/components/settings/cros_settings_provider.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_features.h" #include "ash/constants/ash_switches.h" #include "base/bind.h" @@ -18,6 +17,7 @@ #include "chrome/browser/ash/settings/cros_settings.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/browser_process_platform_part.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/network/managed_network_configuration_handler.h" #include "chromeos/ash/components/network/network_device_handler.h" #include "chromeos/components/onc/onc_parsed_certificates.h"
diff --git a/chrome/browser/policy/profile_policy_connector_unittest.cc b/chrome/browser/policy/profile_policy_connector_unittest.cc index 635e1da..a100a5e 100644 --- a/chrome/browser/policy/profile_policy_connector_unittest.cc +++ b/chrome/browser/policy/profile_policy_connector_unittest.cc
@@ -36,8 +36,8 @@ #include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/user_manager/scoped_user_manager.h" #endif // BUILDFLAG(IS_CHROMEOS_ASH)
diff --git a/chrome/browser/policy/test/network_time_policy_browsertest.cc b/chrome/browser/policy/test/network_time_policy_browsertest.cc index 250e8daf..5fff4128 100644 --- a/chrome/browser/policy/test/network_time_policy_browsertest.cc +++ b/chrome/browser/policy/test/network_time_policy_browsertest.cc
@@ -28,16 +28,17 @@ class NetworkTimePolicyTest : public SafeBrowsingPolicyTest { public: - NetworkTimePolicyTest() = default; + NetworkTimePolicyTest() { + std::map<std::string, std::string> parameters; + parameters["FetchBehavior"] = "on-demand-only"; + scoped_feature_list_.InitAndEnableFeatureWithParameters( + network_time::kNetworkTimeServiceQuerying, parameters); + } NetworkTimePolicyTest(const NetworkTimePolicyTest&) = delete; NetworkTimePolicyTest& operator=(const NetworkTimePolicyTest&) = delete; ~NetworkTimePolicyTest() override = default; void SetUpOnMainThread() override { - std::map<std::string, std::string> parameters; - parameters["FetchBehavior"] = "on-demand-only"; - scoped_feature_list_.InitAndEnableFeatureWithParameters( - network_time::kNetworkTimeServiceQuerying, parameters); SafeBrowsingPolicyTest::SetUpOnMainThread(); } @@ -66,11 +67,7 @@ uint32_t num_requests_ = 0; }; -// TODO(https://crbug.com/1012853): This test is using ScopedFeatureList -// incorrectly, and fixing it causes conflicts with PolicyTest's use of the -// deprecated variations API. -IN_PROC_BROWSER_TEST_F(NetworkTimePolicyTest, - DISABLED_NetworkTimeQueriesDisabled) { +IN_PROC_BROWSER_TEST_F(NetworkTimePolicyTest, NetworkTimeQueriesDisabled) { // Set a policy to disable network time queries. PolicyMap policies; policies.Set(key::kBrowserNetworkTimeQueriesEnabled, POLICY_LEVEL_MANDATORY,
diff --git a/chrome/browser/prefs/proxy_policy_unittest.cc b/chrome/browser/prefs/proxy_policy_unittest.cc index ac43785..dd01a20 100644 --- a/chrome/browser/prefs/proxy_policy_unittest.cc +++ b/chrome/browser/prefs/proxy_policy_unittest.cc
@@ -31,7 +31,7 @@ #include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #endif using ::testing::Return;
diff --git a/chrome/browser/preloading/chrome_preloading.cc b/chrome/browser/preloading/chrome_preloading.cc index 2bd23f4f..6fec34222 100644 --- a/chrome/browser/preloading/chrome_preloading.cc +++ b/chrome/browser/preloading/chrome_preloading.cc
@@ -62,7 +62,11 @@ bool IsSearchDestinationMatch(const std::u16string& preloading_search_terms, content::WebContents& web_contents, const GURL& navigation_url) { - DCHECK(!preloading_search_terms.empty()); + // Return false in case search_terms are empty as we only match with valid + // search terms. + if (preloading_search_terms.empty()) + return false; + std::u16string matched_search_terms = ExtractSearchTermsFromURL(web_contents, navigation_url); return matched_search_terms == preloading_search_terms;
diff --git a/chrome/browser/preloading/chrome_preloading.h b/chrome/browser/preloading/chrome_preloading.h index 7093c05ae..b40e1ed 100644 --- a/chrome/browser/preloading/chrome_preloading.h +++ b/chrome/browser/preloading/chrome_preloading.h
@@ -84,6 +84,24 @@ static_cast<int>( content::PreloadingEligibility::kPreloadingEligibilityContentEnd) + 3, + + // Preloading was ineligible because the default search engine was not set. + kSearchEngineNotValid = + static_cast<int>( + content::PreloadingEligibility::kPreloadingEligibilityContentEnd) + + 4, + + // Preloading can't be started because there are no search terms present. + kNoSearchTerms = + static_cast<int>( + content::PreloadingEligibility::kPreloadingEligibilityContentEnd) + + 5, + + // Preloading was ineligible due to error in the network request. + kPreloadingErrorBackOff = + static_cast<int>( + content::PreloadingEligibility::kPreloadingEligibilityContentEnd) + + 6, }; // Helper method to convert ChromePreloadingEligibility to
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc index 9b259ba..606d617 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.cc
@@ -25,6 +25,7 @@ #include "components/search_engines/template_url_service.h" #include "content/public/browser/client_hints.h" #include "content/public/browser/frame_accept_header.h" +#include "content/public/browser/preloading.h" #include "content/public/browser/preloading_data.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/url_loader_throttles.h" @@ -141,10 +142,15 @@ const std::u16string& prefetch_search_terms, const GURL& prefetch_url, bool navigation_prefetch, + content::PreloadingAttempt* prefetch_preloading_attempt, base::OnceCallback<void(bool)> report_error_callback) : prefetch_search_terms_(prefetch_search_terms), prefetch_url_(prefetch_url), navigation_prefetch_(navigation_prefetch), + prefetch_preloading_attempt_( + prefetch_preloading_attempt + ? prefetch_preloading_attempt->GetWeakPtr() + : nullptr), report_error_callback_(std::move(report_error_callback)) {} SearchPrefetchRequest::~SearchPrefetchRequest() { @@ -494,6 +500,28 @@ } } +void SearchPrefetchRequest::SetPrefetchAttemptFailureReason( + content::PreloadingFailureReason reason) { + if (!prefetch_preloading_attempt_) + return; + + prefetch_preloading_attempt_->SetFailureReason(reason); + + // For prefetch it is possible that the prefetch could be used for a different + // navigation after failure which is out of scope with Preloading APIs. Reset + // the PreloadingAttempt to avoid setting the values for different navigation + // than the one we are observing. + prefetch_preloading_attempt_.reset(); +} + +void SearchPrefetchRequest::SetPrefetchAttemptTriggeringOutcome( + content::PreloadingTriggeringOutcome outcome) { + if (!prefetch_preloading_attempt_) + return; + + prefetch_preloading_attempt_->SetTriggeringOutcome(outcome); +} + void SearchPrefetchRequest::SetSearchPrefetchStatus( SearchPrefetchStatus new_status) { #if DCHECK_IS_ON() @@ -545,6 +573,52 @@ /*new_state=*/new_status); #endif // DCHECK_IS_ON() current_status_ = new_status; + + // Update the PreloadingTriggeringOutcome once we update status. + switch (current_status_) { + case SearchPrefetchStatus::kNotStarted: + // When prefetch is not started, we consider the + // PreloadingTriggeringOutcome as kUnspecified. The exact reason why + // prefetch is not started is recorded in PreloadingEligibility. + return; + case SearchPrefetchStatus::kInFlight: + // Once prefetch started set TriggeringOutcome to kRunning. + SetPrefetchAttemptTriggeringOutcome( + content::PreloadingTriggeringOutcome::kRunning); + return; + case SearchPrefetchStatus::kCanBeServed: + // Mark prefetch to ready, once we can serve prefetch. With + // PreloadingAttempt, ready means the attempt can be used when needed. + SetPrefetchAttemptTriggeringOutcome( + content::PreloadingTriggeringOutcome::kReady); + return; + case SearchPrefetchStatus::kCanBeServedAndUserClicked: + case SearchPrefetchStatus::kComplete: + // Don't update the TriggeringOutcome here as we have already set the + // TriggeringOutcome when the status was updated to kCanServed. + return; + case SearchPrefetchStatus::kRequestCancelled: + case SearchPrefetchStatus::kRequestFailed: + // Since we are cancelling prefetch when either request failed or + // cancelled we consider it as a failure with PreloadingTriggeringOutcome. + SetPrefetchAttemptTriggeringOutcome( + content::PreloadingTriggeringOutcome::kFailure); + return; + case SearchPrefetchStatus::kPrerendered: + SetPrefetchAttemptTriggeringOutcome(content::PreloadingTriggeringOutcome:: + kTriggeredButUpgradedToPrerender); + return; + case SearchPrefetchStatus::kPrefetchServedForRealNavigation: + // Once prefetch is served mark it as success. + SetPrefetchAttemptTriggeringOutcome( + content::PreloadingTriggeringOutcome::kSuccess); + return; + case SearchPrefetchStatus::kPrerenderedAndClicked: + case SearchPrefetchStatus::kPrerenderActivated: + // In case of prerender we don't update the triggering outcome to success + // because we measure this with prerender attempt. + return; + } } std::ostream& operator<<(std::ostream& o, const SearchPrefetchStatus& s) {
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h index 427b164..b08fccd 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_request.h
@@ -19,6 +19,8 @@ class StreamingSearchPrefetchURLLoader; namespace content { class PreloadingAttempt; +enum class PreloadingTriggeringOutcome; +enum class PreloadingFailureReason; } // namespace content // These values are persisted to logs. Entries should not be renumbered and @@ -79,6 +81,7 @@ SearchPrefetchRequest(const std::u16string& prefetch_search_terms, const GURL& prefetch_url, bool navigation_prefetch, + content::PreloadingAttempt* prefetch_preloading_attempt, base::OnceCallback<void(bool)> report_error_callback); ~SearchPrefetchRequest(); @@ -154,6 +157,10 @@ const GURL& prefetch_url() const { return prefetch_url_; } + // Sets `prefetch_preloading_attempt_` PreloadingFailureReason to `reason` if + // exists. + void SetPrefetchAttemptFailureReason(content::PreloadingFailureReason reason); + private: // Starts and begins processing |resource_request|. void StartPrefetchRequestInternal( @@ -172,6 +179,11 @@ // Updates the `current_status_` to status. void SetSearchPrefetchStatus(SearchPrefetchStatus status); + // Sets the PreloadingTriggeringOutcome for `prefetch_preloading_attempt_` to + // `outcome`. + void SetPrefetchAttemptTriggeringOutcome( + content::PreloadingTriggeringOutcome outcome); + // Whether the request has received a servable response. See // `CanServePrefetchRequest` in ./streaming_search_prefetch_url_loader.cc for // the definition of servable response. @@ -200,6 +212,14 @@ // The ongoing prefetch request. Null before and after the fetch. std::unique_ptr<StreamingSearchPrefetchURLLoader> streaming_url_loader_; + // Once set, this is used to log the metrics corresponding to the prefetch + // attempt. Please note this is different from `prerender_preloading_attempt_` + // which is for corresponding prerender attempt. We store the WeakPtr because + // it is possible that the PreloadingAttempt can be deleted (on navigation) or + // not created (when no WebContents is present) before search prefetch uses + // it. + base::WeakPtr<content::PreloadingAttempt> prefetch_preloading_attempt_; + // Called when there is a network/server error on the prefetch request. base::OnceCallback<void(bool)> report_error_callback_;
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc index bc50c1d..0ca5f875 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.cc
@@ -106,6 +106,50 @@ BaseSearchProvider::ShouldPrerender(match); } +void SetEligibility(content::PreloadingAttempt* preloading_attempt, + content::PreloadingEligibility eligibility) { + if (!preloading_attempt) + return; + + preloading_attempt->SetEligibility(eligibility); +} + +// Returns true when Prefetch is not in the holdback group. +bool CheckAndSetPrefetchHoldbackStatus( + content::PreloadingAttempt* preloading_attempt) { + // Return true as we only set and check for holdback when PreloadingAttempt is + // created. + if (!preloading_attempt) + return true; + + if (base::GetFieldTrialParamByFeatureAsBool(kSearchPrefetchServicePrefetching, + "prefetch_holdback", false)) { + preloading_attempt->SetHoldbackStatus( + content::PreloadingHoldbackStatus::kHoldback); + return false; + } else { + preloading_attempt->SetHoldbackStatus( + content::PreloadingHoldbackStatus::kAllowed); + return true; + } +} + +void SetTriggeringOutcome(content::PreloadingAttempt* preloading_attempt, + content::PreloadingTriggeringOutcome outcome) { + if (!preloading_attempt) + return; + + preloading_attempt->SetTriggeringOutcome(outcome); +} + +content::PreloadingFailureReason ToPreloadingFailureReason( + SearchPrefetchServingReason reason) { + return static_cast<content::PreloadingFailureReason>( + static_cast<int>(reason) + + static_cast<int>( + content::PreloadingFailureReason::kPreloadingFailureReasonCommonEnd)); +} + } // namespace struct SearchPrefetchService::SearchPrefetchServingReasonRecorder { @@ -181,20 +225,45 @@ template_url_service->GetDefaultSearchProvider()->ExtractSearchTermsFromURL( url, template_url_service->search_terms_data(), &search_terms); + // It is possible that the current page doesn't exist. Don't create + // PreloadingAttempt in that case. + content::PreloadingAttempt* attempt = nullptr; + DCHECK(web_contents); + content::PreloadingURLMatchCallback same_url_matcher = base::BindRepeating( + &IsSearchDestinationMatch, search_terms, std::ref(*web_contents)); + + auto* preloading_data = + content::PreloadingData::GetOrCreateForWebContents(web_contents); + + // TODO(crbug.com/1346344): Integrate PreloadingAPIs with + // OmniboxSearchPredictor prefetch attempts. + if (!navigation_prefetch) { + // Create new PreloadingAttempt and pass all the values corresponding to + // this DefaultSearchEngine prefetch attempt. + attempt = preloading_data->AddPreloadingAttempt( + ToPreloadingPredictor(ChromePreloadingPredictor::kDefaultSearchEngine), + content::PreloadingType::kPrefetch, same_url_matcher); + } if (search_terms.size() == 0) { recorder.reason_ = SearchPrefetchEligibilityReason::kNotDefaultSearchWithTerms; + SetEligibility(attempt, ToPreloadingEligibility( + ChromePreloadingEligibility::kNoSearchTerms)); return false; } if (!prefetch::IsSomePreloadingEnabled(*profile_->GetPrefs())) { recorder.reason_ = SearchPrefetchEligibilityReason::kPrefetchDisabled; + SetEligibility(attempt, + content::PreloadingEligibility::kPreloadingDisabled); return false; } if (!profile_->GetPrefs() || !profile_->GetPrefs()->GetBoolean(prefs::kWebKitJavascriptEnabled)) { recorder.reason_ = SearchPrefetchEligibilityReason::kJavascriptDisabled; + SetEligibility(attempt, + content::PreloadingEligibility::kJavascriptDisabled); return false; } @@ -204,6 +273,8 @@ content_settings->GetContentSetting( url, url, ContentSettingsType::JAVASCRIPT) == CONTENT_SETTING_BLOCK) { recorder.reason_ = SearchPrefetchEligibilityReason::kJavascriptDisabled; + SetEligibility(attempt, + content::PreloadingEligibility::kJavascriptDisabled); return false; } @@ -211,6 +282,9 @@ (last_error_time_ticks_ + SearchPrefetchErrorBackoffDuration() > base::TimeTicks::Now())) { recorder.reason_ = SearchPrefetchEligibilityReason::kErrorBackoff; + SetEligibility(attempt, + ToPreloadingEligibility( + ChromePreloadingEligibility::kPreloadingErrorBackOff)); return false; } @@ -225,6 +299,12 @@ status == SearchPrefetchStatus::kPrerendered) { recorder.reason_ = SearchPrefetchEligibilityReason::kAttemptedQueryRecently; + // Prefetch was eligible as it was attempted recently but mark it as a + // duplicate attempt. + SetEligibility(attempt, content::PreloadingEligibility::kEligible); + CheckAndSetPrefetchHoldbackStatus(attempt); + SetTriggeringOutcome(attempt, + content::PreloadingTriggeringOutcome::kDuplicate); return false; } @@ -233,20 +313,43 @@ DeletePrefetch(search_terms); } + // Prefetch has completed all the eligibility checks. Set the + // PreloadingEligibility to kEligible. + SetEligibility(attempt, content::PreloadingEligibility::kEligible); + + // Don't trigger prefetch if it is in holdback group. We do this after all the + // eligibility checks to ensure we replicate the behaviour between our + // experiment groups. + if (!CheckAndSetPrefetchHoldbackStatus(attempt)) + return false; + if (prefetches_.size() >= SearchPrefetchMaxAttemptsPerCachingDuration()) { recorder.reason_ = SearchPrefetchEligibilityReason::kMaxAttemptsReached; + // The reason we don't consider limit exceeded as an ineligibility + // reason is because we can't replicate the behavior in our other + // experiment groups for analysis. To prevent this we set + // TriggeringOutcome to kFailure and look into the failure reason to + // learn more. + SetTriggeringOutcome(attempt, + content::PreloadingTriggeringOutcome::kFailure); return false; } std::unique_ptr<SearchPrefetchRequest> prefetch_request = std::make_unique<SearchPrefetchRequest>( - search_terms, url, navigation_prefetch, + search_terms, url, navigation_prefetch, attempt, base::BindOnce(&SearchPrefetchService::ReportFetchResult, base::Unretained(this))); DCHECK(prefetch_request); if (!prefetch_request->StartPrefetchRequest(profile_)) { recorder.reason_ = SearchPrefetchEligibilityReason::kThrottled; + // We don't consider Throttled as an ineligibility reason is because we + // can't replicate this behaviour in our other experiment group. To prevent + // this we set TriggeringOutcome to kFailure and look into the failure + // reason to learn more. + SetTriggeringOutcome(attempt, + content::PreloadingTriggeringOutcome::kFailure); return false; } @@ -399,6 +502,9 @@ iter->second->current_status() != SearchPrefetchStatus::kCanBeServedAndUserClicked) { recorder.reason_ = SearchPrefetchServingReason::kNotServedOtherReason; + // Set the failure reason when prefetch is not served. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kNotServedOtherReason)); return nullptr; } @@ -566,6 +672,8 @@ content::WebContents* web_contents) { if (!IsSearchNavigationPrefetchEnabled()) return; + if (!web_contents) + return; // Assume the user is going back to enter more for now. if (index == 0) return; @@ -844,7 +952,8 @@ const auto& iter = prefetches_.find(search_terms); - // Check if present is present before checking for other reasons. + // Return early if there is no prefetch found before checking for other + // reasons. if (iter == prefetches_.end()) { recorder.reason_ = SearchPrefetchServingReason::kNoPrefetch; return prefetches_.end(); @@ -854,6 +963,9 @@ if (!profile_->GetPrefs() || !profile_->GetPrefs()->GetBoolean(prefs::kWebKitJavascriptEnabled)) { recorder.reason_ = SearchPrefetchServingReason::kJavascriptDisabled; + // Set the corresponding failure reason. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kJavascriptDisabled)); return prefetches_.end(); } @@ -864,6 +976,9 @@ ContentSettingsType::JAVASCRIPT) == CONTENT_SETTING_BLOCK) { recorder.reason_ = SearchPrefetchServingReason::kJavascriptDisabled; + // Set the corresponding failure reason. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kJavascriptDisabled)); return prefetches_.end(); } @@ -875,9 +990,14 @@ url::Origin::Create(iter->second->prefetch_url())) { recorder.reason_ = SearchPrefetchServingReason::kPrefetchWasForDifferentOrigin; + // Set the corresponding failure reason. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kPrefetchWasForDifferentOrigin)); return prefetches_.end(); } + // No need to update the failure reason as these are marked in + // TriggeringOutcome for prefetch attempt. switch (iter->second->current_status()) { case SearchPrefetchStatus::kRequestCancelled: recorder.reason_ = SearchPrefetchServingReason::kRequestWasCancelled; @@ -899,6 +1019,9 @@ if (tentative_resource_request.method != net::HttpRequestHeaders::kGetMethod) { recorder.reason_ = SearchPrefetchServingReason::kPostReloadFormOrLink; + // Set the corresponding failure reason. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kPostReloadFormOrLink)); return prefetches_.end(); } @@ -909,6 +1032,10 @@ tentative_resource_request.load_flags & net::LOAD_DISABLE_CACHE || tentative_resource_request.load_flags & net::LOAD_VALIDATE_CACHE) { recorder.reason_ = SearchPrefetchServingReason::kPostReloadFormOrLink; + // Set the corresponding failure reason. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kPostReloadFormOrLink)); + return prefetches_.end(); } @@ -923,6 +1050,9 @@ tentative_resource_request.transition_type), ui::PAGE_TRANSITION_FORM_SUBMIT)) { recorder.reason_ = SearchPrefetchServingReason::kPostReloadFormOrLink; + // Set the corresponding failure reason. + iter->second->SetPrefetchAttemptFailureReason(ToPreloadingFailureReason( + SearchPrefetchServingReason::kPostReloadFormOrLink)); return prefetches_.end(); }
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc index 8143e1c..81aa893 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_browsertest.cc
@@ -12,6 +12,7 @@ #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/prefetch/prefetch_prefs.h" +#include "chrome/browser/preloading/chrome_preloading.h" #include "chrome/browser/preloading/prefetch/search_prefetch/field_trial_settings.h" #include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_browser_test_base.h" #include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h" @@ -40,9 +41,12 @@ #include "content/public/test/back_forward_cache_util.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/preloading_test_util.h" #include "content/public/test/test_navigation_observer.h" #include "net/base/url_util.h" #include "net/test/embedded_test_server/http_request.h" +#include "services/metrics/public/cpp/ukm_builders.h" +#include "services/metrics/public/cpp/ukm_recorder.h" #include "services/network/public/mojom/network_context.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/loader/url_loader_throttle.h" @@ -65,6 +69,10 @@ constexpr char kThrottleHeaderValue[] = "porgs-header-value"; constexpr char kServiceWorkerUrl[] = "/navigation_preload.js"; +using UkmEntry = ukm::TestUkmRecorder::HumanReadableUkmEntry; +using ukm::builders::Preloading_Attempt; +using ukm::builders::Preloading_Prediction; + enum class BlockOnHeaders { kBlockOnHeaders = 0, kDirectBeforeHeaders = 1, @@ -232,6 +240,14 @@ } }; +content::PreloadingFailureReason ToPreloadingFailureReason( + SearchPrefetchServingReason reason) { + return static_cast<content::PreloadingFailureReason>( + static_cast<int>(reason) + + static_cast<int>( + content::PreloadingFailureReason::kPreloadingFailureReasonCommonEnd)); +} + class SearchPrefetchWithoutPrefetchingBrowserTest : public SearchPrefetchBaseBrowserTest { public: @@ -239,8 +255,30 @@ feature_list_.InitWithFeatures({}, {kSearchPrefetchServicePrefetching}); } + void SetUpOnMainThread() override { + SearchPrefetchBaseBrowserTest::SetUpOnMainThread(); + // Initialize PreloadingAttempt for the test suite. + test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); + attempt_entry_builder_ = + std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( + ToPreloadingPredictor( + ChromePreloadingPredictor::kDefaultSearchEngine)); + } + + ukm::TestAutoSetUkmRecorder* test_ukm_recorder() { + return test_ukm_recorder_.get(); + } + + const content::test::PreloadingAttemptUkmEntryBuilder& + attempt_entry_builder() { + return *attempt_entry_builder_; + } + private: base::test::ScopedFeatureList feature_list_; + std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_; + std::unique_ptr<content::test::PreloadingAttemptUkmEntryBuilder> + attempt_entry_builder_; }; IN_PROC_BROWSER_TEST_F(SearchPrefetchWithoutPrefetchingBrowserTest, @@ -260,6 +298,99 @@ base::ASCIIToUTF16(search_terms)); EXPECT_FALSE(prefetch_status.has_value()); + + // Navigate to flush metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + // Check that we don't store any preloading attempts in case prefetch is + // disabled. + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 0u); + } +} + +class SearchPrefetchHoldbackBrowserTest : public SearchPrefetchBaseBrowserTest { + public: + SearchPrefetchHoldbackBrowserTest() { + feature_list_.InitWithFeaturesAndParameters( + {{kSearchPrefetchServicePrefetching, {{"prefetch_holdback", "true"}}}}, + {/* disabled_features */}); + } + + void SetUpOnMainThread() override { + SearchPrefetchBaseBrowserTest::SetUpOnMainThread(); + // Initialize PreloadingAttempt for the test suite. + test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); + attempt_entry_builder_ = + std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( + ToPreloadingPredictor( + ChromePreloadingPredictor::kDefaultSearchEngine)); + } + + ukm::TestAutoSetUkmRecorder* test_ukm_recorder() { + return test_ukm_recorder_.get(); + } + + const content::test::PreloadingAttemptUkmEntryBuilder& + attempt_entry_builder() { + return *attempt_entry_builder_; + } + + private: + base::test::ScopedFeatureList feature_list_; + std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_; + std::unique_ptr<content::test::PreloadingAttemptUkmEntryBuilder> + attempt_entry_builder_; +}; + +IN_PROC_BROWSER_TEST_F(SearchPrefetchHoldbackBrowserTest, + NoFetchInPrefetchHoldback) { + auto* search_prefetch_service = + SearchPrefetchServiceFactory::GetForProfile(browser()->profile()); + EXPECT_NE(nullptr, search_prefetch_service); + + std::string search_terms = "prefetch_content"; + + GURL prefetch_url = GetSearchServerQueryURL(search_terms); + + EXPECT_FALSE(search_prefetch_service->MaybePrefetchURL(prefetch_url, + GetWebContents())); + auto prefetch_status = + search_prefetch_service->GetSearchPrefetchStatusForTesting( + base::ASCIIToUTF16(search_terms)); + + EXPECT_FALSE(prefetch_status.has_value()); + + // Navigate to flush metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + // Check that we store one entry corresponding to the preloading attempt + // for prefetch. + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Check that PreloadingHoldbackStatus is set to kHoldback as + // prefetch_holdback is set. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kHoldback, + content::PreloadingTriggeringOutcome::kUnspecified, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } // General test for standard behavior. The interface bool represents whether @@ -289,8 +420,30 @@ return std::get<0>(GetParam()) == BlockOnHeaders::kBlockOnHeaders; } + void SetUpOnMainThread() override { + SearchPrefetchBaseBrowserTest::SetUpOnMainThread(); + // Initialize PreloadingAttempt builder for the test suite. + test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); + attempt_entry_builder_ = + std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( + ToPreloadingPredictor( + ChromePreloadingPredictor::kDefaultSearchEngine)); + } + + ukm::TestAutoSetUkmRecorder* test_ukm_recorder() { + return test_ukm_recorder_.get(); + } + + const content::test::PreloadingAttemptUkmEntryBuilder& + attempt_entry_builder() { + return *attempt_entry_builder_; + } + private: base::test::ScopedFeatureList feature_list_; + std::unique_ptr<ukm::TestAutoSetUkmRecorder> test_ukm_recorder_; + std::unique_ptr<content::test::PreloadingAttemptUkmEntryBuilder> + attempt_entry_builder_; }; IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -347,6 +500,37 @@ base::ASCIIToUTF16(search_terms)); ASSERT_TRUE(prefetch_status.has_value()); EXPECT_EQ(SearchPrefetchStatus::kComplete, prefetch_status.value()); + + // Navigate to a different URL other than the prefetch URL to flush the + // metrics. + GURL navigated_url = GURL("https://google.com"); + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), navigated_url)); + { + // Check that we store one entry corresponding to the preloading attempt + // for prefetch. + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Since we navigated to a different URL, prefetch attempt should record + // kReady status and `is_accurate_triggering` should be false. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kReady, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -372,6 +556,33 @@ SearchPrefetchEligibilityReason::kThrottled, 1); EXPECT_FALSE(prefetch_status.has_value()); content::SetBrowserClientForTesting(old_client); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Check that TriggeringOutcome should be set to kFailure in case of + // Throttles. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kFailure, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -615,6 +826,58 @@ prefetch_status = search_prefetch_service->GetSearchPrefetchStatusForTesting(u"prefetch_4"); EXPECT_FALSE(prefetch_status.has_value()); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), GetSearchServerQueryURL("prefetch_1"))); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + + // Four attempts should be recorded for Prefetch. + EXPECT_EQ(attempt_ukm_entries.size(), 4u); + + // Since we only allow maximum three prefetches happen at once, the fourth + // prefetch should be marked as Failure. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kFailure, + ToPreloadingFailureReason( + SearchPrefetchServingReason::kNotServedOtherReason), + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kReady, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kReady, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kFailure, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -690,6 +953,33 @@ base::ASCIIToUTF16(search_terms)); ASSERT_TRUE(prefetch_status.has_value()); EXPECT_EQ(SearchPrefetchStatus::kRequestFailed, prefetch_status.value()); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Check that TriggeringOutcome should be marked as kFailure in case of + // RequestFailed. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kFailure, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -717,6 +1007,40 @@ histogram_tester.ExpectBucketCount( "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch", SearchPrefetchEligibilityReason::kAttemptedQueryRecently, 1); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 2u); + + // Check that TriggeringOutcome should be marked as duplicate for the second + // attempt to the same url. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kSuccess, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kDuplicate, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, BadURL) { @@ -734,6 +1058,34 @@ histogram_tester.ExpectUniqueSample( "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch", SearchPrefetchEligibilityReason::kNotDefaultSearchWithTerms, 1); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Check that we set PreloadingEligibility to kNoSearchTerms when no search + // terms were present. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + ToPreloadingEligibility( + ChromePreloadingEligibility::kNoSearchTerms), + content::PreloadingHoldbackStatus::kUnspecified, + content::PreloadingTriggeringOutcome::kUnspecified, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -754,6 +1106,33 @@ histogram_tester.ExpectUniqueSample( "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch", SearchPrefetchEligibilityReason::kPrefetchDisabled, 1); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Check that we set the eligibility reason to kPreloadingDisabled when + // preload is disabled. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kPreloadingDisabled, + content::PreloadingHoldbackStatus::kUnspecified, + content::PreloadingTriggeringOutcome::kUnspecified, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -797,6 +1176,30 @@ "Omnibox.SearchPrefetch.ClickToNavigationIntercepted", 1); histogram_tester.ExpectTotalCount( "Omnibox.SearchPrefetch.NavigationInterceptedToForwardingComplete", 1); + + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Prerender should succeed and should be used for the next navigation. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kSuccess, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -1267,6 +1670,42 @@ histogram_tester.ExpectBucketCount( "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch", SearchPrefetchEligibilityReason::kErrorBackoff, 1); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 2u); + + // Check that we store two preloading attempts, where the first one fails + // due to network request error whereas the second one sets the correct + // EligibilityStatus to kPreloadingErrorBackOff. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kFailure, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + ToPreloadingEligibility( + ChromePreloadingEligibility::kPreloadingErrorBackOff), + content::PreloadingHoldbackStatus::kUnspecified, + content::PreloadingTriggeringOutcome::kUnspecified, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest, @@ -1935,6 +2374,33 @@ histogram_tester.ExpectUniqueSample( "Omnibox.SearchPrefetch.PrefetchEligibilityReason2.SuggestionPrefetch", SearchPrefetchEligibilityReason::kJavascriptDisabled, 1); + + // Navigate to flush the metrics. + ASSERT_TRUE(ui_test_utils::NavigateToURL(browser(), prefetch_url)); + { + ukm::SourceId ukm_source_id = + GetWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); + auto attempt_ukm_entries = test_ukm_recorder()->GetEntries( + Preloading_Attempt::kEntryName, + content::test::kPreloadingAttemptUkmMetrics); + EXPECT_EQ(attempt_ukm_entries.size(), 1u); + + // Check that we set the correct EligibilityReason in case prefetch is + // ineligibile due to WebKitJavascriptEnabled. + std::vector<UkmEntry> expected_attempt_entries = { + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kJavascriptDisabled, + content::PreloadingHoldbackStatus::kUnspecified, + content::PreloadingTriggeringOutcome::kUnspecified, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + }; + EXPECT_THAT(attempt_ukm_entries, + testing::UnorderedElementsAreArray(expected_attempt_entries)) + << content::test::ActualVsExpectedUkmEntriesToString( + attempt_ukm_entries, expected_attempt_entries); + } } IN_PROC_BROWSER_TEST_P(SearchPrefetchServiceEnabledBrowserTest,
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc index 579d9a1..3fa6ec80 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc
@@ -136,7 +136,6 @@ test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); attempt_entry_builder_ = std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( - content::PreloadingType::kPrerender, ToPreloadingPredictor( ChromePreloadingPredictor::kDefaultSearchEngine)); prediction_entry_builder_ = @@ -560,7 +559,7 @@ auto prediction_ukm_entries = test_ukm_recorder()->GetEntries( Preloading_Prediction::kEntryName, content::test::kPreloadingPredictionUkmMetrics); - EXPECT_EQ(attempt_ukm_entries.size(), 1u); + EXPECT_EQ(attempt_ukm_entries.size(), 2u); EXPECT_EQ(prediction_ukm_entries.size(), 1u); // Prerender should succeed and should be used for the next navigation. @@ -571,7 +570,16 @@ }; std::vector<UkmEntry> expected_attempt_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome:: + kTriggeredButUpgradedToPrerender, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified, @@ -651,12 +659,28 @@ auto ukm_entries = test_ukm_recorder()->GetEntries( Preloading_Attempt::kEntryName, content::test::kPreloadingAttemptUkmMetrics); - EXPECT_EQ(ukm_entries.size(), 1u); + EXPECT_EQ(ukm_entries.size(), 3u); // Prerender should succeed and should be used for the next navigation. std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome:: + kTriggeredButUpgradedToPrerender, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kDuplicate, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified, @@ -802,17 +826,32 @@ auto ukm_entries = test_ukm_recorder()->GetEntries( Preloading_Attempt::kEntryName, content::test::kPreloadingAttemptUkmMetrics); - EXPECT_EQ(ukm_entries.size(), 1u); + EXPECT_EQ(ukm_entries.size(), 3u); // Prerender shouldn't be used for the next navigation as it will be deleted // when suggestions change. std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kFailure, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kFailure, ToPreloadingFailureReason(PrerenderPredictionStatus::kCancelled), /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kReady, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), }; EXPECT_THAT(ukm_entries, testing::UnorderedElementsAreArray(expected_entries)) @@ -942,14 +981,23 @@ auto ukm_entries = test_ukm_recorder()->GetEntries( Preloading_Attempt::kEntryName, content::test::kPreloadingAttemptUkmMetrics); - EXPECT_EQ(ukm_entries.size(), 1u); + EXPECT_EQ(ukm_entries.size(), 2u); // DispatchDelayedResponseTask will dispatch DidFailLoadWithError resulting // in prerender cancelling with status 123 i.e., => // PrerenderHost::FinalStatus::DidFailLoad. std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome:: + kTriggeredButUpgradedToPrerender, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kFailure, static_cast<content::PreloadingFailureReason>(123), @@ -1018,19 +1066,35 @@ auto ukm_entries = test_ukm_recorder()->GetEntries( Preloading_Attempt::kEntryName, content::test::kPreloadingAttemptUkmMetrics); - EXPECT_EQ(ukm_entries.size(), 2u); + EXPECT_EQ(ukm_entries.size(), 4u); ukm::SourceId ukm_source_id = GetActiveWebContents()->GetPrimaryMainFrame()->GetPageUkmSourceId(); std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome:: + kTriggeredButUpgradedToPrerender, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kReady, content::PreloadingFailureReason::kUnspecified, /*accurate=*/false), attempt_entry_builder().BuildEntry( - ukm_source_id, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kDuplicate, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/false), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, ToPreloadingEligibility( ChromePreloadingEligibility::kPrerenderConsumed), content::PreloadingHoldbackStatus::kUnspecified, @@ -1118,12 +1182,27 @@ auto ukm_entries = test_ukm_recorder()->GetEntries( Preloading_Attempt::kEntryName, content::test::kPreloadingAttemptUkmMetrics); - EXPECT_EQ(ukm_entries.size(), 1u); + EXPECT_EQ(ukm_entries.size(), 3u); // Prerender should be under holdback and not succeed. std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kSuccess, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrefetch, + content::PreloadingEligibility::kEligible, + content::PreloadingHoldbackStatus::kAllowed, + content::PreloadingTriggeringOutcome::kDuplicate, + content::PreloadingFailureReason::kUnspecified, + /*accurate=*/true), + attempt_entry_builder().BuildEntry( + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kHoldback, content::PreloadingTriggeringOutcome::kUnspecified, content::PreloadingFailureReason::kUnspecified,
diff --git a/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc b/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc index c733c1f..cc76de1 100644 --- a/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc +++ b/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc
@@ -75,7 +75,6 @@ test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); ukm_entry_builder_ = std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( - content::PreloadingType::kPrerender, ToPreloadingPredictor( ChromePreloadingPredictor::kOmniboxDirectURLInput)); ASSERT_TRUE(embedded_test_server()->Start()); @@ -194,7 +193,8 @@ EXPECT_EQ(ukm_entries.size(), 1u); UkmEntry expected_entry = ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kPreloadingDisabled, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kPreloadingDisabled, content::PreloadingHoldbackStatus::kUnspecified, content::PreloadingTriggeringOutcome::kUnspecified, content::PreloadingFailureReason::kUnspecified, @@ -233,7 +233,8 @@ EXPECT_EQ(ukm_entries.size(), 2u); UkmEntry expected_entry = ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified,
diff --git a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc index 372eb85..f4fc4ae 100644 --- a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc +++ b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
@@ -121,7 +121,6 @@ test_ukm_recorder_ = std::make_unique<ukm::TestAutoSetUkmRecorder>(); ukm_entry_builder_ = std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( - content::PreloadingType::kPrerender, ToPreloadingPredictor( ChromePreloadingPredictor::kOmniboxDirectURLInput)); @@ -332,13 +331,15 @@ std::vector<UkmEntry> expected_entries = { ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kRunning, content::PreloadingFailureReason::kUnspecified, /*accurate=*/false), ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified, @@ -402,13 +403,15 @@ std::vector<UkmEntry> expected_entries = { ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified, /*accurate=*/true), ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kDuplicate, content::PreloadingFailureReason::kUnspecified, @@ -471,7 +474,8 @@ // PreloadingHoldbackStatus should be set to kHoldback. std::vector<UkmEntry> expected_entries = { ukm_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kHoldback, content::PreloadingTriggeringOutcome::kUnspecified, content::PreloadingFailureReason::kUnspecified, @@ -626,7 +630,6 @@ // This test suite only tests for Default Search Engine prerendering. attempt_entry_builder_ = std::make_unique<content::test::PreloadingAttemptUkmEntryBuilder>( - content::PreloadingType::kPrerender, ToPreloadingPredictor( ChromePreloadingPredictor::kDefaultSearchEngine)); prediction_entry_builder_ = @@ -935,7 +938,8 @@ }; std::vector<UkmEntry> expected_attempt_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified, @@ -1016,13 +1020,15 @@ // activation and for duplicate attempt to the same prerender URL. std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified, /*accurate=*/true), attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kDuplicate, content::PreloadingFailureReason::kUnspecified, @@ -1104,13 +1110,15 @@ // activation with suggestions to the different prerender URLs. std::vector<UkmEntry> expected_entries = { attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kFailure, ToPreloadingFailureReason(PrerenderPredictionStatus::kCancelled), /*accurate=*/false), attempt_entry_builder().BuildEntry( - ukm_source_id, content::PreloadingEligibility::kEligible, + ukm_source_id, content::PreloadingType::kPrerender, + content::PreloadingEligibility::kEligible, content::PreloadingHoldbackStatus::kAllowed, content::PreloadingTriggeringOutcome::kSuccess, content::PreloadingFailureReason::kUnspecified,
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn index b479e5c..7f5a74d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/BUILD.gn
@@ -28,7 +28,6 @@ "background/braille/pan_strategy.js", "common/abstract_earcons.js", "common/extension_bridge.js", - "common/log_types.js", "common/panel_menu_data.js", "common/tree_dumper.js", "common/tts_interface.js", @@ -135,6 +134,7 @@ "common/key_util.js", "common/keyboard_handler.js", "common/locale_output_helper.js", + "common/log_types.js", "common/msgs.js", "common/panel_bridge.js", "common/panel_command.js",
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_background.js index 183b8c1..8b486ca00 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/braille/braille_background.js
@@ -10,6 +10,7 @@ import {NavBraille} from '../../common/braille/nav_braille.js'; import {BridgeConstants} from '../../common/bridge_constants.js'; import {BridgeHelper} from '../../common/bridge_helper.js'; +import {LogType} from '../../common/log_types.js'; import {ChromeVoxState} from '../chromevox_state.js'; import {LogStore} from '../logging/log_store.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js index 94def46..7e380ef 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/command_handler.js
@@ -18,6 +18,7 @@ import {EventSourceType} from '../common/event_source_type.js'; import {GestureGranularity} from '../common/gesture_command_data.js'; import {ChromeVoxKbHandler} from '../common/keyboard_handler.js'; +import {LogType} from '../common/log_types.js'; import {Msgs} from '../common/msgs.js'; import {PanelCommand, PanelCommandType} from '../common/panel_command.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js index d7c89d48..d33f5839 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/console_tts.js
@@ -5,6 +5,8 @@ /** * @fileoverview A TTS engine that writes to globalThis.console. */ +import {SpeechLog} from '../common/log_types.js'; + import {LogStore} from './logging/log_store.js'; import {ChromeVoxPrefs} from './prefs.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js index 75a6ca6b..72a7f29b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcons.js
@@ -7,6 +7,8 @@ * auditory cues. */ +import {LogType} from '../common/log_types.js'; + import {ChromeVoxState} from './chromevox_state.js'; import {EarconEngine} from './earcon_engine.js'; import {LogStore} from './logging/log_store.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js index 73e95fe..d9614b8 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/loader.js
@@ -11,18 +11,12 @@ goog.require('AutomationPredicate'); goog.require('AutomationTreeWalker'); goog.require('AutomationUtil'); -goog.require('BaseLog'); -goog.require('EventLog'); goog.require('JaPhoneticData'); -goog.require('LogType'); goog.require('PanelNodeMenuData'); goog.require('PanelTabMenuItemData'); goog.require('QueueMode'); goog.require('RecoveryStrategy'); -goog.require('SpeechLog'); -goog.require('TextLog'); goog.require('TreeDumper'); -goog.require('TreeLog'); goog.require('TreePathRecoveryStrategy'); goog.require('TtsCategory'); goog.require('TtsInterface');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js index ef608ba..6c723ffa 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/event_stream_logger.js
@@ -8,6 +8,7 @@ import {BridgeConstants} from '../../common/bridge_constants.js'; import {BridgeHelper} from '../../common/bridge_helper.js'; +import {EventLog} from '../../common/log_types.js'; import {LogStore} from './log_store.js'; @@ -106,6 +107,6 @@ BridgeHelper.registerHandler( Constants.TARGET, Constants.Action.NOTIFY_EVENT_STREAM_FILTER_CHANGED, - ({name, enabled}) => + (name, enabled) => EventStreamLogger.instance.notifyEventStreamFilterChanged( name, enabled));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js index 947867de..64c37cd1 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/logging/log_store.js
@@ -8,6 +8,7 @@ import {BridgeConstants} from '../../common/bridge_constants.js'; import {BridgeHelper} from '../../common/bridge_helper.js'; +import {BaseLog, LogType, TextLog, TreeLog} from '../../common/log_types.js'; export class LogStore { constructor() {
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js index 53c5a5f..b643516 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/output/output.js
@@ -10,6 +10,7 @@ import {NavBraille} from '../../common/braille/nav_braille.js'; import {EventSourceType} from '../../common/event_source_type.js'; import {LocaleOutputHelper} from '../../common/locale_output_helper.js'; +import {LogType} from '../../common/log_types.js'; import {Msgs} from '../../common/msgs.js'; import {Spannable} from '../../common/spannable.js'; import {ValueSelectionSpan, ValueSpan} from '../braille/spans.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js index 87c3532..795b6104 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/panel/panel_background.js
@@ -57,8 +57,7 @@ () => PanelBackground.instance.destroyISearch_()); BridgeHelper.registerHandler( Constants.TARGET, Constants.Action.FOCUS_TAB, - ({windowId, tabId}) => - PanelTabMenuBackground.focusTab(windowId, tabId)); + (windowId, tabId) => PanelTabMenuBackground.focusTab(windowId, tabId)); BridgeHelper.registerHandler( Constants.TARGET, Constants.Action.GET_ACTIONS_FOR_CURRENT_NODE, () => PanelBackground.instance.getActionsForCurrentNode_()); @@ -67,7 +66,7 @@ () => PanelTabMenuBackground.getTabMenuData()); BridgeHelper.registerHandler( Constants.TARGET, Constants.Action.INCREMENTAL_SEARCH, - ({searchStr, dir, opt_nextObject}) => + (searchStr, dir, opt_nextObject) => PanelBackground.instance.incrementalSearch_( searchStr, dir, opt_nextObject)); BridgeHelper.registerHandler( @@ -106,6 +105,9 @@ * @private */ createAllNodeMenuBackgrounds_(opt_activateMenuTitleId) { + if (!this.savedNode_) { + return; + } for (const data of ALL_NODE_MENU_DATA) { const isActivatedMenu = opt_activateMenuTitleId === data.titleId; const menuBackground = @@ -258,7 +260,9 @@ /** @private */ saveCurrentNode_() { - this.savedNode_ = ChromeVoxState.instance.currentRange.start.node; + if (ChromeVoxState.instance.currentRange) { + this.savedNode_ = ChromeVoxState.instance.currentRange.start.node; + } } /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js index acb6804..86fff3b2 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/prefs.js
@@ -219,8 +219,8 @@ BridgeHelper.registerHandler( BridgeConstants.ChromeVoxPrefs.TARGET, BridgeConstants.ChromeVoxPrefs.Action.SET_LOGGING_PREFS, - ({key, value}) => ChromeVoxPrefs.instance.setLoggingPrefs(key, value)); + (key, value) => ChromeVoxPrefs.instance.setLoggingPrefs(key, value)); BridgeHelper.registerHandler( BridgeConstants.ChromeVoxPrefs.TARGET, BridgeConstants.ChromeVoxPrefs.Action.SET_PREF, - ({key, value}) => ChromeVoxPrefs.instance.setPref(key, value)); + (key, value) => ChromeVoxPrefs.instance.setPref(key, value));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js index af451f0..e2721ba 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/user_action_monitor.js
@@ -377,7 +377,7 @@ () => UserActionMonitor.destroy()); BridgeHelper.registerHandler( BridgeConstants.UserActionMonitor.TARGET, - BridgeConstants.UserActionMonitor.Action.ON_KEY_DOWN, (evt) => { + BridgeConstants.UserActionMonitor.Action.ON_KEY_DOWN, evt => { if (!UserActionMonitor.instance) { // Continue propagating. return true;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js index cc9cb5b..319ca14e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/background_bridge.js
@@ -9,6 +9,7 @@ import {BridgeConstants} from './bridge_constants.js'; import {BridgeHelper} from './bridge_helper.js'; +import {BaseLog} from './log_types.js'; export const BackgroundBridge = {}; @@ -81,7 +82,7 @@ async setLoggingPrefs(key, value) { return BridgeHelper.sendMessage( BridgeConstants.ChromeVoxPrefs.TARGET, - BridgeConstants.ChromeVoxPrefs.Action.SET_LOGGING_PREFS, {key, value}); + BridgeConstants.ChromeVoxPrefs.Action.SET_LOGGING_PREFS, key, value); }, /** @@ -93,7 +94,7 @@ async setPref(key, value) { return BridgeHelper.sendMessage( BridgeConstants.ChromeVoxPrefs.TARGET, - BridgeConstants.ChromeVoxPrefs.Action.SET_PREF, {key, value}); + BridgeConstants.ChromeVoxPrefs.Action.SET_PREF, key, value); }, }; @@ -169,7 +170,7 @@ BridgeConstants.EventStreamLogger.TARGET, BridgeConstants.EventStreamLogger.Action .NOTIFY_EVENT_STREAM_FILTER_CHANGED, - {name, enabled}); + name, enabled); }, }; @@ -241,7 +242,7 @@ async focusTab(windowId, tabId) { return BridgeHelper.sendMessage( BridgeConstants.PanelBackground.TARGET, - BridgeConstants.PanelBackground.Action.FOCUS_TAB, {windowId, tabId}); + BridgeConstants.PanelBackground.Action.FOCUS_TAB, windowId, tabId); }, /** @@ -272,8 +273,8 @@ async incrementalSearch(searchStr, dir, opt_nextObject) { return BridgeHelper.sendMessage( BridgeConstants.PanelBackground.TARGET, - BridgeConstants.PanelBackground.Action.INCREMENTAL_SEARCH, - {searchStr, dir, opt_nextObject}); + BridgeConstants.PanelBackground.Action.INCREMENTAL_SEARCH, searchStr, + dir, opt_nextObject); }, /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_helper.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_helper.js index 5630c08..4d7a84c9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_helper.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/bridge_helper.js
@@ -20,17 +20,18 @@ * this request. * @param {BridgeAction|string} action The name of the intended function or, * if not a direct method of the class, a pseudo-function name. - * @param {*=} value An optional single parameter to include with the message. - * If the method takes multiple parameters, they are passed as named - * members of an object literal. + * + * Any arguments to be passed through can be appended to the function. They + * must be convertible to JSON objects for message passing - i.e., no + * functions or type information will be retained, and no direct + * modification of the original context is possible. * * @return {!Promise} A promise, that resolves when the handler function has * finished and contains any value returned by the handler. */ - static sendMessage(target, action, value) { + static sendMessage(target, action, ...args) { return new Promise( - resolve => - chrome.runtime.sendMessage({target, action, value}, resolve)); + resolve => chrome.runtime.sendMessage({target, action, args}, resolve)); } /** @@ -71,6 +72,6 @@ } const handler = targetHandlers[message.action]; - Promise.resolve(handler(message.value)).then(respond); + Promise.resolve(handler(...message.args)).then(respond); return true; /** Wait for asynchronous response. */ });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js b/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js index 75c9242..341480f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/common/log_types.js
@@ -6,22 +6,12 @@ * @fileoverview Class definitions of log that are stored in LogStore */ -goog.provide('BaseLog'); -goog.provide('EventLog'); -goog.provide('LogType'); -goog.provide('SpeechLog'); -goog.provide('TextLog'); -goog.provide('TreeLog'); - -goog.require('QueueMode'); -goog.require('TreeDumper'); - /** * List of all types of logs supported. * Note that filter type checkboxes are shown in this order at the log page. * @enum {string} */ -LogType = { +export const LogType = { SPEECH: 'speech', SPEECH_RULE: 'speechRule', BRAILLE: 'braille', @@ -32,7 +22,7 @@ TREE: 'tree', }; -BaseLog = class { +export class BaseLog { constructor(logType) { /** * @type {!LogType} @@ -49,10 +39,10 @@ toString() { return ''; } -}; +} -EventLog = class extends BaseLog { +export class EventLog extends BaseLog { /** * @param {!chrome.automation.AutomationEvent} event */ @@ -89,10 +79,10 @@ return `EventType = ${this.type_}, TargetName = ${this.targetName_}, ` + `RootName = ${this.rootName_}, DocumentURL = ${this.docUrl_}`; } -}; +} -SpeechLog = class extends BaseLog { +export class SpeechLog extends BaseLog { /** * @param {!string} textString * @param {!QueueMode} queueMode @@ -138,10 +128,10 @@ logStr += ' "' + this.textString_ + '"'; return logStr; } -}; +} -TextLog = class extends BaseLog { +export class TextLog extends BaseLog { /** * @param {string} logStr * @param {!LogType} logType @@ -160,10 +150,10 @@ toString() { return this.logStr_; } -}; +} -TreeLog = class extends BaseLog { +export class TreeLog extends BaseLog { /** * @param {!TreeDumper} logTree */ @@ -181,4 +171,4 @@ toString() { return this.logTree_.treeToString(); } -}; +}
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js index fb98d76..4b6ec3e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log.js
@@ -8,6 +8,7 @@ */ import {BackgroundBridge} from '../common/background_bridge.js'; +import {BaseLog, LogType} from '../common/log_types.js'; /** * Class to manage the log page.
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js index 09a2dac..941f1cac 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/log_page/log_loader.js
@@ -7,10 +7,5 @@ * */ -goog.require('BaseLog'); -goog.require('EventLog'); -goog.require('LogType'); -goog.require('SpeechLog'); -goog.require('TextLog'); +goog.require('QueueMode'); goog.require('TreeDumper'); -goog.require('TreeLog');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js index e08ac83..7daffde9 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/options/options_loader.js
@@ -9,7 +9,8 @@ goog.require('AbstractEarcons'); goog.require('BluetoothBrailleDisplayListener'); goog.require('BluetoothBrailleDisplayManager'); -goog.require('SpeechLog'); +goog.require('QueueMode'); +goog.require('TreeDumper'); goog.require('TtsInterface'); goog.require('constants');
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js index 4bc72f6..f35083d6 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/panel/panel_loader.js
@@ -10,18 +10,12 @@ goog.require('AutomationPredicate'); goog.require('AutomationTreeWalker'); goog.require('AutomationUtil'); -goog.require('BaseLog'); goog.require('EarconDescription'); -goog.require('EventLog'); -goog.require('LogType'); goog.require('PanelNodeMenuData'); goog.require('PanelNodeMenuItemData'); goog.require('QueueMode'); goog.require('RecoveryStrategy'); -goog.require('SpeechLog'); -goog.require('TextLog'); goog.require('TreeDumper'); -goog.require('TreeLog'); goog.require('TtsCategory'); goog.require('constants');
diff --git a/chrome/browser/resources/chromeos/login/oobe_polymer3.js b/chrome/browser/resources/chromeos/login/oobe_polymer3.js index 4408b713..c146caf3 100644 --- a/chrome/browser/resources/chromeos/login/oobe_polymer3.js +++ b/chrome/browser/resources/chromeos/login/oobe_polymer3.js
@@ -122,6 +122,16 @@ const isOobeFlow = loadTimeData.getBoolean('isOobeFlow'); addScreensToMainContainer(isOobeFlow ? oobeScreensList : loginScreensList); + // The default is to have the class 'oobe-display' in <body> for the OOBE + // flow. For the 'Add Person' flow, we remove it. + if (!isOobeFlow) { + document.body.classList.remove('oobe-display'); + } else { + assert( + document.body.classList.contains('oobe-display'), + 'The body of the document must contain oobe-display as a class for the OOBE flow!'); + } + if (document.readyState === 'loading') { document.addEventListener('DOMContentLoaded', initializeOobe); } else {
diff --git a/chrome/browser/resources/new_tab_page/modules/task_module/module.html b/chrome/browser/resources/new_tab_page/modules/task_module/module.html index 3931bf98..8725946 100644 --- a/chrome/browser/resources/new_tab_page/modules/task_module/module.html +++ b/chrome/browser/resources/new_tab_page/modules/task_module/module.html
@@ -74,7 +74,7 @@ border-radius: 4px; box-sizing: border-box; color: var(--cr-primary-text-color); - font-size: 12px; + font-size: 11px; margin: 8px; max-width: 149px; overflow: hidden;
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js index 76d2581..2fa55a1 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_bluetooth_saved_devices_subpage.js
@@ -10,6 +10,7 @@ import '../../settings_shared.css.js'; import './os_saved_devices_list.js'; +import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js'; import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.m.js'; import {WebUIListenerBehavior, WebUIListenerBehaviorInterface} from 'chrome://resources/js/web_ui_listener_behavior.m.js'; @@ -91,6 +92,8 @@ super.ready(); this.addWebUIListener( 'fast-pair-saved-devices-list', this.getSavedDevices_.bind(this)); + recordSavedDevicesUiEventMetrics( + FastPairSavedDevicesUiEvent.SETTINGS_SAVED_DEVICE_LIST_SUBPAGE_SHOWN); } /** @@ -99,6 +102,11 @@ */ getSavedDevices_(devices) { this.savedDevices_ = devices.slice(0); + + if (this.savedDevices_.length > 0) { + recordSavedDevicesUiEventMetrics( + FastPairSavedDevicesUiEvent.SETTINGS_SAVED_DEVICE_LIST_HAS_DEVICES); + } } /**
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js index aed843f0..1f14e3f 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_remove_saved_device_dialog.js
@@ -9,6 +9,7 @@ import '../../settings_shared.css.js'; import 'chrome://resources/cr_elements/cr_input/cr_input.m.js'; +import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js'; import {getDeviceName} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_utils.js'; import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js'; import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; @@ -63,6 +64,8 @@ * @private */ onRemoveTap_(event) { + recordSavedDevicesUiEventMetrics( + FastPairSavedDevicesUiEvent.SETTINGS_SAVED_DEVICE_LIST_REMOVE); const fireEvent = new CustomEvent('remove-saved-device', { bubbles: true, composed: true,
diff --git a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js index 612157b2..e7d3b3f 100644 --- a/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js +++ b/chrome/browser/resources/settings/chromeos/os_bluetooth_page/os_saved_devices_list_item.js
@@ -13,6 +13,7 @@ import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.m.js'; import 'chrome://resources/cr_elements/cr_action_menu/cr_action_menu.js'; +import {FastPairSavedDevicesUiEvent, recordSavedDevicesUiEventMetrics} from 'chrome://resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js'; import {addWebUIListener, removeWebUIListener, WebUIListener} from 'chrome://resources/js/cr.m.js'; import {FocusRowBehavior, FocusRowBehaviorInterface} from 'chrome://resources/js/cr/ui/focus_row_behavior.m.js'; import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/js/i18n_behavior.m.js'; @@ -97,6 +98,8 @@ /** @private */ onRemoveClick_() { + recordSavedDevicesUiEventMetrics( + FastPairSavedDevicesUiEvent.SETTINGS_SAVED_DEVICE_LIST_REMOVE_DIALOG); this.shouldShowRemoveSavedDeviceDialog_ = true; this.$.dotsMenu.close(); }
diff --git a/chrome/browser/resources/settings/languages_page/translate_page.html b/chrome/browser/resources/settings/languages_page/translate_page.html index ee62e04..5a29a9f 100644 --- a/chrome/browser/resources/settings/languages_page/translate_page.html +++ b/chrome/browser/resources/settings/languages_page/translate_page.html
@@ -15,7 +15,7 @@ <template is="dom-repeat" items="[[languages.alwaysTranslate]]"> <div class="list-item"> <div class="start cr-padded-text">[[item.displayName]]</div> - <cr-icon-button class="icon-clear" + <cr-icon-button class="icon-delete-gray" on-click="onRemoveAlwaysTranslateLanguageClick_"> </cr-icon-button> </div> @@ -38,7 +38,7 @@ <template is="dom-repeat" items="[[languages.neverTranslate]]"> <div class="list-item"> <div class="start cr-padded-text">[[item.displayName]]</div> - <cr-icon-button class="icon-clear" value="[[item.code]]" + <cr-icon-button class="icon-delete-gray" value="[[item.code]]" on-click="onRemoveNeverTranslateLanguageClick_"> </cr-icon-button> </div>
diff --git a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc index 4c0855be..63692af5 100644 --- a/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc +++ b/chrome/browser/safe_browsing/client_side_detection_service_unittest.cc
@@ -40,7 +40,7 @@ #include "url/gurl.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #endif using ::testing::Invoke;
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_config.cc b/chrome/browser/segmentation_platform/segmentation_platform_config.cc index e9b9aa1..8c4d7eb 100644 --- a/chrome/browser/segmentation_platform/segmentation_platform_config.cc +++ b/chrome/browser/segmentation_platform/segmentation_platform_config.cc
@@ -11,10 +11,11 @@ #include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/metrics/chrome_metrics_service_accessor.h" -#include "components/commerce/core/commerce_feature_list.h" #include "components/segmentation_platform/embedder/default_model/feed_user_segment.h" #include "components/segmentation_platform/embedder/default_model/low_user_engagement_model.h" #include "components/segmentation_platform/embedder/default_model/price_tracking_action_model.h" +#include "components/segmentation_platform/internal/config_parser.h" +#include "components/segmentation_platform/internal/stats.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/features.h" #include "components/segmentation_platform/public/model_provider.h" @@ -26,6 +27,7 @@ #include "chrome/browser/flags/android/chrome_feature_list.h" #include "chrome/browser/segmentation_platform/default_model/chrome_start_model_android.h" #include "chrome/browser/ui/android/start_surface/start_surface_android.h" +#include "components/commerce/core/commerce_feature_list.h" #include "components/query_tiles/switches.h" #include "components/segmentation_platform/embedder/default_model/query_tiles_model.h" #endif @@ -66,10 +68,19 @@ constexpr int kQueryTilesDefaultUnknownTTLDays = 7; #endif // BUILDFLAG(IS_ANDROID) +#define SEGMENT_ID_ENTRY(segment) \ + { \ + segment, Config::SegmentMetadata { \ + stats::OptimizationTargetToHistogramVariant(segment) \ + } \ + } + #if BUILDFLAG(IS_ANDROID) std::unique_ptr<Config> GetConfigForAdaptiveToolbar() { auto config = std::make_unique<Config>(); config->segmentation_key = kAdaptiveToolbarSegmentationKey; + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); int segment_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt( chrome::android::kAdaptiveButtonInTopToolbarCustomizationV2, @@ -78,10 +89,10 @@ // Do not set unknown TTL so that the platform ignores unknown results. // A hardcoded list of segment IDs known to the segmentation platform. - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE, + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB), + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE), + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE), }; return config; @@ -91,8 +102,10 @@ std::unique_ptr<Config> GetConfigForDummyFeature() { auto config = std::make_unique<Config>(); config->segmentation_key = kDummySegmentationKey; - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DUMMY, + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_DUMMY), }; config->segment_selection_ttl = base::Days(kDummyFeatureSelectionTTLDays); config->unknown_selection_ttl = base::Days(kDummyFeatureSelectionTTLDays); @@ -112,8 +125,11 @@ std::unique_ptr<Config> GetConfigForChromeStartAndroid() { auto config = std::make_unique<Config>(); config->segmentation_key = kChromeStartAndroidSegmentationKey; - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID, + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); + config->segments = { + SEGMENT_ID_ENTRY( + SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID), }; int segment_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt( @@ -140,8 +156,10 @@ std::unique_ptr<Config> GetConfigForQueryTiles() { auto config = std::make_unique<Config>(); config->segmentation_key = kQueryTilesSegmentationKey; - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES, + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_QUERY_TILES), }; int segment_selection_ttl_days = base::GetFieldTrialParamByFeatureAsInt( @@ -167,11 +185,13 @@ std::unique_ptr<Config> GetConfigForContextualPageActions() { auto config = std::make_unique<Config>(); config->segmentation_key = kContextualPageActionsKey; + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); if (base::FeatureList::IsEnabled( features::kContextualPageActionPriceTracking) && base::FeatureList::IsEnabled(commerce::kShoppingList)) { - config->segment_ids.push_back( - SegmentId::OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING); + config->segments.insert(SEGMENT_ID_ENTRY( + SegmentId::OPTIMIZATION_TARGET_CONTEXTUAL_PAGE_ACTION_PRICE_TRACKING)); } config->on_demand_execution = true; return config; @@ -204,8 +224,12 @@ std::unique_ptr<Config> GetConfigForChromeLowUserEngagement() { auto config = std::make_unique<Config>(); config->segmentation_key = kChromeLowUserEngagementSegmentationKey; - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT, + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); + config->segments = { + SEGMENT_ID_ENTRY( + SegmentId:: + OPTIMIZATION_TARGET_SEGMENTATION_CHROME_LOW_USER_ENGAGEMENT), }; #if BUILDFLAG(IS_ANDROID) @@ -226,8 +250,10 @@ std::unique_ptr<Config> GetConfigForFeedSegments() { auto config = std::make_unique<Config>(); config->segmentation_key = kFeedUserSegmentationKey; - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER, + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER), }; config->segment_selection_ttl = base::Days(base::GetFieldTrialParamByFeatureAsInt( @@ -254,6 +280,19 @@ return std::make_unique<PriceTrackingActionModel>(); } +void AppendConfigsFromExperiments( + std::vector<std::unique_ptr<Config>>& out_configs) { + // TODO(crbug.com/1346389): Add logic to find segmentation param from field + // trials. + std::vector<std::string> params; + for (const std::string& param : params) { + auto config = ParseConfigFromString(param); + if (config) { + out_configs.push_back(std::move(config)); + } + } +} + } // namespace std::vector<std::unique_ptr<Config>> GetSegmentationPlatformConfig() { @@ -286,6 +325,8 @@ features::kSegmentationPlatformFeedSegmentFeature)) { configs.emplace_back(GetConfigForFeedSegments()); } + + AppendConfigsFromExperiments(configs); return configs; }
diff --git a/chrome/browser/signin/account_reconcilor_factory.cc b/chrome/browser/signin/account_reconcilor_factory.cc index 8fdf63b..f29cd46 100644 --- a/chrome/browser/signin/account_reconcilor_factory.cc +++ b/chrome/browser/signin/account_reconcilor_factory.cc
@@ -22,11 +22,11 @@ #include "components/signin/public/base/signin_buildflags.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/install_attributes.h" #include "base/metrics/histogram_macros.h" #include "base/time/time.h" #include "chrome/browser/ash/account_manager/account_manager_util.h" #include "chrome/browser/lifetime/application_lifetime.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/pref_registry/pref_registry_syncable.h" #include "components/prefs/pref_service.h" #include "components/signin/core/browser/active_directory_account_reconcilor_delegate.h"
diff --git a/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java b/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java index 4b6efd0..40096dc4 100644 --- a/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java +++ b/chrome/browser/tab_group/java/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilter.java
@@ -280,6 +280,21 @@ * @param destinationTabId The id of a {@link Tab} to get the destination group. */ public void mergeTabsToGroup(int sourceTabId, int destinationTabId) { + mergeTabsToGroup(sourceTabId, destinationTabId, false); + } + + /** + * This method merges the source group that contains the {@code sourceTabId} to the destination + * group that contains the {@code destinationTabId}. This method only operates if two groups are + * in the same {@code TabModel}. + * + * @param sourceTabId The id of the {@link Tab} to get the source group. + * @param destinationTabId The id of a {@link Tab} to get the destination group. + * @param skipUpdateTabModel True if updating the tab model will be handled elsewhere (e.g. by + * the tab strip). + */ + public void mergeTabsToGroup( + int sourceTabId, int destinationTabId, boolean skipUpdateTabModel) { Tab sourceTab = TabModelUtils.getTabById(getTabModel(), sourceTabId); Tab destinationTab = TabModelUtils.getTabById(getTabModel(), destinationTabId); @@ -292,7 +307,7 @@ List<Tab> tabsToMerge = getRelatedTabList(sourceTabId); int destinationIndexInTabModel = getTabModelDestinationIndex(destinationTab); - if (!needToUpdateTabModel(tabsToMerge, destinationIndexInTabModel)) { + if (skipUpdateTabModel || !needToUpdateTabModel(tabsToMerge, destinationIndexInTabModel)) { for (Observer observer : mGroupFilterObserver) { observer.willMergeTabToGroup( tabsToMerge.get(tabsToMerge.size() - 1), destinationGroupId);
diff --git a/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java b/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java index c41630d6..072a77d 100644 --- a/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java +++ b/chrome/browser/tab_group/junit/src/org/chromium/chrome/browser/tasks/tab_groups/TabGroupModelFilterUnitTest.java
@@ -622,6 +622,17 @@ } @Test + public void mergeTabToGroup_SkipUpdateTabModel() { + List<Tab> expectedGroup = new ArrayList<>(Arrays.asList(mTab2, mTab3, mTab5, mTab6)); + + mTabGroupModelFilter.mergeTabsToGroup(mTab5.getId(), mTab2.getId(), true); + + verify(mTabModel, never()).moveTab(anyInt(), anyInt()); + assertArrayEquals(mTabGroupModelFilter.getRelatedTabList(mTab5.getId()).toArray(), + expectedGroup.toArray()); + } + + @Test public void mergeOneTabToTab_Forward() { List<Tab> expectedGroup = new ArrayList<>(Arrays.asList(mTab1, mTab4)); List<Tab> expectedTabModel =
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 c9386ec..8c0cb94 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
@@ -35,6 +35,7 @@ import org.chromium.base.test.util.Batch; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.ScalableTimeout; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.touch_to_fill.data.Credential; @@ -148,6 +149,7 @@ @Test @MediumTest + @DisabledTest(message = "crbug.com/1348345") public void testBackDismissesAndCallsCallback() { runOnUiThreadBlocking(() -> { mTouchToFill.showCredentials(
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 20f6047be..f6baf06 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -3050,7 +3050,6 @@ "//ash/components/proximity_auth", "//ash/components/settings", "//ash/components/tether", - "//ash/components/tpm", "//ash/constants", "//ash/keyboard/ui", "//ash/public/cpp", @@ -3163,6 +3162,7 @@ "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", "//chromeos/ash/components/human_presence", + "//chromeos/ash/components/install_attributes", "//chromeos/ash/components/local_search_service/public/cpp", "//chromeos/ash/components/local_search_service/public/mojom", "//chromeos/ash/components/network", @@ -5544,16 +5544,11 @@ deps += [ "//components/pdf/browser" ] } - # TODO(crbug.com/1306610): Make `HungPluginTabHelper` usage conditional. - if (enable_ppapi) { + if (enable_plugins) { sources += [ "hung_plugin_tab_helper.cc", "hung_plugin_tab_helper.h", ] - deps += [ - "//ppapi/c", - "//ppapi/proxy:ipc", - ] } if (enable_basic_printing) {
diff --git a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn index f93fc74..d48371a 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn +++ b/chrome/browser/ui/android/fast_checkout/internal/BUILD.gn
@@ -8,12 +8,17 @@ sources = [ "java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutBridge.java", "java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java", + "java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediator.java", + "java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutModel.java", + "java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutView.java", + "java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutViewBinder.java", ] deps = [ "//base:base_java", "//base:jni_java", "//build/android:build_java", "//chrome/browser/ui/android/fast_checkout:java", + "//components/autofill_assistant/android:public_java", "//components/browser_ui/bottomsheet/android:java", "//third_party/androidx:androidx_annotation_annotation_java", "//ui/android:ui_no_recycler_view_java",
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java index f9e68c1..74109af 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java +++ b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java
@@ -5,21 +5,42 @@ package org.chromium.chrome.browser.ui.fast_checkout; import android.content.Context; +import android.view.ViewGroup; +import android.widget.LinearLayout; import org.chromium.chrome.browser.ui.fast_checkout.data.FastCheckoutAutofillProfile; import org.chromium.chrome.browser.ui.fast_checkout.data.FastCheckoutCreditCard; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModelChangeProcessor; class FastCheckoutCoordinator implements FastCheckoutComponent { + private FastCheckoutMediator mMediator = new FastCheckoutMediator(); + @Override public void initialize(Context context, BottomSheetController sheetController, FastCheckoutComponent.Delegate delegate) { - // TODO(crbug.com/1334642): Implement. + PropertyModel model = FastCheckoutModel.createDefaultModel(mMediator::onDismissed); + mMediator.initialize(delegate, model, sheetController); + + LinearLayout rootView = new LinearLayout(context); + rootView.setLayoutParams(new ViewGroup.LayoutParams( + ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + rootView.setOrientation(LinearLayout.VERTICAL); + + // TODO(crbug.com/1334642): Create views for all 3 screens. + + setUpModelChangeProcessors(model, new FastCheckoutView(rootView, sheetController)); } @Override public void showOptions( FastCheckoutAutofillProfile[] profiles, FastCheckoutCreditCard[] creditCards) { - // TODO(crbug.com/1334642): Implement. + mMediator.showOptions(profiles, creditCards); + } + + static void setUpModelChangeProcessors(PropertyModel model, FastCheckoutView view) { + PropertyModelChangeProcessor.create( + model, view, FastCheckoutViewBinder::bindFastCheckoutView); } }
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediator.java b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediator.java new file mode 100644 index 0000000..43ed1628 --- /dev/null +++ b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediator.java
@@ -0,0 +1,82 @@ +// 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.chrome.browser.ui.fast_checkout; + +import android.view.View; + +import androidx.annotation.Nullable; + +import org.chromium.chrome.browser.ui.fast_checkout.data.FastCheckoutAutofillProfile; +import org.chromium.chrome.browser.ui.fast_checkout.data.FastCheckoutCreditCard; +import org.chromium.components.autofill_assistant.AutofillAssistantPublicTags; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetContent; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController.StateChangeReason; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetObserver; +import org.chromium.components.browser_ui.bottomsheet.EmptyBottomSheetObserver; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * Contains the logic for the FastCheckout component. It sets the state of the model and reacts + * to events like clicks. + */ +public class FastCheckoutMediator { + private PropertyModel mModel; + private FastCheckoutComponent.Delegate mDelegate; + private BottomSheetController mBottomSheetController; + private BottomSheetObserver mBottomSheetClosedObserver; + + void initialize(FastCheckoutComponent.Delegate delegate, PropertyModel model, + BottomSheetController bottomSheetController) { + mModel = model; + mDelegate = delegate; + mBottomSheetController = bottomSheetController; + + mBottomSheetClosedObserver = new EmptyBottomSheetObserver() { + @Override + public void onSheetContentChanged(@Nullable BottomSheetContent newContent) { + if (newContent == null) { + mModel.set(FastCheckoutModel.VISIBLE, true); + mBottomSheetController.removeObserver(mBottomSheetClosedObserver); + } + } + }; + } + + public void showOptions( + FastCheckoutAutofillProfile[] profiles, FastCheckoutCreditCard[] creditCards) { + // TODO(crbug.com/1334642): Add |profiles| and |creditCards| to the model. + + // It is possible that FC onboarding has been just accepted but the bottom sheet is still + // showing. If that's the case we try hiding it and then show FC bottom sheet. + if (isOnboardingSheet()) { + // Delay showing the bottom sheet until the consent sheet is fully closed. + mBottomSheetController.addObserver(mBottomSheetClosedObserver); + mBottomSheetController.hideContent( + mBottomSheetController.getCurrentSheetContent(), /* animate= */ true); + } else { + mModel.set(FastCheckoutModel.VISIBLE, true); + } + } + + public void onDismissed(@StateChangeReason int reason) { + if (!mModel.get(FastCheckoutModel.VISIBLE)) return; // Dismiss only if not dismissed yet. + // TODO(crbug.com/1334642): Record dismissal metrics. + mModel.set(FastCheckoutModel.VISIBLE, false); + mDelegate.onDismissed(); + } + + private boolean isOnboardingSheet() { + if (mBottomSheetController == null + || mBottomSheetController.getCurrentSheetContent() == null) { + return false; + } + + View view = mBottomSheetController.getCurrentSheetContent().getContentView(); + return view.getTag() != null + && view.getTag().equals( + AutofillAssistantPublicTags.AUTOFILL_ASSISTANT_BOTTOM_SHEET_CONTENT_TAG); + } +}
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutModel.java b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutModel.java new file mode 100644 index 0000000..6c456a4d --- /dev/null +++ b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutModel.java
@@ -0,0 +1,58 @@ +// 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.chrome.browser.ui.fast_checkout; + +import androidx.annotation.IntDef; + +import org.chromium.base.Callback; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * State for the Fast Checkout UI. + */ +public class FastCheckoutModel { + /** + * The different screens that can be shown on the sheet. + */ + @IntDef({ScreenType.HOME_SCREEN, ScreenType.AUTOFILL_PROFILES_SCREEN, + ScreenType.CREDIT_CARDS_SCREEN}) + @Retention(RetentionPolicy.SOURCE) + public @interface ScreenType { + int HOME_SCREEN = 0; + int AUTOFILL_PROFILES_SCREEN = 1; + int CREDIT_CARDS_SCREEN = 2; + } + + /** The handler for dismissing the bottom sheet. */ + public static final PropertyModel.WritableObjectPropertyKey<Callback<Integer>> DISMISS_HANDLER = + new PropertyModel.WritableObjectPropertyKey<>(); + + /** Property that indicates the bottom sheet visibility. */ + public static final PropertyModel.WritableBooleanPropertyKey VISIBLE = + new PropertyModel.WritableBooleanPropertyKey(); + + /** + * Property that indicates which screen (i.e ScreenType) is currently displayed on the bottom + * sheet. + */ + public static final PropertyModel.WritableIntPropertyKey CURRENT_SCREEN = + new PropertyModel.WritableIntPropertyKey(); + + static PropertyModel createDefaultModel(Callback<Integer> dismissHandler) { + return new PropertyModel.Builder(ALL_KEYS) + .with(VISIBLE, false) + .with(DISMISS_HANDLER, dismissHandler) + .with(CURRENT_SCREEN, ScreenType.HOME_SCREEN) + .build(); + } + + /** All keys used for the fast checkout bottom sheet. */ + static final PropertyKey[] ALL_KEYS = + new PropertyKey[] {CURRENT_SCREEN, DISMISS_HANDLER, VISIBLE}; +}
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutView.java b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutView.java new file mode 100644 index 0000000..022868b --- /dev/null +++ b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutView.java
@@ -0,0 +1,53 @@ +// 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.chrome.browser.ui.fast_checkout; + +import android.view.View; + +import org.chromium.base.Callback; +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; + +/** + * The {@link BottomSheetContent} for Fast Checkout. TODO(crbug.com/1334642): The view + * should implement BottomSheetContent. + */ +public class FastCheckoutView { + private final BottomSheetController mBottomSheetController; + private final View mContentView; + + /** + * Constructs a FastCheckoutView which creates, modifies, and shows the bottom sheet. + */ + FastCheckoutView(View contentView, BottomSheetController bottomSheetController) { + mBottomSheetController = bottomSheetController; + mContentView = contentView; + } + + /** + * Sets a new listener that reacts to events like item selection or dismissal. + * @param dismissHandler A {@link Callback<Integer>}. + */ + void setDismissHandler(Callback<Integer> dismissHandler) { + // TODO(crbug.com/1334642): Implement. + } + + /** + * If set to true, requests to show the bottom sheet. Otherwise, requests to hide the sheet. + * @param isVisible A boolean describing whether to show or hide the sheet. + * @return True if the request was successful, false otherwise. + */ + boolean setVisible(boolean isVisible) { + // TODO(crbug.com/1334642): Implement. + return false; + } + + /** + * Sets the screen to show on the bottom sheet. + * @param screenType A {@link ScreenType} specifying the screen to show. + */ + void updateCurrentScreen(int screenType) { + // TODO(crbug.com/1334642): Implement. + } +}
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutViewBinder.java b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutViewBinder.java new file mode 100644 index 0000000..e00f9ede --- /dev/null +++ b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutViewBinder.java
@@ -0,0 +1,34 @@ +// 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.chrome.browser.ui.fast_checkout; + +import static org.chromium.chrome.browser.ui.fast_checkout.FastCheckoutModel.DISMISS_HANDLER; +import static org.chromium.chrome.browser.ui.fast_checkout.FastCheckoutModel.VISIBLE; + +import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.ui.modelutil.PropertyKey; +import org.chromium.ui.modelutil.PropertyModel; + +/** + * Provides functions that map {@link FastCheckoutModel} changes to the suitable + * method in {@link FastCheckoutView}. + */ +public class FastCheckoutViewBinder { + static void bindFastCheckoutView( + PropertyModel model, FastCheckoutView view, PropertyKey propertyKey) { + if (FastCheckoutModel.CURRENT_SCREEN == propertyKey) { + view.updateCurrentScreen(model.get(FastCheckoutModel.CURRENT_SCREEN)); + } else if (FastCheckoutModel.DISMISS_HANDLER == propertyKey) { + view.setDismissHandler(model.get(DISMISS_HANDLER)); + } else if (FastCheckoutModel.VISIBLE == propertyKey) { + // Dismiss the sheet if it can't be immediately shown. + boolean visibilityChangeSuccessful = view.setVisible(model.get(VISIBLE)); + if (!visibilityChangeSuccessful && model.get(VISIBLE)) { + assert (model.get(DISMISS_HANDLER) != null); + model.get(DISMISS_HANDLER).onResult(BottomSheetController.StateChangeReason.NONE); + } + } + } +}
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java index 33763d11..64abd8c8 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusView.java
@@ -344,6 +344,11 @@ mIconView.setVisibility(showIcon ? VISIBLE : GONE); updateTouchDelegate(); + if (mIsAnimatingStatusIconChange && !showIcon) { + // If the icon view is hidden before it gets a chance to draw, our animation status will + // become stale. Reset it. + resetAnimationStatus(); + } } /** @@ -546,13 +551,17 @@ long currentTimeMs = SystemClock.uptimeMillis(); if (mIsAnimatingStatusIconChange && currentTimeMs - mTimeAtTransitionStartMs >= mCurrentTransitionDuration) { - mTimeAtTransitionStartMs = 0; - mCurrentTransitionDuration = 0; - mIsAnimatingStatusIconChange = false; - allowBrowserControlsHide(); + resetAnimationStatus(); } } + private void resetAnimationStatus() { + mTimeAtTransitionStartMs = 0; + mCurrentTransitionDuration = 0; + mIsAnimatingStatusIconChange = false; + allowBrowserControlsHide(); + } + TouchDelegate getTouchDelegateForTesting() { return mTouchDelegate; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java index 8362a7c..8861ec5 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinder.java
@@ -10,6 +10,7 @@ import androidx.annotation.NonNull; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.R; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties.FormFactor; @@ -63,12 +64,19 @@ * @return The requested item spacing, expressed in Pixels. */ static int getItemSpacingPx(@FormFactor int formFactor, @NonNull Resources resources) { + // Note: Tile suggestions are generated by native code. + if (!ChromeFeatureList.isEnabled( + ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_DYNAMIC_SPACING)) { + // Note: double the spacing, because it's applied only at the end of the view. + return 2 + * resources.getDimensionPixelOffset( + R.dimen.omnibox_suggestion_carousel_spacing_maximum); + } + if (resources.getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE) { return resources.getDimensionPixelOffset(R.dimen.tile_view_padding_landscape); } - int maxTileSpacing = resources.getDimensionPixelOffset( - R.dimen.omnibox_suggestion_carousel_spacing_maximum); int tileViewPortraitEdgePadding = resources.getDimensionPixelSize(R.dimen.tile_view_padding_edge_portrait); switch (formFactor) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java index 1c11c4e..0f491d7 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/carousel/BaseCarouselSuggestionViewBinderUnitTest.java
@@ -20,7 +20,9 @@ import org.junit.Assert; import org.junit.Before; +import org.junit.Rule; import org.junit.Test; +import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.Mock; import org.mockito.MockitoAnnotations; @@ -28,8 +30,11 @@ import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.R; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties; import org.chromium.chrome.browser.omnibox.suggestions.SuggestionCommonProperties.FormFactor; +import org.chromium.chrome.test.util.browser.Features; +import org.chromium.chrome.test.util.browser.Features.EnableFeatures; import org.chromium.ui.modelutil.MVCListAdapter.ListItem; import org.chromium.ui.modelutil.MVCListAdapter.ModelList; import org.chromium.ui.modelutil.PropertyModel; @@ -44,8 +49,10 @@ */ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) +@EnableFeatures({ChromeFeatureList.OMNIBOX_MOST_VISITED_TILES_DYNAMIC_SPACING}) public class BaseCarouselSuggestionViewBinderUnitTest { static final int SUGGESTION_VERTICAL_PADDING = 123; + public @Rule TestRule mFeatures = new Features.JUnitProcessor(); @Mock BaseCarouselSuggestionView mView;
diff --git a/chrome/browser/ui/android/overlay/overlay_window_android.cc b/chrome/browser/ui/android/overlay/overlay_window_android.cc index 534059d73a..8d580cb 100644 --- a/chrome/browser/ui/android/overlay/overlay_window_android.cc +++ b/chrome/browser/ui/android/overlay/overlay_window_android.cc
@@ -36,7 +36,6 @@ compositor_view_(nullptr), surface_layer_(cc::SurfaceLayer::Create()), bounds_(gfx::Rect(0, 0)), - update_action_timer_(std::make_unique<base::OneShotTimer>()), controller_(controller) { surface_layer_->SetIsDrawable(true); surface_layer_->SetStretchContentToFillBounds(true); @@ -94,13 +93,7 @@ Java_PictureInPictureActivity_setPlaybackState(env, java_ref_.get(env), playback_state_); - Java_PictureInPictureActivity_setMicrophoneMuted(env, java_ref_.get(env), - microphone_muted_); - Java_PictureInPictureActivity_setCameraState(env, java_ref_.get(env), - camera_on_); - - if (!update_action_timer_->IsRunning()) - MaybeNotifyVisibleActionsChanged(); + MaybeNotifyVisibleActionsChanged(); if (video_size_.IsEmpty()) return; @@ -131,11 +124,7 @@ window_android_ = nullptr; } - // Only pause the video when play/pause button is visible. - controller_->OnWindowDestroyed( - /*should_pause_video=*/visible_actions_.find( - static_cast<int>(media_session::mojom::MediaSessionAction::kPlay)) != - visible_actions_.end()); + controller_->OnWindowDestroyed(/*should_pause_video=*/true); } void OverlayWindowAndroid::TogglePlayPause(JNIEnv* env) { @@ -151,18 +140,6 @@ controller_->PreviousTrack(); } -void OverlayWindowAndroid::ToggleMicrophone(JNIEnv* env) { - controller_->ToggleMicrophone(); -} - -void OverlayWindowAndroid::ToggleCamera(JNIEnv* env) { - controller_->ToggleCamera(); -} - -void OverlayWindowAndroid::HangUp(JNIEnv* env) { - controller_->HangUp(); -} - void OverlayWindowAndroid::CompositorViewCreated( JNIEnv* env, const base::android::JavaParamRef<jobject>& compositor_view) { @@ -252,61 +229,30 @@ playback_state); } -void OverlayWindowAndroid::SetMicrophoneMuted(bool muted) { - if (microphone_muted_ == muted) - return; - - microphone_muted_ = muted; - if (java_ref_.is_uninitialized()) - return; - - JNIEnv* env = base::android::AttachCurrentThread(); - Java_PictureInPictureActivity_setMicrophoneMuted(env, java_ref_.get(env), - microphone_muted_); -} - -void OverlayWindowAndroid::SetCameraState(bool turned_on) { - if (camera_on_ == turned_on) - return; - - camera_on_ = turned_on; - if (java_ref_.is_uninitialized()) - return; - - JNIEnv* env = base::android::AttachCurrentThread(); - Java_PictureInPictureActivity_setCameraState(env, java_ref_.get(env), - camera_on_); -} - void OverlayWindowAndroid::SetPlayPauseButtonVisibility(bool is_visible) { - MaybeUpdateVisibleAction(media_session::mojom::MediaSessionAction::kPlay, + if (!MaybeUpdateVisibleAction(media_session::mojom::MediaSessionAction::kPlay, + is_visible)) { + return; + } + + MaybeUpdateVisibleAction(media_session::mojom::MediaSessionAction::kPause, is_visible); + MaybeNotifyVisibleActionsChanged(); } void OverlayWindowAndroid::SetNextTrackButtonVisibility(bool is_visible) { - MaybeUpdateVisibleAction(media_session::mojom::MediaSessionAction::kNextTrack, - is_visible); + if (MaybeUpdateVisibleAction( + media_session::mojom::MediaSessionAction::kNextTrack, is_visible)) { + MaybeNotifyVisibleActionsChanged(); + } } void OverlayWindowAndroid::SetPreviousTrackButtonVisibility(bool is_visible) { - MaybeUpdateVisibleAction( - media_session::mojom::MediaSessionAction::kPreviousTrack, is_visible); -} - -void OverlayWindowAndroid::SetToggleMicrophoneButtonVisibility( - bool is_visible) { - MaybeUpdateVisibleAction( - media_session::mojom::MediaSessionAction::kToggleMicrophone, is_visible); -} - -void OverlayWindowAndroid::SetToggleCameraButtonVisibility(bool is_visible) { - MaybeUpdateVisibleAction( - media_session::mojom::MediaSessionAction::kToggleCamera, is_visible); -} - -void OverlayWindowAndroid::SetHangUpButtonVisibility(bool is_visible) { - MaybeUpdateVisibleAction(media_session::mojom::MediaSessionAction::kHangUp, - is_visible); + if (MaybeUpdateVisibleAction( + media_session::mojom::MediaSessionAction::kPreviousTrack, + is_visible)) { + MaybeNotifyVisibleActionsChanged(); + } } void OverlayWindowAndroid::SetSurfaceId(const viz::SurfaceId& surface_id) { @@ -343,13 +289,13 @@ std::vector<int>(visible_actions_.begin(), visible_actions_.end()))); } -void OverlayWindowAndroid::MaybeUpdateVisibleAction( +bool OverlayWindowAndroid::MaybeUpdateVisibleAction( const media_session::mojom::MediaSessionAction& action, bool is_visible) { int action_code = static_cast<int>(action); if ((visible_actions_.find(action_code) != visible_actions_.end()) == is_visible) { - return; + return false; } if (is_visible) @@ -357,10 +303,5 @@ else visible_actions_.erase(action_code); - if (!update_action_timer_->IsRunning()) { - update_action_timer_->Start( - FROM_HERE, base::Seconds(1), - base::BindOnce(&OverlayWindowAndroid::MaybeNotifyVisibleActionsChanged, - base::Unretained(this))); - } + return true; }
diff --git a/chrome/browser/ui/android/overlay/overlay_window_android.h b/chrome/browser/ui/android/overlay/overlay_window_android.h index b1daeb1..b655bad 100644 --- a/chrome/browser/ui/android/overlay/overlay_window_android.h +++ b/chrome/browser/ui/android/overlay/overlay_window_android.h
@@ -8,7 +8,6 @@ #include "base/android/jni_weak_ref.h" #include "base/android/scoped_java_ref.h" #include "base/memory/raw_ptr.h" -#include "base/timer/timer.h" #include "content/public/browser/overlay_window.h" #include "third_party/blink/public/mojom/mediasession/media_session.mojom.h" #include "ui/android/window_android.h" @@ -40,9 +39,6 @@ void TogglePlayPause(JNIEnv* env); void NextTrack(JNIEnv* env); void PreviousTrack(JNIEnv* env); - void ToggleMicrophone(JNIEnv* env); - void ToggleCamera(JNIEnv* env); - void HangUp(JNIEnv* env); void CompositorViewCreated( JNIEnv* env, const base::android::JavaParamRef<jobject>& compositor_view); @@ -74,11 +70,12 @@ void SetSkipAdButtonVisibility(bool is_visible) override {} void SetNextTrackButtonVisibility(bool is_visible) override; void SetPreviousTrackButtonVisibility(bool is_visible) override; - void SetMicrophoneMuted(bool muted) override; - void SetCameraState(bool turned_on) override; - void SetToggleMicrophoneButtonVisibility(bool is_visible) override; - void SetToggleCameraButtonVisibility(bool is_visible) override; - void SetHangUpButtonVisibility(bool is_visible) override; + // TODO(crbug.com/1331269): Implement video conferencing actions. + void SetMicrophoneMuted(bool muted) override {} + void SetCameraState(bool turned_on) override {} + void SetToggleMicrophoneButtonVisibility(bool is_visible) override {} + void SetToggleCameraButtonVisibility(bool is_visible) override {} + void SetHangUpButtonVisibility(bool is_visible) override {} void SetSurfaceId(const viz::SurfaceId& surface_id) override; cc::Layer* GetLayerForTesting() override; @@ -87,7 +84,7 @@ void MaybeNotifyVisibleActionsChanged(); // Maybe update visible actions. Returns true if update happened. - void MaybeUpdateVisibleAction( + bool MaybeUpdateVisibleAction( const media_session::mojom::MediaSessionAction& action, bool is_visible); void CloseInternal(); @@ -103,11 +100,6 @@ PlaybackState playback_state_ = PlaybackState::kEndOfVideo; std::unordered_set<int> visible_actions_; - bool microphone_muted_ = false; - bool camera_on_ = false; - - std::unique_ptr<base::OneShotTimer> update_action_timer_; - raw_ptr<content::VideoPictureInPictureWindowController> controller_; };
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 afbda822..1f2fe9f 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
@@ -230,7 +230,7 @@ <translation id="2218567645332692482">Gradeer navigasie op na HTTPS en waarsku jou voordat werwe gelaai word wat dit nie ondersteun nie</translation> <translation id="2227444325776770048">Gaan voort as <ph name="USER_FULL_NAME" /></translation> <translation id="2230777942707397948">Leë venster</translation> -<translation id="223356358902285214">Web- en Programaktiwiteit</translation> +<translation id="223356358902285214">Web- en App-aktiwiteit</translation> <translation id="2239812875700136898">Beheer jou berigte vanaf die "Opsies vir Ontdek"-knoppie</translation> <translation id="2248941474044011069">Jou wagwoorde word op jou toestel geënkripteer voordat hulle in Google Wagwoordbestuurder gestoor word</translation> <translation id="2259659629660284697">Voer wagwoorde uit …</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb index d4df14f8..13e9438 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_am.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">ምስል ቅዳ</translation> <translation id="6674571176963658787">ስምረትን ለመጀመር የይለፍ ሐረግዎን ያስገቡ</translation> <translation id="6676840375528380067">የChrome ውሂብዎ ከዚህ መሣሪያ ላይ ይጽዳ?</translation> +<translation id="6676927815633975364">ወደዚህ ጣቢያ እና ወደ Chrome ይግቡ</translation> <translation id="6684809838922667136">Chromeን የተሻለ ያድርጉት</translation> <translation id="670498945988402717">ትላንትና ተፈትሿል</translation> <translation id="6710213216561001401">ቀዳሚ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb index 14d5a4d6..16ef8f6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ar.xtb
@@ -1050,6 +1050,7 @@ <translation id="6671495933530132209">نسخ الصورة</translation> <translation id="6674571176963658787">لبدء المزامنة، يجب إدخال عبارة المرور.</translation> <translation id="6676840375528380067">هل تريد محو بيانات Chrome من هذا الجهاز؟</translation> +<translation id="6676927815633975364">تسجيل الدخول إلى هذا الموقع الإلكتروني وإلى متصفِّح Chrome</translation> <translation id="6684809838922667136">تحسين أداء متصفِّح Chrome</translation> <translation id="670498945988402717">تمّ إجراء عملية التحقُّق أمس.</translation> <translation id="6710213216561001401">السابق</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb index 794ef20e..6d7bffb 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_be.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Скапіраваць відарыс</translation> <translation id="6674571176963658787">Каб пачаць сінхранізацыю, увядзіце фразу-пароль</translation> <translation id="6676840375528380067">Выдаліць даныя Chrome з гэтай прылады?</translation> +<translation id="6676927815633975364">Будзе выкананы ўваход на сайт і ў Chrome</translation> <translation id="6684809838922667136">Зрабіце браўзер Chrome лепшым</translation> <translation id="670498945988402717">Праверка праводзілася ўчора</translation> <translation id="6710213216561001401">Назад</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb index a383b285..2c93c90 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bg.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Копиране на изображението</translation> <translation id="6674571176963658787">За да стартирате синхронизирането, въведете пропуска си</translation> <translation id="6676840375528380067">Искате ли данните ви в Chrome да бъдат изчистени от устройството?</translation> +<translation id="6676927815633975364">Влезте в профила си в този сайт и в Chrome</translation> <translation id="6684809838922667136">Подобряване на Chrome</translation> <translation id="670498945988402717">Проверено вчера</translation> <translation id="6710213216561001401">Предишно</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 6032c68..b4004098 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
@@ -1049,7 +1049,7 @@ <translation id="6671495933530132209">Kopiraj sliku</translation> <translation id="6674571176963658787">Da pokrenete sinhronizaciju, unesite pristupni izraz</translation> <translation id="6676840375528380067">Obrisati Chrome podatke s ovog uređaja?</translation> -<translation id="6676927815633975364">Prijavite se na ovu web-lokaciju i Chrome</translation> +<translation id="6676927815633975364">Prijavite se na ovu web lokaciju i u Chrome</translation> <translation id="6684809838922667136">Poboljšajte Chrome</translation> <translation id="670498945988402717">Provjereno jučer</translation> <translation id="6710213216561001401">Nazad</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb index 75a7fea..49e508a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cs.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Zkopírovat obrázek</translation> <translation id="6674571176963658787">Pokud chcete spustit synchronizaci, zadejte heslovou frázi</translation> <translation id="6676840375528380067">Vymazat z tohoto zařízení data prohlížeče Chrome?</translation> +<translation id="6676927815633975364">Přihlásit se na tento web a do Chromu</translation> <translation id="6684809838922667136">Vylepšujeme Chrome</translation> <translation id="670498945988402717">Zkontrolováno včera</translation> <translation id="6710213216561001401">Předchozí</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb index d7d685e..9175014 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_de.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Bild kopieren</translation> <translation id="6674571176963658787">Gib deine Passphrase ein, um die Synchronisierung zu starten</translation> <translation id="6676840375528380067">Deine Chrome-Daten vom Gerät löschen?</translation> +<translation id="6676927815633975364">Auf dieser Website und in Chrome anmelden</translation> <translation id="6684809838922667136">Chrome verbessern</translation> <translation id="670498945988402717">Gestern geprüft</translation> <translation id="6710213216561001401">Zurück</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb index 7d633a0e..1d9f8af 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es-419.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Copiar imagen</translation> <translation id="6674571176963658787">Para iniciar la sincronización, ingresa tu frase de contraseña.</translation> <translation id="6676840375528380067">¿Quieres borrar tus datos de Chrome de este dispositivo?</translation> +<translation id="6676927815633975364">Accede a este sitio y a Chrome</translation> <translation id="6684809838922667136">Mejora Chrome</translation> <translation id="670498945988402717">Se verificó ayer</translation> <translation id="6710213216561001401">Anterior</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb index ec16155..bf4b0c71 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_es.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Copiar imagen</translation> <translation id="6674571176963658787">Para iniciar la sincronización, escribe tu frase de contraseña</translation> <translation id="6676840375528380067">¿Quieres borrar tus datos de Chrome en este dispositivo?</translation> +<translation id="6676927815633975364">Inicia sesión en este sitio y en Chrome</translation> <translation id="6684809838922667136">Mejorar Chrome</translation> <translation id="670498945988402717">Comprobado ayer</translation> <translation id="6710213216561001401">Anterior</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb index 965e6e52..7b2e20841 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fa.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">کپی تصویر</translation> <translation id="6674571176963658787">برای شروع همگامسازی، گذرعبارت را وارد کنید</translation> <translation id="6676840375528380067">دادههای Chrome شما از این دستگاه پاک شود؟</translation> +<translation id="6676927815633975364">به سیستم این سایت و Chrome وارد شوید</translation> <translation id="6684809838922667136">بهتر کردن Chrome</translation> <translation id="670498945988402717">آخرین بررسی: دیروز</translation> <translation id="6710213216561001401">قبلی</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb index 77c8862..e81e1d53 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fil.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopyahin ang larawan</translation> <translation id="6674571176963658787">Para simulan ang pag-sync, ilagay ang iyong passphrase</translation> <translation id="6676840375528380067">I-clear ang iyong data sa Chrome sa device na ito?</translation> +<translation id="6676927815633975364">Mag-sign in sa site na ito at sa Chrome</translation> <translation id="6684809838922667136">Pahusayin ang Chrome</translation> <translation id="670498945988402717">Nagsuri kahapon</translation> <translation id="6710213216561001401">Nauna</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb index db949cd..9c35572 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Copier l'image</translation> <translation id="6674571176963658787">Pour lancer la synchronisation, saisissez votre phrase secrète</translation> <translation id="6676840375528380067">Supprimer vos données Chrome sur cet appareil ?</translation> +<translation id="6676927815633975364">Connectez-vous à ce site et à Chrome</translation> <translation id="6684809838922667136">Améliorer Chrome</translation> <translation id="670498945988402717">Vérification effectuée hier</translation> <translation id="6710213216561001401">Précédent</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb index c591669d..ef2a7ff 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hi.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">चित्र की कॉपी बनाएं</translation> <translation id="6674571176963658787">इसे चालू करने के लिए, अपना लंबा पासवर्ड डालें</translation> <translation id="6676840375528380067">इस डिवाइस से अपना Chrome डेटा हटाएं?</translation> +<translation id="6676927815633975364">इस साइट और Chrome में साइन इन करें</translation> <translation id="6684809838922667136">Chrome को बेहतर बनाएं</translation> <translation id="670498945988402717">कल जांच की गई</translation> <translation id="6710213216561001401">पिछला</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb index dad24c3..1a323af5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hy.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Պատճենել պատկերը</translation> <translation id="6674571176963658787">Համաժամացումը սկսելու համար մուտքագրեք ձեր անցաբառը</translation> <translation id="6676840375528380067">Հեռացնե՞լ Chrome-ի տվյալները այս սարքից</translation> +<translation id="6676927815633975364">Մուտք գործեք այս կայք և Chrome</translation> <translation id="6684809838922667136">Օգնեք բարելավել Chrome-ի աշխատանքը</translation> <translation id="670498945988402717">Ստուգվել է երեկ</translation> <translation id="6710213216561001401">Նախորդը</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb index 7052cb42..1d907fd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_is.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Afrita mynd</translation> <translation id="6674571176963658787">Sláðu inn aðgangsorðið þitt til að hefja samstillingu</translation> <translation id="6676840375528380067">Viltu hreinsa Chrome gögnin úr þessu tæki?</translation> +<translation id="6676927815633975364">Skráðu þig inn á þetta vefsvæði og Chrome</translation> <translation id="6684809838922667136">Bættu Chrome</translation> <translation id="670498945988402717">Athugað í gær</translation> <translation id="6710213216561001401">Til baka</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb index 69d0d46..1ae43a7f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kk.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Кескінді көшіру</translation> <translation id="6674571176963658787">Синхрондауды бастау үшін құпия фразаны енгізіңіз.</translation> <translation id="6676840375528380067">Chrome деректері осы құрылғыдан жойылсын ба?</translation> +<translation id="6676927815633975364">Осы сайтта және Chrome-да аккаунтқа кіріңіз.</translation> <translation id="6684809838922667136">Chrome-ды жақсартуға үлес қосыңыз</translation> <translation id="670498945988402717">Кеше тексерілді.</translation> <translation id="6710213216561001401">Алдыңғы</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb index 0a8972b..7b0ba0a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_km.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">ចម្លងរូបភាព</translation> <translation id="6674571176963658787">ដើម្បីចាប់ផ្ដើមសមកាលកម្ម សូមបញ្ចូលឃ្លាសម្ងាត់របស់អ្នក</translation> <translation id="6676840375528380067">សម្អាតទិន្នន័យ Chrome របស់អ្នកពីឧបករណ៍នេះមែនទេ?</translation> +<translation id="6676927815633975364">ចូលគេហទំព័រនេះ និង Chrome</translation> <translation id="6684809838922667136">ធ្វើឱ្យ Chrome ប្រសើរឡើង</translation> <translation id="670498945988402717">បានពិនិត្យមើលកាលពីម្សិលមិញ</translation> <translation id="6710213216561001401">មុន</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb index 9fe9872..2e6f529 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ky.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Сүрөттү көчүрүү</translation> <translation id="6674571176963658787">Шайкештирүүнү баштоо үчүн сыр сүйлөмүңүздү киргизиңиз</translation> <translation id="6676840375528380067">Chrome'догу дайын-даректериңиз бул түзмөктөн өчүрүлсүнбү?</translation> +<translation id="6676927815633975364">Бул сайтка жана Chrome'го кириңиз</translation> <translation id="6684809838922667136">Chrome'ду жакшыртууга жардам бериңиз</translation> <translation id="670498945988402717">Кечээ текшерилди</translation> <translation id="6710213216561001401">Мурунку</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb index ee2af74..cb75b412 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lv.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopēt attēlu</translation> <translation id="6674571176963658787">Lai sāktu sinhronizāciju, ievadiet savu ieejas frāzi</translation> <translation id="6676840375528380067">Vai dzēst jūsu Chrome datus no šīs ierīces?</translation> +<translation id="6676927815633975364">Pierakstieties šajā vietnē un pārlūkā Chrome.</translation> <translation id="6684809838922667136">Uzlabojiet Chrome</translation> <translation id="670498945988402717">Pārbaudīts: vakar</translation> <translation id="6710213216561001401">Iepriekšējais</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb index efca2328..40c1022 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_or.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">ଛବି କପି କରନ୍ତୁ</translation> <translation id="6674571176963658787">ସିଙ୍କ୍ ଆରମ୍ଭ କରିବାକୁ, ଆପଣଙ୍କ ପାସଫ୍ରେଜ୍ ଲେଖନ୍ତୁ</translation> <translation id="6676840375528380067">ଏହି ଡିଭାଇସ୍ରୁ ଆପଣଙ୍କର Chrome ଡାଟା ଖାଲି କରିବେ କି?</translation> +<translation id="6676927815633975364">ଏହି ସାଇଟ ଏବଂ Chromeରେ ସାଇନ ଇନ କରନ୍ତୁ</translation> <translation id="6684809838922667136">Chromeକୁ ଆହୁରି ଉନ୍ନତ କରନ୍ତୁ</translation> <translation id="670498945988402717">ଗତକାଲି ଯାଞ୍ଚ କରାଯାଇଛି</translation> <translation id="6710213216561001401">ପୂର୍ବବର୍ତ୍ତୀ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb index 4f4d402c2..180cecc 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pl.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopiuj grafikę</translation> <translation id="6674571176963658787">Aby rozpocząć synchronizację, wpisz hasło</translation> <translation id="6676840375528380067">Usunąć dane Chrome z tego urządzenia?</translation> +<translation id="6676927815633975364">Zaloguj się w tej witrynie i w Chrome.</translation> <translation id="6684809838922667136">Ulepsz Chrome</translation> <translation id="670498945988402717">Sprawdzano wczoraj</translation> <translation id="6710213216561001401">Poprzedni</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb index 083e05d..3389523 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ru.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Копировать изображение</translation> <translation id="6674571176963658787">Чтобы начать синхронизацию, введите кодовую фразу.</translation> <translation id="6676840375528380067">Удалить данные Chrome с этого устройства?</translation> +<translation id="6676927815633975364">Вы выполните вход на этом сайте и в Chrome</translation> <translation id="6684809838922667136">Сделайте браузер Chrome лучше</translation> <translation id="670498945988402717">Проверено вчера.</translation> <translation id="6710213216561001401">Назад</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb index 4c54ac70..9dd4501 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_si.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">රූපය පිටපත් කරන්න</translation> <translation id="6674571176963658787">සමමුහුර්ත කිරීම ආරම්භ කිරීමට, ඔබගේ මුර-වැකිකඩ ඇතුළත් කරන්න</translation> <translation id="6676840375528380067">මෙම උපාංගයෙන් ඔබේ Chrome දත්ත හිස් කරන්න ද?</translation> +<translation id="6676927815633975364">මෙම අඩවිය සහ Chrome වෙත පුරන්න</translation> <translation id="6684809838922667136">Chrome වඩාත් යහපත් කරන්න</translation> <translation id="670498945988402717">ඊයේ පරීක්ෂා කරන ලදි</translation> <translation id="6710213216561001401">පෙර</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb index e51efa4..c782b22 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sl.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopiraj sliko</translation> <translation id="6674571176963658787">Če želite začeti sinhronizacijo, vnesite geslo.</translation> <translation id="6676840375528380067">Ali želite izbrisati podatke v Chromu iz te naprave?</translation> +<translation id="6676927815633975364">Prijavite se na tem spletnem mestu in v Chrome.</translation> <translation id="6684809838922667136">Izboljšajte Chrome</translation> <translation id="670498945988402717">Preverjeno včeraj</translation> <translation id="6710213216561001401">Prejšnji</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb index fb49328..26e231f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sq.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Kopjo imazhin</translation> <translation id="6674571176963658787">Për të nisur sinkronizimin, fut frazën e kalimit</translation> <translation id="6676840375528380067">Të pastrohen të dhënat e tua të Chrome nga kjo pajisje?</translation> +<translation id="6676927815633975364">Identifikohu në këtë sajt dhe në Chrome</translation> <translation id="6684809838922667136">Bëje Chrome më të mirë</translation> <translation id="670498945988402717">Kontrolluar dje</translation> <translation id="6710213216561001401">Prapa</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb index ce1ad10..b0703fd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sv.xtb
@@ -1050,6 +1050,7 @@ <translation id="6671495933530132209">Kopiera bild</translation> <translation id="6674571176963658787">Ange din lösenfras för att starta synkroniseringen</translation> <translation id="6676840375528380067">Vill du rensa din data i Chrome från den här enheten?</translation> +<translation id="6676927815633975364">Logga in på den här webbplatsen och i Chrome</translation> <translation id="6684809838922667136">Gör Chrome bättre</translation> <translation id="670498945988402717">Genomsöktes i går</translation> <translation id="6710213216561001401">Föregående</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb index 8eab7a7..00ecb65 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sw.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Nakili picha</translation> <translation id="6674571176963658787">Ili uanze kusawazisha, weka kauli yako ya siri</translation> <translation id="6676840375528380067">Ungependa kufuta data yako yote ya Chrome kwenye kifaa hiki?</translation> +<translation id="6676927815633975364">Ingia katika akaunti kwenye tovuti hii na kwenye Chrome</translation> <translation id="6684809838922667136">Boresha Chrome</translation> <translation id="670498945988402717">Ilikaguliwa jana</translation> <translation id="6710213216561001401">Iliyopita</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb index 7c6b4b8..bc0372e0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ta.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">படத்தை நகலெடு</translation> <translation id="6674571176963658787">ஒத்திசைவைத் தொடங்க, கடவுச்சொற்றொடரை உள்ளிடவும்</translation> <translation id="6676840375528380067">இந்தச் சாதனத்திலிருந்து உங்கள் Chrome தரவை அழிக்கவா?</translation> +<translation id="6676927815633975364">இந்த தளத்திலும் Chromeமிலும் உள்நுழையும்</translation> <translation id="6684809838922667136">Chromeமைச் சிறந்ததாக்குங்கள்</translation> <translation id="670498945988402717">சரிபார்த்தது: நேற்று</translation> <translation id="6710213216561001401">முந்தையது</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb index 05307f77..d33c0fa4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_te.xtb
@@ -44,7 +44,7 @@ <translation id="1206892813135768548">లింక్ వచనాన్ని కాపీ చేయి</translation> <translation id="1208340532756947324">మీ అన్ని పరికరాలలోనూ సింక్ చేయాలన్నా లేదా మీ అభిరుచికి అనుగుణంగా సెట్ చేయాలన్నా, తప్పనిసరిగా సింక్ ఎంపికను ఆన్ చేయాలి</translation> <translation id="1209206284964581585">ప్రస్తుతానికి దాచు</translation> -<translation id="1227058898775614466">నావిగేషన్ చరిత్ర</translation> +<translation id="1227058898775614466">నావిగేషన్ హిస్టరీ</translation> <translation id="1231733316453485619">సింక్ను ఆన్ చేయాలా?</translation> <translation id="123724288017357924">కాష్ కంటెంట్ విస్మరించి ప్రస్తుత పేజీ మళ్లీ లోడ్ చేయండి</translation> <translation id="1239792311949352652">ఈ పేజీని వేగంగా షేర్ చేయండి. ఈ షార్ట్కట్ను ఎడిట్ చేయడానికి, సెట్టింగ్లకు వెళ్లండి.</translation> @@ -60,8 +60,8 @@ <translation id="1266864766717917324"><ph name="CONTENT_TYPE" />ను షేర్ చేయడం సాధ్యపడలేదు</translation> <translation id="1283039547216852943">విస్తరించడానికి నొక్కండి</translation> <translation id="1285310382777185058">భాషను మార్చండి</translation> -<translation id="1291207594882862231">చరిత్ర, కుక్కీలు, సైట్ డేటా, కాష్ను తీసివేస్తుంది…</translation> -<translation id="129553762522093515">ఇటీవల మూసివెయ్యబడినవి</translation> +<translation id="1291207594882862231">హిస్టరీ, కుక్కీలు, సైట్ డేటా, కాష్ను తీసివేస్తుంది…</translation> +<translation id="129553762522093515">ఇటీవల మూసివేయబడినవి</translation> <translation id="1298077576058087471">60% వరకు డేటాను ఆదా చేయండి, ఈరోజు వార్తలను చదవండి</translation> <translation id="1303339473099049190">ఆ పాస్వర్డ్ను కనుగొనడం సాధ్యపడలేదు. మీ స్పెల్లింగ్ సరిచూసుకుని, ఆపై మళ్లీ ట్రై చేయండి.</translation> <translation id="1303507811548703290"><ph name="DOMAIN" /> - దీనిని పంపిన పరికరం <ph name="DEVICE_NAME" /></translation> @@ -69,7 +69,7 @@ <translation id="1311657260431405215">ఈ QR కోడ్ URL కాదు: <ph name="QRCODEVALUE" /></translation> <translation id="1316212908214730110">chrome_stylized_highlight_</translation> <translation id="1320912611264252795">బుక్మార్క్ను సేవ్ చేయడానికి సంబంధించిన దశల ఫోల్డర్లు ఫుల్-స్క్రీన్లో తెరవబడ్డాయి</translation> -<translation id="1327257854815634930">నావిగేషన్ చరిత్ర తెరిచి ఉంది</translation> +<translation id="1327257854815634930">నావిగేషన్ హిస్టరీ తెరిచి ఉంది</translation> <translation id="1331212799747679585">Chromeని అప్డేట్ చేయడం సాధ్యపడదు. మరిన్ని ఎంపికలు</translation> <translation id="1332100670807501334">మీరు సందర్శించే సైట్లను Chrome నుండి సమాచారాన్ని రిక్వెస్ట్ చేసేలా 'యాడ్ల అంచనా' అనుమతిస్తుంది, ఇది యాడ్ల పనితీరును అంచనా వేయడంలో సైట్కు సహాయపడుతుంది. 'యాడ్ల అంచనా', సైట్ల మధ్య వీలయినంత తక్కువ సమాచారాన్ని బదిలీ చేసి, క్రాస్-సైట్ ట్రాకింగ్ను తగ్గిస్తుంది. @@ -110,7 +110,7 @@ <translation id="1493287004536771723">మీరు <ph name="SITE_NAME" />ను ఫాలో చేస్తున్నారు</translation> <translation id="1502010315804028179">మీ పాస్వర్డ్లను మేనేజ్ చేయడానికి, Google Play సర్వీసులను అప్డేట్ చేయండి</translation> <translation id="1506061864768559482">సెర్చ్ ఇంజిన్</translation> -<translation id="1513352483775369820">బుక్మార్క్లు మరియు వెబ్ చరిత్ర</translation> +<translation id="1513352483775369820">బుక్మార్క్లు మరియు వెబ్ హిస్టరీ</translation> <translation id="1513814250881909472">మీ ఇతర పరికరాల నుండి మీ ట్యాబ్లను పొందడానికి సింక్ చేయండి</translation> <translation id="1513858653616922153">పాస్వర్డ్ను తొలగించు</translation> <translation id="1514552811327923157">గోప్యతా పరిరక్షణ టెక్నాలజీల సెట్ ప్రాంప్ట్ పూర్తి స్థాయిలో తెరవబడింది</translation> @@ -343,7 +343,7 @@ <translation id="2886836735871983413">మీరు వెబ్లో బ్రౌజ్ చేస్తున్నప్పుడు, ఇక్కడ సైట్ల లిస్ట్ కనిపిస్తుంది</translation> <translation id="2888126860611144412">Chrome పరిచయం</translation> <translation id="2891154217021530873">పేజీ లోడ్ కాకుండా ఆపివేయండి</translation> -<translation id="2893180576842394309">శోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ చరిత్రను ఉపయోగించే అవకాశం ఉంటుంది</translation> +<translation id="2893180576842394309">శోధన, ఇతర Google సేవలను వ్యక్తిగతీకరించడానికి Google మీ హిస్టరీని ఉపయోగించే అవకాశం ఉంటుంది</translation> <translation id="2900528713135656174">ఈవెంట్ను క్రియేట్ చేయండి</translation> <translation id="2901411048554510387"><ph name="WEBSITE_TITLE" /> కోసం సూచనలను చూపుతోంది</translation> <translation id="2904414404539560095">ట్యాబ్ను షేర్ చేయాల్సిన పరికరాల లిస్ట్ పూర్తి ఎత్తులో తెరవబడింది.</translation> @@ -439,7 +439,7 @@ <translation id="3365271666488085187">Chrome ఈ ఆసక్తిని పరిగణించవచ్చు</translation> <translation id="3367813778245106622">సింక్ను ప్రారంభించడానికి మళ్లీ సైన్ ఇన్ చేయండి</translation> <translation id="3373979091428520308">ఈ పేజీని మరొక పరికరానికి షేర్ చేయడానికి, ఆ పరికరంలోని Chrome సెట్టింగ్లలో సింక్ను ఆన్ చేయండి</translation> -<translation id="3374023511497244703">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర Chrome డేటా ఇకపై మీ Google ఖాతాలో సింక్ చేయబడదు</translation> +<translation id="3374023511497244703">మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర Chrome డేటా ఇకపై మీ Google ఖాతాలో సింక్ చేయబడదు</translation> <translation id="3384347053049321195">చిత్రాన్ని షేర్ చేయి</translation> <translation id="3387650086002190359">ఫైల్ సిస్టమ్ లోపాల కారణంగా <ph name="FILE_NAME" /> డౌన్లోడ్ విఫలమైంది.</translation> <translation id="3389286852084373014">వచనం చాలా పెద్దదిగా ఉంది</translation> @@ -469,7 +469,7 @@ <translation id="3524334353996115845">అది మీరేనని <ph name="ORIGIN" />ను వెరిఫై చేయనీయండి</translation> <translation id="3527085408025491307">ఫోల్డర్</translation> <translation id="3542235761944717775"><ph name="KILOBYTES" /> KB అందుబాటులో ఉంది</translation> -<translation id="3549657413697417275">మీ చరిత్రను వెతకండి</translation> +<translation id="3549657413697417275">మీ హిస్టరీని వెతకండి</translation> <translation id="3557336313807607643">కాంటాక్ట్లకు జోడించు</translation> <translation id="3560491354538957576">ఆసక్తులను సైట్ నిర్వచించవచ్చు</translation> <translation id="3563767357928833671">క్లిప్ బోర్డ్ కంటెంట్లను చూపబడ్డాయి</translation> @@ -748,7 +748,7 @@ <translation id="5118713593561876160">ఆసక్తులు</translation> <translation id="5123685120097942451">అజ్ఞాత ట్యాబ్</translation> <translation id="5126510351761255129">మీ కార్డ్ను ధృవీకరించండి</translation> -<translation id="5132942445612118989">అన్ని పరికరాల్లో మీ పాస్వర్డ్లు, చరిత్ర, మరిన్నింటిని సింక్ చేయండి</translation> +<translation id="5132942445612118989">అన్ని పరికరాల్లో మీ పాస్వర్డ్లు, హిస్టరీ, మరిన్నింటిని సింక్ చేయండి</translation> <translation id="5139940364318403933">Google Driveను ఎలా ఉపయోగించాలో తెలుసుకోండి</translation> <translation id="5142281402488957685">కొత్త కథనాల కోసం, రిఫ్రెష్ చేయడానికి కిందికి లాగండి</translation> <translation id="5152843274749979095">మద్దతు గల యాప్లు ఏవీ ఇన్స్టాల్ చేయబడలేదు</translation> @@ -813,7 +813,7 @@ <translation id="5492637351392383067">పరికరంలో ఎన్క్రిప్షన్</translation> <translation id="5514904542973294328">ఈ పరికర నిర్వాహకులు నిలిపివేశారు</translation> <translation id="5515439363601853141">మీ పాస్వర్డ్ను చూడడానికి అన్లాక్ చేయండి</translation> -<translation id="5517095782334947753">మీరు <ph name="FROM_ACCOUNT" /> నుండి బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను కలిగి ఉన్నారు.</translation> +<translation id="5517095782334947753">మీరు <ph name="FROM_ACCOUNT" /> నుండి బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు ఇతర సెట్టింగ్లను కలిగి ఉన్నారు.</translation> <translation id="5524761631371622910">ట్రయల్స్ ఆన్లో ఉన్నప్పుడు, Chrome ర్యాండమ్గా మిమ్మల్ని యాక్టివ్గా ఉన్న ఒక ట్రయల్లో ఉంచినట్లయితే, మీ బ్రౌజింగ్ హిస్టరీ మీరు చూసే యాడ్లను, దిగువున అంచనా వేసిన ఆసక్తులపై ప్రభావం చూపుతుంది. మీ గోప్యతను రక్షించడానికి, Chrome ప్రతి నెలా దశల వారీగా మీ ఆసక్తులను తొలగిస్తుంది.</translation> <translation id="5524843473235508879">మళ్లింపు బ్లాక్ చేయబడింది.</translation> <translation id="5548606607480005320">భద్రతా చెక్-అప్</translation> @@ -967,7 +967,7 @@ <translation id="6343495912647200061">{SHIPPING_ADDRESS,plural, =1{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 మరియు మరో <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" />}other{<ph name="SHIPPING_ADDRESS_PREVIEW" />\u2026 మరియు మరో <ph name="NUMBER_OF_ADDITIONAL_ADDRESSES" />}}</translation> <translation id="6345878117466430440">చదివినట్లుగా గుర్తించు</translation> <translation id="6363990818884053551">సింక్ను ప్రారంభించడానికి, అది మీరేనని వెరిఫై చేయండి</translation> -<translation id="6364438453358674297">చరిత్ర నుండి సూచనను తీసివేయాలా?</translation> +<translation id="6364438453358674297">హిస్టరీ నుండి సూచనను తీసివేయాలా?</translation> <translation id="6380100320871303656">మీరు సందర్శించే అవకాశం ఉందని Chrome భావించే పేజీలను మరింత తరచుగా ప్రీ - లోడ్ చేస్తుంది. ఈ సెట్టింగ్ వల్ల డేటా వినియోగం పెరిగే అవకాశం ఉంది.</translation> <translation id="6385407407546870227">ట్రయల్స్ ఆన్లో ఉన్నప్పుడు, మోసాన్ని ఎదుర్కోవడంలో, అలాగే వ్యక్తులకు, బాట్లకు మధ్య ఉన్న తేడాను గుర్తించడంలో సైట్లకు సహాయపడటానికి స్పామ్ & మోసం తగ్గింపు విశ్వసనీయ టోకెన్లపై ఆధారపడుతుంది. @@ -1363,7 +1363,7 @@ <translation id="8393700583063109961">మెసేజ్ను పంపండి</translation> <translation id="8394720698884623075">Chromeలో స్టోర్ చేయబడిన సురక్షితం కాని సైట్ల లిస్ట్తో కూడిన URLలను చెక్ చేస్తుంది</translation> <translation id="8410695015584479363">ధరలను ట్రాక్ చేయండి</translation> -<translation id="8413126021676339697">పూర్తి చరిత్రను చూపించు</translation> +<translation id="8413126021676339697">పూర్తి హిస్టరీని చూపించు</translation> <translation id="8414396119627470038"><ph name="SITE_ETLD_PLUS_ONE" /> లో <ph name="IDENTITY_PROVIDER_ETLD_PLUS_ONE" /> తో సైన్ ఇన్ చేయండి</translation> <translation id="8416347857511542594">Chromeలో యాడ్ వ్యక్తిగతీకరణ గురించి మరింత తెలుసుకోండి</translation> <translation id="8419244640277402268">చేర్చండి</translation> @@ -1389,7 +1389,7 @@ <ph name="BEGIN_LIST_ITEM2" />అడ్వర్టయిజర్లు, పబ్లిషర్లు సైట్లలో మిమ్మల్ని ట్రాక్ చేయని విధంగా యాడ్ల ప్రభావాన్ని అధ్యయనం చేయవచ్చు.<ph name="END_LIST_ITEM2" /></translation> <translation id="8481980314595922412">ట్రయల్ ఫీచర్లు ఆన్ చేయబడ్డాయి</translation> <translation id="8485434340281759656"><ph name="FILE_SIZE" /> <ph name="SEPARATOR" /> <ph name="DESCRIPTION" /></translation> -<translation id="8489271220582375723">చరిత్ర పేజీని తెరవండి</translation> +<translation id="8489271220582375723">హిస్టరీ పేజీని తెరవండి</translation> <translation id="8493948351860045254">స్థలాన్ని ఖాళీ చేయి</translation> <translation id="8497242791509864205">క్రమబద్ధీకరణ ఆప్షన్లను తెరుస్తుంది</translation> <translation id="8497480609928300907">గోప్యతా గైడ్ వివరణ</translation> @@ -1446,7 +1446,7 @@ <translation id="8756969031206844760">పాస్వర్డ్ను అప్డేట్ చేయాలా?</translation> <translation id="8766529642647037772">ఇటువంటి హైలైట్ చేయబడిన లింక్ను క్రియేట్ చేయాలా?</translation> <translation id="8773160212632396039">రిక్వెస్ట్ను ప్రాసెస్ చేస్తోంది</translation> -<translation id="8788265440806329501">నావిగేషన్ చరిత్ర మూసివేయబడింది</translation> +<translation id="8788265440806329501">నావిగేషన్ హిస్టరీ మూసివేయబడింది</translation> <translation id="8788968922598763114">చివరగా మూసివేసిన ట్యాబ్ను మళ్లీ తెరవండి</translation> <translation id="8798449543960971550">చదవండి</translation> <translation id="8803526663383843427">ఆన్లో ఉన్నప్పుడు</translation> @@ -1520,7 +1520,7 @@ <translation id="9148126808321036104">మళ్ళీ సైన్ ఇన్ చేయండి</translation> <translation id="9158770349521403363">కంటెంట్ను మాత్రమే షేర్ చేయండి</translation> <translation id="9159716826369098114"><ph name="TAB_COUNT" /> ట్యాబ్ల ట్యాబ్ గ్రూప్ను కొత్త బ్యాక్గ్రౌండ్ ట్యాబ్ గ్రూప్గా రీస్టోర్ చేయండి.</translation> -<translation id="9169507124922466868">నావిగేషన్ చరిత్ర సగం తెరిచి ఉంది</translation> +<translation id="9169507124922466868">నావిగేషన్ హిస్టరీ సగం తెరిచి ఉంది</translation> <translation id="9187955620966010988">ప్రతిస్పందన సర్దుబాటు చేయబడింది</translation> <translation id="9190276265094487094">సింక్ చేసిన మీ పరికరాలన్నింటిలో మీ హిస్టరీ ఉంటుంది, కాబట్టి మీరు ఏదైతే చేస్తున్నారో, దానిని కొనసాగించవచ్చు</translation> <translation id="9199368092038462496">{NUM_MINS,plural, =1{1 నిమిషం క్రితం చెక్ చేసింది}other{# నిమిషాల క్రితం చెక్ చేసింది}}</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb index c319d3b9..048643a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_th.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">คัดลอกรูปภาพ</translation> <translation id="6674571176963658787">หากต้องการเริ่มต้นการซิงค์ ให้ป้อนรหัสผ่านของคุณ</translation> <translation id="6676840375528380067">ล้างข้อมูล Chrome ของคุณออกจากอุปกรณ์นี้ไหม</translation> +<translation id="6676927815633975364">ลงชื่อเข้าใช้เว็บไซต์นี้และ Chrome</translation> <translation id="6684809838922667136">ปรับปรุง Chrome ให้ดีขึ้น</translation> <translation id="670498945988402717">ตรวจสอบเมื่อวาน</translation> <translation id="6710213216561001401">ก่อนหน้า</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb index e4284c0..fd9cb3a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uk.xtb
@@ -1049,6 +1049,7 @@ <translation id="6671495933530132209">Копіювати зображення</translation> <translation id="6674571176963658787">Щоб почати синхронізацію, введіть парольну фразу</translation> <translation id="6676840375528380067">Видалити дані Chrome із цього пристрою?</translation> +<translation id="6676927815633975364">Увійдіть в обліковий запис на цьому сайті й у Chrome</translation> <translation id="6684809838922667136">Покращте Chrome</translation> <translation id="670498945988402717">Перевірено вчора</translation> <translation id="6710213216561001401">Назад</translation>
diff --git a/chrome/browser/ui/ash/desks/desks_client_browsertest.cc b/chrome/browser/ui/ash/desks/desks_client_browsertest.cc index 8ba2c5f..644e114 100644 --- a/chrome/browser/ui/ash/desks/desks_client_browsertest.cc +++ b/chrome/browser/ui/ash/desks/desks_client_browsertest.cc
@@ -67,6 +67,7 @@ #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/browser/web_applications/user_display_mode.h" #include "chrome/browser/web_applications/web_app_provider.h" +#include "chrome/test/base/chromeos/ash_browser_test_starter.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "chromeos/ui/base/window_state_type.h" @@ -2460,7 +2461,119 @@ loop2.Run(); } -// TODO(crbug.com/1333965): Add some tests to launch LaCros browser. +class DesksTemplatesClientLacrosTest : public InProcessBrowserTest { + public: + DesksTemplatesClientLacrosTest() { + scoped_feature_list_.InitWithFeatures( + /*enabled_features=*/{ash::features::kDesksTemplates}, + /*disabled_features=*/{ash::features::kDeskTemplateSync}); + } + DesksTemplatesClientLacrosTest(const DesksTemplatesClientLacrosTest&) = + delete; + DesksTemplatesClientLacrosTest& operator=( + const DesksTemplatesClientLacrosTest&) = delete; + ~DesksTemplatesClientLacrosTest() override = default; + + // InProcessBrowserTest: + void SetUpInProcessBrowserTestFixture() override { + if (!ash_starter_.HasLacrosArgument()) + return; + + ASSERT_TRUE(ash_starter_.PrepareEnvironmentForLacros()); + } + + void SetUpOnMainThread() override { + if (!ash_starter_.HasLacrosArgument()) + return; + + // `StartLacros()` will bring up one lacros browser. There will also be one + // classic browser from `InProcessBrowserTest` that can be accessed with + // `browser()`. + LacrosWindowWaiter waiter; + ash_starter_.StartLacros(this); + std::ignore = waiter.Wait(/*expected_count=*/1u); + } + + protected: + // Helper class which waits for lacros windows to become visible. + class LacrosWindowWaiter : public aura::WindowObserver { + public: + LacrosWindowWaiter() { + window_observation_.Observe(ash::Shell::GetPrimaryRootWindow()); + } + LacrosWindowWaiter(const LacrosWindowWaiter&) = delete; + LacrosWindowWaiter& operator=(const LacrosWindowWaiter&) = delete; + ~LacrosWindowWaiter() override = default; + + // Spins the loop and waits for `expected_count` number of lacros windows to + // become visible. + aura::Window::Windows Wait(size_t expected_count) { + DCHECK(windows_.empty()); + DCHECK_GT(expected_count, 0u); + + expected_count_ = expected_count; + run_loop_.Run(); + return windows_; + } + + // aura::WindowObserver:: + void OnWindowVisibilityChanged(aura::Window* window, + bool visible) override { + if (!visible || !crosapi::browser_util::IsLacrosWindow(window)) + return; + + windows_.push_back(window); + if (windows_.size() < expected_count_) + return; + + run_loop_.Quit(); + } + + private: + size_t expected_count_ = 0u; + + // The vector of lacros windows that where shown while waiting. + aura::Window::Windows windows_; + + base::RunLoop run_loop_; + + base::ScopedObservation<aura::Window, aura::WindowObserver> + window_observation_{this}; + }; + + base::test::ScopedFeatureList scoped_feature_list_; + test::AshBrowserTestStarter ash_starter_; +}; + +// Tests launching a template with a browser window. +IN_PROC_BROWSER_TEST_F(DesksTemplatesClientLacrosTest, SystemUILaunchBrowser) { + if (!ash_starter_.HasLacrosArgument()) + return; + + ASSERT_TRUE(crosapi::BrowserManager::Get()->IsRunning()); + + // Enter overview and save the current desk as a template. The current desk + // has one lacros browser, and one regular browser. + ash::ToggleOverview(); + ash::WaitForOverviewEnterAnimation(); + ClickSaveDeskAsTemplateButton(); + + // Launch the saved desk template. We expect two launched lacros windows, + // since the regular browser window was saved and will be launched as a lacros + // window. Check the launched windows will have data in + // `app_restore::kWindowInfoKey`, otherwise ash does not know that they are + // launched from desk templates. See https://crbug.com/1333965 for more + // details. + LacrosWindowWaiter waiter; + ClickFirstTemplateItem(); + aura::Window::Windows launched_windows = waiter.Wait(/*expected_count=*/2u); + ASSERT_EQ(2u, launched_windows.size()); + for (auto* window : launched_windows) + EXPECT_TRUE(window->GetProperty(app_restore::kWindowInfoKey)); + + ash::ToggleOverview(); + ash::WaitForOverviewExitAnimation(); +} class DesksTemplatesClientArcTest : public InProcessBrowserTest { public:
diff --git a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc index 3df9244..37840c8 100644 --- a/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc +++ b/chrome/browser/ui/ash/multi_user/multi_profile_support_unittest.cc
@@ -8,7 +8,6 @@ #include <set> #include <vector> -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/display/screen_orientation_controller.h" #include "ash/display/screen_orientation_controller_test_api.h" #include "ash/multi_user/multi_user_window_manager_impl.h" @@ -54,6 +53,7 @@ #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "components/user_manager/scoped_user_manager.h" #include "components/user_manager/user_info.h"
diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc index 7b0fa72..3e2fbce 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.cc +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.cc
@@ -11,7 +11,6 @@ #include "ash/public/cpp/projector/annotator_tool.h" #include "ash/public/cpp/projector/projector_controller.h" #include "ash/webui/projector_app/annotator_message_handler.h" -#include "ash/webui/projector_app/projector_screencast.h" #include "ash/webui/projector_app/public/cpp/projector_app_constants.h" #include "base/bind.h" #include "chrome/browser/ash/profiles/profile_helper.h" @@ -163,10 +162,12 @@ // error string. For now, assume that the dialog has opened successfully. } -void ProjectorAppClientImpl::GetScreencast( - const std::string& screencast_id, - ash::ProjectorAppClient::OnGetScreencastCallback callback) { - screencast_manager_.GetScreencast(screencast_id, std::move(callback)); +void ProjectorAppClientImpl::GetVideo( + const std::string& video_file_id, + const std::string& resource_key, + ash::ProjectorAppClient::OnGetVideoCallback callback) const { + screencast_manager_.GetVideo(video_file_id, resource_key, + std::move(callback)); } void ProjectorAppClientImpl::SetAnnotatorMessageHandler(
diff --git a/chrome/browser/ui/ash/projector/projector_app_client_impl.h b/chrome/browser/ui/ash/projector/projector_app_client_impl.h index 30f8df55..4623928 100644 --- a/chrome/browser/ui/ash/projector/projector_app_client_impl.h +++ b/chrome/browser/ui/ash/projector/projector_app_client_impl.h
@@ -53,9 +53,10 @@ void OnSodaInstallError() override; void OnSodaInstalled() override; void OpenFeedbackDialog() const override; - void GetScreencast( - const std::string& screencast_id, - ash::ProjectorAppClient::OnGetScreencastCallback callback) override; + void GetVideo( + const std::string& video_file_id, + const std::string& resource_key, + ash::ProjectorAppClient::OnGetVideoCallback callback) const override; void SetAnnotatorMessageHandler( ash::AnnotatorMessageHandler* handler) override; void ResetAnnotatorMessageHandler(
diff --git a/chrome/browser/ui/ash/projector/screencast_manager.cc b/chrome/browser/ui/ash/projector/screencast_manager.cc index 6d53a9c..369dbc4 100644 --- a/chrome/browser/ui/ash/projector/screencast_manager.cc +++ b/chrome/browser/ui/ash/projector/screencast_manager.cc
@@ -4,142 +4,26 @@ #include "chrome/browser/ui/ash/projector/screencast_manager.h" -#include <vector> +#include <memory> #include "ash/webui/projector_app/projector_screencast.h" -#include "ash/webui/projector_app/public/cpp/projector_app_constants.h" -#include "base/bind.h" -#include "base/check.h" -#include "base/strings/string_util.h" -#include "base/strings/stringprintf.h" -#include "base/task/task_traits.h" -#include "base/task/thread_pool.h" -#include "chrome/browser/profiles/profile_manager.h" -#include "components/drive/service/drive_api_service.h" -#include "components/drive/service/drive_service_interface.h" -#include "components/signin/public/base/consent_level.h" -#include "components/signin/public/identity_manager/identity_manager.h" -#include "content/public/browser/storage_partition.h" -#include "google_apis/common/api_error_codes.h" -#include "google_apis/drive/drive_api_parser.h" -#include "google_apis/drive/drive_api_url_generator.h" -#include "google_apis/drive/drive_common_callbacks.h" -#include "google_apis/gaia/gaia_urls.h" -#include "net/traffic_annotation/network_traffic_annotation.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" -#include "url/gurl.h" namespace ash { -namespace { - -// Projector network traffic annotation tags. -constexpr net::NetworkTrafficAnnotationTag kNetworkTrafficAnnotationTag = - net::DefineNetworkTrafficAnnotation("projector_drive_request", - R"( - semantics: { - sender: "ChromeOS Projector" - description: "ChromeOS send Drive request for Projector" - destination: GOOGLE_OWNED_SERVICE - } - policy: { - cookies_allowed: YES - })"); - -// Populates the `metadata_file_id` and `video.file_id` fields for `screencast` -// on get the results from GetFileListInDirectory(). -void OnGetScreencastFilesResult( - std::unique_ptr<ProjectorScreencast> screencast, - ProjectorAppClient::OnGetScreencastCallback callback, - google_apis::ApiErrorCode error, - std::unique_ptr<google_apis::FileList> entry) { - // Copies screencast id since `screencast` will be deleted after std::move(). - const std::string screencast_id = screencast->container_folder_id; - if (error != google_apis::ApiErrorCode::HTTP_SUCCESS) { - std::move(callback).Run( - std::move(screencast), - base::StringPrintf( - "Search Drive files error. ScreencastId=%s, ErrorCode=%d", - screencast_id.c_str(), error)); - return; - } - - for (const auto& file_resource : entry->items()) { - if (base::EndsWith(file_resource->title(), kProjectorMediaFileExtension)) { - screencast->video.file_id = file_resource->file_id(); - } else if (base::EndsWith(file_resource->title(), - kProjectorMetadataFileExtension)) { - screencast->metadata_file_id = file_resource->file_id(); - } - } - - std::string error_msg; - if (screencast->metadata_file_id.empty() || - screencast->video.file_id.empty()) { - error_msg = base::StringPrintf( - "Invalid screencast. Missing video file or metadata file. " - "ScreencastId=%s", - screencast_id.c_str()); - } - std::move(callback).Run(std::move(screencast), error_msg); -} - -} // namespace - ScreencastManager::ScreencastManager() = default; ScreencastManager::~ScreencastManager() = default; -// TODO(b/237089852): Find the path for local video file. -// TODO(b/236857019): Set the rest of the fields for the screencast. -void ScreencastManager::GetScreencast( - const std::string& screencast_id, - ProjectorAppClient::OnGetScreencastCallback callback) { - DCHECK(!screencast_id.empty()); - std::unique_ptr<ProjectorScreencast> screencast = - std::make_unique<ProjectorScreencast>(); - screencast->container_folder_id = screencast_id; - if (!drive_api_service_) - InitDriveAPIService(); - - drive_api_service_->GetFileListInDirectory( - screencast_id, - base::BindOnce(&OnGetScreencastFilesResult, std::move(screencast), - std::move(callback))); -} - -void ScreencastManager::SetDriveAPIServiceForTest( - std::unique_ptr<drive::DriveServiceInterface> drive_api_service) { - drive_api_service_ = std::move(drive_api_service); -} - -void ScreencastManager::InitDriveAPIService() { - // TODO(b/221492092): Add one DriveFS/Drive helper to manage the profile - // switch. - signin::IdentityManager* identity_manager = - ProjectorAppClient::Get()->GetIdentityManager(); - auto* profile = ProfileManager::GetActiveUserProfile(); - DCHECK(profile); - DCHECK(identity_manager); - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory = - profile->GetDefaultStoragePartition() - ->GetURLLoaderFactoryForBrowserProcess(); - scoped_refptr<base::SequencedTaskRunner> blocking_task_runner = - base::ThreadPool::CreateSequencedTaskRunner( - {base::MayBlock(), base::TaskPriority::USER_VISIBLE, - base::TaskShutdownBehavior::CONTINUE_ON_SHUTDOWN}); - GURL base_url(GaiaUrls::GetInstance()->google_apis_origin_url()); - GURL base_thumbnail_url( - google_apis::DriveApiUrlGenerator::kBaseThumbnailUrlForProduction); - drive_api_service_ = std::make_unique<drive::DriveAPIService>( - identity_manager, url_loader_factory, blocking_task_runner.get(), - base_url, base_thumbnail_url, /*custom_user_agent=*/std::string(), - kNetworkTrafficAnnotationTag); - - // The screencast object will be used to load screencast from DriveFS and - // since DriveFS only support primary account, we don't need to handle - // secondary account here. - drive_api_service_->Initialize( - identity_manager->GetPrimaryAccountId(signin::ConsentLevel::kSignin)); +void ScreencastManager::GetVideo( + const std::string& video_file_id, + const std::string& resource_key, + ProjectorAppClient::OnGetVideoCallback callback) const { + auto video = std::make_unique<ProjectorScreencastVideo>(); + video->file_id = video_file_id; + // TODO(b/237089852): + // 1. Find the video file by id. + // 2. Find the video duration. + // 3. Launch the app with the video file. + std::move(callback).Run(std::move(video), /*error_message=*/std::string()); } } // namespace ash
diff --git a/chrome/browser/ui/ash/projector/screencast_manager.h b/chrome/browser/ui/ash/projector/screencast_manager.h index c830614..2f4cda2 100644 --- a/chrome/browser/ui/ash/projector/screencast_manager.h +++ b/chrome/browser/ui/ash/projector/screencast_manager.h
@@ -5,18 +5,13 @@ #ifndef CHROME_BROWSER_UI_ASH_PROJECTOR_SCREENCAST_MANAGER_H_ #define CHROME_BROWSER_UI_ASH_PROJECTOR_SCREENCAST_MANAGER_H_ -#include <memory> #include <string> #include "ash/webui/projector_app/projector_app_client.h" -namespace drive { -class DriveServiceInterface; -} // namespace drive - namespace ash { -// Class to get and modify screencast data through IO and Drive/DriveFS. +// Class to get and modify screencast data through IO and DriveFS. class ScreencastManager { public: ScreencastManager(); @@ -24,26 +19,13 @@ ScreencastManager& operator=(const ScreencastManager&) = delete; ~ScreencastManager(); - // Populates all fields for a screencast except `srcUrl` in `callback` for - // given `screencast_id`. - void GetScreencast(const std::string& screencast_id, - ProjectorAppClient::OnGetScreencastCallback callback); - - void SetDriveAPIServiceForTest( - std::unique_ptr<drive::DriveServiceInterface> drive_api_service); - - private: - // Should not call this in constructor because Drive service for active - // profile might not be ready. - void InitDriveAPIService(); - - // TODO(b/236857019): - // GetScreencastMetadata(): Read metadata file into ProjectorScreencast. - // GetScreencastStatus(): Determine the status of ProjectorScreencast. - - // TODO(b/236857019): Replace the REST API with DriveFs integration service - // once it supports search file by parent id. - std::unique_ptr<drive::DriveServiceInterface> drive_api_service_; + // Launches the given DriveFS video file with `video_file_id` into the + // Projector app. The `resource_key` is an additional security token needed to + // gain access to link-shared files. Since the `resource_key` is currently + // only used by Googlers, the `resource_key` might be empty. + void GetVideo(const std::string& video_file_id, + const std::string& resource_key, + ProjectorAppClient::OnGetVideoCallback callback) const; }; } // namespace ash
diff --git a/chrome/browser/ui/ash/projector/screencast_manager_browsertest.cc b/chrome/browser/ui/ash/projector/screencast_manager_browsertest.cc index 6067765..47330c6 100644 --- a/chrome/browser/ui/ash/projector/screencast_manager_browsertest.cc +++ b/chrome/browser/ui/ash/projector/screencast_manager_browsertest.cc
@@ -5,154 +5,40 @@ #include "chrome/browser/ui/ash/projector/screencast_manager.h" #include <memory> -#include <string> #include "ash/webui/projector_app/projector_screencast.h" -#include "base/callback_forward.h" #include "base/run_loop.h" #include "base/test/bind.h" #include "chrome/test/base/in_process_browser_test.h" -#include "components/drive/service/fake_drive_service.h" #include "content/public/test/browser_test.h" -#include "google_apis/common/api_error_codes.h" -#include "google_apis/drive/drive_api_parser.h" #include "testing/gtest/include/gtest/gtest.h" namespace ash { + namespace { -constexpr char kScreencastId[] = "screencastId"; constexpr char kVideoFileId[] = "videoFileId"; -constexpr char kMetadataFileId[] = "metadataFileId"; +constexpr char kResourceKey[] = "resourceKey"; } // namespace class ScreencastManagerTest : public InProcessBrowserTest { - public: - // InProcessBrowserTest: - void SetUpOnMainThread() override { - InProcessBrowserTest::SetUpOnMainThread(); - - auto fake_drive_service = std::make_unique<drive::FakeDriveService>(); - drive_service_ = fake_drive_service.get(); - screencast_manager_.SetDriveAPIServiceForTest( - std::move(fake_drive_service)); - } - protected: - // Creates a default screencast folder with item id = |kScreencastId| for - // DriveAPIService. - void AddDefaultScreencastFolder() { - base::RunLoop run_loop; - drive_service()->AddNewDirectoryWithResourceId( - kScreencastId, - /*parent_resource_id=*/"", - /*directory_title=*/"Screencast", drive::AddNewDirectoryOptions(), - base::BindLambdaForTesting( - [&run_loop]( - google_apis::ApiErrorCode drive_error, - std::unique_ptr<google_apis::FileResource> drive_entry) { - ASSERT_EQ(drive_error, google_apis::ApiErrorCode::HTTP_CREATED); - run_loop.Quit(); - })); - run_loop.Run(); - } - - // Creates a file under the default screencast folder for DriveAPIService. - void AddFileToDefaultScreencastFolder(const std::string& file_id, - const std::string& content_type, - const std::string& title, - bool shared_with_me) { - base::RunLoop run_loop; - drive_service()->AddNewFileWithResourceId( - file_id, content_type, "This is some test content.", - /*parent_resource_id=*/kScreencastId, title, shared_with_me, - base::BindLambdaForTesting( - [&run_loop]( - google_apis::ApiErrorCode drive_error, - std::unique_ptr<google_apis::FileResource> drive_entry) { - ASSERT_EQ(drive_error, google_apis::ApiErrorCode::HTTP_CREATED); - run_loop.Quit(); - })); - run_loop.Run(); - } - ScreencastManager& screencast_manager() { return screencast_manager_; } - drive::FakeDriveService* drive_service() { return drive_service_; } - private: - drive::FakeDriveService* drive_service_ = nullptr; - ScreencastManager screencast_manager_; }; -IN_PROC_BROWSER_TEST_F(ScreencastManagerTest, GetScreencastSuccess) { - // Creates default screencast folder. - AddDefaultScreencastFolder(); - - // Creates screencasts files. - AddFileToDefaultScreencastFolder(kVideoFileId, "video/webm", - "MyTestScreencast.webm", true); - AddFileToDefaultScreencastFolder(kMetadataFileId, "text/plain", - "MyTestScreencast.projector", true); - +IN_PROC_BROWSER_TEST_F(ScreencastManagerTest, GetVideoSuccess) { base::RunLoop run_loop; - screencast_manager().GetScreencast( - kScreencastId, + screencast_manager().GetVideo( + kVideoFileId, kResourceKey, base::BindLambdaForTesting( - [&run_loop](std::unique_ptr<ash::ProjectorScreencast> screencast, - const std::string& error) { - EXPECT_EQ(screencast->container_folder_id, kScreencastId); - // Expects video file id and metadata file id are populated. - EXPECT_EQ(screencast->video.file_id, kVideoFileId); - EXPECT_EQ(screencast->metadata_file_id, kMetadataFileId); - EXPECT_TRUE(error.empty()); - // Quits the run loop. - run_loop.Quit(); - })); - run_loop.Run(); -} - -IN_PROC_BROWSER_TEST_F(ScreencastManagerTest, - GetScreencastInvalidScreencastError) { - AddDefaultScreencastFolder(); - // Creates invalid screencast without video file. - AddFileToDefaultScreencastFolder("metadataFileId", "text/plain", - "MyTestScreencast.projector", true); - - base::RunLoop run_loop; - screencast_manager().GetScreencast( - kScreencastId, - base::BindLambdaForTesting( - [&run_loop](std::unique_ptr<ash::ProjectorScreencast> screencast, - const std::string& error) { - // Expects missing file error. - EXPECT_EQ( - error, - "Invalid screencast. Missing video file or metadata file. " - "ScreencastId=screencastId"); - // Quits the run loop. - run_loop.Quit(); - })); - - run_loop.Run(); -} - -IN_PROC_BROWSER_TEST_F(ScreencastManagerTest, GetScreencastHttpError) { - // Mocks offline. - drive_service()->set_offline(true); - - base::RunLoop run_loop; - screencast_manager().GetScreencast( - kScreencastId, - base::BindLambdaForTesting( - [&run_loop](std::unique_ptr<ash::ProjectorScreencast> screencast, - const std::string& error) { - // Expects search file error. - EXPECT_EQ(error, - "Search Drive files error. ScreencastId=screencastId, " - "ErrorCode=900"); + [&run_loop](std::unique_ptr<ProjectorScreencastVideo> video, + const std::string& error_message) { + EXPECT_EQ(video->file_id, kVideoFileId); + EXPECT_TRUE(error_message.empty()); // Quits the run loop. run_loop.Quit(); }));
diff --git a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc index ccebe331..1410fcc 100644 --- a/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/save_card_bubble_views_browsertest.cc
@@ -43,8 +43,10 @@ #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/autofill/content/browser/content_autofill_driver.h" +#include "components/autofill/content/browser/test_autofill_manager_injector.h" #include "components/autofill/core/browser/autofill_experiments.h" #include "components/autofill/core/browser/autofill_test_utils.h" +#include "components/autofill/core/browser/browser_autofill_manager.h" #include "components/autofill/core/browser/form_data_importer.h" #include "components/autofill/core/browser/metrics/payments/manage_cards_prompt_metrics.h" #include "components/autofill/core/browser/payments/credit_card_save_manager.h" @@ -52,6 +54,7 @@ #include "components/autofill/core/browser/payments/payments_client.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/test_autofill_clock.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "components/autofill/core/browser/test_event_waiter.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" @@ -132,7 +135,6 @@ class SaveCardBubbleViewsFullFormBrowserTest : public SyncTest, - public AutofillManager::Observer, public CreditCardSaveManager::ObserverForTest, public SaveCardBubbleControllerImpl::ObserverForTest { protected: @@ -143,16 +145,32 @@ const SaveCardBubbleViewsFullFormBrowserTest&) = delete; SaveCardBubbleViewsFullFormBrowserTest& operator=( const SaveCardBubbleViewsFullFormBrowserTest&) = delete; + ~SaveCardBubbleViewsFullFormBrowserTest() override = default; protected: - ~SaveCardBubbleViewsFullFormBrowserTest() override = default; + class TestAutofillManager : public BrowserAutofillManager { + public: + TestAutofillManager(ContentAutofillDriver* driver, AutofillClient* client) + : BrowserAutofillManager(driver, + client, + "en-US", + EnableDownloadManager(false)) {} + + testing::AssertionResult WaitForFormsSeen(int min_num_awaited_calls) { + return forms_seen_waiter_.Wait(min_num_awaited_calls); + } + + private: + TestAutofillManagerWaiter forms_seen_waiter_{ + *this, + {&AutofillManager::Observer::OnAfterFormsSeen}}; + }; // Various events that can be waited on by the DialogEventWaiter. enum DialogEvent : int { OFFERED_LOCAL_SAVE, OFFERED_UPLOAD_SAVE, REQUESTED_UPLOAD_SAVE, - DYNAMIC_FORM_PARSED, RECEIVED_GET_UPLOAD_DETAILS_RESPONSE, SENT_UPLOAD_CARD_REQUEST, RECEIVED_UPLOAD_CARD_RESPONSE, @@ -212,12 +230,9 @@ credit_card_save_manager_->SetEventObserverForTesting(this); AddEventObserverToController(); - // Set up this class as the ObserverForTest implementation. - AutofillManager* autofill_manager = - ContentAutofillDriver::GetForRenderFrameHost( - GetActiveWebContents()->GetPrimaryMainFrame()) - ->autofill_manager(); - autofill_manager->AddObserver(this); + autofill_manager_injector_ = + std::make_unique<TestAutofillManagerInjector<TestAutofillManager>>( + GetActiveWebContents()); // Set up the fake geolocation data. geolocation_overrider_ = @@ -225,10 +240,10 @@ kFakeGeolocationLatitude, kFakeGeolocationLongitude); } - // AutofillManager::Observer - void OnFormParsed() override { - if (event_waiter_) - event_waiter_->OnEvent(DialogEvent::DYNAMIC_FORM_PARSED); + // The primary main frame's AutofillManager. + TestAutofillManager* GetAutofillManager() { + DCHECK(autofill_manager_injector_); + return autofill_manager_injector_->GetForPrimaryMainFrame(); } // CreditCardSaveManager::ObserverForTest: @@ -738,6 +753,8 @@ private: std::unique_ptr<autofill::EventWaiter<DialogEvent>> event_waiter_; scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; + std::unique_ptr<TestAutofillManagerInjector<TestAutofillManager>> + autofill_manager_injector_; std::unique_ptr<device::ScopedGeolocationOverrider> geolocation_overrider_; }; @@ -1410,9 +1427,8 @@ // Submitting the the dynamic change form, offer to save bubble should be // shown. - ResetEventWaiterForSequence({DialogEvent::DYNAMIC_FORM_PARSED}); FillAndChangeForm(); - WaitForObservedEvent(); + ASSERT_TRUE(GetAutofillManager()->WaitForFormsSeen(1)); ResetEventWaiterForSequence( {DialogEvent::REQUESTED_UPLOAD_SAVE, DialogEvent::RECEIVED_GET_UPLOAD_DETAILS_RESPONSE,
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_manager.cc b/chrome/browser/ui/views/bubble/webui_bubble_manager.cc index 47f5bd2..a6a34fc 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_manager.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_manager.cc
@@ -24,7 +24,15 @@ base::BindRepeating(&WebUIBubbleManager::ResetContentsWrapper, base::Unretained(this)))) {} -WebUIBubbleManager::~WebUIBubbleManager() = default; +WebUIBubbleManager::~WebUIBubbleManager() { + // The bubble manager may be destroyed before the bubble in certain + // situations. Ensure we forcefully close the managed bubble during + // destruction to mitigate the risk of UAFs (see crbug.com/1345546). + if (bubble_view_) { + DCHECK(bubble_view_->GetWidget()); + bubble_view_->GetWidget()->CloseNow(); + } +} bool WebUIBubbleManager::ShowBubble(const absl::optional<gfx::Rect>& anchor, ui::ElementIdentifier identifier) {
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc b/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc index 41b0d7d..42de3fe 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_manager_browsertest.cc
@@ -51,15 +51,14 @@ browser()->profile(), GURL("chrome://test"), 1); } void TearDownOnMainThread() override { - auto* widget = bubble_manager_->GetBubbleWidget(); - if (widget) - widget->CloseNow(); - bubble_manager()->ResetContentsWrapperForTesting(); + bubble_manager_.reset(); InProcessBrowserTest::TearDownOnMainThread(); } WebUIBubbleManager* bubble_manager() { return bubble_manager_.get(); } + void DestroyBubbleManager() { bubble_manager_.reset(); } + private: std::unique_ptr<WebUIBubbleManager> bubble_manager_; }; @@ -88,3 +87,23 @@ bubble_manager()->CloseBubble(); EXPECT_TRUE(bubble_manager()->GetBubbleWidget()->IsClosed()); } + +// Ensures that the WebUI bubble is destroyed synchronously with the manager. +// This guards against a potential UAF crash (see crbug.com/1345546). +IN_PROC_BROWSER_TEST_F(WebUIBubbleManagerBrowserTest, + ManagerDestructionClosesBubble) { + EXPECT_EQ(nullptr, bubble_manager()->GetBubbleWidget()); + bubble_manager()->ShowBubble(); + EXPECT_NE(nullptr, bubble_manager()->GetBubbleWidget()); + + base::WeakPtr<WebUIBubbleDialogView> bubble_view = + bubble_manager()->bubble_view_for_testing(); + EXPECT_TRUE(bubble_view); + bubble_view->ShowUI(); + EXPECT_TRUE(bubble_manager()->GetBubbleWidget()->IsVisible()); + + // Destroy the bubble manager without explicitly destroying the bubble. Ensure + // the bubble is closed synchronously. + DestroyBubbleManager(); + EXPECT_FALSE(bubble_view); +}
diff --git a/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc b/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc index cb6c9dfc..fa75b7e 100644 --- a/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc +++ b/chrome/browser/ui/views/bubble/webui_bubble_manager_unittest.cc
@@ -54,8 +54,6 @@ // ChromeViewsTestBase: void SetUp() override { - scoped_feature_list_.InitWithFeatures( - {features::kWebUIBubblePerProfilePersistence}, {}); ASSERT_TRUE(profile_manager_.SetUp()); ChromeViewsTestBase::SetUp(); } @@ -63,11 +61,25 @@ TestingProfileManager* profile_manager() { return &profile_manager_; } private: - base::test::ScopedFeatureList scoped_feature_list_; TestingProfileManager profile_manager_; }; -TEST_F(WebUIBubbleManagerTest, UsesPersistentContentsWrapperPerProfile) { +// Fixture for testing the persistent renderer functionality. +class WebUIBubbleManagerPersistentRendererTest : public WebUIBubbleManagerTest { + public: + // WebUIBubbleManagerTest: + void SetUp() override { + scoped_feature_list_.InitWithFeatures( + {features::kWebUIBubblePerProfilePersistence}, {}); + WebUIBubbleManagerTest::SetUp(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +TEST_F(WebUIBubbleManagerPersistentRendererTest, + UsesPersistentContentsWrapperPerProfile) { const char* kProfileName = "Person 1"; auto* test_profile = profile_manager()->CreateTestingProfile(kProfileName); @@ -109,7 +121,7 @@ profile_manager()->DeleteTestingProfile(kProfileName); } -TEST_F(WebUIBubbleManagerTest, +TEST_F(WebUIBubbleManagerPersistentRendererTest, PerProfileContentsWrapperNotUsedForOffTheRecordProfile) { const char* kProfileName = "Person 1"; auto* test_profile = profile_manager()->CreateTestingProfile(kProfileName); @@ -166,7 +178,7 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) // No multi-profile on ChromeOS. -TEST_F(WebUIBubbleManagerTest, +TEST_F(WebUIBubbleManagerPersistentRendererTest, UsesPersistentContentsWrapperPerProfileMultiProfile) { const char* kProfileName1 = "Person 1"; const char* kProfileName2 = "Person 2";
diff --git a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm index 072b4635..fa6eb7e 100644 --- a/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm +++ b/chrome/browser/ui/views/frame/immersive_mode_controller_mac.mm
@@ -20,10 +20,12 @@ #include "components/remote_cocoa/app_shim/bridged_content_view.h" #include "ui/gfx/geometry/rect.h" #include "ui/views/cocoa/immersive_mode_delegate_mac.h" +#include "ui/views/cocoa/native_widget_mac_ns_window_host.h" #include "ui/views/focus/focus_manager.h" #include "ui/views/layout/layout_manager.h" #include "ui/views/view_observer.h" #include "ui/views/widget/widget.h" +#include "ui/views/widget/widget_utils_mac.h" // A stub NSWindowDelegate class that will be used to map the AppKit controlled // NSWindow to the overlay view widget's NSWindow. The delegate will be used to @@ -40,14 +42,17 @@ @interface ImmersiveModeTitlebarViewController : NSTitlebarAccessoryViewController { base::mac::ScopedBlock<void (^)()> _view_will_appear_handler; + base::mac::ScopedBlock<void (^)()> _view_did_appear_handler; } @end @implementation ImmersiveModeTitlebarViewController -- (instancetype)initWithViewWillAppearHandler:(void (^)())handler { +- (instancetype)initWithHandlers:(void (^)())viewWillAppearHandle + viewDidAppearHandle:(void (^)())viewDidAppearHandle { if ((self = [super init])) { - _view_will_appear_handler.reset([handler copy]); + _view_will_appear_handler.reset([viewWillAppearHandle copy]); + _view_did_appear_handler.reset([viewDidAppearHandle copy]); } return self; } @@ -68,6 +73,11 @@ } } +- (void)viewDidAppear { + [super viewDidAppear]; + _view_did_appear_handler.get()(); +} + @end // An NSView that will set the ImmersiveModeDelegate on the AppKit created @@ -92,10 +102,7 @@ } - (void)viewWillMoveToWindow:(NSWindow*)window { - // TODO(bur): Investigate other approaches to detecting - // NSToolbarFullScreenWindow. This is a private class and the name could - // change. - if ([window isKindOfClass:NSClassFromString(@"NSToolbarFullScreenWindow")]) { + if (views::IsNSToolbarFullScreenWindow(window)) { // This window is created by AppKit. Make sure it doesn't have a delegate so // we can use it for out own purposes. DCHECK(!window.delegate); @@ -259,10 +266,19 @@ // Create a new NSTitlebarAccessoryViewController that will host the // overlay_view_. + NSView* contentView = browser_view_->overlay_widget() + ->GetNativeWindow() + .GetNativeNSWindow() + .contentView; immersive_mode_titlebar_view_controller_.reset( [[ImmersiveModeTitlebarViewController alloc] - initWithViewWillAppearHandler:^() { + initWithHandlers:^() { SetMenuRevealed(true); + } + viewDidAppearHandle:^() { + browser_view_->overlay_widget()->SetNativeWindowProperty( + views::NativeWidgetMacNSWindowHost::kImmersiveContentNSView, + contentView); }]); // Create a NSWindow delegate that will be used to map the AppKit created
diff --git a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc index ebcbade..f19dd3b 100644 --- a/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc +++ b/chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view_browsertest.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ui/views/plugin_vm/plugin_vm_installer_view.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/files/file_util.h" #include "base/test/scoped_feature_list.h" @@ -25,6 +24,7 @@ #include "chromeos/ash/components/dbus/concierge/fake_concierge_client.h" #include "chromeos/ash/components/dbus/debug_daemon/fake_debug_daemon_client.h" #include "chromeos/ash/components/dbus/vm_plugin_dispatcher/fake_vm_plugin_dispatcher_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "components/download/public/background_service/download_metadata.h" #include "components/download/public/background_service/features.h"
diff --git a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_browsertest.cc b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_browsertest.cc index 438364ae..cc4ac75a 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_browsertest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_account_icon_container_browsertest.cc
@@ -41,7 +41,6 @@ PageActionIconType::kSaveCard); save_card_icon->SetVisible(true); save_card_icon->InstallLoadingIndicatorForTesting(); - container->Layout(); EXPECT_EQ(container->uses_highlight(), expect_highlight); EXPECT_FALSE(IsHighlighted(container));
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc index eada0fe..c518bba 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_browsertest.cc
@@ -166,8 +166,9 @@ helper()->browser_view()->toolbar_button_provider()->GetAppMenuButton(); EXPECT_EQ(menu_button->parent(), toolbar_right_container); - // Ensure we initially have abundant space. - helper()->frame_view()->SetSize(gfx::Size(1000, 1000)); + // Ensure we initially have abundant space. Set the size from the root view + // which will get propagated to the frame view. + helper()->root_view()->SetSize(gfx::Size(1000, 1000)); EXPECT_TRUE(toolbar_left_container->GetVisible()); const int original_left_container_width = toolbar_left_container->width(); @@ -188,7 +189,7 @@ // The layout should be invalidated, but since we don't have the benefit of // the compositor to immediately kick a layout off, we have to do it manually. - helper()->frame_view()->Layout(); + RunScheduledLayouts(); // The page action icons should now take up width, leaving less space on // Windows and Linux for the window title. (On Mac, the window title remains @@ -215,8 +216,9 @@ helper()->web_app_frame_toolbar()->SetSize( {new_toolbar_width, helper()->web_app_frame_toolbar()->height()}); - helper()->frame_view()->SetSize( - {new_frame_width, helper()->frame_view()->height()}); + // Set the size of the desired frame width from the root view. + helper()->root_view()->SetSize( + {new_frame_width, helper()->root_view()->height()}); // The left container (containing Back and Reload) should be hidden. EXPECT_FALSE(toolbar_left_container->GetVisible()); @@ -299,9 +301,9 @@ window_title->SetText(std::u16string(30, 't')); - // Ensure we initially have abundant space. - helper()->frame_view()->SetSize(gfx::Size(1000, 1000)); - helper()->frame_view()->Layout(); + // Ensure we initially have abundant space. Set the size from the root view + // which will get propagated to the frame view. + helper()->root_view()->SetSize(gfx::Size(1000, 1000)); EXPECT_GT(window_title->width(), 0); const int original_title_gap = toolbar_right_container->x() - toolbar_left_container->x() - @@ -310,15 +312,14 @@ // With a narrow window, we have insufficient space for the full title. const int narrow_title_gap = window_title->CalculatePreferredSize().width() * 3 / 4; - int narrow_frame_width = + int narrow_width = helper()->frame_view()->width() - original_title_gap + narrow_title_gap; #if BUILDFLAG(IS_MAC) - // Increase frame width to allow for title padding. - narrow_frame_width = base::checked_cast<int>( - std::ceil(narrow_frame_width / (1 - 2 * kTitlePaddingWidthFraction))); + // Increase width to allow for title padding. + narrow_width = base::checked_cast<int>( + std::ceil(narrow_width / (1 - 2 * kTitlePaddingWidthFraction))); #endif - helper()->frame_view()->SetSize(gfx::Size(narrow_frame_width, 1000)); - helper()->frame_view()->Layout(); + helper()->root_view()->SetSize(gfx::Size(narrow_width, 1000)); EXPECT_GT(window_title->width(), 0); EXPECT_EQ(window_title->GetTooltipHandlerForPoint(gfx::Point(0, 0)),
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc index 1175b0b..5e9e6653 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.cc
@@ -56,6 +56,7 @@ views::NonClientFrameView* frame_view = browser_view_->GetWidget()->non_client_view()->frame_view(); frame_view_ = static_cast<BrowserNonClientFrameView*>(frame_view); + root_view_ = browser_view_->GetWidget()->GetRootView(); web_app_frame_toolbar_ = frame_view_->web_app_frame_toolbar_for_testing(); DCHECK(web_app_frame_toolbar_); @@ -78,6 +79,7 @@ views::NonClientFrameView* frame_view = browser_view_->GetWidget()->non_client_view()->frame_view(); frame_view_ = static_cast<BrowserNonClientFrameView*>(frame_view); + root_view_ = browser_view_->GetWidget()->GetRootView(); web_app_frame_toolbar_ = frame_view_->web_app_frame_toolbar_for_testing(); DCHECK(web_app_frame_toolbar_);
diff --git a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h index 4727ff2..0f0c3e2 100644 --- a/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h +++ b/chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_test_helper.h
@@ -29,6 +29,10 @@ } } // namespace net +namespace views { +class View; +} // namespace views + // Mixin for setting up and launching a web app in a browser test. class WebAppFrameToolbarTestHelper { public: @@ -73,6 +77,7 @@ Browser* app_browser() { return app_browser_; } BrowserView* browser_view() { return browser_view_; } BrowserNonClientFrameView* frame_view() { return frame_view_; } + views::View* root_view() { return root_view_; } WebAppFrameToolbarView* web_app_frame_toolbar() { return web_app_frame_toolbar_; } @@ -81,6 +86,7 @@ raw_ptr<Browser> app_browser_ = nullptr; raw_ptr<BrowserView> browser_view_ = nullptr; raw_ptr<BrowserNonClientFrameView> frame_view_ = nullptr; + raw_ptr<views::View> root_view_ = nullptr; raw_ptr<WebAppFrameToolbarView> web_app_frame_toolbar_ = nullptr; GURL LoadTestPageWithDataAndGetURL(
diff --git a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc index cb9a611..2a56d0a0 100644 --- a/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc +++ b/chrome/browser/ui/views/web_apps/web_app_integration_browsertest_mac_win_linux.cc
@@ -1697,5 +1697,88 @@ helper_.CheckWindowControlsOverlay(Site::kSiteWco, IsOn::kOn); } +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_30SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutWindowed(Site::kSiteA); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); + helper_.DeletePlatformShortcut(Site::kSiteA); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_31SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallOmniboxIcon(InstallableSite::kSiteA); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); + helper_.DeletePlatformShortcut(Site::kSiteA); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_47SiteA_24_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallMenuOption(InstallableSite::kSiteA); + helper_.CheckWindowCreated(); + helper_.CheckAppInListWindowed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); + helper_.DeletePlatformShortcut(Site::kSiteA); +} + +IN_PROC_BROWSER_TEST_F( + WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_49SiteA_12SiteA_7SiteA_112SiteANotShown_74SiteA) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppWindowedShortcut(Site::kSiteA); + helper_.CheckAppInListWindowed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.CheckWindowControlsOverlayToggle(Site::kSiteA, IsShown::kNotShown); + helper_.DeletePlatformShortcut(Site::kSiteA); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_48SiteA_11SiteA_7SiteA_74SiteA) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallPolicyAppTabbedShortcut(Site::kSiteA); + helper_.CheckAppInListTabbed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.DeletePlatformShortcut(Site::kSiteA); +} + +IN_PROC_BROWSER_TEST_F(WebAppIntegrationBrowserTestMacWinLinux, + WebAppIntegration_29SiteA_11SiteA_7SiteA_74SiteA) { + // Test contents are generated by script. Please do not modify! + // See `docs/webapps/why-is-this-test-failing.md` or + // `docs/webaps/integration-testing-framework` for more info. + // Sheriffs: Disabling this test is supported. + helper_.InstallCreateShortcutTabbed(Site::kSiteA); + helper_.CheckAppInListTabbed(Site::kSiteA); + helper_.CheckPlatformShortcutAndIcon(Site::kSiteA); + helper_.DeletePlatformShortcut(Site::kSiteA); +} + } // namespace } // namespace web_app::integration_tests
diff --git a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc index 7ca163a..07a6280 100644 --- a/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc +++ b/chrome/browser/ui/webui/chromeos/login/app_downloading_screen_handler.cc
@@ -18,8 +18,7 @@ const Profile* profile = ProfileManager::GetActiveUserProfile(); const PrefService* pref_service = profile->GetPrefs(); return static_cast<int>( - pref_service->Get(arc::prefs::kArcFastAppReinstallPackages) - ->GetListDeprecated() + pref_service->GetValueList(arc::prefs::kArcFastAppReinstallPackages) .size()); }
diff --git a/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc b/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc index a43b9604..9ea8f252 100644 --- a/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc +++ b/chrome/browser/ui/webui/chromeos/login/network_state_informer.cc
@@ -35,6 +35,7 @@ return NetworkStateInformer::OFFLINE; if (network_portal_detector::GetInstance()->IsEnabled()) { + /// TODO(b/207069182): Remove this clause and rely on NetworkState. NetworkPortalDetector::CaptivePortalStatus status = network_portal_detector::GetInstance()->GetCaptivePortalStatus(); if (status == NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_UNKNOWN && @@ -59,12 +60,24 @@ if (status == NetworkPortalDetector::CAPTIVE_PORTAL_STATUS_PORTAL) return NetworkStateInformer::CAPTIVE_PORTAL; } else { - if (NetworkState::StateIsConnecting(network->connection_state())) + if (network->IsConnectingState()) return NetworkStateInformer::CONNECTING; - if (network->connection_state() == shill::kStateOnline) - return NetworkStateInformer::ONLINE; - if (network->IsCaptivePortal()) - return NetworkStateInformer::CAPTIVE_PORTAL; + if (network->IsConnectedState()) { + auto portal_state = network->GetPortalState(); + switch (portal_state) { + case NetworkState::PortalState::kUnknown: + return NetworkStateInformer::UNKNOWN; + case NetworkState::PortalState::kOnline: + return NetworkStateInformer::ONLINE; + case NetworkState::PortalState::kPortalSuspected: + case NetworkState::PortalState::kPortal: + return NetworkStateInformer::CAPTIVE_PORTAL; + case NetworkState::PortalState::kProxyAuthRequired: + return NetworkStateInformer::PROXY_AUTH_REQUIRED; + case NetworkState::PortalState::kNoInternet: + return NetworkStateInformer::CAPTIVE_PORTAL; + } + } } // If there is no connection to the internet report it as online for the
diff --git a/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc b/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc index 5dca25de..acd34bb 100644 --- a/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc +++ b/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.cc
@@ -49,7 +49,7 @@ } void DownloadInternalsUIMessageHandler::OnServiceStatusChanged( - const base::Value& service_status) { + const base::Value::Dict& service_status) { if (!IsJavascriptAllowed()) return; @@ -57,7 +57,7 @@ } void DownloadInternalsUIMessageHandler::OnServiceDownloadsAvailable( - const base::Value& service_downloads) { + const base::Value::List& service_downloads) { if (!IsJavascriptAllowed()) return; @@ -65,7 +65,7 @@ } void DownloadInternalsUIMessageHandler::OnServiceDownloadChanged( - const base::Value& service_download) { + const base::Value::Dict& service_download) { if (!IsJavascriptAllowed()) return; @@ -73,7 +73,7 @@ } void DownloadInternalsUIMessageHandler::OnServiceDownloadFailed( - const base::Value& service_download) { + const base::Value::Dict& service_download) { if (!IsJavascriptAllowed()) return; @@ -81,7 +81,7 @@ } void DownloadInternalsUIMessageHandler::OnServiceRequestMade( - const base::Value& service_request) { + const base::Value::Dict& service_request) { if (!IsJavascriptAllowed()) return;
diff --git a/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.h b/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.h index 96cec17..5723fbc 100644 --- a/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.h +++ b/chrome/browser/ui/webui/download_internals/download_internals_ui_message_handler.h
@@ -33,12 +33,14 @@ void RegisterMessages() override; // download::Logger::Observer implementation. - void OnServiceStatusChanged(const base::Value& service_status) override; + void OnServiceStatusChanged(const base::Value::Dict& service_status) override; void OnServiceDownloadsAvailable( - const base::Value& service_downloads) override; - void OnServiceDownloadChanged(const base::Value& service_download) override; - void OnServiceDownloadFailed(const base::Value& service_download) override; - void OnServiceRequestMade(const base::Value& service_request) override; + const base::Value::List& service_downloads) override; + void OnServiceDownloadChanged( + const base::Value::Dict& service_download) override; + void OnServiceDownloadFailed( + const base::Value::Dict& service_download) override; + void OnServiceRequestMade(const base::Value::Dict& service_request) override; private: // Get the current DownloadService and sub component statuses.
diff --git a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc index 4efe354..5c2b8317 100644 --- a/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc +++ b/chrome/browser/ui/webui/help/version_updater_chromeos_unittest.cc
@@ -15,7 +15,6 @@ #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/shill/shill_service_client.h" #include "components/user_manager/scoped_user_manager.h" #include "content/public/test/browser_task_environment.h" @@ -60,7 +59,6 @@ ~VersionUpdaterCrosTest() override {} void SetUp() override { - DBusThreadManager::Initialize(); fake_update_engine_client_ = ash::UpdateEngineClient::InitializeFakeForTest(); @@ -98,7 +96,6 @@ network_handler_test_helper_.reset(); version_updater_.reset(); ash::UpdateEngineClient::Shutdown(); - DBusThreadManager::Shutdown(); } content::BrowserTaskEnvironment task_environment_;
diff --git a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc index 4d6618c8..4e549a4 100644 --- a/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc +++ b/chrome/browser/ui/webui/management/management_ui_handler_unittest.cc
@@ -42,7 +42,6 @@ #include "ui/base/l10n/l10n_util.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "base/test/test_simple_task_runner.h" #include "base/time/time.h" #include "chrome/browser/ash/crostini/crostini_features.h" @@ -63,12 +62,12 @@ #include "chrome/browser/prefs/browser_prefs.h" #include "chrome/test/base/testing_browser_process.h" #include "chrome/test/base/testing_profile_manager.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "chromeos/ash/components/network/network_handler_test_helper.h" #include "chromeos/ash/components/network/network_metadata_store.h" #include "chromeos/ash/components/network/network_state_handler.h" #include "chromeos/ash/components/network/proxy/proxy_config_handler.h" #include "chromeos/ash/components/network/proxy/ui_proxy_config_service.h" -#include "chromeos/dbus/dbus_thread_manager.h" // nogncheck #include "chromeos/dbus/power/power_manager_client.h" #include "chromeos/dbus/shill/shill_service_client.h" #include "chromeos/system/fake_statistics_provider.h" @@ -386,9 +385,6 @@ crostini_features_ = std::make_unique<crostini::FakeCrostiniFeatures>(); SetUpConnectManager(); - // DBusThreadManager::Initialize() has to be called before creating - // NetworkHandlerTestHelper. - chromeos::DBusThreadManager::Initialize(); network_handler_test_helper_ = std::make_unique<ash::NetworkHandlerTestHelper>(); chromeos::NetworkMetadataStore::RegisterPrefs(user_prefs_.registry()); @@ -401,7 +397,6 @@ void TearDown() override { network_handler_test_helper_.reset(); profile_.reset(); - chromeos::DBusThreadManager::Shutdown(); TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr); DeviceSettingsTestBase::TearDown(); }
diff --git a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc index 84dae52a4..ea8dc976 100644 --- a/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc +++ b/chrome/browser/ui/webui/new_tab_page/new_tab_page_handler.cc
@@ -705,9 +705,9 @@ // If the module visibility is managed by policy we either disable all modules // (if invisible) or no modules (if visible). if (!profile_->GetPrefs()->IsManagedPreference(prefs::kNtpModulesVisible)) { - const auto* module_ids_value = - profile_->GetPrefs()->GetList(prefs::kNtpDisabledModules); - for (const auto& id : module_ids_value->GetListDeprecated()) { + const auto& module_ids_value = + profile_->GetPrefs()->GetValueList(prefs::kNtpDisabledModules); + for (const auto& id : module_ids_value) { module_ids.push_back(id.GetString()); } } @@ -738,9 +738,9 @@ // First, apply order as set by the last drag&drop interaction. if (base::FeatureList::IsEnabled(ntp_features::kNtpModulesDragAndDrop)) { - const auto* module_ids_value = - profile_->GetPrefs()->GetList(prefs::kNtpModulesOrder); - for (const auto& id : module_ids_value->GetListDeprecated()) { + const auto& module_ids_value = + profile_->GetPrefs()->GetValueList(prefs::kNtpModulesOrder); + for (const auto& id : module_ids_value) { module_ids.push_back(id.GetString()); } }
diff --git a/chrome/browser/ui/webui/settings/about_handler_unittest.cc b/chrome/browser/ui/webui/settings/about_handler_unittest.cc index 3d1ab9f..4c9ad91 100644 --- a/chrome/browser/ui/webui/settings/about_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/about_handler_unittest.cc
@@ -10,7 +10,6 @@ #include "chromeos/ash/components/dbus/concierge/concierge_client.h" #include "chromeos/ash/components/dbus/update_engine/fake_update_engine_client.h" #include "chromeos/ash/components/dbus/update_engine/update_engine_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_web_ui.h" #include "testing/gtest/include/gtest/gtest.h" @@ -40,7 +39,6 @@ AboutHandlerTest& operator=(const AboutHandlerTest&) = delete; void SetUp() override { - DBusThreadManager::Initialize(); fake_update_engine_client_ = ash::UpdateEngineClient::InitializeFakeForTest(); ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr); @@ -59,7 +57,6 @@ TestingBrowserProcess::GetGlobal()->SetLocalState(nullptr); ConciergeClient::Shutdown(); ash::UpdateEngineClient::Shutdown(); - DBusThreadManager::Shutdown(); } const content::TestWebUI::CallData& CallDataAtIndex(size_t index) {
diff --git a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc index 261e8fe..234f5ae 100644 --- a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.cc
@@ -243,28 +243,27 @@ namespace { -base::Value CrostiniDiskInfoToValue( +base::Value::Dict CrostiniDiskInfoToValue( std::unique_ptr<crostini::CrostiniDiskInfo> disk_info) { - base::Value disk_value(base::Value::Type::DICTIONARY); + base::Value::Dict disk_value; if (!disk_info) { - disk_value.SetBoolKey("succeeded", false); + disk_value.Set("succeeded", false); return disk_value; } - disk_value.SetBoolKey("succeeded", true); - disk_value.SetBoolKey("canResize", disk_info->can_resize); - disk_value.SetBoolKey("isUserChosenSize", disk_info->is_user_chosen_size); - disk_value.SetBoolKey("isLowSpaceAvailable", - disk_info->is_low_space_available); - disk_value.SetIntKey("defaultIndex", disk_info->default_index); - base::Value ticks(base::Value::Type::LIST); + disk_value.Set("succeeded", true); + disk_value.Set("canResize", disk_info->can_resize); + disk_value.Set("isUserChosenSize", disk_info->is_user_chosen_size); + disk_value.Set("isLowSpaceAvailable", disk_info->is_low_space_available); + disk_value.Set("defaultIndex", disk_info->default_index); + base::Value::List ticks; for (const auto& tick : disk_info->ticks) { - base::Value t(base::Value::Type::DICTIONARY); - t.SetDoubleKey("value", static_cast<double>(tick->value)); - t.SetStringKey("ariaValue", tick->aria_value); - t.SetStringKey("label", tick->label); + base::Value::Dict t; + t.Set("value", static_cast<double>(tick->value)); + t.Set("ariaValue", tick->aria_value); + t.Set("label", tick->label); ticks.Append(std::move(t)); } - disk_value.SetKey("ticks", std::move(ticks)); + disk_value.Set("ticks", std::move(ticks)); return disk_value; } } // namespace @@ -479,7 +478,8 @@ OnContainerOsReleaseChanged(crostini::DefaultContainerId(), can_upgrade); } -void CrostiniHandler::OnActivePortsChanged(const base::ListValue& activePorts) { +void CrostiniHandler::OnActivePortsChanged( + const base::Value::List& activePorts) { // Other side listens with cr.addWebUIListener FireWebUIListener("crostini-port-forwarder-active-ports-changed", activePorts); @@ -781,8 +781,7 @@ container_info_list.Append(std::move(container_info_value)); } - FireWebUIListener("crostini-container-info", - base::Value(std::move(container_info_list))); + FireWebUIListener("crostini-container-info", container_info_list); } void CrostiniHandler::HandleSetContainerBadgeColor(
diff --git a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h index a8fb943..101c11fb 100644 --- a/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h +++ b/chrome/browser/ui/webui/settings/chromeos/crostini_handler.h
@@ -102,7 +102,7 @@ // Handles a request for removing all ports. void HandleRemoveAllCrostiniPortForwards(const base::Value::List& args); // CrostiniPortForwarder::Observer. - void OnActivePortsChanged(const base::ListValue& activePorts) override; + void OnActivePortsChanged(const base::Value::List& activePorts) override; // Handles a request for activating an existing port. void HandleActivateCrostiniPortForward(const base::Value::List& args); // Handles a request for deactivating an existing port.
diff --git a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc index d9b6747..f8673e6 100644 --- a/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/cups_printers_handler_unittest.cc
@@ -20,7 +20,6 @@ #include "chrome/test/base/testing_profile.h" #include "chromeos/ash/components/dbus/concierge/concierge_client.h" #include "chromeos/ash/components/dbus/debug_daemon/debug_daemon_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_web_ui.h" #include "testing/gtest/include/gtest/gtest.h" @@ -196,7 +195,6 @@ }; TEST_F(CupsPrintersHandlerTest, RemoveCorrectPrinter) { - DBusThreadManager::Initialize(); ConciergeClient::InitializeFake( /*fake_cicerone_client=*/nullptr); DebugDaemonClient::InitializeFake(); @@ -228,7 +226,6 @@ profile_.reset(); DebugDaemonClient::Shutdown(); ConciergeClient::Shutdown(); - DBusThreadManager::Shutdown(); } TEST_F(CupsPrintersHandlerTest, VerifyOnlyPpdFilesAllowed) {
diff --git a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc index 606cf86f..65b003e3 100644 --- a/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/device_storage_handler_unittest.cc
@@ -28,7 +28,6 @@ #include "chrome/test/base/testing_profile_manager.h" #include "chromeos/ash/components/dbus/concierge/concierge_client.h" #include "chromeos/ash/components/dbus/spaced/spaced_client.h" -#include "chromeos/dbus/dbus_thread_manager.h" #include "content/public/browser/web_ui_data_source.h" #include "content/public/test/browser_task_environment.h" #include "content/public/test/test_web_ui.h" @@ -62,10 +61,6 @@ ~StorageHandlerTest() override = default; void SetUp() override { - // Need to initialize DBusThreadManager before ArcSessionManager's - // constructor calls DBusThreadManager::Get(). - chromeos::DBusThreadManager::Initialize(); - // Initialize fake DBus clients. ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr); chromeos::SpacedClient::InitializeFake(); @@ -140,7 +135,6 @@ storage::ExternalMountPoints::GetSystemInstance()->RevokeAllFileSystems(); chromeos::SpacedClient::Shutdown(); ConciergeClient::Shutdown(); - chromeos::DBusThreadManager::Shutdown(); } protected:
diff --git a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc index 6ce342c7..3030a6b5 100644 --- a/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/kerberos_accounts_handler.cc
@@ -131,7 +131,7 @@ // Kerberos default configuration. html_source->AddString( "defaultKerberosConfig", - chromeos::KerberosCredentialsManager::GetDefaultKerberosConfig()); + local_state->GetString(::prefs::kKerberosDefaultConfiguration)); } // Adds load time strings to Kerberos Accounts page.
diff --git a/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc b/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc index 01ca9f23..8f68ac7 100644 --- a/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc +++ b/chrome/browser/ui/webui/settings/chromeos/os_settings_manager_unittest.cc
@@ -31,6 +31,7 @@ #include "chromeos/ash/components/local_search_service/search_metrics_reporter.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/accessibility/accessibility_features.h" namespace chromeos { namespace settings { @@ -45,6 +46,9 @@ // testing::Test: void SetUp() override { + scoped_feature_list_.InitWithFeatures( + {features::kAccessibilityOSSettingsVisibility}, {}); + ASSERT_TRUE(profile_manager_.SetUp()); TestingProfile* profile = profile_manager_.CreateTestingProfile("TestingProfile"); @@ -78,6 +82,7 @@ std::make_unique<local_search_service::LocalSearchServiceProxy>( /*for_testing=*/true); std::unique_ptr<OsSettingsManager> manager_; + base::test::ScopedFeatureList scoped_feature_list_; }; TEST_F(OsSettingsManagerTest, Initialization) {
diff --git a/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc b/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc index bb7bab0..9a19da01 100644 --- a/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/peripheral_data_access_handler.cc
@@ -9,7 +9,6 @@ #include "ash/components/peripheral_notification/peripheral_notification_manager.h" #include "ash/components/settings/cros_settings_names.h" -#include "ash/components/tpm/install_attributes.h" #include "ash/constants/ash_pref_names.h" #include "base/bind.h" #include "base/callback_helpers.h" @@ -21,6 +20,7 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/webui/settings/chromeos/os_settings_features_util.h" #include "chromeos/ash/components/dbus/pciguard/pciguard_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "components/prefs/pref_service.h" #include "content/public/browser/browser_thread.h"
diff --git a/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc b/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc index d167caf..f5492f0 100644 --- a/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc +++ b/chrome/browser/ui/webui/settings/chromeos/switch_access_handler.cc
@@ -185,9 +185,9 @@ }); for (const AssignmentInfo& info : *kAssignmentInfo) { - auto* keycodes = prefs_->GetDictionary(info.pref_name); + const auto& keycodes = prefs_->GetValueDict(info.pref_name); base::Value::List keys; - for (const auto item : keycodes->DictItems()) { + for (const auto item : keycodes) { int key_code; if (!base::StringToInt(item.first, &key_code)) { NOTREACHED();
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index 59fc4590..eab4779 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -785,14 +785,14 @@ Profile* profile = Profile::FromWebUI(web_ui); PrefService* prefs = profile->GetPrefs(); - const base::Value* policy_urls = - prefs->GetList(type == ContentSettingsType::MEDIASTREAM_MIC - ? prefs::kAudioCaptureAllowedUrls - : prefs::kVideoCaptureAllowedUrls); + const base::Value::List& policy_urls = + prefs->GetValueList(type == ContentSettingsType::MEDIASTREAM_MIC + ? prefs::kAudioCaptureAllowedUrls + : prefs::kVideoCaptureAllowedUrls); // Convert the URLs to |ContentSettingsPattern|s. Ignore any invalid ones. std::vector<ContentSettingsPattern> patterns; - for (const auto& entry : policy_urls->GetListDeprecated()) { + for (const auto& entry : policy_urls) { const std::string* url = entry.GetIfString(); if (!url) continue;
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.cc index 4d2c8f5..8f817616 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.cc +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.cc
@@ -151,17 +151,6 @@ const int tab_index_; }; -bool IsSortedAndContiguous(base::span<const int> sequence) { - if (sequence.size() < 2) - return true; - - if (!std::is_sorted(sequence.begin(), sequence.end())) - return false; - - return sequence.back() == - sequence.front() + static_cast<int>(sequence.size()) - 1; -} - } // namespace TabStripPageHandler::~TabStripPageHandler() { @@ -281,6 +270,14 @@ if (tab_strip_model->empty()) return; + // The context menu model is created when the menu is first shown. However, if + // the tab strip model changes, the context menu model may not longer reflect + // the current state of the tab strip. Actions then taken from the context + // menu may leave the tab strip in an inconsistent state, or result in DCHECK + // crashes. To ensure this does not occur close the context menu on a tab + // strip model change. + embedder_->CloseContextMenu(); + switch (change.type()) { case TabStripModelChange::kInserted: { for (const auto& contents : change.GetInsert()->contents) { @@ -297,32 +294,6 @@ } case TabStripModelChange::kMoved: { auto* move = change.GetMove(); - - absl::optional<tab_groups::TabGroupId> tab_group_id = - tab_strip_model->GetTabGroupForTab(move->to_index); - if (tab_group_id.has_value()) { - const gfx::Range tabs_in_group = tab_strip_model->group_model() - ->GetTabGroup(tab_group_id.value()) - ->ListTabs(); - - const ui::ListSelectionModel::SelectedIndices& sel = - selection.new_model.selected_indices(); - const auto& selected_tabs = std::vector<int>(sel.begin(), sel.end()); - const bool all_tabs_in_group = - IsSortedAndContiguous(base::make_span(selected_tabs)) && - selected_tabs.front() == static_cast<int>(tabs_in_group.start()) && - selected_tabs.size() == tabs_in_group.length(); - - if (all_tabs_in_group) { - // If the selection includes all the tabs within the changed tab's - // group, it is an indication that the entire group is being moved. - // To prevent sending multiple events for each tab in the group, - // ignore these tabs moving as entire group moves will be handled by - // TabGroupChange::kMoved. - break; - } - } - page_->TabMoved(extensions::ExtensionTabUtil::GetTabId(move->contents), move->to_index, tab_strip_model->IsTabPinned(move->to_index));
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.h b/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.h index 1c725b7..01b3622 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.h +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler.h
@@ -79,6 +79,7 @@ FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveGroup); FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveGroupAcrossProfiles); FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveGroupAcrossWindows); + FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveGroupMultipleTabs); FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveTab); FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveTabAcrossProfiles); FRIEND_TEST_ALL_PREFIXES(TabStripPageHandlerTest, MoveTabAcrossWindows);
diff --git a/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc b/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc index d896e1e..31c9d9b 100644 --- a/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc
@@ -32,6 +32,7 @@ using testing::_; using testing::AtLeast; +using testing::InSequence; using testing::Truly; namespace { @@ -268,23 +269,82 @@ TEST_F(TabStripPageHandlerTest, MoveGroup) { AddTab(browser(), GURL("http://foo/1")); AddTab(browser(), GURL("http://foo/2")); - tab_groups::TabGroupId group_id = - browser()->tab_strip_model()->AddToNewGroup({0}); + + auto* tab_strip_model = browser()->tab_strip_model(); + const int moved_tab_id = extensions::ExtensionTabUtil::GetTabId( + tab_strip_model->GetWebContentsAt(0)); + tab_groups::TabGroupId group_id = tab_strip_model->AddToNewGroup({0}); web_ui()->ClearTrackedCalls(); // Move the group to index 1. - int new_index = 1; - handler()->MoveGroup(group_id.ToString(), new_index); + constexpr int kMoveIndex = 1; + handler()->MoveGroup(group_id.ToString(), kMoveIndex); - gfx::Range tabs_in_group = browser() - ->tab_strip_model() - ->group_model() - ->GetTabGroup(group_id) - ->ListTabs(); - ASSERT_EQ(new_index, static_cast<int>(tabs_in_group.start())); - ASSERT_EQ(new_index, static_cast<int>(tabs_in_group.end()) - 1); + gfx::Range tabs_in_group = + tab_strip_model->group_model()->GetTabGroup(group_id)->ListTabs(); + ASSERT_EQ(kMoveIndex, static_cast<int>(tabs_in_group.start())); + ASSERT_EQ(kMoveIndex, static_cast<int>(tabs_in_group.end()) - 1); - EXPECT_CALL(page_, TabGroupMoved(group_id.ToString(), new_index)); + EXPECT_CALL(page_, TabMoved(moved_tab_id, kMoveIndex, false)); + EXPECT_CALL(page_, TabGroupMoved(group_id.ToString(), kMoveIndex)); +} + +class MockTabStripModelObserver : public TabStripModelObserver { + public: + MOCK_METHOD(void, + OnTabStripModelChanged, + (TabStripModel*, + const TabStripModelChange&, + const TabStripSelectionChange&), + (override)); + MOCK_METHOD(void, OnTabGroupChanged, (const TabGroupChange&), (override)); +}; + +// Tests the event order from a multi-tab group move. The WebUI event handling +// implementation relies on this order of events. If it ever changes the WebUI +// implementation should also change. +TEST_F(TabStripPageHandlerTest, ValidateTabGroupEventStream) { + MockTabStripModelObserver mock_observer_; + auto* tab_strip_model = browser()->tab_strip_model(); + tab_strip_model->AddObserver(&mock_observer_); + + AddTab(browser(), GURL("http://foo/1")); + AddTab(browser(), GURL("http://foo/2")); + AddTab(browser(), GURL("http://foo/3")); + AddTab(browser(), GURL("http://foo/4")); + AddTab(browser(), GURL("http://foo/5")); + + // Group tabs {0, 1, 2} together. + std::vector<int> tab_group_indicies = {0, 1, 2}; + tab_groups::TabGroupId group_id = + tab_strip_model->AddToNewGroup(tab_group_indicies); + + // Moving tabs {0, 1, 2} to index 4 will result in the first tab in the group + // being at index 2 after the move. + constexpr int kMoveIndex = 4; + constexpr int kNewGroupStartIndex = 2; + { + InSequence s; + EXPECT_CALL(mock_observer_, + OnTabStripModelChanged( + _, Truly([&](const TabStripModelChange& change) { + auto* move = change.GetMove(); + return change.type() == TabStripModelChange::kMoved && + move->to_index == kMoveIndex; + }), + _)) + .Times(3); + EXPECT_CALL( + mock_observer_, + OnTabGroupChanged(Truly([&](const TabGroupChange& change) { + TabGroupModel* group_model = tab_strip_model->group_model(); + const int start_tab = + group_model->GetTabGroup(change.group)->ListTabs().start(); + return change.type == TabGroupChange::kMoved && + change.group == group_id && start_tab == kNewGroupStartIndex; + }))); + } + tab_strip_model->MoveGroupTo(group_id, kMoveIndex); } TEST_F(TabStripPageHandlerTest, MoveGroupAcrossWindows) {
diff --git a/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc b/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc index b96659ae..e6f9e32 100644 --- a/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc +++ b/chrome/browser/ui/webui/web_app_internals/web_app_internals_source.cc
@@ -187,9 +187,10 @@ base::Value BuildExternallyManagedWebAppPrefsJson(Profile* profile) { base::Value root(base::Value::Type::DICTIONARY); - root.SetKey( - kExternallyManagedWebAppPrefs, - profile->GetPrefs()->GetDictionary(prefs::kWebAppsExtensionIDs)->Clone()); + root.SetKey(kExternallyManagedWebAppPrefs, + base::Value(profile->GetPrefs() + ->GetValueDict(prefs::kWebAppsExtensionIDs) + .Clone())); return root; } @@ -197,8 +198,8 @@ base::Value::Dict root; root.Set(kPreinstalledAppsUninstalledByUserConfigs, profile->GetPrefs() - ->GetDictionary(prefs::kUserUninstalledPreinstalledWebAppPref) - ->Clone()); + ->GetValueDict(prefs::kUserUninstalledPreinstalledWebAppPref) + .Clone()); return base::Value(std::move(root)); }
diff --git a/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc b/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc index d6b3242a..a6bb87b 100644 --- a/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc +++ b/chrome/browser/web_applications/commands/install_isolated_app_command_unittest.cc
@@ -14,11 +14,12 @@ #include "base/memory/raw_ptr.h" #include "base/strings/string_piece.h" #include "base/strings/string_piece_forward.h" +#include "base/test/gmock_callback_support.h" #include "base/test/metrics/histogram_tester.h" #include "base/test/test_future.h" -#include "chrome/browser/web_applications/test/fake_data_retriever.h" #include "chrome/browser/web_applications/test/fake_install_finalizer.h" #include "chrome/browser/web_applications/test/fake_web_app_provider.h" +#include "chrome/browser/web_applications/test/mock_data_retriever.h" #include "chrome/browser/web_applications/test/test_web_app_url_loader.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" #include "chrome/browser/web_applications/web_app_command_manager.h" @@ -34,17 +35,18 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/manifest/manifest.mojom-shared.h" -#include "third_party/skia/include/core/SkBitmap.h" -#include "third_party/skia/include/core/SkColor.h" #include "url/gurl.h" namespace web_app { namespace { +using ::base::test::IsNotNullCallback; +using ::base::test::RunOnceCallback; using ::testing::_; using ::testing::Eq; using ::testing::Field; using ::testing::IsFalse; +using ::testing::NiceMock; using ::testing::Not; using ::testing::Pair; using ::testing::UnorderedElementsAre; @@ -72,39 +74,26 @@ return std::make_unique<WebAppInstallInfo>(std::move(install_info)); } -SkBitmap CreateIcon() { - SkBitmap bitmap; - bitmap.allocN32Pixels(20, 20); - bitmap.eraseColor(SK_ColorMAGENTA); - return bitmap; -} - std::unique_ptr<WebAppInstallInfo> CreateDefaultWebAppInstallInfo() { return CreateWebAppInstallInfo( /*start_url=*/GURL{"http://test-start-url.com"}, /*manifest_id=*/"test manifest id"); } -std::unique_ptr<FakeDataRetriever> CreateDefaultDataRetriever() { - std::unique_ptr<FakeDataRetriever> fake_data_retriever = - std::make_unique<FakeDataRetriever>(); +std::unique_ptr<MockDataRetriever> CreateDefaultDataRetriever() { + std::unique_ptr<MockDataRetriever> fake_data_retriever = + std::make_unique<NiceMock<MockDataRetriever>>(); - fake_data_retriever->SetRendererWebAppInstallInfo( - CreateDefaultWebAppInstallInfo()); + ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<1>(CreateDefaultWebAppInstallInfo())); - fake_data_retriever->SetManifest( - /*manifest=*/CreateDefaultManifest(), /*is_installable=*/true, - /*manifest_url=*/CreateDefaultManifestURL()); - - fake_data_retriever->SetIconsDownloadedResult( - IconsDownloadedResult::kCompleted); - fake_data_retriever->SetIcons(std::map<GURL, std::vector<SkBitmap>>{ - {GURL{"http://test-icon-url.com/icon.png"}, std::vector{CreateIcon()}}, - }); - constexpr int kSuccessHttpStatusCode = 200; - fake_data_retriever->SetDownloadedIconsHttpResults(std::map<GURL, int>{ - {GURL{"http://test-icon-url.com/icon.png"}, kSuccessHttpStatusCode}, - }); + ON_CALL(*fake_data_retriever, + CheckInstallabilityAndRetrieveManifest(_, _, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<2>( + /*manifest=*/CreateDefaultManifest(), + /*manifest_url=*/CreateDefaultManifestURL(), + /*valid_manifest_for_web_app=*/true, + /*is_installable=*/true)); return fake_data_retriever; } @@ -257,12 +246,13 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = + std::unique_ptr<MockDataRetriever> fake_data_retriever = CreateDefaultDataRetriever(); - fake_data_retriever->SetRendererWebAppInstallInfo(CreateWebAppInstallInfo( - /*start_url=*/GURL{"http://test-start-url.com"}, - /*manifest_id=*/"test manifest id")); + ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<1>(CreateWebAppInstallInfo( + /*start_url=*/GURL{"http://test-start-url.com"}, + /*manifest_id=*/"test manifest id"))); EXPECT_THAT(ExecuteCommand("http://test-url-example.com", std::move(fake_data_retriever)), @@ -278,12 +268,13 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = + std::unique_ptr<MockDataRetriever> fake_data_retriever = CreateDefaultDataRetriever(); - fake_data_retriever->SetRendererWebAppInstallInfo(CreateWebAppInstallInfo( - /*start_url=*/GURL{"http://test-start-url.com"}, - /*manifest_id=*/"different test manifest id")); + ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<1>(CreateWebAppInstallInfo( + /*start_url=*/GURL{"http://test-start-url.com"}, + /*manifest_id=*/"different test manifest id"))); EXPECT_THAT(ExecuteCommand("http://test-url-example.com", std::move(fake_data_retriever)), @@ -304,14 +295,16 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = + std::unique_ptr<MockDataRetriever> fake_data_retriever = CreateDefaultDataRetriever(); // |nullptr| indicates an error during |GetWebAppInstallInfo|. // // See |web_app::WebAppDataRetriever::GetWebAppInstallInfoCallback| // documentation. - fake_data_retriever->SetRendererWebAppInstallInfo(nullptr); + ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) + .WillByDefault( + RunOnceCallback<1>(std::unique_ptr<WebAppInstallInfo>(nullptr))); EXPECT_THAT(ExecuteCommand("http://test-url-example.com", std::move(fake_data_retriever)), @@ -324,15 +317,17 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = - std::make_unique<FakeDataRetriever>(); + std::unique_ptr<MockDataRetriever> fake_data_retriever = + std::make_unique<NiceMock<MockDataRetriever>>(); - auto manifest = blink::mojom::Manifest::New(); - fake_data_retriever->SetManifest( - std::move(manifest), - /*is_installable=*/false, - /*manifest_url=*/ - GURL{"http://test-url-example.com/manifest.json"}); + ON_CALL(*fake_data_retriever, + CheckInstallabilityAndRetrieveManifest(_, _, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<2>( + /*manifest=*/blink::mojom::Manifest::New(), + /*manifest_url=*/ + GURL{"http://test-url-example.com/manifest.json"}, + /*valid_manifest_for_web_app=*/true, + /*is_installable=*/false)); EXPECT_THAT(ExecuteCommand("http://test-url-example.com", std::move(fake_data_retriever)), @@ -345,50 +340,22 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = - std::make_unique<FakeDataRetriever>(); + std::unique_ptr<MockDataRetriever> fake_data_retriever = + std::make_unique<NiceMock<MockDataRetriever>>(); - fake_data_retriever->SetManifest( - /*manifest=*/nullptr, - /*is_installable=*/true, - /*manifest_url=*/CreateDefaultManifestURL()); + ON_CALL(*fake_data_retriever, + CheckInstallabilityAndRetrieveManifest(_, _, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<2>( + /*manifest=*/nullptr, + /*manifest_url=*/CreateDefaultManifestURL(), + /*valid_manifest_for_web_app=*/true, + /*is_installable=*/false)); EXPECT_THAT(ExecuteCommand("http://test-url-example.com", std::move(fake_data_retriever)), Not(IsInstallationOk())); } -// TODO(kuragin): Add icon downloading functionality and fix the test. -TEST_F(InstallIsolatedAppCommandTest, - DISABLED_DownloadedIconsArePassedToInstallFinalizer) { - SetPrepareForLoadResultLoaded(); - - ExpectLoadedForURL("http://some-test-url.com"); - - std::unique_ptr<FakeDataRetriever> fake_data_retriever = - CreateDefaultDataRetriever(); - - fake_data_retriever->SetIconsDownloadedResult( - IconsDownloadedResult::kCompleted); - fake_data_retriever->SetIcons(std::map<GURL, std::vector<SkBitmap>>{ - {GURL{"http://different-test-icon-url.com/icon.png"}, - std::vector{CreateIcon()}}, - }); - constexpr int kSuccessHttpStatusCode = 200; - fake_data_retriever->SetDownloadedIconsHttpResults(std::map<GURL, int>{ - {GURL{"http://different-test-icon-url.com/icon.png"}, - kSuccessHttpStatusCode}, - }); - - EXPECT_THAT(ExecuteCommand("http://some-test-url.com", - std::move(fake_data_retriever)), - IsInstallationOk()); - - WebAppInstallInfo install_info = *install_finalizer().web_app_info(); - EXPECT_THAT(install_info.icon_bitmaps.GetBitmapsForPurpose(IconPurpose::ANY), - UnorderedElementsAre(Pair(_, _))); -} - using InstallIsolatedAppCommandMetricsTest = InstallIsolatedAppCommandTest; TEST_F(InstallIsolatedAppCommandMetricsTest, @@ -438,15 +405,17 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = - std::make_unique<FakeDataRetriever>(); + std::unique_ptr<MockDataRetriever> fake_data_retriever = + std::make_unique<NiceMock<MockDataRetriever>>(); - auto manifest = blink::mojom::Manifest::New(); - fake_data_retriever->SetManifest( - std::move(manifest), - /*is_installable=*/false, - /*manifest_url=*/ - GURL{"http://test-url-example.com/manifest.json"}); + ON_CALL(*fake_data_retriever, + CheckInstallabilityAndRetrieveManifest(_, _, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<2>( + /*manifest=*/blink::mojom::Manifest::New(), + /*manifest_url=*/ + GURL{"http://test-url-example.com/manifest.json"}, + /*valid_manifest_for_web_app=*/true, + /*is_installable=*/false)); base::HistogramTester histogram_tester; @@ -463,13 +432,16 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = - std::make_unique<FakeDataRetriever>(); + std::unique_ptr<MockDataRetriever> fake_data_retriever = + std::make_unique<NiceMock<MockDataRetriever>>(); - fake_data_retriever->SetManifest( - /*manifest=*/nullptr, - /*is_installable=*/true, - /*manifest_url=*/CreateDefaultManifestURL()); + ON_CALL(*fake_data_retriever, + CheckInstallabilityAndRetrieveManifest(_, _, IsNotNullCallback())) + .WillByDefault(RunOnceCallback<2>( + /*manifest=*/nullptr, + /*manifest_url=*/CreateDefaultManifestURL(), + /*valid_manifest_for_web_app=*/true, + /*is_installable=*/false)); base::HistogramTester histogram_tester; @@ -487,14 +459,16 @@ ExpectLoadedForURL("http://test-url-example.com"); - std::unique_ptr<FakeDataRetriever> fake_data_retriever = + std::unique_ptr<MockDataRetriever> fake_data_retriever = CreateDefaultDataRetriever(); // |nullptr| indicates an error during |GetWebAppInstallInfo|. // // See |web_app::WebAppDataRetriever::GetWebAppInstallInfoCallback| // documentation. - fake_data_retriever->SetRendererWebAppInstallInfo(nullptr); + ON_CALL(*fake_data_retriever, GetWebAppInstallInfo(_, IsNotNullCallback())) + .WillByDefault( + RunOnceCallback<1>(std::unique_ptr<WebAppInstallInfo>(nullptr))); base::HistogramTester histogram_tester;
diff --git a/chrome/browser/web_applications/test/mock_data_retriever.h b/chrome/browser/web_applications/test/mock_data_retriever.h index 0e80b8dc..4229d73 100644 --- a/chrome/browser/web_applications/test/mock_data_retriever.h +++ b/chrome/browser/web_applications/test/mock_data_retriever.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_WEB_APPLICATIONS_TEST_MOCK_DATA_RETRIEVER_H_ #define CHROME_BROWSER_WEB_APPLICATIONS_TEST_MOCK_DATA_RETRIEVER_H_ +#include "base/containers/flat_set.h" #include "chrome/browser/web_applications/web_app_data_retriever.h" #include "testing/gmock/include/gmock/gmock.h" #include "url/gurl.h"
diff --git a/chrome/browser/webshare/win/share_operation.cc b/chrome/browser/webshare/win/share_operation.cc index 1b21cc8..b6cd706 100644 --- a/chrome/browser/webshare/win/share_operation.cc +++ b/chrome/browser/webshare/win/share_operation.cc
@@ -434,7 +434,7 @@ // with the WebContents. HWND hwnd = nullptr; content::RenderWidgetHostView* host_view = - web_contents_->GetRenderWidgetHostView(); + web_contents_->GetTopLevelRenderWidgetHostView(); if (host_view) { ui::AXPlatformNode* platform_node = ui::AXPlatformNode::FromNativeViewAccessible(
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 5ebb7da..cdeebcaf 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1659700777-361cef41c1f44884c13c26d36cca9eebf56d383f.profdata +chrome-linux-main-1659722381-13479a5c89934f6ea661341ced0db071475a6676.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index fcb7a334..1b7c814 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1659700777-66a81eb1018978ad01f392e7f74c2d6422b49959.profdata +chrome-mac-arm-main-1659722381-be619584abc441f883e868bc99cc1563cda483b3.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index db19cb1e..c9f46817 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1659700777-bba15ab02f33e2a968bb402628bbb0a670470628.profdata +chrome-mac-main-1659722381-9fce1a67fb233581251f973f329ff7a33d90dbac.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index ffeb403..d087f01 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1659689676-10e03a9b000649c4006ac166aef65fac8b441d4f.profdata +chrome-win32-main-1659711517-b8f6f7be5dcbb97489eeaa43a00b9d73439a60d4.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index f973f22c..f113d944 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1659689676-fb2b7f31eca336c4919d32e839cd340e83a995de.profdata +chrome-win64-main-1659722381-5d2c9919108699318e2b1350bbee597ecb821a69.profdata
diff --git a/chrome/common/extensions/permissions/permission_set_unittest.cc b/chrome/common/extensions/permissions/permission_set_unittest.cc index 5cb7afa..66e64f3a 100644 --- a/chrome/common/extensions/permissions/permission_set_unittest.cc +++ b/chrome/common/extensions/permissions/permission_set_unittest.cc
@@ -1807,4 +1807,88 @@ permissions, permissions_dwr, extension->GetType())); } +// Exercises setting different members in the PermissionSet. Due to varying +// amounts of initialization, these can be non-trivial and have side-effects. +TEST(PermissionsTest, SettingMembers) { + URLPattern first_host(URLPattern::SCHEME_ALL, "http://first.example/*"); + URLPattern second_host(URLPattern::SCHEME_ALL, "http://second.example/*"); + URLPattern third_host(URLPattern::SCHEME_ALL, "http://third.example/*"); + URLPattern all_hosts(URLPattern::SCHEME_ALL, "<all_urls>"); + + { + // Setting explicit hosts also sets effective hosts. + PermissionSet set(APIPermissionSet(), ManifestPermissionSet(), + URLPatternSet({first_host}), + URLPatternSet({second_host})); + set.SetExplicitHosts(URLPatternSet({third_host})); + EXPECT_EQ(URLPatternSet({third_host}), set.explicit_hosts()); + EXPECT_EQ(URLPatternSet({second_host}), set.scriptable_hosts()); + EXPECT_EQ(URLPatternSet({second_host, third_host}), set.effective_hosts()); + } + + { + // Setting scriptable hosts also sets effective hosts. + PermissionSet set(APIPermissionSet(), ManifestPermissionSet(), + URLPatternSet({first_host}), + URLPatternSet({second_host})); + set.SetScriptableHosts(URLPatternSet({third_host})); + EXPECT_EQ(URLPatternSet({first_host}), set.explicit_hosts()); + EXPECT_EQ(URLPatternSet({third_host}), set.scriptable_hosts()); + EXPECT_EQ(URLPatternSet({first_host, third_host}), set.effective_hosts()); + } + + { + // Setting explicit hosts recalculates whether to warn for all URLs. + PermissionSet set(APIPermissionSet(), ManifestPermissionSet(), + URLPatternSet({first_host}), + URLPatternSet({second_host})); + EXPECT_FALSE(set.ShouldWarnAllHosts()); + set.SetExplicitHosts(URLPatternSet({all_hosts})); + EXPECT_TRUE(set.ShouldWarnAllHosts()); + } + + { + // Setting scriptable hosts recalculates whether to warn for all URLs. + PermissionSet set(APIPermissionSet(), ManifestPermissionSet(), + URLPatternSet({first_host}), + URLPatternSet({second_host})); + EXPECT_FALSE(set.ShouldWarnAllHosts()); + set.SetExplicitHosts(URLPatternSet({all_hosts})); + EXPECT_TRUE(set.ShouldWarnAllHosts()); + } + + { + // Newly-set explicit hosts have their paths set to "/*". + PermissionSet set(APIPermissionSet(), ManifestPermissionSet(), + URLPatternSet({first_host}), + URLPatternSet({second_host})); + URLPattern custom_path(URLPattern::SCHEME_ALL, "https://path.example/path"); + URLPattern cleaned_path(URLPattern::SCHEME_ALL, "https://path.example/*"); + set.SetExplicitHosts(URLPatternSet({custom_path})); + EXPECT_EQ(URLPatternSet({cleaned_path}), set.explicit_hosts()); + } + + { + // Setting API permissions recalculates whether to warn for all URLs. + APIPermissionSet apis; + apis.insert(APIPermissionID::kTab); + PermissionSet set(std::move(apis), ManifestPermissionSet(), URLPatternSet(), + URLPatternSet()); + EXPECT_FALSE(set.ShouldWarnAllHosts()); + APIPermissionSet new_apis; + new_apis.insert(APIPermissionID::kDebugger); + set.SetAPIPermissions(std::move(new_apis)); + EXPECT_TRUE(set.ShouldWarnAllHosts()); + } + + { + // Setting API permissions adds implicit permissions. + PermissionSet set; + APIPermissionSet new_apis; + new_apis.insert(APIPermissionID::kFileBrowserHandler); + set.SetAPIPermissions(std::move(new_apis)); + EXPECT_TRUE(set.HasAPIPermission(APIPermissionID::kFileBrowserHandler)); + } +} + } // namespace extensions
diff --git a/chrome/common/pref_names.cc b/chrome/common/pref_names.cc index 21d5caf..c018b45 100644 --- a/chrome/common/pref_names.cc +++ b/chrome/common/pref_names.cc
@@ -1100,6 +1100,10 @@ // username field of "Add a ticket" UI window. // Tied to KerberosDomainAutocomplete policy. const char kKerberosDomainAutocomplete[] = "kerberos.domain_autocomplete"; +// Used by KerberosAccountsHandler to prefill kerberos krb5 config for +// manually creating new tickets. +// Tied to KerberosDefaultConfiguration policy. +const char kKerberosDefaultConfiguration[] = "kerberos.default_configuration"; // A boolean pref for enabling/disabling App reinstall recommendations in Zero // State Launcher by policy.
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 7b10b8d..8b685ac 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -353,6 +353,7 @@ extern const char kKerberosAccounts[]; extern const char kKerberosActivePrincipalName[]; extern const char kKerberosDomainAutocomplete[]; +extern const char kKerberosDefaultConfiguration[]; extern const char kAppReinstallRecommendationEnabled[]; extern const char kStartupBrowserWindowLaunchSuppressed[]; extern const char kLoginExtensionApiDataForNextLoginAttempt[];
diff --git a/chrome/credential_provider/build/make_setup.py b/chrome/credential_provider/build/make_setup.py index 2da6b280..f73f7fd 100755 --- a/chrome/credential_provider/build/make_setup.py +++ b/chrome/credential_provider/build/make_setup.py
@@ -58,8 +58,11 @@ Returns: The executable command to run the 7zip compressor. """ - return (os.path.join(src_path, r'third_party\lzma_sdk\bin\7zr.exe') - if sys.platform == 'win32' else '7zr') + if sys.platform == 'win32': + return os.path.join(src_path, r'third_party\lzma_sdk\bin\win64\7zr.exe') + if sys.platform == 'darwin': + return os.path.join(src_path, r'third_party\lzma_sdk\bin\mac64\7zz') + return '7zr' def GetCmdLine(command, sz_fn, gcp_7z_fn): """Builds the command line for the given archive.
diff --git a/chrome/installer/mac/BUILD.gn b/chrome/installer/mac/BUILD.gn index 972ff213..3fdf2271b 100644 --- a/chrome/installer/mac/BUILD.gn +++ b/chrome/installer/mac/BUILD.gn
@@ -114,13 +114,9 @@ "//chrome/app/theme/google_chrome/mac/document_canary.icns", "//chrome/app/theme/google_chrome/mac/document_dev.icns", "internal/Google_Chrome.765bb3620a0f7a33500da39b20122b1cec41140f.provisionprofile", - "internal/Google_Chrome.c9a99324ca3fcb23dbcc36bd5fd4f9753305130a.provisionprofile", "internal/Google_Chrome_Beta.765bb3620a0f7a33500da39b20122b1cec41140f.provisionprofile", - "internal/Google_Chrome_Beta.c9a99324ca3fcb23dbcc36bd5fd4f9753305130a.provisionprofile", "internal/Google_Chrome_Canary.765bb3620a0f7a33500da39b20122b1cec41140f.provisionprofile", - "internal/Google_Chrome_Canary.c9a99324ca3fcb23dbcc36bd5fd4f9753305130a.provisionprofile", "internal/Google_Chrome_Dev.765bb3620a0f7a33500da39b20122b1cec41140f.provisionprofile", - "internal/Google_Chrome_Dev.c9a99324ca3fcb23dbcc36bd5fd4f9753305130a.provisionprofile", "internal/chrome_beta_dmg_dsstore", "internal/chrome_beta_dmg_icon.icns", "internal/chrome_canary_dmg_dsstore",
diff --git a/chrome/installer/mini_installer/BUILD.gn b/chrome/installer/mini_installer/BUILD.gn index d7ac881..7edb8b094 100644 --- a/chrome/installer/mini_installer/BUILD.gn +++ b/chrome/installer/mini_installer/BUILD.gn
@@ -317,7 +317,7 @@ "--out", "$target_name.exe", "--path_7za", - "../../third_party/lzma_sdk/bin", + "../../third_party/lzma_sdk/bin/win64", ] deps = [ ":mini_installer",
diff --git a/chrome/installer/test/alternate_version_generator.cc b/chrome/installer/test/alternate_version_generator.cc index 4f9c33a18..f1c3a05 100644 --- a/chrome/installer/test/alternate_version_generator.cc +++ b/chrome/installer/test/alternate_version_generator.cc
@@ -59,7 +59,7 @@ namespace { const wchar_t k7zaExe[] = L"7za.exe"; -const wchar_t k7zaPathRelative[] = L"..\\..\\third_party\\lzma_sdk\\bin"; +const wchar_t k7zaPathRelative[] = L"..\\..\\third_party\\lzma_sdk\\bin\\win64"; const wchar_t kB7[] = L"B7"; const wchar_t kBl[] = L"BL"; const wchar_t kChromeBin[] = L"Chrome-bin";
diff --git a/chrome/renderer/BUILD.gn b/chrome/renderer/BUILD.gn index f4d1346e..de222ff 100644 --- a/chrome/renderer/BUILD.gn +++ b/chrome/renderer/BUILD.gn
@@ -228,7 +228,14 @@ } } - # TODO(crbug.com/1306610): Split out files that only need `enable_plugins`. + if (enable_plugins) { + sources += [ + "plugins/chrome_plugin_placeholder.cc", + "plugins/chrome_plugin_placeholder.h", + ] + deps += [ "//components/strings" ] + } + if (enable_ppapi) { sources += [ "pepper/chrome_renderer_pepper_host_factory.cc", @@ -239,11 +246,8 @@ "pepper/pepper_shared_memory_message_filter.h", "pepper/pepper_uma_host.cc", "pepper/pepper_uma_host.h", - "plugins/chrome_plugin_placeholder.cc", - "plugins/chrome_plugin_placeholder.h", ] deps += [ - "//components/strings", "//media:media_buildflags", "//ppapi/host", "//ppapi/proxy",
diff --git a/chrome/renderer/media/chrome_key_systems.cc b/chrome/renderer/media/chrome_key_systems.cc index 732260f..30da015 100644 --- a/chrome/renderer/media/chrome_key_systems.cc +++ b/chrome/renderer/media/chrome_key_systems.cc
@@ -46,7 +46,7 @@ #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) || BUILDFLAG(IS_WIN) using media::CdmSessionType; -using media::EmeConfigRule; +using media::EmeConfig; using media::EmeFeatureSupport; using media::KeySystemProperties; using media::KeySystemPropertiesVector;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index e247f630..2487080 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -554,13 +554,13 @@ "//ash/components/account_manager", "//ash/components/settings", "//ash/components/tpm", - "//ash/components/tpm:test_support", "//ash/constants", "//ash/public/cpp:test_support", "//chrome/browser/ash", "//chrome/browser/ash/system_web_apps", "//chromeos/ash/components/dbus/session_manager", "//chromeos/ash/components/dbus/userdataauth", + "//chromeos/ash/components/install_attributes:test_support", "//chromeos/dbus/tpm_manager", "//chromeos/login/login_state", "//components/exo", @@ -3600,6 +3600,7 @@ "../browser/ash/file_manager/file_tasks_browsertest.cc", "../browser/ash/file_manager/image_loader_jstest.cc", "../browser/ash/file_manager/open_with_browser_browsertest.cc", + "../browser/ash/first_party_sets/first_party_sets_policy_initialization_browsertest.cc", "../browser/ash/guest_os/guest_os_registry_service_icon_browsertest.cc", "../browser/ash/input_method/input_method_engine_browsertests.cc", "../browser/ash/input_method/native_input_method_engine_with_ime_service_browsertest.cc", @@ -8358,10 +8359,13 @@ "../browser/plugins/plugin_installer_unittest.cc", "../browser/plugins/plugin_metadata_unittest.cc", "../browser/plugins/plugin_prefs_unittest.cc", - "../common/pepper_permission_util_unittest.cc", ] } + if (enable_ppapi) { + sources += [ "../common/pepper_permission_util_unittest.cc" ] + } + if (enable_basic_printing) { sources += [ "../browser/policy/printing_restrictions_policy_handler_unittest.cc",
diff --git a/chrome/test/base/browser_with_test_window_test.h b/chrome/test/base/browser_with_test_window_test.h index 8ab412ca..e5ac52e3 100644 --- a/chrome/test/base/browser_with_test_window_test.h +++ b/chrome/test/base/browser_with_test_window_test.h
@@ -23,10 +23,10 @@ #include "chrome/test/views/chrome_test_views_delegate.h" #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" #include "ash/test/ash_test_helper.h" #include "ash/test/ash_test_views_delegate.h" #include "chrome/browser/ash/settings/scoped_cros_settings_test_helper.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #else #include "ui/views/test/scoped_views_test_helper.h" #endif
diff --git a/chrome/test/data/policy/policy_test_cases.json b/chrome/test/data/policy/policy_test_cases.json index 2ef7b7d..fde492a 100644 --- a/chrome/test/data/policy/policy_test_cases.json +++ b/chrome/test/data/policy/policy_test_cases.json
@@ -3071,6 +3071,33 @@ } ] }, + "KerberosDefaultConfiguration": { + "os": [ + "chromeos_ash" + ], + "policy_pref_mapping_tests": [ + { + "policies": {}, + "prefs": { + "kerberos.default_configuration": { + "default_value": "[libdefaults]\n default_tgs_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96\n default_tkt_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96\n permitted_enctypes = aes256-cts-hmac-sha1-96 aes128-cts-hmac-sha1-96\n forwardable = true\n", + "location": "local_state" + } + } + }, + { + "policies": { + "KerberosDefaultConfiguration": "custom-config" + }, + "prefs": { + "kerberos.default_configuration": { + "value": "custom-config", + "location": "local_state" + } + } + } + ] + }, "PromptForDownloadLocation": { "os": [ "win",
diff --git a/chrome/test/data/webui/BUILD.gn b/chrome/test/data/webui/BUILD.gn index 908c790..b207e02c 100644 --- a/chrome/test/data/webui/BUILD.gn +++ b/chrome/test/data/webui/BUILD.gn
@@ -39,6 +39,10 @@ sources += [ "signin/local_profile_customization_interactive_ui_test.js" ] } + if (enable_webui_tab_strip) { + sources += [ "tab_strip/tab_strip_interactive_ui_tests.js" ] + } + gen_include_files = [ "polymer_browser_test_base.js", "polymer_interactive_ui_test.js",
diff --git a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js index a81428b9..66eb111 100644 --- a/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js +++ b/chrome/test/data/webui/chromeos/os_feedback_ui/share_data_page_test.js
@@ -147,7 +147,7 @@ const screenshotCheckbox = getElement('#screenshotCheckbox'); assertTrue(!!screenshotCheckbox); assertTrue(page.i18nExists('attachScreenshotCheckboxAriaLabel')); - assertEquals('Attach screenshot', screenshotCheckbox.ariaLabel); + assertEquals('Attach screenshot', screenshotCheckbox.ariaDescription); assertTrue(page.i18nExists('attachScreenshotLabel')); assertEquals('Screenshot', getElementContent('#screenshotCheckLabel'));
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js index 61436b9..bf64d5e 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_v3_browsertest.js
@@ -14,6 +14,7 @@ GEN('#include "chrome/common/chrome_features.h"'); GEN('#include "components/app_restore/features.h"'); GEN('#include "content/public/test/browser_test.h"'); +GEN('#include "ui/accessibility/accessibility_features.h"'); /* eslint-disable no-var */ @@ -207,11 +208,9 @@ } }; -TEST_F( - 'OSSettingsOsBluetoothSavedDevicesListV3Test', 'DISABLED_AllJsTests', - () => { - mocha.run(); - }); +TEST_F('OSSettingsOsBluetoothSavedDevicesListV3Test', 'AllJsTests', () => { + mocha.run(); +}); var OSSettingsSearchEngineV3Test = class extends OSSettingsV3BrowserTest { /** @override */ @@ -464,7 +463,9 @@ ['SwitchAccessSetupGuideDialog', 'switch_access_setup_guide_dialog_test.js'], ['SwitchAccessSubpage', 'switch_access_subpage_tests.js'], ['TetherConnectionDialog', 'tether_connection_dialog_test.js'], - ['TextToSpeechPage', 'text_to_speech_page_tests.js'], + ['TextToSpeechPage', 'text_to_speech_page_tests.js', + {enabled: ['features::kAccessibilityOSSettingsVisibility']}, + ], ['TextToSpeechSubpage', 'text_to_speech_subpage_tests.js'], ['TimezoneSelector', 'timezone_selector_test.js'], ['TimezoneSubpage', 'timezone_subpage_test.js'],
diff --git a/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js b/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js index ec45344..9b2ca39 100644 --- a/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js +++ b/chrome/test/data/webui/tab_strip/tab_strip_browsertest.js
@@ -20,11 +20,6 @@ } }; -// TODO(https://crbug.com/1247687): flakily times out. -TEST_F('TabStripTabListTest', 'DISABLED_All', function() { - mocha.run(); -}); - var TabStripTabTest = class extends TabStripBrowserTest { get browsePreload() { return 'chrome://tab-strip.top-chrome/test_loader.html?module=tab_strip/tab_test.js';
diff --git a/chrome/test/data/webui/tab_strip/tab_strip_interactive_ui_tests.js b/chrome/test/data/webui/tab_strip/tab_strip_interactive_ui_tests.js new file mode 100644 index 0000000..96412b6e --- /dev/null +++ b/chrome/test/data/webui/tab_strip/tab_strip_interactive_ui_tests.js
@@ -0,0 +1,27 @@ +// 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. + +GEN_INCLUDE(['//chrome/test/data/webui/polymer_interactive_ui_test.js']); + +GEN('#include "content/public/test/browser_test.h"'); + +var TabStripInteractiveUITest = class extends PolymerInteractiveUITest { + get isAsync() { + return true; + } + + get webuiHost() { + return 'tab-strip.top-chrome'; + } +}; + +var TabStripTabListTest = class extends TabStripInteractiveUITest { + get browsePreload() { + return 'chrome://tab-strip.top-chrome/test_loader.html?module=tab_strip/tab_list_test.js'; + } +}; + +TEST_F('TabStripTabListTest', 'All', function() { + mocha.run(); +});
diff --git a/chrome/test/webapps/coverage/coverage_cros.tsv b/chrome/test/webapps/coverage/coverage_cros.tsv index 90797f16..d8f6a53 100644 --- a/chrome/test/webapps/coverage/coverage_cros.tsv +++ b/chrome/test/webapps/coverage/coverage_cros.tsv
@@ -205,7 +205,7 @@ install_menu_option_SiteA🌕 launch_from_chrome_apps_SiteA🌓 check_window_display_standalone🌕 install_menu_option_SiteA🌕 launch_from_platform_shortcut_SiteA🌑 check_window_display_standalone🌑 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 install_create_shortcut_tabbed_SiteA🌕 set_open_in_window_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_policy_app_tabbed_shortcut_SiteA🌓 set_open_in_window_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 @@ -288,14 +288,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕
diff --git a/chrome/test/webapps/coverage/coverage_linux.tsv b/chrome/test/webapps/coverage/coverage_linux.tsv index 85b50cc..fefb515c 100644 --- a/chrome/test/webapps/coverage/coverage_linux.tsv +++ b/chrome/test/webapps/coverage/coverage_linux.tsv
@@ -418,14 +418,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 @@ -468,7 +468,7 @@ install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 @@ -513,7 +513,7 @@ install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteC🌑 -sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +sync_turn_off🌕 install_create_shortcut_windowed_SiteA🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 sync_turn_off🌕 install_omnibox_icon_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 sync_turn_off🌕 install_menu_option_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓
diff --git a/chrome/test/webapps/coverage/coverage_mac.tsv b/chrome/test/webapps/coverage/coverage_mac.tsv index 0b182a67..31a4641 100644 --- a/chrome/test/webapps/coverage/coverage_mac.tsv +++ b/chrome/test/webapps/coverage/coverage_mac.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 53%, with partial coverage: 69% +# Full coverage: 47%, with partial coverage: 61% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -101,30 +101,30 @@ install_create_shortcut_tabbed_SiteA🌕 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 install_policy_app_tabbed_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 install_policy_app_tabbed_no_shortcut_SiteA🌓 enable_run_on_os_login_SiteA🌕 apply_run_on_os_login_policy_blocked_SiteA🌕 remove_run_on_os_login_policy_SiteA🌕 check_run_on_os_login_enabled_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 switch_profile_clients_Client1🌕 sync_turn_off🌕 uninstall_from_app_settings_SiteA🌕 switch_profile_clients_Client2🌕 apply_run_on_os_login_policy_run_windowed_SiteA🌕 check_run_on_os_login_disabled_SiteA🌕 install_locally_SiteA🌓 check_run_on_os_login_enabled_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_app_settings_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_app_settings_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_app_settings_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_app_settings_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_app_settings_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 switch_profile_clients_Client1🌑 sync_turn_off🌑 uninstall_from_app_settings_SiteA🌑 switch_profile_clients_Client2🌑 apply_run_on_os_login_policy_run_windowed_SiteA🌑 check_run_on_os_login_disabled_SiteA🌑 install_locally_SiteA🌑 check_run_on_os_login_enabled_SiteA🌑 install_create_shortcut_windowed_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_omnibox_icon_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 install_menu_option_SiteA🌕 set_app_badge_SiteA🌑 clear_app_badge_SiteA🌑 check_app_badge_empty_SiteA🌑 @@ -418,14 +418,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 @@ -442,22 +442,22 @@ install_policy_app_windowed_shortcut_SiteA🌓 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 install_menu_option_SiteA🌕 open_app_settings_from_chrome_apps_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 install_menu_option_SiteA🌕 open_app_settings_from_app_menu_SiteA🌕 check_browser_navigation_is_app_settings_SiteA🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_platform_shortcut_and_icon_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_platform_shortcut_and_icon_SiteA🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_tabbed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_shown🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 check_app_in_list_windowed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_install_icon_not_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 navigate_browser_SiteA🌕 check_launch_icon_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 check_app_in_list_windowed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_install_icon_not_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 navigate_browser_SiteA🌑 check_launch_icon_shown🌑 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_app_in_list_tabbed_SiteC🌓 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 navigate_browser_SiteC🌕 check_launch_icon_not_shown🌕 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_app_in_list_windowed_SiteC🌑 @@ -465,50 +465,50 @@ install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 navigate_browser_SiteC🌑 check_launch_icon_shown🌑 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 install_locally_SiteC🌑 check_platform_shortcut_and_icon_SiteC🌑 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 install_locally_SiteC🌓 check_platform_shortcut_and_icon_SiteC🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_menu_option_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_launch_icon_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_chrome_apps_SiteA🌑 check_window_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 install_locally_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_chrome_apps_SiteA🌓 check_tab_created🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 launch_from_platform_shortcut_SiteA🌓 check_tab_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_chrome_apps_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 check_app_not_in_list_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 uninstall_from_list_SiteA🌑 switch_profile_clients_Client1🌑 check_app_not_in_list_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 uninstall_from_list_SiteA🌕 switch_profile_clients_Client1🌕 check_app_not_in_list_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_install_icon_shown🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 navigate_browser_SiteA🌕 check_launch_icon_not_shown🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_install_icon_shown🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 navigate_browser_SiteA🌑 check_launch_icon_not_shown🌑 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 install_create_shortcut_tabbed_SiteC🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 install_create_shortcut_windowed_SiteC🌕 switch_profile_clients_Client2🌑 check_platform_shortcut_not_exists_SiteC🌑 @@ -519,27 +519,27 @@ sync_turn_off🌕 install_create_shortcut_tabbed_SiteA🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteA🌓 sync_turn_off🌕 install_create_shortcut_windowed_SiteC🌑 sync_turn_on🌑 switch_profile_clients_Client2🌑 check_app_in_list_not_locally_installed_SiteC🌑 sync_turn_off🌕 install_create_shortcut_tabbed_SiteC🌕 sync_turn_on🌕 switch_profile_clients_Client2🌕 check_app_in_list_not_locally_installed_SiteC🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_app_in_list_not_locally_installed_SiteA🌓 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_app_in_list_not_locally_installed_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 -install_menu_option_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_list_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 +install_menu_option_SiteA🌕 switch_profile_clients_Client2🌑 sync_turn_off🌑 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_list_SiteA🌕 sync_turn_on🌕 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_menu_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 switch_profile_clients_Client2🌕 sync_turn_off🌕 uninstall_from_os_SiteA🌑 sync_turn_on🌑 check_platform_shortcut_not_exists_SiteA🌑
diff --git a/chrome/test/webapps/coverage/coverage_win.tsv b/chrome/test/webapps/coverage/coverage_win.tsv index 65a377e..9eca1cc 100644 --- a/chrome/test/webapps/coverage/coverage_win.tsv +++ b/chrome/test/webapps/coverage/coverage_win.tsv
@@ -1,5 +1,5 @@ # This is a generated file. -# Full coverage: 54%, with partial coverage: 72% +# Full coverage: 55%, with partial coverage: 72% install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_menu_option_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_launch_icon_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 install_create_shortcut_windowed_SiteA🌕 manifest_update_title_SiteA🌑 accept_app_id_update_dialog🌑 close_pwa🌑 launch_from_chrome_apps_SiteA🌑 check_app_title_site_a_is_SiteAUpdated🌑 @@ -418,14 +418,14 @@ install_omnibox_icon_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_menu_option_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 install_create_shortcut_tabbed_SiteA🌕 delete_profile🌑 check_platform_shortcut_not_exists_SiteA🌑 -install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_policy_app_tabbed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 -install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_no_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 -install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌑 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_windowed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_tabbed_shortcut_SiteA🌓 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_windowed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_omnibox_icon_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_menu_option_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_create_shortcut_tabbed_SiteA🌕 delete_platform_shortcut_SiteA🌕 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_tab_created🌑 +install_policy_app_windowed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 +install_policy_app_tabbed_no_shortcut_SiteA🌓 create_shortcuts_SiteA🌑 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_create_shortcut_windowed_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_omnibox_icon_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 install_menu_option_SiteA🌕 open_in_chrome🌕 check_tab_created🌕 @@ -468,7 +468,7 @@ install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕 -install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌓 check_window_created🌕 +install_create_shortcut_windowed_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_platform_shortcut_SiteA🌑 check_window_created🌑 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_menu_option_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_launch_icon_SiteA🌕 check_window_created🌕 install_omnibox_icon_SiteA🌕 switch_profile_clients_Client2🌕 install_locally_SiteA🌓 launch_from_chrome_apps_SiteA🌓 check_window_created🌕
diff --git a/chrome/test/webapps/data/actions.md b/chrome/test/webapps/data/actions.md index 3a6e35d..68105ecb 100644 --- a/chrome/test/webapps/data/actions.md +++ b/chrome/test/webapps/data/actions.md
@@ -122,7 +122,7 @@ | check_window_color_correct | Site | | 77 | Not Implemented | The color of the window is correct. | P3 | | check_window_icon_correct | | | 78 | Not Implemented | | P3 | | create_shortcuts | Site | | 72 | Not Implemented | "create shortcuts" in chrome://apps | P2 | -| delete_platform_shortcut | Site | | 74 | Not Implemented | Delete the shortcut that lives on the operating system | P2 | +| delete_platform_shortcut | Site | | 74 | Implemented | Delete the shortcut that lives on the operating system. Win/Mac/Linux only. | P2 | | delete_profile | | | 83 | Not Implemented | Delete the user profile. | P4 | | # Launching | | launch_from_chrome_apps | Site | | 34 | Implemented | Launch the web app by navigating to chrome://apps, and then clicking on the app icon. | |
diff --git a/chrome/test/webapps/data/critical_user_journeys.md b/chrome/test/webapps/data/critical_user_journeys.md index 392a7cb..9fb19b6b 100644 --- a/chrome/test/webapps/data/critical_user_journeys.md +++ b/chrome/test/webapps/data/critical_user_journeys.md
@@ -125,8 +125,8 @@ | WMLC | install | delete_profile | check_app_list_empty | | WMLC | install | delete_profile | check_app_not_in_list | | WMLC | install_with_shortcut | delete_profile | check_platform_shortcut_not_exists | -| WMLC | install_tabbed | delete_platform_shortcut | create_shortcuts | launch_from_platform_shortcut | check_tab_created | -| WMLC | install_windowed | delete_platform_shortcut | create_shortcuts | launch_from_platform_shortcut | check_window_created | +| WMLC | install_with_shortcut | delete_platform_shortcut | create_shortcuts | launch_from_platform_shortcut | check_tab_created | +| WMLC | install_no_shortcut | create_shortcuts | launch_from_platform_shortcut | check_window_created | | WMLC | install_by_user_windowed | open_in_chrome | check_tab_created | | WMLC | install_by_user_windowed | navigate_pwa_site_a_to(SiteB) | open_in_chrome | check_tab_created | | WML | install_windowed | open_app_settings | check_browser_navigation_is_app_settings |
diff --git a/chrome/test/webapps/data/framework_supported_actions.csv b/chrome/test/webapps/data/framework_supported_actions.csv index db11de29..49965c2 100644 --- a/chrome/test/webapps/data/framework_supported_actions.csv +++ b/chrome/test/webapps/data/framework_supported_actions.csv
@@ -22,6 +22,7 @@ check_window_controls_overlay_toggle, 🌕, 🌕, 🌕, 🌕, close_custom_toolbar, 🌕, 🌕, 🌕, 🌕, close_pwa, 🌕, 🌕, 🌕, 🌕, +delete_platform_shortcut, 🌕, 🌕, 🌕, 🌑, disable_window_controls_overlay, 🌕, 🌕, 🌕, 🌕, enable_window_controls_overlay, 🌕, 🌕, 🌕, 🌕, install_create_shortcut_tabbed, 🌕, 🌕, 🌕, 🌕, @@ -68,4 +69,4 @@ open_app_settings_from_chrome_apps, 🌕, 🌕, 🌕, 🌑, open_app_settings_from_app_menu, 🌕, 🌕, 🌕, 🌑, check_browser_navigation_is_app_settings, 🌕, 🌕, 🌕, 🌑, -await_manifest_update, 🌑, 🌑,, 🌑, 🌑, \ No newline at end of file +await_manifest_update, 🌑, 🌑,, 🌑, 🌑,
diff --git a/chrome/tools/build/win/create_installer_archive.py b/chrome/tools/build/win/create_installer_archive.py index dfa3ee4..cc4a6f2 100755 --- a/chrome/tools/build/win/create_installer_archive.py +++ b/chrome/tools/build/win/create_installer_archive.py
@@ -173,7 +173,10 @@ def GetLZMAExec(build_dir): if sys.platform == 'win32': lzma_exec = os.path.join(build_dir, "..", "..", "third_party", - "lzma_sdk", "bin", "7za.exe") + "lzma_sdk", "bin", "win64", "7za.exe") + elif sys.platform == 'darwin': + lzma_exec = os.path.join(build_dir, "..", "..", "third_party", + "lzma_sdk", "bin", "mac64", "7zz") else: lzma_exec = '7zr' # Use system 7zr. return lzma_exec
diff --git a/chrome/updater/app/server/win/com_classes_legacy.cc b/chrome/updater/app/server/win/com_classes_legacy.cc index 61a7b15a..d64d0ca 100644 --- a/chrome/updater/app/server/win/com_classes_legacy.cc +++ b/chrome/updater/app/server/win/com_classes_legacy.cc
@@ -24,6 +24,7 @@ #include "base/process/process.h" #include "base/strings/strcat.h" #include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/waitable_event.h" @@ -97,6 +98,11 @@ value.start_minute_, value.duration_minute_); } +template <> +std::string GetStringFromValue(const std::vector<std::string>& value) { + return base::JoinString(value, ";"); +} + } // namespace namespace updater { @@ -920,10 +926,9 @@ DCHECK(value); PolicyStatus<int> policy_status; - if (!policy_service_->GetLastCheckPeriodMinutes(&policy_status, nullptr)) - return E_FAIL; - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetLastCheckPeriodMinutes(&policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_updatesSuppressedTimes( @@ -954,12 +959,10 @@ DCHECK(value); PolicyStatus<std::string> policy_status; - if (!policy_service_->GetDownloadPreferenceGroupPolicy(&policy_status, - nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetDownloadPreferenceGroupPolicy(&policy_status, + nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_packageCacheSizeLimitMBytes( @@ -967,12 +970,10 @@ DCHECK(value); PolicyStatus<int> policy_status; - if (!policy_service_->GetPackageCacheSizeLimitMBytes(&policy_status, - nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetPackageCacheSizeLimitMBytes(&policy_status, + nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_packageCacheExpirationTimeDays( @@ -980,45 +981,37 @@ DCHECK(value); PolicyStatus<int> policy_status; - if (!policy_service_->GetPackageCacheExpirationTimeDays(&policy_status, - nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetPackageCacheExpirationTimeDays(&policy_status, + nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_proxyMode(IPolicyStatusValue** value) { DCHECK(value); PolicyStatus<std::string> policy_status; - if (!policy_service_->GetProxyMode(&policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetProxyMode(&policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_proxyPacUrl(IPolicyStatusValue** value) { DCHECK(value); PolicyStatus<std::string> policy_status; - if (!policy_service_->GetProxyPacUrl(&policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetProxyPacUrl(&policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_proxyServer(IPolicyStatusValue** value) { DCHECK(value); PolicyStatus<std::string> policy_status; - if (!policy_service_->GetProxyServer(&policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetProxyServer(&policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_effectivePolicyForAppInstalls( @@ -1027,12 +1020,10 @@ DCHECK(value); PolicyStatus<int> policy_status; - if (!policy_service_->GetEffectivePolicyForAppInstalls( - base::WideToASCII(app_id), &policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetEffectivePolicyForAppInstalls( + base::WideToASCII(app_id), &policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_effectivePolicyForAppUpdates( @@ -1041,12 +1032,10 @@ DCHECK(value); PolicyStatus<int> policy_status; - if (!policy_service_->GetEffectivePolicyForAppUpdates( - base::WideToASCII(app_id), &policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetEffectivePolicyForAppUpdates( + base::WideToASCII(app_id), &policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_targetVersionPrefix( @@ -1055,12 +1044,10 @@ DCHECK(value); PolicyStatus<std::string> policy_status; - if (!policy_service_->GetTargetVersionPrefix(base::WideToASCII(app_id), - &policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetTargetVersionPrefix(base::WideToASCII(app_id), + &policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_isRollbackToTargetVersionAllowed( @@ -1069,12 +1056,10 @@ DCHECK(value); PolicyStatus<bool> policy_status; - if (!policy_service_->IsRollbackToTargetVersionAllowed( - base::WideToASCII(app_id), &policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->IsRollbackToTargetVersionAllowed( + base::WideToASCII(app_id), &policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } STDMETHODIMP PolicyStatusImpl::get_targetChannel(BSTR app_id, @@ -1082,21 +1067,21 @@ DCHECK(value); PolicyStatus<std::string> policy_status; - if (!policy_service_->GetTargetChannel(base::WideToASCII(app_id), - &policy_status, nullptr)) { - return E_FAIL; - } - - return PolicyStatusValueImpl::Create(policy_status, value); + return policy_service_->GetTargetChannel(base::WideToASCII(app_id), + &policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } -// TODO(crbug.com/1293203): Implement this method. STDMETHODIMP PolicyStatusImpl::get_forceInstallApps( VARIANT_BOOL is_machine, IPolicyStatusValue** value) { DCHECK(value); - return E_NOTIMPL; + PolicyStatus<std::vector<std::string>> policy_status; + return policy_service_->GetForceInstallApps(&policy_status, nullptr) + ? PolicyStatusValueImpl::Create(policy_status, value) + : E_FAIL; } // TODO(crbug.com/1344200): Implement the IDispatch methods.
diff --git a/chrome/updater/configurator.cc b/chrome/updater/configurator.cc index 0b9d152..834f96c 100644 --- a/chrome/updater/configurator.cc +++ b/chrome/updater/configurator.cc
@@ -44,16 +44,14 @@ #include "chrome/updater/linux/net/network.h" #endif +namespace updater { + namespace { -// Default time constants. const int kDelayOneMinute = 60; -const int kDelayOneHour = kDelayOneMinute * 60; } // namespace -namespace updater { - Configurator::Configurator(scoped_refptr<UpdaterPrefs> prefs, scoped_refptr<ExternalConstants> external_constants) : prefs_(prefs), @@ -78,9 +76,8 @@ int Configurator::NextCheckDelay() const { int minutes = 0; - return policy_service_->GetLastCheckPeriodMinutes(nullptr, &minutes) - ? minutes * kDelayOneMinute - : 4 * kDelayOneHour + 30 * kDelayOneMinute; + CHECK(policy_service_->GetLastCheckPeriodMinutes(nullptr, &minutes)); + return minutes * kDelayOneMinute; } int Configurator::OnDemandDelay() const {
diff --git a/chrome/updater/policy/manager.cc b/chrome/updater/policy/manager.cc index d8aee0b..ae2bfbf 100644 --- a/chrome/updater/policy/manager.cc +++ b/chrome/updater/policy/manager.cc
@@ -11,6 +11,12 @@ namespace updater { +namespace { + +const int kDelayOneHour = 60 * 60; + +} // namespace + UpdatesSuppressedTimes::UpdatesSuppressedTimes() = default; UpdatesSuppressedTimes::~UpdatesSuppressedTimes() = default; @@ -47,8 +53,6 @@ return false; } -// TODO(crbug.com/1070833): implement returning the default values instead of -// returning a failure. // DefaultValuesPolicyManager returns the default values for policies when no // other policy manager is present in the system. class DefaultValuesPolicyManager : public PolicyManagerInterface { @@ -102,7 +106,8 @@ } bool DefaultValuesPolicyManager::GetLastCheckPeriodMinutes(int* minutes) const { - return false; + *minutes = 4 * kDelayOneHour + 30; + return true; } bool DefaultValuesPolicyManager::GetUpdatesSuppressedTimes( @@ -128,13 +133,15 @@ bool DefaultValuesPolicyManager::GetEffectivePolicyForAppInstalls( const std::string& app_id, int* install_policy) const { - return false; + *install_policy = kInstallPolicyDefault; + return true; } bool DefaultValuesPolicyManager::GetEffectivePolicyForAppUpdates( const std::string& app_id, int* update_policy) const { - return false; + *update_policy = kUpdatePolicyDefault; + return true; } bool DefaultValuesPolicyManager::GetTargetVersionPrefix( @@ -146,7 +153,8 @@ bool DefaultValuesPolicyManager::IsRollbackToTargetVersionAllowed( const std::string& app_id, bool* rollback_allowed) const { - return false; + *rollback_allowed = false; + return true; } bool DefaultValuesPolicyManager::GetProxyMode(std::string* proxy_mode) const {
diff --git a/chrome/updater/policy/service_unittest.cc b/chrome/updater/policy/service_unittest.cc index 0e897ec..8a4f607 100644 --- a/chrome/updater/policy/service_unittest.cc +++ b/chrome/updater/policy/service_unittest.cc
@@ -123,8 +123,25 @@ std::string version_prefix; EXPECT_FALSE( policy_service->GetTargetVersionPrefix("", nullptr, &version_prefix)); + int last_check = 0; - EXPECT_FALSE(policy_service->GetLastCheckPeriodMinutes(nullptr, &last_check)); + EXPECT_TRUE(policy_service->GetLastCheckPeriodMinutes(nullptr, &last_check)); + EXPECT_EQ(last_check, 14430); + + int install_policy = 0; + EXPECT_TRUE(policy_service->GetEffectivePolicyForAppInstalls( + "test1", nullptr, &install_policy)); + EXPECT_EQ(install_policy, 1); + + int update_policy = 0; + EXPECT_TRUE(policy_service->GetEffectivePolicyForAppUpdates("test1", nullptr, + &update_policy)); + EXPECT_EQ(update_policy, 1); + + bool rollback_allowed = true; + EXPECT_TRUE(policy_service->IsRollbackToTargetVersionAllowed( + "test1", nullptr, &rollback_allowed)); + EXPECT_EQ(rollback_allowed, false); } TEST(PolicyService, SinglePolicyManager) { @@ -356,10 +373,14 @@ EXPECT_EQ(update_policy, 3); PolicyStatus<int> app2_update_status; - EXPECT_FALSE(policy_service->GetEffectivePolicyForAppUpdates( + EXPECT_TRUE(policy_service->GetEffectivePolicyForAppUpdates( "app2", &app2_update_status, &update_policy)); - EXPECT_FALSE(app2_update_status.effective_policy()); + EXPECT_TRUE(app2_update_status.effective_policy()); EXPECT_FALSE(app2_update_status.conflict_policy()); + const PolicyStatus<int>::Entry& app2_update_status_policy = + app2_update_status.effective_policy().value(); + EXPECT_EQ(app2_update_status_policy.source, "default"); + EXPECT_EQ(app2_update_status_policy.policy, 1); PolicyStatus<std::string> download_preference_status; std::string download_preference;
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc index 388e33e..3a99dd7 100644 --- a/chrome/updater/test/integration_tests_win.cc +++ b/chrome/updater/test/integration_tests_win.cc
@@ -1000,6 +1000,28 @@ DeleteAppClientKey(scope, appid); } +namespace { + +void ExpectPolicyStatusValues( + Microsoft::WRL::ComPtr<IPolicyStatusValue> policy_status_value, + const std::wstring& expected_source, + const std::wstring& expected_value, + VARIANT_BOOL expected_has_conflict) { + base::win::ScopedBstr source; + base::win::ScopedBstr value; + VARIANT_BOOL has_conflict = VARIANT_FALSE; + + ASSERT_NE(policy_status_value.Get(), nullptr); + EXPECT_HRESULT_SUCCEEDED(policy_status_value->get_source(source.Receive())); + EXPECT_EQ(source.Get(), expected_source); + EXPECT_HRESULT_SUCCEEDED(policy_status_value->get_value(value.Receive())); + EXPECT_EQ(value.Get(), expected_value); + EXPECT_HRESULT_SUCCEEDED(policy_status_value->get_hasConflict(&has_conflict)); + EXPECT_EQ(has_conflict, expected_has_conflict); +} + +} // namespace + void ExpectLegacyPolicyStatusSucceeds(UpdaterScope scope) { Microsoft::WRL::ComPtr<IUnknown> policy_status_server; ASSERT_HRESULT_SUCCEEDED(::CoCreateInstance( @@ -1008,6 +1030,7 @@ nullptr, CLSCTX_LOCAL_SERVER, IID_PPV_ARGS(&policy_status_server))); Microsoft::WRL::ComPtr<IPolicyStatus2> policy_status2; ASSERT_HRESULT_SUCCEEDED(policy_status_server.As(&policy_status2)); + base::win::ScopedBstr updater_version; ASSERT_HRESULT_SUCCEEDED( policy_status2->get_updaterVersion(updater_version.Receive())); @@ -1016,6 +1039,31 @@ DATE last_checked = 0; EXPECT_HRESULT_SUCCEEDED(policy_status2->get_lastCheckedTime(&last_checked)); EXPECT_GT(static_cast<int>(last_checked), 0); + + Microsoft::WRL::ComPtr<IPolicyStatusValue> policy_status_value; + ASSERT_HRESULT_SUCCEEDED( + policy_status2->get_lastCheckPeriodMinutes(&policy_status_value)); + ExpectPolicyStatusValues(policy_status_value, L"default", L"14430", + VARIANT_FALSE); + + const base::win::ScopedBstr test_app(L"test1"); + policy_status_value.Reset(); + ASSERT_HRESULT_SUCCEEDED(policy_status2->get_effectivePolicyForAppInstalls( + test_app.Get(), &policy_status_value)); + ExpectPolicyStatusValues(policy_status_value, L"default", L"1", + VARIANT_FALSE); + + policy_status_value.Reset(); + ASSERT_HRESULT_SUCCEEDED(policy_status2->get_effectivePolicyForAppUpdates( + test_app.Get(), &policy_status_value)); + ExpectPolicyStatusValues(policy_status_value, L"default", L"1", + VARIANT_FALSE); + + policy_status_value.Reset(); + ASSERT_HRESULT_SUCCEEDED(policy_status2->get_isRollbackToTargetVersionAllowed( + test_app.Get(), &policy_status_value)); + ExpectPolicyStatusValues(policy_status_value, L"default", L"false", + VARIANT_FALSE); } int RunVPythonCommand(const base::CommandLine& command_line) {
diff --git a/chrome/updater/win/BUILD.gn b/chrome/updater/win/BUILD.gn index 19e5a41b..2f5e501 100644 --- a/chrome/updater/win/BUILD.gn +++ b/chrome/updater/win/BUILD.gn
@@ -79,7 +79,7 @@ sources = [ "$root_out_dir/certificate_tag.exe", "//chrome/tools/build/win/resedit.py", - "//third_party/lzma_sdk/bin/7zr.exe", + "//third_party/lzma_sdk/bin/win64/7zr.exe", "signing/sign.py", ]
diff --git a/chrome/updater/win/installer/create_installer_archive.py b/chrome/updater/win/installer/create_installer_archive.py index e218a83..3d5904d 100644 --- a/chrome/updater/win/installer/create_installer_archive.py +++ b/chrome/updater/win/installer/create_installer_archive.py
@@ -88,7 +88,10 @@ def GetLZMAExec(build_dir): if sys.platform == 'win32': lzma_exec = os.path.join(build_dir, "..", "..", "third_party", - "lzma_sdk", "bin", "7za.exe") + "lzma_sdk", "bin", "win64", "7za.exe") + elif sys.platform == 'darwin': + lzma_exec = os.path.join(build_dir, "..", "..", "third_party", + "lzma_sdk", "bin", "mac64", "7zz") else: lzma_exec = '7zr' # Use system 7zr. return lzma_exec
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn index dd158d6..4d54055 100644 --- a/chromecast/BUILD.gn +++ b/chromecast/BUILD.gn
@@ -715,7 +715,7 @@ android_manifest_dep = "//chromecast/browser/android:cast_shell_manifest" min_sdk_version = 23 - target_sdk_version = 31 + target_sdk_version = 33 shared_libraries = [ "//chromecast/android:libcast_shell_android" ] @@ -746,7 +746,7 @@ "//chromecast/browser/android:cast_browser_manifest" min_sdk_version = 23 - target_sdk_version = 31 + target_sdk_version = 33 package_name = "cast_browser"
diff --git a/chromecast/renderer/media/key_systems_cast.cc b/chromecast/renderer/media/key_systems_cast.cc index 0cd8120..1b345e7 100644 --- a/chromecast/renderer/media/key_systems_cast.cc +++ b/chromecast/renderer/media/key_systems_cast.cc
@@ -24,7 +24,7 @@ #endif using ::media::CdmSessionType; -using ::media::EmeConfigRule; +using ::media::EmeConfig; using ::media::EmeConfigRuleState; using ::media::EmeFeatureSupport; using ::media::EmeInitDataType; @@ -67,7 +67,7 @@ } #endif // BUILDFLAG(IS_ANDROID) - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, @@ -79,23 +79,22 @@ // in KeySystemConfigSelector: crbug.com/1204284 if (requested_robustness.empty()) { #if BUILDFLAG(IS_ANDROID) - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; #else - return EmeConfigRule(); + return media::EmeConfig::SupportedRule(); #endif // BUILDFLAG(IS_ANDROID) } // Cast-specific PlayReady implementation does not currently recognize or // support non-empty robustness strings. - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport() - const override { + EmeConfig::Rule GetPersistentLicenseSessionSupport() const override { if (persistent_license_support_) { - return EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } } @@ -106,12 +105,12 @@ return EmeFeatureSupport::ALWAYS_ENABLED; } - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( EncryptionScheme encryption_scheme) const override { if (encryption_scheme == EncryptionScheme::kCenc) { - return EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } }
diff --git a/chromeos/ash/components/BUILD.gn b/chromeos/ash/components/BUILD.gn index 39fb602..987e2bbf 100644 --- a/chromeos/ash/components/BUILD.gn +++ b/chromeos/ash/components/BUILD.gn
@@ -15,6 +15,7 @@ "//chromeos/ash/components/dbus:unit_tests", "//chromeos/ash/components/feature_usage:unit_tests", "//chromeos/ash/components/human_presence:unit_tests", + "//chromeos/ash/components/install_attributes:unit_tests", "//chromeos/ash/components/local_search_service:unit_tests", "//chromeos/ash/components/local_search_service/public/mojom:unit_tests", "//chromeos/ash/components/memory:unit_tests",
diff --git a/chromeos/ash/components/dbus/BUILD.gn b/chromeos/ash/components/dbus/BUILD.gn index 3031be7d..54f59d5 100644 --- a/chromeos/ash/components/dbus/BUILD.gn +++ b/chromeos/ash/components/dbus/BUILD.gn
@@ -12,7 +12,6 @@ configs += [ "//build/config/linux/dbus" ] testonly = true deps = [ - "//ash/components/tpm:test_support", "//base", "//base/test:test_support", "//chromeos/ash/components/dbus/audio", @@ -37,6 +36,7 @@ "//chromeos/ash/components/dbus/update_engine:unit_tests", "//chromeos/ash/components/dbus/userdataauth", "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", + "//chromeos/ash/components/install_attributes:test_support", "//chromeos/dbus:test_support", "//components/account_id", "//dbus",
diff --git a/chromeos/ash/components/dbus/authpolicy/BUILD.gn b/chromeos/ash/components/dbus/authpolicy/BUILD.gn index a17899b..32f4e364 100644 --- a/chromeos/ash/components/dbus/authpolicy/BUILD.gn +++ b/chromeos/ash/components/dbus/authpolicy/BUILD.gn
@@ -15,12 +15,12 @@ deps = [ ":authpolicy_proto", "//base", + "//chromeos/ash/components/install_attributes", "//chromeos/dbus/common", "//components/account_id", "//dbus", # For FakeAuthPolicyClient - "//ash/components/tpm", "//chromeos/ash/components/dbus/session_manager", "//chromeos/dbus/cryptohome:cryptohome_proto", "//components/policy:cloud_policy_proto_generated_compile",
diff --git a/chromeos/ash/components/dbus/authpolicy/DEPS b/chromeos/ash/components/dbus/authpolicy/DEPS index 39c5eb1a..723e81e 100644 --- a/chromeos/ash/components/dbus/authpolicy/DEPS +++ b/chromeos/ash/components/dbus/authpolicy/DEPS
@@ -1,5 +1,5 @@ specific_include_rules = { "fake_authpolicy_client.*\.cc": [ - "+ash/components/tpm", + "+chromeos/ash/components/install_attributes", ], }
diff --git a/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.cc b/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.cc index 0a35367..64b3361 100644 --- a/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.cc +++ b/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.cc
@@ -7,7 +7,6 @@ #include <memory> #include <vector> -#include "ash/components/tpm/install_attributes.h" #include "base/bind.h" #include "base/files/file_util.h" #include "base/hash/md5.h" @@ -17,6 +16,7 @@ #include "base/threading/platform_thread.h" #include "base/threading/thread_task_runner_handle.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/dbus/cryptohome/rpc.pb.h" #include "components/account_id/account_id.h" #include "components/policy/proto/cloud_policy.pb.h"
diff --git a/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client_unittest.cc b/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client_unittest.cc index ddc31ed..63d29a5 100644 --- a/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client_unittest.cc +++ b/chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client_unittest.cc
@@ -4,11 +4,11 @@ #include "chromeos/ash/components/dbus/authpolicy/fake_authpolicy_client.h" -#include "ash/components/tpm/stub_install_attributes.h" #include "base/bind.h" #include "base/run_loop.h" #include "base/test/task_environment.h" #include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/account_id/account_id.h" #include "testing/gtest/include/gtest/gtest.h"
diff --git a/chromeos/ash/components/install_attributes/BUILD.gn b/chromeos/ash/components/install_attributes/BUILD.gn new file mode 100644 index 0000000..a590e2e8 --- /dev/null +++ b/chromeos/ash/components/install_attributes/BUILD.gn
@@ -0,0 +1,61 @@ +# 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. + +import("//build/config/chromeos/ui_mode.gni") + +assert(is_chromeos_ash) + +component("install_attributes") { + defines = [ "IS_ASH_INSTALL_ATTRIBUTES_IMPL" ] + public_deps = [ + "//base", + "//chromeos/ash/components/dbus/userdataauth", + "//chromeos/dbus/tpm_manager:tpm_manager_proto", + "//components/policy/core/common:common_constants", + "//third_party/abseil-cpp:absl", + ] + deps = [ + "//chromeos/ash/components/dbus/userdataauth:userdataauth_proto", + "//chromeos/dbus/constants", + "//chromeos/dbus/cryptohome:cryptohome_proto", + "//chromeos/dbus/tpm_manager", + "//components/policy/proto:proto", + "//google_apis:google_apis", + ] + sources = [ + "install_attributes.cc", + "install_attributes.h", + ] +} + +source_set("test_support") { + testonly = true + public_deps = [ ":install_attributes" ] + deps = [ + "//base", + "//components/policy/core/common:common_constants", + ] + sources = [ + "stub_install_attributes.cc", + "stub_install_attributes.h", + ] +} + +source_set("unit_tests") { + testonly = true + deps = [ + ":install_attributes", + "//base", + "//base/test:test_support", + "//chromeos/ash/components/dbus/userdataauth", + "//chromeos/dbus/constants", + "//chromeos/dbus/cryptohome:cryptohome_proto", + "//chromeos/dbus/tpm_manager", + "//components/policy/proto:proto", + "//google_apis:google_apis", + "//testing/gmock", + "//testing/gtest", + ] + sources = [ "install_attributes_unittest.cc" ] +}
diff --git a/chromeos/ash/components/install_attributes/DEPS b/chromeos/ash/components/install_attributes/DEPS new file mode 100644 index 0000000..76f33c3 --- /dev/null +++ b/chromeos/ash/components/install_attributes/DEPS
@@ -0,0 +1,4 @@ +include_rules = [ + "+chromeos/ash/components/dbus/userdataauth", + "+components/policy/core/common/cloud/cloud_policy_constants.h", +]
diff --git a/chromeos/ash/components/install_attributes/DIR_METADATA b/chromeos/ash/components/install_attributes/DIR_METADATA new file mode 100644 index 0000000..f332abae1 --- /dev/null +++ b/chromeos/ash/components/install_attributes/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//ash/components/policy/COMMON_METADATA"
diff --git a/chromeos/ash/components/install_attributes/OWNERS b/chromeos/ash/components/install_attributes/OWNERS new file mode 100644 index 0000000..92e0deea --- /dev/null +++ b/chromeos/ash/components/install_attributes/OWNERS
@@ -0,0 +1 @@ +file://ash/components/policy/OWNERS
diff --git a/ash/components/tpm/install_attributes.cc b/chromeos/ash/components/install_attributes/install_attributes.cc similarity index 98% rename from ash/components/tpm/install_attributes.cc rename to chromeos/ash/components/install_attributes/install_attributes.cc index 7ad9996a..e09b7f44 100644 --- a/ash/components/tpm/install_attributes.cc +++ b/chromeos/ash/components/install_attributes/install_attributes.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 "ash/components/tpm/install_attributes.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include <stddef.h> @@ -22,6 +22,7 @@ #include "base/time/time.h" #include "chromeos/ash/components/dbus/userdataauth/install_attributes_util.h" #include "chromeos/dbus/constants/dbus_paths.h" +#include "chromeos/dbus/cryptohome/UserDataAuth.pb.h" #include "chromeos/dbus/cryptohome/rpc.pb.h" #include "chromeos/dbus/tpm_manager/tpm_manager.pb.h" #include "chromeos/dbus/tpm_manager/tpm_manager_client.h"
diff --git a/ash/components/tpm/install_attributes.h b/chromeos/ash/components/install_attributes/install_attributes.h similarity index 96% rename from ash/components/tpm/install_attributes.h rename to chromeos/ash/components/install_attributes/install_attributes.h index 5390c675..cddfc3e 100644 --- a/ash/components/tpm/install_attributes.h +++ b/chromeos/ash/components/install_attributes/install_attributes.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 ASH_COMPONENTS_TPM_INSTALL_ATTRIBUTES_H_ -#define ASH_COMPONENTS_TPM_INSTALL_ATTRIBUTES_H_ +#ifndef CHROMEOS_ASH_COMPONENTS_INSTALL_ATTRIBUTES_INSTALL_ATTRIBUTES_H_ +#define CHROMEOS_ASH_COMPONENTS_INSTALL_ATTRIBUTES_INSTALL_ATTRIBUTES_H_ #include <map> #include <string> @@ -24,7 +24,7 @@ // Brokers access to the installation-time attributes on Chrome OS. When // initialized with kInstallAttributesFileName, the attributes are fully trusted // (signature has been verified by lockbox-cache). -class COMPONENT_EXPORT(ASH_COMPONENTS_TPM) InstallAttributes { +class COMPONENT_EXPORT(ASH_INSTALL_ATTRIBUTES) InstallAttributes { public: // InstallAttributes status codes. Do not change the numeric ids or the // meaning of the existing codes to preserve the interpretability of old @@ -243,4 +243,4 @@ using ::ash::InstallAttributes; } -#endif // ASH_COMPONENTS_TPM_INSTALL_ATTRIBUTES_H_ +#endif // CHROMEOS_ASH_COMPONENTS_INSTALL_ATTRIBUTES_INSTALL_ATTRIBUTES_H_
diff --git a/ash/components/tpm/install_attributes_unittest.cc b/chromeos/ash/components/install_attributes/install_attributes_unittest.cc similarity index 99% rename from ash/components/tpm/install_attributes_unittest.cc rename to chromeos/ash/components/install_attributes/install_attributes_unittest.cc index 1fa5a1e..93b268d 100644 --- a/ash/components/tpm/install_attributes_unittest.cc +++ b/chromeos/ash/components/install_attributes/install_attributes_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 "ash/components/tpm/install_attributes.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include <memory>
diff --git a/ash/components/tpm/stub_install_attributes.cc b/chromeos/ash/components/install_attributes/stub_install_attributes.cc similarity index 97% rename from ash/components/tpm/stub_install_attributes.cc rename to chromeos/ash/components/install_attributes/stub_install_attributes.cc index 5172ae1..7266c364 100644 --- a/ash/components/tpm/stub_install_attributes.cc +++ b/chromeos/ash/components/install_attributes/stub_install_attributes.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 "ash/components/tpm/stub_install_attributes.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/policy/core/common/cloud/cloud_policy_constants.h"
diff --git a/ash/components/tpm/stub_install_attributes.h b/chromeos/ash/components/install_attributes/stub_install_attributes.h similarity index 91% rename from ash/components/tpm/stub_install_attributes.h rename to chromeos/ash/components/install_attributes/stub_install_attributes.h index 6f1713a..1948d29 100644 --- a/ash/components/tpm/stub_install_attributes.h +++ b/chromeos/ash/components/install_attributes/stub_install_attributes.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 ASH_COMPONENTS_TPM_STUB_INSTALL_ATTRIBUTES_H_ -#define ASH_COMPONENTS_TPM_STUB_INSTALL_ATTRIBUTES_H_ +#ifndef CHROMEOS_ASH_COMPONENTS_INSTALL_ATTRIBUTES_STUB_INSTALL_ATTRIBUTES_H_ +#define CHROMEOS_ASH_COMPONENTS_INSTALL_ATTRIBUTES_STUB_INSTALL_ATTRIBUTES_H_ #include <string> -#include "ash/components/tpm/install_attributes.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" namespace ash { @@ -89,4 +89,4 @@ using ::ash::StubInstallAttributes; } // namespace chromeos -#endif // ASH_COMPONENTS_TPM_STUB_INSTALL_ATTRIBUTES_H_ +#endif // CHROMEOS_ASH_COMPONENTS_INSTALL_ATTRIBUTES_STUB_INSTALL_ATTRIBUTES_H_
diff --git a/chromeos/ash/components/network/network_state.cc b/chromeos/ash/components/network/network_state.cc index d899e8a..8deef0f 100644 --- a/chromeos/ash/components/network/network_state.cc +++ b/chromeos/ash/components/network/network_state.cc
@@ -484,22 +484,6 @@ : shill_portal_state_; } -bool NetworkState::IsCaptivePortal() const { - PortalState portal_state = GetPortalState(); - switch (portal_state) { - case PortalState::kUnknown: - case PortalState::kOnline: - return false; - case PortalState::kPortalSuspected: - case PortalState::kPortal: - case PortalState::kProxyAuthRequired: - case PortalState::kNoInternet: - return true; - } - NOTREACHED(); - return false; -} - bool NetworkState::IsSecure() const { return !security_class_.empty() && security_class_ != shill::kSecurityNone; }
diff --git a/chromeos/ash/components/network/network_state.h b/chromeos/ash/components/network/network_state.h index 05ca6b9..23f81c6 100644 --- a/chromeos/ash/components/network/network_state.h +++ b/chromeos/ash/components/network/network_state.h
@@ -223,10 +223,6 @@ // portal detection results if set. PortalState GetPortalState() const; - // Returns true if GetPortalState is not unknown or online. - // TODO(b/207069182): Deprecate and use GetPortalState directly. - bool IsCaptivePortal() const; - // Returns true if the security type is non-empty and not 'none'. bool IsSecure() const;
diff --git a/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc b/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc index a69cba5..4c8b3c7 100644 --- a/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc +++ b/chromeos/ash/components/network/onc/onc_translator_shill_to_onc.cc
@@ -619,7 +619,10 @@ if (network_state_) { // Only visible networks set RestrictedConnectivity, and only if true. - if (network_state_->IsCaptivePortal()) { + auto portal_state = network_state_->GetPortalState(); + if (network_state_->IsConnectedState() && + portal_state != NetworkState::PortalState::kUnknown && + portal_state != NetworkState::PortalState::kOnline) { onc_object_.SetKey(::onc::network_config::kRestrictedConnectivity, base::Value(true)); }
diff --git a/chromeos/ash/components/oobe_quick_start/DEPS b/chromeos/ash/components/oobe_quick_start/DEPS index 64a29d6..74c3065a 100644 --- a/chromeos/ash/components/oobe_quick_start/DEPS +++ b/chromeos/ash/components/oobe_quick_start/DEPS
@@ -2,6 +2,10 @@ include_rules = [ "+base", + "+components/cbor", + "+crypto", "+device/bluetooth", + "+third_party/abseil-cpp/absl/types/variant.h", "+testing", + "+url", ]
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/BUILD.gn b/chromeos/ash/components/oobe_quick_start/connectivity/BUILD.gn index a4c74ace..c3330d4 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/BUILD.gn +++ b/chromeos/ash/components/oobe_quick_start/connectivity/BUILD.gn
@@ -9,7 +9,10 @@ source_set("connectivity") { deps = [ "//base", + "//components/cbor", + "//crypto", "//device/bluetooth", + "//url", ] sources = [ "fast_pair_advertiser.cc", @@ -22,10 +25,6 @@ "target_device_connection_broker_impl.h", "target_fido_controller.cc", "target_fido_controller.h", - "target_fido_controller_factory.cc", - "target_fido_controller_factory.h", - "target_fido_controller_impl.cc", - "target_fido_controller_impl.h", ] } @@ -45,11 +44,13 @@ ":connectivity", "//base", "//base/test:test_support", + "//components/cbor", "//device/bluetooth:mocks", + "//url", ] sources = [ "fast_pair_advertiser_unittest.cc", "target_device_connection_broker_impl_unittest.cc", - "target_fido_controller_impl_unittest.cc", + "target_fido_controller_unittest.cc", ] }
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.cc b/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.cc index 52667318..222a7dd 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.cc +++ b/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.cc
@@ -11,6 +11,8 @@ #include "base/metrics/histogram_functions.h" #include "base/unguessable_token.h" +namespace ash::quick_start { + namespace { constexpr const char kFastPairServiceUuid[] = @@ -160,4 +162,6 @@ base::span<const uint8_t, 16> id = random_session_id.AsBytes(); std::vector<uint8_t> metadata(std::begin(id), std::end(id)); return metadata; -} \ No newline at end of file +} + +} // namespace ash::quick_start
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.h b/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.h index 149857f6..5d00006 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.h +++ b/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser.h
@@ -14,6 +14,8 @@ #include "device/bluetooth/bluetooth_adapter.h" #include "device/bluetooth/bluetooth_advertisement.h" +namespace ash::quick_start { + // FastPairAdvertiser broadcasts advertisements with the service UUID // 0xFE2C and model ID 0x41C0D9. When the remote device detects this // advertisement it will trigger a prompt to begin Quick Start. @@ -84,4 +86,6 @@ base::WeakPtrFactory<FastPairAdvertiser> weak_ptr_factory_{this}; }; +} // namespace ash::quick_start + #endif // CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_FAST_PAIR_ADVERTISER_H_ \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser_unittest.cc b/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser_unittest.cc index 5aa987a..44262ce 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser_unittest.cc +++ b/chromeos/ash/components/oobe_quick_start/connectivity/fast_pair_advertiser_unittest.cc
@@ -119,6 +119,8 @@ bool called_unregister_error_callback_ = false; }; +namespace ash::quick_start { + class FastPairAdvertiserTest : public testing::Test { public: FastPairAdvertiserTest(const FastPairAdvertiserTest&) = delete; @@ -301,4 +303,6 @@ for (int i = 0; i < 16; i++) { EXPECT_EQ(random_id_bytes[i], manufacturer_metadata[i]); } -} \ No newline at end of file +} + +} // namespace ash::quick_start \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker.h b/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker.h index afbea4a7..df84910 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker.h +++ b/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker.h
@@ -32,7 +32,7 @@ // Represents a new incoming connection that has not yet been accepted by the // source device. - class UnacceptedConnection : public Connection {}; + class IncomingConnection : public Connection {}; // Represents an accepted (authenticated) connection. class AcceptedConnection : public Connection {}; @@ -54,19 +54,19 @@ // this target device, but it is the responsibility of the source device to // make an informed choice to accept. The user of the source device makes // this decision by inspecting the UI of this target device, which is - // expected to display the metadata that the UnacceptedConnection object + // expected to display the metadata that the IncomingConnection object // provides (QR Code or shapes/PIN matching). // - // The UnacceptedConnection pointer may be cached, but will become invalid + // The IncomingConnection pointer may be cached, but will become invalid // after either OnConnectionAccepted(), OnConnectionRejected(), or // OnConnectionClosed() are called. // // Use source_device_id to understand which connection // OnConnectionAccepted(), OnConnectionRejected(), or OnConnectionClosed() // refers to. - virtual void OnUnacceptedConnectionInitiated( + virtual void OnIncomingConnectionInitiated( const std::string& source_device_id, - base::WeakPtr<UnacceptedConnection> connection) = 0; + base::WeakPtr<IncomingConnection> connection) = 0; // Called after both sides have accepted the connection. // @@ -102,7 +102,7 @@ // Clients can use the result of |on_start_advertising_callback| to // immediately understand if advertising succeeded, and can then wait for the // source device to connect via - // |ConnectionLifecycleListener::OnUnacceptedConnectionInitiated()|. + // |ConnectionLifecycleListener::OnIncomingConnectionInitiated()|. // // If the caller paused a connection previously, the connection to the // source device will resume via OnConnectionAccepted().
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl.h b/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl.h index 00ad75b..cc0aa83 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl.h +++ b/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl.h
@@ -10,10 +10,10 @@ #include "chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker.h" #include "device/bluetooth/bluetooth_adapter_factory.h" -class FastPairAdvertiser; - namespace ash::quick_start { +class FastPairAdvertiser; + class TargetDeviceConnectionBrokerImpl : public TargetDeviceConnectionBroker { public: using FeatureSupportStatus =
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc b/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc index e40abaf3..474f6c37 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc +++ b/chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_impl_unittest.cc
@@ -21,6 +21,7 @@ ash::quick_start::TargetDeviceConnectionBroker; using TargetDeviceConnectionBrokerImpl = ash::quick_start::TargetDeviceConnectionBrokerImpl; +using FastPairAdvertiser = ash::quick_start::FastPairAdvertiser; // Allows us to delay returning a Bluetooth adapter until after ReturnAdapter() // is called. Used for testing how the connection broker behaves before the
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.cc b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.cc index 3e90bba..fc6e202b 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.cc +++ b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.cc
@@ -2,8 +2,107 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h" + +#include "base/json/json_writer.h" +#include "base/strings/string_piece.h" +#include "base/strings/utf_string_conversion_utils.h" +#include "base/values.h" +#include "components/cbor/values.h" +#include "components/cbor/writer.h" +#include "crypto/sha2.h" +#include "url/gurl.h" +#include "url/origin.h" + namespace ash::quick_start { -// TODO impl +namespace { + +const char kRelyingPartyId[] = "google.com"; +const char kOrigin[] = "https://accounts.google.com"; +const char kCtapRequestType[] = "webauthn.get"; + +const uint8_t kAuthenticatorGetAssertionCommand = 0x02; +const char kUserPresenceMapKey[] = "up"; +const char kUserVerificationMapKey[] = "uv"; + +} // namespace + +TargetFidoController::TargetFidoController( + NearbyConnectionsManager* nearby_connections_manager) + : nearby_connections_manager_(nearby_connections_manager) { + // TODO(b/234655072): Uncomment the following line after + // NearbyConnectionsManager defined. + + // CHECK(nearby_connections_manager_); +} + +TargetFidoController::~TargetFidoController() = default; + +void TargetFidoController::RequestAssertion(const std::string& challenge_b64url, + ResultCallback callback) { + if (challenge_b64url.empty()) { + std::move(callback).Run(/*success=*/false); + return; + } + cbor::Value request = GenerateGetAssertionRequest(challenge_b64url); + std::vector<uint8_t> ctap_request_command = + CBOREncodeGetAssertionRequest(std::move(request)); + + // TODO(b/234655072): This is a stub and not real logic. Add the actual logic. + std::move(callback).Run(/*success=*/true); +} + +// GenerateGetAssertionRequest will take challenge bytes and create an instance +// of cbor::Value of the GetAssertionRequest which can then be CBOR encoded. +cbor::Value TargetFidoController::GenerateGetAssertionRequest( + const std::string& challenge_b64url) { + url::Origin origin = url::Origin::Create(GURL(kOrigin)); + std::string client_data_json = CreateClientDataJson(origin, challenge_b64url); + cbor::Value::MapValue cbor_map; + cbor_map[cbor::Value(1)] = cbor::Value(kRelyingPartyId); + std::array<uint8_t, crypto::kSHA256Length> client_data_hash; + crypto::SHA256HashString(client_data_json, client_data_hash.data(), + client_data_hash.size()); + cbor_map[cbor::Value(2)] = cbor::Value(client_data_hash); + cbor::Value::MapValue option_map; + option_map[cbor::Value(kUserPresenceMapKey)] = cbor::Value(true); + option_map[cbor::Value(kUserVerificationMapKey)] = cbor::Value(true); + cbor_map[cbor::Value(5)] = cbor::Value(std::move(option_map)); + return cbor::Value(std::move(cbor_map)); +} + +// CBOREncodeGetAssertionRequest will take a CtapGetAssertionRequest struct +// and encode it into CBOR encoded bytes that can be understood by a FIDO +// authenticator. +std::vector<uint8_t> TargetFidoController::CBOREncodeGetAssertionRequest( + const cbor::Value& request) { + // Encode the CtapGetAssertionRequest into cbor bytes vector. + absl::optional<std::vector<uint8_t>> cbor_bytes = + cbor::Writer::Write(request); + DCHECK(cbor_bytes); + std::vector<uint8_t> request_bytes = std::move(*cbor_bytes); + // Add the command byte to the beginning of this now fully encoded cbor bytes + // vector. + request_bytes.insert(request_bytes.begin(), + kAuthenticatorGetAssertionCommand); + return request_bytes; +} + +// This JSON encoding does not follow the strict requirements of the spec[1], +// but that's ok because the validator doesn't demand that. [1] +// https://www.w3.org/TR/webauthn-2/#clientdatajson-serialization +std::string TargetFidoController::CreateClientDataJson( + const url::Origin& origin, + const std::string& challenge_b64url) { + base::Value::Dict collected_client_data; + collected_client_data.Set("type", kCtapRequestType); + collected_client_data.Set("challenge", challenge_b64url); + collected_client_data.Set("origin", origin.Serialize()); + collected_client_data.Set("crossOrigin", false); + std::string client_data_json; + base::JSONWriter::Write(collected_client_data, &client_data_json); + return client_data_json; +} } // namespace ash::quick_start
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h index 1abd8795..030f9876 100644 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h +++ b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h
@@ -5,10 +5,17 @@ #ifndef CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_H_ #define CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_H_ +#include <vector> + #include "base/callback.h" +#include "components/cbor/values.h" +#include "url/origin.h" namespace ash::quick_start { +class NearbyConnectionsManager; +class TargetFidoControllerTest; + // TargetFidoController initializes the FidoDeviceAuthenticator and the // GetAssertionRequestHandler to begin the FIDO CTAP2 Assertion Flow. This class // is also responsible for preparing the GetAssertionRequest and dispatching the @@ -17,12 +24,30 @@ public: using ResultCallback = base::OnceCallback<void(bool success)>; - TargetFidoController() = default; + explicit TargetFidoController( + NearbyConnectionsManager* nearby_connections_manager); + TargetFidoController(const TargetFidoController&) = delete; + TargetFidoController& operator=(const TargetFidoController&) = delete; + ~TargetFidoController(); - virtual ~TargetFidoController() = default; + void RequestAssertion(const std::string& challenge_b64url, + ResultCallback callback); - virtual void RequestAssertion(const std::string& challenge_bytes, - ResultCallback callback) = 0; + private: + friend class TargetFidoControllerTest; + + cbor::Value GenerateGetAssertionRequest(const std::string& challenge_b64url); + + std::vector<uint8_t> CBOREncodeGetAssertionRequest( + const cbor::Value& request); + + std::string CreateClientDataJson(const url::Origin& orgin, + const std::string& challenge_b64url); + + // TODO(b/234655072): Remove maybe_unused tag after NearbyConnectionsManager + // defined. + [[maybe_unused]] const base::raw_ptr<NearbyConnectionsManager> + nearby_connections_manager_; }; } // namespace ash::quick_start
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.cc b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.cc deleted file mode 100644 index c4b73d1..0000000 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.cc +++ /dev/null
@@ -1,31 +0,0 @@ -// 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 "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.h" - -#include "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.h" - -namespace ash::quick_start { - -// static -std::unique_ptr<TargetFidoController> TargetFidoControllerFactory::Create( - const NearbyConnectionsManager* nearby_connections_manager) { - if (test_factory_) { - return test_factory_->CreateInstance(nearby_connections_manager); - } - - return std::make_unique<TargetFidoControllerImpl>(nearby_connections_manager); -} - -// static -void TargetFidoControllerFactory::SetFactoryForTesting( - TargetFidoControllerFactory* test_factory) { - test_factory_ = test_factory; -} - -// static -TargetFidoControllerFactory* TargetFidoControllerFactory::test_factory_ = - nullptr; - -} // namespace ash::quick_start \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.h b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.h deleted file mode 100644 index 6af4195..0000000 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.h +++ /dev/null
@@ -1,32 +0,0 @@ -// 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 CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_FACTORY_H_ -#define CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_FACTORY_H_ - -#include "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h" - -namespace ash::quick_start { - -class NearbyConnectionsManager; - -class TargetFidoControllerFactory { - public: - static std::unique_ptr<TargetFidoController> Create( - const NearbyConnectionsManager* nearby_connections_manager); - - static void SetFactoryForTesting(TargetFidoControllerFactory* test_factory); - - protected: - virtual ~TargetFidoControllerFactory() = default; - virtual std::unique_ptr<TargetFidoController> CreateInstance( - const NearbyConnectionsManager* nearby_connections_manager) = 0; - - private: - static TargetFidoControllerFactory* test_factory_; -}; - -} // namespace ash::quick_start - -#endif // CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_FACTORY_H_
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.cc b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.cc deleted file mode 100644 index 19a0dad..0000000 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.cc +++ /dev/null
@@ -1,27 +0,0 @@ -// 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 "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.h" - -namespace ash::quick_start { - -TargetFidoControllerImpl::TargetFidoControllerImpl( - const NearbyConnectionsManager* nearby_connections_manager) - : nearby_connections_manager_(nearby_connections_manager) { - // TODO(jasonrhee@): Uncomment the following line after - // NearbyConnectionsManager defined. - - // CHECK(nearby_connections_manager_); -} - -TargetFidoControllerImpl::~TargetFidoControllerImpl() = default; - -void TargetFidoControllerImpl::RequestAssertion( - const std::string& challenge_bytes, - ResultCallback callback) { - // TODO(b/234655072): This is a stub and not real logic. Add the actual logic. - std::move(callback).Run(/*success=*/true); -} - -} // namespace ash::quick_start \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.h b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.h deleted file mode 100644 index ccba225..0000000 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.h +++ /dev/null
@@ -1,36 +0,0 @@ -// 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 CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_IMPL_H_ -#define CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_IMPL_H_ - -#include "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h" - -namespace ash::quick_start { - -class NearbyConnectionsManager; - -class TargetFidoControllerImpl : public TargetFidoController { - public: - using ResultCallback = TargetFidoController::ResultCallback; - - explicit TargetFidoControllerImpl( - const NearbyConnectionsManager* nearby_connections_manager); - TargetFidoControllerImpl(const TargetFidoControllerImpl&) = delete; - TargetFidoControllerImpl& operator=(const TargetFidoControllerImpl&) = delete; - ~TargetFidoControllerImpl() override; - - // TargetFidoController: - void RequestAssertion(const std::string& challenge_bytes, - ResultCallback callback) override; - - private: - // TODO(b/234655072): Remove maybe_unused tag after NearbyConnectionsManager - // defined. - [[maybe_unused]] const NearbyConnectionsManager* nearby_connections_manager_; -}; - -} // namespace ash::quick_start - -#endif // CHROMEOS_ASH_COMPONENTS_OOBE_QUICK_START_CONNECTIVITY_TARGET_FIDO_CONTROLLER_IMPL_H_ \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl_unittest.cc b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl_unittest.cc deleted file mode 100644 index ef98cee..0000000 --- a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl_unittest.cc +++ /dev/null
@@ -1,55 +0,0 @@ -// 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 "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_impl.h" - -#include "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_factory.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { -using TargetFidoController = ash::quick_start::TargetFidoController; -using TargetFidoControllerImpl = ash::quick_start::TargetFidoControllerImpl; -using NearbyConnectionsManager = ash::quick_start::NearbyConnectionsManager; - -const std::string kChallengeBytes = "testchallenge"; -} // namespace - -class TargetFidoControllerImplTest : public testing::Test { - public: - TargetFidoControllerImplTest() = default; - TargetFidoControllerImplTest(TargetFidoControllerImplTest&) = delete; - TargetFidoControllerImplTest& operator=(TargetFidoControllerImplTest&) = - delete; - ~TargetFidoControllerImplTest() override = default; - - // TODO(b/234655072): Pass in FakeNearbyConnectionsManager when available. - void SetUp() override { CreateFidoController(nullptr); } - - void CreateFidoController( - const NearbyConnectionsManager* nearby_connections_manager) { - fido_controller_ = ash::quick_start::TargetFidoControllerFactory::Create( - nearby_connections_manager); - } - - void OnRequestAssertion(bool success) { - request_assertion_callback_called_ = true; - request_assertion_success_ = success; - } - - protected: - std::unique_ptr<TargetFidoController> fido_controller_; - bool request_assertion_callback_called_ = false; - bool request_assertion_success_ = false; - base::WeakPtrFactory<TargetFidoControllerImplTest> weak_ptr_factory_{this}; -}; - -TEST_F(TargetFidoControllerImplTest, - StartGetAssertionFlow_NoNearbyConnectionsManager) { - fido_controller_->RequestAssertion( - kChallengeBytes, - base::BindOnce(&TargetFidoControllerImplTest::OnRequestAssertion, - weak_ptr_factory_.GetWeakPtr())); - EXPECT_TRUE(request_assertion_callback_called_); - EXPECT_TRUE(request_assertion_success_); -} \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_unittest.cc b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_unittest.cc new file mode 100644 index 0000000..1d8fcb5 --- /dev/null +++ b/chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller_unittest.cc
@@ -0,0 +1,131 @@ +// 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 "chromeos/ash/components/oobe_quick_start/connectivity/target_fido_controller.h" + +#include "base/json/json_reader.h" +#include "base/test/task_environment.h" +#include "base/values.h" +#include "components/cbor/reader.h" +#include "components/cbor/values.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" +#include "url/origin.h" + +namespace ash::quick_start { + +namespace { +const char kChallengeBase64Url[] = "testchallenge"; +const char kTestOrigin[] = "https://google.com"; +} // namespace + +class TargetFidoControllerTest : public testing::Test { + public: + TargetFidoControllerTest() = default; + TargetFidoControllerTest(TargetFidoControllerTest&) = delete; + TargetFidoControllerTest& operator=(TargetFidoControllerTest&) = delete; + ~TargetFidoControllerTest() override = default; + + // TODO(b/234655072): Pass in FakeNearbyConnectionsManager when available. + void SetUp() override { CreateFidoController(nullptr); } + + void CreateFidoController( + NearbyConnectionsManager* nearby_connections_manager) { + fido_controller_ = + std::make_unique<TargetFidoController>(nearby_connections_manager); + } + + void OnRequestAssertion(bool success) { + request_assertion_callback_called_ = true; + request_assertion_success_ = success; + } + + std::string CreateClientDataJson(std::string challenge_b64url, + url::Origin origin) { + return fido_controller_->CreateClientDataJson(origin, challenge_b64url); + } + + cbor::Value GenerateGetAssertionRequest(std::string challenge_b64url) { + return fido_controller_->GenerateGetAssertionRequest(challenge_b64url); + } + + std::vector<uint8_t> CBOREncodeGetAssertionRequest(cbor::Value request) { + return fido_controller_->CBOREncodeGetAssertionRequest(std::move(request)); + } + + protected: + std::unique_ptr<TargetFidoController> fido_controller_; + bool request_assertion_callback_called_ = false; + bool request_assertion_success_ = false; + base::test::SingleThreadTaskEnvironment task_environment_; + base::WeakPtrFactory<TargetFidoControllerTest> weak_ptr_factory_{this}; +}; + +TEST_F(TargetFidoControllerTest, + OnRequestAssertion_CallbackRegisteredAndCalled) { + fido_controller_->RequestAssertion( + kChallengeBase64Url, + base::BindOnce(&TargetFidoControllerTest::OnRequestAssertion, + weak_ptr_factory_.GetWeakPtr())); + EXPECT_TRUE(request_assertion_callback_called_); + EXPECT_TRUE(request_assertion_success_); +} + +TEST_F(TargetFidoControllerTest, CreateClientDataJson) { + url::Origin test_origin = url::Origin::Create(GURL(kTestOrigin)); + std::string client_data_json = + CreateClientDataJson(kChallengeBase64Url, test_origin); + absl::optional<base::Value> parsed_json = + base::JSONReader::Read(client_data_json); + ASSERT_TRUE(parsed_json); + ASSERT_TRUE(parsed_json->is_dict()); + base::Value::Dict& parsed_json_dict = parsed_json.value().GetDict(); + EXPECT_EQ(*parsed_json_dict.FindString("type"), "webauthn.get"); + EXPECT_EQ(*parsed_json_dict.FindString("challenge"), kChallengeBase64Url); + EXPECT_EQ(*parsed_json_dict.FindString("origin"), kTestOrigin); + EXPECT_EQ(parsed_json_dict.FindBool("crossOrigin"), false); +} + +TEST_F(TargetFidoControllerTest, GenerateGetAssertionRequest_ValidChallenge) { + cbor::Value request = GenerateGetAssertionRequest(kChallengeBase64Url); + ASSERT_TRUE(request.is_map()); + const cbor::Value::MapValue& request_map = request.GetMap(); + // CBOR Index 0x01 stores the relying_party_id for the GetAssertionRequest. + EXPECT_EQ(request_map.find(cbor::Value(0x01))->second.GetString(), + "google.com"); + // CBOR Index 0x05 stores the options for the GetAssertionRequest. + const cbor::Value::MapValue& options_map = + request_map.find(cbor::Value(0x05))->second.GetMap(); + // CBOR key "uv" stores the userVerification bit for the options. + EXPECT_TRUE(options_map.find(cbor::Value("uv"))->second.GetBool()); + // CBOR key "up" stores the userPresence bit for the options. + EXPECT_TRUE(options_map.find(cbor::Value("up"))->second.GetBool()); + EXPECT_TRUE( + request_map.find(cbor::Value(0x02))->second.GetBytestring().size() > 0); +} + +TEST_F(TargetFidoControllerTest, CBOREncodeGetAssertionRequest) { + cbor::Value request = GenerateGetAssertionRequest(kChallengeBase64Url); + std::vector<uint8_t> cbor_encoded_request = + CBOREncodeGetAssertionRequest(std::move(request)); + absl::optional<cbor::Value> cbor; + const base::span<const uint8_t> ctap_request_span = + base::make_span(cbor_encoded_request); + cbor = cbor::Reader::Read(ctap_request_span.subspan(1)); + ASSERT_TRUE(cbor); + ASSERT_TRUE(cbor->is_map()); + const cbor::Value::MapValue& cbor_map = cbor->GetMap(); + // CBOR Index 0x01 stores the relying_party_id for the GetAssertionRequest. + EXPECT_EQ(cbor_map.find(cbor::Value(0x01))->second.GetString(), "google.com"); +} + +TEST_F(TargetFidoControllerTest, GenerateGetAssertionReqeust_EmptyChallenge) { + fido_controller_->RequestAssertion( + "", base::BindOnce(&TargetFidoControllerTest::OnRequestAssertion, + weak_ptr_factory_.GetWeakPtr())); + EXPECT_TRUE(request_assertion_callback_called_); + EXPECT_FALSE(request_assertion_success_); +} + +} // namespace ash::quick_start \ No newline at end of file
diff --git a/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.cc b/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.cc index 0bf31bcf..714ddb5 100644 --- a/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.cc +++ b/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.cc
@@ -4,9 +4,12 @@ #include "chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h" +#include "base/bind.h" #include "base/callback_helpers.h" +#include "base/check_op.h" #include "base/notreached.h" #include "chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker_factory.h" +#include "third_party/abseil-cpp/absl/types/variant.h" namespace ash::quick_start { @@ -16,6 +19,9 @@ TargetDeviceBootstrapController::~TargetDeviceBootstrapController() = default; +TargetDeviceBootstrapController::Status::Status() = default; +TargetDeviceBootstrapController::Status::~Status() = default; + void TargetDeviceBootstrapController::AddObserver(Observer* obs) { observers_.AddObserver(obs); } @@ -34,18 +40,33 @@ void TargetDeviceBootstrapController::StartAdvertising() { DCHECK(connection_broker_->GetFeatureSupportStatus() == TargetDeviceConnectionBroker::FeatureSupportStatus::kSupported); - // TODO: Handle result callback - connection_broker_->StartAdvertising(this, base::DoNothing()); + DCHECK_EQ(status_.step, Step::NONE); + + // No pending requests. + DCHECK(!weak_ptr_factory_.HasWeakPtrs()); + + status_.step = Step::ADVERTISING; + connection_broker_->StartAdvertising( + this, + base::BindOnce(&TargetDeviceBootstrapController::OnStartAdvertisingResult, + weak_ptr_factory_.GetWeakPtr())); + NotifyObservers(); } void TargetDeviceBootstrapController::StopAdvertising() { - // TODO: Handle result callback - connection_broker_->StopAdvertising(base::DoNothing()); + DCHECK_EQ(status_.step, Step::ADVERTISING); + + // No pending requests. + DCHECK(!weak_ptr_factory_.HasWeakPtrs()); + + connection_broker_->StopAdvertising( + base::BindOnce(&TargetDeviceBootstrapController::OnStopAdvertising, + weak_ptr_factory_.GetWeakPtr())); } -void TargetDeviceBootstrapController::OnUnacceptedConnectionInitiated( +void TargetDeviceBootstrapController::OnIncomingConnectionInitiated( const std::string& source_device_id, - base::WeakPtr<TargetDeviceConnectionBroker::UnacceptedConnection> + base::WeakPtr<TargetDeviceConnectionBroker::IncomingConnection> connection) { // TODO(b/239855593): Implement NOTIMPLEMENTED(); @@ -71,4 +92,27 @@ NOTIMPLEMENTED(); } +void TargetDeviceBootstrapController::NotifyObservers() { + for (auto& obs : observers_) { + obs.OnStatusChanged(status_); + } +} + +void TargetDeviceBootstrapController::OnStartAdvertisingResult(bool success) { + DCHECK_EQ(status_.step, Step::ADVERTISING); + if (success) + return; + status_.step = Step::ERROR; + status_.payload = ErrorCode::START_ADVERTISING_FAILED; + NotifyObservers(); +} + +void TargetDeviceBootstrapController::OnStopAdvertising() { + DCHECK_EQ(status_.step, Step::ADVERTISING); + + status_.step = Step::NONE; + status_.payload.emplace<absl::monostate>(); + NotifyObservers(); +} + } // namespace ash::quick_start
diff --git a/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h b/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h index 6a85e7d..1d901d2f 100644 --- a/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h +++ b/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h
@@ -11,6 +11,7 @@ #include "base/observer_list.h" #include "base/observer_list_types.h" #include "chromeos/ash/components/oobe_quick_start/connectivity/target_device_connection_broker.h" +#include "third_party/abseil-cpp/absl/types/variant.h" namespace ash::quick_start { @@ -25,11 +26,27 @@ delete; ~TargetDeviceBootstrapController() override; + enum class Step { + NONE, + ERROR, + ADVERTISING, + }; + + enum class ErrorCode { + START_ADVERTISING_FAILED, + }; + + using Payload = absl::variant<absl::monostate, ErrorCode>; + struct Status { - // TBD. + Status(); + ~Status(); + Step step = Step::NONE; + Payload payload; }; class Observer : public base::CheckedObserver { + public: virtual void OnStatusChanged(const Status& status) = 0; protected: @@ -48,9 +65,9 @@ void StopAdvertising(); // TargetDeviceConnectionBroker::ConnectionLifecycleListener: - void OnUnacceptedConnectionInitiated( + void OnIncomingConnectionInitiated( const std::string& source_device_id, - base::WeakPtr<TargetDeviceConnectionBroker::UnacceptedConnection> + base::WeakPtr<TargetDeviceConnectionBroker::IncomingConnection> connection) override; void OnConnectionAccepted( const std::string& source_device_id, @@ -60,13 +77,20 @@ void OnConnectionClosed(const std::string& source_device_id) override; private: + void NotifyObservers(); + void OnStartAdvertisingResult(bool success); + void OnStopAdvertising(); std::unique_ptr<TargetDeviceConnectionBroker> connection_broker_; // TODO: Should we enforce one observer at a time here too? base::ObserverList<Observer> observers_; + Status status_; + base::WeakPtrFactory<TargetDeviceBootstrapController> weak_ptr_factory_for_clients_{this}; + + base::WeakPtrFactory<TargetDeviceBootstrapController> weak_ptr_factory_{this}; }; } // namespace ash::quick_start
diff --git a/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller_unittest.cc b/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller_unittest.cc index 185e6d03..207c872 100644 --- a/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller_unittest.cc +++ b/chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller_unittest.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "chromeos/ash/components/oobe_quick_start/target_device_bootstrap_controller.h" +#include <memory> #include "chromeos/ash/components/oobe_quick_start/connectivity/fake_target_device_connection_broker.h" #include "testing/gtest/include/gtest/gtest.h" @@ -17,6 +18,25 @@ ash::quick_start::FakeTargetDeviceConnectionBroker; using TargetDeviceConnectionBrokerFactory = ash::quick_start::TargetDeviceConnectionBrokerFactory; +using Observer = TargetDeviceBootstrapController::Observer; +using Status = TargetDeviceBootstrapController::Status; +using Step = TargetDeviceBootstrapController::Step; +using ErrorCode = TargetDeviceBootstrapController::ErrorCode; + +class FakeObserver : public Observer { + public: + FakeObserver() = default; + ~FakeObserver() override = default; + + void OnStatusChanged(const Status& status) override { + // Step must change. + ASSERT_NE(status.step, last_status.step); + + last_status = status; + } + + Status last_status; +}; } // namespace @@ -30,12 +50,17 @@ ~TargetDeviceBootstrapControllerTest() override = default; void SetUp() override { CreateBootstrapController(); } + void TearDown() override { + bootstrap_controller_->RemoveObserver(fake_observer_.get()); + } void CreateBootstrapController() { TargetDeviceConnectionBrokerFactory::SetFactoryForTesting( &connection_broker_factory_); bootstrap_controller_ = std::make_unique<TargetDeviceBootstrapController>(); + fake_observer_ = std::make_unique<FakeObserver>(); + bootstrap_controller_->AddObserver(fake_observer_.get()); } FakeTargetDeviceConnectionBroker* connection_broker() { @@ -45,6 +70,7 @@ protected: FakeTargetDeviceConnectionBroker::Factory connection_broker_factory_; + std::unique_ptr<FakeObserver> fake_observer_; std::unique_ptr<TargetDeviceBootstrapController> bootstrap_controller_; }; @@ -53,9 +79,32 @@ EXPECT_EQ(1u, connection_broker()->num_start_advertising_calls()); EXPECT_EQ(bootstrap_controller_.get(), connection_broker()->connection_lifecycle_listener()); + + connection_broker()->on_start_advertising_callback().Run(/*success=*/true); + EXPECT_EQ(fake_observer_->last_status.step, Step::ADVERTISING); +} + +TEST_F(TargetDeviceBootstrapControllerTest, StartAdvertisingFail) { + bootstrap_controller_->StartAdvertising(); + connection_broker()->on_start_advertising_callback().Run(/*success=*/false); + EXPECT_EQ(fake_observer_->last_status.step, Step::ERROR); + ASSERT_TRUE( + absl::holds_alternative<ErrorCode>(fake_observer_->last_status.payload)); + EXPECT_EQ(absl::get<ErrorCode>(fake_observer_->last_status.payload), + ErrorCode::START_ADVERTISING_FAILED); } TEST_F(TargetDeviceBootstrapControllerTest, StopAdvertising) { + bootstrap_controller_->StartAdvertising(); + connection_broker()->on_start_advertising_callback().Run(/*success=*/true); + ASSERT_EQ(fake_observer_->last_status.step, Step::ADVERTISING); + bootstrap_controller_->StopAdvertising(); EXPECT_EQ(1u, connection_broker()->num_stop_advertising_calls()); + + // Status changes only after the `on_stop_advertising_callback` run. + EXPECT_EQ(fake_observer_->last_status.step, Step::ADVERTISING); + + connection_broker()->on_stop_advertising_callback().Run(); + EXPECT_EQ(fake_observer_->last_status.step, Step::NONE); }
diff --git a/chromeos/components/cdm_factory_daemon/DEPS b/chromeos/components/cdm_factory_daemon/DEPS index cde472b..204d3fd 100644 --- a/chromeos/components/cdm_factory_daemon/DEPS +++ b/chromeos/components/cdm_factory_daemon/DEPS
@@ -7,4 +7,5 @@ "+media/cdm", "+media/mojo/mojom", "+ui/display", + "+ui/gfx/geometry", ]
diff --git a/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h b/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h index 828822d..75e2420 100644 --- a/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h +++ b/chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h
@@ -12,6 +12,7 @@ #include "base/callback.h" #include "media/base/cdm_context.h" #include "media/base/decryptor.h" +#include "ui/gfx/geometry/size.h" namespace media { class DecryptConfig; @@ -28,6 +29,11 @@ using GetHwKeyDataCB = base::OnceCallback<void(media::Decryptor::Status status, const std::vector<uint8_t>& key_data)>; + using GetHwConfigDataCB = + base::OnceCallback<void(bool success, + const std::vector<uint8_t>& config_data)>; + using GetScreenResolutionsCB = + base::OnceCallback<void(const std::vector<gfx::Size>& resolutions)>; // Gets the HW specific key information for the key specified in // |decrypt_config| and returns it via |callback|. @@ -35,6 +41,14 @@ const std::vector<uint8_t>& hw_identifier, GetHwKeyDataCB callback) = 0; + // Used to get hardware specific configuration data from the daemon to be used + // for setting up decrypt+decode in the GPU. + virtual void GetHwConfigData(GetHwConfigDataCB callback) = 0; + + // Used to get screen resolutions from the browser process so we can optimize + // our decode target size. + virtual void GetScreenResolutions(GetScreenResolutionsCB callback) = 0; + // Gets a CdmContextRef linked with the associated CDM for keeping it alive. virtual std::unique_ptr<media::CdmContextRef> GetCdmContextRef() = 0;
diff --git a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc index ab22a8bea..05ed5c7 100644 --- a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc +++ b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.cc
@@ -5,6 +5,7 @@ #include "chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h" #include <utility> +#include <vector> #include "base/bind.h" #include "base/logging.h" @@ -14,7 +15,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "base/unguessable_token.h" #include "chromeos/components/cdm_factory_daemon/cdm_storage_adapter.h" -#include "chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h" #include "chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h" #include "chromeos/components/cdm_factory_daemon/mojom/content_decryption_module.mojom.h" #include "media/base/content_decryption_module.h" @@ -134,6 +134,14 @@ GetHwKeyDataProxy(decrypt_config->key_id(), hw_identifier, std::move(callback)); } + void GetHwConfigData( + ChromeOsCdmContext::GetHwConfigDataCB callback) override { + ChromeOsCdmFactory::GetHwConfigData(std::move(callback)); + } + void GetScreenResolutions( + ChromeOsCdmContext::GetScreenResolutionsCB callback) override { + ChromeOsCdmFactory::GetScreenResolutions(std::move(callback)); + } std::unique_ptr<media::CdmContextRef> GetCdmContextRef() override { return std::make_unique<SingletonCdmContextRef>(this); } @@ -191,7 +199,8 @@ } // static -void ChromeOsCdmFactory::GetHwConfigData(GetHwConfigDataCB callback) { +void ChromeOsCdmFactory::GetHwConfigData( + ChromeOsCdmContext::GetHwConfigDataCB callback) { if (!GetFactoryTaskRunner()->RunsTasksInCurrentSequence()) { GetFactoryTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&ChromeOsCdmFactory::GetHwConfigData, @@ -202,7 +211,8 @@ } // static -void ChromeOsCdmFactory::GetScreenResolutions(GetScreenResolutionsCB callback) { +void ChromeOsCdmFactory::GetScreenResolutions( + ChromeOsCdmContext::GetScreenResolutionsCB callback) { if (!GetFactoryTaskRunner()->RunsTasksInCurrentSequence()) { GetFactoryTaskRunner()->PostTask( FROM_HERE, base::BindOnce(&ChromeOsCdmFactory::GetScreenResolutions,
diff --git a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h index f73e2d2..4d8d0b5 100644 --- a/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h +++ b/chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h
@@ -5,14 +5,13 @@ #ifndef CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CHROMEOS_CDM_FACTORY_H_ #define CHROMEOS_COMPONENTS_CDM_FACTORY_DAEMON_CHROMEOS_CDM_FACTORY_H_ -#include <vector> - #include "base/callback.h" #include "base/component_export.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/task/single_thread_task_runner.h" #include "build/chromeos_buildflags.h" +#include "chromeos/components/cdm_factory_daemon/chromeos_cdm_context.h" #include "chromeos/components/cdm_factory_daemon/mojom/browser_cdm_factory.mojom.h" #include "chromeos/components/cdm_factory_daemon/mojom/cdm_factory_daemon.mojom.h" #include "media/base/cdm_config.h" @@ -55,18 +54,14 @@ const media::SessionExpirationUpdateCB& session_expiration_update_cb, media::CdmCreatedCB cdm_created_cb) override; - using GetHwConfigDataCB = - base::OnceCallback<void(bool success, - const std::vector<uint8_t>& config_data)>; // Used to get hardware specific configuration data from the daemon to be used // for setting up decrypt+decode in the GPU. - static void GetHwConfigData(GetHwConfigDataCB callback); + static void GetHwConfigData(ChromeOsCdmContext::GetHwConfigDataCB callback); - using GetScreenResolutionsCB = - base::OnceCallback<void(const std::vector<gfx::Size>& resolutions)>; // Used to get screen resolutions from the browser process so we can optimize // our decode target size. - static void GetScreenResolutions(GetScreenResolutionsCB callback); + static void GetScreenResolutions( + ChromeOsCdmContext::GetScreenResolutionsCB callback); #if BUILDFLAG(IS_CHROMEOS_ASH) // Invoked in the OOP Video Decoder utility process to set the Mojo connection
diff --git a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc index ba525799..73198a9 100644 --- a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc +++ b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.cc
@@ -10,6 +10,7 @@ #include "base/memory/scoped_refptr.h" #include "base/metrics/histogram_functions.h" #include "base/time/time.h" +#include "chromeos/components/cdm_factory_daemon/chromeos_cdm_factory.h" #include "media/base/cdm_promise.h" #include "media/base/decoder_buffer.h" #include "media/base/eme_constants.h" @@ -239,6 +240,16 @@ std::move(callback)); } +void ContentDecryptionModuleAdapter::GetHwConfigData( + GetHwConfigDataCB callback) { + ChromeOsCdmFactory::GetHwConfigData(std::move(callback)); +} + +void ContentDecryptionModuleAdapter::GetScreenResolutions( + GetScreenResolutionsCB callback) { + ChromeOsCdmFactory::GetScreenResolutions(std::move(callback)); +} + std::unique_ptr<media::CdmContextRef> ContentDecryptionModuleAdapter::GetCdmContextRef() { return std::make_unique<media::CdmContextRefImpl>(base::WrapRefCounted(this));
diff --git a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h index 0ee4cc2..83e3534 100644 --- a/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h +++ b/chromeos/components/cdm_factory_daemon/content_decryption_module_adapter.h
@@ -104,6 +104,8 @@ void GetHwKeyData(const media::DecryptConfig* decrypt_config, const std::vector<uint8_t>& hw_identifier, GetHwKeyDataCB callback) override; + void GetHwConfigData(GetHwConfigDataCB callback) override; + void GetScreenResolutions(GetScreenResolutionsCB callback) override; std::unique_ptr<media::CdmContextRef> GetCdmContextRef() override; bool UsingArcCdm() const override;
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.cc b/chromeos/dbus/shill/fake_shill_manager_client.cc index 8090e97..8171447 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.cc +++ b/chromeos/dbus/shill/fake_shill_manager_client.cc
@@ -500,6 +500,45 @@ base::OnceClosure callback, ErrorCallback error_callback) {} +void FakeShillManagerClient::SetTetheringEnabled(bool enabled, + base::OnceClosure callback, + ErrorCallback error_callback) { + switch (simulate_tethering_enable_result_) { + case FakeShillSimulatedResult::kSuccess: + base::ThreadTaskRunnerHandle::Get()->PostTask(FROM_HERE, + std::move(callback)); + return; + case FakeShillSimulatedResult::kFailure: + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(error_callback), "Error", + "Simulated failure")); + return; + case FakeShillSimulatedResult::kTimeout: + // No callbacks get executed and the caller should eventually timeout. + return; + } +} + +void FakeShillManagerClient::CheckTetheringReadiness( + StringCallback callback, + ErrorCallback error_callback) { + switch (simulate_tethering_enable_result_) { + case FakeShillSimulatedResult::kSuccess: + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), + simulate_tethering_readiness_status_)); + return; + case FakeShillSimulatedResult::kFailure: + base::ThreadTaskRunnerHandle::Get()->PostTask( + FROM_HERE, base::BindOnce(std::move(error_callback), "Error", + "Simulated failure")); + return; + case FakeShillSimulatedResult::kTimeout: + // No callbacks get executed and the caller should eventually timeout. + return; + } +} + ShillManagerClient::TestInterface* FakeShillManagerClient::GetTestInterface() { return this; } @@ -800,6 +839,21 @@ simulate_configuration_result_ = configuration_result; } +void FakeShillManagerClient::SetSimulateTetheringEnableResult( + FakeShillSimulatedResult tethering_enable_result) { + simulate_tethering_enable_result_ = tethering_enable_result; +} + +void FakeShillManagerClient::SetSimulateCheckTetheringReadinessResult( + FakeShillSimulatedResult tethering_readiness_result, + const std::string& readiness_status) { + simulate_check_tethering_readiness_result_ = tethering_readiness_result; + if (simulate_check_tethering_readiness_result_ == + FakeShillSimulatedResult::kSuccess) { + simulate_tethering_readiness_status_ = readiness_status; + } +} + void FakeShillManagerClient::SetupDefaultEnvironment() { // Bail out from setup if there is no message loop. This will be the common // case for tests that are not testing Shill.
diff --git a/chromeos/dbus/shill/fake_shill_manager_client.h b/chromeos/dbus/shill/fake_shill_manager_client.h index e755660..b8e2836 100644 --- a/chromeos/dbus/shill/fake_shill_manager_client.h +++ b/chromeos/dbus/shill/fake_shill_manager_client.h
@@ -75,6 +75,11 @@ const base::Value& properties, base::OnceClosure callback, ErrorCallback error_callback) override; + void SetTetheringEnabled(bool enabled, + base::OnceClosure callback, + ErrorCallback error_callback) override; + void CheckTetheringReadiness(StringCallback callback, + ErrorCallback error_callback) override; ShillManagerClient::TestInterface* GetTestInterface() override; @@ -112,6 +117,11 @@ bool GetFastTransitionStatus() override; void SetSimulateConfigurationResult( FakeShillSimulatedResult configuration_result) override; + void SetSimulateTetheringEnableResult( + FakeShillSimulatedResult tethering_enable_result) override; + void SetSimulateCheckTetheringReadinessResult( + FakeShillSimulatedResult tethering_readiness_result, + const std::string& readiness_status) override; base::Value GetEnabledServiceList() const override; void ClearProfiles() override; void SetShouldReturnNullProperties(bool value) override; @@ -178,6 +188,11 @@ FakeShillSimulatedResult simulate_configuration_result_ = FakeShillSimulatedResult::kSuccess; + FakeShillSimulatedResult simulate_tethering_enable_result_ = + FakeShillSimulatedResult::kSuccess; + FakeShillSimulatedResult simulate_check_tethering_readiness_result_ = + FakeShillSimulatedResult::kSuccess; + std::string simulate_tethering_readiness_status_; bool return_null_properties_;
diff --git a/chromeos/dbus/shill/shill_client_unittest_base.cc b/chromeos/dbus/shill/shill_client_unittest_base.cc index 328c3c1..0744bdc8 100644 --- a/chromeos/dbus/shill/shill_client_unittest_base.cc +++ b/chromeos/dbus/shill/shill_client_unittest_base.cc
@@ -223,6 +223,15 @@ } // static +void ShillClientUnittestBase::ExpectBoolArgument(bool expected_value, + dbus::MessageReader* reader) { + bool value; + ASSERT_TRUE(reader->PopBool(&value)); + EXPECT_EQ(expected_value, value); + EXPECT_FALSE(reader->HasMoreData()); +} + +// static void ShillClientUnittestBase::ExpectArrayOfStringsArgument( const std::vector<std::string>& expected_strings, dbus::MessageReader* reader) {
diff --git a/chromeos/dbus/shill/shill_client_unittest_base.h b/chromeos/dbus/shill/shill_client_unittest_base.h index d24e075..58c67bc 100644 --- a/chromeos/dbus/shill/shill_client_unittest_base.h +++ b/chromeos/dbus/shill/shill_client_unittest_base.h
@@ -118,6 +118,10 @@ static void ExpectStringArgument(const std::string& expected_string, dbus::MessageReader* reader); + // Expects the reader to have a bool + static void ExpectBoolArgument(bool expected_value, + dbus::MessageReader* reader); + static void ExpectArrayOfStringsArgument( const std::vector<std::string>& expected_strings, dbus::MessageReader* reader);
diff --git a/chromeos/dbus/shill/shill_manager_client.cc b/chromeos/dbus/shill/shill_manager_client.cc index e6b3d8b3..f7c1d021 100644 --- a/chromeos/dbus/shill/shill_manager_client.cc +++ b/chromeos/dbus/shill/shill_manager_client.cc
@@ -201,6 +201,25 @@ std::move(error_callback)); } + void SetTetheringEnabled(bool enabled, + base::OnceClosure callback, + ErrorCallback error_callback) override { + dbus::MethodCall method_call(shill::kFlimflamManagerInterface, + shill::kSetTetheringEnabledFunction); + dbus::MessageWriter writer(&method_call); + writer.AppendBool(enabled); + helper_->CallVoidMethodWithErrorCallback(&method_call, std::move(callback), + std::move(error_callback)); + } + + void CheckTetheringReadiness(StringCallback callback, + ErrorCallback error_callback) override { + dbus::MethodCall method_call(shill::kFlimflamManagerInterface, + shill::kCheckTetheringReadinessFunction); + helper_->CallStringMethodWithErrorCallback( + &method_call, std::move(callback), std::move(error_callback)); + } + TestInterface* GetTestInterface() override { return nullptr; } void Init(dbus::Bus* bus) {
diff --git a/chromeos/dbus/shill/shill_manager_client.h b/chromeos/dbus/shill/shill_manager_client.h index 442626d..78b0471 100644 --- a/chromeos/dbus/shill/shill_manager_client.h +++ b/chromeos/dbus/shill/shill_manager_client.h
@@ -31,6 +31,7 @@ class COMPONENT_EXPORT(SHILL_CLIENT) ShillManagerClient { public: typedef ShillClientHelper::ErrorCallback ErrorCallback; + typedef ShillClientHelper::StringCallback StringCallback; struct NetworkThrottlingStatus { // Enable or disable network bandwidth throttling. @@ -123,6 +124,16 @@ virtual void SetSimulateConfigurationResult( FakeShillSimulatedResult configuration_result) = 0; + // Makes SetTetheringEnabled succeed, fail, or timeout. + virtual void SetSimulateTetheringEnableResult( + FakeShillSimulatedResult tethering_result) = 0; + + // Makes CheckTetheringReadiness succeed, fail, or timeout and the readiness + // status if CheckTetheringReadiness succeeds. + virtual void SetSimulateCheckTetheringReadinessResult( + FakeShillSimulatedResult check_readiness_result, + const std::string& readiness_status) = 0; + // Clears profile list. virtual void ClearProfiles() = 0; @@ -234,6 +245,19 @@ base::OnceClosure callback, ErrorCallback error_callback) = 0; + // Enables or disables tethering hotspot. Only supports cellular as the + // upstream technologies and WiFi as the downstream technology. + virtual void SetTetheringEnabled(bool enabled, + base::OnceClosure callback, + ErrorCallback error_callback) = 0; + + // Checks whether the upstream technology is ready to tether. Returns a status + // string indicating the readiness. Returns "allowed" if the readiness check + // is completed and upstream is ready for tethering and "not_allowed" if the + // readiness check is completed but the upstream is not ready. + virtual void CheckTetheringReadiness(StringCallback callback, + ErrorCallback error_callback) = 0; + // Returns an interface for testing (stub only), or returns null. virtual TestInterface* GetTestInterface() = 0;
diff --git a/chromeos/dbus/shill/shill_manager_client_unittest.cc b/chromeos/dbus/shill/shill_manager_client_unittest.cc index 2253e2f..d70ce1c 100644 --- a/chromeos/dbus/shill/shill_manager_client_unittest.cc +++ b/chromeos/dbus/shill/shill_manager_client_unittest.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/run_loop.h" +#include "base/test/bind.h" #include "base/test/mock_callback.h" #include "base/values.h" #include "chromeos/dbus/shill/shill_client_unittest_base.h" @@ -183,15 +184,14 @@ shill::kCheckPortalListProperty, &value), response.get()); // Call method. - base::MockCallback<base::OnceClosure> mock_closure; + base::RunLoop run_loop; base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; client_->SetProperty(shill::kCheckPortalListProperty, value, - mock_closure.Get(), mock_error_callback.Get()); - EXPECT_CALL(mock_closure, Run()).Times(1); + run_loop.QuitClosure(), mock_error_callback.Get()); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); // Run the message loop. - base::RunLoop().RunUntilIdle(); + run_loop.RunUntilIdle(); } TEST_F(ShillManagerClientTest, RequestScan) { @@ -203,15 +203,14 @@ base::BindRepeating(&ExpectStringArgument, shill::kTypeWifi), response.get()); // Call method. - base::MockCallback<base::OnceClosure> mock_closure; + base::RunLoop run_loop; base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; - client_->RequestScan(shill::kTypeWifi, mock_closure.Get(), + client_->RequestScan(shill::kTypeWifi, run_loop.QuitClosure(), mock_error_callback.Get()); - EXPECT_CALL(mock_closure, Run()).Times(1); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); // Run the message loop. - base::RunLoop().RunUntilIdle(); + run_loop.RunUntilIdle(); } TEST_F(ShillManagerClientTest, EnableTechnology) { @@ -223,15 +222,14 @@ base::BindRepeating(&ExpectStringArgument, shill::kTypeWifi), response.get()); // Call method. - base::MockCallback<base::OnceClosure> mock_closure; + base::RunLoop run_loop; base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; - client_->EnableTechnology(shill::kTypeWifi, mock_closure.Get(), + client_->EnableTechnology(shill::kTypeWifi, run_loop.QuitClosure(), mock_error_callback.Get()); - EXPECT_CALL(mock_closure, Run()).Times(1); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); // Run the message loop. - base::RunLoop().RunUntilIdle(); + run_loop.RunUntilIdle(); } TEST_F(ShillManagerClientTest, NetworkThrottling) { @@ -246,16 +244,15 @@ upload_rate, download_rate), response.get()); // Call method. - base::MockCallback<base::OnceClosure> mock_closure; + base::RunLoop run_loop; base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; - EXPECT_CALL(mock_closure, Run()).Times(1); EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); client_->SetNetworkThrottlingStatus( ShillManagerClient::NetworkThrottlingStatus{enabled, upload_rate, download_rate}, - mock_closure.Get(), mock_error_callback.Get()); - base::RunLoop().RunUntilIdle(); + run_loop.QuitClosure(), mock_error_callback.Get()); + run_loop.RunUntilIdle(); } TEST_F(ShillManagerClientTest, DisableTechnology) { @@ -330,4 +327,47 @@ base::RunLoop().RunUntilIdle(); } +TEST_F(ShillManagerClientTest, SetTetheringEnabled) { + // Create response. + std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + PrepareForMethodCall(shill::kSetTetheringEnabledFunction, + base::BindRepeating(&ExpectBoolArgument, true), + response.get()); + // Call method. + base::RunLoop run_loop; + base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; + EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); + client_->SetTetheringEnabled( + /*enabled=*/true, run_loop.QuitClosure(), mock_error_callback.Get()); + + // Run the message loop. + run_loop.RunUntilIdle(); +} + +TEST_F(ShillManagerClientTest, CheckTetheringReadiness) { + const char kReadinessResult[] = "not_ready"; + + // Create response. + std::unique_ptr<dbus::Response> response(dbus::Response::CreateEmpty()); + dbus::MessageWriter writer(response.get()); + writer.AppendString(kReadinessResult); + + // Set expectation. + PrepareForMethodCall(shill::kCheckTetheringReadinessFunction, + base::BindRepeating(&ExpectNoArgument), response.get()); + // Call method. + base::RunLoop run_loop; + base::MockCallback<ShillManagerClient::ErrorCallback> mock_error_callback; + EXPECT_CALL(mock_error_callback, Run(_, _)).Times(0); + client_->CheckTetheringReadiness( + base::BindLambdaForTesting([&](const std::string& readiness_status) { + EXPECT_EQ(kReadinessResult, readiness_status); + run_loop.QuitClosure(); + }), + mock_error_callback.Get()); + + // Run the message loop. + run_loop.RunUntilIdle(); +} + } // namespace chromeos
diff --git a/chromeos/services/network_config/cros_network_config.cc b/chromeos/services/network_config/cros_network_config.cc index 15897bc..b99af9e 100644 --- a/chromeos/services/network_config/cros_network_config.cc +++ b/chromeos/services/network_config/cros_network_config.cc
@@ -168,11 +168,19 @@ mojom::ConnectionStateType GetMojoConnectionStateType( const NetworkState* network) { if (network->IsConnectedState()) { - if (network->IsCaptivePortal()) - return mojom::ConnectionStateType::kPortal; - if (network->IsOnline()) - return mojom::ConnectionStateType::kOnline; - return mojom::ConnectionStateType::kConnected; + auto portal_state = network->GetPortalState(); + switch (portal_state) { + case NetworkState::PortalState::kUnknown: + return mojom::ConnectionStateType::kConnected; + case NetworkState::PortalState::kOnline: + return mojom::ConnectionStateType::kOnline; + case NetworkState::PortalState::kPortalSuspected: + case NetworkState::PortalState::kPortal: + case NetworkState::PortalState::kProxyAuthRequired: + case NetworkState::PortalState::kNoInternet: + // See PortalState for differentiation of portal states. + return mojom::ConnectionStateType::kPortal; + } } if (network->IsConnectingState()) return mojom::ConnectionStateType::kConnecting;
diff --git a/chromeos/strings/chromeos_strings_af.xtb b/chromeos/strings/chromeos_strings_af.xtb index 87de35cb..827eef66a 100644 --- a/chromeos/strings/chromeos_strings_af.xtb +++ b/chromeos/strings/chromeos_strings_af.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Soort</translation> <translation id="2461822463642141190">Huidig</translation> <translation id="2480034874476596812">Skakel handmatig af</translation> +<translation id="248546197012830854">Toestel is vanlyn. Koppel aan wi-fi-netwerk om hulpinhoud te sien.</translation> <translation id="2491955442992294626">Sleutels word nie getoets wanneer jy ’n ander venster gebruik nie</translation> <translation id="2493126929778606526">Jou beste foto's, outomaties gekies</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Verlaat <ph name="DEVICE_TYPE" />-herstelproses</translation> <translation id="6618744767048954150">Werk tans</translation> <translation id="6620487321149975369">Druktake sal in geskiedenis verskyn tensy hulle handmatig verwyder word</translation> +<translation id="6624819909909965616">Kan nie lêer groter as 10 MB oplaai nie</translation> <translation id="6643016212128521049">Vee uit</translation> <translation id="6644568396961840069">Lêer kon nie gestoor word nie. Probeer om by ’n ander eksterne berging in te prop, of probeer later weer.</translation> <translation id="6647510110698214773">Enkripsie-algoritme</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Fermwarehersiening</translation> <translation id="6995564396478647735">Maak seker dat Skryfbeskerming aan is</translation> +<translation id="7005833343836210400">Toestel is vanlyn</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> bestuur hierdie toestel en het toegang tot alle gebruikeraktiwiteit, insluitend webblaaie wat besoek is, wagwoorde en e-pos.</translation> <translation id="7040230719604914234">Diensverskaffer</translation> <translation id="7041549558901442110">Toestel is nie gekoppel nie.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Oorblywende batterykrag</translation> <translation id="8082366717211101304">Kan nie DNS van Android-programme af oplos nie</translation> <translation id="808894953321890993">Verander wagwoord</translation> +<translation id="8094062939584182041">Laat Google toe om vir jou ’n e-pos oor hierdie kwessie te stuur</translation> <translation id="8104083085214006426">Jy gebruik tans 'n oop en onveilige netwerk</translation> <translation id="8109786307828817014">Gaan voort met mislukte kalibrerings?</translation> <translation id="811820734797650957">(Android) Deurgang kan gepieng word</translation>
diff --git a/chromeos/strings/chromeos_strings_ar.xtb b/chromeos/strings/chromeos_strings_ar.xtb index ed039cd1..413b026a 100644 --- a/chromeos/strings/chromeos_strings_ar.xtb +++ b/chromeos/strings/chromeos_strings_ar.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">الكاميرا</translation> <translation id="1621067168122174824">تشغيل اختبار فحص البطارية</translation> <translation id="1631385268983122904">لا يمكنك تجميع الجهاز بعد.</translation> -<translation id="1639239467298939599">جارٍ التحميل.</translation> +<translation id="1639239467298939599">جارٍ التحميل</translation> <translation id="1641857168437328880">وحدة تغذية المستندات (وجه واحد)</translation> <translation id="1643449475550628585">تغيير صورة الخلفية يوميًا</translation> <translation id="1644574205037202324">السجل</translation>
diff --git a/chromeos/strings/chromeos_strings_bn.xtb b/chromeos/strings/chromeos_strings_bn.xtb index b5dc3cb..e883309d 100644 --- a/chromeos/strings/chromeos_strings_bn.xtb +++ b/chromeos/strings/chromeos_strings_bn.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">প্লে/পজ করুন</translation> <translation id="1201402288615127009">পরের</translation> <translation id="1204296502688602597">ডিএনএস লেটেন্সি</translation> +<translation id="1207734034680156868">আপনার বিবরণের ভিত্তিতে সাজেশন দেখানো হয়</translation> <translation id="123124571410524056">পোর্টাল হতে পারে</translation> <translation id="1236400083787698183">রিস্টার্ট করার আগে, আপনার ডিভাইস পাওয়ারওয়াশ করুন। আপনার ডিভাইসে লিড থাকলে, লিড বন্ধ করার আগে পাওয়ারওয়াশ সম্পূর্ণ না হওয়া পর্যন্ত অপেক্ষা করুন। পাওয়ারওয়াশ সম্পূর্ণ হতে এক মিনিট পর্যন্ত সময় লাগতে পারে।</translation> <translation id="1238612778414822719">HTTPS লেটেন্সি</translation>
diff --git a/chromeos/strings/chromeos_strings_bs.xtb b/chromeos/strings/chromeos_strings_bs.xtb index 4a1f672d..ef4d4e9c 100644 --- a/chromeos/strings/chromeos_strings_bs.xtb +++ b/chromeos/strings/chromeos_strings_bs.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">Pokretanje/pauziranje</translation> <translation id="1201402288615127009">Naprijed</translation> <translation id="1204296502688602597">Latentnost DNS-a</translation> +<translation id="1207734034680156868">Prijedlozi se temelje na vašem opisu</translation> <translation id="123124571410524056">Sumnja na portal</translation> <translation id="1236400083787698183">Prije ponovnog pokretanja, pokrenite Powerwash na uređaju. Ako uređaj ima poklopac, nemojte ga zatvarati dok se Powerwash ne završi. Powerwash može potrajati do jedne minute.</translation> <translation id="1238612778414822719">HTTPs latentnost</translation>
diff --git a/chromeos/strings/chromeos_strings_da.xtb b/chromeos/strings/chromeos_strings_da.xtb index 6bba6cc0..dfd87e37 100644 --- a/chromeos/strings/chromeos_strings_da.xtb +++ b/chromeos/strings/chromeos_strings_da.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1621067168122174824">Kør opladningstest</translation> <translation id="1631385268983122904">Du skal ikke samle enheden endnu.</translation> -<translation id="1639239467298939599">Indlæser...</translation> +<translation id="1639239467298939599">Indlæser</translation> <translation id="1641857168437328880">Dokumentindføring (én side)</translation> <translation id="1643449475550628585">Skift baggrundsbillede dagligt</translation> <translation id="1644574205037202324">Historik</translation>
diff --git a/chromeos/strings/chromeos_strings_de.xtb b/chromeos/strings/chromeos_strings_de.xtb index 80a9585..61cba64 100644 --- a/chromeos/strings/chromeos_strings_de.xtb +++ b/chromeos/strings/chromeos_strings_de.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1621067168122174824">Ladetest ausführen</translation> <translation id="1631385268983122904">Bitte setze den Akku bzw. die Batterie(n) noch nicht wieder ein</translation> -<translation id="1639239467298939599">Wird geladen...</translation> +<translation id="1639239467298939599">Wird geladen</translation> <translation id="1641857168437328880">Dokumenteneinzug (einseitig)</translation> <translation id="1643449475550628585">Hintergrundbild täglich ändern</translation> <translation id="1644574205037202324">Verlauf</translation> @@ -197,6 +197,7 @@ <translation id="2448312741937722512">Art</translation> <translation id="2461822463642141190">Aktuell</translation> <translation id="2480034874476596812">Manuell deaktivieren</translation> +<translation id="248546197012830854">Das Gerät ist offline. Stelle eine WLAN-Verbindung her, um Hilfeinhalte zu sehen.</translation> <translation id="2491955442992294626">Tasten werden nicht getestet, wenn du ein anderes Fenster verwendest</translation> <translation id="2493126929778606526">Meine besten automatisch ausgewählten Fotos</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149"><ph name="DEVICE_TYPE" />-Reparatur beenden</translation> <translation id="6618744767048954150">Läuft</translation> <translation id="6620487321149975369">Druckaufträge erscheinen im Verlauf, solange sie nicht manuell gelöscht werden</translation> +<translation id="6624819909909965616">Dateien mit einer Größe von 10 MB oder mehr können nicht hochgeladen werden</translation> <translation id="6643016212128521049">Löschen</translation> <translation id="6644568396961840069">Die Datei konnte nicht gespeichert werden. Schließ einen anderen externen Speicher an oder versuch es später noch einmal.</translation> <translation id="6647510110698214773">Verschlüsselungsalgorithmus</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">Ok</translation> <translation id="6977381486153291903">Firmware-Version</translation> <translation id="6995564396478647735">Der Schreibschutz muss aktiviert sein</translation> +<translation id="7005833343836210400">Das Gerät ist offline</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> verwaltet dieses Gerät und hat Zugriff auf alle Nutzeraktivitäten, einschließlich besuchter Webseiten, Passwörter und E-Mails.</translation> <translation id="7040230719604914234">Operator</translation> <translation id="7041549558901442110">Das Gerät ist nicht verbunden.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Akkustand</translation> <translation id="8082366717211101304">Auflösen des DNS von Android-Apps aus nicht möglich</translation> <translation id="808894953321890993">Passwort ändern</translation> +<translation id="8094062939584182041">Zulassen, dass Google dir eine E-Mail zu diesem Problem sendet</translation> <translation id="8104083085214006426">Du verwendest ein offenes und unsicheres Netzwerk</translation> <translation id="8109786307828817014">Trotz fehlgeschlagener Kalibrierung fortfahren?</translation> <translation id="811820734797650957">(Android) Gateway kann kontaktiert werden</translation>
diff --git a/chromeos/strings/chromeos_strings_el.xtb b/chromeos/strings/chromeos_strings_el.xtb index 84c5106..fb6ff28 100644 --- a/chromeos/strings/chromeos_strings_el.xtb +++ b/chromeos/strings/chromeos_strings_el.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Κάμερα</translation> <translation id="1621067168122174824">Εκτέλεση δοκιμής φόρτισης</translation> <translation id="1631385268983122904">Μην συναρμολογήσετε τη συσκευή ακόμα</translation> -<translation id="1639239467298939599">Γίνεται φόρτωση</translation> +<translation id="1639239467298939599">Φόρτωση</translation> <translation id="1641857168437328880">Τροφοδότης εγγράφων (Μίας όψης)</translation> <translation id="1643449475550628585">Καθημερινή αλλαγή εικόνας ταπετσαρίας</translation> <translation id="1644574205037202324">Ιστορικό</translation>
diff --git a/chromeos/strings/chromeos_strings_en-GB.xtb b/chromeos/strings/chromeos_strings_en-GB.xtb index d9aa8bb..75e34b9 100644 --- a/chromeos/strings/chromeos_strings_en-GB.xtb +++ b/chromeos/strings/chromeos_strings_en-GB.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">Play/Pause</translation> <translation id="1201402288615127009">Next</translation> <translation id="1204296502688602597">DNS latency</translation> +<translation id="1207734034680156868">Suggestions are based on your description</translation> <translation id="123124571410524056">Portal suspected</translation> <translation id="1236400083787698183">Before restarting, Powerwash your device. If your device has a lid, wait until Powerwash completes before closing the lid. Powerwash may take up to a minute to complete.</translation> <translation id="1238612778414822719">HTTPS latency</translation>
diff --git a/chromeos/strings/chromeos_strings_fa.xtb b/chromeos/strings/chromeos_strings_fa.xtb index 85dae8b..4876136 100644 --- a/chromeos/strings/chromeos_strings_fa.xtb +++ b/chromeos/strings/chromeos_strings_fa.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">دوربین</translation> <translation id="1621067168122174824">اجرای آزمایش شارژ</translation> <translation id="1631385268983122904">هنوز دستگاه را سرهم نکنید</translation> -<translation id="1639239467298939599">بارگیری</translation> +<translation id="1639239467298939599">در حال بارگیری</translation> <translation id="1641857168437328880">تغذیهکننده سند (یکرو)</translation> <translation id="1643449475550628585">تغییر روزانه کاغذدیواری</translation> <translation id="1644574205037202324">سابقه</translation>
diff --git a/chromeos/strings/chromeos_strings_fr.xtb b/chromeos/strings/chromeos_strings_fr.xtb index 9de4a1d..3ba9a2f 100644 --- a/chromeos/strings/chromeos_strings_fr.xtb +++ b/chromeos/strings/chromeos_strings_fr.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Caméra</translation> <translation id="1621067168122174824">Lancer le test de recharge</translation> <translation id="1631385268983122904">Ne réassemblez pas encore l'appareil</translation> -<translation id="1639239467298939599">Chargement en cours</translation> +<translation id="1639239467298939599">Chargement en cours…</translation> <translation id="1641857168437328880">Chargeur de document (recto)</translation> <translation id="1643449475550628585">Modifier le fond d'écran tous les jours</translation> <translation id="1644574205037202324">Historique</translation>
diff --git a/chromeos/strings/chromeos_strings_gu.xtb b/chromeos/strings/chromeos_strings_gu.xtb index 27bccac12..a9e929ea 100644 --- a/chromeos/strings/chromeos_strings_gu.xtb +++ b/chromeos/strings/chromeos_strings_gu.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">કૅમેરા</translation> <translation id="1621067168122174824">ચાર્જિંગનું પરીક્ષણ ચાલુ કરો</translation> <translation id="1631385268983122904">ડિવાઇસને હમણાં પાછું જોડશો નહીં</translation> -<translation id="1639239467298939599">લોડ કરી રહ્યું છે</translation> +<translation id="1639239467298939599">લોડ થઇ રહી છે</translation> <translation id="1641857168437328880">દસ્તાવેજનું ફીડર (એક બાજુથી)</translation> <translation id="1643449475550628585">વૉલપેપરની છબી દરરોજ બદલો</translation> <translation id="1644574205037202324">ઇતિહાસ</translation>
diff --git a/chromeos/strings/chromeos_strings_hi.xtb b/chromeos/strings/chromeos_strings_hi.xtb index 60417c7..41162fbf 100644 --- a/chromeos/strings/chromeos_strings_hi.xtb +++ b/chromeos/strings/chromeos_strings_hi.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">कैमरा</translation> <translation id="1621067168122174824">चार्ज टेस्ट चलाएं</translation> <translation id="1631385268983122904">डिवाइस में अभी बैटरी न लगाएं</translation> -<translation id="1639239467298939599">लोड हो रहा है</translation> +<translation id="1639239467298939599">लोड हो रही है</translation> <translation id="1641857168437328880">डॉक्यूमेंट फ़ीडर (एक तरफ़ वाला)</translation> <translation id="1643449475550628585">वॉलपेपर रोज़ बदलें</translation> <translation id="1644574205037202324">इतिहास</translation>
diff --git a/chromeos/strings/chromeos_strings_hr.xtb b/chromeos/strings/chromeos_strings_hr.xtb index 7b8215f9..8619f0f 100644 --- a/chromeos/strings/chromeos_strings_hr.xtb +++ b/chromeos/strings/chromeos_strings_hr.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">Reprodukcija/pauza</translation> <translation id="1201402288615127009">Dalje</translation> <translation id="1204296502688602597">Latencija DNS-a</translation> +<translation id="1207734034680156868">Prijedlozi se temelje na vašem opisu</translation> <translation id="123124571410524056">Moguć je portal</translation> <translation id="1236400083787698183">Prije ponovnog pokretanja vratite uređaj na tvorničke postavke (Powerwash). Ako uređaj ima poklopac, pričekajte da se vraćanje na tvorničke postavke dovrši prije nego što zatvorite poklopac. Vraćanje na tvorničke postavke može potrajati do jedne minute.</translation> <translation id="1238612778414822719">Latencija HTTPS-a</translation>
diff --git a/chromeos/strings/chromeos_strings_ja.xtb b/chromeos/strings/chromeos_strings_ja.xtb index f330602..498f2b91 100644 --- a/chromeos/strings/chromeos_strings_ja.xtb +++ b/chromeos/strings/chromeos_strings_ja.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">カメラ</translation> <translation id="1621067168122174824">充電テストを実行</translation> <translation id="1631385268983122904">まだデバイスを組み立てないでください</translation> -<translation id="1639239467298939599">読み込み中</translation> +<translation id="1639239467298939599">読み込んでいます</translation> <translation id="1641857168437328880">ドキュメント フィーダー(片面)</translation> <translation id="1643449475550628585">壁紙画像を毎日変更する</translation> <translation id="1644574205037202324">履歴</translation>
diff --git a/chromeos/strings/chromeos_strings_ka.xtb b/chromeos/strings/chromeos_strings_ka.xtb index ac4f0a0..df11414 100644 --- a/chromeos/strings/chromeos_strings_ka.xtb +++ b/chromeos/strings/chromeos_strings_ka.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">დაკვრა/პაუზა</translation> <translation id="1201402288615127009">შემდეგი</translation> <translation id="1204296502688602597">DNS-ის რეაგირების დრო</translation> +<translation id="1207734034680156868">შემოთავაზებები ეფუძნება თქვენს აღწერილობას</translation> <translation id="123124571410524056">სავარაუდოდ, გამოიყენება პორტალი</translation> <translation id="1236400083787698183">გადატვირთვამდე შეასრულეთ თქვენი მოწყობილობის powerwash. თუ თქვენს მოწყობილობას თავსახური აქვს, სანამ მას დაახურავთ, დაელოდეთ powerwash-ის დასრულებას. Powerwash-ის დასრულებას დაახლოებით ერთი წუთი დასჭირდება.</translation> <translation id="1238612778414822719">HTTPS რეაგირების დრო</translation>
diff --git a/chromeos/strings/chromeos_strings_mr.xtb b/chromeos/strings/chromeos_strings_mr.xtb index cddeaa6..1850599f 100644 --- a/chromeos/strings/chromeos_strings_mr.xtb +++ b/chromeos/strings/chromeos_strings_mr.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">कॅमेरा</translation> <translation id="1621067168122174824">चार्ज चाचणी रन करा</translation> <translation id="1631385268983122904">अद्याप डिव्हाइस परत एकत्र करू नका</translation> -<translation id="1639239467298939599">लोड करीत आहे</translation> +<translation id="1639239467298939599">लोड करत आहे</translation> <translation id="1641857168437328880">दस्तऐवज फीडर (एक बाजू असलेले)</translation> <translation id="1643449475550628585">वॉलपेपर इमेज रोज बदला</translation> <translation id="1644574205037202324">इतिहास</translation>
diff --git a/chromeos/strings/chromeos_strings_ms.xtb b/chromeos/strings/chromeos_strings_ms.xtb index 3be3c1f..4976093f 100644 --- a/chromeos/strings/chromeos_strings_ms.xtb +++ b/chromeos/strings/chromeos_strings_ms.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">Mainkan/Jeda</translation> <translation id="1201402288615127009">Seterusnya</translation> <translation id="1204296502688602597">Kependaman DNS</translation> +<translation id="1207734034680156868">Cadangan adalah berdasarkan penerangan anda</translation> <translation id="123124571410524056">Portal disyaki</translation> <translation id="1236400083787698183">Sebelum memulakan semula, Powerwash peranti anda. Jika peranti anda mempunyai penutup, tunggu sehingga Powerwash selesai sebelum mengenakan penutup. Powerwash mungkin mengambil masa hingga seminit untuk selesai.</translation> <translation id="1238612778414822719">Kependaman HTTPS</translation>
diff --git a/chromeos/strings/chromeos_strings_ne.xtb b/chromeos/strings/chromeos_strings_ne.xtb index c1af4784..0049847 100644 --- a/chromeos/strings/chromeos_strings_ne.xtb +++ b/chromeos/strings/chromeos_strings_ne.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">प्ले/पज</translation> <translation id="1201402288615127009">अर्को</translation> <translation id="1204296502688602597">DNS को विलम्बता</translation> +<translation id="1207734034680156868">सुझावहरू तपाईंको वर्णनमा आधारित हुन्छन्</translation> <translation id="123124571410524056">पोर्टलका कारणले हुन सक्छ</translation> <translation id="1236400083787698183">आफ्नो डिभाइस रिस्टार्ट गर्नुअघि सो डिभाइस पावरवास गर्नुहोस्। तपाईंको डिभाइसको कभर छ भने पावरवास गर्ने कार्य पूरा भएपछि मात्र उक्त कभर लगाउनुहोस्। पावरवास गर्ने कार्य पूरा हुन एक मिनेटसम्म लाग्न सक्छ।</translation> <translation id="1238612778414822719">HTTPS को विलम्बता</translation>
diff --git a/chromeos/strings/chromeos_strings_pa.xtb b/chromeos/strings/chromeos_strings_pa.xtb index 5d9128f..5b5edb3d 100644 --- a/chromeos/strings/chromeos_strings_pa.xtb +++ b/chromeos/strings/chromeos_strings_pa.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">ਚਲਾਓ/ਰੋਕੋ</translation> <translation id="1201402288615127009">ਅੱਗੇ</translation> <translation id="1204296502688602597">DNS ਵਿਲੰਬਤਾ</translation> +<translation id="1207734034680156868">ਸੁਝਾਅ ਤੁਹਾਡੇ ਵਰਣਨ 'ਤੇ ਆਧਾਰਿਤ ਹਨ</translation> <translation id="123124571410524056">ਪੋਰਟਲ 'ਤੇ ਸ਼ੱਕ ਹੈ</translation> <translation id="1236400083787698183">ਮੁੜ-ਸ਼ੁਰੂ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ, ਆਪਣੇ ਡੀਵਾਈਸ ਨੂੰ ਪਾਵਰਵਾਸ਼ ਕਰੋ। ਜੇ ਤੁਹਾਡੇ ਡੀਵਾਈਸ ਵਿੱਚ ਲਿਡ ਹੈ, ਤਾਂ ਲਿਡ ਨੂੰ ਬੰਦ ਕਰਨ ਤੋਂ ਪਹਿਲਾਂ ਪਾਵਰਵਾਸ਼ ਦੇ ਪੂਰੇ ਹੋਣ ਦੀ ਉਡੀਕ ਕਰੋ। ਪਾਵਰਵਾਸ਼ ਨੂੰ ਪੂਰਾ ਹੋਣ ਵਿੱਚ ਇੱਕ ਮਿੰਟ ਤੱਕ ਦਾ ਸਮਾਂ ਲੱਗ ਸਕਦਾ ਹੈ।</translation> <translation id="1238612778414822719">HTTPS ਵਿਲੰਬਤਾ</translation>
diff --git a/chromeos/strings/chromeos_strings_pt-PT.xtb b/chromeos/strings/chromeos_strings_pt-PT.xtb index 1a51af4..f95266a7 100644 --- a/chromeos/strings/chromeos_strings_pt-PT.xtb +++ b/chromeos/strings/chromeos_strings_pt-PT.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">Reproduzir/pausar</translation> <translation id="1201402288615127009">Seguinte</translation> <translation id="1204296502688602597">Latência de DNS</translation> +<translation id="1207734034680156868">As sugestões baseiam-se na sua descrição</translation> <translation id="123124571410524056">Portal suspeito</translation> <translation id="1236400083787698183">Antes de reiniciar, faça um Powerwash ao seu dispositivo. Se o seu dispositivo tiver tampa, aguarde pela conclusão do Powerwash antes de a fechar. A conclusão do Powerwash poderá demorar até um minuto.</translation> <translation id="1238612778414822719">Latência de HTTPS</translation> @@ -86,7 +87,7 @@ <translation id="1620510694547887537">Câmara</translation> <translation id="1621067168122174824">Executar teste de carregamento</translation> <translation id="1631385268983122904">Não monte já o dispositivo</translation> -<translation id="1639239467298939599">A carregar</translation> +<translation id="1639239467298939599">A carregar…</translation> <translation id="1641857168437328880">Alimentador de documentos (um lado)</translation> <translation id="1643449475550628585">Alterar imagem de fundo diariamente</translation> <translation id="1644574205037202324">Histórico</translation>
diff --git a/chromeos/strings/chromeos_strings_ru.xtb b/chromeos/strings/chromeos_strings_ru.xtb index f4ad7a4..9eab5482 100644 --- a/chromeos/strings/chromeos_strings_ru.xtb +++ b/chromeos/strings/chromeos_strings_ru.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1621067168122174824">Запустить проверку зарядки</translation> <translation id="1631385268983122904">Пока не собирайте устройство</translation> -<translation id="1639239467298939599">Загрузка</translation> +<translation id="1639239467298939599">Загрузка…</translation> <translation id="1641857168437328880">Автоподатчик документов (односторонний)</translation> <translation id="1643449475550628585">Менять обои ежедневно</translation> <translation id="1644574205037202324">История</translation>
diff --git a/chromeos/strings/chromeos_strings_sk.xtb b/chromeos/strings/chromeos_strings_sk.xtb index 8b2f99e..bea02bd 100644 --- a/chromeos/strings/chromeos_strings_sk.xtb +++ b/chromeos/strings/chromeos_strings_sk.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1621067168122174824">Spustiť test nabitia</translation> <translation id="1631385268983122904">Zariadenie zatiaľ znova neskladajte</translation> -<translation id="1639239467298939599">Prebieha načítavanie</translation> +<translation id="1639239467298939599">Načítava sa</translation> <translation id="1641857168437328880">Podávač dokumentov (jednostranný)</translation> <translation id="1643449475550628585">Denne meniť obrázok tapety</translation> <translation id="1644574205037202324">História</translation>
diff --git a/chromeos/strings/chromeos_strings_sr-Latn.xtb b/chromeos/strings/chromeos_strings_sr-Latn.xtb index 93e271b..b082b28 100644 --- a/chromeos/strings/chromeos_strings_sr-Latn.xtb +++ b/chromeos/strings/chromeos_strings_sr-Latn.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1621067168122174824">Pokreni test punjenja</translation> <translation id="1631385268983122904">Još ne sastavljajte uređaj</translation> -<translation id="1639239467298939599">Učitavanje</translation> +<translation id="1639239467298939599">Učitava se</translation> <translation id="1641857168437328880">Uvlačenje dokumenta (jednostrano)</translation> <translation id="1643449475550628585">Menjajte sliku pozadine svakog dana</translation> <translation id="1644574205037202324">Istorija</translation>
diff --git a/chromeos/strings/chromeos_strings_sr.xtb b/chromeos/strings/chromeos_strings_sr.xtb index a873e032..859fb99 100644 --- a/chromeos/strings/chromeos_strings_sr.xtb +++ b/chromeos/strings/chromeos_strings_sr.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Камера</translation> <translation id="1621067168122174824">Покрени тест пуњења</translation> <translation id="1631385268983122904">Још не састављајте уређај</translation> -<translation id="1639239467298939599">Учитавање</translation> +<translation id="1639239467298939599">Учитава се</translation> <translation id="1641857168437328880">Увлачење документа (једнострано)</translation> <translation id="1643449475550628585">Мењајте слику позадине сваког дана</translation> <translation id="1644574205037202324">Историја</translation>
diff --git a/chromeos/strings/chromeos_strings_sv.xtb b/chromeos/strings/chromeos_strings_sv.xtb index 5b72a49..1f81ce45 100644 --- a/chromeos/strings/chromeos_strings_sv.xtb +++ b/chromeos/strings/chromeos_strings_sv.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">Kamera</translation> <translation id="1621067168122174824">Kör laddningstest</translation> <translation id="1631385268983122904">Sätt inte tillbaka batteriet i enheten än</translation> -<translation id="1639239467298939599">Läser in</translation> +<translation id="1639239467298939599">Profilen läses in</translation> <translation id="1641857168437328880">Dokumentmatare (ensidig)</translation> <translation id="1643449475550628585">Byt bakgrundsbild varje dag</translation> <translation id="1644574205037202324">Historik</translation>
diff --git a/chromeos/strings/chromeos_strings_te.xtb b/chromeos/strings/chromeos_strings_te.xtb index e53b7ab..259e3f4 100644 --- a/chromeos/strings/chromeos_strings_te.xtb +++ b/chromeos/strings/chromeos_strings_te.xtb
@@ -86,7 +86,7 @@ <translation id="1620510694547887537">కెమెరా</translation> <translation id="1621067168122174824">ఛార్జ్ పరీక్షను రన్ చేయండి</translation> <translation id="1631385268983122904">ఇప్పుడే పరికరాన్ని అసెంబుల్ చేయవద్దు</translation> -<translation id="1639239467298939599">లోడ్ అవుతోంది</translation> +<translation id="1639239467298939599">లోడ్ చేస్తోంది</translation> <translation id="1641857168437328880">డాక్యుమెంట్ ఫీడర్ (ఒక వైపున)</translation> <translation id="1643449475550628585">ప్రతిరోజూ వాల్పేపర్ ఇమేజ్ను మార్చండి</translation> <translation id="1644574205037202324">హిస్టరీ</translation> @@ -273,7 +273,7 @@ <translation id="3336855445806447827">ఖచ్చితంగా తెలియదు</translation> <translation id="3340011300870565703">పరికరంలో కుడి వైపు బడ్ బ్యాటరీ స్థాయి <ph name="BATTERY_PERCENTAGE" />% ఉంది.</translation> <translation id="3368922792935385530">కనెక్ట్ అయింది</translation> -<translation id="3369013195428705271">మీరు ఖచ్చితంగా ప్రింట్ చరిత్ర మొత్తాన్ని క్లియర్ చేయాలనుకుంటున్నారా? మీ కొనసాగుతున్న ప్రింట్ టాస్క్లు క్లియర్ చేయబడవు.</translation> +<translation id="3369013195428705271">మీరు ఖచ్చితంగా ప్రింట్ హిస్టరీ మొత్తాన్ని క్లియర్ చేయాలనుకుంటున్నారా? మీ కొనసాగుతున్న ప్రింట్ టాస్క్లు క్లియర్ చేయబడవు.</translation> <translation id="3383751554789092165">అవసరానికి తగినట్లు పరికర సమాచారాన్ని మార్చండి.</translation> <translation id="3404249063913988450">స్క్రీన్ సేవర్ను ఎనేబుల్ చేయి</translation> <translation id="3413935475507503304">అప్డేట్ చేయడాన్ని కొనసాగించడానికి, 'తర్వాత'ను క్లిక్ చేయండి.</translation> @@ -320,7 +320,7 @@ <translation id="3771294271822695279">వీడియో ఫైళ్లు</translation> <translation id="3774059845329307709">సీరియల్ నంబర్</translation> <translation id="3784455785234192852">లాక్ చేయి</translation> -<translation id="38114475217616659">చరిత్ర మొత్తాన్ని క్లియర్ చేయండి</translation> +<translation id="38114475217616659">హిస్టరీ మొత్తాన్ని క్లియర్ చేయండి</translation> <translation id="3820172043799983114">PIN చెల్లదు.</translation> <translation id="3824259034819781947">ఫైల్స్ను జోడించండి</translation> <translation id="3838338534323494292">కొత్త పాస్వర్డ్</translation>
diff --git a/chromeos/strings/chromeos_strings_vi.xtb b/chromeos/strings/chromeos_strings_vi.xtb index 0e64e32..2c8042be 100644 --- a/chromeos/strings/chromeos_strings_vi.xtb +++ b/chromeos/strings/chromeos_strings_vi.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">Phát/tạm dừng</translation> <translation id="1201402288615127009">Tiếp theo</translation> <translation id="1204296502688602597">Độ trễ DNS</translation> +<translation id="1207734034680156868">Nội dung đề xuất được đưa ra dựa trên nội dung mô tả của bạn</translation> <translation id="123124571410524056">Nghi là có cổng</translation> <translation id="1236400083787698183">Trước khi bắt đầu, hãy thực hiện chức năng Powerwash cho thiết bị. Nếu thiết bị có nắp, hãy đợi cho đến khi quá trình Powerwash hoàn tất trước khi đóng nắp. Quá trình Powerwash có thể mất tối đa một phút để hoàn tất.</translation> <translation id="1238612778414822719">Độ trễ HTTPS</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-CN.xtb b/chromeos/strings/chromeos_strings_zh-CN.xtb index f8937cf..cb23ab8 100644 --- a/chromeos/strings/chromeos_strings_zh-CN.xtb +++ b/chromeos/strings/chromeos_strings_zh-CN.xtb
@@ -27,6 +27,7 @@ <translation id="1199355487114804640">播放/暂停</translation> <translation id="1201402288615127009">下一步</translation> <translation id="1204296502688602597">DNS 延迟时间</translation> +<translation id="1207734034680156868">建议是根据您的说明提供的</translation> <translation id="123124571410524056">疑似存在门户</translation> <translation id="1236400083787698183">请先对您的设备执行 Powerwash 操作,然后再重启。如果您的设备配有盖子,请等到 Powerwash 完成后再合上盖子。Powerwash 最多可能需要 1 分钟才能完成。</translation> <translation id="1238612778414822719">HTTPS 延迟</translation>
diff --git a/chromeos/strings/chromeos_strings_zh-HK.xtb b/chromeos/strings/chromeos_strings_zh-HK.xtb index b0bd4850..1ad8e83 100644 --- a/chromeos/strings/chromeos_strings_zh-HK.xtb +++ b/chromeos/strings/chromeos_strings_zh-HK.xtb
@@ -197,7 +197,7 @@ <translation id="2448312741937722512">類型</translation> <translation id="2461822463642141190">電流</translation> <translation id="2480034874476596812">手動關閉</translation> -<translation id="248546197012830854">裝置處於離線狀態。連線至 Wi-Fi 網路即可查看說明內容。</translation> +<translation id="248546197012830854">裝置已離線。連線至 Wi-Fi 網絡即可查看說明內容。</translation> <translation id="2491955442992294626">使用其他視窗時,系統不會測試按鍵</translation> <translation id="2493126929778606526">自動選取的最佳相片</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -662,7 +662,7 @@ <translation id="6611280807952151149">結束 <ph name="DEVICE_TYPE" /> 維修程序</translation> <translation id="6618744767048954150">正在執行</translation> <translation id="6620487321149975369">除非您手動移除列印工作,否則列印工作會顯示在記錄中</translation> -<translation id="6624819909909965616">無法上傳超過 10 MB 的檔案</translation> +<translation id="6624819909909965616">無法上載大小超過 10 MB 的檔案</translation> <translation id="6643016212128521049">清除</translation> <translation id="6644568396961840069">無法儲存檔案。請插入其他外部儲存空間,或稍後再試。</translation> <translation id="6647510110698214773">加密演算法</translation> @@ -698,7 +698,7 @@ <translation id="6965382102122355670">確定</translation> <translation id="6977381486153291903">韌體版本</translation> <translation id="6995564396478647735">確認已開啟「寫入保護」功能</translation> -<translation id="7005833343836210400">裝置處於離線狀態</translation> +<translation id="7005833343836210400">裝置已離線</translation> <translation id="7028979494427204405"><ph name="MANAGER" /> 會管理此裝置並可存取所有使用者活動,包括網頁瀏覽記錄、密碼和電郵。</translation> <translation id="7040230719604914234">流動網絡供應商</translation> <translation id="7041549558901442110">未連接裝置。</translation> @@ -812,7 +812,7 @@ <translation id="8075838845814659848">剩餘電量</translation> <translation id="8082366717211101304">無法從 Android 應用程式解析 DNS</translation> <translation id="808894953321890993">變更密碼</translation> -<translation id="8094062939584182041">允許 Google 透過電子郵件通知你這個問題的相關資訊</translation> +<translation id="8094062939584182041">允許 Google 就此問題向您傳送電郵</translation> <translation id="8104083085214006426">您正在使用開放且不安全的網絡</translation> <translation id="8109786307828817014">要使用無法校正的組件繼續操作嗎?</translation> <translation id="811820734797650957">(Android) 可連線偵測到閘道</translation>
diff --git a/chromeos/strings/chromeos_strings_zu.xtb b/chromeos/strings/chromeos_strings_zu.xtb index 53a7a16..501d3175 100644 --- a/chromeos/strings/chromeos_strings_zu.xtb +++ b/chromeos/strings/chromeos_strings_zu.xtb
@@ -197,6 +197,7 @@ <translation id="2448312741937722512">Uhlobo</translation> <translation id="2461822463642141190">Okwamanje</translation> <translation id="2480034874476596812">Vala ngokuzenzela</translation> +<translation id="248546197012830854">Idivayisi ayixhunyiwe ku-inthanethi. Xhuma kunethiwekhi ye-Wi-Fi ukuze ubone okuqukethwe kosizo.</translation> <translation id="2491955442992294626">Okhiye abahlolwa uma usebenzisa elinye iwindi</translation> <translation id="2493126929778606526">Izithombe zakho ezingcono kakhulu, zikhethwe ngokuzenzakalelayo</translation> <translation id="249323605434939166"><ph name="QUERY_TEXT" /> · <ph name="SOURCE_LANGUAGE_NAME" /></translation> @@ -661,6 +662,7 @@ <translation id="6611280807952151149">Phuma ekulungiseni i-<ph name="DEVICE_TYPE" /></translation> <translation id="6618744767048954150">Uyagijima</translation> <translation id="6620487321149975369">Imisebenzi yokuphrinta izovela emlandweni ngaphandle kwalapho uma isuswe mathupha</translation> +<translation id="6624819909909965616">Ayikwazi ukulayisha ifayela elikhulu kuno-10 MB</translation> <translation id="6643016212128521049">Sula</translation> <translation id="6644568396961840069">Ifayela alilondolozwanga. Zama ukuxhuma isitoreji sangaphandle esihlukile, noma uzame futhi ngokuhamba kwesikhathi.</translation> <translation id="6647510110698214773">Ukubethela i-algorithm</translation> @@ -696,6 +698,7 @@ <translation id="6965382102122355670">OK</translation> <translation id="6977381486153291903">Isibuyekezo se-firmware</translation> <translation id="6995564396478647735">Qiniseka ukuthi i-Write Protect ivuliwe</translation> +<translation id="7005833343836210400">Idivayisi ayixhunyiwe ku-inthanethi</translation> <translation id="7028979494427204405">I-<ph name="MANAGER" /> iphatha le divayisi futhi inokufinyelela kuwo wonke umsebenzi womsebenzisi, kufaka phakathi amakhasi ewebhu avakashelwe, amaphasiwedi, ne-imeyili.</translation> <translation id="7040230719604914234">Opharetha</translation> <translation id="7041549558901442110">Idivayisi ayixhunyiwe.</translation> @@ -809,6 +812,7 @@ <translation id="8075838845814659848">Inkokhelo esele</translation> <translation id="8082366717211101304">Ayikwazi ukuxazulula i-DNS kusukela kuma-app we-Android</translation> <translation id="808894953321890993">Shintsha iphasiwedi</translation> +<translation id="8094062939584182041">Vumela i-Google ikuthumelele i-imeyili mayelana nale nkinga</translation> <translation id="8104083085214006426">Usebenzisa inethiwekhi evulekile nengaphephile</translation> <translation id="8109786307828817014">Qhubeka nokulinganisa okuhlulekile?</translation> <translation id="811820734797650957">(Android) Isango Lingaqhwetshwa</translation>
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 3b55306..068b79885 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -244,11 +244,21 @@ # https://crbug.com/1346149 "apps.Sharesheet", + # http://crbug.com/1350529 + "crostini.RemoveCancel.bullseye_stable", + "crostini.RemoveCancel.buster_stable", + "crostini.RemoveOk.bullseye_stable", + "crostini.RemoveOk.buster_stable", + # b/241122961 "policy.BlockThirdPartyCookies", # https://crbug.com/1350180 + # also see http://crbug.com/1350191 "printer.Print", + + # https://crbug.com/1350191 + "arc.Print", ] # To create filters to be used on specific builders add them like this: @@ -257,6 +267,8 @@ # test config as 'tast_expr_key' # To disable a specific test in lacros_all_tast_tests, add it the following # list and cite a bug. +# The test disabled here will not impact it running in chrome on chromeOS +# pipeline. tast_disabled_tests_from_lacros_all = [ # https://crbug.com/1329764 "policy.HistoryClustersVisible",
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 75b89917..280c5436 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -651,6 +651,8 @@ "test_autofill_driver.h", "test_autofill_external_delegate.cc", "test_autofill_external_delegate.h", + "test_autofill_manager_waiter.cc", + "test_autofill_manager_waiter.h", "test_autofill_tick_clock.cc", "test_autofill_tick_clock.h", "test_browser_autofill_manager.cc",
diff --git a/components/autofill/core/browser/autofill_manager.h b/components/autofill/core/browser/autofill_manager.h index dce2d970..2354a2f 100644 --- a/components/autofill/core/browser/autofill_manager.h +++ b/components/autofill/core/browser/autofill_manager.h
@@ -187,9 +187,10 @@ // Invoked when |form| has been submitted. // Processes the submitted |form|, saving any new Autofill data to the user's // personal profile. - void OnFormSubmitted(const FormData& form, - bool known_success, - mojom::SubmissionSource source); + // Virtual for testing. + virtual void OnFormSubmitted(const FormData& form, + bool known_success, + mojom::SubmissionSource source); void FillCreditCardForm(int query_id, const FormData& form,
diff --git a/components/autofill/core/browser/autofill_manager_unittest.cc b/components/autofill/core/browser/autofill_manager_unittest.cc index 5e8d541..21c00f6 100644 --- a/components/autofill/core/browser/autofill_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_manager_unittest.cc
@@ -16,6 +16,7 @@ #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/test_autofill_client.h" #include "components/autofill/core/browser/test_autofill_driver.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_tick_clock.h" @@ -241,7 +242,10 @@ EXPECT_CALL(manager, OnBeforeProcessParsedForms()).Times(num > 0); EXPECT_CALL(manager, OnFormProcessed(_, _)).Times(num); EXPECT_CALL(manager, OnAfterProcessParsedForms(_)).Times(num > 0); + TestAutofillManagerWaiter waiter( + manager, {&AutofillManager::Observer::OnAfterFormsSeen}); manager.OnFormsSeen(updated_forms, removed_forms); + ASSERT_TRUE(waiter.Wait()); EXPECT_THAT(manager.form_structures(), HaveSameFormIdsAs(expectation)); }
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc index b8a6d89a..4ee7a52 100644 --- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -54,6 +54,7 @@ #include "components/autofill/core/browser/test_autofill_download_manager.h" #include "components/autofill/core/browser/test_autofill_driver.h" #include "components/autofill/core/browser/test_autofill_external_delegate.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "components/autofill/core/browser/test_autofill_tick_clock.h" #include "components/autofill/core/browser/test_browser_autofill_manager.h" #include "components/autofill/core/browser/test_form_data_importer.h" @@ -557,6 +558,9 @@ const FormData& form, const FormFieldData& field, int unique_id) { + browser_autofill_manager_->OnAskForValuesToFill( + form, field, {}, query_id, /*autoselect_first_suggestion=*/true, + TouchToFillEligible(false)); browser_autofill_manager_->FillOrPreviewForm( mojom::RendererFormDataAction::kFill, query_id, form, field, unique_id); } @@ -4756,12 +4760,15 @@ // In one form, rely on the max length attribute to imply US phone number // parts. In the other form, rely on the autocomplete type attribute. FormData form_with_us_number_max_length; + form_with_us_number_max_length.unique_renderer_id = + test::MakeFormRendererId(); form_with_us_number_max_length.name = u"MyMaxlengthPhoneForm"; form_with_us_number_max_length.url = GURL("https://myform.com/phone_form.html"); form_with_us_number_max_length.action = GURL("https://myform.com/phone_submit.html"); FormData form_with_autocompletetype = form_with_us_number_max_length; + form_with_autocompletetype.unique_renderer_id = test::MakeFormRendererId(); form_with_autocompletetype.name = u"MyAutocompletetypePhoneForm"; struct { @@ -4881,6 +4888,8 @@ // Verify only the first complete number is filled when there are multiple // componentized number fields. FormData form_with_multiple_componentized_phone_fields; + form_with_multiple_componentized_phone_fields.unique_renderer_id = + test::MakeFormRendererId(); form_with_multiple_componentized_phone_fields.url = GURL("https://www.foo.com/"); @@ -4947,6 +4956,8 @@ std::string guid(work_profile->guid()); FormData form_with_multiple_whole_number_fields; + form_with_multiple_whole_number_fields.unique_renderer_id = + test::MakeFormRendererId(); form_with_multiple_whole_number_fields.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -4999,6 +5010,8 @@ // Verify only the first complete number is filled when there are multiple // componentized number fields. FormData form_with_multiple_componentized_phone_fields; + form_with_multiple_componentized_phone_fields.unique_renderer_id = + test::MakeFormRendererId(); form_with_multiple_componentized_phone_fields.url = GURL("https://www.foo.com/"); @@ -5070,6 +5083,8 @@ std::string guid(work_profile->guid()); FormData form_with_misclassified_extension; + form_with_misclassified_extension.unique_renderer_id = + test::MakeFormRendererId(); form_with_misclassified_extension.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -5133,6 +5148,7 @@ std::string guid(work_profile->guid()); FormData form_with_no_complete_number; + form_with_no_complete_number.unique_renderer_id = test::MakeFormRendererId(); form_with_no_complete_number.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -5190,6 +5206,8 @@ std::string guid(work_profile->guid()); FormData form_with_multiple_whole_number_fields; + form_with_multiple_whole_number_fields.unique_renderer_id = + test::MakeFormRendererId(); form_with_multiple_whole_number_fields.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -5243,6 +5261,8 @@ std::string guid(work_profile->guid()); FormData form_with_multiple_whole_number_fields; + form_with_multiple_whole_number_fields.unique_renderer_id = + test::MakeFormRendererId(); form_with_multiple_whole_number_fields.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -5291,6 +5311,7 @@ TEST_P(BrowserAutofillManagerStructuredProfileTest, FormWithHiddenOrPresentationalSelects) { FormData form; + form.unique_renderer_id = test::MakeFormRendererId(); form.name = u"MyForm"; form.url = GURL("https://myform.com/form.html"); form.action = GURL("https://myform.com/submit.html"); @@ -5367,6 +5388,7 @@ std::string guid(work_profile->guid()); FormData form_with_multiple_sections; + form_with_multiple_sections.unique_renderer_id = test::MakeFormRendererId(); form_with_multiple_sections.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -5459,12 +5481,13 @@ test::CreateTestFormField("Some", "field", "", "text", &field); form.fields.insert(form.fields.begin() + 3, field); - std::vector<FormData> forms(1, form); - FormsSeen(forms); + FormsSeen({form}); // Now, after the call to |FormsSeen|, we remove the field before filling. form.fields.erase(form.fields.begin() + 3); + FormsSeen({form}); + const char guid[] = "00000000-0000-0000-0000-000000000001"; int response_page_id = 0; FormData response_data; @@ -5495,6 +5518,8 @@ // Now, after the call to |FormsSeen|, we restore the field before filling. form.fields.insert(pos, field); + FormsSeen({form}); + const char guid[] = "00000000-0000-0000-0000-000000000001"; int response_page_id = 0; FormData response_data; @@ -5511,6 +5536,7 @@ FormChangesVisibilityOfFields) { // Set up our form data. FormData form; + form.unique_renderer_id = test::MakeFormRendererId(); form.url = GURL("https://www.foo.com/"); FormFieldData field; @@ -5562,6 +5588,7 @@ // the right fields are getting filled.) response_data.fields[3].is_focusable = true; response_data.fields[4].is_focusable = true; + FormData later_response_data; const char guid2[] = "00000000-0000-0000-0000-000000000002"; FillAutofillFormDataAndSaveResults(kDefaultPageID, response_data, @@ -8343,6 +8370,7 @@ FormFieldData field; test::CreateTestFormField("Something", "something", "", "text", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8363,6 +8391,7 @@ DidShowSuggestions_LogAutofillAddressShownMetric) { FormData form; test::CreateTestAddressFormData(&form); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8408,6 +8437,7 @@ form.fields.push_back(field); test::CreateTestFormField("Address Line 1", "addr1", "", "text", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8452,6 +8482,7 @@ form.fields.push_back(field); test::CreateTestFormField("Postal Code", "zipcode", "", "text", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8496,6 +8527,7 @@ form.fields.push_back(field); test::CreateTestFormField("Email", "email", "", "email", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8539,6 +8571,7 @@ form.fields.push_back(field); test::CreateTestFormField("Email", "email", "", "email", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8582,6 +8615,7 @@ form.fields.push_back(field); test::CreateTestFormField("Phone Number", "phonenumber", "", "tel", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8625,6 +8659,7 @@ form.fields.push_back(field); test::CreateTestFormField("Last Name", "lastname", "", "text", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8670,6 +8705,7 @@ form.fields.push_back(field); test::CreateTestFormField("Email", "email", "", "email", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8720,6 +8756,7 @@ form.fields.push_back(field); test::CreateTestFormField("Email", "email", "", "email", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8772,6 +8809,7 @@ form.fields.push_back(field); test::CreateTestFormField("Phone Number", "phonenumber", "", "tel", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8822,6 +8860,7 @@ form.fields.push_back(field); test::CreateTestFormField("Phone Number", "phonenumber", "", "tel", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8876,6 +8915,7 @@ form.fields.push_back(field); test::CreateTestFormField("Email", "email", "", "email", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8925,6 +8965,7 @@ form.fields.push_back(field); test::CreateTestFormField("Email", "email", "", "email", &field); form.fields.push_back(field); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8958,6 +8999,7 @@ DidShowSuggestions_LogAutofillCreditCardShownMetric) { FormData form; CreateTestCreditCardFormData(&form, true, false); + FormsSeen({form}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidShowSuggestions( @@ -8986,6 +9028,7 @@ DidSuppressPopup_LogAutofillAddressPopupSuppressed) { FormData form; test::CreateTestAddressFormData(&form); + browser_autofill_manager_->OnFormsSeen({form}, {}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidSuppressPopup(form, form.fields[0]); @@ -9005,6 +9048,7 @@ FormData form; CreateTestCreditCardFormData(&form, true, false); + browser_autofill_manager_->OnFormsSeen({form}, {}); base::HistogramTester histogram_tester; browser_autofill_manager_->DidSuppressPopup(form, form.fields[0]); histogram_tester.ExpectBucketCount("Autofill.FormEvents.CreditCard", @@ -9116,12 +9160,11 @@ public testing::WithParamInterface<bool> { public: BrowserAutofillManagerTestPageLanguageDetection() { - is_in_active_frame_ = GetParam(); scoped_features_.InitAndEnableFeature( features::kAutofillPageLanguageDetection); } - bool is_in_active_frame_; + bool is_in_active_frame() const { return GetParam(); }; private: base::test::ScopedFeatureList scoped_features_; @@ -9140,7 +9183,7 @@ translate::LanguageDetectionDetails language_detection_details; language_detection_details.adopted_language = "hu"; - autofill_driver_->SetIsInActiveFrame(is_in_active_frame_); + autofill_driver_->SetIsInActiveFrame(is_in_active_frame()); browser_autofill_manager_->OnLanguageDetermined(language_detection_details); autofill_client_.GetLanguageState()->SetCurrentLanguage("hu"); @@ -9150,9 +9193,9 @@ // Language detection is used only for active frames. auto expected_language_code = - is_in_active_frame_ ? LanguageCode("hu") : LanguageCode(); + is_in_active_frame() ? LanguageCode("hu") : LanguageCode(); - ASSERT_EQ(expected_language_code, parsed_form->current_page_language()); + ASSERT_EQ(*expected_language_code, *parsed_form->current_page_language()); } INSTANTIATE_TEST_SUITE_P(All, @@ -9179,8 +9222,7 @@ // Set up our form data. FormData form; test::CreateTestAddressFormData(&form); - std::vector<FormData> forms(1, form); - FormsSeen(forms); + FormsSeen({form}); FormFieldData field = form.fields[0]; GetAutofillSuggestions(form, field);
diff --git a/components/autofill/core/browser/test_autofill_manager_waiter.cc b/components/autofill/core/browser/test_autofill_manager_waiter.cc new file mode 100644 index 0000000..55b2d9d --- /dev/null +++ b/components/autofill/core/browser/test_autofill_manager_waiter.cc
@@ -0,0 +1,205 @@ +// 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/test_autofill_manager_waiter.h" + +#include "base/check_op.h" +#include "base/containers/contains.h" +#include "base/logging.h" +#include "base/strings/string_util.h" +#include "base/strings/stringprintf.h" +#include "base/test/scoped_run_loop_timeout.h" + +namespace autofill { + +TestAutofillManagerWaiter::State::State() = default; +TestAutofillManagerWaiter::State::~State() = default; + +TestAutofillManagerWaiter::EventCount* TestAutofillManagerWaiter::State::Get( + AfterEvent event) { + auto it = base::ranges::find(events, event, &EventCount::event); + return it != events.end() ? &*it : nullptr; +} + +TestAutofillManagerWaiter::EventCount& +TestAutofillManagerWaiter::State::GetOrCreate(AfterEvent event, + base::Location location) { + if (EventCount* e = Get(event)) + return *e; + return *events.insert(events.end(), {event, location}); +} + +size_t TestAutofillManagerWaiter::State::num_pending_calls() const { + size_t pending_calls = 0; + for (const EventCount& e : events) + pending_calls += e.num_pending_calls; + return pending_calls; +} + +size_t TestAutofillManagerWaiter::State::num_total_calls() const { + size_t total_calls = 0; + for (const EventCount& e : events) + total_calls += e.num_total_calls; + return total_calls; +} + +std::string TestAutofillManagerWaiter::State::Describe() const { + std::vector<std::string> strings; + for (const auto& e : events) { + strings.push_back(base::StringPrintf( + "[event=%s, pending=%zu, total=%zu]", e.location.function_name(), + e.num_pending_calls, e.num_total_calls)); + } + return base::JoinString(strings, ", "); +} + +TestAutofillManagerWaiter::TestAutofillManagerWaiter( + AutofillManager& manager, + std::initializer_list<AfterEvent> relevant_events) + : relevant_events_(relevant_events) { + observation_.Observe(&manager); +} + +TestAutofillManagerWaiter::~TestAutofillManagerWaiter() = default; + +void TestAutofillManagerWaiter::OnAutofillManagerDestroyed() { + observation_.Reset(); +} + +void TestAutofillManagerWaiter::OnAutofillManagerReset() { + Reset(); +} + +void TestAutofillManagerWaiter::OnBeforeLanguageDetermined() { + Increment(&AutofillManager::Observer::OnAfterLanguageDetermined); +} + +void TestAutofillManagerWaiter::OnAfterLanguageDetermined() { + Decrement(&AutofillManager::Observer::OnAfterLanguageDetermined); +} + +void TestAutofillManagerWaiter::OnBeforeFormsSeen() { + Increment(&AutofillManager::Observer::OnAfterFormsSeen); +} + +void TestAutofillManagerWaiter::OnAfterFormsSeen() { + Decrement(&AutofillManager::Observer::OnAfterFormsSeen); +} + +void TestAutofillManagerWaiter::OnBeforeTextFieldDidChange() { + Increment(&AutofillManager::Observer::OnAfterTextFieldDidChange); +} + +void TestAutofillManagerWaiter::OnAfterTextFieldDidChange() { + Decrement(&AutofillManager::Observer::OnAfterTextFieldDidChange); +} + +void TestAutofillManagerWaiter::OnBeforeAskForValuesToFill() { + Increment(&AutofillManager::Observer::OnAfterAskForValuesToFill); +} + +void TestAutofillManagerWaiter::OnAfterAskForValuesToFill() { + Decrement(&AutofillManager::Observer::OnAfterAskForValuesToFill); +} + +void TestAutofillManagerWaiter::OnBeforeDidFillAutofillFormData() { + Increment(&AutofillManager::Observer::OnAfterDidFillAutofillFormData); +} + +void TestAutofillManagerWaiter::OnAfterDidFillAutofillFormData() { + Decrement(&AutofillManager::Observer::OnAfterDidFillAutofillFormData); +} + +void TestAutofillManagerWaiter::OnBeforeJavaScriptChangedAutofilledValue() { + Increment( + &AutofillManager::Observer::OnAfterJavaScriptChangedAutofilledValue); +} + +void TestAutofillManagerWaiter::OnAfterJavaScriptChangedAutofilledValue() { + Decrement( + &AutofillManager::Observer::OnAfterJavaScriptChangedAutofilledValue); +} + +void TestAutofillManagerWaiter::Reset() { + // The declaration order ensures that `lock` is destroyed before `state`, so + // that `state_->lock` has been released at its own destruction time. + auto state = std::make_unique<State>(); + base::AutoLock lock(state_->lock); + VLOG(1) << __func__; + ASSERT_EQ(state_->num_pending_calls(), 0u) << state_->Describe(); + using std::swap; + swap(state_, state); +} + +bool TestAutofillManagerWaiter::IsRelevant(AfterEvent event) const { + return relevant_events_.empty() || base::Contains(relevant_events_, event); +} + +void TestAutofillManagerWaiter::Increment(AfterEvent event, + base::Location location) { + base::AutoLock lock(state_->lock); + if (!IsRelevant(event)) { + VLOG(1) << "Ignoring irrelevant event: " << __func__ << "(" + << location.function_name() << ")"; + return; + } + if (state_->run_loop.AnyQuitCalled()) { + VLOG(1) << "Ignoring event because no more calls are awaited: " << __func__ + << "(" << location.function_name() << ")"; + return; + } + VLOG(1) << __func__ << "(" << location.function_name() << ")"; + EventCount& e = state_->GetOrCreate(event, location); + e.location = location; + ++e.num_total_calls; + ++e.num_pending_calls; +} + +void TestAutofillManagerWaiter::Decrement(AfterEvent event, + base::Location location) { + base::AutoLock lock(state_->lock); + if (!IsRelevant(event)) { + VLOG(1) << "Ignoring irrelevant event: " << __func__ << "(" + << location.function_name() << ")"; + return; + } + if (state_->run_loop.AnyQuitCalled()) { + VLOG(1) << "Ignoring event because no more calls are awaited: " << __func__ + << "(" << location.function_name() << ")"; + return; + } + VLOG(1) << __func__ << "(" << location.function_name() << ")"; + EventCount* e = state_->Get(event); + ASSERT_TRUE(e) << state_->Describe(); + ASSERT_GT(e->num_pending_calls, 0u) << state_->Describe(); + if (state_->num_awaiting_total_calls > 0) + --state_->num_awaiting_total_calls; + --e->num_pending_calls; + if (state_->num_pending_calls() == 0 && state_->num_awaiting_total_calls == 0) + state_->run_loop.Quit(); +} + +testing::AssertionResult TestAutofillManagerWaiter::Wait( + size_t num_awaiting_calls) { + base::ReleasableAutoLock lock(&state_->lock); + if (state_->run_loop.AnyQuitCalled()) { + return testing::AssertionFailure() + << "Waiter has not been Reset() since last Wait()."; + } + // Some events may already have happened. + num_awaiting_calls = num_awaiting_calls > state_->num_total_calls() + ? num_awaiting_calls - state_->num_total_calls() + : 0u; + if (state_->num_pending_calls() > 0 || num_awaiting_calls > 0) { + base::test::ScopedRunLoopTimeout run_loop_timeout( + FROM_HERE, timeout_, + base::BindRepeating(&State::Describe, base::Unretained(state_.get()))); + state_->num_awaiting_total_calls = num_awaiting_calls; + lock.Release(); + state_->run_loop.Run(); + } + return testing::AssertionSuccess(); +} + +} // namespace autofill
diff --git a/components/autofill/core/browser/test_autofill_manager_waiter.h b/components/autofill/core/browser/test_autofill_manager_waiter.h new file mode 100644 index 0000000..c382bbd --- /dev/null +++ b/components/autofill/core/browser/test_autofill_manager_waiter.h
@@ -0,0 +1,163 @@ +// 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_TEST_AUTOFILL_MANAGER_WAITER_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_AUTOFILL_MANAGER_WAITER_H_ + +#include <list> +#include <memory> +#include <vector> + +#include "base/run_loop.h" +#include "base/scoped_observation.h" +#include "base/synchronization/lock.h" +#include "base/time/time.h" +#include "components/autofill/core/browser/autofill_manager.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace autofill { + +// Records AutofillManager::Observer::OnBeforeFoo() events and blocks until the +// corresponding OnAfterFoo() events have happened. +// +// This mechanism relies on AutofillManager::Observer's guarantee that +// OnBeforeFoo() is followed by OnAfterFoo() in normal circumstances. +// +// If an OnBeforeFoo() event happens multiple times, the waiter expects multiple +// OnAfterFoo() events. +// +// Which events Wait() should be waiting for can be limited by providing a list +// of `relevant_events` to the constructor. This list should contain the +// OnAfterFoo(), *not* the OnBeforeFoo() events. +// +// By default, Wait() succeeds immediately if there are no pending calls, that +// is, if no OnBeforeFoo() without matching OnAfterFoo() has been observed. +// Calling Wait(k) with an integer argument `k` overrides this behaviour: in +// this case, it expects a total of at least `k` OnAfterFoo() events to happen +// or have happened. +// +// The waiter resets itself on OnAutofillManagerDestroyed() events. This makes +// it suitable for use with TestAutofillManagerInjector. +// +// Typical usage is as follows: +// +// TestAutofillManagerWaiter waiter(manager, +// {&AutofillManager::Observer::OnAfterFoo, +// &AutofillManager::Observer::OnAfterBar, +// ...}); +// ... trigger events ... +// ASSERT_TRUE(waiter.Wait()); // Blocks. +// +// In browser tests, it may be necessary to tell Wait() to wait for at least, +// say, 1 event because triggering events is asynchronous due to Mojo: +// +// TestAutofillManagerWaiter waiter(manager, +// {&AutofillManager::Observer::OnAfterFoo, +// ...}); +// ... trigger asynchronous OnFoo event ... +// ASSERT_TRUE(waiter.Wait(1)); // Blocks until at least one OnFoo() event +// // has happened since the creation of +// // `waiter`. +// +// In case of failure, the error message of Wait() informs about the pending +// OnAfterFoo() calls. +class TestAutofillManagerWaiter : public AutofillManager::Observer { + public: + // An OnFooAfter() event. As a convention, throughout this class we use the + // OnAfterFoo() events to identify the pair of OnAfterFoo() / OnBeforeFoo(). + using AfterEvent = void (AutofillManager::Observer::*)(); + + explicit TestAutofillManagerWaiter( + AutofillManager& manager, + std::initializer_list<AfterEvent> relevant_events = {}); + ~TestAutofillManagerWaiter() override; + + // Blocks until all pending OnAfterFoo() events have been observed and at + // least `num_awaiting_calls` relevant events have been observed. + [[nodiscard]] testing::AssertionResult Wait(size_t num_awaiting_calls = 0); + + // Equivalent to re-initialization. + void Reset(); + + // The timeout of the RunLoop. + base::TimeDelta timeout() const { return timeout_; } + void set_timeout(base::TimeDelta timeout) { timeout_ = timeout; } + + private: + struct EventCount { + // An AutofillManager::Observer::OnAfterFoo() event. + AfterEvent event; + // The OnBeforeFoo() function. Used for meaningful error messages. + base::Location location; + // The total number of recorded OnBeforeFoo() events. + size_t num_total_calls = 0; + // The number of recorded OnBeforeFoo() events without a corresponding + // OnAfterFoo() event. + size_t num_pending_calls = 0; + }; + + // State variables for easy resetting. + struct State { + State(); + State(State&) = delete; + State& operator=(State&) = delete; + ~State(); + + EventCount& GetOrCreate(AfterEvent event, base::Location location); + EventCount* Get(AfterEvent event); + + size_t num_total_calls() const; + size_t num_pending_calls() const; + + std::string Describe() const; + + // Effectively a map from `AfterEvent` to its count. Since `AfterEvent` is + // only equality-comparable, we use a list. (The list, rather than a vector, + // avoids invalidation of the references returned by GetOrCreate().) + std::list<EventCount> events; + // Decrement() unblocks Wait() when the number of awaited calls reaches 0. + size_t num_awaiting_total_calls = std::numeric_limits<size_t>::max(); + // Running iff there are no awaited and no pending calls. + base::RunLoop run_loop = base::RunLoop(); + // Functions that access the state should be mutually exclusive. + base::Lock lock; + }; + + bool IsRelevant(AfterEvent event) const; + void Increment(AfterEvent event, + base::Location location = base::Location::Current()); + void Decrement(AfterEvent event, + base::Location location = base::Location::Current()); + + void OnAutofillManagerDestroyed() override; + void OnAutofillManagerReset() override; + + void OnBeforeLanguageDetermined() override; + void OnAfterLanguageDetermined() override; + + void OnBeforeFormsSeen() override; + void OnAfterFormsSeen() override; + + void OnBeforeTextFieldDidChange() override; + void OnAfterTextFieldDidChange() override; + + void OnBeforeAskForValuesToFill() override; + void OnAfterAskForValuesToFill() override; + + void OnBeforeDidFillAutofillFormData() override; + void OnAfterDidFillAutofillFormData() override; + + void OnBeforeJavaScriptChangedAutofilledValue() override; + void OnAfterJavaScriptChangedAutofilledValue() override; + + std::vector<AfterEvent> relevant_events_; + std::unique_ptr<State> state_ = std::make_unique<State>(); + base::TimeDelta timeout_ = base::Seconds(5); + base::ScopedObservation<AutofillManager, AutofillManager::Observer> + observation_{this}; +}; + +} // namespace autofill + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_TEST_AUTOFILL_MANAGER_WAITER_H_
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.cc b/components/autofill/core/browser/test_browser_autofill_manager.cc index 0b84174..414bbcca 100644 --- a/components/autofill/core/browser/test_browser_autofill_manager.cc +++ b/components/autofill/core/browser/test_browser_autofill_manager.cc
@@ -4,13 +4,16 @@ #include "components/autofill/core/browser/test_browser_autofill_manager.h" +#include "autofill_test_utils.h" #include "base/strings/stringprintf.h" #include "base/strings/utf_string_conversions.h" #include "components/autofill/core/browser/autofill_suggestion_generator.h" #include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/browser/form_structure.h" #include "components/autofill/core/browser/mock_single_field_form_fill_router.h" #include "components/autofill/core/browser/test_autofill_client.h" #include "components/autofill/core/browser/test_autofill_driver.h" +#include "components/autofill/core/browser/test_autofill_manager_waiter.h" #include "components/autofill/core/browser/test_personal_data_manager.h" #include "form_structure_test_api.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -30,6 +33,76 @@ TestBrowserAutofillManager::~TestBrowserAutofillManager() = default; +void TestBrowserAutofillManager::OnLanguageDetermined( + const translate::LanguageDetectionDetails& details) { + TestAutofillManagerWaiter waiter( + *this, {&AutofillManager::Observer::OnAfterLanguageDetermined}); + AutofillManager::OnLanguageDetermined(details); + ASSERT_TRUE(waiter.Wait()); +} + +void TestBrowserAutofillManager::OnFormsSeen( + const std::vector<FormData>& updated_forms, + const std::vector<FormGlobalId>& removed_forms) { + TestAutofillManagerWaiter waiter(*this, {&Observer::OnAfterFormsSeen}); + AutofillManager::OnFormsSeen(updated_forms, removed_forms); + ASSERT_TRUE(waiter.Wait()); +} + +void TestBrowserAutofillManager::OnTextFieldDidChange( + const FormData& form, + const FormFieldData& field, + const gfx::RectF& bounding_box, + const base::TimeTicks timestamp) { + TestAutofillManagerWaiter waiter(*this, + {&Observer::OnAfterTextFieldDidChange}); + AutofillManager::OnTextFieldDidChange(form, field, bounding_box, timestamp); + ASSERT_TRUE(waiter.Wait()); +} + +void TestBrowserAutofillManager::OnDidFillAutofillFormData( + const FormData& form, + const base::TimeTicks timestamp) { + TestAutofillManagerWaiter waiter(*this, + {&Observer::OnAfterDidFillAutofillFormData}); + AutofillManager::OnDidFillAutofillFormData(form, timestamp); + ASSERT_TRUE(waiter.Wait()); +} + +void TestBrowserAutofillManager::OnAskForValuesToFill( + const FormData& form, + const FormFieldData& field, + const gfx::RectF& bounding_box, + int query_id, + bool autoselect_first_suggestion, + TouchToFillEligible touch_to_fill_eligible) { + TestAutofillManagerWaiter waiter(*this, + {&Observer::OnAfterAskForValuesToFill}); + AutofillManager::OnAskForValuesToFill(form, field, bounding_box, query_id, + autoselect_first_suggestion, + touch_to_fill_eligible); + ASSERT_TRUE(waiter.Wait()); +} + +void TestBrowserAutofillManager::OnJavaScriptChangedAutofilledValue( + const FormData& form, + const FormFieldData& field, + const std::u16string& old_value) { + TestAutofillManagerWaiter waiter( + *this, {&Observer::OnAfterJavaScriptChangedAutofilledValue}); + AutofillManager::OnJavaScriptChangedAutofilledValue(form, field, old_value); + ASSERT_TRUE(waiter.Wait()); +} + +void TestBrowserAutofillManager::OnFormSubmitted( + const FormData& form, + const bool known_success, + const mojom::SubmissionSource source) { + TestAutofillManagerWaiter waiter(*this, {&Observer::OnAfterFormsSeen}); + AutofillManager::OnFormSubmitted(form, known_success, source); + ASSERT_TRUE(waiter.Wait()); +} + bool TestBrowserAutofillManager::IsAutofillProfileEnabled() const { return autofill_profile_enabled_; } @@ -111,14 +184,8 @@ bool preserve_values_in_form_structure) { std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>> all_heuristic_types; - - base::ranges::transform( - heuristic_types, std::back_inserter(all_heuristic_types), - [](ServerFieldType type) - -> std::vector<std::pair<PatternSource, ServerFieldType>> { - return {{GetActivePatternSource(), type}}; - }); - + for (ServerFieldType type : heuristic_types) + all_heuristic_types.push_back({{GetActivePatternSource(), type}}); AddSeenForm(form, all_heuristic_types, server_types, preserve_values_in_form_structure); } @@ -129,19 +196,35 @@ heuristic_types, const std::vector<ServerFieldType>& server_types, bool preserve_values_in_form_structure) { - FormData form_with_empty_fields = form; - for (auto& field : form_with_empty_fields.fields) { - field.value = std::u16string(); - } - auto form_structure = std::make_unique<FormStructure>( - preserve_values_in_form_structure ? form : form_with_empty_fields); - FormStructureTestApi(form_structure.get()) + preserve_values_in_form_structure ? form : test::WithoutValues(form)); + FormGlobalId form_id = form_structure->global_id(); + AddSeenFormStructure(std::move(form_structure)); + SetSeenFormPredictions(form_id, heuristic_types, server_types); + form_interactions_ukm_logger()->OnFormsParsed(client()->GetUkmSourceId()); +} + +void TestBrowserAutofillManager::SetSeenFormPredictions( + FormGlobalId form_id, + const std::vector<ServerFieldType>& heuristic_types, + const std::vector<ServerFieldType>& server_types) { + std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>> + all_heuristic_types; + for (ServerFieldType type : heuristic_types) + all_heuristic_types.push_back({{GetActivePatternSource(), type}}); + SetSeenFormPredictions(form_id, all_heuristic_types, server_types); +} + +void TestBrowserAutofillManager::SetSeenFormPredictions( + FormGlobalId form_id, + const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>& + heuristic_types, + const std::vector<ServerFieldType>& server_types) { + FormStructure* form_structure = FindCachedFormByRendererId(form_id); + ASSERT_TRUE(form_structure); + FormStructureTestApi(form_structure) .SetFieldTypes(heuristic_types, server_types); form_structure->identify_sections_for_testing(); - AddSeenFormStructure(std::move(form_structure)); - - form_interactions_ukm_logger()->OnFormsParsed(client()->GetUkmSourceId()); } void TestBrowserAutofillManager::AddSeenFormStructure( @@ -165,9 +248,12 @@ const gfx::RectF& bounding_box, bool autoselect_first_suggestion, TouchToFillEligible touch_to_fill_eligible) { + TestAutofillManagerWaiter waiter( + *this, {&AutofillManager::Observer::OnAfterAskForValuesToFill}); BrowserAutofillManager::OnAskForValuesToFill( form, field, bounding_box, query_id, autoselect_first_suggestion, touch_to_fill_eligible); + ASSERT_TRUE(waiter.Wait()); } void TestBrowserAutofillManager::SetAutofillProfileEnabled(
diff --git a/components/autofill/core/browser/test_browser_autofill_manager.h b/components/autofill/core/browser/test_browser_autofill_manager.h index dcd78252..f017a080 100644 --- a/components/autofill/core/browser/test_browser_autofill_manager.h +++ b/components/autofill/core/browser/test_browser_autofill_manager.h
@@ -37,6 +37,34 @@ TestAutofillClient* client() { return client_; } TestAutofillDriver* driver() { return driver_; } + // AutofillManager overrides. + // The overrides ensure that the thread is blocked until the form has been + // parsed (perhaps asynchronously, depending on AutofillParseAsync). + void OnLanguageDetermined( + const translate::LanguageDetectionDetails& details) override; + void OnFormsSeen(const std::vector<FormData>& updated_forms, + const std::vector<FormGlobalId>& removed_forms) override; + void OnTextFieldDidChange(const FormData& form, + const FormFieldData& field, + const gfx::RectF& bounding_box, + const base::TimeTicks timestamp) override; + void OnDidFillAutofillFormData(const FormData& form, + const base::TimeTicks timestamp) override; + void OnAskForValuesToFill( + const FormData& form, + const FormFieldData& field, + const gfx::RectF& bounding_box, + int query_id, + bool autoselect_first_suggestion, + TouchToFillEligible touch_to_fill_eligible) override; + void OnJavaScriptChangedAutofilledValue( + const FormData& form, + const FormFieldData& field, + const std::u16string& old_value) override; + void OnFormSubmitted(const FormData& form, + const bool known_success, + const mojom::SubmissionSource source) override; + // BrowserAutofillManager overrides. bool IsAutofillProfileEnabled() const override; bool IsAutofillCreditCardEnabled() const override; @@ -68,6 +96,17 @@ const std::vector<ServerFieldType>& server_types, bool preserve_values_in_form_structure = false); + void SetSeenFormPredictions( + FormGlobalId form_id, + const std::vector<ServerFieldType>& heuristic_types, + const std::vector<ServerFieldType>& server_types); + + void SetSeenFormPredictions( + FormGlobalId form_id, + const std::vector<std::vector<std::pair<PatternSource, ServerFieldType>>>& + heuristic_types, + const std::vector<ServerFieldType>& server_types); + void AddSeenFormStructure(std::unique_ptr<FormStructure> form_structure); void ClearFormStructures();
diff --git a/components/autofill_assistant/android/BUILD.gn b/components/autofill_assistant/android/BUILD.gn index 69f0cf0..d39e897 100644 --- a/components/autofill_assistant/android/BUILD.gn +++ b/components/autofill_assistant/android/BUILD.gn
@@ -210,6 +210,7 @@ "public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntry.java", "public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantModuleEntryProvider.java", "public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantPreferencesUtil.java", + "public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantPublicTags.java", "public/java/src/org/chromium/components/autofill_assistant/Starter.java", "public/java/src/org/chromium/components/autofill_assistant/TriggerContext.java", ]
diff --git a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java index d31d961..6bec2bb 100644 --- a/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java +++ b/components/autofill_assistant/android/java/src/org/chromium/components/autofill_assistant/AssistantBottomSheetContent.java
@@ -40,6 +40,8 @@ mContentView = new SizeListenableLinearLayout(context); mContentView.setLayoutParams(new ViewGroup.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT)); + mContentView.setTag( + AutofillAssistantPublicTags.AUTOFILL_ASSISTANT_BOTTOM_SHEET_CONTENT_TAG); mBottomBarDelegateSupplier = supplier; }
diff --git a/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantPublicTags.java b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantPublicTags.java new file mode 100644 index 0000000..c44d629 --- /dev/null +++ b/components/autofill_assistant/android/public/java/src/org/chromium/components/autofill_assistant/AutofillAssistantPublicTags.java
@@ -0,0 +1,14 @@ +// 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.components.autofill_assistant; + +/** + * Contains public tags. + */ +public class AutofillAssistantPublicTags { + // Used to identify the assistant bottom sheet content view. + public static final String AUTOFILL_ASSISTANT_BOTTOM_SHEET_CONTENT_TAG = + "assistant_bottom_sheet_content"; +}
diff --git a/components/browser_ui/media/android/BUILD.gn b/components/browser_ui/media/android/BUILD.gn index 3ea9e3d..dc2781c 100644 --- a/components/browser_ui/media/android/BUILD.gn +++ b/components/browser_ui/media/android/BUILD.gn
@@ -40,59 +40,34 @@ sources = [ "java/res/drawable-hdpi/audio_playing.png", "java/res/drawable-hdpi/audio_playing_square.png", - "java/res/drawable-hdpi/ic_call_end_white_36dp.png", "java/res/drawable-hdpi/ic_fast_forward_white_36dp.png", "java/res/drawable-hdpi/ic_fast_rewind_white_36dp.png", - "java/res/drawable-hdpi/ic_mic_off_white_36dp.png", - "java/res/drawable-hdpi/ic_mic_white_36dp.png", "java/res/drawable-hdpi/ic_skip_next_white_36dp.png", "java/res/drawable-hdpi/ic_skip_previous_white_36dp.png", - "java/res/drawable-hdpi/ic_videocam_off_white_36dp.png", - "java/res/drawable-hdpi/ic_videocam_white_36dp.png", "java/res/drawable-mdpi/audio_playing.png", "java/res/drawable-mdpi/audio_playing_square.png", - "java/res/drawable-mdpi/ic_call_end_white_36dp.png", "java/res/drawable-mdpi/ic_fast_forward_white_36dp.png", "java/res/drawable-mdpi/ic_fast_rewind_white_36dp.png", - "java/res/drawable-mdpi/ic_mic_off_white_36dp.png", - "java/res/drawable-mdpi/ic_mic_white_36dp.png", "java/res/drawable-mdpi/ic_skip_next_white_36dp.png", "java/res/drawable-mdpi/ic_skip_previous_white_36dp.png", - "java/res/drawable-mdpi/ic_videocam_off_white_36dp.png", - "java/res/drawable-mdpi/ic_videocam_white_36dp.png", "java/res/drawable-xhdpi/audio_playing.png", "java/res/drawable-xhdpi/audio_playing_square.png", - "java/res/drawable-xhdpi/ic_call_end_white_36dp.png", "java/res/drawable-xhdpi/ic_fast_forward_white_36dp.png", "java/res/drawable-xhdpi/ic_fast_rewind_white_36dp.png", - "java/res/drawable-xhdpi/ic_mic_off_white_36dp.png", - "java/res/drawable-xhdpi/ic_mic_white_36dp.png", "java/res/drawable-xhdpi/ic_skip_next_white_36dp.png", "java/res/drawable-xhdpi/ic_skip_previous_white_36dp.png", - "java/res/drawable-xhdpi/ic_videocam_off_white_36dp.png", - "java/res/drawable-xhdpi/ic_videocam_white_36dp.png", "java/res/drawable-xxhdpi/audio_playing.png", "java/res/drawable-xxhdpi/audio_playing_square.png", - "java/res/drawable-xxhdpi/ic_call_end_white_36dp.png", "java/res/drawable-xxhdpi/ic_fast_forward_white_36dp.png", "java/res/drawable-xxhdpi/ic_fast_rewind_white_36dp.png", - "java/res/drawable-xxhdpi/ic_mic_off_white_36dp.png", - "java/res/drawable-xxhdpi/ic_mic_white_36dp.png", "java/res/drawable-xxhdpi/ic_skip_next_white_36dp.png", "java/res/drawable-xxhdpi/ic_skip_previous_white_36dp.png", - "java/res/drawable-xxhdpi/ic_videocam_off_white_36dp.png", - "java/res/drawable-xxhdpi/ic_videocam_white_36dp.png", "java/res/drawable-xxxhdpi/audio_playing.png", "java/res/drawable-xxxhdpi/audio_playing_square.png", - "java/res/drawable-xxxhdpi/ic_call_end_white_36dp.png", "java/res/drawable-xxxhdpi/ic_fast_forward_white_36dp.png", "java/res/drawable-xxxhdpi/ic_fast_rewind_white_36dp.png", - "java/res/drawable-xxxhdpi/ic_mic_off_white_36dp.png", - "java/res/drawable-xxxhdpi/ic_mic_white_36dp.png", "java/res/drawable-xxxhdpi/ic_skip_next_white_36dp.png", "java/res/drawable-xxxhdpi/ic_skip_previous_white_36dp.png", - "java/res/drawable-xxxhdpi/ic_videocam_off_white_36dp.png", - "java/res/drawable-xxxhdpi/ic_videocam_white_36dp.png", ] deps = [ "//components/browser_ui/strings/android:browser_ui_strings_grd",
diff --git a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_call_end_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-hdpi/ic_call_end_white_36dp.png deleted file mode 100644 index 90773818..0000000 --- a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_call_end_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_mic_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-hdpi/ic_mic_off_white_36dp.png deleted file mode 100644 index c0e773b..0000000 --- a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_mic_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_mic_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-hdpi/ic_mic_white_36dp.png deleted file mode 100644 index 2b377a74..0000000 --- a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_mic_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_videocam_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-hdpi/ic_videocam_off_white_36dp.png deleted file mode 100644 index fafc3a3..0000000 --- a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_videocam_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_videocam_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-hdpi/ic_videocam_white_36dp.png deleted file mode 100644 index 5c99f19..0000000 --- a/components/browser_ui/media/android/java/res/drawable-hdpi/ic_videocam_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_call_end_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-mdpi/ic_call_end_white_36dp.png deleted file mode 100644 index 8fb6ffd..0000000 --- a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_call_end_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_mic_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-mdpi/ic_mic_off_white_36dp.png deleted file mode 100644 index 153d979f..0000000 --- a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_mic_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_mic_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-mdpi/ic_mic_white_36dp.png deleted file mode 100644 index d3d9dc2b..0000000 --- a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_mic_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_videocam_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-mdpi/ic_videocam_off_white_36dp.png deleted file mode 100644 index b09d4dd33..0000000 --- a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_videocam_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_videocam_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-mdpi/ic_videocam_white_36dp.png deleted file mode 100644 index f4e905c55..0000000 --- a/components/browser_ui/media/android/java/res/drawable-mdpi/ic_videocam_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_call_end_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_call_end_white_36dp.png deleted file mode 100644 index ff84f1f..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_call_end_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_mic_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_mic_off_white_36dp.png deleted file mode 100644 index 89ec023..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_mic_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_mic_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_mic_white_36dp.png deleted file mode 100644 index d79f5bb..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_mic_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_videocam_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_videocam_off_white_36dp.png deleted file mode 100644 index b305b70..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_videocam_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_videocam_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_videocam_white_36dp.png deleted file mode 100644 index 646115b..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xhdpi/ic_videocam_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_call_end_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_call_end_white_36dp.png deleted file mode 100644 index 3213989..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_call_end_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_mic_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_mic_off_white_36dp.png deleted file mode 100644 index 03cb6a6..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_mic_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_mic_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_mic_white_36dp.png deleted file mode 100644 index fc3b9246..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_mic_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_videocam_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_videocam_off_white_36dp.png deleted file mode 100644 index 54378c0..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_videocam_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_videocam_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_videocam_white_36dp.png deleted file mode 100644 index 60f37bc..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxhdpi/ic_videocam_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_call_end_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_call_end_white_36dp.png deleted file mode 100644 index ad9f949f..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_call_end_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_mic_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_mic_off_white_36dp.png deleted file mode 100644 index 533c60e..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_mic_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_mic_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_mic_white_36dp.png deleted file mode 100644 index 5ec10394..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_mic_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_videocam_off_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_videocam_off_white_36dp.png deleted file mode 100644 index 59bc5fe065..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_videocam_off_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_videocam_white_36dp.png b/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_videocam_white_36dp.png deleted file mode 100644 index 3372697..0000000 --- a/components/browser_ui/media/android/java/res/drawable-xxxhdpi/ic_videocam_white_36dp.png +++ /dev/null Binary files differ
diff --git a/components/browser_ui/strings/android/browser_ui_strings.grd b/components/browser_ui/strings/android/browser_ui_strings.grd index 69eacf0..8936c88 100644 --- a/components/browser_ui/strings/android/browser_ui_strings.grd +++ b/components/browser_ui/strings/android/browser_ui_strings.grd
@@ -712,21 +712,6 @@ <message name="IDS_ACCESSIBILITY_SEEK_BACKWARD" desc="The seek backward button that seeks media to an earlier position."> Seek backward </message> - <message name="IDS_ACCESSIBILITY_HANG_UP" desc="The hang up button that hangs up the video call."> - Hang up - </message> - <message name="IDS_ACCESSIBILITY_MUTE_MICROPHONE" desc="The mute microphone button that mutes the microphone of the video call."> - Mute microphone - </message> - <message name="IDS_ACCESSIBILITY_UNMUTE_MICROPHONE" desc="The unmute microphone button that unmutes the microphone of the video call."> - Unmute microphone - </message> - <message name="IDS_ACCESSIBILITY_TURN_ON_CAMERA" desc="The turn on camera button that turns on the camera of the video call."> - Turn on camera - </message> - <message name="IDS_ACCESSIBILITY_TURN_OFF_CAMERA" desc="The turn off camera button that turns off the camera of the video call."> - Turn off camera - </message> <message name="IDS_MEDIA_NOTIFICATION_INCOGNITO" desc="Text used as a placeholder for a media notification about playing media, when notification is shown from Incognito tab."> A site is playing media </message>
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_HANG_UP.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_HANG_UP.png.sha1 deleted file mode 100644 index 7550f63..0000000 --- a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_HANG_UP.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bc00ecb19f1574c5b10d6384f8a199cc363a0ce0 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_MUTE_MICROPHONE.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_MUTE_MICROPHONE.png.sha1 deleted file mode 100644 index 7550f63..0000000 --- a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_MUTE_MICROPHONE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bc00ecb19f1574c5b10d6384f8a199cc363a0ce0 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_TURN_OFF_CAMERA.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_TURN_OFF_CAMERA.png.sha1 deleted file mode 100644 index 7550f63..0000000 --- a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_TURN_OFF_CAMERA.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -bc00ecb19f1574c5b10d6384f8a199cc363a0ce0 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_TURN_ON_CAMERA.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_TURN_ON_CAMERA.png.sha1 deleted file mode 100644 index 721f26830..0000000 --- a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_TURN_ON_CAMERA.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -830c38bed54a5c2b1783c150806cd5b13320d381 \ No newline at end of file
diff --git a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_UNMUTE_MICROPHONE.png.sha1 b/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_UNMUTE_MICROPHONE.png.sha1 deleted file mode 100644 index 721f26830..0000000 --- a/components/browser_ui/strings/android/browser_ui_strings_grd/IDS_ACCESSIBILITY_UNMUTE_MICROPHONE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -830c38bed54a5c2b1783c150806cd5b13320d381 \ No newline at end of file
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 f84d6fc..0f08795 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
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">ለአንድ የተወሰነ ጣቢያ የሦስተኛ ወገን መግባትን ያግዱ።</translation> <translation id="6388207532828177975">አጽዳ እና ዳግም አስጀምር</translation> <translation id="6398765197997659313">ከሙሉ ማሳያ መስኮት ይውጡ</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">ጣቢያዎች የእርስዎን የምናባዊ እውነታ መሣሪያ እና ውሂብ እንዳይጠቀሙ ያግዷቸው</translation> <translation id="6447842834002726250">ኩኪዎች</translation> <translation id="6527303717912515753">አጋራ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb index 5ca2ab8..0025e856 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ar.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">يمكنك حظر تسجيل الدخول في الخدمات التابعة لجهات خارجية في موقع إلكتروني محدَّد.</translation> <translation id="6388207532828177975">المحو وإعادة الضبط</translation> <translation id="6398765197997659313">إنهاء وضع ملء الشاشة</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">منع المواقع الإلكترونية من استخدام جهاز الواقع الافتراضي وبياناته.</translation> <translation id="6447842834002726250">ملفّات تعريف الارتباط</translation> <translation id="6527303717912515753">مشاركة</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb index c05ccde..5fa35d4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_be.xtb
@@ -240,8 +240,10 @@ <translation id="6367753977865761591">Блакіраваць уваход праз староннія сэрвісы для канкрэтнага сайта.</translation> <translation id="6388207532828177975">Ачысціць і скінуць</translation> <translation id="6398765197997659313">Выключыць поўнаэкранны рэжым</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Забараніць сайтам выкарыстоўваць даныя і прылады віртуальнай рэальнасці</translation> <translation id="6447842834002726250">Файлы cookie</translation> +<translation id="6467852467360539617">Выдаліць даныя і скінуць дазволы</translation> <translation id="6527303717912515753">Абагуліць</translation> <translation id="6545864417968258051">Пошук прылад Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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" />}few{Заблакіраваны <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> і яшчэ <ph name="NUM_MORE" />}many{Заблакіраваны <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> @@ -281,6 +283,7 @@ <translation id="7250468141469952378">Выбрана: <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Дазволены <ph name="PERMISSION_1" /> і <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Звычайна вы блакіруеце апавяшчэнні. Каб дазволіць іх, націсніце "Падрабязнасці".</translation> +<translation id="7383715096023715447">Налады для дамена <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Спачатку запытваць</translation> <translation id="7423538860840206698">Чытанне буфера абмену заблакіравана</translation> <translation id="7425915948813553151">Цёмная тэма для сайтаў</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb index 91e4cbc..f8f9689 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bg.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Блокиране на влизането с профили от трети страни за конкретен сайт.</translation> <translation id="6388207532828177975">Изчистване и нулиране</translation> <translation id="6398765197997659313">Изход от цял екран</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Блокиране на сайтовете, така че да не използват устройствата и данните ви за виртуална реалност</translation> <translation id="6447842834002726250">„Бисквитки“</translation> <translation id="6527303717912515753">Споделяне</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb index c2ab001..2cb5a319 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_bn.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">সাইটগুলিকে আপনার ভার্চুয়াল রিয়েলিটি ডিভাইস ও ডেটা ব্যবহার করতে দেবেন না</translation> <translation id="6447842834002726250">কুকিজ</translation> +<translation id="6467852467360539617">ডেটা মুছুন এবং অনুমতি রিসেট করুন</translation> <translation id="6527303717912515753">শেয়ার করুন</translation> <translation id="6545864417968258051">ব্লুটুথ স্ক্যানিং</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" />টি বেছে নেওয়া হয়েছে</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> ও <ph name="PERMISSION_2" /> ব্যবহারের অনুমতি দেওয়া হয়েছে</translation> <translation id="7302486331832100261">আপনি সাধারণত বিজ্ঞপ্তি ব্লক করেন। অনুমতি দিতে, 'বিবরণ' বিকল্পে ক্লিক করুন।</translation> +<translation id="7383715096023715447"><ph name="DOMAIN" />-এর সেটিংস</translation> <translation id="7423098979219808738">প্রথমে জিজ্ঞাসা করুন</translation> <translation id="7423538860840206698">ক্লিপবোর্ড পড়া ব্লক করা হয়েছে</translation> <translation id="7425915948813553151">সাইটের জন্য ডার্ক থিম</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 c7b1be27..2d0ab2f 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Blokira web lokacijama korištenje uređaja i podataka virtuelne realnosti</translation> <translation id="6447842834002726250">Kolačići</translation> +<translation id="6467852467360539617">Izbriši podatke i poništi dopuštenja</translation> <translation id="6527303717912515753">Dijeli</translation> <translation id="6545864417968258051">Skeniranje Bluetootha</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378">Odabrano <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Dozvoljeno: <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Obično blokirate obavještenja. Da dozvolite, dodirnite Detalji.</translation> +<translation id="7383715096023715447">Postavke domene <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Prvo pitaj</translation> <translation id="7423538860840206698">Čitanje međumemorije je blokirano</translation> <translation id="7425915948813553151">Tamna tema za web lokacije</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb index 86da331..e3169ae 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cs.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Blokování přihlášení třetích stran na konkrétní web.</translation> <translation id="6388207532828177975">Vymazat a resetovat</translation> <translation id="6398765197997659313">Ukončit režim celé obrazovky</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Bránit webům v používání zařízení a dat pro virtuální realitu</translation> <translation id="6447842834002726250">Soubory cookie</translation> <translation id="6527303717912515753">Sdílet</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 d7d4166..39303b7 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Bloker websites fra at benytte dine virtual reality-enheder og -data</translation> <translation id="6447842834002726250">Cookies</translation> +<translation id="6467852467360539617">Ryd data, og nulstil tilladelser</translation> <translation id="6527303717912515753">Del</translation> <translation id="6545864417968258051">Bluetooth-scanning</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> mere er blokeret}one{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more blocked}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> mere er blokeret}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er markeret</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /> blev tilladt</translation> <translation id="7302486331832100261">Du blokerer som regel notifikationer. Tryk på Info for at give tilladelse.</translation> +<translation id="7383715096023715447">Indstillinger for <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Spørg først</translation> <translation id="7423538860840206698">Blokeret fra at læse udklipsholderen</translation> <translation id="7425915948813553151">Mørkt tema på websites</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 29b40b6..fd5f54d 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
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Hier kannst du Websites angeben, für die die Drittanbieter-Anmeldung blockiert werden soll.</translation> <translation id="6388207532828177975">Löschen & zurücksetzen</translation> <translation id="6398765197997659313">Vollbildmodus beenden</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Websites daran hindern, mein Virtual-Reality-Gerät und meine Virtual-Reality-Daten zu verwenden</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Teilen</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb index b6da149..bbe9d12b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_es-419.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Bloquea el acceso de terceros a un sitio específico.</translation> <translation id="6388207532828177975">Borrar y restablecer</translation> <translation id="6398765197997659313">Salir de pantalla completa</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Impedir que los sitios utilicen tus datos y dispositivos de realidad virtual</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Compartir</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 c86773b..9160353 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
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Bloquea el inicio de sesión de terceros en un sitio específico.</translation> <translation id="6388207532828177975">Borrar y restablecer</translation> <translation id="6398765197997659313">Salir del modo de pantalla completa</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">No permitir que los sitios usen tu dispositivo y tus datos de realidad virtual</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Compartir</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 f8f35445..0522d3b 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
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">ورود به سیستم شخص ثالث برای سایت خاصی مسدود میشود.</translation> <translation id="6388207532828177975">پاک کردن و بازنشانی</translation> <translation id="6398765197997659313">خروج از حالت تمام صفحه</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">دسترسی سایتها به دستگاه و دادههای واقعیت مجازی مسدود شود</translation> <translation id="6447842834002726250">کوکیها</translation> <translation id="6527303717912515753">اشتراکگذاری</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 001cbdd..0f01996 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
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">I-block ang third-party na pag-sign in para sa partikular na site.</translation> <translation id="6388207532828177975">I-clear at i-reset</translation> <translation id="6398765197997659313">Lumabas sa buong screen</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">I-block ang mga site sa paggamit sa iyong virtual reality device at data</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Ibahagi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb index 3ede780..9641ed8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Bloquez la connexion tierce pour un site spécifique.</translation> <translation id="6388207532828177975">Effacer et réinitialiser</translation> <translation id="6398765197997659313">Quitter le mode plein écran</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Empêcher les sites d'utiliser vos données et votre appareil de réalité virtuelle</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Partager</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb index b5343bc1..e02a37f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hi.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">किसी साइट पर, तीसरे पक्ष के खाते से साइन इन को ब्लॉक करें.</translation> <translation id="6388207532828177975">साफ़ करें और रीसेट करें</translation> <translation id="6398765197997659313">फ़ुल स्क्रीन से बाहर निकलें</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">साइटों को अपने वर्चुअल रिएलिटी वाले डिवाइस और डेटा का इस्तेमाल करने से रोकें</translation> <translation id="6447842834002726250">कुकी</translation> <translation id="6527303717912515753">शेयर करें</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 833cf284..12a9c03e 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Onemogući web-lokacijama da koriste uređaj i podatke virtualne stvarnosti</translation> <translation id="6447842834002726250">Kolačići</translation> +<translation id="6467852467360539617">Izbriši podatke i poništi dopuštenja</translation> <translation id="6527303717912515753">Podijeli</translation> <translation id="6545864417968258051">Traženje Bluetootha</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Blokirana su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Blokirana su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Blokirana su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Blokirana su dopuštenja <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378">Odabrano: <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Odobrena su dopuštenja <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Uglavnom blokirate obavijesti. Da biste ih dopustili, kliknite Pojedinosti.</translation> +<translation id="7383715096023715447">Postavke domene <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Prvo pitaj</translation> <translation id="7423538860840206698">Blokirano je čitanje međuspremnika</translation> <translation id="7425915948813553151">Tamna tema za web-lokacije</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb index 3ba2d72..d784d956 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hy.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Նշեք այն կայքերը, որոնց համար երրորդ կողմի ծառայությունների միջոցով մուտքը պետք է արգելափակվի։</translation> <translation id="6388207532828177975">Մաքրել և զրոյացնել</translation> <translation id="6398765197997659313">Ելնել լիաէկրան ռեժիմից</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Արգելել կայքերին օգտագործել վիրտուալ իրականության ձեր սարքերն ու տվյալները</translation> <translation id="6447842834002726250">Cookie ֆայլեր</translation> <translation id="6527303717912515753">Կիսվել</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb index 6e413274..301ed79 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_is.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Loka á innskráningu þriðja aðila á tilteknu vefsvæði.</translation> <translation id="6388207532828177975">Hreinsa og endurstilla</translation> <translation id="6398765197997659313">Hætta að nota allan skjáinn</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Loka á að vefsvæði fái að nota sýndarveruleikatækið og -gögnin þín</translation> <translation id="6447842834002726250">Fótspor</translation> <translation id="6527303717912515753">Deila</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb index 22fb2773..b2c2718 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ja.xtb
@@ -242,6 +242,7 @@ <translation id="6398765197997659313">全画面表示を終了</translation> <translation id="6439114592976064011">サイトによるバーチャル リアリティ デバイスとデータの使用をブロックする</translation> <translation id="6447842834002726250">Cookie</translation> +<translation id="6467852467360539617">データを消去して権限をリセット</translation> <translation id="6527303717912515753">共有</translation> <translation id="6545864417968258051">Bluetooth のスキャン</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -281,6 +282,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> 件選択されています</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" />、<ph name="PERMISSION_2" />を許可</translation> <translation id="7302486331832100261">通知はデフォルトでブロックされています。許可するには [詳細] をタップしてください。</translation> +<translation id="7383715096023715447"><ph name="DOMAIN" /> の設定</translation> <translation id="7423098979219808738">最初に確認する</translation> <translation id="7423538860840206698">クリップボードの読み取りがブロックされています</translation> <translation id="7425915948813553151">サイトのダークモード</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 5b28501..94f1373 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">საიტებისთვის თქვენი ვირტუალური რეალობის მოწყობილობების/მონაცემების გამოყენების დაბლოკვა</translation> <translation id="6447842834002726250">ქუქი ფაილები</translation> +<translation id="6467852467360539617">მონაცემთა გასუფთავება და ნებართვების გადაყენება</translation> <translation id="6527303717912515753">გაზიარება</translation> <translation id="6545864417968258051">Bluetooth სკანირება</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -282,6 +283,7 @@ <translation id="7250468141469952378">არჩეულია <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> და <ph name="PERMISSION_2" /> დაშვებულია</translation> <translation id="7302486331832100261">როგორც წესი, თქვენ ბლოკავთ შეტყობინებებს. დასაშვებად შეხებით აირჩიეთ „დეტალები“.</translation> +<translation id="7383715096023715447">პარამეტრები <ph name="DOMAIN" />-ისთვის</translation> <translation id="7423098979219808738">წინასწარი შეკითხვა</translation> <translation id="7423538860840206698">გაცვლის ბუფერზე წვდომა დაბლოკილია</translation> <translation id="7425915948813553151">მუქი თემა საიტებისთვის</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb index e167152f5..ab315cd6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kk.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Белгілі бір сайт үшін бөгде қызметтер арқылы кіруді бөгеу.</translation> <translation id="6388207532828177975">Тазарту және қалпына келтіру</translation> <translation id="6398765197997659313">Толық экраннан шығу</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Сайттардың виртуалдық шындық құрылғыңызды және деректеріңізді пайдалануына тыйым салу</translation> <translation id="6447842834002726250">Cookie файлдары</translation> <translation id="6527303717912515753">Бөлісу</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb index 6e48017..23b03a7 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_km.xtb
@@ -240,8 +240,10 @@ <translation id="6367753977865761591">ទប់ស្កាត់ការចូលរបស់ភាគីទីបីសម្រាប់គេហទំព័រជាក់លាក់។</translation> <translation id="6388207532828177975">ជម្រះ និងកំណត់ឡើងវិញ</translation> <translation id="6398765197997659313">ចាកចេញពីអេក្រង់ពេញ</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">ទប់ស្កាត់គេហទំព័រមិនឱ្យប្រើទិន្នន័យ និងឧបករណ៍ VR របស់អ្នក</translation> <translation id="6447842834002726250">ខុកឃី</translation> +<translation id="6467852467360539617">សម្អាតទិន្នន័យ និងកំណត់ការអនុញ្ញាតឡើងវិញ</translation> <translation id="6527303717912515753">ចែករំលែក</translation> <translation id="6545864417968258051">ការស្កេនប៊្លូធូស</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -281,6 +283,7 @@ <translation id="7250468141469952378">បានជ្រើសរើស <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">បានអនុញ្ញាត <ph name="PERMISSION_1" /> និង <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">ជាធម្មតា អ្នកទប់ស្កាត់ការជូនដំណឹង។ ដើម្បីអនុញ្ញាត សូមចុច "ព័ត៌មានលម្អិត"។</translation> +<translation id="7383715096023715447">ការកំណត់សម្រាប់ <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">សួរជាមុនសិន</translation> <translation id="7423538860840206698">បានទប់ស្កាត់មិនឱ្យអានអង្គចងចាំ</translation> <translation id="7425915948813553151">រចនាប័ទ្មងងឹតសម្រាប់គេហទំព័រ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb index 0c16eecd..7a5e8af2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ky.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Белгилүү бир сайтка үчүнчү тараптан кирүүнү бөгөттөңүз.</translation> <translation id="6388207532828177975">Тазалоо жана баштапкы абалга келтирүү</translation> <translation id="6398765197997659313">Толук экран режиминен чыгуу</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Сайттарга виртуалдык чындык түзмөктөрүңүздү жана маалыматты колдонууга тыюу салуу</translation> <translation id="6447842834002726250">Кукилер</translation> <translation id="6527303717912515753">Бөлүшүү</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb index 75b27d8..ec91e6b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lv.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Trešās puses pierakstīšanās bloķēšana konkrētā vietnē</translation> <translation id="6388207532828177975">Notīrīt un atiestatīt</translation> <translation id="6398765197997659313">Iziet no pilnekrāna režīma</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Neļaut vietnēm izmantot jūsu virtuālās realitātes ierīci un datus</translation> <translation id="6447842834002726250">Sīkfaili</translation> <translation id="6527303717912515753">Kopīgot</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 24315a1e..9d9c14b1 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Сайтуудад таны виртуал бодит байдлын төхөөрөмж болон өгөгдлийг ашиглахыг хориглох</translation> <translation id="6447842834002726250">Cookies</translation> +<translation id="6467852467360539617">Өгөгдлийг цуцлаад зөвшөөрлийг шинэчлэх</translation> <translation id="6527303717912515753">Хуваалцах</translation> <translation id="6545864417968258051">Bluetooth скан хийх</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" />-г сонгосон</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> болон <ph name="PERMISSION_2" />-г зөвшөөрсөн</translation> <translation id="7302486331832100261">Та ихэвчлэн мэдэгдлийг хориглодог. Зөвшөөрөхийн тулд Дэлгэрэнгүй мэдээлэл дээр товшино уу.</translation> +<translation id="7383715096023715447"><ph name="DOMAIN" />-н тохиргоо</translation> <translation id="7423098979219808738">Эхлээд асуу</translation> <translation id="7423538860840206698">Түр санах ойгоос уншихыг хориглосон</translation> <translation id="7425915948813553151">Сайтуудад зориулсан бараан загвар</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb index 93b787d6..ddbdbef 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ms.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Sekat tapak daripada menggunakan peranti dan data realiti maya anda</translation> <translation id="6447842834002726250">Kuki</translation> +<translation id="6467852467360539617">Kosongkan data & tetapkan semula kebenaran</translation> <translation id="6527303717912515753">Kongsi</translation> <translation id="6545864417968258051">Pengimbasan Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi disekat}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> dan <ph name="NUM_MORE" /> lagi disekat}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> dan <ph name="PERMISSION_2" /> dibenarkan</translation> <translation id="7302486331832100261">Anda biasanya menyekat pemberitahuan. Untuk membenarkan pemberitahuan, ketik Butiran.</translation> +<translation id="7383715096023715447">Tetapan untuk <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Tanya dahulu</translation> <translation id="7423538860840206698">Disekat daripada membaca papan keratan</translation> <translation id="7425915948813553151">Tema gelap untuk laman</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 5eb3d41..51e3f63a 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">သင်၏ပကတိအသွင်စက်နှင့် ဒေတာများကို ဝဘ်ဆိုက်များက အသုံးမပြုနိုင်အောင် ပိတ်ထားရန်</translation> <translation id="6447842834002726250">ကူကီးများ</translation> +<translation id="6467852467360539617">ဒေတာကိုရှင်းပြီး ခွင့်ပြုချက်များ ပြင်ဆင်သတ်မှတ်ရန်</translation> <translation id="6527303717912515753">မျှဝေရန်</translation> <translation id="6545864417968258051">ဘလူးတုသ် ရှာဖွေခြင်း</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ခု ရွေးထားသည်</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> နှင့် <ph name="PERMISSION_2" /> ခွင့်ပြုထားသည်</translation> <translation id="7302486331832100261">ပုံမှန်အားဖြင့် သင်သည် အကြောင်းကြားချက်များကို ပိတ်ထားသည်။ ခွင့်ပြုရန် 'အသေးစိတ်များ' ကို တို့ပါ။</translation> +<translation id="7383715096023715447"><ph name="DOMAIN" /> အတွက် ဆက်တင်များ</translation> <translation id="7423098979219808738">အရင်မေးပါ</translation> <translation id="7423538860840206698">ကလစ်ဘုတ်ကို ကြည့်ရှုခွင့် ပိတ်ထားသည်</translation> <translation id="7425915948813553151">ဝဘ်ဆိုက်အတွက် မှောင်သည့် အပြင်အဆင်</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb index 9b011552..0111b6b3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_nl.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Voorkomen dat sites je virtualreality-apparaat en -gegevens gebruiken</translation> <translation id="6447842834002726250">Cookies</translation> +<translation id="6467852467360539617">Gegevens wissen en rechten resetten</translation> <translation id="6527303717912515753">Delen</translation> <translation id="6545864417968258051">Bluetooth-scannen</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" /> geblokkeerd}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> en nog <ph name="NUM_MORE" /> geblokkeerd}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> geselecteerd</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> en <ph name="PERMISSION_2" /> toegestaan</translation> <translation id="7302486331832100261">Meestal blokkeer je meldingen. Tik op Details om meldingen toe te staan.</translation> +<translation id="7383715096023715447">Instellingen voor <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Eerst vragen</translation> <translation id="7423538860840206698">Lezen van het klembord geblokkeerd</translation> <translation id="7425915948813553151">Donker thema voor sites</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 77c2c6ea..f143db3 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Blokkér nettsteder fra å bruke virtuell virkelighet-enheten din og -dataene dine</translation> <translation id="6447842834002726250">Informasjonskapsler</translation> +<translation id="6467852467360539617">Fjern data og tilbakestill tillatelser</translation> <translation id="6527303717912515753">Del</translation> <translation id="6545864417968258051">Bluetooth-skanning</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> til er blokkert}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> og <ph name="NUM_MORE" /> til er blokkert}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er valgt</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> og <ph name="PERMISSION_2" /> er tillatt</translation> <translation id="7302486331832100261">Du blokkerer vanligvis varsler. For å tillate dette trykker du på Detaljer.</translation> +<translation id="7383715096023715447">Innstillinger for <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Spør først</translation> <translation id="7423538860840206698">Blokkert fra å lese utklippstavlen</translation> <translation id="7425915948813553151">Mørkt tema for nettsteder</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb index e8822448..0489d78 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_or.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ସାଇଟ ପାଇଁ ତୃତୀୟ ପକ୍ଷ ସାଇନ-ଇନକୁ ବ୍ଲକ କରନ୍ତୁ।</translation> <translation id="6388207532828177975">ଖାଲି ଏବଂ ରିସେଟ୍ କରନ୍ତୁ</translation> <translation id="6398765197997659313">ପୂର୍ଣ୍ଣ ସ୍କ୍ରିନ୍ରୁ ପ୍ରସ୍ଥାନ କରନ୍ତୁ</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">ଆପଣଙ୍କର ଭର୍ଚୁଆଲ୍ ରିଆଲିଟୀ ଡିଭାଇସ୍ ଏବଂ ଡାଟା ବ୍ୟବହାର କରିବାରୁ ସାଇଟଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="6447842834002726250">କୁକୀଗୁଡିକ</translation> <translation id="6527303717912515753">ସେୟାର୍ କରନ୍ତୁ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb index 30f9095a..512b7416f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pa.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">ਸਾਈਟਾਂ ਨੂੰ ਤੁਹਾਡੇ ਆਭਾਸੀ ਵਾਸਤਵਿਕਤਾ ਡੀਵਾਈਸ ਅਤੇ ਡਾਟੇ ਨੂੰ ਵਰਤਣ ਤੋਂ ਬਲਾਕ ਕਰੋ</translation> <translation id="6447842834002726250">ਕੁਕੀਜ਼</translation> +<translation id="6467852467360539617">ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ ਅਤੇ ਇਜਾਜ਼ਤਾਂ ਰੀਸੈੱਟ ਕਰੋ</translation> <translation id="6527303717912515753">ਸ਼ੇਅਰ ਕਰੋ</translation> <translation id="6545864417968258051">ਬਲੂਟੁੱਥ ਸਕੈਨਿੰਗ</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ਨੂੰ ਚੁਣਿਆ ਗਿਆ</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> ਅਤੇ <ph name="PERMISSION_2" /> ਦੀ ਇਜਾਜ਼ਤ ਦਿੱਤੀ ਗਈ</translation> <translation id="7302486331832100261">ਆਮ ਤੌਰ 'ਤੇ ਤੁਸੀਂ ਸੂਚਨਾਵਾਂ ਨੂੰ ਬਲਾਕ ਕਰਦੇ ਹੋ। ਇਜਾਜ਼ਤ ਦੇਣ ਲਈ, ਵੇਰਵਿਆਂ 'ਤੇ ਟੈਪ ਕਰੋ।</translation> +<translation id="7383715096023715447"><ph name="DOMAIN" /> ਲਈ ਸੈਟਿੰਗਾਂ</translation> <translation id="7423098979219808738">ਪਹਿਲਾਂ ਪੁੱਛੋ</translation> <translation id="7423538860840206698">ਕਲਿੱਪਬੋਰਡ ਪੜ੍ਹਨ ਤੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ</translation> <translation id="7425915948813553151">ਸਾਈਟਾਂ ਲਈ ਗੂੜ੍ਹਾ ਥੀਮ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb index 824626b9..32bdfa69 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pl.xtb
@@ -240,8 +240,10 @@ <translation id="6367753977865761591">Blokowanie logowania się innych firm w określonej witrynie.</translation> <translation id="6388207532828177975">Wyczyść i zresetuj</translation> <translation id="6398765197997659313">Zamknij pełny ekran</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Nie zezwalaj stronom na korzystanie z urządzenia ani danych rzeczywistości wirtualnej</translation> <translation id="6447842834002726250">Pliki cookie</translation> +<translation id="6467852467360539617">Wyczyść dane i zresetuj uprawnienia</translation> <translation id="6527303717912515753">Udostępnij</translation> <translation id="6545864417968258051">Skanowanie Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Zablokowane: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}few{Zablokowane: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}many{Zablokowane: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}other{Zablokowane: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i jeszcze <ph name="NUM_MORE" />}}</translation> @@ -281,6 +283,7 @@ <translation id="7250468141469952378">Wybrano <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Dozwolone: <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Zazwyczaj blokujesz powiadomienia. Aby na nie zezwolić, kliknij Szczegóły.</translation> +<translation id="7383715096023715447">Ustawienia domeny <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Najpierw zapytaj</translation> <translation id="7423538860840206698">Zablokowano odczytywanie schowka</translation> <translation id="7425915948813553151">Ciemny motyw witryn</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb index 61e593a..d3d8338 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-BR.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Impedir que sites usem seus dispositivos e dados de realidade virtual</translation> <translation id="6447842834002726250">Cookies</translation> +<translation id="6467852467360539617">Limpar dados e redefinir permissões</translation> <translation id="6527303717912515753">Compartilhar</translation> <translation id="6545864417968258051">Verificação de Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Bloqueadas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}one{Bloqueadas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}other{Bloqueadas: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" />}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> itens selecionados</translation> <translation id="7260727271532453612">Permitidas: <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Você geralmente bloqueia notificações. Para permitir, toque em "Detalhes".</translation> +<translation id="7383715096023715447">Configurações de <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Perguntar primeiro</translation> <translation id="7423538860840206698">Leitura da área de transferência bloqueada</translation> <translation id="7425915948813553151">Tema escuro para sites</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb index ac3449c1..c6e403a6 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_pt-PT.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Impedir que os sites utilizem aos seus dados e dispositivo de realidade virtual</translation> <translation id="6447842834002726250">Cookies</translation> +<translation id="6467852467360539617">Limpar dados e repor autorizações</translation> <translation id="6527303717912515753">Partilhar</translation> <translation id="6545864417968258051">Procura de Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" /> bloqueadas.}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> e mais <ph name="NUM_MORE" /> bloqueadas.}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selecionado(s).</translation> <translation id="7260727271532453612">Autorização de <ph name="PERMISSION_1" /> e <ph name="PERMISSION_2" />.</translation> <translation id="7302486331832100261">Normalmente, bloqueia as notificações. Para permitir, toque em Detalhes.</translation> +<translation id="7383715096023715447">Definições do <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Perguntar primeiro</translation> <translation id="7423538860840206698">Leitura da área de transferência bloqueada</translation> <translation id="7425915948813553151">Tema escuro para sites</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 8099480..0437596 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Împiedică site-urile să folosească dispozitivul de realitate virtuală și datele conexe</translation> <translation id="6447842834002726250">Cookie-uri</translation> +<translation id="6467852467360539617">Șterge datele și resetează permisiunile</translation> <translation id="6527303717912515753">Trimite</translation> <translation id="6545864417968258051">Căutare Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" /> sunt blocate}few{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" /> sunt blocate}other{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> și încă <ph name="NUM_MORE" /> sunt blocate}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selectate</translation> <translation id="7260727271532453612"><ph name="PERMISSION_1" /> și <ph name="PERMISSION_2" /> sunt permise</translation> <translation id="7302486331832100261">De obicei blochezi notificările. Ca să le permiți, atinge Detalii.</translation> +<translation id="7383715096023715447">Setări pentru <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Mai întâi întreabă</translation> <translation id="7423538860840206698">Citirea clipboardului este blocată</translation> <translation id="7425915948813553151">Tema întunecată pentru site-uri</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb index 7f05ae7..8604feb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ru.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Блокировать вход через сторонние сервисы для определенного сайта.</translation> <translation id="6388207532828177975">Очистить и сбросить</translation> <translation id="6398765197997659313">Обычный режим</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Запретить сайтам использовать устройство и данные виртуальной реальности</translation> <translation id="6447842834002726250">Файлы сookie</translation> <translation id="6527303717912515753">Поделиться</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 7d7b77b..c239b14 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
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">නිශ්චිත අඩවියක් සඳහා තෙවන පාර්ශ්ව පිරීම අවහිර කරන්න.</translation> <translation id="6388207532828177975">මකන්න සහ යළි පිහිටුවන්න</translation> <translation id="6398765197997659313">සම්පුර්ණ තිරයෙන් ඉවත් වන්න</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">වෙබ් අඩවි ඔබේ අතත්ය යථාර්ථ උපාංගය සහ දත්ත හඹා යෑමෙන් අවහිර කරන්න</translation> <translation id="6447842834002726250">කුකීස්</translation> <translation id="6527303717912515753">බෙදාගන්න</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb index 8e02fed3..2f6a5e7c 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sk.xtb
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Brániť webom používať zariadenie a dáta pre virtuálnu realitu</translation> <translation id="6447842834002726250">Súbory cookie</translation> +<translation id="6467852467360539617">Vymazať údaje a resetovať povolenia</translation> <translation id="6527303717912515753">Zdieľať</translation> <translation id="6545864417968258051">Vyhľadávanie zariadení Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Sú blokované povolenia: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalšie}few{Sú blokované povolenia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalšie}many{<ph name="PERMISSION_1" />, <ph name="PERMISSION_2" />, and <ph name="NUM_MORE" /> more blocked}other{Sú blokované povolenia <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> a <ph name="NUM_MORE" /> ďalších}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378">Vybrané: <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Povolené: <ph name="PERMISSION_1" /> a <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Zvyčajne blokujete upozornenia. Ak ich chcete povoliť, klepnite na Podrobnosti.</translation> +<translation id="7383715096023715447">Nastavenia domény <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Najprv sa opýtať</translation> <translation id="7423538860840206698">Blokovať čítanie schránky</translation> <translation id="7425915948813553151">Tmavý motív pre weby</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb index 46a5cb91..6812322 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sl.xtb
@@ -240,8 +240,10 @@ <translation id="6367753977865761591">Blokiranje prijave prek zunanjih ponudnikov za določeno spletno mesto.</translation> <translation id="6388207532828177975">Izbriši in ponastavi</translation> <translation id="6398765197997659313">Izhod iz celozaslonskega načina</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Spletnim mestom prepreči spremljanje naprave in podatkov za navidezno resničnost</translation> <translation id="6447842834002726250">Piškotki</translation> +<translation id="6467852467360539617">Počisti podatke in ponastavi dovoljenja</translation> <translation id="6527303717912515753">Skupna raba</translation> <translation id="6545864417968258051">Iskanje naprav Bluetooth</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}one{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}two{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}few{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}other{Blokirano: <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> in še <ph name="NUM_MORE" />}}</translation> @@ -281,6 +283,7 @@ <translation id="7250468141469952378">Št. izbranih: <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Dovoljeno: <ph name="PERMISSION_1" /> in <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Obvestila običajno blokirate. Če želite to omogočiti, se dotaknite Podrobnosti.</translation> +<translation id="7383715096023715447">Nastavitve za domeno <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Najprej vprašaj</translation> <translation id="7423538860840206698">Blokirano branje vsebine odložišča</translation> <translation id="7425915948813553151">Temna tema za spletna mesta</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb index b82a95e..1b0ab81 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sq.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Blloko identifikimin e palëve të treta për një sajt specifik.</translation> <translation id="6388207532828177975">Pastro dhe rivendos</translation> <translation id="6398765197997659313">Dil nga ekrani i plotë</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Blloko sajtet që të mos përdorin pajisjen e realitetit virtual dhe të dhënat e tua</translation> <translation id="6447842834002726250">Kukit</translation> <translation id="6527303717912515753">Ndaj</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 b286ec8..a19d33db 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Ne dozvoljava sajtovima da koriste uređaj i podatke virtuelne realnosti</translation> <translation id="6447842834002726250">Kolačići</translation> +<translation id="6467852467360539617">Obriši podatke i resetuj dozvole</translation> <translation id="6527303717912515753">Deli</translation> <translation id="6545864417968258051">Bluetooth skeniranje</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,plural, =1{Blokirane su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}one{Blokirane su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}few{Blokirane su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}other{Blokirane su dozvole <ph name="PERMISSION_1" />, <ph name="PERMISSION_2" /> i još <ph name="NUM_MORE" />}}</translation> @@ -282,6 +283,7 @@ <translation id="7250468141469952378">Izabrali ste <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Odobrene su dozvole <ph name="PERMISSION_1" /> i <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Obično blokirate obaveštenja. Da biste ih dozvolili, dodirnite Detalji.</translation> +<translation id="7383715096023715447">Podešavanja za <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Prvo pitaj</translation> <translation id="7423538860840206698">Čitanje privremene memorije je blokirano</translation> <translation id="7425915948813553151">Tamna tema za sajtove</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 2e9a94a0..ecc7f27f 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
@@ -243,6 +243,7 @@ <translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Не дозвољава сајтовима да користе уређај и податке виртуелне реалности</translation> <translation id="6447842834002726250">Колачићи</translation> +<translation id="6467852467360539617">Обриши податке и ресетуј дозволе</translation> <translation id="6527303717912515753">Дели</translation> <translation id="6545864417968258051">Bluetooth скенирање</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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" />}few{Блокиране су дозволе <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> @@ -282,6 +283,7 @@ <translation id="7250468141469952378">Изабрали сте <ph name="ITEM_COUNT" /></translation> <translation id="7260727271532453612">Одобрене су дозволе <ph name="PERMISSION_1" /> и <ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">Обично блокирате обавештења. Да бисте их дозволили, додирните Детаљи.</translation> +<translation id="7383715096023715447">Подешавања за <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">Прво питај</translation> <translation id="7423538860840206698">Читање привремене меморије је блокирано</translation> <translation id="7425915948813553151">Тамна тема за сајтове</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb index faea8016b..99ccdc9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sv.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Blockera inloggning hos tredje part på en viss webbplats.</translation> <translation id="6388207532828177975">Ta bort och återställ</translation> <translation id="6398765197997659313">Avsluta helskärmsläge</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Blockera webbplatser från att använda VR-enheter och VR-data</translation> <translation id="6447842834002726250">Cookies</translation> <translation id="6527303717912515753">Dela</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb index 8f730c7..07c4679 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_sw.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Zuia uingiaji wa wahusika wengine katika akaunti kwenye tovuti mahususi.</translation> <translation id="6388207532828177975">Futa na uweke upya</translation> <translation id="6398765197997659313">Ondoka kwenye Skrini nzima</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Zuia tovuti zisitumie data na vifaa vyako vya uhalisia pepe</translation> <translation id="6447842834002726250">Vidakuzi</translation> <translation id="6527303717912515753">Shiriki</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb index 2e78ac0..bb37fa4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ta.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">குறிப்பிட்ட தளத்திற்கு மூன்றாம் தரப்பு உள்நுழைவைத் தடுக்கும்.</translation> <translation id="6388207532828177975">அழித்து, மீட்டமைக்கவும்</translation> <translation id="6398765197997659313">முழுத்திரையிலிருந்து வெளியேறு</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">விர்ச்சுவல் ரியாலிட்டி சாதனத்தையும் தரவையும் தளங்கள் பயன்படுத்துவதைத் தடு</translation> <translation id="6447842834002726250">குக்கீகள்</translation> <translation id="6527303717912515753">பகிர்</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb index 9d8e2830..57807df 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_th.xtb
@@ -240,8 +240,10 @@ <translation id="6367753977865761591">บล็อกการลงชื่อเข้าใช้ของบุคคลที่สามสำหรับบางเว็บไซต์</translation> <translation id="6388207532828177975">ล้างข้อมูลและรีเซ็ต</translation> <translation id="6398765197997659313">ออกจากการแสดงแบบเต็มหน้าจอ</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">บล็อกเว็บไซต์ไม่ให้ใช้อุปกรณ์และข้อมูล Virtual Reality ของคุณ</translation> <translation id="6447842834002726250">คุกกี้</translation> +<translation id="6467852467360539617">ล้างข้อมูลและรีเซ็ตสิทธิ์</translation> <translation id="6527303717912515753">แชร์</translation> <translation id="6545864417968258051">การสแกนหาบลูทูธ</translation> <translation id="6552800053856095716">{PERMISSIONS_SUMMARY_BLOCKED,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> @@ -281,6 +283,7 @@ <translation id="7250468141469952378">เลือกไว้ <ph name="ITEM_COUNT" /> รายการ</translation> <translation id="7260727271532453612">อนุญาตให้เข้าถึง<ph name="PERMISSION_1" />และ<ph name="PERMISSION_2" /></translation> <translation id="7302486331832100261">คุณมักจะบล็อกการแจ้งเตือน หากต้องการอนุญาต ให้แตะ "รายละเอียด"</translation> +<translation id="7383715096023715447">การตั้งค่าสำหรับ <ph name="DOMAIN" /></translation> <translation id="7423098979219808738">ถามก่อน</translation> <translation id="7423538860840206698">บล็อกไม่ให้อ่านคลิปบอร์ด</translation> <translation id="7425915948813553151">ธีมมืดสำหรับเว็บไซต์</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb index 263daec..7dee1a4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uk.xtb
@@ -240,6 +240,7 @@ <translation id="6367753977865761591">Заблокувати вхід через сторонні сервіси для певного сайту.</translation> <translation id="6388207532828177975">Очистити та скинути</translation> <translation id="6398765197997659313">Вийти з повноекранного режиму</translation> +<translation id="6405650995156823521"><ph name="FIRST_PART" /> • <ph name="SECOND_PART" /></translation> <translation id="6439114592976064011">Заборонити сайтам доступ до даних і пристрою віртуальної реальності</translation> <translation id="6447842834002726250">Файли cookie</translation> <translation id="6527303717912515753">Надіслати</translation>
diff --git a/components/cast_streaming/browser/cast_streaming_session.cc b/components/cast_streaming/browser/cast_streaming_session.cc index d611b925..f505fcd 100644 --- a/components/cast_streaming/browser/cast_streaming_session.cc +++ b/components/cast_streaming/browser/cast_streaming_session.cc
@@ -130,25 +130,18 @@ return absl::nullopt; } - if (!audio_consumer_) { - // We can use unretained pointers here because StreamConsumer is owned by - // this object and |client_| is guaranteed to outlive this object. Here, - // the duration is set to kNoTimestamp so the audio renderer does not block. - // Audio frames duration is not known ahead of time in mirroring. - audio_consumer_ = std::make_unique<StreamConsumer>( - initialization_info.audio_stream_info->receiver, media::kNoTimestamp, - std::move(data_pipe_producer), - base::BindRepeating( - &CastStreamingSession::Client::OnAudioBufferReceived, - base::Unretained(client_)), - base::BindRepeating(&base::OneShotTimer::Reset, - base::Unretained(&data_timeout_timer_))); - } else { - audio_consumer_ = std::make_unique<StreamConsumer>( - std::move(*audio_consumer_), - initialization_info.audio_stream_info->receiver, - std::move(data_pipe_producer)); - } + // We can use unretained pointers here because StreamConsumer is owned by + // this object and |client_| is guaranteed to outlive this object. Here, + // the duration is set to kNoTimestamp so the audio renderer does not block. + // Audio frames duration is not known ahead of time in mirroring. + DCHECK(!audio_consumer_); + audio_consumer_ = std::make_unique<StreamConsumer>( + initialization_info.audio_stream_info->receiver, media::kNoTimestamp, + std::move(data_pipe_producer), + base::BindRepeating(&CastStreamingSession::Client::OnAudioBufferReceived, + base::Unretained(client_)), + base::BindRepeating(&base::OneShotTimer::Reset, + base::Unretained(&data_timeout_timer_))); return data_pipe_consumer; } @@ -168,29 +161,22 @@ return absl::nullopt; } - if (!video_consumer_) { - // We can use unretained pointers here because StreamConsumer is owned by - // this object and |client_| is guaranteed to outlive this object. - // |data_timeout_timer_| is also owned by this object and will outlive both - // StreamConsumers. - // The frame duration is set to 10 minutes to work around cases where - // senders do not send data for a long period of time. We end up with - // overlapping video frames but this is fine since the media pipeline mostly - // considers the playout time when deciding which frame to present or play - video_consumer_ = std::make_unique<StreamConsumer>( - initialization_info.video_stream_info->receiver, base::Minutes(10), - std::move(data_pipe_producer), - base::BindRepeating( - &CastStreamingSession::Client::OnVideoBufferReceived, - base::Unretained(client_)), - base::BindRepeating(&base::OneShotTimer::Reset, - base::Unretained(&data_timeout_timer_))); - } else { - video_consumer_ = std::make_unique<StreamConsumer>( - std::move(*video_consumer_), - initialization_info.video_stream_info->receiver, - std::move(data_pipe_producer)); - } + // We can use unretained pointers here because StreamConsumer is owned by + // this object and |client_| is guaranteed to outlive this object. + // |data_timeout_timer_| is also owned by this object and will outlive both + // StreamConsumers. + // The frame duration is set to 10 minutes to work around cases where + // senders do not send data for a long period of time. We end up with + // overlapping video frames but this is fine since the media pipeline mostly + // considers the playout time when deciding which frame to present or play + DCHECK(!video_consumer_); + video_consumer_ = std::make_unique<StreamConsumer>( + initialization_info.video_stream_info->receiver, base::Minutes(10), + std::move(data_pipe_producer), + base::BindRepeating(&CastStreamingSession::Client::OnVideoBufferReceived, + base::Unretained(client_)), + base::BindRepeating(&base::OneShotTimer::Reset, + base::Unretained(&data_timeout_timer_))); return data_pipe_consumer; } @@ -304,10 +290,11 @@ playback_command_dispatcher_->OnRemotingSessionEnded(); } + audio_consumer_.reset(); + video_consumer_.reset(); + switch (reason) { case ReceiversDestroyingReason::kEndOfSession: - audio_consumer_.reset(); - video_consumer_.reset(); client_->OnSessionEnded(); break; case ReceiversDestroyingReason::kRenegotiated:
diff --git a/components/cast_streaming/browser/demuxer_stream_data_provider.h b/components/cast_streaming/browser/demuxer_stream_data_provider.h index 6cc294cd..ff539a5 100644 --- a/components/cast_streaming/browser/demuxer_stream_data_provider.h +++ b/components/cast_streaming/browser/demuxer_stream_data_provider.h
@@ -5,6 +5,8 @@ #ifndef COMPONENTS_CAST_STREAMING_BROWSER_DEMUXER_STREAM_DATA_PROVIDER_H_ #define COMPONENTS_CAST_STREAMING_BROWSER_DEMUXER_STREAM_DATA_PROVIDER_H_ +#include <type_traits> + #include "base/callback_forward.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" @@ -18,15 +20,19 @@ namespace cast_streaming { // Forward declarations of concrete types. Definitions to follow. -template <typename TMojoReceiverType, typename TStreamInfoType> +template <typename TMojoReceiverType, + typename TStreamInfoType, + typename TGetBufferResponseType> class DemuxerStreamDataProvider; using AudioDemuxerStreamDataProvider = DemuxerStreamDataProvider<mojom::AudioBufferRequester, - mojom::AudioStreamInfoPtr>; + mojom::AudioStreamInfoPtr, + mojom::GetAudioBufferResponsePtr>; using VideoDemuxerStreamDataProvider = DemuxerStreamDataProvider<mojom::VideoBufferRequester, - mojom::VideoStreamInfoPtr>; + mojom::VideoStreamInfoPtr, + mojom::GetVideoBufferResponsePtr>; // Helper class to simplify responding to calls made over AudioBufferRequester // and VideoBufferRequester mojo APIs. @@ -35,7 +41,11 @@ // Currently expected to be either AudioBufferRequester or VideoBufferRequester. // |TStreamInfoType| is the StreamInfo that may be returned by this call, either // AudioStreamInfo or VideoStreamInfo. -template <typename TMojoReceiverType, typename TStreamInfoType> +// |TGetBufferResponseType| is the response type to a GetBuffer() call. Either +// GetAudioBufferResponse or GetVideoBufferResponse. +template <typename TMojoReceiverType, + typename TStreamInfoType, + typename TGetBufferResponseType> class DemuxerStreamDataProvider : public TMojoReceiverType { public: // Deduce the Config type associated with this Mojo API (either @@ -73,6 +83,11 @@ config_ = std::move(config); next_stream_info_ = TStreamInfoType::element_type::New(config_, std::move(handle)); + if (current_callback_) { + std::move(current_callback_) + .Run(TGetBufferResponseType::element_type::NewStreamInfo( + std::move(next_stream_info_))); + } } // Sets the buffer to be passed to the renderer process as part of the @@ -80,11 +95,11 @@ void ProvideBuffer(media::mojom::DecoderBufferPtr buffer) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(current_callback_); + DCHECK(!next_stream_info_); - // NOTE: |next_stream_info_| may be empty if none has been set since the - // last time this method was called. std::move(current_callback_) - .Run(std::move(next_stream_info_), std::move(buffer)); + .Run( + TGetBufferResponseType::element_type::NewBuffer(std::move(buffer))); } const ConfigType& config() const { @@ -122,6 +137,13 @@ return; } + if (next_stream_info_) { + std::move(callback).Run( + TGetBufferResponseType::element_type::NewStreamInfo( + std::move(next_stream_info_))); + return; + } + current_callback_ = std::move(callback); request_buffer_.Run( base::BindOnce(&DemuxerStreamClient::OnNoBuffersAvailable, client_)); @@ -132,7 +154,7 @@ if (client_) { client_->EnableBitstreamConverter(std::move(callback)); } else { - std::move(callback).Run(false); + std::move(callback).Run(true); LOG(WARNING) << "EnableBitstreamConverter() called when no client was available"; }
diff --git a/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc b/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc index 992a1c7..6ac8986 100644 --- a/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc +++ b/components/cast_streaming/browser/demuxer_stream_data_provider_unittest.cc
@@ -80,16 +80,18 @@ MOCK_METHOD0(OnGetBufferDoneCalled, void()); void OnGetBufferDone(absl::optional<media::AudioDecoderConfig> config, scoped_refptr<media::DecoderBuffer> buffer_expected, - mojom::AudioStreamInfoPtr data_stream_info, - media::mojom::DecoderBufferPtr buffer) { - ASSERT_TRUE(!!buffer); - scoped_refptr<media::DecoderBuffer> media_buffer( - buffer.To<scoped_refptr<media::DecoderBuffer>>()); - EXPECT_TRUE(buffer_expected->MatchesMetadataForTesting(*media_buffer)); + mojom::GetAudioBufferResponsePtr get_buffer_response) { + if (get_buffer_response->is_buffer()) { + scoped_refptr<media::DecoderBuffer> media_buffer( + get_buffer_response->get_buffer() + .To<scoped_refptr<media::DecoderBuffer>>()); + EXPECT_TRUE(buffer_expected->MatchesMetadataForTesting(*media_buffer)); + } - ASSERT_EQ(!!config, !!data_stream_info); + ASSERT_EQ(!!config, !!get_buffer_response->is_stream_info()); if (config) { - EXPECT_TRUE(config->Matches(data_stream_info->decoder_config)); + EXPECT_TRUE(config->Matches( + get_buffer_response->get_stream_info()->decoder_config)); } OnGetBufferDoneCalled(); @@ -136,50 +138,65 @@ }; TEST_F(DemuxerStreamDataProviderTest, DataSentInOrderExpected) { - // Test first call, providing a config and a buffer. + // Test providing a config. EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); - remote_->GetBuffer(base::BindOnce( - &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, - base::Unretained(&callbacks_), first_config_, first_buffer_)); + remote_->GetBuffer( + base::BindOnce(&DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, + base::Unretained(&callbacks_), first_config_, + scoped_refptr<media::DecoderBuffer>())); task_environment_.RunUntilIdle(); - EXPECT_CALL(callbacks_, OnGetBufferDoneCalled()); MojoPipePair pipes = GetMojoPipePair(); data_provider_->OnNewStreamInfo(first_config_, std::move(pipes.second)); EXPECT_TRUE(first_config_.Matches(data_provider_->config())); task_environment_.RunUntilIdle(); + + // Test providing a buffer. + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); + remote_->GetBuffer(base::BindOnce( + &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, + base::Unretained(&callbacks_), absl::nullopt, first_buffer_)); + task_environment_.RunUntilIdle(); + EXPECT_CALL(callbacks_, OnGetBufferDoneCalled()); data_provider_->ProvideBuffer( media::mojom::DecoderBuffer::From(*first_buffer_)); task_environment_.RunUntilIdle(); EXPECT_TRUE(first_config_.Matches(data_provider_->config())); - // Test second call, providing NO config but do provide a buffer. + // Test providing a different buffer. EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); remote_->GetBuffer(base::BindOnce( &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, base::Unretained(&callbacks_), absl::nullopt, second_buffer_)); task_environment_.RunUntilIdle(); - EXPECT_CALL(callbacks_, OnGetBufferDoneCalled()); - task_environment_.RunUntilIdle(); data_provider_->ProvideBuffer( media::mojom::DecoderBuffer::From(*second_buffer_)); EXPECT_TRUE(first_config_.Matches(data_provider_->config())); task_environment_.RunUntilIdle(); - // Test third call, providing a different config and a buffer. + // Test providing a different config. EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); - remote_->GetBuffer(base::BindOnce( - &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, - base::Unretained(&callbacks_), second_config_, third_buffer_)); + remote_->GetBuffer( + base::BindOnce(&DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, + base::Unretained(&callbacks_), second_config_, + scoped_refptr<media::DecoderBuffer>())); task_environment_.RunUntilIdle(); - + task_environment_.RunUntilIdle(); EXPECT_CALL(callbacks_, OnGetBufferDoneCalled()); - task_environment_.RunUntilIdle(); pipes = GetMojoPipePair(); EXPECT_TRUE(first_config_.Matches(data_provider_->config())); data_provider_->OnNewStreamInfo(second_config_, std::move(pipes.second)); EXPECT_TRUE(second_config_.Matches(data_provider_->config())); + task_environment_.RunUntilIdle(); + + // Test providing a third buffer. + EXPECT_CALL(callbacks_, RequestBuffer(testing::_)); + remote_->GetBuffer(base::BindOnce( + &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, + base::Unretained(&callbacks_), absl::nullopt, third_buffer_)); + task_environment_.RunUntilIdle(); + EXPECT_CALL(callbacks_, OnGetBufferDoneCalled()); data_provider_->ProvideBuffer( media::mojom::DecoderBuffer::From(*third_buffer_)); task_environment_.RunUntilIdle(); @@ -193,7 +210,7 @@ EXPECT_CALL(client_, OnNoBuffersAvailable()); remote_->GetBuffer(base::BindOnce( &DemuxerStreamDataProviderTest::Callbacks::OnGetBufferDone, - base::Unretained(&callbacks_), first_config_, first_buffer_)); + base::Unretained(&callbacks_), absl::nullopt, first_buffer_)); task_environment_.RunUntilIdle(); } @@ -201,7 +218,6 @@ EXPECT_CALL(client_, EnableBitstreamConverter(testing::_)) .WillOnce( [](base::OnceCallback<void(bool)> cb) { std::move(cb).Run(true); }); - ; remote_->EnableBitstreamConverter(base::OnceCallback<void(bool)>()); task_environment_.RunUntilIdle(); }
diff --git a/components/cast_streaming/browser/playback_command_dispatcher.cc b/components/cast_streaming/browser/playback_command_dispatcher.cc index 062a9853..fd2f87f 100644 --- a/components/cast_streaming/browser/playback_command_dispatcher.cc +++ b/components/cast_streaming/browser/playback_command_dispatcher.cc
@@ -248,14 +248,12 @@ if (streaming_init_info_->audio_stream_info) { auto client = demuxer_stream_handler_->GetAudioClient(); DCHECK(client); - client->OnNoBuffersAvailable(); streaming_init_info_->audio_stream_info->demuxer_stream_client = std::move(client); } if (streaming_init_info_->video_stream_info) { auto client = demuxer_stream_handler_->GetVideoClient(); DCHECK(client); - client->OnNoBuffersAvailable(); streaming_init_info_->video_stream_info->demuxer_stream_client = std::move(client); }
diff --git a/components/cast_streaming/public/mojom/demuxer_connector.mojom b/components/cast_streaming/public/mojom/demuxer_connector.mojom index 00ef810..55b7419 100644 --- a/components/cast_streaming/public/mojom/demuxer_connector.mojom +++ b/components/cast_streaming/public/mojom/demuxer_connector.mojom
@@ -24,13 +24,27 @@ handle<data_pipe_consumer> data_pipe; }; +// Response type for AudioBufferRequester::GetBuffer(). See this method for +// further details. +union GetAudioBufferResponse { + AudioStreamInfo stream_info; + media.mojom.DecoderBuffer buffer; +}; + +// Response type for VideoBufferRequester::GetBuffer(). See this method for +// further details. +union GetVideoBufferResponse { + VideoStreamInfo stream_info; + media.mojom.DecoderBuffer buffer; +}; + // Provides a "pull" mechanism to request DecoderBuffer frames of audio data. // This will be used by the DemuxerStream within the renderer process to // request from the browser process a new frame of audio data to play out. interface AudioBufferRequester { // Requests more information about the cast streaming session's data stream to - // the renderer process. This will be in the form of one |buffer|, and - // potentially one |stream_info|. + // the renderer process. This will be in the form of one |buffer| or one + // |stream_info|, as detailed in the GetAudioBufferResponse type. // // The |buffer| data itself is on the associated |data_pipe|, from the // AudioStreamInfo most recently provided during this or a prior call to this @@ -39,14 +53,13 @@ // // |stream_info| is provided only when the audio configuration has changed. // The new |decoder_config| and |data_pipe| provided in this instance should - // be used for this and all future calls of this method, until a new - // |stream_info| is provided. + // be used for all future calls of this method, until a new |stream_info| is + // provided. // // Only one call to this method may be in-flight at a time. Or, in other // words, this method may not be called a second time until the prior call // returns. - GetBuffer() => (AudioStreamInfo? stream_info, - media.mojom.DecoderBuffer buffer); + GetBuffer() => (GetAudioBufferResponse buffer_response); // Requests that the data source providing audio buffers enable its bitstream // converter. Returns whether the operation was successful. @@ -58,8 +71,7 @@ // request from the browser process a new frame of video data to display. interface VideoBufferRequester { // As AudioBufferRequester::GetBuffer() above. - GetBuffer() => (VideoStreamInfo? stream_info, - media.mojom.DecoderBuffer buffer); + GetBuffer() => (GetVideoBufferResponse buffer_response); // As AudioBufferRequester::EnableBitstreamConverter() above. EnableBitstreamConverter() => (bool success);
diff --git a/components/cast_streaming/renderer/cast_streaming_demuxer.cc b/components/cast_streaming/renderer/cast_streaming_demuxer.cc index 2016431..361ef7b7 100644 --- a/components/cast_streaming/renderer/cast_streaming_demuxer.cc +++ b/components/cast_streaming/renderer/cast_streaming_demuxer.cc
@@ -4,6 +4,7 @@ #include "components/cast_streaming/renderer/cast_streaming_demuxer.h" +#include <type_traits> #include <utility> #include <vector> @@ -31,7 +32,11 @@ // Currently expected to be either AudioBufferRequester or VideoBufferRequester. // |TStreamInfoType| is the StreamInfo that may be returned by this call, either // AudioStreamInfo or VideoStreamInfo. -template <typename TMojoRemoteType, typename TStreamInfoType> +// |TGetBufferResponseType| is the response type to a GetBuffer() call. Either +// GetAudioBufferResponse or GetVideoBufferResponse. +template <typename TMojoRemoteType, + typename TStreamInfoType, + typename TGetBufferResponseType> class CastStreamingDemuxerStream : public media::DemuxerStream { public: CastStreamingDemuxerStream( @@ -50,10 +55,6 @@ OnNewConfig(std::move(stream_initialization_info)); DCHECK(pending_config_change_); pending_config_change_ = false; - - // Request the first buffer from the browser process, to be returned - // asynchronously as the response to the first Read() call. - RequestNextBuffer(); } ~CastStreamingDemuxerStream() override { @@ -95,11 +96,6 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(buffer); - // Starts an asynchronous callback to the browser. Will not be handled as - // part of the current call sequence, but instead will be used as part of - // the next call to Read(). - RequestNextBuffer(); - // Stop processing the pending buffer. OnMojoDisconnect() will trigger // sending kAborted on subsequent Read() calls. This can happen if this // object was in the process of reading a buffer off the data pipe when the @@ -135,19 +131,18 @@ } // Processes a new buffer as received over mojo. - void OnGetBufferDone(TStreamInfoType data_stream_info, - media::mojom::DecoderBufferPtr buffer) { + void OnGetBufferDone(TGetBufferResponseType get_buffer_response) { DVLOG(3) << __func__; DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - if (data_stream_info) { - OnNewConfig(std::move(data_stream_info)); - } - DCHECK(buffer_reader_); - // Eventually calls OnBufferReady(). - buffer_reader_->ProvideBuffer(std::move(buffer)); + if (get_buffer_response->is_stream_info()) { + OnNewConfig(std::move(get_buffer_response->get_stream_info())); + } else { + // Eventually calls OnBufferReady(). + buffer_reader_->ProvideBuffer( + std::move(get_buffer_response->get_buffer())); + } } // Called when a new config is received over mojo. Sets for the next call to @@ -182,7 +177,18 @@ } } - void OnBitstreamConverterEnabled(bool success) { NOTIMPLEMENTED_LOG_ONCE(); } + void OnBitstreamConverterEnabled(bool success) { + if (!success) { + LOG(ERROR) << "Failed to enable Bitstream Converter"; + OnMojoDisconnect(); + return; + } + + is_bitstream_enable_in_progress_ = false; + if (pending_read_cb_) { + Read(std::move(pending_read_cb_)); + } + } // DemuxerStream partial implementation. void Read(ReadCB read_cb) final { @@ -210,11 +216,21 @@ return; } + // If enabling bitstream conversion is in progress, do not send a Read() + // request until that has succeeded. + if (is_bitstream_enable_in_progress_) { + return; + } + + // Request a new buffer from the browser process. + RequestNextBuffer(); + // Eventually this will call OnBufferReady(). buffer_reader_->ReadBufferAsync(); } void EnableBitstreamConverter() final { + is_bitstream_enable_in_progress_ = true; remote_->EnableBitstreamConverter( base::BindOnce(&CastStreamingDemuxerStream::OnBitstreamConverterEnabled, weak_factory_.GetWeakPtr())); @@ -244,6 +260,8 @@ // True when this stream is undergoing a decoder configuration change. bool pending_config_change_ = false; + bool is_bitstream_enable_in_progress_ = false; + SEQUENCE_CHECKER(sequence_checker_); base::WeakPtrFactory<CastStreamingDemuxerStream> weak_factory_; @@ -253,11 +271,13 @@ class CastStreamingAudioDemuxerStream final : public CastStreamingDemuxerStream<mojom::AudioBufferRequester, - mojom::AudioStreamInfoPtr> { + mojom::AudioStreamInfoPtr, + mojom::GetAudioBufferResponsePtr> { public: using CastStreamingDemuxerStream< mojom::AudioBufferRequester, - mojom::AudioStreamInfoPtr>::CastStreamingDemuxerStream; + mojom::AudioStreamInfoPtr, + mojom::GetAudioBufferResponsePtr>::CastStreamingDemuxerStream; ~CastStreamingAudioDemuxerStream() override = default; @@ -273,11 +293,13 @@ class CastStreamingVideoDemuxerStream final : public CastStreamingDemuxerStream<mojom::VideoBufferRequester, - mojom::VideoStreamInfoPtr> { + mojom::VideoStreamInfoPtr, + mojom::GetVideoBufferResponsePtr> { public: using CastStreamingDemuxerStream< mojom::VideoBufferRequester, - mojom::VideoStreamInfoPtr>::CastStreamingDemuxerStream; + mojom::VideoStreamInfoPtr, + mojom::GetVideoBufferResponsePtr>::CastStreamingDemuxerStream; ~CastStreamingVideoDemuxerStream() override = default;
diff --git a/components/cdm/renderer/android_key_systems.cc b/components/cdm/renderer/android_key_systems.cc index d5a17359..27efacf 100644 --- a/components/cdm/renderer/android_key_systems.cc +++ b/components/cdm/renderer/android_key_systems.cc
@@ -21,7 +21,7 @@ #endif // BUILDFLAG(ENABLE_WIDEVINE) using media::CdmSessionType; -using media::EmeConfigRule; +using media::EmeConfig; using media::EmeConfigRuleState; using media::EmeFeatureSupport; using media::EmeInitDataType; @@ -64,12 +64,12 @@ return false; } - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( EncryptionScheme encryption_scheme) const override { if (encryption_scheme == EncryptionScheme::kCenc) { - return EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } } @@ -77,7 +77,7 @@ return supported_codecs_; } - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, media::EmeMediaType media_type, const std::string& requested_robustness, @@ -88,15 +88,14 @@ // incompatibility at this point, it will still be caught by the rule logic // in KeySystemConfigSelector: crbug.com/1204284 if (requested_robustness.empty()) { - return EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } } - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport() - const override { - return absl::nullopt; + EmeConfig::Rule GetPersistentLicenseSessionSupport() const override { + return media::EmeConfig::UnsupportedRule(); } EmeFeatureSupport GetPersistentStateSupport() const override { return EmeFeatureSupport::ALWAYS_ENABLED;
diff --git a/components/cdm/renderer/external_clear_key_key_system_properties.cc b/components/cdm/renderer/external_clear_key_key_system_properties.cc index f2a9612..555a118 100644 --- a/components/cdm/renderer/external_clear_key_key_system_properties.cc +++ b/components/cdm/renderer/external_clear_key_key_system_properties.cc
@@ -47,41 +47,41 @@ return false; } -absl::optional<media::EmeConfigRule> +absl::optional<media::EmeConfig> ExternalClearKeyProperties::GetEncryptionSchemeConfigRule( media::EncryptionScheme encryption_scheme) const { switch (encryption_scheme) { case media::EncryptionScheme::kCenc: case media::EncryptionScheme::kCbcs: - return media::EmeConfigRule(); + return media::EmeConfig::SupportedRule(); case media::EncryptionScheme::kUnencrypted: break; } NOTREACHED(); - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } media::SupportedCodecs ExternalClearKeyProperties::GetSupportedCodecs() const { return media::EME_CODEC_MP4_ALL | media::EME_CODEC_WEBM_ALL; } -absl::optional<media::EmeConfigRule> +absl::optional<media::EmeConfig> ExternalClearKeyProperties::GetRobustnessConfigRule( const std::string& key_system, media::EmeMediaType media_type, const std::string& requested_robustness, const bool* /*hw_secure_requirement*/) const { if (requested_robustness.empty()) { - return media::EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } } // Persistent license sessions are faked. -absl::optional<media::EmeConfigRule> +absl::optional<media::EmeConfig> ExternalClearKeyProperties::GetPersistentLicenseSessionSupport() const { - return media::EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } media::EmeFeatureSupport ExternalClearKeyProperties::GetPersistentStateSupport()
diff --git a/components/cdm/renderer/external_clear_key_key_system_properties.h b/components/cdm/renderer/external_clear_key_key_system_properties.h index 50575b6..e580d42 100644 --- a/components/cdm/renderer/external_clear_key_key_system_properties.h +++ b/components/cdm/renderer/external_clear_key_key_system_properties.h
@@ -24,16 +24,15 @@ bool IsSupportedKeySystem(const std::string& key_system) const override; bool IsSupportedInitDataType( media::EmeInitDataType init_data_type) const override; - absl::optional<media::EmeConfigRule> GetEncryptionSchemeConfigRule( + media::EmeConfig::Rule GetEncryptionSchemeConfigRule( media::EncryptionScheme encryption_scheme) const override; media::SupportedCodecs GetSupportedCodecs() const override; - absl::optional<media::EmeConfigRule> GetRobustnessConfigRule( + media::EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, media::EmeMediaType media_type, const std::string& requested_robustness, const bool* hw_secure_requirement) const override; - absl::optional<media::EmeConfigRule> GetPersistentLicenseSessionSupport() - const override; + media::EmeConfig::Rule GetPersistentLicenseSessionSupport() const override; media::EmeFeatureSupport GetPersistentStateSupport() const override; media::EmeFeatureSupport GetDistinctiveIdentifierSupport() const override; };
diff --git a/components/cdm/renderer/widevine_key_system_properties.cc b/components/cdm/renderer/widevine_key_system_properties.cc index 185adda7..c3d120e6 100644 --- a/components/cdm/renderer/widevine_key_system_properties.cc +++ b/components/cdm/renderer/widevine_key_system_properties.cc
@@ -18,7 +18,7 @@ #endif using media::CdmSessionType; -using media::EmeConfigRule; +using media::EmeConfig; using media::EmeConfigRuleState; using media::EmeFeatureSupport; using media::EmeInitDataType; @@ -117,20 +117,19 @@ return false; } -absl::optional<EmeConfigRule> -WidevineKeySystemProperties::GetEncryptionSchemeConfigRule( +EmeConfig::Rule WidevineKeySystemProperties::GetEncryptionSchemeConfigRule( EncryptionScheme encryption_scheme) const { bool is_supported = encryption_schemes_.contains(encryption_scheme); bool is_hw_secure_supported = hw_secure_encryption_schemes_.contains(encryption_scheme); if (is_supported && is_hw_secure_supported) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } else if (is_supported && !is_hw_secure_supported) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } else if (!is_supported && is_hw_secure_supported) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } } @@ -143,15 +142,14 @@ return hw_secure_codecs_; } -absl::optional<EmeConfigRule> -WidevineKeySystemProperties::GetRobustnessConfigRule( +EmeConfig::Rule WidevineKeySystemProperties::GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* hw_secure_requirement) const { Robustness robustness = ConvertRobustness(requested_robustness); if (robustness == Robustness::INVALID) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } Robustness max_robustness = Robustness::INVALID; @@ -172,7 +170,7 @@ (max_robustness == Robustness::SW_SECURE_DECODE && robustness == Robustness::HW_SECURE_CRYPTO) || robustness > max_robustness) { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } [[maybe_unused]] bool hw_secure_codecs_required = @@ -186,13 +184,13 @@ #if BUILDFLAG(IS_CHROMEOS_LACROS) if (!base::CommandLine::ForCurrentProcess()->HasSwitch( switches::kLacrosUseChromeosProtectedMedia)) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired}; } #endif // BUILDFLAG(IS_CHROMEOS_LACROS) - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired, - .hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired, + .hw_secure_codecs = EmeConfigRuleState::kRequired}; #else - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired}; #endif } @@ -203,12 +201,12 @@ // available for the requested codecs. if (media_type == EmeMediaType::VIDEO && max_robustness == Robustness::HW_SECURE_ALL) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRecommended}; + return EmeConfig{.identifier = EmeConfigRuleState::kRecommended}; } #elif BUILDFLAG(IS_ANDROID) // On Android, require hardware secure codecs for SW_SECURE_DECODE and above. if (robustness >= Robustness::SW_SECURE_DECODE || hw_secure_codecs_required) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } #elif BUILDFLAG(IS_WIN) @@ -217,31 +215,31 @@ // requires identifier and persistent state. if (IsHardwareSecurityEnabledForKeySystem(key_system)) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired, - .persistence = EmeConfigRuleState::kRequired, - .hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired, + .persistence = EmeConfigRuleState::kRequired, + .hw_secure_codecs = EmeConfigRuleState::kRequired}; } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } } else if (robustness < Robustness::HW_SECURE_CRYPTO) { // On Windows, when software security is queried, explicitly not allow // hardware secure codecs to prevent robustness level upgrade, for stability // and compatibility reasons. See https://crbug.com/1327043. - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } #else // On other platforms, require hardware secure codecs for HW_SECURE_CRYPTO and // above. if (robustness >= Robustness::HW_SECURE_CRYPTO) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } #endif // BUILDFLAG(IS_CHROMEOS) - return EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } -absl::optional<EmeConfigRule> +EmeConfig::Rule WidevineKeySystemProperties::GetPersistentLicenseSessionSupport() const { bool is_supported = session_types_.contains(CdmSessionType::kPersistentLicense); @@ -252,13 +250,13 @@ // support only based on `is_supported` and ignore `is_hw_secure_supported`. // Note: On ChromeOS, platform verification (similar to CDM host verification) // is required for persistent license support, which requires identifier. - // TODO(crbug.com/1324262): Fix the logic after refactoring EmeConfigRule. + // TODO(crbug.com/1324262): Fix the logic after refactoring EmeConfig. if (is_supported) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired, - .persistence = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired, + .persistence = EmeConfigRuleState::kRequired}; } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } #else // BUILDFLAG(IS_CHROMEOS) bool is_hw_secure_supported = @@ -268,13 +266,13 @@ // the PERSISTENCE requirement here, which is implicitly assumed and enforced // by `KeySystemConfigSelector`. if (is_supported && is_hw_secure_supported) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } else if (is_supported && !is_hw_secure_supported) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } else if (!is_supported && is_hw_secure_supported) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } else { - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } #endif // BUILDFLAG(IS_CHROMEOS) }
diff --git a/components/cdm/renderer/widevine_key_system_properties.h b/components/cdm/renderer/widevine_key_system_properties.h index 0b970c01..3856eb0 100644 --- a/components/cdm/renderer/widevine_key_system_properties.h +++ b/components/cdm/renderer/widevine_key_system_properties.h
@@ -47,17 +47,16 @@ bool ShouldUseBaseKeySystemName() const override; bool IsSupportedInitDataType( media::EmeInitDataType init_data_type) const override; - absl::optional<media::EmeConfigRule> GetEncryptionSchemeConfigRule( + media::EmeConfig::Rule GetEncryptionSchemeConfigRule( media::EncryptionScheme encryption_scheme) const override; media::SupportedCodecs GetSupportedCodecs() const override; media::SupportedCodecs GetSupportedHwSecureCodecs() const override; - absl::optional<media::EmeConfigRule> GetRobustnessConfigRule( + media::EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, media::EmeMediaType media_type, const std::string& requested_robustness, const bool* hw_secure_requirement) const override; - absl::optional<media::EmeConfigRule> GetPersistentLicenseSessionSupport() - const override; + media::EmeConfig::Rule GetPersistentLicenseSessionSupport() const override; media::EmeFeatureSupport GetPersistentStateSupport() const override; media::EmeFeatureSupport GetDistinctiveIdentifierSupport() const override;
diff --git a/components/contextual_search/core/browser/contextual_search_delegate.cc b/components/contextual_search/core/browser/contextual_search_delegate.cc index 15d41df..9ee41758 100644 --- a/components/contextual_search/core/browser/contextual_search_delegate.cc +++ b/components/contextual_search/core/browser/contextual_search_delegate.cc
@@ -24,6 +24,7 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_contents.h" #include "net/http/http_status_code.h" +#include "services/network/public/cpp/resource_request.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/cpp/simple_url_loader.h" #include "services/network/public/mojom/url_response_head.mojom.h"
diff --git a/components/cronet/android/BUILD.gn b/components/cronet/android/BUILD.gn index fe77af4..d01b778 100644 --- a/components/cronet/android/BUILD.gn +++ b/components/cronet/android/BUILD.gn
@@ -1361,14 +1361,27 @@ depfile = "$target_gen_dir/$target_name.d" _zip_file = "$target_gen_dir/$target_name.zip" outputs = [ _zip_file ] - _annotations_jar = "$root_out_dir/lib.java/third_party/androidx/androidx_annotation_annotation.jar" _src_jar = "$_package_dir/cronet_api-src.jar" + + _annotations_dep = + "//third_party/androidx:androidx_annotation_annotation_java" + _build_config_dep = "$_annotations_dep$build_config_target_suffix" + _build_config = + get_label_info(_annotations_dep, "target_gen_dir") + "/" + + get_label_info(_annotations_dep, "name") + ".build_config.json" + + deps = [ + ":jar_cronet_api_source", + _annotations_dep, + _build_config_dep, + ] inputs = [ - _annotations_jar, _src_jar, android_sdk_jar, + _build_config, ] + _rebased_build_config = rebase_path(_build_config, root_build_dir) args = [ "--output-dir", rebase_path(_package_dir, root_build_dir), @@ -1384,17 +1397,13 @@ rebase_path(_zip_file, root_build_dir), "--android-sdk-jar", rebase_path(android_sdk_jar, root_build_dir), - "--support-annotations-jar", - rebase_path(_annotations_jar, root_build_dir), + "--support-annotations-jar=@FileArg($_rebased_build_config:deps_info:unprocessed_jar_path)", + "--classpath-jars=@FileArg($_rebased_build_config:deps_info:javac_full_classpath)", # JavaDoc is generated from Cronet's API source jar. "--input-src-jar", rebase_path(_src_jar, root_build_dir), ] - deps = [ - ":jar_cronet_api_source", - "//third_party/androidx:androidx_annotation_annotation_java", - ] } copy("cronet_package_copy") {
diff --git a/components/cronet/tools/.style.yapf b/components/cronet/tools/.style.yapf new file mode 100644 index 0000000..03fd7153 --- /dev/null +++ b/components/cronet/tools/.style.yapf
@@ -0,0 +1,7 @@ +[style] +based_on_style = pep8 + +# New directories should use a .style.yapf that does not include the following: +column_limit = 80 +indent_width = 2 +
diff --git a/components/cronet/tools/generate_javadoc.py b/components/cronet/tools/generate_javadoc.py index 1a48c9e..e9e1856 100755 --- a/components/cronet/tools/generate_javadoc.py +++ b/components/cronet/tools/generate_javadoc.py
@@ -42,8 +42,8 @@ class CronetExtension(Extension): def extendMarkdown(self, md, md_globals): - md.postprocessors.add('CronetPostprocessor', - CronetPostprocessor(md), '_end') + md.postprocessors.add('CronetPostprocessor', CronetPostprocessor(md), + '_end') def GenerateJavadoc(args, src_dir, output_dir): @@ -52,36 +52,47 @@ android_sdk_jar = args.android_sdk_jar if not android_sdk_jar: - android_sdk_jar = os.path.join( - SDK_DIR, 'platforms', 'android-27', 'android.jar') + android_sdk_jar = os.path.join(SDK_DIR, 'platforms', 'android-27', + 'android.jar') build_utils.DeleteDirectory(output_dir) build_utils.MakeDirectory(output_dir) + classpath = ([android_sdk_jar, args.support_annotations_jar] + + args.classpath_jars) javadoc_cmd = [ - os.path.abspath(JAVADOC_PATH), - '-d', output_dir, - '-quiet', - '-overview', overview_file, - '-doclet', 'com.google.doclava.Doclava', - '-docletpath', - '%s:%s' % (os.path.join(DOCLAVA_DIR, 'jsilver.jar'), - os.path.join(DOCLAVA_DIR, 'doclava.jar')), - '-title', 'Cronet API', - '-federate', 'Android', 'https://developer.android.com/', - '-federationapi', 'Android', os.path.join(DOCLAVA_DIR, 'current.txt'), - '-classpath', - '%s:%s' % (os.path.abspath(android_sdk_jar), - os.path.abspath(args.support_annotations_jar)), + os.path.abspath(JAVADOC_PATH), + '-d', + output_dir, + '-quiet', + '-overview', + overview_file, + '-doclet', + 'com.google.doclava.Doclava', + '-docletpath', + '%s:%s' % (os.path.join(DOCLAVA_DIR, 'jsilver.jar'), + os.path.join(DOCLAVA_DIR, 'doclava.jar')), + '-title', + 'Cronet API', + '-federate', + 'Android', + 'https://developer.android.com/', + '-federationapi', + 'Android', + os.path.join(DOCLAVA_DIR, 'current.txt'), + '-classpath', + ':'.join(os.path.abspath(p) for p in classpath), ] for subdir, _, files in os.walk(src_dir): for filename in files: if filename.endswith(".java"): javadoc_cmd += [os.path.join(subdir, filename)] try: + def stderr_filter(stderr): return stderr.replace(JAVADOC_WARNING, '') - build_utils.CheckOutput(javadoc_cmd, cwd=working_dir, + build_utils.CheckOutput(javadoc_cmd, + cwd=working_dir, stderr_filter=stderr_filter) except build_utils.CalledProcessError: build_utils.DeleteDirectory(output_dir) @@ -92,11 +103,12 @@ with open(os.path.join(output_dir, 'reference', 'index.html'), 'r') as \ old_index, open(os.path.join(output_dir, 'index.html'), 'w') as new_index: for line in old_index: - new_index.write(line.replace('classes.html', - os.path.join('reference', 'classes.html'))) + new_index.write( + line.replace('classes.html', os.path.join('reference', + 'classes.html'))) -def main(): +def main(argv): parser = argparse.ArgumentParser() build_utils.AddDepfileOption(parser) parser.add_argument('--output-dir', help='Directory to put javadoc') @@ -107,20 +119,27 @@ parser.add_argument('--zip-file', help='Path to ZIP archive of javadocs.') parser.add_argument('--android-sdk-jar', help='Path to android.jar') parser.add_argument('--support-annotations-jar', - help='Path to support-annotations-$VERSION.jar') - - args, _ = parser.parse_known_args() + help='Path to support-annotations-$VERSION.jar') + parser.add_argument('--classpath-jars', + help='Paths to jars needed by support-annotations-jar.') + expanded_argv = build_utils.ExpandFileArgs(argv) + args, _ = parser.parse_known_args(expanded_argv) + args.classpath_jars = build_utils.ParseGnList(args.classpath_jars) # A temporary directory to put the output of cronet api source jar files. unzipped_jar_path = tempfile.mkdtemp(dir=args.output_dir) if os.path.exists(args.input_src_jar): - jar_cmd = [os.path.relpath(JAR_PATH, unzipped_jar_path), 'xf', - os.path.abspath(args.input_src_jar)] + jar_cmd = [ + os.path.relpath(JAR_PATH, unzipped_jar_path), 'xf', + os.path.abspath(args.input_src_jar) + ] build_utils.CheckOutput(jar_cmd, cwd=unzipped_jar_path) else: raise Exception('Jar file does not exist: %s' % args.input_src_jar) - net_docs.ProcessDocs([args.readme_file], args.input_dir, - args.output_dir, extensions=[CronetExtension()]) + net_docs.ProcessDocs([args.readme_file], + args.input_dir, + args.output_dir, + extensions=[CronetExtension()]) output_dir = os.path.abspath(os.path.join(args.output_dir, 'javadoc')) GenerateJavadoc(args, os.path.abspath(unzipped_jar_path), output_dir) @@ -133,11 +152,16 @@ deps = [] for root, _, filenames in os.walk(args.input_dir): # Ignore .pyc files here, it might be re-generated during build. - deps.extend(os.path.join(root, f) for f in filenames - if not f.endswith('.pyc')) + deps.extend( + os.path.join(root, f) for f in filenames if not f.endswith('.pyc')) + if args.support_annotations_jar: + deps.append(args.support_annotations_jar) + if args.classpath_jars: + deps.extend(args.classpath_jars) build_utils.WriteDepfile(args.depfile, args.zip_file, deps) # Clean up temporary output directory. build_utils.DeleteDirectory(unzipped_jar_path) + if __name__ == '__main__': - sys.exit(main()) + sys.exit(main(sys.argv[1:]))
diff --git a/components/download/internal/background_service/logger_impl.cc b/components/download/internal/background_service/logger_impl.cc index 32c1489..08758cfd 100644 --- a/components/download/internal/background_service/logger_impl.cc +++ b/components/download/internal/background_service/logger_impl.cc
@@ -118,50 +118,51 @@ } } -base::Value DriverEntryToValue(const DriverEntry& entry) { - base::Value serialized_entry(base::Value::Type::DICTIONARY); - serialized_entry.SetStringKey("state", DriverEntryStateToString(entry.state)); - serialized_entry.SetBoolKey("paused", entry.paused); - serialized_entry.SetBoolKey("done", entry.done); +base::Value::Dict DriverEntryToValue(const DriverEntry& entry) { + base::Value::Dict serialized_entry; + serialized_entry.Set("state", DriverEntryStateToString(entry.state)); + serialized_entry.Set("paused", entry.paused); + serialized_entry.Set("done", entry.done); return serialized_entry; } -base::Value EntryToValue( +base::Value::Dict EntryToValue( const Entry& entry, const absl::optional<DriverEntry>& driver, const absl::optional<CompletionType>& completion_type) { - base::Value serialized_entry(base::Value::Type::DICTIONARY); - serialized_entry.SetStringKey("client", - BackgroundDownloadClientToString(entry.client)); - serialized_entry.SetStringKey("state", EntryStateToString(entry.state)); - serialized_entry.SetStringKey("guid", entry.guid); + base::Value::Dict serialized_entry; + serialized_entry.Set("client", + BackgroundDownloadClientToString(entry.client)); + serialized_entry.Set("state", EntryStateToString(entry.state)); + serialized_entry.Set("guid", entry.guid); // Convert the URL to a proper logging format. GURL::Replacements replacements; replacements.ClearQuery(); - serialized_entry.SetStringKey( + serialized_entry.Set( "url", entry.request_params.url.ReplaceComponents(replacements).spec()); - serialized_entry.SetStringKey("file_path", - entry.target_file_path.MaybeAsASCII()); + serialized_entry.Set("file_path", entry.target_file_path.MaybeAsASCII()); if (driver.has_value()) { - serialized_entry.SetDoubleKey("bytes_downloaded", driver->bytes_downloaded); - serialized_entry.SetKey("driver", DriverEntryToValue(driver.value())); - serialized_entry.SetStringKey( - "time_downloaded", base::TimeFormatHTTP(driver->completion_time)); + serialized_entry.Set("bytes_downloaded", + static_cast<double>(driver->bytes_downloaded)); + serialized_entry.Set("driver", DriverEntryToValue(driver.value())); + serialized_entry.Set("time_downloaded", + base::TimeFormatHTTP(driver->completion_time)); } else { - serialized_entry.SetDoubleKey("bytes_downloaded", entry.bytes_downloaded); - serialized_entry.SetStringKey("time_downloaded", - base::TimeFormatHTTP(entry.completion_time)); + serialized_entry.Set("bytes_downloaded", + static_cast<double>(entry.bytes_downloaded)); + serialized_entry.Set("time_downloaded", + base::TimeFormatHTTP(entry.completion_time)); } if (completion_type.has_value()) { - serialized_entry.SetStringKey( - "result", CompletionTypeToString(completion_type.value())); + serialized_entry.Set("result", + CompletionTypeToString(completion_type.value())); } else if (entry.state == Entry::State::COMPLETE) { - serialized_entry.SetStringKey( - "result", CompletionTypeToString(CompletionType::SUCCEED)); + serialized_entry.Set("result", + CompletionTypeToString(CompletionType::SUCCEED)); } return serialized_entry; } @@ -185,8 +186,8 @@ observers_.RemoveObserver(observer); } -base::Value LoggerImpl::GetServiceStatus() { - base::Value service_status(base::Value::Type::DICTIONARY); +base::Value::Dict LoggerImpl::GetServiceStatus() { + base::Value::Dict service_status; if (!log_source_) return service_status; @@ -194,18 +195,17 @@ Controller::State state = log_source_->GetControllerState(); const StartupStatus& status = log_source_->GetStartupStatus(); - service_status.SetStringKey("serviceState", ControllerStateToString(state)); - service_status.SetStringKey("modelStatus", OptBoolToString(status.model_ok)); - service_status.SetStringKey("driverStatus", - OptBoolToString(status.driver_ok)); - service_status.SetStringKey("fileMonitorStatus", - OptBoolToString(status.file_monitor_ok)); + service_status.Set("serviceState", ControllerStateToString(state)); + service_status.Set("modelStatus", OptBoolToString(status.model_ok)); + service_status.Set("driverStatus", OptBoolToString(status.driver_ok)); + service_status.Set("fileMonitorStatus", + OptBoolToString(status.file_monitor_ok)); return service_status; } -base::Value LoggerImpl::GetServiceDownloads() { - base::Value serialized_entries(base::Value::Type::LIST); +base::Value::List LoggerImpl::GetServiceDownloads() { + base::Value::List serialized_entries; if (!log_source_) return serialized_entries; @@ -223,7 +223,7 @@ if (observers_.empty()) return; - base::Value service_status = GetServiceStatus(); + base::Value::Dict service_status = GetServiceStatus(); for (auto& observer : observers_) observer.OnServiceStatusChanged(service_status); @@ -233,7 +233,7 @@ if (observers_.empty()) return; - base::Value service_downloads = GetServiceDownloads(); + base::Value::List service_downloads = GetServiceDownloads(); for (auto& observer : observers_) observer.OnServiceDownloadsAvailable(service_downloads); } @@ -272,11 +272,10 @@ if (observers_.empty()) return; - base::Value serialized_request(base::Value::Type::DICTIONARY); - serialized_request.SetStringKey("client", - BackgroundDownloadClientToString(client)); - serialized_request.SetStringKey("guid", guid); - serialized_request.SetStringKey("result", StartResultToString(start_result)); + base::Value::Dict serialized_request; + serialized_request.Set("client", BackgroundDownloadClientToString(client)); + serialized_request.Set("guid", guid); + serialized_request.Set("result", StartResultToString(start_result)); for (auto& observer : observers_) observer.OnServiceRequestMade(serialized_request); }
diff --git a/components/download/internal/background_service/logger_impl.h b/components/download/internal/background_service/logger_impl.h index 9d60798..c1b93cf 100644 --- a/components/download/internal/background_service/logger_impl.h +++ b/components/download/internal/background_service/logger_impl.h
@@ -41,8 +41,8 @@ // Logger implementation. void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; - base::Value GetServiceStatus() override; - base::Value GetServiceDownloads() override; + base::Value::Dict GetServiceStatus() override; + base::Value::List GetServiceDownloads() override; // LogSink implementation. void OnServiceStatusChanged() override;
diff --git a/components/download/public/background_service/logger.h b/components/download/public/background_service/logger.h index 513874f..bd30d92b 100644 --- a/components/download/public/background_service/logger.h +++ b/components/download/public/background_service/logger.h
@@ -5,9 +5,7 @@ #ifndef COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_LOGGER_H_ #define COMPONENTS_DOWNLOAD_PUBLIC_BACKGROUND_SERVICE_LOGGER_H_ -namespace base { -class Value; -} // namespace base +#include "base/values.h" namespace download { @@ -22,24 +20,25 @@ // Called whenever the status of the Download Service changes. This will // have the same data as |GetServiceStatus()|. - virtual void OnServiceStatusChanged(const base::Value& service_status) = 0; + virtual void OnServiceStatusChanged( + const base::Value::Dict& service_status) = 0; // Called when the Download Service is able to notify observers of the list // of currently tracked downloads. This will have the same data as // |GetServiceDownloads()|. virtual void OnServiceDownloadsAvailable( - const base::Value& service_downloads) = 0; + const base::Value::List& service_downloads) = 0; // Called when the state of a download has changed. Format of // |service_download| is the same as |GetServiceDownloads()|, except not a // list. virtual void OnServiceDownloadChanged( - const base::Value& service_download) = 0; + const base::Value::Dict& service_download) = 0; // Called when a download has failed. Format of |service_download| is the // same as |GetServiceDownloads()|, except not a list. virtual void OnServiceDownloadFailed( - const base::Value& service_download) = 0; + const base::Value::Dict& service_download) = 0; // Called when a request is made of the download service. Format of // |service_request| is: @@ -49,7 +48,8 @@ // result: [ACCEPTED,BACKOFF,UNEXPECTED_CLIENT,UNEXPECTED_GUID, // CLIENT_CANCELLED,INTERNAL_ERROR] // } - virtual void OnServiceRequestMade(const base::Value& service_request) = 0; + virtual void OnServiceRequestMade( + const base::Value::Dict& service_request) = 0; }; Logger(const Logger&) = delete; @@ -68,7 +68,7 @@ // driverStatus: string [OK,BAD,UNKNOWN], // fileMonitorStatus: string [OK,BAD,UNKNOWN] // } - virtual base::Value GetServiceStatus() = 0; + virtual base::Value::Dict GetServiceStatus() = 0; // Returns the current list of downloads the Download Service is aware of. // The serialized format will be a list of: @@ -87,7 +87,7 @@ // done: boolean, // } // } - virtual base::Value GetServiceDownloads() = 0; + virtual base::Value::List GetServiceDownloads() = 0; protected: Logger() = default;
diff --git a/components/download/public/background_service/test/empty_logger.cc b/components/download/public/background_service/test/empty_logger.cc index a0d829f7..534d428 100644 --- a/components/download/public/background_service/test/empty_logger.cc +++ b/components/download/public/background_service/test/empty_logger.cc
@@ -13,12 +13,12 @@ void EmptyLogger::RemoveObserver(Observer* observer) {} -base::Value EmptyLogger::GetServiceStatus() { - return base::Value(); +base::Value::Dict EmptyLogger::GetServiceStatus() { + return base::Value::Dict(); } -base::Value EmptyLogger::GetServiceDownloads() { - return base::Value(); +base::Value::List EmptyLogger::GetServiceDownloads() { + return base::Value::List(); } } // namespace test
diff --git a/components/download/public/background_service/test/empty_logger.h b/components/download/public/background_service/test/empty_logger.h index 45ffc7d..bc3afa0 100644 --- a/components/download/public/background_service/test/empty_logger.h +++ b/components/download/public/background_service/test/empty_logger.h
@@ -23,8 +23,8 @@ // Logger implementation. void AddObserver(Observer* observer) override; void RemoveObserver(Observer* observer) override; - base::Value GetServiceStatus() override; - base::Value GetServiceDownloads() override; + base::Value::Dict GetServiceStatus() override; + base::Value::List GetServiceDownloads() override; }; } // namespace test
diff --git a/components/exo/extended_drag_source_unittest.cc b/components/exo/extended_drag_source_unittest.cc index b234641..a6f5f74c 100644 --- a/components/exo/extended_drag_source_unittest.cc +++ b/components/exo/extended_drag_source_unittest.cc
@@ -689,16 +689,16 @@ TEST_F(ExtendedDragSourceTest, DragToAnotherDisplay) { UpdateDisplay("400x300,800x600"); - const gfx::Rect original_window_bounds(410, 10, 500, 200); + const gfx::Rect kOriginalWindowBounds(410, 10, 500, 200); // Create and map a toplevel shell surface, with the size larger than 2nd // display to test if configure uses the adjusted size. auto shell_surface = - exo::test::ShellSurfaceBuilder(original_window_bounds.size()) - .SetOrigin(original_window_bounds.origin()) + exo::test::ShellSurfaceBuilder(kOriginalWindowBounds.size()) + .SetOrigin(kOriginalWindowBounds.origin()) .BuildShellSurface(); auto* surface = shell_surface->root_surface(); - EXPECT_EQ(original_window_bounds, + EXPECT_EQ(kOriginalWindowBounds, shell_surface->GetWidget()->GetWindowBoundsInScreen()); auto display = display::Screen::GetScreen()->GetDisplayNearestWindow( shell_surface->GetWidget()->GetNativeWindow()); @@ -717,7 +717,6 @@ [&](const gfx::Point& point) { origins.push_back(point); }); // Map shell surface. - // surface->Attach(buffer.get()); shell_surface->set_configure_callback(configure_callback); shell_surface->set_origin_change_callback(origin_change_callback); @@ -774,10 +773,10 @@ EXPECT_EQ(1u, serial); // Upon drop, the window is shrunk horizontally. gfx::Rect expected_drop_bounds = - gfx::Rect(origins.back(), original_window_bounds.size()); + gfx::Rect(origins.back(), kOriginalWindowBounds.size()); expected_drop_bounds.set_width(secondary_display_size.width()); int offset = - (original_window_bounds.width() - expected_drop_bounds.width()) / 2; + (kOriginalWindowBounds.width() - expected_drop_bounds.width()) / 2; expected_drop_bounds.set_x(expected_drop_bounds.x() + offset); EXPECT_EQ(expected_drop_bounds, drop_bounds); EXPECT_EQ(expected_drop_bounds,
diff --git a/components/exo/shell_surface.cc b/components/exo/shell_surface.cc index 21b4a36..0fcc09f 100644 --- a/components/exo/shell_surface.cc +++ b/components/exo/shell_surface.cc
@@ -448,9 +448,8 @@ if (window != widget_->GetNativeWindow()) return; auto* window_state = ash::WindowState::Get(window); - if (window_state && window_state->is_moving_to_another_display()) { - DCHECK(!old_screen_bounds_for_pending_move_.IsEmpty()); - + if (window_state && window_state->is_moving_to_another_display() && + !old_screen_bounds_for_pending_move_.IsEmpty()) { gfx::Rect new_bounds_in_screen = window->bounds(); wm::ConvertRectToScreen(window->parent(), &new_bounds_in_screen);
diff --git a/components/external_intents/android/external_intents_features.cc b/components/external_intents/android/external_intents_features.cc index 84c8f32..373c5de 100644 --- a/components/external_intents/android/external_intents_features.cc +++ b/components/external_intents/android/external_intents_features.cc
@@ -18,12 +18,19 @@ // Array of features exposed through the Java ExternalIntentsFeatures API. const base::Feature* kFeaturesExposedToJava[] = { - &kScaryExternalNavigationRefactoring, -}; + &kAutofillAssistantGoogleInitiatorOriginCheck, + &kScaryExternalNavigationRefactoring}; } // namespace // Alphabetical: + +// Uses the initiator origin to check whether a navigation was started from a +// Google domain. +const base::Feature kAutofillAssistantGoogleInitiatorOriginCheck{ + "AutofillAssistantGoogleInitiatorOriginCheck", + base::FEATURE_ENABLED_BY_DEFAULT}; + const base::Feature kScaryExternalNavigationRefactoring{ "ScaryExternalNavigationRefactoring", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/components/external_intents/android/external_intents_features.h b/components/external_intents/android/external_intents_features.h index 93d30123..4ca6a43 100644 --- a/components/external_intents/android/external_intents_features.h +++ b/components/external_intents/android/external_intents_features.h
@@ -10,6 +10,7 @@ namespace external_intents { // Alphabetical: +extern const base::Feature kAutofillAssistantGoogleInitiatorOriginCheck; extern const base::Feature kScaryExternalNavigationRefactoring; } // namespace external_intents
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java index 7d01dd8..da4bb99 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalIntentsFeatures.java
@@ -20,11 +20,16 @@ */ @JNINamespace("external_intents") public class ExternalIntentsFeatures extends Features { + public static final String AUTOFILL_ASSISTANT_GOOGLE_INITIATOR_ORIGIN_CHECK_NAME = + "AutofillAssistantGoogleInitiatorOriginCheck"; public static final String SCARY_EXTERNAL_NAVIGATION_REFACTORING_NAME = "ScaryExternalNavigationRefactoring"; + public static final ExternalIntentsFeatures AUTOFILL_ASSISTANT_GOOGLE_INITIATOR_ORIGIN_CHECK = + new ExternalIntentsFeatures(0, AUTOFILL_ASSISTANT_GOOGLE_INITIATOR_ORIGIN_CHECK_NAME); + public static final ExternalIntentsFeatures SCARY_EXTERNAL_NAVIGATION_REFACTORING = - new ExternalIntentsFeatures(0, SCARY_EXTERNAL_NAVIGATION_REFACTORING_NAME); + new ExternalIntentsFeatures(1, SCARY_EXTERNAL_NAVIGATION_REFACTORING_NAME); private final int mOrdinal;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java index 3356643..f189ef6 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationHandler.java
@@ -1519,7 +1519,8 @@ } return false; case IntentToAutofillAllowingAppResult.DEFER_TO_APP_LATER: - if (params.getRedirectHandler() != null && isGoogleReferrer()) { + if (params.getRedirectHandler() != null + && isAutofillAssistantGoogleReferrer(params)) { if (DEBUG) { Log.i(TAG, "Autofill Assistant passed in favour of App later."); } @@ -1533,8 +1534,8 @@ } } - if (mDelegate.handleWithAutofillAssistant( - params, targetIntent, browserFallbackUrl, isGoogleReferrer())) { + if (mDelegate.handleWithAutofillAssistant(params, targetIntent, browserFallbackUrl, + isAutofillAssistantGoogleReferrer(params))) { if (DEBUG) Log.i(TAG, "Handled with Autofill Assistant."); } else { if (DEBUG) Log.i(TAG, "Not handled with Autofill Assistant."); @@ -2452,11 +2453,15 @@ return UrlUtilitiesJni.get().isGoogleSearchUrl(referrerUrl.getSpec()); } - /** - * @return whether this navigation is from a Google domain. - */ - @VisibleForTesting - protected boolean isGoogleReferrer() { + private boolean isInitiatorOriginGoogleReferrer(ExternalNavigationParams params) { + Origin initiatorOrigin = params.getInitiatorOrigin(); + String url = String.format("%s://%s:%s", initiatorOrigin.getScheme(), + initiatorOrigin.getHost(), initiatorOrigin.getPort()); + return UrlUtilitiesJni.get().isGoogleSubDomainUrl(url); + } + + @Deprecated + private boolean isLastCommittedUrlGoogleReferrer() { GURL referrerUrl = getLastCommittedUrl(); if (referrerUrl == null || referrerUrl.isEmpty()) return false; @@ -2464,6 +2469,25 @@ } /** + * @return whether this navigation is from a Google domain. + */ + @VisibleForTesting + protected boolean isAutofillAssistantGoogleReferrer(ExternalNavigationParams params) { + if (!ExternalIntentsFeatures.AUTOFILL_ASSISTANT_GOOGLE_INITIATOR_ORIGIN_CHECK.isEnabled()) { + return isLastCommittedUrlGoogleReferrer(); + } + + // We check that there were no previous redirects and that the navigation originated on + // a valid google.<TLD> (top level domain). + RedirectHandler redirectHandler = params.getRedirectHandler(); + if (redirectHandler == null || !redirectHandler.isOnFirstLoadInNavigationChain()) { + return false; + } + + return isInitiatorOriginGoogleReferrer(params); + } + + /** * @return whether this navigation is a redirect from an intent. */ private static boolean isIncomingIntentRedirect(ExternalNavigationParams params) {
diff --git a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java index 1cc8b8c..f0bb0f8 100644 --- a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java +++ b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java
@@ -2341,7 +2341,7 @@ RedirectHandler redirectHandler = RedirectHandler.create(); redirectHandler.updateNewUrlLoading(PageTransition.LINK, false, true, 0, 0, true, true); - mUrlHandler.mIsGoogleReferrer = true; + mUrlHandler.mIsAutofillAssistantGoogleReferrer = true; mDelegate.setIsIntentToAutofillAssistant(true); mDelegate.setAutofillAssistantAllowAppOverrideResult( IntentToAutofillAllowingAppResult.DEFER_TO_APP_LATER); @@ -2852,7 +2852,7 @@ public String defaultSmsPackageName; public GURL mLastCommittedUrl; public boolean mIsSerpReferrer; - public boolean mIsGoogleReferrer; + public boolean mIsAutofillAssistantGoogleReferrer; public boolean mShouldRequestFileAccess; public String mNewUrlAfterClobbering; public String mReferrerUrlForClobbering; @@ -2909,8 +2909,8 @@ } @Override - protected boolean isGoogleReferrer() { - return mIsGoogleReferrer; + protected boolean isAutofillAssistantGoogleReferrer(ExternalNavigationParams params) { + return mIsAutofillAssistantGoogleReferrer; } @Override @@ -3159,7 +3159,8 @@ @Override public boolean handleWithAutofillAssistant(ExternalNavigationParams params, - Intent targetIntent, GURL browserFallbackUrl, boolean isGoogleReferrer) { + Intent targetIntent, GURL browserFallbackUrl, + boolean isAutofillAssistantGoogleReferrer) { return mHandleWithAutofillAssistant; }
diff --git a/components/history/core/browser/history_backend_unittest.cc b/components/history/core/browser/history_backend_unittest.cc index 99ee2f5d..1896c2c 100644 --- a/components/history/core/browser/history_backend_unittest.cc +++ b/components/history/core/browser/history_backend_unittest.cc
@@ -3632,6 +3632,33 @@ EXPECT_EQ(u"www.baz.com/", FormatUrlForRedirectComparison(url3)); } +TEST_F(HistoryBackendTest, ExpireVisitDeletes) { + ASSERT_TRUE(backend_); + + GURL url("http://www.google.com/"); + const ContextID context_id = reinterpret_cast<ContextID>(0x1); + const int navigation_entry_id = 2; + HistoryAddPageArgs request( + url, base::Time::Now(), context_id, navigation_entry_id, GURL(), {}, + ui::PAGE_TRANSITION_TYPED, false, SOURCE_BROWSED, false, true); + backend_->AddPage(request); + URLRow url_row; + ASSERT_TRUE(backend_->GetURL(url, &url_row)); + + VisitVector visits; + ASSERT_TRUE(backend_->GetVisitsForURL( + backend_->db_->GetRowForURL(url, nullptr), &visits)); + ASSERT_EQ(1u, visits.size()); + + const VisitID visit_id = visits[0].visit_id; + EXPECT_EQ(visit_id, backend_->visit_tracker().GetLastVisit( + context_id, navigation_entry_id, url)); + + backend_->RemoveVisits(visits); + EXPECT_EQ(0, backend_->visit_tracker().GetLastVisit( + context_id, navigation_entry_id, url)); +} + TEST_F(HistoryBackendTest, AnnotatedVisits) { auto last_visit_time = base::Time::Now(); const auto add_url_and_visit = [&](std::string url) { @@ -3733,6 +3760,42 @@ EXPECT_EQ(annotated_visits[0].context_annotations.omnibox_url_copied, true); } +TEST_F(HistoryBackendTest, ReplaceClusters) { + { + SCOPED_TRACE("Add clusters"); + AddAnnotatedVisit(0); + AddAnnotatedVisit(1); + + backend_->ReplaceClusters({}, CreateClusters({{1, 2}, {1, 2}, {}, {1}})); + VerifyClusters(backend_->GetMostRecentClusters(base::Time::Min(), + base::Time::Max(), 10), + { + {1, {2, 1}}, + // Shouldn't check duplicates clusters. + {2, {2, 1}}, + // Shouldn't return empty clusters. + // The empty cluster shouldn't increment `cluster_id`. + {3, {1}}, + }); + } + + { + SCOPED_TRACE("Replace clusters"); + AddAnnotatedVisit(2); + AddAnnotatedVisit(3); + + backend_->ReplaceClusters({2, 4}, CreateClusters({{1, 3}, {4}})); + VerifyClusters(backend_->GetMostRecentClusters(base::Time::Min(), + base::Time::Max(), 10), + { + {5, {4}}, + {4, {3, 1}}, + {1, {2, 1}}, + {3, {1}}, + }); + } +} + TEST_F(HistoryBackendTest, GetMostRecentClusters) { // Setup some visits and clusters. AddAnnotatedVisit(1); @@ -3773,31 +3836,30 @@ } } -TEST_F(HistoryBackendTest, ExpireVisitDeletes) { - ASSERT_TRUE(backend_); +TEST_F(HistoryBackendTest, GetCluster) { + AddAnnotatedVisit(0); + AddAnnotatedVisit(1); - GURL url("http://www.google.com/"); - const ContextID context_id = reinterpret_cast<ContextID>(0x1); - const int navigation_entry_id = 2; - HistoryAddPageArgs request( - url, base::Time::Now(), context_id, navigation_entry_id, GURL(), {}, - ui::PAGE_TRANSITION_TYPED, false, SOURCE_BROWSED, false, true); - backend_->AddPage(request); - URLRow url_row; - ASSERT_TRUE(backend_->GetURL(url, &url_row)); + ClusterVisit visit_1; + visit_1.annotated_visit.visit_row.visit_id = 1; + // Verify the cluster visits are being flushed out. + visit_1.url_for_display = u"url_for_display"; + ClusterVisit visit_2; + visit_2.annotated_visit.visit_row.visit_id = 2; + // A cluster visit without a corresponding annotated visit shouldn't be + // returned. + ClusterVisit visit_3; + visit_3.annotated_visit.visit_row.visit_id = 3; + backend_->db_->AddClusters( + {{0, {visit_1, visit_2, visit_3}, {}, false, u"label"}}); - VisitVector visits; - ASSERT_TRUE(backend_->GetVisitsForURL( - backend_->db_->GetRowForURL(url, nullptr), &visits)); - ASSERT_EQ(1u, visits.size()); + const auto cluster = backend_->GetCluster(1); + VerifyCluster(cluster, {1, {2, 1}}); + EXPECT_EQ(cluster.cluster_id, 1); + EXPECT_EQ(cluster.label, u"label"); + EXPECT_EQ(cluster.visits[1].url_for_display, u"url_for_display"); - const VisitID visit_id = visits[0].visit_id; - EXPECT_EQ(visit_id, backend_->visit_tracker().GetLastVisit( - context_id, navigation_entry_id, url)); - - backend_->RemoveVisits(visits); - EXPECT_EQ(0, backend_->visit_tracker().GetLastVisit( - context_id, navigation_entry_id, url)); + VerifyCluster(backend_->GetCluster(3), {3}); } TEST_F(HistoryBackendTest, GetRedirectChainStart) { @@ -3965,66 +4027,4 @@ EXPECT_EQ(chain3[2].visit_id, chain3_ids[2]); } -TEST_F(HistoryBackendTest, GetCluster) { - AddAnnotatedVisit(0); - AddAnnotatedVisit(1); - - ClusterVisit visit_1; - visit_1.annotated_visit.visit_row.visit_id = 1; - // Verify the cluster visits are being flushed out. - visit_1.url_for_display = u"url_for_display"; - ClusterVisit visit_2; - visit_2.annotated_visit.visit_row.visit_id = 2; - // A cluster visit without a corresponding annotated visit shouldn't be - // returned. - ClusterVisit visit_3; - visit_3.annotated_visit.visit_row.visit_id = 3; - backend_->db_->AddClusters( - {{0, {visit_1, visit_2, visit_3}, {}, false, u"label"}}); - - const auto cluster = backend_->GetCluster(1); - VerifyCluster(cluster, {1, {2, 1}}); - EXPECT_EQ(cluster.cluster_id, 1); - EXPECT_EQ(cluster.label, u"label"); - EXPECT_EQ(cluster.visits[1].url_for_display, u"url_for_display"); - - VerifyCluster(backend_->GetCluster(3), {3}); -} - -TEST_F(HistoryBackendTest, ReplaceClusters) { - { - SCOPED_TRACE("Add clusters"); - AddAnnotatedVisit(0); - AddAnnotatedVisit(1); - - backend_->ReplaceClusters({}, CreateClusters({{1, 2}, {1, 2}, {}, {1}})); - VerifyClusters(backend_->GetMostRecentClusters(base::Time::Min(), - base::Time::Max(), 10), - { - {1, {2, 1}}, - // Shouldn't check duplicates clusters. - {2, {2, 1}}, - // Shouldn't return empty clusters. - // The empty cluster shouldn't increment `cluster_id`. - {3, {1}}, - }); - } - - { - SCOPED_TRACE("Replace clusters"); - AddAnnotatedVisit(2); - AddAnnotatedVisit(3); - - backend_->ReplaceClusters({2, 4}, CreateClusters({{1, 3}, {4}})); - VerifyClusters(backend_->GetMostRecentClusters(base::Time::Min(), - base::Time::Max(), 10), - { - {5, {4}}, - {4, {3, 1}}, - {1, {2, 1}}, - {3, {1}}, - }); - } -} - } // namespace history
diff --git a/components/history/core/browser/visit_annotations_database.cc b/components/history/core/browser/visit_annotations_database.cc index 1d4b70b1..b7dc740 100644 --- a/components/history/core/browser/visit_annotations_database.cc +++ b/components/history/core/browser/visit_annotations_database.cc
@@ -388,6 +388,17 @@ << "visit_id = " << visit_id; } + auto cluster_id = GetClusterIdContainingVisit(visit_id); + if (cluster_id > 0 && GetVisitIdsInCluster(cluster_id).size() == 1) { + statement.Assign(GetDB().GetCachedStatement( + SQL_FROM_HERE, "DELETE FROM clusters WHERE cluster_id=?")); + statement.BindInt64(0, cluster_id); + if (!statement.Run()) { + DVLOG(0) << "Failed to execute clusters delete statement: " + << "visit_id = " << visit_id << ", cluster_id = " << cluster_id; + } + } + statement.Assign(GetDB().GetCachedStatement( SQL_FROM_HERE, "DELETE FROM clusters_and_visits WHERE visit_id=?")); statement.BindInt64(0, visit_id); @@ -395,13 +406,13 @@ DVLOG(0) << "Failed to execute clusters_and_visits delete statement: " << "visit_id = " << visit_id; } - - // TODO(manukh): Delete `Cluster`s that are now empty. } void VisitAnnotationsDatabase::AddClusters( const std::vector<Cluster>& clusters) { - DCHECK(!clusters.empty()); + if (clusters.empty()) + return; + sql::Statement clusters_statement(GetDB().GetCachedStatement( SQL_FROM_HERE, "INSERT INTO clusters" @@ -568,16 +579,19 @@ return cluster_visit; } -bool VisitAnnotationsDatabase::IsVisitClustered(VisitID visit_id) { +int64_t VisitAnnotationsDatabase::GetClusterIdContainingVisit( + VisitID visit_id) { DCHECK_GT(visit_id, 0); sql::Statement statement( GetDB().GetCachedStatement(SQL_FROM_HERE, - "SELECT 1 " + "SELECT cluster_id " "FROM clusters_and_visits " "WHERE visit_id=? " "LIMIT 1")); statement.BindInt64(0, visit_id); - return statement.Step(); + if (statement.Step()) + return statement.ColumnInt64(0); + return 0; } void VisitAnnotationsDatabase::DeleteClusters(
diff --git a/components/history/core/browser/visit_annotations_database.h b/components/history/core/browser/visit_annotations_database.h index 2448bec..ccae17c3 100644 --- a/components/history/core/browser/visit_annotations_database.h +++ b/components/history/core/browser/visit_annotations_database.h
@@ -94,8 +94,9 @@ // Get a `ClusterVisit`. ClusterVisit GetClusterVisit(VisitID visit_id); - // Return whether `visit_id` belongs to any cluster. - bool IsVisitClustered(VisitID visit_id); + // Return the ID of the cluster containing `visit_id`. Returns 0 if `visit_id` + // is not in a cluster.` + int64_t GetClusterIdContainingVisit(VisitID visit_id); // Delete `Cluster`s from the table. void DeleteClusters(const std::vector<int64_t>& cluster_ids);
diff --git a/components/history/core/browser/visit_annotations_database_unittest.cc b/components/history/core/browser/visit_annotations_database_unittest.cc index 71c530d..98a69a5 100644 --- a/components/history/core/browser/visit_annotations_database_unittest.cc +++ b/components/history/core/browser/visit_annotations_database_unittest.cc
@@ -331,7 +331,8 @@ std::vector<int64_t>({3})); } -TEST_F(VisitAnnotationsDatabaseTest, GetVisitIdsInCluster_IsVisitClustered) { +TEST_F(VisitAnnotationsDatabaseTest, + GetVisitIdsInCluster_GetClusterIdContainingVisit) { // Add unclustered visits. AddVisitWithTime(IntToTime(0)); AddVisitWithTime(IntToTime(2)); @@ -345,43 +346,57 @@ EXPECT_THAT(GetVisitIdsInCluster(1), ElementsAre(4)); EXPECT_THAT(GetVisitIdsInCluster(3), ElementsAre(7, 6)); - // IsVisitClustered - EXPECT_FALSE(IsVisitClustered(1)); - EXPECT_FALSE(IsVisitClustered(2)); - EXPECT_FALSE(IsVisitClustered(3)); - EXPECT_TRUE(IsVisitClustered(4)); - EXPECT_TRUE(IsVisitClustered(5)); - EXPECT_TRUE(IsVisitClustered(6)); - EXPECT_TRUE(IsVisitClustered(7)); + // GetClusterIdContainingVisit + EXPECT_EQ(GetClusterIdContainingVisit(1), 0); + EXPECT_EQ(GetClusterIdContainingVisit(2), 0); + EXPECT_EQ(GetClusterIdContainingVisit(3), 0); + EXPECT_EQ(GetClusterIdContainingVisit(4), 1); + EXPECT_EQ(GetClusterIdContainingVisit(5), 2); + EXPECT_EQ(GetClusterIdContainingVisit(6), 3); + EXPECT_EQ(GetClusterIdContainingVisit(7), 3); } TEST_F(VisitAnnotationsDatabaseTest, DeleteAnnotationsForVisit) { - // Add content annotations for 1 visit. - VisitID visit_id = 1; - VisitContentModelAnnotations model_annotations = { - 0.5f, - {{/*id=*/"1", /*weight=*/1}, {/*id=*/"2", /*weight=*/1}}, - 123, - {{/*id=*/"entity1", /*weight=*/1}, {/*id=*/"entity2", /*weight=*/1}}}; - std::vector<std::string> related_searches{"related searches", - "búsquedas relacionadas"}; - VisitContentAnnotationFlags annotation_flags = - VisitContentAnnotationFlag::kNone; - VisitContentAnnotations content_annotations{ - annotation_flags, model_annotations, - related_searches, GURL("http://pagewithvisit.com?q=search"), - u"search", "Alternative title"}; - AddContentAnnotationsForVisit(visit_id, content_annotations); + // Add a cluster with 2 visits. + AddContentAnnotationsForVisit(1, {}); + AddContextAnnotationsForVisit(1, {}); + AddContentAnnotationsForVisit(2, {}); + AddContextAnnotationsForVisit(2, {}); + AddCluster({1, 2}); VisitContentAnnotations got_content_annotations; - // First make sure the annotations are there. - EXPECT_TRUE( - GetContentAnnotationsForVisit(visit_id, &got_content_annotations)); + VisitContextAnnotations got_context_annotations; + // First make sure the annotation and cluster tables are populated. + EXPECT_TRUE(GetContentAnnotationsForVisit(1, &got_content_annotations)); + EXPECT_TRUE(GetContextAnnotationsForVisit(1, &got_context_annotations)); + EXPECT_TRUE(GetContentAnnotationsForVisit(2, &got_content_annotations)); + EXPECT_TRUE(GetContextAnnotationsForVisit(2, &got_context_annotations)); + EXPECT_THAT(GetVisitIdsInCluster(1), UnorderedElementsAre(1, 2)); + EXPECT_EQ(GetClusterIdContainingVisit(1), 1); + EXPECT_EQ(GetClusterIdContainingVisit(2), 1); + EXPECT_EQ(GetCluster(1).cluster_id, 1); - // Delete annotations and make sure we cannot query for it. - DeleteAnnotationsForVisit(visit_id); - EXPECT_FALSE( - GetContentAnnotationsForVisit(visit_id, &got_content_annotations)); + // Delete 1 visit. Make sure the tables are updated, but the cluster remains. + DeleteAnnotationsForVisit(1); + EXPECT_FALSE(GetContentAnnotationsForVisit(1, &got_content_annotations)); + EXPECT_FALSE(GetContextAnnotationsForVisit(1, &got_context_annotations)); + EXPECT_TRUE(GetContentAnnotationsForVisit(2, &got_content_annotations)); + EXPECT_TRUE(GetContextAnnotationsForVisit(2, &got_context_annotations)); + EXPECT_THAT(GetVisitIdsInCluster(1), UnorderedElementsAre(2)); + EXPECT_EQ(GetClusterIdContainingVisit(1), 0); + EXPECT_EQ(GetClusterIdContainingVisit(2), 1); + EXPECT_EQ(GetCluster(1).cluster_id, 1); + + // Delete the 2nd visit. Make sure the cluster is removed. + DeleteAnnotationsForVisit(2); + EXPECT_FALSE(GetContentAnnotationsForVisit(1, &got_content_annotations)); + EXPECT_FALSE(GetContextAnnotationsForVisit(1, &got_context_annotations)); + EXPECT_FALSE(GetContentAnnotationsForVisit(2, &got_content_annotations)); + EXPECT_FALSE(GetContextAnnotationsForVisit(2, &got_context_annotations)); + EXPECT_TRUE(GetVisitIdsInCluster(1).empty()); + EXPECT_EQ(GetClusterIdContainingVisit(1), 0); + EXPECT_EQ(GetClusterIdContainingVisit(2), 0); + EXPECT_EQ(GetCluster(1).cluster_id, 0); } TEST_F(VisitAnnotationsDatabaseTest, AddClusters_DeleteClusters) {
diff --git a/components/history_clusters/core/config.cc b/components/history_clusters/core/config.cc index 30de462..7ba3b8e 100644 --- a/components/history_clusters/core/config.cc +++ b/components/history_clusters/core/config.cc
@@ -44,6 +44,18 @@ internal::kJourneys, "JourneysPersistClustersInHistoryDb", persist_clusters_in_history_db); + persist_clusters_in_history_db_after_startup_delay_minutes = + base::GetFieldTrialParamByFeatureAsInt( + internal::kJourneys, + "JourneysPersistClustersInHistoryDbAfterStartupDelayMinutes", + persist_clusters_in_history_db_after_startup_delay_minutes); + + persist_clusters_in_history_db_period_minutes = + base::GetFieldTrialParamByFeatureAsInt( + internal::kJourneys, + "JourneysPersistClustersInHistoryDbPeriodMinutes", + persist_clusters_in_history_db_period_minutes); + min_score_to_always_show_above_the_fold = base::GetFieldTrialParamByFeatureAsDouble( internal::kJourneys, "JourneysMinScoreToAlwaysShowAboveTheFold",
diff --git a/components/history_clusters/core/config.h b/components/history_clusters/core/config.h index 36a6fe2..a149ab0 100644 --- a/components/history_clusters/core/config.h +++ b/components/history_clusters/core/config.h
@@ -44,7 +44,17 @@ // and accessing clusters will retrieve them from the history DB. If disabled, // updating clusters is a no-op and accessing clusters will generate and // return new clusters without persisting them. - bool persist_clusters_in_history_db = false; + bool persist_clusters_in_history_db = true; + + // No effect if `persist_clusters_in_history_db` is disabled. Determines how + // soon to update clusters after startup in minutes. E.g., by default, will + // update clusters 5 minutes after startup. + int persist_clusters_in_history_db_after_startup_delay_minutes = 5; + + // No effect if `persist_clusters_in_history_db` is disabled. Determines how + // often to update clusters in minutes. E.g., by default, will update clusters + // every hour. + int persist_clusters_in_history_db_period_minutes = 60; // Enables the on-device clustering backend. Enabled by default, since this is // the production mode of the whole feature. The backend is only in official
diff --git a/components/history_clusters/core/history_clusters_db_tasks.cc b/components/history_clusters/core/history_clusters_db_tasks.cc index 1ee8624..811f5587 100644 --- a/components/history_clusters/core/history_clusters_db_tasks.cc +++ b/components/history_clusters/core/history_clusters_db_tasks.cc
@@ -164,7 +164,7 @@ // visits. const bool is_clustered = GetConfig().persist_clusters_in_history_db - ? db->IsVisitClustered(visit.visit_row.visit_id) + ? db->GetClusterIdContainingVisit(visit.visit_row.visit_id) > 0 : false; if (is_clustered && recent_first_) continuation_params_.exhausted_unclustered_visits = true;
diff --git a/components/history_clusters/core/history_clusters_service.cc b/components/history_clusters/core/history_clusters_service.cc index fb4e4c7..06a8416 100644 --- a/components/history_clusters/core/history_clusters_service.cc +++ b/components/history_clusters/core/history_clusters_service.cc
@@ -18,6 +18,7 @@ #include "base/time/time.h" #include "base/time/time_to_iso8601.h" #include "base/timer/elapsed_timer.h" +#include "base/timer/timer.h" #include "components/history/core/browser/history_backend.h" #include "components/history/core/browser/history_database.h" #include "components/history/core/browser/history_db_task.h" @@ -70,6 +71,8 @@ backend_ = std::make_unique<OnDeviceClusteringBackend>( entity_metadata_provider, engagement_score_provider, optimization_guide_decider, JourneysMidBlocklist()); + + RepeatedlyUpdateClusters(); } HistoryClustersService::~HistoryClustersService() = default; @@ -170,16 +173,34 @@ continuation_params, std::move(callback)); } -void HistoryClustersService::UpdateClusters(base::OnceClosure callback) { - DCHECK(history_service_); +void HistoryClustersService::RepeatedlyUpdateClusters() { if (!GetConfig().persist_clusters_in_history_db) return; + // Update clusters, both periodically and once after startup because: + // 1) To avoid having very stale (up to 90 days) clusters for the initial + // period after startup. + // 2) Likewise, to avoid having very stale keywords. + // 3) Some users might not keep chrome running for the period. + update_clusters_after_startup_delay_timer_.Start( + FROM_HERE, + base::Minutes( + GetConfig() + .persist_clusters_in_history_db_after_startup_delay_minutes), + this, &HistoryClustersService::UpdateClusters); + update_clusters_period_timer_.Start( + FROM_HERE, + base::Minutes(GetConfig().persist_clusters_in_history_db_period_minutes), + this, &HistoryClustersService::UpdateClusters); +} + +void HistoryClustersService::UpdateClusters() { + DCHECK(history_service_); if (update_clusters_task_ && !update_clusters_task_->Done()) return; update_clusters_task_ = std::make_unique<HistoryClustersServiceTaskUpdateClusters>( incomplete_visit_context_annotations_, backend_.get(), - history_service_, std::move(callback)); + history_service_, base::DoNothing()); } absl::optional<history::ClusterKeywordData>
diff --git a/components/history_clusters/core/history_clusters_service.h b/components/history_clusters/core/history_clusters_service.h index de79219..d2f87c1 100644 --- a/components/history_clusters/core/history_clusters_service.h +++ b/components/history_clusters/core/history_clusters_service.h
@@ -20,6 +20,7 @@ #include "base/task/cancelable_task_tracker.h" #include "base/time/time.h" #include "base/timer/elapsed_timer.h" +#include "base/timer/timer.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/history_service_observer.h" #include "components/history/core/browser/history_types.h" @@ -166,11 +167,14 @@ QueryClustersContinuationParams continuation_params, QueryClustersCallback callback); + // Invokes `UpdateClusters()` after a short delay, then again periodically. + // E.g., might invoke `UpdateClusters()` initially 5 minutes after startup, + // then every 1 hour afterwards. + void RepeatedlyUpdateClusters(); + // Entrypoint to the `HistoryClustersServiceTaskUpdateClusters`. Updates the // persisted clusters in the history DB and invokes `callback` when done. - // TODO(manukh): This isn't invoked yet. It should be invoked periodically, - // e.g., every N hours checked on a timer, omnibox input, or navigation. - void UpdateClusters(base::OnceClosure callback); + void UpdateClusters(); // Returns matched keyword data from cache synchronously if `query` matches a // cluster keyword. This ignores clusters with only one visit to avoid @@ -257,6 +261,14 @@ std::unique_ptr<HistoryClustersServiceTaskUpdateClusters> update_clusters_task_; + // Used to invoke `UpdateClusters()` on startup after a short delay. See + // `RepeatedlyUpdateClusters()`'s comment. + base::OneShotTimer update_clusters_after_startup_delay_timer_; + + // Used to invoke `UpdateClusters()` periodically. See + // `RepeatedlyUpdateClusters()`'s comment. + base::RepeatingTimer update_clusters_period_timer_; + // A list of observers for this service. base::ObserverList<Observer> observers_;
diff --git a/components/history_clusters/core/history_clusters_service_task_update_clusters.cc b/components/history_clusters/core/history_clusters_service_task_update_clusters.cc index 16510e0..2fd706ce 100644 --- a/components/history_clusters/core/history_clusters_service_task_update_clusters.cc +++ b/components/history_clusters/core/history_clusters_service_task_update_clusters.cc
@@ -32,6 +32,7 @@ void HistoryClustersServiceTaskUpdateClusters::Start() { if (!backend_ || continuation_params_.exhausted_all_visits) { + done_ = true; std::move(callback_).Run(); return; } @@ -52,6 +53,7 @@ QueryClustersContinuationParams continuation_params) { if (annotated_visits.empty()) { DCHECK(continuation_params.exhausted_all_visits); + done_ = true; std::move(callback_).Run(); return; }
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 413092e7..2508eed 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -261,6 +261,11 @@ extern const base::Feature kMostVisitedTiles{"OmniboxMostVisitedTiles", enabled_by_default_android_only}; +// If enabled, computes spacing between MV tiles so that about 4.5 tiles are +// shown on screen on narrow devices. +extern const base::Feature kMostVisitedTilesDynamicSpacing{ + "OmniboxMostVisitedTilesDynamicSpacing", base::FEATURE_DISABLED_BY_DEFAULT}; + // If enabled, permits the title on the MostVisitedTiles to wrap around to // second line. extern const base::Feature kMostVisitedTilesTitleWrapAround{
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index bd6df7a..71cca34 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -75,6 +75,7 @@ extern const base::Feature kDocumentProviderDedupingOptimization; extern const base::Feature kSuggestionAnswersColorReverse; extern const base::Feature kMostVisitedTiles; +extern const base::Feature kMostVisitedTilesDynamicSpacing; extern const base::Feature kMostVisitedTilesTitleWrapAround; extern const base::Feature kRichAutocompletion; extern const base::Feature kNtpRealboxPedals;
diff --git a/components/plugins/renderer/webview_plugin.h b/components/plugins/renderer/webview_plugin.h index 52f8bac1..758ef39b 100644 --- a/components/plugins/renderer/webview_plugin.h +++ b/components/plugins/renderer/webview_plugin.h
@@ -31,6 +31,7 @@ namespace web_pref { struct WebPreferences; } // namespace web_pref +struct RendererPreferences; class WebLocalFrame; class WebMouseEvent; }
diff --git a/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java b/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java index 103d37d..8ce6f86d 100644 --- a/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java +++ b/components/policy/android/java/src/org/chromium/components/policy/AppRestrictionsProvider.java
@@ -7,11 +7,8 @@ import android.content.Context; import android.content.Intent; import android.os.Bundle; -import android.os.SystemClock; import android.os.UserManager; -import org.chromium.base.metrics.RecordHistogram; - /** * Concrete app restriction provider, that uses the default android mechanism to retrieve the * restrictions. @@ -45,19 +42,7 @@ @Override protected Bundle getApplicationRestrictions(String packageName) { - long startTime = SystemClock.elapsedRealtime(); - Bundle bundle = getApplicationRestrictionsFromUserManager(mUserManager, packageName); - long endTime = SystemClock.elapsedRealtime(); - long duration = endTime - startTime; - RecordHistogram.recordTimesHistogram("Enterprise.AppRestrictionLoadTime2", duration); - if (bundle.isEmpty()) { - RecordHistogram.recordTimesHistogram( - "Enterprise.AppRestrictionLoadTime2.EmptyBundle", duration); - } else { - RecordHistogram.recordTimesHistogram( - "Enterprise.AppRestrictionLoadTime2.NonEmptyBundle", duration); - } - return bundle; + return getApplicationRestrictionsFromUserManager(mUserManager, packageName); } @Override
diff --git a/components/policy/resources/policy_templates.json b/components/policy/resources/policy_templates.json index f435b489..b71ea36 100644 --- a/components/policy/resources/policy_templates.json +++ b/components/policy/resources/policy_templates.json
@@ -491,7 +491,8 @@ 'KerberosRememberPasswordEnabled', 'KerberosAddAccountsAllowed', 'KerberosAccounts', - 'KerberosDomainAutocomplete' + 'KerberosDomainAutocomplete', + 'KerberosDefaultConfiguration' ], }, { @@ -25484,6 +25485,27 @@ If this policy is unset, no additional information is shown and creating the ticket works as usual.''', }, { + 'name': 'KerberosDefaultConfiguration', + 'owners': ['slutskii@google.com', 'file://chrome/browser/ash/kerberos/OWNERS'], + 'type': 'string', + 'schema': { 'type': 'string' }, + 'future_on': ['chrome_os'], + 'supported_chrome_os_management': ['google_cloud'], + 'features': { + 'dynamic_refresh': True, + 'per_profile': False, + }, + 'example_value': '[libdefaults]\n default_tgs_enctypes = aes256-cts-hmac-sha1-96\n', + 'id': 1000, + 'caption': '''Changes default configuration for Kerberos tickets''', + 'tags': ['website-sharing'], + 'desc': '''Changes the <ph name="KRB5_CONFIG">krb5</ph> suggested configuration for the new manually created tickets. + + If the policy is set, its value is applied as the suggested configuration and shown in the "Advanced" section of the authentication dialog. + + If this policy is unset, the recommended <ph name="PRODUCT_OS_NAME">$2<ex>Google ChromeOS</ex></ph> configuration is applied instead. Note that it is also shown in the "Advanced" section of the authentication dialog.''', + }, + { 'name': 'CommandLineFlagSecurityWarningsEnabled', 'owners': ['proberge@chromium.org'], 'type': 'main', @@ -33502,6 +33524,6 @@ 'placeholders': [], 'deleted_policy_ids': [114, 115, 204, 205, 206, 341, 412, 438, 476, 544, 546, 562, 569, 578, 583, 585, 586, 587, 588, 589, 590, 591, 600, 668, 669, 872], 'deleted_atomic_policy_group_ids': [19], - 'highest_id_currently_used': 999, + 'highest_id_currently_used': 1000, 'highest_atomic_group_id_currently_used': 43 }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index 9357e65..918dff68 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -100,6 +100,7 @@ <translation id="1095209545735032039">Serial API auf diesen Websites blockieren</translation> <translation id="1096105751829466145">Standardsuchmaschine</translation> <translation id="1099282607296956954">Website-Isolierung für jede Website aktivieren</translation> +<translation id="1100840127293327071">Option zum standardmäßigen Beibehalten bestehender Browserdaten nicht aktivieren</translation> <translation id="1105572260329131950">Standardsymbole für sichere Verbindungen verwenden</translation> <translation id="1107538157073168076">Erweiterung „Insights“ deaktivieren</translation> <translation id="1110426799149444997"><ph name="GOOGLE_LENS_PRODUCT_NAME" />-Ausschnittsuche deaktivieren.</translation> @@ -257,6 +258,7 @@ Wenn die Richtlinie nicht konfiguriert oder der Wert nach dem Ersetzen kein gültiger Hostname ist, wird in der DHCP-Anfrage kein Hostname festgelegt.</translation> <translation id="1257550411839719984">Standard-Downloadverzeichnis festlegen</translation> <translation id="1265053460044691532">Zeit beschränken, für die sich ein über SAML authentifizierter Nutzer offline anmelden kann</translation> +<translation id="1271811620059192171">Gruppen aus Einzelrichtlinien aktivieren</translation> <translation id="127264587838521316">Mit dieser Richtlinie werden Anfragen für die Installation von Erweiterungen für <ph name="PRODUCT_NAME" /> aktiviert</translation> <translation id="1272798957154751008">Migration von Chromad-Geräten zur Cloud-Verwaltung aktivieren</translation> <translation id="1274997165432133392">Cookies und andere Websitedaten</translation> @@ -741,6 +743,14 @@ <translation id="1781356041596378058">Diese Richtlinie steuert zudem den Zugriff auf Android-Entwickleroptionen. Wenn du diese Richtlinie auf "true" setzt, können Nutzer nicht auf die Entwickleroptionen zugreifen. Wenn du diese Richtlinie auf "false" setzt oder nicht konfigurierst, können Nutzer auf die Entwickleroptionen zugreifen, indem sie siebenmal auf die Build-Nummer in der Android-App "Einstellungen" tippen.</translation> <translation id="1787790976045065845">Diese Richtlinie ist nur dann wirksam, wenn die Richtlinie „<ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_POLICY_NAME" />“ auf „<ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOCK" />“ oder „<ph name="SECURITY_TOKEN_SESSION_BEHAVIOR_LOGOUT" />“ eingestellt ist und ein Nutzer, der sich mit einer Smartcard authentifiziert hat, diese entfernt. Dann legt diese Richtlinie fest, wie viele Sekunden lang eine Benachrichtigung angezeigt wird, die den Nutzer über bevorstehende Aktionen informiert. Diese Benachrichtigung blockiert den Bildschirm. Die Aktion beginnt erst nach dem Ablauf der Benachrichtigung. Der Nutzer kann die Aktion unterbinden, wenn die Smartcard vor dem Ablauf der Benachrichtigung wieder eingeführt wird. Wenn für diese Richtlinie „0“ konfiguriert ist, wird keine Benachrichtigung angezeigt und die Aktion sofort ausgeführt.</translation> <translation id="1793346220873697538">PIN-Druckmodus standardmäßig deaktivieren</translation> +<translation id="1794457906032475749">Wenn die Richtlinie aktiviert ist, ist die Option zum Beibehalten bestehender Browserdaten beim Erstellen eines Unternehmensprofils standardmäßig aktiviert. + +Ist die Richtlinie deaktiviert oder nicht konfiguriert, ist die Option zum Beibehalten bestehender Browserdaten beim Erstellen eines Unternehmensprofils standardmäßig deaktiviert. + +Unabhängig davon, ob die Option aktiviert oder deaktiviert ist, kann der Nutzer beim Erstellen eines Unternehmensprofils entscheiden, ob vorhandene Browserdaten beibehalten werden sollen. + +Diese Richtlinie hat keine Auswirkungen, wenn die Option zum Beibehalten von bestehenden Browserdaten nicht verfügbar ist. Dies ist der Fall, wenn die Trennung von Unternehmensprofilen streng durchgesetzt wird oder die Daten aus einem bereits verwalteten Profil stammen. +</translation> <translation id="179694024208061102">Ist die Richtlinie aktiviert, versucht <ph name="PRODUCT_NAME" />, einige URLs in einem alternativen Browser, wie z. B. <ph name="IE_PRODUCT_NAME" />, zu öffnen. Diese Funktion wird mithilfe der Richtlinien in der Gruppe "<ph name="LEGACY_BROWSER_SUPPORT_POLICY_GROUP" />" festgelegt. Ist die Richtlinie deaktiviert oder nicht konfiguriert, versucht <ph name="PRODUCT_NAME" /> nicht, bestimmte URLs in einem alternativen Browser zu öffnen.</translation> @@ -1618,6 +1628,7 @@ Unter <ph name="MS_WIN_NAME" /> steht diese Funktion nur bei Instanzen zur Verfügung, die Teil einer <ph name="MS_AD_NAME" />-Domain sind, auf denen Windows 10 Pro läuft oder die durch die Chrome-Verwaltung über die Cloud verwaltet werden. Unter <ph name="MAC_OS_NAME" /> steht diese Funktion nur bei Instanzen zur Verfügung, die über die Mobilgeräteverwaltung verwaltet werden oder per MCX mit einer Domain verbunden sind.</translation> <translation id="2623014935069176671">Auf erste Nutzeraktivität warten</translation> +<translation id="2625026032335150744">Option zum standardmäßigen Beibehalten bestehender Browserdaten aktivieren</translation> <translation id="2625398797484317969">Damit werden die Einstellungen für „Schnellinfo“ festgelegt.</translation> <translation id="262740370354162807">Senden von Dokumenten an <ph name="CLOUD_PRINT_NAME" /> aktivieren</translation> <translation id="2633084400146331575">Gesprochenes Feedback aktivieren</translation> @@ -2039,6 +2050,7 @@ Genaue Informationen zu gültigen <ph name="URL_LABEL" />-Mustern findest du unter https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> ist kein akzeptierter Wert für diese Richtlinie.</translation> <translation id="305106159605171619">Verringerung des User-Agents ist deaktiviert und wurde nicht durch Feld- oder Ursprungstests aktiviert.</translation> <translation id="3053265701996417839">Microsoft Windows 7</translation> +<translation id="3063302084011279315">Screencast deaktivieren</translation> <translation id="3064530882228745118">CNAME-Suche bei der Kerberos-Authentifizierung verwenden</translation> <translation id="3066446511111537292">Verknüpften Nutzern dieses Geräts erlauben, ADB-Sideloading zu verwenden</translation> <translation id="3070119171976169951">Verhindern, dass in Bildern von Drittanbietern eine Authentifizierungsaufforderung angezeigt wird</translation> @@ -2255,6 +2267,7 @@ <translation id="3255762580838224124">Wenn die Richtlinie konfiguriert ist, wird jeder Bildschirm anhand der festgelegten Bildschirmausrichtung gedreht, wenn das Gerät neugestartet oder der Bildschirm nach einer Änderung des Richtlinienwerts zum ersten Mal angeschlossen wird. Nachdem ein Nutzer sich angemeldet hat, kann er die Bildschirmausrichtung auf der Einstellungsseite ändern, sie wird aber nach dem nächsten Neustart zurückgesetzt. Diese Richtlinie gilt sowohl für primäre als auch sekundäre Bildschirme. Ist die Richtlinie nicht konfiguriert, wird der Standardwert von 0 Grad verwendet und Nutzer können die Bildschirmausrichtung ändern. Die Bildschirmausrichtung wird dann nach dem Neustart nicht zurückgesetzt.</translation> +<translation id="3257786863492892609">Hiermit werden Richtlinien für Screencast gesteuert.</translation> <translation id="3258380413685430793">Alle <ph name="FLASH_PLUGIN_NAME" />-Inhalte ausführen</translation> <translation id="325883417142483505">Mit dieser Richtlinie kannst du die Liste der URLs für die Unternehmensanmeldung festlegen (nur HTTP- und HTTPS-Protokolle). Der Passwortschutzdienst erfasst auf diesen URLs den Salted-Hash-Wert von Passwörtern und verwendet ihn, um zu prüfen, ob Passwörter wiederverwendet werden. Deine Anmeldeseiten müssen den Richtlinien unter https://www.chromium.org/developers/design-documents/create-amazing-password-forms entsprechen, damit Salted-Hash-Werte von Passwörtern in <ph name="PRODUCT_NAME" /> richtig erfasst werden können. @@ -2850,6 +2863,7 @@ Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, dürfen Nutzer nur dann aufgefordert werden, wenn kein Zertifikat zur automatischen Auswahl passt.</translation> <translation id="3950110092991281616">Aktiviert die passive Authentifizierung nur für reguläre Sitzungen.</translation> <translation id="3950239119790560549">Zeitbeschränkungen aktualisieren</translation> +<translation id="3956243291190637924">Kopf- und Fußzeilen in der Druckvorschau ausblenden</translation> <translation id="3956573780915784996">Nutzern erlauben, eine systemweite Leistungs-Trace zu erfassen.</translation> <translation id="3956686688560604829">Richtlinie "SiteList" von Internet Explorer zur Unterstützung älterer Browser verwenden.</translation> <translation id="3958586912393694012">Verwendung von Smart Lock erlauben</translation> @@ -3086,6 +3100,16 @@ Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, können Nutzer Dateien auch über die Mobilfunkverbindung in Drive hochladen.</translation> <translation id="4248277954659222481">Autoplay von Medien für eine Zulassungsliste mit URL-Mustern erlauben</translation> <translation id="4250680216510889253">Nein</translation> +<translation id="4259636715493757956">Ermöglicht dir, Konfigurationen für Authentifizierungs-URLs in <ph name="WEBVIEW_PRODUCT_NAME" /> anzugeben. + + Diese Authentifizierungs-URLs werden von <ph name="WEBVIEW_PRODUCT_NAME" /> so verarbeitet: Wenn bei der Authentifizierung von einer Webseite in <ph name="WEBVIEW_PRODUCT_NAME" /> Authentifizierungs-URLs aufgerufen werden, wird die Authentifizierungs-App des jeweiligen Identitätsanbieters gestartet, die diese Authentifizierungs-URL verarbeiten kann. + + Mit dem Start der Authentifizierungs-App ermöglichen die Identitätsanbieter Anwendungsfälle wie die App-übergreifende SSO-Bereitstellung bzw. ein höheres Sicherheitslevel. Zu diesem Zweck wird anhand von Zero-Trust-Gerätesignalen der Gerätestatus während der Authentifizierung ermittelt. + + Wenn keine gültige App zur Verarbeitung der Authentifizierungs-URL auf dem Gerät installiert ist, wird die Navigation in <ph name="WEBVIEW_PRODUCT_NAME" /> fortgesetzt. + + Die Authentifizierungs-URL muss so formatiert sein wie in dieser Dokumentation beschrieben: https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Wenn die Richtlinie konfiguriert ist, wird für jeden der benannten Ursprünge in einer durch Kommas getrennten Liste ein eigener Prozess ausgeführt. Jeder Prozess darf nur Dokumente aus diesem Ursprung und den zugehörigen Subdomains enthalten. Wird zum Beispiel https://a1.beispiel.de/ angegeben, ist https://a2.a1.beispiel.de/ im selben Prozess zulässig, https://beispiel.de oder https://b.beispiel.de aber nicht. Seit <ph name="PRODUCT_NAME" />-Version 77 kann auch ein Ursprungsbereich für die Isolierung angegeben werden. Dazu wird ein Platzhalter verwendet. Wenn du z. B. https://[*.]firma.beispiel.de angibst, wird für jeden Ursprung unter https://firma.beispiel.de ein eigener Prozess ausgeführt, einschließlich https://firma.beispiel.de selbst, https://a1.firma.beispiel.de und https://a2.a1.firma.beispiel.de. @@ -3221,10 +3245,12 @@ <translation id="441686537793821907">Installation externer Erweiterungen blockieren</translation> <translation id="4423597592074154136">Proxy-Einstellungen manuell angeben</translation> <translation id="4424004842303301809">Berichte zur Verhinderung von Datenlecks deaktivieren</translation> +<translation id="4426601693403743089">Screencast-Dogfood für Family Link-Nutzer deaktivieren</translation> <translation id="4427173305799125784">Mit dem PDF-Viewer können PDFs nicht mit Anmerkungen versehen werden</translation> <translation id="4432762137771104529">Erweiterte Berichterstellung bei der Verwendung von Safe Browsing aktivieren</translation> <translation id="443454694385851356">Veraltet (nicht sicher)</translation> <translation id="443665821428652897">Websitedaten beim Schließen des Browsers löschen (veraltet)</translation> +<translation id="4436941175475497595">Druckvorschau deaktivieren</translation> <translation id="4439336120285389675">Mit dieser Richtlinie kann eine Liste mit eingestellten Webplattformfunktionen festgelegt werden, die vorübergehend wieder aktiviert werden sollen. Mit der Richtlinie haben Administratoren die Möglichkeit, eingestellte Webplattformfunktionen für einen begrenzten Zeitraum wieder zu aktivieren. Die Funktionen werden durch ein String-Tag identifiziert und die Funktionen, die den Tags in der Liste entsprechen, die durch diese Richtlinie festgelegt wurde, werden wieder aktiviert. @@ -3508,13 +3534,6 @@ <translation id="482803100714220060">Vollständige URLs anzeigen</translation> <translation id="4832852360828533362">Berichte zu Nutzern und Geräten</translation> <translation id="4834526953114077364">Die am längsten nicht verwendeten Nutzer, dich sich in den letzten 3 Monaten nicht angemeldet haben, werden entfernt, bis genügend freier Speicherplatz vorhanden ist.</translation> -<translation id="483544442646753291">Diese Richtlinie steuert die Nutzereinstellungen für die in <ph name="SYSTEM_FEATURES_DISABLE_LIST" /> aufgelisteten deaktivierten Funktionen. - - Wenn sie als „blockiert“ konfiguriert ist, können die deaktivierten Funktionen nicht mehr verwendet werden, sind jedoch weiterhin für Nutzer sichtbar. - - Wenn die Richtlinie auf „ausgeblendet“ gesetzt ist, können die deaktivierten Funktionen nicht mehr verwendet werden und sind nicht für Nutzer sichtbar. - - Wenn sie nicht konfiguriert ist oder einen ungültigen Wert enthält, ist der Deaktivierungsmodus in den Systemfunktionen auf „blockiert“ gesetzt.</translation> <translation id="4835470005923546373">Standardmäßig Druckmodus mit Hintergrundgrafiken deaktivieren</translation> <translation id="4835622243021053389">NTLMv2-Authentifizierung aktivieren.</translation> <translation id="4840015507504937941">Diese Richtlinie gibt die Mindestdatengröße (in Byte) der Daten in der Zwischenablage vor, die mit in der Richtlinie „DataLeakPreventionRulesList“ definierten Regeln für die Zwischenablagenbeschränkung abgeglichen werden. @@ -4266,6 +4285,7 @@ Trenne mehrere Servernamen durch Kommas. Platzhalter wie <ph name="WILDCARD_VALUE" /> sind zulässig.</translation> <translation id="5645779841392247734">Cookies auf diesen Websites zulassen</translation> <translation id="5646234199535103501">Konfigurationsrichtlinie für den Chrome Enterprise Connector "OnBulkDataEntry"</translation> +<translation id="5648016151508002741">Ausführung von Onlineprüfungen von <ph name="OCSP_CRL_LABEL" />-verhindern</translation> <translation id="5649046890958064703">Wenn <ph name="PRINTERS_BLACKLIST" /> für <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> ausgewählt ist, wird durch Festlegen von <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_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. Diese Richtlinie wurde eingestellt. Bitte verwende stattdessen die Richtlinie <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation> @@ -4390,9 +4410,6 @@ Wenn die Richtlinie auf "false" gesetzt oder nicht konfiguriert ist, werden keine Informationen ausgegeben. Ist sie auf "true" gesetzt, werden VPD-Informationen zum Gerät ausgegeben. Vital Product Data (VPD) sind Informationen zum Gerät selbst (z. B. Teile- und Seriennummern) und zur Konfiguration des Geräts.</translation> -<translation id="576158229686912964">Diese Richtlinie wird in M96 eingestellt. Bitte verwende stattdessen <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> und <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, wird über registrierte Geräte eine Liste der Netzwerkschnittstellen mit deren Typen und Hardwareadressen gemeldet. Ist sie deaktiviert, melden registrierte Geräte keine Netzwerkschnittstellen.</translation> <translation id="5762969307102447459">„Automatisches Ausfüllen“ für Adressen deaktivieren</translation> <translation id="5765780083710877561">Beschreibung:</translation> <translation id="5766438888216077649">Für Links, die <ph name="BLANK_PAGE_NAME" /> zum Ziel haben, sollte <ph name="WINDOW_OPENER_PROPERTY" /> nicht aktiviert werden</translation> @@ -4511,6 +4528,7 @@ <translation id="5893303508158298667">Wenn „<ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" />“ aktiviert ist, kann es Remote-Clients durch Aktivieren oder Nichtkonfigurieren von „<ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" />“ ermöglicht werden, über Relayserver eine Verbindung zu diesem Computer herzustellen, falls keine direkte Verbindung verfügbar ist, z. B. aufgrund von Firewallbeschränkungen. Ist diese Richtlinie deaktiviert, wird dadurch nicht der Remote-Zugriff deaktiviert. Stattdessen werden nur Verbindungen desselben Netzwerks zugelassen (nicht NAT-Traversal oder Relay).</translation> +<translation id="5897234314586602143">Kopf- und Fußzeilen in der Druckvorschau anzeigen</translation> <translation id="5897913798715600338">Lädt den Akku mit Schnellladetechnologie auf.</translation> <translation id="5898486742390981550">Wenn mehrere Nutzer angemeldet sind, kann nur der Hauptnutzer Android-Apps verwenden.</translation> <translation id="5899751601113377553">Verhindern, dass Nutzer <ph name="LACROS_NAME" /> verwenden</translation> @@ -4807,6 +4825,7 @@ Jedes Listenelement der Richtlinie ist ein String mit einer Erweiterungs-ID und einer optionalen Update-URL, die durch ein Semikolon (<ph name="SEMICOLON" />) getrennt sind. Die Erweiterungs-ID ist der String mit 32 Buchstaben, den du beispielsweise im Entwicklermodus unter <ph name="CHROME_EXTENSIONS_LINK" /> siehst. Die Update-URL sollte, sofern festgelegt, auf ein XML-Dokument mit einem Update-Manifest verweisen, wie unter <ph name="LINK_TO_EXTENSION_DOC1" /> beschrieben. Standardmäßig kommt die Update-URL des Chrome Web Store zum Einsatz, die derzeit "https://clients2.google.com/service/update2/crx" lautet. Die in dieser Richtlinie festgelegte Update-URL wird nur für die erste Installation verwendet. In nachfolgenden Updates der Erweiterung kommt die Update-URL zum Einsatz, die im Manifest der Erweiterung angegeben wurde. So wird im Beispiel von <ph name="LOGIN_SCREEN_EXTENSION_POLICY_EXAMPLE" /> die <ph name="SMART_CARD_CONNECTOR_APP_NAME" /> App über die standardmäßige "Update"-URL des Chrome Web Stores installiert. Weitere Informationen zum Hosten von Erweiterungen findest du unter: <ph name="LINK_TO_EXTENSION_DOC2" />.</translation> +<translation id="6274202259872570803">Screencast</translation> <translation id="6275497712828649588">Sicherheitswarnungen ausblenden, wenn potenziell schädliche Befehlszeilen-Flags verwendet werden</translation> <translation id="6275833043726517413">Alte <ph name="CORS" />-Implementierung statt des neuen <ph name="CORS" /> verwenden. @@ -4840,7 +4859,15 @@ Die Einstellung <ph name="CHROME_OS_RELEASE_CHANNEL_POLICY_NAME" /> ist nur wirksam, wenn <ph name="CHROME_OS_RELEASE_CHANNEL_DELEGATED_POLICY_NAME" /> auf „False“ gesetzt ist.</translation> <translation id="6305373713165475629">Durch die Richtlinie wird der standardmäßige Farbdruckmodus überschrieben. Wenn der Modus nicht verfügbar ist, wird die Richtlinie ignoriert.</translation> +<translation id="6308109234708949641">Diese Richtlinie ermöglicht Family Link-Nutzern die Nutzung der Screencast-Funktion und gibt ihr die Berechtigung, Bildschirmaufzeichnungen zu erstellen, zu transkribieren und in Drive hochzuladen. + Sie wirkt sich nicht auf andere Nutzertypen aus. + Sie hat auch keine Auswirkungen auf die Richtlinie <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> für Unternehmensnutzer. + + Wenn die Richtlinie aktiviert ist, ist Screencast-Dogfood für Family Link-Nutzer aktiviert. + Ist sie deaktiviert, ist Screencast-Dogfood für Family Link-Nutzer deaktiviert. + Wenn die Richtlinie nicht konfiguriert ist, ist Screencast-Dogfood für Family Link-Nutzer standardmäßig deaktiviert.</translation> <translation id="6310223829319187614">Automatische Vervollständigung des Domainnamens während der Nutzeranmeldung aktivieren</translation> +<translation id="6310756730808079944">Screencast aktivieren</translation> <translation id="631081324835911099">Durch diese Richtlinie wird die Abmeldung des Nutzers erzwungen, wenn das Authentifizierungstoken seines primären Kontos ungültig wird. Sie kann den Nutzer vor dem Zugriff auf eingeschränkte Inhalte schützen, die sich auf Web-Properties von Google befinden. Wenn diese Richtlinie auf "true" gesetzt wird, wird der Nutzer abgemeldet, sobald sein Authentifizierungstoken ungültig wird und das Token nicht wiederhergestellt werden kann. @@ -5007,6 +5034,13 @@ <translation id="6478258366184919502">Ursprünge für Anmeldebildschirm</translation> <translation id="6478261301433199402">Wenn diese Richtlinie konfiguriert ist, wird das <ph name="PLUGIN_VM_NAME" />-Bild für den Nutzer festgelegt. Gib diese Richtlinie als String im JSON-Format an, wobei <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> angibt, wo das Bild heruntergeladen werden kann. Zusätzlich wird <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> als ein SHA-256-Hash-Wert festgelegt, mit dem die Integrität des Downloads bestätigt wird.</translation> <translation id="6481245670325946423">Verwendung des monitorlosen Modus erlauben</translation> +<translation id="648158446793103284">Wenn die Richtlinie konfiguriert ist, können Nutzer eine der von dir festgelegten Eingabemethoden für <ph name="PRODUCT_OS_NAME" />-Sitzungen auswählen. + + Wenn sie nicht konfiguriert oder eine leere Liste festgelegt ist, können Nutzer alle unterstützten Eingabemethoden auswählen. + + Ab Version M106 sind zulässige Eingabemethoden in der Kiosksitzung automatisch aktiviert. + + Hinweis: Falls die aktuelle Eingabemethode nicht unterstützt wird, wird die Eingabemethode auf das Hardware-Tastaturlayout (falls zulässig) oder den ersten gültigen Eintrag in dieser Liste eingestellt. Alle ungültigen oder nicht unterstützten Eingabemethoden in der Liste werden ignoriert.</translation> <translation id="6489084406497912050">Damit wird festgelegt, ob Nutzer Kerberos-Konten hinzufügen können. Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, können Nutzer Kerberos-Konten über die Kontoeinstellungen von Kerberos auf der Kerberos-Einstellungsseite hinzufügen. Die Nutzer haben die vollständige Kontrolle über Konten, die sie hinzufügen, und können diese ändern oder entfernen. @@ -5214,6 +5248,12 @@ Wurde "false" oder "not configured" festgelegt, wird die Erstellung und Anmeldung betreuter Nutzer deaktiviert. Alle vorhandenen betreuten Nutzer werden ausgeblendet. Hinweis: Das Standardverhalten bei Geräten für Kunden und bei Geräten für Unternehmen ist unterschiedlich: Bei Geräten für Kunden sind betreute Nutzer standardmäßig aktiviert, bei Geräten für Unternehmen hingegen sind sie standardmäßig deaktiviert.</translation> +<translation id="6648746349186337075">Diese Richtlinie berechtigt Screencast dazu, für Unternehmensnutzer Bildschirmaufzeichnungen zu erstellen, zu transkribieren und in Drive hochzuladen. + Sie wirkt sich nicht auf Family Link-Nutzer aus. + Sie hat auch keine Auswirkungen auf die Richtlinie <ph name="PROJECTOR_DOGFOOD_FOR_FAMILY_LINK_ENABLED_POLICY_NAME" /> für Family Link-Nutzer. + + Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, ist Screencast aktiviert. + Ist sie deaktiviert, ist Screencast deaktiviert.</translation> <translation id="665023848306499203">Geräten das Festlegen einer bestimmten Updateversion erlauben</translation> <translation id="6652197835259177259">Einstellungen für lokal verwaltete Nutzer</translation> <translation id="6653897159826215341">Wenn die Richtlinie aktiviert ist, öffnet <ph name="PRODUCT_NAME" /> nicht die integrierte Druckvorschau, sondern das Druckdialogfeld des Systems, wenn ein Nutzer die Druckfunktion verwendet. @@ -5229,6 +5269,7 @@ Ist diese Richtlinie auf "False" gesetzt, wird die standardmäßige URL angezeigt. Wenn die Richtlinie nicht konfiguriert ist, wird die standardmäßige URL angezeigt und Nutzer können über ein Kontextmenü zwischen der standardmäßigen und vollständigen URL wechseln. </translation> +<translation id="6670794785040100077">Senden von Dokumenten an <ph name="CLOUD_PRINT_NAME" /> deaktivieren</translation> <translation id="6672070613706645316">Nutzern erlauben, den Hintergrund auf der "Neuer Tab"-Seite anzupassen</translation> <translation id="6672630473862787247">Aktiviert die passive Authentifizierung für reguläre, Inkognito- und Gastsitzungen.</translation> <translation id="6685903773201985073">Aktiviert die passive Authentifizierung für Gast- und reguläre Sitzungen.</translation> @@ -5315,6 +5356,7 @@ Ist "<ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" />" nicht konfiguriert, werden Suchanfragen mithilfe der GET-Methode gesendet.</translation> <translation id="6757613329154374267">"Sichern und wiederherstellen" aktiviert</translation> <translation id="6758659208493449452">Mit dieser Richtlinie wird festgelegt, ob Teilnehmer am erweiterten Sicherheitsprogramm zusätzlich geschützt werden. Bei manchen dieser Funktionen werden unter Umständen Daten mit Google geteilt. Teilnehmer am erweiterten Sicherheitsprogramm können beispielsweise ihre heruntergeladenen Dateien für einen Malware-Scan an Google senden. Wird die Richtlinie auf "true" gesetzt oder nicht konfiguriert, werden entsprechende Nutzer zusätzlich geschützt. Wird die Richtlinie auf "false" gesetzt, stehen ihnen nur die Standardfunktionen für Privatnutzer zur Verfügung.</translation> +<translation id="6763023079133439068">Zertifikate ohne die Erweiterung „subjectAlternativeName“ zulassen, wenn sie von lokalen Trust-Anchors ausgestellt sind</translation> <translation id="6766216162565713893">Websites dürfen den Nutzer um Zugriff auf ein Bluetooth-Gerät in der Nähe bitten</translation> <translation id="6770454900105963262">Informationen zu aktiven Kiosksitzungen senden</translation> <translation id="6782977971207381602">Wenn die Richtlinie aktiviert ist, kann das Gerät unter <ph name="PRODUCT_OS_NAME" /> virtuelle Maschinen ausführen. <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> und <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> müssen aktiviert sein, um <ph name="PRODUCT_CROSTINI_NAME" /> zu verwenden. Ist die Richtlinie deaktiviert, kann das Gerät keine virtuellen Maschinen ausführen. Wenn sie deaktiviert wird, wird die Richtlinie beim Starten neuer virtueller Maschinen angewandt. Die bereits ausgeführten sind nicht betroffen. @@ -5935,6 +5977,7 @@ <translation id="7458437477941640506">Führe kein Rollback auf die Zielversion durch, wenn die Version des Betriebssystems neuer als die der Zielversion ist. Aktualisierungen sind ebenfalls deaktiviert.</translation> <translation id="7459601923199346224">Diese Richtlinie steuert Nutzer- und Geräterichtlinien zur Zertifikatverwaltung.</translation> <translation id="7459633275230216698">Dialogfelder zur Dateiauswahl zulassen</translation> +<translation id="7464058117970792805">Druckvorschau aktivieren</translation> <translation id="7464991223784276288">Cookies von übereinstimmenden URLs auf die aktuelle Sitzung beschränken</translation> <translation id="7468182772656807573">Die Konfiguration der Richtlinie legt fest, wie oft Kontrollnetzwerkpakete gesendet werden (in Millisekunden). Intervalle reichen von 30 Sekunden bis zu 24 Stunden. Werte außerhalb dieses Bereiches werden automatisch auf den jeweiligen Grenzwert gesetzt. @@ -6030,9 +6073,6 @@ Wenn die Richtlinie nicht konfiguriert ist, ist die Standardeinstellung für vom Unternehmen verwaltete Nutzer „<ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />“ und für nicht verwaltete Nutzer „<ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />“. Künftig kannst du <ph name="LACROS_NAME" /> unter <ph name="PRODUCT_OS_NAME" /> mit dem Wert „<ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />“ als einzigen verfügbaren Browser festlegen.</translation> -<translation id="7509761893401042250">Diese Richtlinie wird ab M96 eingestellt. Bitte verwende stattdessen <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> und <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, werden über registrierte Geräte Hardwarestatistiken wie die CPU/RAM-Nutzung gemeldet. Ist sie deaktiviert, melden registrierte Geräte keine Hardwarestatistiken.</translation> <translation id="7512065400265675158">Der <ph name="USER_AGENT_HEADER_NAME" />-HTTP-Anfrageheader soll reduziert werden. Um Tests und Kompatibilität zu ermöglichen, kann diese Richtlinie die Verringerungsfunktion für alle Websites aktivieren oder die Aktivierung der Funktion durch Ursprungstests oder Field Trials erlauben oder verweigern. Weitere Informationen zur Funktion <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> und deren Zeitachse findest du hier: @@ -6112,6 +6152,7 @@ Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, ist die Einheitenumrechnung über „Schnellinfo“ aktiviert. Wenn die Richtlinie deaktiviert ist, ist die Einheitenumrechnung über „Schnellinfo“ deaktiviert.</translation> <translation id="7587345076013230465">Nutzer auffordern, auf dem Anmeldebildschirm das Clientzertifikat auszuwählen, wenn die Richtlinie für die automatische Auswahl zu mehreren Zertifikaten passt</translation> +<translation id="7587921466180902617">Screencast-Dogfood für Family Link-Nutzer aktivieren</translation> <translation id="759957074386651883">Safe Browsing-Einstellungen</translation> <translation id="7604169113182304895">Diese Liste kann auf freiwilliger Basis für Android-Apps übernommen werden. Es ist nicht möglich, die Verwendung zu erzwingen.</translation> <translation id="7612157962821894603">Systemweite Parameter, die beim Starten von <ph name="PRODUCT_NAME" /> angewendet werden</translation> @@ -6309,6 +6350,7 @@ <translation id="7823902813460802031">Wenn die Richtlinie aktiviert ist, lässt <ph name="PRODUCT_OS_NAME" /> nicht zu, dass das Gerät in den Entwicklermodus wechselt. Ist die Richtlinie deaktiviert oder nicht konfiguriert, bleibt der Entwicklermodus auf dem Gerät verfügbar.</translation> +<translation id="7824000841504721945">Gruppen aus Einzelrichtlinien deaktivieren</translation> <translation id="782661371433719637">Websites dürfen den Nutzer nicht um Lesezugriff auf Dateien und Verzeichnisse über die File System API bitten</translation> <translation id="7827127381981620448">Plattform-App</translation> <translation id="7833148823006528332">Android-App-ID, z. B. „com.google.android.gm“ für Gmail.</translation> @@ -6359,6 +6401,7 @@ Die empfohlene Vorgehensweise ist, die Bildschirmsperre im Ruhemodus zu aktivieren und <ph name="PRODUCT_OS_NAME" /> anzuweisen, nach der Inaktivitätsverzögerung in den Ruhemodus zu wechseln. Diese Richtlinie sollte nur verwendet werden, wenn die Bildschirmsperre erheblich früher als der Ruhemodus eintreten oder der Ruhemodus bei Inaktivität gar nicht erfolgen soll.</translation> <translation id="7895553628261067384">Remotezugriff</translation> +<translation id="7900469325540540107">Beim Erstellen eines Unternehmensprofils Browserdaten standardmäßig beibehalten</translation> <translation id="7902040092815978832">Numerische Tastatur für Passwort anzeigen</translation> <translation id="7904177352786629708">Wenn die Richtlinie aktiviert ist, wird die CNAME-Suche übersprungen. Der Servername wird so wie eingegeben verwendet, wenn der Kerberos-SPN generiert wird. @@ -6393,6 +6436,7 @@ <translation id="793473937901685727">Verfügbarkeit von Zertifikaten für ARC-Apps festlegen</translation> <translation id="7936302526928951356">Im User-Agent-String wird die Hauptversion nicht festgeschrieben.</translation> <translation id="7937766917976512374">Videoaufzeichnung gestatten oder ablehnen</translation> +<translation id="7941528208359969119">Ausführung von Onlineprüfungen von <ph name="OCSP_CRL_LABEL" /> zulassen</translation> <translation id="7941975817681987555">Netzwerkaktionen nicht über Netzwerkverbindungen vervollständigen</translation> <translation id="7946350455013548764">Wenn die Richtlinie auf 3 gesetzt ist, dürfen Websites um Zugriff auf HID-Geräte bitten. Ist sie auf 2 gesetzt, wird der Zugriff auf HID-Geräte verweigert. @@ -6789,6 +6833,7 @@ Wenn "<ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" />" nicht konfiguriert ist, wird die Bildsuchanfrage mithilfe der GET-Methode gesendet.</translation> <translation id="8314214821702356835">Erlaubt es Nutzern, Medien wiederzugeben, während das Gerät gesperrt ist</translation> +<translation id="8316940611391250886">Zertifikate ohne die Erweiterung „subjectAlternativeName“ nicht zulassen</translation> <translation id="8319678975002906774">Mit dieser Richtlinie legst du für bestimmte Ursprünge die Werte für die verwaltete Konfiguration fest</translation> <translation id="8320149248919453401">Akkulademodus</translation> <translation id="8327651196906278510">Tabaufnahme für diese Ursprünge zulassen</translation> @@ -7059,13 +7104,6 @@ Wenn sie auf "true" gesetzt ist, können diese Tabs deaktiviert werden. Durch die Deaktivierung von Tabs werden CPU, Akku und Arbeitsspeicher entlastet. Bei <ph name="PRODUCT_NAME" /> wird eine Heuristik genutzt, um Tabs zu erkennen, die zwar im Hintergrund ausgeführt werden, jedoch aktiviert bleiben sollten, weil auf ihnen beispielsweise Benachrichtigungen angezeigt, Ton wiedergegeben oder Videos gestreamt werden. Webentwickler können die Deaktivierung ihrer Website auch unterbinden (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Wenn die Richtlinie auf "false" gesetzt ist, werden Tabs nicht deaktiviert.</translation> -<translation id="8619480582976056396">Ist die Richtlinie konfiguriert, wird verhindert, dass Webseiten mit unzulässigen URLs geladen werden. Sie enthält eine Liste mit URL-Mustern unzulässiger URLs. Wird die Richtlinie nicht konfiguriert, werden keine URLs im Browser blockiert. Formatiere das URL-Muster wie unter https://www.chromium.org/administrators/url-blocklist-filter-format angegeben. In <ph name="URL_ALLOWLIST_POLICY_NAME" /> können bis zu 1.000 Ausnahmen definiert werden. - - Ab Version 73 von <ph name="PRODUCT_NAME" /> kannst du „javascript://*“-URLs blockieren. Das betrifft jedoch nur JavaScript, das in die Adressleiste eingegeben wird, oder beispielsweise Bookmarklets. Die Richtlinie hat keine Auswirkungen auf In-Page-JavaScript-URLs mit dynamisch geladenen Daten. Wenn du beispielsweise „beispiel.de/abc“ blockierst, kann „beispiel.de“ trotzdem „beispiel.de/abc“ über „XMLHTTPRequest“ laden. - - Ab Version 92 von <ph name="PRODUCT_NAME" /> wird diese Richtlinie auch im monitorlosen Modus unterstützt. - - Hinweis: Wenn interne „chrome://*“-URLs blockiert werden, können unerwartete Fehler auftreten.</translation> <translation id="8619748440665904084">Import von Daten zum automatischen Ausfüllen von Formularen bei der ersten Ausführung deaktivieren</translation> <translation id="8623672932476443039">Wenn die Richtlinie aktiviert ist, können Nutzer den Entwicklermodus für isolierte Apps nutzen. Ist sie deaktiviert, können Nutzer diese Funktion nicht nutzen. @@ -7214,9 +7252,6 @@ <translation id="8807313206348471682">Dialogfeld zur Bestätigung der Abmeldung anzeigen</translation> <translation id="8812091410765157924">Nur geöffneten Pop-ups mit dem Ziel <ph name="BLANK_PAGE_NAME" /> erlauben, mit der Seite zu interagieren, auf der das Pop-up geöffnet wurde, sofern die Seite einer solchen Interaktion ausdrücklich zustimmt</translation> <translation id="8816370949847593408">Chrome-Apps dürfen unter Umständen nicht ausgeführt werden, je nach dem Status des Einstellungs-Roll-outs.</translation> -<translation id="8818173863808665831">Meldet den Standort des Geräts. - - Wenn die Richtlinie nicht oder auf "False" festgelegt wird, wird der Standort nicht gemeldet.</translation> <translation id="8818768076343557335">Netzwerkaktionen in allen Netzwerken außer Mobilfunknetzen vorhersagen. (Eingestellt in 50, entfernt in 52. Wird nach 52 der Wert 1 konfiguriert, wird er als 0 – "Netzwerkaktionen über alle Netzwerkverbindungen vervollständigen" behandelt.)</translation> <translation id="8821678641132607468">Wenn die Richtlinie aktiviert ist, wird der Browserverlauf bei der ersten Ausführung aus dem vorherigen Standardbrowser importiert. Ist die Richtlinie deaktiviert oder nicht konfiguriert, wird der Browserverlauf bei der ersten Ausführung nicht importiert. @@ -7533,6 +7568,7 @@ <translation id="9135033364005346124"><ph name="CLOUD_PRINT_NAME" />-Proxy aktivieren</translation> <translation id="9136212796239682721">Benutzeroberfläche für Download-Infofeld deaktivieren</translation> <translation id="9136399279941091445">Intervalle für Abwesenheitszeiten, wenn die angegebenen Geräterichtlinien veröffentlicht werden</translation> +<translation id="9148720248753722892">SHA-1-signierte Zertifikate nicht zulassen</translation> <translation id="9150416707757015439">Diese Richtlinie ist veraltet. Bitte verwende stattdessen "IncognitoModeAvailability". Aktiviert den Inkognitomodus in <ph name="PRODUCT_NAME" />. Wenn diese Einstellung aktiviert oder nicht konfiguriert ist, können Nutzer Webseiten im Inkognitomodus öffnen. Sollte die Einstellung deaktiviert sein, können Nutzer Webseiten nicht im Inkognitomodus öffnen. Ist die Richtlinie nicht konfiguriert, so ist die Funktion aktiviert, sodass Nutzer den Inkognitomodus verwenden können.</translation> <translation id="9152473318295429890">Kontextbezogene Vorschläge ähnlicher Webseiten aktivieren</translation> <translation id="9153446010242995516">Es wird ein Rollback durchgeführt und die Zielversion beibehalten, falls die Version des Betriebssystems neuer ist als die der Zielversion. Es wird nach Möglichkeit versucht, die Einstellungen auf Geräteebene (einschließlich der Anmeldedaten für das Netzwerk) während des Prozesses zu erhalten. Das Rollback wird jedoch mit einem vollständigen Powerwash durchgeführt, auch wenn das Wiederherstellen von Daten nicht möglich ist, weil rückwärtsinkompatible Änderungen vorliegen oder die Zielversion dies nicht unterstützt.
diff --git a/components/policy/resources/policy_templates_es-419.xtb b/components/policy/resources/policy_templates_es-419.xtb index 94125b02..6747896 100644 --- a/components/policy/resources/policy_templates_es-419.xtb +++ b/components/policy/resources/policy_templates_es-419.xtb
@@ -263,6 +263,7 @@ Si no estableces la política o el valor que genera la sustitución no es un nombre de host válido, no se configurará ningún nombre de host en la solicitud de DHCP.</translation> <translation id="1257550411839719984">Establecer el directorio de descarga predeterminado</translation> <translation id="1265053460044691532">Permite limitar el tiempo durante el cual un usuario autenticado mediante SAML puede acceder sin conexión.</translation> +<translation id="1271811620059192171">Habilitar grupos atómicos de políticas</translation> <translation id="127264587838521316">Habilita las solicitudes de instalación de extensiones de <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Habilitar la migración de los dispositivos Chromad a la administración de la nube</translation> <translation id="1274997165432133392">Cookies y otros datos de sitios</translation> @@ -2884,6 +2885,7 @@ Si inhabilitas esta política o no la estableces, solo se le solicitará al usuario que haga una elección cuando ningún certificado coincida con la selección automática.</translation> <translation id="3950110092991281616">Permite la autenticación ambiental solo en sesiones comunes.</translation> <translation id="3950239119790560549">Actualizar las restricciones de tiempo</translation> +<translation id="3956243291190637924">Ocultar encabezados y pies de página en la vista previa de impresión</translation> <translation id="3956573780915784996">Permite que los usuarios hagan un registro del rendimiento de todo el sistema</translation> <translation id="3956686688560604829">Usar la política SiteList de Internet Explorer para la extensión Compatibilidad con navegadores heredados</translation> <translation id="3958586912393694012">Permitir el uso de Smart Lock</translation> @@ -3132,6 +3134,18 @@ Si inhabilitas la política o no la estableces, los usuarios podrán transferir archivos a Drive por conexión móvil.</translation> <translation id="4248277954659222481">Permite la reproducción automática de contenido multimedia en una lista de patrones de URL permitidos</translation> <translation id="4250680216510889253">No</translation> +<translation id="4259636715493757956">Te permite especificar la configuración para URLs de autenticación en <ph name="WEBVIEW_PRODUCT_NAME" />. + + <ph name="WEBVIEW_PRODUCT_NAME" /> tratará de manera especial estas URLs de autenticación, de manera que, durante la autenticación, cuando se navegue por la página web de <ph name="WEBVIEW_PRODUCT_NAME" /> + a las URLs de autenticación, se iniciará la app de autenticador de los proveedores de identidad correspondiente que pueda administrar la URL. + + Los proveedores de identidad utilizarán el flujo de ejecutar la app de autenticador de estos proveedores para habilitar + casos de uso en los que se brinda SSO en distintas apps o una mejor seguridad recopilando señales de dispositivos de confianza cero para entender la posición del dispositivo durante la autenticación. + + Si no hay ninguna app válida instalada que pueda administrar la URL de autenticación en el dispositivo, la navegación continuará en <ph name="WEBVIEW_PRODUCT_NAME" />. + + El patrón de la URL de autenticación debe tener el formato establecido en https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Si estableces la política, cada uno de los orígenes designados en una lista de elementos separados por comas se ejecutará en un proceso dedicado. El proceso de cada origen designado solo podrá incluir documentos de ese origen y sus subdominios. Por ejemplo, si especificas https://a1.example.com/, se permitirá https://a2.a1.example.com/ en el mismo proceso, pero no así https://example.com o https://b.example.com. A partir de <ph name="PRODUCT_NAME" /> 77, también puedes especificar un rango de orígenes para aislarlos mediante un comodín. Por ejemplo, si especificas https://[*.]corp.example.com, se otorgará su propio proceso dedicado a cada origen dentro de https://corp.example.com, incluidos https://corp.example.com, https://a1.corp.example.com y https://a2.a1.corp.example.com. @@ -3272,6 +3286,7 @@ <translation id="4432762137771104529">Habilitar el informe extendido de Navegación segura</translation> <translation id="443454694385851356">Heredados (inseguro)</translation> <translation id="443665821428652897">Borrar los datos del sitio al cerrar el navegador (en desuso)</translation> +<translation id="4436941175475497595">Inhabilitar vista previa de impresión</translation> <translation id="4439336120285389675">Especificar una lista de funciones de Web Platform que ya no están disponibles para volver a habilitarlas temporalmente Esta política brinda a los administradores la posibilidad de volver a habilitar por un tiempo limitado funciones de Web Platform que dejaron de estar disponibles. Las funciones se identifican con una etiqueta de cadena y las que se correspondan con las etiquetas incluidas en la lista especificada por esta política se volverán a habilitar. @@ -3555,13 +3570,6 @@ <translation id="482803100714220060">Muestra las URL completas</translation> <translation id="4832852360828533362">Informes de usuarios y dispositivos</translation> <translation id="4834526953114077364">Elimina los usuarios que más tiempo hace que no se utilizan y que no accedieron en los últimos tres meses hasta que se libere suficiente espacio.</translation> -<translation id="483544442646753291">Controla la experiencia del usuario de las funciones inhabilitadas que se mencionan en <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Si estableces esta política como bloqueada, las funciones inhabilitadas estarán inutilizables, pero los usuarios aún podrán verlas. - - Si la estableces como oculta, las funciones inhabilitadas estarán inutilizables y los usuarios no podrán verlas. - - Si no la estableces o tiene un valor no válido, el modo de inhabilitación de las funciones del sistema estará bloqueado.</translation> <translation id="4835470005923546373">Inhabilitar el modo de impresión de los gráficos de fondo de forma predeterminada</translation> <translation id="4835622243021053389">Habilitar la autenticación NTLMv2</translation> <translation id="4840015507504937941">Esta política establece el tamaño mínimo (en bytes) de los datos del portapapeles, los cuales se revisarán según las reglas de restricción del portapapeles definidas en la política DataLeakPreventionRulesList. @@ -4319,6 +4327,7 @@ Nota: Los nombres de los servidores se separan con comas. Se permite el uso de caracteres comodín (<ph name="WILDCARD_VALUE" />).</translation> <translation id="5645779841392247734">Permitir cookies en estos sitios</translation> <translation id="5646234199535103501">Política de configuración para Chrome Enterprise Connector OnBulkDataEntry</translation> +<translation id="5648016151508002741">Impedir que se realicen verificaciones en línea de <ph name="OCSP_CRL_LABEL" /></translation> <translation id="5649046890958064703">Si eliges <ph name="PRINTERS_BLACKLIST" /> para <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, la configuración de <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> especificará las impresoras que no podrán utilizar los usuarios. Los usuarios podrán acceder a todas las impresoras, excepto aquellas con los ID mencionados en esta política. Los ID deben coincidir con los valores de los campos <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> en el archivo que se especifica en <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Esta política dejó de estar disponible; usa <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> en su lugar.</translation> @@ -4453,9 +4462,6 @@ Si estableces el valor "False" para la política o no la estableces, no se enviará la información. Si estableces el valor "True", se enviará información sobre los VPD del dispositivo. Los datos vitales del producto (VPD) son un conjunto de datos informativos y de configuración (como números de serie y piezas) asociados al dispositivo.</translation> -<translation id="576158229686912964">Esta política quedó obsoleta a partir de M96. En su lugar, usa <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> y <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Si habilitas la política o no la estableces, los dispositivos inscritos informarán la lista de interfaces de redes con sus tipos y direcciones de hardware. Si inhabilitas la política, los dispositivos inscritos no informarán sobre las interfaces de redes.</translation> <translation id="5762969307102447459">Inhabilitar Autocompletar para las direcciones</translation> <translation id="5765780083710877561">Descripción:</translation> <translation id="5766438888216077649">No configurar <ph name="WINDOW_OPENER_PROPERTY" /> para los vínculos destinados a <ph name="BLANK_PAGE_NAME" /></translation> @@ -4585,6 +4591,7 @@ <translation id="5893303508158298667">Si habilitas la política <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> y habilitas la política <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> o no la estableces, los clientes remotos podrán usar servidores de retransmisión para conectarse con este equipo cuando no haya conexiones directas disponibles, por ejemplo, debido a la presencia de firewalls. Si inhabilitas la política, no se desactivará el acceso remoto, pero solo se permitirán conexiones de la misma red (no se permitirán retransmisiones ni técnicas NAT traversal).</translation> +<translation id="5897234314586602143">Mostrar encabezados y pies de página en la vista previa de impresión</translation> <translation id="5897913798715600338">Usar la tecnología de carga rápida para la batería</translation> <translation id="5898486742390981550">Cuando varios usuarios accedieron a sus cuentas, solo el usuario principal puede usar las apps de Android.</translation> <translation id="5899751601113377553">Impedir que los usuarios utilicen <ph name="LACROS_NAME" /></translation> @@ -5105,6 +5112,13 @@ <translation id="6478258366184919502">Orígenes de la pantalla de acceso</translation> <translation id="6478261301433199402">Si estableces la política, se especificará la imagen de <ph name="PLUGIN_VM_NAME" /> para un usuario. Especifica esta política como una cadena de formato JSON que incluye <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> (establece dónde se descarga la imagen) y <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> (como un hash SHA-256 para verificar la integridad de la descarga).</translation> <translation id="6481245670325946423">Permitir el uso del modo sin interfaz gráfica</translation> +<translation id="648158446793103284">Si estableces la política, los usuarios podrán elegir uno de los métodos de entrada para las sesiones de <ph name="PRODUCT_OS_NAME" /> que especifiques. + + Si no la estableces o la estableces como una lista vacía, los usuarios podrán seleccionar todos los métodos de entrada compatibles. + + A partir de la versión M106, los métodos de entrada permitidos se habilitan automáticamente en la sesión de kiosco. + + Nota: Si el método de entrada actual no es compatible, este cambiará al diseño de teclado del hardware (si se permite) o a la primera entrada válida de la lista. Se ignorarán los métodos no válidos o no compatibles.</translation> <translation id="6489084406497912050">Determina si los usuarios pueden agregar cuentas de Kerberos. Si inhabilitas esta política o no la estableces, los usuarios podrán agregar cuentas de Kerberos mediante la configuración de las cuentas de Kerberos en la página de configuración de Kerberos. Los usuarios tendrán control total de las cuentas que agregan y podrán modificarlas o quitarlas. @@ -5333,6 +5347,7 @@ Si la estableces como falsa, se aplicará la visualización predeterminada de las URL. Si no la estableces, se aplicará la visualización predeterminada de las URL, y el usuario podrá elegir esta visualización o la completa con una opción del menú contextual. </translation> +<translation id="6670794785040100077">Inhabilitar el envío de documentos a <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Permite que los usuarios personalicen el fondo en la página Nueva pestaña</translation> <translation id="6672630473862787247">Permite la autenticación ambiental en sesiones comunes, de incógnito y de invitado.</translation> <translation id="6685903773201985073">Permite la autenticación ambiental en sesiones comunes y de invitado.</translation> @@ -5420,6 +5435,7 @@ Si no estableces <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" />, se enviarán solicitudes de búsqueda con el método GET.</translation> <translation id="6757613329154374267">Se habilitó la funcionalidad de copia de seguridad y restablecimiento</translation> <translation id="6758659208493449452">Esta política controla si los usuarios inscritos en el Programa de Protección Avanzada reciben protección adicional. Es posible que algunas de estas funciones compartan datos con Google (por ejemplo, los usuarios de la Protección avanzada podrán enviar sus descargas a Google para comprobar que no incluyan software malicioso). Si se establece como verdadera o no se establece, los usuarios inscritos recibirán protección adicional. Si se establece como falsa, los usuarios de la Protección avanzada solo recibirán las funciones estándar para el consumidor.</translation> +<translation id="6763023079133439068">Permitir los certificados que carezcan de una extensión subjectAlternativeName cuando son emitidos por anclas de confianza locales</translation> <translation id="6766216162565713893">Permitir que los sitios soliciten permiso al usuario para acceder a un dispositivo Bluetooth cercano</translation> <translation id="6770454900105963262">Informar datos sobre las sesiones de kiosco activas</translation> <translation id="6782977971207381602">Si habilitas la política, el dispositivo podrá ejecutar máquinas virtuales en <ph name="PRODUCT_OS_NAME" />. Las políticas <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> y <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> deben estar habilitadas para poder usar <ph name="PRODUCT_CROSTINI_NAME" />. Si inhabilitas la política, el dispositivo no podrá ejecutar máquinas virtuales. En ese caso, se comenzará a aplicar la política en las máquinas virtuales que se inicien a partir de ese momento, pero no en aquellas que ya estén en ejecución. @@ -6039,6 +6055,7 @@ <translation id="7458437477941640506">No implementes una reversión a la versión objetivo si la versión del sistema operativo es más reciente que la objetivo. Las actualizaciones también se inhabilitan.</translation> <translation id="7459601923199346224">Controla las políticas de dispositivo y usuario para la administración de certificados.</translation> <translation id="7459633275230216698">Permite los diálogos de selección de archivos</translation> +<translation id="7464058117970792805">Habilitar vista previa de impresión</translation> <translation id="7464991223784276288">Restringir las cookies solo para las URL coincidentes en la sesión actual</translation> <translation id="7468182772656807573">Si estableces la política, se determinará la frecuencia con la que se envían paquetes de red de control (expresado en milisegundos). Los intervalos varían de 30 segundos a 24 horas. Los valores fuera de este rango se restringirán conforme a estos valores. @@ -6134,9 +6151,6 @@ Si no estableces la política, la configuración predeterminada es <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> para los usuarios administrados por empresas y <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> para los usuarios no administrados. En el futuro, se podrá seleccionar <ph name="LACROS_NAME" /> como el único navegador disponible en <ph name="PRODUCT_OS_NAME" /> usando el valor <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Esta política quedó obsoleta a partir de M96. En su lugar, usa <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> y <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Si habilitas la política o no la estableces, los dispositivos inscritos informarán sobre las estadísticas de hardware, como el uso de CPU/RAM. Si la inhabilitas, los dispositivos inscritos no informarán sobre las estadísticas de hardware.</translation> <translation id="7512065400265675158">Se programó la reducción del encabezado de la solicitud HTTP de <ph name="USER_AGENT_HEADER_NAME" />. A fin de facilitar las pruebas y la compatibilidad, esta política puede habilitar la función de reducción en todos los sitios web o bien, inhabilitar que las pruebas de campo o de origen habiliten la función. Para obtener más información sobre la función <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> y su cronograma, consulta: @@ -6416,6 +6430,7 @@ <translation id="7823902813460802031">Si habilitas la política, <ph name="PRODUCT_OS_NAME" /> sacará el dispositivo del Modo de desarrollador. Si la inhabilitas o no la estableces, seguirá disponible el Modo de desarrollador para el dispositivo.</translation> +<translation id="7824000841504721945">Inhabilitar grupos atómicos de políticas</translation> <translation id="782661371433719637">No permite que ningún sitio solicite acceso de lectura a archivos y directorios a través de la API de File System</translation> <translation id="7827127381981620448">App de plataforma</translation> <translation id="7833148823006528332">Identificador de la app para Android, p. ej., "com.google.android.gm" para Gmail.</translation> @@ -6501,6 +6516,7 @@ <translation id="793473937901685727">Establecer la disponibilidad de certificados para apps de ARC</translation> <translation id="7936302526928951356">El string usuario-agente no bloqueará los cambios para la versión principal</translation> <translation id="7937766917976512374">Permitir o rechazar la captura de video</translation> +<translation id="7941528208359969119">Permitir que se realicen verificaciones en línea de <ph name="OCSP_CRL_LABEL" /></translation> <translation id="7941975817681987555">No predecir acciones de la red en ninguna conexión de red</translation> <translation id="7946350455013548764">Si estableces la política en 3, los sitios web podrán solicitar acceso a los dispositivos HID. Si estableces la política en 2, los sitios no podrán acceder a los dispositivos HID. @@ -6893,6 +6909,7 @@ Si no estableces <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" />, se enviarán las solicitudes de búsqueda de imágenes con el método GET.</translation> <translation id="8314214821702356835">Permite que los usuarios reproduzcan contenido multimedia cuando está bloqueado el dispositivo</translation> +<translation id="8316940611391250886">No permitir certificados que carezcan de una extensión subjectAlternativeName</translation> <translation id="8319678975002906774">Establece los valores de la configuración administrada como los sitios web de orígenes específicos</translation> <translation id="8320149248919453401">Modo de carga de la batería</translation> <translation id="8327651196906278510">Permitir que estos orígenes capturen pestañas</translation> @@ -7175,13 +7192,6 @@ Si se establece la política como verdadera, es posible que las pestañas que hayan estado en segundo plano por al menos 5 minutos queden inmovilizadas. Cuando se inmovilizan las pestañas, se reduce el uso de la CPU, la batería y la memoria. <ph name="PRODUCT_NAME" /> utiliza heurísticas para evitar que se inmovilicen las pestañas que realizan tareas útiles en segundo plano (p. ej., muestran notificaciones de pantalla, reproducen sonidos o transmiten video). Los desarrolladores web también pueden inhabilitar la inmovilización en sus sitios (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Si se establece la política como falsa, no se inmovilizará ninguna pestaña.</translation> -<translation id="8619480582976056396">Si estableces la política, no podrán cargarse las páginas web que tengan URL prohibidas. Proporciona una lista de patrones de URL donde se especifican URL prohibidas. Si no estableces la política, no se prohibirá ninguna URL en el navegador. El patrón de una URL debe presentar un formato conforme a lo especificado en ( https://www.chromium.org/administrators/url-blocklist-filter-format ). Se pueden definir 1,000 excepciones como máximo en la política <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - A partir de la versión 73 de <ph name="PRODUCT_NAME" />, podrás bloquear las URL javascript://*. Sin embargo, la política solo afectará el lenguaje JavaScript ingresado en la barra de direcciones (o, por ejemplo, bookmarklets). Quedan excluidas de esta política las URL de JavaScript en páginas con datos cargados dinámicamente. Por ejemplo, si bloqueas example.com/abc, la página example.com podrá seguir cargando example.com/abc mediante XMLHTTPRequest. - - A partir de la versión 92 de <ph name="PRODUCT_NAME" />, esta política también es compatible en el modo sin interfaz gráfica. - - Nota: Si bloqueas las URL internas de chrome://*, se pueden generar errores inesperados.</translation> <translation id="8619748440665904084">Inhabilitar la importación de datos para autocompletar formularios en la primera ejecución</translation> <translation id="8623672932476443039">Si habilitas la política, los usuarios podrán acceder al modo de desarrollador de apps aisladas. Si inhabilitas la política, los usuarios no podrán acceder a esa función. @@ -7330,9 +7340,6 @@ <translation id="8807313206348471682">Mostrar el diálogo de confirmación de salida</translation> <translation id="8812091410765157924">Solo permitir que se abran ventanas emergentes destinadas a <ph name="BLANK_PAGE_NAME" /> para interactuar con la página que abrió la ventana emergente si esta página habilita esta interacción de forma explícita</translation> <translation id="8816370949847593408">En función del estado del lanzamiento de la desactivación, es posible que no se puedan ejecutar las Apps de Chrome.</translation> -<translation id="8818173863808665831">Informa la ubicación geográfica del dispositivo. - - Si no se configura la política, ni se establece como falsa, no se informará la ubicación.</translation> <translation id="8818768076343557335">Predecir las acciones de red en cualquier red que no sea móvil (Dejó de estar disponible en la versión 50 y se quitó en la versión 52. Después de esta versión, si se establece el valor 1, se trata como 0; es decir, se predicen las acciones de red en cualquier conexión de red).</translation> <translation id="8821678641132607468">Si habilitas la política, se importará el historial de navegación del navegador predeterminado anterior en la primera ejecución. Si la inhabilitas o no la estableces, no se importará ningún historial de navegación en la primera ejecución. @@ -7649,6 +7656,7 @@ <translation id="9135033364005346124">Habilitar el proxy de <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Inhabilitar la IU del cuadro de descarga</translation> <translation id="9136399279941091445">Intervalos de horas inactivas cuando se ejecutan las políticas de dispositivo especificadas</translation> +<translation id="9148720248753722892">No permitir los certificados firmados por SHA-1</translation> <translation id="9150416707757015439">Esta política no está aprobada. Usa IncognitoModeAvailability en su lugar. Esto habilita el modo incógnito en <ph name="PRODUCT_NAME" />. Si se habilita esta opción o si no se configura, los usuarios podrán abrir páginas web en modo incógnito. Si se inhabilita esta configuración, los usuarios no podrán abrir páginas web en modo incógnito. Si esta política no se configura, se habilitará esta opción y el usuario podrá usar el modo incógnito.</translation> <translation id="9152473318295429890">Habilitar las sugerencias contextuales de páginas web relacionadas</translation> <translation id="9153446010242995516">Implementa la reversión y mantiene la versión objetivo si la versión del sistema operativo es más reciente que la objetivo. Intenta llevar a cabo la configuración a nivel de dispositivos (incluidas las credenciales de red) mediante el proceso de reversión, si es posible, pero realiza la reversión completa con la función Powerwash, incluso si no es posible restablecer los datos (porque la versión objetivo no admite el restablecimiento de los datos o porque un cambio no es compatible con las versiones anteriores).
diff --git a/components/policy/resources/policy_templates_es.xtb b/components/policy/resources/policy_templates_es.xtb index 3b0fd07..6f1d085 100644 --- a/components/policy/resources/policy_templates_es.xtb +++ b/components/policy/resources/policy_templates_es.xtb
@@ -263,6 +263,7 @@ Si no se asigna ningún valor a esta política, o si el valor que se obtiene de la sustitución no es un nombre de host válido, no se establece ningún nombre de host en la solicitud DHCP.</translation> <translation id="1257550411839719984">Establecer directorio de descargas predeterminado</translation> <translation id="1265053460044691532">Limitar el tiempo durante el que un usuario autenticado a través de SAML puede iniciar sesión sin conexión</translation> +<translation id="1271811620059192171">Habilitar grupos atómicos de políticas</translation> <translation id="127264587838521316">Habilita las solicitudes de instalación de extensiones de <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Habilitar la migración de dispositivos Chromad a la gestión en la nube</translation> <translation id="1274997165432133392">Cookies y otros datos de sitios</translation> @@ -2894,6 +2895,7 @@ Si se inhabilita esta política o no se establece, solo se le podrá pedir al usuario que realice una acción cuando no haya ningún certificado que coincida con la selección automática.</translation> <translation id="3950110092991281616">Habilita la autenticación pasiva solo en sesiones normales.</translation> <translation id="3950239119790560549">Actualizar restricciones de tiempo</translation> +<translation id="3956243291190637924">Ocultar encabezados y pies de página en la vista previa de impresión</translation> <translation id="3956573780915784996">Permite a los usuarios recoger trazas de rendimiento del sistema.</translation> <translation id="3956686688560604829">Usar la política SiteList de Internet Explorer para gestionar la compatibilidad con navegadores antiguos.</translation> <translation id="3958586912393694012">Permitir el uso de Smart Lock</translation> @@ -3142,6 +3144,18 @@ Si se le asigna el valor "Inhabilitada" o no se le asigna ningún valor, los usuarios podrán transferir archivos a Drive con conexiones de datos móviles.</translation> <translation id="4248277954659222481">Permitir la reproducción automática de contenido multimedia en una lista de patrones de URL permitidos</translation> <translation id="4250680216510889253">No</translation> +<translation id="4259636715493757956">Te permite especificar la configuración de las URLs de autenticación en <ph name="WEBVIEW_PRODUCT_NAME" />. + + Estas URLs de autenticación se tratarán de forma especial en <ph name="WEBVIEW_PRODUCT_NAME" />, de tal manera que, durante la autenticación, cuando se navegue por la página web de <ph name="WEBVIEW_PRODUCT_NAME" /> + a las URLs de autenticación, se iniciará la aplicación de autenticación correspondiente de los proveedores de identidad que puedan gestionar esta URL de autenticación. + + Este flujo de iniciar la aplicación de autenticación de los proveedores de identidad se usará por parte de los proveedores de identidad para habilitar + casos prácticos, como proporcionar SSO en las aplicaciones o una mejor seguridad recogiendo señales de dispositivos de confianza cero para conocer la postura del dispositivo durante la autenticación. + + Si no hay ninguna aplicación válida instalada para gestionar la URL de autenticación en el dispositivo, la navegación continuará en <ph name="WEBVIEW_PRODUCT_NAME" />. + + El patrón de la URL de autenticación debe tener el formato que se indica en https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Si se define esta política, cada uno de los orígenes especificados en una lista separada por comas se ejecutará en un proceso dedicado. El proceso de cada origen especificado solo podrá contener documentos de ese origen y de sus subdominios. Por ejemplo, si se especifica https://a1.example.com/, se permite https://a2.a1.example.com/ en el mismo proceso, pero no https://example.com o https://b.example.com. Desde <ph name="PRODUCT_NAME" /> 77, también puedes especificar un rango de orígenes para aislar usando un comodín. Por ejemplo, al especificar https://[*.]corp.example.com, se otorgará a cada origen inferior a https://corp.example.com su propio proceso dedicado, incluidos https://corp.example.com, https://a1.corp.example.com y https://a2.a1.corp.example.com. @@ -3282,6 +3296,7 @@ <translation id="4432762137771104529">Habilita los informes ampliados de Navegación segura</translation> <translation id="443454694385851356">Antiguos (no seguro)</translation> <translation id="443665821428652897">Borrar datos del sitio al cerrar el navegador (obsoleta)</translation> +<translation id="4436941175475497595">Inhabilitar vista previa de impresión</translation> <translation id="4439336120285389675">Especifica una lista de funciones obsoletas de la plataforma web para volver a habilitarlas temporalmente. Esta política ofrece a los administradores la posibilidad de volver a habilitar funciones obsoletas de la plataforma web durante un periodo de tiempo limitado. Estas se identifican mediante una etiqueta de cadena. Las funciones correspondientes a las etiquetas incluidas en la lista especificada por esta política se volverán a habilitar. @@ -3565,13 +3580,6 @@ <translation id="482803100714220060">Mostrar URL completas</translation> <translation id="4832852360828533362">Informes de usuarios y dispositivos</translation> <translation id="4834526953114077364">Eliminar usuarios utilizados hace más tiempo que no hayan iniciado sesión en los tres últimos meses hasta que haya suficiente espacio libre</translation> -<translation id="483544442646753291">Controla la experiencia de usuario de las funciones inhabilitadas que aparecen en <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Si a esta política se le asigna el valor "blocked", las funciones inhabilitadas no podrán ser utilizadas, pero sí vistas, por los usuarios. - - Si se le asigna el valor "hidden", las funciones inhabilitadas no podrán ser utilizadas ni vistas por los usuarios. - - Si no se le asigna ningún valor o se le asigna un valor no válido, el modo de inhabilitación de funciones del sistema tendrá el valor "blocked".</translation> <translation id="4835470005923546373">Inhabilitar el modo de impresión de gráficos de fondo de forma predeterminada</translation> <translation id="4835622243021053389">Habilita la autenticación NTLMv2.</translation> <translation id="4840015507504937941">Esta política establece el tamaño mínimo (en bytes) para los datos del portapapeles que se analizarán siguiendo las reglas de restricción del portapapeles definidas en la política DataLeakPreventionRulesList. @@ -4327,6 +4335,7 @@ Nota: Si hay varios nombres de servidores, se deben separar con comas. Se permite el uso de caracteres comodín (<ph name="WILDCARD_VALUE" />).</translation> <translation id="5645779841392247734">Permitir cookies en estos sitios</translation> <translation id="5646234199535103501">Política de configuración del conector OnBulkDataEntry de Chrome Enterprise Connectors</translation> +<translation id="5648016151508002741">Impedir que se hagan comprobaciones de <ph name="OCSP_CRL_LABEL" /> online</translation> <translation id="5649046890958064703">Si se utiliza <ph name="PRINTERS_BLACKLIST" /> para la política <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, al establecer la política <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_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" />. Esta política está obsoleta. Usa <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> en su lugar.</translation> @@ -4461,9 +4470,6 @@ Si se asigna el valor "false" a esta política o no se le asigna ninguno, no se enviará esta información del dispositivo. Si se le asigna el valor "true", se enviará información sobre VPD del dispositivo. Los datos vitales del producto (VPD, Vital Product Data) son un conjunto de datos de configuración e informativos (como los números de serie) asociados al dispositivo.</translation> -<translation id="576158229686912964">Esta política está obsoleta en M96. Usa <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> y <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Si se habilita la política o no se establece, los dispositivos registrados informarán sobre la lista de interfaces de red junto a sus tipos y direcciones de hardware. Si se inhabilita la política, los dispositivos registrados no informarán sobre la interfaz de red.</translation> <translation id="5762969307102447459">Inhabilitar la función Autocompletar para direcciones</translation> <translation id="5765780083710877561">Descripción:</translation> <translation id="5766438888216077649">No utilices <ph name="WINDOW_OPENER_PROPERTY" /> en enlaces destinados a <ph name="BLANK_PAGE_NAME" /></translation> @@ -4593,6 +4599,7 @@ <translation id="5893303508158298667">Si se habilita <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" />, siempre y cuando se habilite <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> o no se le asigne ningún valor, los clientes remotos podrán utilizar servidores de retransmisión para conectarse a este equipo cuando no haya disponible una conexión directa (por ejemplo, debido a restricciones del cortafuegos). Si se le asigna el valor Disabled a esta política, el acceso remoto no se desactivará, pero solo se permitirán las conexiones procedentes de la misma red (sin NAT transversal ni retransmisión).</translation> +<translation id="5897234314586602143">Mostrar encabezados y pies de página en la vista previa de impresión</translation> <translation id="5897913798715600338">Carga la batería usando la tecnología de carga rápida.</translation> <translation id="5898486742390981550">Si varios usuarios han iniciado sesión, solo podrá utilizar las aplicaciones para Android el usuario principal.</translation> <translation id="5899751601113377553">Evitar que los usuarios utilicen <ph name="LACROS_NAME" /></translation> @@ -5113,6 +5120,13 @@ <translation id="6478258366184919502">Orígenes de pantalla de inicio de sesión</translation> <translation id="6478261301433199402">Si se asigna un valor a esta política, especificará la imagen de <ph name="PLUGIN_VM_NAME" /> de un usuario. Esta política se debe especificar como una cadena con formato JSON, en la que <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> indicará dónde se debe descargar la imagen y <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> será un hash SHA‑256 que se usará para verificar la integridad de la descarga.</translation> <translation id="6481245670325946423">Permite el uso del modo sin interfaz gráfica</translation> +<translation id="648158446793103284">Si se establece esta política, los usuarios podrán elegir uno de los métodos de introducción de texto para las sesiones de <ph name="PRODUCT_OS_NAME" /> que especifiques. + + Si no se le asigna ningún valor o se le asigna una lista vacía, los usuarios podrán seleccionar todos los métodos de introducción admitidos. + + A partir de la versión M106, los métodos de introducción de texto permitidos se habilitan automáticamente en la sesión de kiosco. + + Nota: Si no se admite el método de introducción actual, se cambiará al diseño de teclado del hardware (si se permite) o a la primera entrada válida de esta lista. Se ignorarán los métodos no válidos o no admitidos.</translation> <translation id="6489084406497912050">Controla si los usuarios pueden añadir cuentas de Kerberos. Si se habilita esta política o no se le asigna ningún valor, los usuarios podrán añadir cuentas de Kerberos a través de la página de configuración de cuentas de Kerberos. Los usuarios tendrán control total sobre las cuentas que han añadido y podrán modificarlas o eliminarlas. @@ -5341,6 +5355,7 @@ Si se le asigna el valor "False", se mostrará la URL predeterminada. Si no se le asigna ningún valor, se mostrará la URL de forma predeterminada y el usuario podrá alternar entre esta opción y la de mostrar la URL completa usando un menú contextual. </translation> +<translation id="6670794785040100077">Inhabilitar el envío de documentos a <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Permite a los usuarios personalizar la imagen de fondo de la página Nueva pestaña</translation> <translation id="6672630473862787247">Habilita la autenticación pasiva en sesiones normales, de incógnito y de invitado.</translation> <translation id="6685903773201985073">Habilita la autenticación pasiva en sesiones normales y de invitado.</translation> @@ -5428,6 +5443,7 @@ Si no se asigna ningún valor a <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" />, las solicitudes de búsqueda se enviarán mediante el método GET.</translation> <translation id="6757613329154374267">Copia de seguridad y restauración habilitada</translation> <translation id="6758659208493449452">Esta política controla si los usuarios registrados en el Programa de Protección Avanzada tienen acceso a funciones de protección adicionales. Puede que algunas de estas funciones impliquen compartir datos con Google (por ejemplo, los usuarios de Protección Avanzada podrán enviar sus descargas a Google para que realice un análisis de software malicioso). Si se asigna el valor "True" a esta política o no se le asigna ningún valor, los usuarios registrados tendrán acceso a funciones de protección adicionales. Si se le asigna el valor "False", los usuarios de Protección Avanzada solo tendrán acceso a las funciones estándar.</translation> +<translation id="6763023079133439068">Permitir certificados que no tengan una extensión subjectAlternativeName cuando los emitan anclas de confianza locales</translation> <translation id="6766216162565713893">Permitir que los sitios le pidan permiso al usuario para acceder a dispositivos Bluetooth cercanos</translation> <translation id="6770454900105963262">Informar sobre sesiones del kiosco activas</translation> <translation id="6782977971207381602">Si se habilita esta política, el dispositivo podrá ejecutar máquinas virtuales en <ph name="PRODUCT_OS_NAME" />. Para poder usar <ph name="PRODUCT_CROSTINI_NAME" />, las políticas <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> y <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> deben estar habilitadas. Si se inhabilita la política, el dispositivo no podrá ejecutar máquinas virtuales. En caso de inhabilitar la política, esto se aplicará a las nuevas máquinas virtuales que se empiecen a usar, pero no a las que ya estén ejecutándose. @@ -6052,6 +6068,7 @@ <translation id="7458437477941640506">No vuelve a instalar la versión de destino si la versión del SO es más reciente que la de destino. También inhabilita las actualizaciones.</translation> <translation id="7459601923199346224">Controla las políticas de usuarios y dispositivos para gestionar certificados.</translation> <translation id="7459633275230216698">Permitir cuadros de diálogo de selección de archivos</translation> +<translation id="7464058117970792805">Habilitar vista previa de impresión</translation> <translation id="7464991223784276288">Limitar las cookies de las URL coincidentes de la sesión actual</translation> <translation id="7468182772656807573">Si se define esta política, determinará la frecuencia con la que se envían paquetes de red de monitorización (en milisegundos). Los intervalos se sitúan entre 30 segundos y 24 horas. Cualquier valor fuera de este intervalo se redondeará al límite correspondiente. @@ -6147,9 +6164,6 @@ Si esta política no se establece, la opción predeterminada será <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> en el caso de los usuarios gestionados por empresas y, en el caso de los usuarios no gestionados, la opción predeterminada será <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />. En el futuro, con el valor <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> se podrá establecer que <ph name="LACROS_NAME" /> sea el único navegador disponible en <ph name="PRODUCT_OS_NAME" />.</translation> -<translation id="7509761893401042250">Esta política está obsoleta a partir de la versión M96. Usa <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> y <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Si se habilita la política o no se establece, los dispositivos registrados informarán sobre las estadísticas de hardware, como el uso de la CPU/RAM. Si se inhabilita la política, los dispositivos registrados no informarán sobre las estadísticas de hardware.</translation> <translation id="7512065400265675158">Se ha programado que el encabezado de solicitud HTTP <ph name="USER_AGENT_HEADER_NAME" /> se reduzca. Para facilitar las pruebas y la compatibilidad, esta política puede habilitar la función de reducción para todos los sitios web o impedir que las pruebas de origen o de campo puedan habilitarla. Para obtener más información sobre <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> y su cronología, consulta este enlace: @@ -6430,6 +6444,7 @@ <translation id="7823902813460802031">Si se habilita esta política, <ph name="PRODUCT_OS_NAME" /> impide que el dispositivo entre en el modo desarrollador. Si se inhabilita o no se define, el modo desarrollador estará disponible para el dispositivo.</translation> +<translation id="7824000841504721945">Inhabilitar grupos atómicos de políticas</translation> <translation id="782661371433719637">No permitir que ningún sitio web solicite acceso de lectura a archivos y directorios a través de la API File System</translation> <translation id="7827127381981620448">Aplicación de una plataforma</translation> <translation id="7833148823006528332">Identificador de la aplicación Android (por ejemplo, "com.google.android.gm" para Gmail)</translation> @@ -6515,6 +6530,7 @@ <translation id="793473937901685727">Establecer la disponibilidad del certificado para las aplicaciones ARC</translation> <translation id="7936302526928951356">La cadena user-agent no bloqueará la versión principal.</translation> <translation id="7937766917976512374">Permitir o denegar captura de vídeo</translation> +<translation id="7941528208359969119">Permitir que se hagan comprobaciones de <ph name="OCSP_CRL_LABEL" /> online</translation> <translation id="7941975817681987555">No predecir las acciones de red en ninguna conexión de red</translation> <translation id="7946350455013548764">Si se asigna el valor 3 a esta política, los sitios web podrán solicitar acceso a los dispositivos HID. Si se le asigna el valor 2, se denegará el acceso a los dispositivos HID. @@ -6903,6 +6919,7 @@ Si no se asigna ningún valor a <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" />, la solicitud de búsqueda de imágenes se enviará mediante el método GET.</translation> <translation id="8314214821702356835">Permite a los usuarios reproducir contenido multimedia cuando el dispositivo está bloqueado</translation> +<translation id="8316940611391250886">No permitir certificados que no tengan una extensión subjectAlternativeName</translation> <translation id="8319678975002906774">Establece valores de la configuración administrada aplicados a sitios web para orígenes determinados</translation> <translation id="8320149248919453401">Modo de carga de la batería</translation> <translation id="8327651196906278510">Permitir la captura de pestañas de estos orígenes</translation> @@ -7177,13 +7194,6 @@ Si se asigna el valor "true" a esta política, las pestañas que hayan estado en segundo plano durante un mínimo de 5 minutos podrían inmovilizarse. Inmovilizar las pestañas reduce el consumo de CPU, batería y memoria. <ph name="PRODUCT_NAME" /> usa métodos heurísticos para evitar inmovilizar pestañas que realicen funciones útiles en segundo plano, como mostrar notificaciones, reproducir sonidos o emitir vídeos en streaming. Los desarrolladores web pueden inhabilitar la inmovilización en sus sitios web (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Si se asigna el valor "false" a esta política, no se inmovilizará ninguna pestaña.</translation> -<translation id="8619480582976056396">Si se define esta política, se impide que páginas web con URLs prohibidas puedan cargarse. Contiene una lista de patrones de URL que especifican las URLs prohibidas. Si la política no se define, no se prohibirá ninguna URL en el navegador. Los patrones de URL deben tener el formato que se indica en la página https://www.chromium.org/administrators/url-blocklist-filter-format. Se pueden definir un máximo de 1000 excepciones en <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - Puedes bloquear las URLs javascript://* a partir de la versión 73 de <ph name="PRODUCT_NAME" />. Sin embargo, esto solo afecta al código JavaScript que se introduce en la barra de direcciones (por ejemplo, con los bookmarklets). Las URLs JavaScript in-page que cargan datos dinámicamente no están sujetas a esta política. Por ejemplo, si bloqueas example.com/abc, la página example.com podrá cargar example.com/abc a través de XMLHTTPRequest. - - A partir la versión 92 de <ph name="PRODUCT_NAME" />, esta política también está admitida en el modo sin interfaz gráfica. - - Nota: Bloquear las URLs internas chrome://* podría provocar errores inesperados.</translation> <translation id="8619748440665904084">Inhabilitar la importación de los datos para autocompletar formularios en la primera ejecución</translation> <translation id="8623672932476443039">Si se habilita la política, los usuarios podrán acceder al modo desarrollador para aplicaciones aisladas. Si se inhabilita, los usuarios no podrán acceder a esta función. @@ -7332,9 +7342,6 @@ <translation id="8807313206348471682">Mostrar el cuadro de diálogo de confirmación de cierre de sesión</translation> <translation id="8812091410765157924">Solo permitir que las ventanas emergentes abiertas con <ph name="BLANK_PAGE_NAME" /> como objetivo interactúen con la página que ha abierto la ventana emergente (si esta ha aceptado explícitamente dicha interacción)</translation> <translation id="8816370949847593408">En función del estado del lanzamiento de la desactivación, es posible que no se puedan ejecutar aplicaciones de Chrome.</translation> -<translation id="8818173863808665831">Informa de la ubicación geográfica del dispositivo. - - Si no se establece esta política o se establece el valor "false", no se informará de la ubicación.</translation> <translation id="8818768076343557335">Predecir las acciones de la red en cualquier red que no sea móvil. (Obsoleto en 50, eliminado en 52. Si se le asigna el valor 1 después de 52, se tratará como si fuese 0 - predecir las acciones de red en cualquier conexión de red).</translation> <translation id="8821678641132607468">Si se asigna el valor "Habilitada" a esta política, se importará el historial de navegación del navegador predeterminado anterior al ejecutarse por primera vez. Si se le asigna el valor "Inhabilitada" o no se le asigna ninguno, no se importará el historial de navegación al ejecutarse por primera vez. @@ -7651,6 +7658,7 @@ <translation id="9135033364005346124">Habilitar el proxy de <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Inhabilitar la interfaz del cuadro de descargas</translation> <translation id="9136399279941091445">Intervalos fuera del horario en los que se publican las políticas de dispositivos especificadas</translation> +<translation id="9148720248753722892">No permitir certificados SHA-1 firmados</translation> <translation id="9150416707757015439">Esta política está obsoleta. Te recomendamos que uses IncognitoModeAvailability en su lugar. Permite habilitar el modo Incógnito en <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_fr.xtb b/components/policy/resources/policy_templates_fr.xtb index 0e022c3..68692a8 100644 --- a/components/policy/resources/policy_templates_fr.xtb +++ b/components/policy/resources/policy_templates_fr.xtb
@@ -258,6 +258,7 @@ Si cette règle n'est pas configurée ou que la valeur après remplacement ne forme pas un nom d'hôte valide, aucun nom d'hôte n'est alors défini dans la requête DHCP.</translation> <translation id="1257550411839719984">Définir le répertoire de téléchargement par défaut</translation> <translation id="1265053460044691532">Limiter la durée pendant laquelle un utilisateur authentifié via SAML peut se connecter hors connexion</translation> +<translation id="1271811620059192171">Activer les groupes atomiques de règles</translation> <translation id="127264587838521316">Autorise les demandes d'installation d'extension de <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Activez la migration des appareils Chromad vers la gestion dans le cloud</translation> <translation id="1274997165432133392">Cookies et autres données des sites</translation> @@ -2879,6 +2880,7 @@ Si cette règle est désactivée ou n'est pas configurée, l'utilisateur ne peut être invité que si la règle de sélection automatique n'établit de correspondance avec aucun certificat.</translation> <translation id="3950110092991281616">Activer l'authentification ambiante seulement pour les sessions standards.</translation> <translation id="3950239119790560549">Mettre à jour les restrictions de temps</translation> +<translation id="3956243291190637924">Masquer les en-têtes et pieds de page dans l'aperçu avant impression</translation> <translation id="3956573780915784996">Autoriser les utilisateurs à collecter une trace des performances au niveau du système.</translation> <translation id="3956686688560604829">Utiliser la règle SiteList d'Internet Explorer pour Legacy Browser Support.</translation> <translation id="3958586912393694012">Autoriser l'utilisation de Smart Lock</translation> @@ -3115,6 +3117,18 @@ Si cette règle est désactivée ou qu'elle n'est pas configurée, les utilisateurs peuvent transférer des fichiers vers Google Drive même s'ils sont connectés à un réseau mobile.</translation> <translation id="4248277954659222481">Autoriser la lecture automatique des contenus multimédias pour les formats d'URL sur liste d'autorisation</translation> <translation id="4250680216510889253">Non</translation> +<translation id="4259636715493757956">Permet de spécifier les configurations pour les URL d'authentification dans <ph name="WEBVIEW_PRODUCT_NAME" />. + + Ces URL d'authentification seraient traitées spécialement par <ph name="WEBVIEW_PRODUCT_NAME" />, de sorte que durant l'authentification, lorsque la page Web dans <ph name="WEBVIEW_PRODUCT_NAME" /> + navigue vers les URL d'authentification, l'appli d'authentification des fournisseurs d'identité correspondants qui peut traiter cette URL d'authentification est lancée. + + Ce flux de lancement de l'appli d'authentification des fournisseurs d'identité serait utilisé par les fournisseurs d'identité pour activer + les cas d'utilisation comme la fourniture du SSO dans les applis ou pour proposer une meilleure protection en récoltant les signaux d'appareil zéro confiance pour comprendre la position de l'appareil lors de l'authentification. + + Si aucune appli valide n'est installée pour gérer l'URL d'authentification sur l'appareil, la navigation se poursuivra dans <ph name="WEBVIEW_PRODUCT_NAME" />. + + Le format de l'URL d'authentification doit respecter ce format : https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Si cette règle est configurée, chacune des origines définies dans une liste d'éléments séparés par une virgule exécute un processus dédié. Le processus de chaque origine définie ne pourra contenir que des documents de cette origine et de ses sous-domaines. Par exemple, spécifier https://a1.example.com/ autorise https://a2.a1.example.com/ dans le même processus, mais pas https://example.com ni https://b.example.com. Depuis <ph name="PRODUCT_NAME" /> 77, vous pouvez aussi spécifier une plage d'origines à isoler à l'aide d'un caractère générique. Par exemple, spécifier https://[*.]corp.example.com attribuera à chaque origine sous https://corp.example.com son propre processus dédié, y compris https://corp.example.com, https://a1.corp.example.com et https://a2.a1.corp.example.com. @@ -3255,6 +3269,7 @@ <translation id="4432762137771104529">Autoriser la création de rapports détaillés dans le cadre de la navigation sécurisée</translation> <translation id="443454694385851356">Anciens types de chiffrement (option non sécurisée)</translation> <translation id="443665821428652897">Effacer les données des sites à la fermeture du navigateur (obsolète)</translation> +<translation id="4436941175475497595">Désactiver l'aperçu avant impression</translation> <translation id="4439336120285389675">Répertorier les fonctionnalités abandonnées de la plate-forme en ligne à réactiver provisoirement. Cette règle permet aux administrateurs de réactiver des fonctionnalités abandonnées de la plate-forme en ligne pendant une durée limitée. Ces fonctionnalités sont identifiées par une balise de chaîne. Les fonctionnalités correspondant aux balises incluses dans la liste renvoyée par cette règle sont réactivées. @@ -3538,13 +3553,6 @@ <translation id="482803100714220060">Affiche les URL complètes</translation> <translation id="4832852360828533362">Création de rapports sur les utilisateurs et les appareils</translation> <translation id="4834526953114077364">Les utilisateurs qui ne se sont pas connectés au cours des trois derniers mois et dont les comptes ont été utilisés le moins récemment sont supprimés jusqu'à ce que l'espace libre soit suffisant.</translation> -<translation id="483544442646753291">Contrôle l'expérience utilisateur des fonctionnalités désactivées répertoriées dans la liste <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Si cette règle est définie sur "bloqué", les utilisateurs peuvent voir les fonctionnalités désactivées, mais ne peuvent pas les utiliser. - - Si elle est configurée sur "masqué", les utilisateurs ne peuvent ni les voir, ni les utiliser. - - Si cette règle n'est pas configurée, ou si elle est définie sur une valeur non valide, le mode de désactivation des fonctionnalités du système est défini sur "bloqué".</translation> <translation id="4835470005923546373">Désactiver le mode d'impression d'images de fond par défaut</translation> <translation id="4835622243021053389">Activer l'authentification NTLMv2.</translation> <translation id="4840015507504937941">Cette règle définit la taille minimale (en octets) des données du presse-papiers, qui sera comparée aux règles de restriction du presse-papiers définies dans DataLeakPreventionRulesList. @@ -4298,6 +4306,7 @@ Remarque : S'il y a plusieurs serveurs, séparez leur nom par une virgule. Les caractères génériques (<ph name="WILDCARD_VALUE" />) sont autorisés.</translation> <translation id="5645779841392247734">Autoriser les cookies sur ces sites</translation> <translation id="5646234199535103501">Règle de configuration du connecteur Chrome Enterprise OnBulkDataEntry</translation> +<translation id="5648016151508002741">Empêcher l'exécution de vérifications <ph name="OCSP_CRL_LABEL" /> en ligne</translation> <translation id="5649046890958064703">Si <ph name="PRINTERS_BLACKLIST" /> est choisi pour <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" />, le fait de définir <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> indique les imprimantes indisponibles pour les utilisateurs. Toutes les imprimantes sont proposées aux utilisateurs, sauf celles dont les ID sont répertoriés dans cette règle. Ces ID doivent correspondre à ceux indiqués dans les champs <ph name="ID_FIELD" /> ou <ph name="GUID_FIELD" /> du fichier spécifié dans la règle <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Cette règle étant obsolète, veuillez utiliser la règle <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> à la place.</translation> @@ -4432,9 +4441,6 @@ Si la règle est définie sur "False" ou n'est pas définie, ces informations ne sont pas transmises. Si elle est définie sur "True", les informations concernant les données VPD de l'appareil sont transmises. Les données vitales du produit (VPD) sont un ensemble de données de configuration et d'informations (numéros de pièce et de série, par exemple) associées à l'appareil.</translation> -<translation id="576158229686912964">Cette règle a été abandonnée dans la version M96. Veuillez utiliser les règles <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> et <ph name="REPORT_DEVICE_NETWORK_STATUS" /> à la place. - - Si cette règle est activée ou qu'elle n'est pas configurée, les appareils enregistrés communiquent la liste des interfaces réseau, avec leur type et leur adresse matérielle. Si cette règle est désactivée, les appareils enregistrés ne communiquent pas l'interface réseau.</translation> <translation id="5762969307102447459">Désactiver la saisie automatique pour les adresses</translation> <translation id="5765780083710877561">Description :</translation> <translation id="5766438888216077649">Ne définissez pas <ph name="WINDOW_OPENER_PROPERTY" /> pour les liens ciblant <ph name="BLANK_PAGE_NAME" /></translation> @@ -4555,6 +4561,7 @@ <translation id="5893303508158298667">Si la règle <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> est activée ou qu'elle n'est pas configurée, et que la règle <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> est activée, les clients distants peuvent utiliser des serveurs relais pour se connecter à cet ordinateur quand aucune connexion directe n'est disponible (par exemple, en raison de restrictions du pare-feu). Si cette règle est désactivée, l'accès à distance n'est pas désactivé, et seules les connexions à partir du même réseau sont autorisées (pas de relais ni de Traversée NAT).</translation> +<translation id="5897234314586602143">Afficher les en-têtes et pieds de page dans l'aperçu avant impression</translation> <translation id="5897913798715600338">Recharge de la batterie à l'aide d'une technologie de recharge rapide.</translation> <translation id="5898486742390981550">Lorsque plusieurs personnes sont connectées, l'utilisateur principal est le seul à pouvoir se servir des applications Android.</translation> <translation id="5899751601113377553">Empêcher les utilisateurs de se servir de <ph name="LACROS_NAME" /></translation> @@ -5057,6 +5064,13 @@ <translation id="6478258366184919502">Origines de l'écran de connexion</translation> <translation id="6478261301433199402">Cette règle permet de définir l'image de <ph name="PLUGIN_VM_NAME" /> pour un utilisateur. Spécifiez cette règle sous la forme d'une chaîne au format JSON. Dans le champ "<ph name="URL_PLUGIN_VM_IMAGE_FIELD" />", indiquez l'URL où télécharger l'image, et dans le champ "<ph name="HASH_PLUGIN_VM_IMAGE_FIELD" />", le hachage SHA-256 utilisé pour vérifier l'intégrité du téléchargement.</translation> <translation id="6481245670325946423">Autoriser le mode sans interface graphique</translation> +<translation id="648158446793103284">Permet aux utilisateurs de sélectionner l'un des modes de saisie que vous spécifiez pour les sessions <ph name="PRODUCT_OS_NAME" />. + + Si cette règle n'est pas configurée ou qu'aucun mode de saisie n'est indiqué dans la liste, les utilisateurs peuvent en choisir un parmi tous ceux compatibles. + + À partir de la version M106, les modes de saisie autorisés sont automatiquement activés dans la session kiosque. + + Remarque : Si le mode de saisie actuel n'est pas compatible, la disposition du clavier matériel (si elle est autorisée) ou la première entrée valide dans cette liste est utilisée. Les modes de saisie non valides ou incompatibles sont ignorés.</translation> <translation id="6489084406497912050">Permet de déterminer si les utilisateurs peuvent ajouter ou non des comptes Kerberos. Si cette règle est activée ou si elle n'est pas définie, les utilisateurs peuvent ajouter des comptes Kerberos via les paramètres de comptes Kerberos sur la page "Paramètres Kerberos". Ils ont le plein contrôle des comptes qu'ils ont ajoutés et peuvent ainsi les modifier ou les supprimer. @@ -5285,6 +5299,7 @@ Si cette règle est définie sur "False", l'URL par défaut s'affiche. Si cette règle n'est pas configurée, l'URL par défaut s'affiche. Toutefois, l'utilisateur peut alterner entre l'affichage par défaut et l'affichage de l'URL complète à l'aide d'une option de menu contextuel. </translation> +<translation id="6670794785040100077">Désactiver l'envoi de documents à <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Autoriser les utilisateurs à personnaliser l'arrière-plan sur la page "Nouvel onglet"</translation> <translation id="6672630473862787247">Activer l'authentification ambiante pour les sessions standards, Invité et de navigation privée.</translation> <translation id="6685903773201985073">Activer l'authentification ambiante pour les sessions Invité et standards.</translation> @@ -5372,6 +5387,7 @@ Si la règle <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> n'est pas configurée, les requêtes de recherche sont envoyées à l'aide de la méthode GET.</translation> <translation id="6757613329154374267">Service de sauvegarde et de restauration activé</translation> <translation id="6758659208493449452">Cette règle détermine si les utilisateurs inscrits au Programme Protection Avancée bénéficient de protections supplémentaires. Ces fonctionnalités peuvent impliquer le partage de données avec Google (par exemple, les utilisateurs du programme Protection Avancée peuvent envoyer leurs téléchargements à Google pour les faire analyser afin de détecter d'éventuels logiciels malveillants). Si cette règle est définie sur "True" ou si elle n'est pas configurée, les utilisateurs inscrits bénéficieront de protections supplémentaires. Si elle est définie sur "False", les utilisateurs du programme Protection Avancée ne bénéficieront que des fonctionnalités grand public standards.</translation> +<translation id="6763023079133439068">Autoriser les certificats sans extension subjectAlternativeName lorsqu'ils sont émis par des ancres de confiance locales</translation> <translation id="6766216162565713893">Autoriser les sites à demander à l'utilisateur d'accorder l'accès à un appareil Bluetooth à proximité</translation> <translation id="6770454900105963262">Envoyer des rapports sur les sessions Kiosque actives</translation> <translation id="6782977971207381602">Si cette règle est activée, l'appareil est autorisé à exécuter des machines virtuelles sur <ph name="PRODUCT_OS_NAME" />. Vous devez activer <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> et <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> pour pouvoir utiliser <ph name="PRODUCT_CROSTINI_NAME" />. Si cette règle est désactivée, l'appareil n'est pas autorisé à exécuter des machines virtuelles. Si vous la désactivez, elle est appliquée aux machines virtuelles qui vont être lancées, mais pas à celles qui le sont déjà. @@ -5995,6 +6011,7 @@ <translation id="7458437477941640506">Ne rétablissez pas la version cible si elle est antérieure à la version de l'OS. Les mises à jour seront également désactivées.</translation> <translation id="7459601923199346224">Configure les règles au niveau de l'utilisateur et de l'appareil dans le cadre de la gestion des certificats.</translation> <translation id="7459633275230216698">Autoriser l'affichage de boîtes de dialogue de sélection de fichiers</translation> +<translation id="7464058117970792805">Activer l'aperçu avant impression</translation> <translation id="7464991223784276288">Limiter les cookies des URL correspondantes à la session en cours</translation> <translation id="7468182772656807573">Permet de spécifier la fréquence d'envoi (en millisecondes) des paquets réseau de contrôle. Cette fréquence peut être comprise entre 30 secondes et 24 heures. Toute valeur en dehors de cette plage sera remplacée par la valeur minimale ou maximale la plus proche autorisée. @@ -6090,9 +6107,6 @@ Si la règle n'est pas configurée, "<ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />" est défini par défaut pour les utilisateurs gérés par l'entreprise et "<ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />" pour les utilisateurs non gérés. À l'avenir, la valeur "<ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />" permettra de faire de <ph name="LACROS_NAME" /> le seul navigateur disponible dans <ph name="PRODUCT_OS_NAME" />.</translation> -<translation id="7509761893401042250">Cette règle a été abandonnée dans la version M96. Veuillez utiliser les règles <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" />, et <ph name="REPORT_DEVICE_AUDIO_STATUS" /> à la place. - - Si cette règle est activée ou qu'elle n'est pas configurée, les appareils enregistrés communiquent des statistiques matérielles telles que l'utilisation du processeur et de la RAM. Si cette règle est désactivée, les appareils enregistrés ne communiquent pas ces statistiques.</translation> <translation id="7512065400265675158">Il est prévu de réduire l'en-tête de requête HTTP <ph name="USER_AGENT_HEADER_NAME" />. Afin de faciliter les tests et la compatibilité, cette règle permet d'activer la fonctionnalité de réduction de tous les sites Web ou d'empêcher la phase d'évaluation ou les tests en conditions réelles d'activer la fonctionnalité. Pour en savoir plus sur <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> et le calendrier associé, consultez la page : @@ -6373,6 +6387,7 @@ <translation id="7823902813460802031">Si cette règle est activée, <ph name="PRODUCT_OS_NAME" /> empêche l'appareil de passer en mode développeur. Si cette règle est désactivée ou qu'elle n'est pas configurée, l'appareil peut continuer d'utiliser ce mode, si nécessaire.</translation> +<translation id="7824000841504721945">Désactiver les groupes atomiques de règles</translation> <translation id="782661371433719637">Interdire à tous les sites de demander l'accès en lecture aux fichiers et répertoires via l'API File System</translation> <translation id="7827127381981620448">Application de plate-forme</translation> <translation id="7833148823006528332">Identifiant d'appli Android (par ex. : "com.google.android.gm" pour Gmail)</translation> @@ -6458,6 +6473,7 @@ <translation id="793473937901685727">Définir la disponibilité des certificats pour les applications ARC</translation> <translation id="7936302526928951356">La chaîne user-agent ne figera pas la version majeure.</translation> <translation id="7937766917976512374">Autoriser ou interdire la capture vidéo</translation> +<translation id="7941528208359969119">Autoriser l'exécution de vérifications <ph name="OCSP_CRL_LABEL" /> en ligne</translation> <translation id="7941975817681987555">Ne pas prédire d'actions réseau lors d'une connexion au réseau</translation> <translation id="7946350455013548764">Si cette règle est définie sur "3", les sites Web peuvent demander l'accès aux appareils HID. Si cette règle est définie sur "2", l'accès aux appareils HID est refusé. @@ -6841,6 +6857,7 @@ Si la règle <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> n'est pas configurée, la requête de recherche d'image est envoyée à l'aide de la méthode GET.</translation> <translation id="8314214821702356835">Autoriser les utilisateurs à lire des contenus multimédias lorsque l'appareil est verrouillé</translation> +<translation id="8316940611391250886">Interdire les certificats sans extension subjectAlternativeName</translation> <translation id="8319678975002906774">Définit des valeurs de configuration gérée pour des sites Web aux origines spécifiques.</translation> <translation id="8320149248919453401">Mode de recharge de la batterie</translation> <translation id="8327651196906278510">Autoriser la capture d'onglet selon ces origines</translation> @@ -7111,13 +7128,6 @@ Si cette règle est définie sur "True", les onglets en arrière-plan depuis au moins cinq minutes peuvent être figés. En figeant ces onglets, vous sollicitez moins le processeur, la batterie et la mémoire. <ph name="PRODUCT_NAME" /> utilise des heuristiques pour ne pas figer les onglets qui exécutent une tâche utile en arrière-plan (par exemple, l'affichage de notifications, la lecture audio d'un contenu, la diffusion d'une vidéo en streaming). Notez que les développeurs Web peuvent également choisir de ne pas figer les pages de leur site (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Si cette règle est définie sur "False", aucun onglet n'est figé.</translation> -<translation id="8619480582976056396">Configurer cette règle empêche les pages Web ayant des URL interdites de se charger. Cette règle fournit une liste de formats d'URL précisant les URL interdites. Si elle n'est pas configurée, aucune URL n'est interdite dans le navigateur. Les formats d'URL doivent respecter les conditions énoncées à la page https://www.chromium.org/administrators/url-blocklist-filter-format. Vous pouvez définir jusqu'à 1 000 exceptions dans <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - À compter de la version 73 de <ph name="PRODUCT_NAME" />, vous pouvez bloquer les URL javascript://*. Toutefois, cela ne concerne que le JavaScript saisi dans la barre d'adresse (ou, par exemple, les favoris intelligents). Cette règle ne s'applique pas aux URL JavaScript intégrées dans les pages si les données sont chargées dynamiquement. Par exemple, si vous bloquez "example.com/abc", la page example.com pourra quand même charger "example.com/abc" via une requête XMLHTTPRequest. - - À compter de la version 92 de <ph name="PRODUCT_NAME" />, cette règle est aussi prise en charge en mode sans interface graphique. - - Remarque : Le blocage des URL internes chrome://* peut provoquer des erreurs inattendues.</translation> <translation id="8619748440665904084">Désactiver l'importation des données de saisie automatique à la première exécution</translation> <translation id="8623672932476443039">Si cette règle est activée, elle permet aux utilisateurs d'accéder au mode développeur pour les applis isolées. Si elle est désactivée, les utilisateurs ne pourront pas bénéficier de ce mode. @@ -7266,9 +7276,6 @@ <translation id="8807313206348471682">Afficher la boîte de dialogue de confirmation de déconnexion</translation> <translation id="8812091410765157924">Autoriser les pop-up ouverts avec une cible <ph name="BLANK_PAGE_NAME" /> à interagir avec la page qui a ouvert le pop-up uniquement si celle-ci accepte explicitement ce type d'interaction</translation> <translation id="8816370949847593408">Il se peut que les applis Chrome ne soient pas autorisées à s'exécuter, selon l'état d'avancement du processus d'abandon.</translation> -<translation id="8818173863808665831">Permet d'indiquer l'emplacement géographique de l'appareil. - - Si cette règle n'est pas définie, ou si la valeur "false" lui est attribuée, l'emplacement n'est pas indiqué.</translation> <translation id="8818768076343557335">Prédire les actions réseau sur tous les réseaux, sauf les réseaux mobiles (Option abandonnée dans la version 50 et supprimée dans la version 52. Au-delà de la version 52, si la valeur 1 est définie, elle est traitée comme la valeur 0 : Prédire les actions réseau lors d'une connexion au réseau.)</translation> <translation id="8821678641132607468">Si cette règle est activée, l'historique de navigation du précédent navigateur par défaut est importé lors de la première exécution. Si cette règle est désactivée ou qu'elle n'est pas configurée, l'historique de navigation n'est pas importé lors de la première exécution. @@ -7582,6 +7589,7 @@ <translation id="9135033364005346124">Activer le proxy <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Désactiver l'interface utilisateur de la bulle de téléchargement</translation> <translation id="9136399279941091445">Intervalles pendant lesquels les règles spécifiées pour les appareils sont disponibles (lorsque l'appareil est éteint)</translation> +<translation id="9148720248753722892">Interdire les certificats signés SHA-1</translation> <translation id="9150416707757015439">Cette règle est obsolète. Veuillez utiliser la règle "IncognitoModeAvailability". Active le mode navigation privée de <ph name="PRODUCT_NAME" />.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index b6daed2..27e114f 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -3578,13 +3578,6 @@ <translation id="482803100714220060">Menampilkan URL Lengkap</translation> <translation id="4832852360828533362">Pelaporan perangkat dan pengguna</translation> <translation id="4834526953114077364">Pengguna yang paling jarang digunakan yang belum masuk dalam 3 bulan terakhir dihapus sampai terdapat cukup ruang kosong</translation> -<translation id="483544442646753291">Mengontrol pengalaman pengguna fitur yang dinonaktifkan yang tercantum di <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Jika kebijakan ini disetel ke "diblokir", fitur yang dinonaktifkan tidak akan dapat digunakan tetapi tetap terlihat oleh pengguna. - - Jika kebijakan ini disetel ke "tersembunyi", fitur yang dinonaktifkan tidak akan dapat digunakan dan tidak terlihat oleh pengguna. - - Jika kebijakan in tidak disetel atau disetel ke nilai yang tidak valid, mode nonaktif dari fitur sistem akan menjadi "diblokir".</translation> <translation id="4835470005923546373">Nonaktifkan mode pencetakan grafis latar belakang secara default</translation> <translation id="4835622243021053389">Mengaktifkan autentikasi NTLMv2.</translation> <translation id="4840015507504937941">Kebijakan ini menyetel ukuran data minimal (dalam byte) dari data dalam papan klip yang akan diperiksa terhadap aturan pembatasan papan klip yang ditentukan di kebijakan DataLeakPreventionRulesList. @@ -4477,9 +4470,6 @@ Jika kebijakan ditetapkan ke salah (false) atau tidak ditetapkan, informasi tidak akan dilaporkan. Jika ditetapkan ke benar (true), informasi VPD perangkat akan dilaporkan. Data Produk Vital (VPD) adalah kumpulan data konfigurasi dan informatif (seperti nomor suku cadang dan nomor seri) yang terkait dengan perangkat.</translation> -<translation id="576158229686912964">Kebijakan ini tidak digunakan lagi di M96. Sebagai gantinya, gunakan <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> dan <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Jika kebijakan disetel ke Aktif atau tidak disetel, perangkat terdaftar akan melaporkan daftar antarmuka jaringan beserta jenis dan alamat hardware-nya. Jika kebijakan disetel ke Nonaktif, perangkat terdaftar tidak akan melaporkan antarmuka jaringan.</translation> <translation id="5762969307102447459">Nonaktifkan Isi Otomatis untuk alamat</translation> <translation id="5765780083710877561">Deskripsi:</translation> <translation id="5766438888216077649">Tidak menyetel <ph name="WINDOW_OPENER_PROPERTY" /> untuk link yang menargetkan <ph name="BLANK_PAGE_NAME" /></translation> @@ -6171,9 +6161,6 @@ Jika kebijakan tidak disetel, setelan default adalah <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> untuk pengguna yang dikelola perusahaan dan <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> untuk pengguna yang tidak dikelola perusahaan. Di masa mendatang, <ph name="LACROS_NAME" /> mungkin bisa menjadi satu-satunya browser yang tersedia di <ph name="PRODUCT_OS_NAME" /> dengan nilai <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Kebijakan ini tidak digunakan lagi mulai M96. Sebagai gantinya, gunakan <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" />, dan <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Jika kebijakan disetel ke Aktif atau tidak disetel, perangkat terdaftar akan melaporkan statistik hardware seperti penggunaan CPU/RAM. Jika kebijakan disetel ke Nonaktif, perangkat terdaftar tidak akan melaporkan statistik hardware.</translation> <translation id="7512065400265675158">Header permintaan HTTP <ph name="USER_AGENT_HEADER_NAME" /> dijadwalkan akan dikurangi. Untuk memudahkan pengujian dan kompatibilitas, kebijakan ini dapat mengaktifkan fitur pengurangan untuk semua situs, atau menonaktifkan kemampuan uji coba asal atau uji coba kolom untuk mengaktifkan fitur tersebut. Untuk mempelajari <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> dan linimasanya lebih lanjut, baca di sini: @@ -7193,13 +7180,6 @@ Jika kebijakan ini ditetapkan ke true, tab yang telah berjalan di latar belakang selama setidaknya 5 menit dapat dibekukan. Pembekuan tab mengurangi penggunaan CPU, baterai, dan memori. <ph name="PRODUCT_NAME" /> menggunakan heuristik untuk menghindari pembekuan tab yang sedang aktif di latar belakang (misalnya, menampilkan notifikasi, memutar suara, streaming video). Developer web juga dapat memilih untuk tidak membekukan situsnya (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Jika kebijakan ditetapkan ke false, tidak ada tab yang akan dibekukan.</translation> -<translation id="8619480582976056396">Menyetel kebijakan akan mencegah pemuatan halaman web yang berisi URL terlarang. Kebijakan menyediakan daftar pola URL yang menentukan URL terlarang. Jika kebijakan tidak disetel, tidak ada URL yang dilarang di browser. Format pola URL sesuai dengan format ini ( https://www.chromium.org/administrators/url-blocklist-filter-format ). Hingga 1.000 pengecualian dapat ditentukan di <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - Mulai <ph name="PRODUCT_NAME" /> versi 73, Anda dapat memblokir URL javascript://*. Namun, ini hanya akan memengaruhi JavaScript yang dimasukkan dalam kolom URL (atau, misalnya, bookmarklet). URL JavaScript dalam halaman dengan data yang dimuat secara dinamis tidak tunduk pada kebijakan ini. Misalnya, jika Anda memblokir example.com/abc, example.com tetap dapat memuat example.com/abc melalui XMLHTTPRequest. - - Mulai <ph name="PRODUCT_NAME" /> versi 92, kebijakan ini juga didukung dalam mode headless. - - Catatan: Memblokir URL chrome://* internal dapat menyebabkan error tak terduga.</translation> <translation id="8619748440665904084">Nonaktifkan impor data formulir isi otomatis saat browser pertama kali dijalankan</translation> <translation id="8623672932476443039">Jika kebijakan disetel ke Aktif, pengguna akan dapat mengakses Mode Developer untuk Aplikasi Terisolasi. Jika kebijakan disetel ke Nonaktif, pengguna tidak dapat mengakses kemampuan tersebut. @@ -7348,9 +7328,6 @@ <translation id="8807313206348471682">Menampilkan dialog konfirmasi logout</translation> <translation id="8812091410765157924">Hanya izinkan pop-up yang dibuka dengan target <ph name="BLANK_PAGE_NAME" /> untuk berinteraksi dengan halaman yang membuka pop-up jika halaman pembuka secara eksplisit memilih untuk mengizinkan interaksi tersebut</translation> <translation id="8816370949847593408">Aplikasi Chrome mungkin tidak diizinkan berjalan, bergantung pada status peluncuran penghentian.</translation> -<translation id="8818173863808665831">Melaporkan lokasi geografis perangkat. - - Jika kebijakan tidak disetel, atau disetel ke false, lokasi tidak akan dilaporkan.</translation> <translation id="8818768076343557335">Memprediksi tindakan jaringan pada jaringan apa pun yang bukan seluler. (Penggunaan dihentikan di nilai 50, dihapus di nilai 52. Setelah 52, jika nilai 1 disetel, nilai akan diperlakukan sebagai 0 - memprediksi tindakan jaringan di koneksi jaringan apa pun.)</translation> <translation id="8821678641132607468">Jika kebijakan disetel ke Aktif, histori penjelajahan akan diimpor dari browser default sebelumnya saat pertama kali dijalankan. Jika kebijakan disetel ke Nonaktif atau tidak disetel, tidak ada histori penjelajahan yang akan diimpor saat pertama kali dijalankan.
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 952a2a0..f10cebc 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -3555,13 +3555,6 @@ <translation id="482803100714220060">Mostra URL completi</translation> <translation id="4832852360828533362">Report su dispositivi e utenti</translation> <translation id="4834526953114077364">Gli utenti utilizzati meno di recente che non hanno eseguito l'accesso negli ultimi tre mesi vengono rimossi fino alla disponibilità di spazio libero sufficiente</translation> -<translation id="483544442646753291">Controlla l'esperienza utente delle funzionalità disattivate che sono elencate in <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Se il criterio viene impostato su "Bloccato", le funzionalità disattivate non saranno utilizzabili, ma rimarranno visibili per gli utenti. - - Se il criterio viene impostato su "Nascosto", le funzionalità disattivate saranno inutilizzabili e non visibili per gli utenti. - - Se il criterio non viene configurato o presenta un valore non valido, la modalità di disattivazione delle funzionalità del sistema sarà "Bloccato".</translation> <translation id="4835470005923546373">Disattiva la modalità di stampa delle immagini di sfondo per impostazione predefinita</translation> <translation id="4835622243021053389">Attiva autenticazione NTLMv2</translation> <translation id="4840015507504937941">Questo criterio consente di impostare le dimensioni minime (in byte) dei dati negli appunti, che verranno controllate in base alle regole di limitazione relativa agli appunti definite nel criterio DataLeakPreventionRulesList. @@ -4443,9 +4436,6 @@ Se il criterio è impostato su False o non è configurato, le informazioni non vengono segnalate. Se è impostato su True, le informazioni sui VPD del dispositivo vengono segnalate. I Vital Product Data (VPD) sono una raccolta di dati informativi e di configurazione (come numeri di serie o di componenti) associati al dispositivo.</translation> -<translation id="576158229686912964">Questo criterio è stato ritirato nella versione M96. Usa i criteri <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> e <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano l'elenco di interfacce di rete con i relativi tipi e indirizzi hardware. Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano l'interfaccia di rete.</translation> <translation id="5762969307102447459">Disattiva la compilazione automatica per gli indirizzi</translation> <translation id="5765780083710877561">Descrizione:</translation> <translation id="5766438888216077649">Non impostare <ph name="WINDOW_OPENER_PROPERTY" /> per i link indirizzati alla pagina <ph name="BLANK_PAGE_NAME" /></translation> @@ -6126,9 +6116,6 @@ Se il criterio non viene configurato, il valore predefinito è <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> per gli utenti gestiti a livello aziendale e <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> per gli utenti non gestiti. In futuro sarà possibile impostare <ph name="LACROS_NAME" /> come unico browser disponibile in <ph name="PRODUCT_OS_NAME" /> impostando il valore <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Questo criterio è stato ritirato a partire dalla versione M96. Usa i criteri <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> e <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Se il criterio viene impostato su Attivato o se non viene configurato, i dispositivi registrati segnalano statistiche hardware quali l'utilizzo di CPU/RAM. Se il criterio viene impostato su Disattivato, i dispositivi registrati non segnalano le statistiche hardware.</translation> <translation id="7512065400265675158">L'intestazione della richiesta <ph name="USER_AGENT_HEADER_NAME" /> è stata programmata per essere ridotta. Per semplificare il test e la compatibilità, questo criterio può attivare la funzionalità di riduzione per tutti i siti web o disattivare la possibilità per le prove dell'origine o le prove sul campo di abilitare la funzionalità. Per scoprire di più sulla funzionalità <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> e la relativa cronologia, leggi qui: @@ -7142,13 +7129,6 @@ Se il criterio viene impostato su true, le schede che sono in secondo piano da almeno cinque minuti potrebbero essere bloccate. Il blocco delle schede riduce l'utilizzo di CPU, batteria e memoria. <ph name="PRODUCT_NAME" /> usa l'euristica per evitare di bloccare le schede in secondo piano che hanno una funzione utile (ad esempio visualizzare notifiche, riprodurre audio, riprodurre video in streaming). Gli sviluppatori web possono anche disattivare il blocco nei loro siti (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Se il criterio viene impostato su false, le schede non verranno bloccate.</translation> -<translation id="8619480582976056396">La configurazione del criterio consente di impedire il caricamento delle pagine web con URL vietati. Consente di fornire un elenco di pattern URL che specificano gli URL vietati. Se il criterio non viene configurato, nessun URL è vietato nel browser. I pattern URL devono avere il formato indicato all'indirizzo https://www.chromium.org/administrators/url-blocklist-filter-format. È possibile definire fino a 1000 eccezioni nel criterio <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - A partire dalla versione 73 di <ph name="PRODUCT_NAME" />, puoi bloccare gli URL javascript://*. Tuttavia, questa operazione interessa solo il codice JavaScript inserito nella barra degli indirizzi o, ad esempio, nei bookmarklet. Gli URL JavaScript in-page con un caricamento dinamico dei dati non sono soggetti a questo criterio. Ad esempio, se example.com/abc viene bloccato, example.com può comunque caricare example.com/abc tramite XMLHTTPRequest. - - A partire dalla versione 92 di <ph name="PRODUCT_NAME" />, questo criterio è supportato anche nella modalità headless. - - Nota: il blocco degli URL chrome://* interni può generare errori imprevisti.</translation> <translation id="8619748440665904084">Disabilita l'importazione dei dati di compilazione automatica dei moduli alla prima esecuzione</translation> <translation id="8623672932476443039">Se il criterio viene impostato su enabled, gli utenti possono accedere alla modalità sviluppatore per le app isolate. Se viene impostato su disabled, gli utenti non possono accedere a queste funzionalità. @@ -7298,9 +7278,6 @@ <translation id="8807313206348471682">Mostra la finestra di dialogo di conferma di disconnessione</translation> <translation id="8812091410765157924">Consenti ai popup aperti con una destinazione <ph name="BLANK_PAGE_NAME" /> di interagire con la pagina che ha aperto il popup soltanto se la pagina di apertura attiva esplicitamente questa interazione</translation> <translation id="8816370949847593408">Potrebbe non essere consentita l'esecuzione delle app di Chrome, in base allo stato del ritiro graduale.</translation> -<translation id="8818173863808665831">Consente di segnalare la posizione geografica del dispositivo. - -Se la norma non viene impostata o viene impostata su false, la posizione non viene segnalata.</translation> <translation id="8818768076343557335">Prevedi sempre le azioni di rete su ogni rete non cellulare. (obsoleto nella versione 50, rimosso nella 52. Dopo la versione 52, se viene impostato il valore 1, viene gestito come 0; prevedi le azioni di rete su qualsiasi connessione di rete).</translation> <translation id="8821678641132607468">Se il criterio viene impostato su Attivato, la cronologia di navigazione del precedente browser predefinito verrà importata alla prima esecuzione. Se il criterio viene impostato su Disattivato o se non viene configurato, la cronologia di navigazione non verrà importata alla prima esecuzione.
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 9c5b82f..142eef8f 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -3380,13 +3380,6 @@ <translation id="482803100714220060">URL 全体を表示する</translation> <translation id="4832852360828533362">ユーザーとデバイスに関するレポートの送信</translation> <translation id="4834526953114077364">十分な空き容量に達するまで、3 か月以内にログインしていないユーザーを順に削除する</translation> -<translation id="483544442646753291"><ph name="SYSTEM_FEATURES_DISABLE_LIST" /> で指定し無効にした機能のユーザー エクスペリエンスを管理します。 - - このポリシーを「blocked」(ブロック)に設定した場合、無効にした機能は使用不可となりますがユーザーには引き続き表示されます。 - - このポリシーを「hidden」(非表示)に設定した場合、無効にした機能は使用不可となり、ユーザーにも表示されなくなります。 - - このポリシーを未設定のままにするか、無効な値を指定した場合、システム機能の無効化モードは「blocked」になります。</translation> <translation id="4835470005923546373">背景のグラフィックの印刷モードをデフォルトで無効にする</translation> <translation id="4835622243021053389">NTLMv2 認証を有効にする。</translation> <translation id="4840015507504937941">このポリシーでは、DataLeakPreventionRulesList ポリシーで定義されたクリップボード制限ルールに基づいてチェックするクリップボード データの最小サイズ(バイト単位)を設定します。 @@ -3949,6 +3942,7 @@ <translation id="5464816904705580310">管理対象ユーザーの設定を行います。</translation> <translation id="5466596281866046569">アプリ情報を報告する</translation> <translation id="546726650689747237">画面が暗くなるまでの時間(AC 電源での実行時)</translation> +<translation id="546830339470589966">新しい Kerberos チケットのドメインをオートコンプリートする</translation> <translation id="5469143988693423708">ユーザーは Crostini を実行できます</translation> <translation id="5469825884154817306">これらのサイトの画像をブロックする</translation> <translation id="5470500958458209831">Ansible playbook をダウンロードすることのできる URL です。</translation> @@ -4202,9 +4196,6 @@ このポリシーを false に設定するか未設定のままにした場合、この情報は報告されません。 このポリシーを true に設定した場合、デバイスの VPD に関する情報が報告されます。 バイタル商品データ (VPD)は、デバイスに関連付けられた一連の構成データと情報データ(部品およびシリアル番号など)です。</translation> -<translation id="576158229686912964">このポリシーは M96 でサポート終了となりました。代わりに <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> と <ph name="REPORT_DEVICE_NETWORK_STATUS" /> を使用してください。 - - このポリシーを有効にするか未設定のままにした場合、登録済みのデバイスはネットワーク インターフェースのリスト(タイプとハードウェア アドレスを含む)を報告します。このポリシーを無効に設定した場合、登録済みのデバイスはネットワーク インターフェースを報告しません。</translation> <translation id="5762969307102447459">住所の自動入力を無効にする</translation> <translation id="5765780083710877561">説明:</translation> <translation id="5766438888216077649"><ph name="BLANK_PAGE_NAME" /> をターゲットとするリンクで <ph name="WINDOW_OPENER_PROPERTY" /> を設定しない</translation> @@ -4752,6 +4743,10 @@ このポリシーでサイトを指定しない場合は、<ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> のポリシーが適用されます。このポリシーでサイトを指定した場合は、ブラウザのデフォルトの権限設定が適用され、ユーザーはサイトごとに権限を選択できます。</translation> <translation id="6384542789059421431">ブラウザのサイドパネルにおけるデフォルトの検索エンジンの検索結果ページの表示を有効にします。</translation> <translation id="6394350458541421998">このポリシーは <ph name="PRODUCT_OS_NAME" /> バージョン 29 で廃止されました。PresentationScreenDimDelayScale ポリシーを代わりに使用してください。</translation> +<translation id="6396956366662970339">アダプティブ充電モデルを有効にして、バッテリー寿命を延ばすため充電プロセスを保留するかどうかを指定します。 + + アダプティブ充電モデルでは、デバイスが AC 電源に接続されている場合、バッテリー寿命を延ばすため充電プロセスを保留すべきかどうかを評価します。アダプティブ充電モデルで充電プロセスを保留する場合、バッテリーを一定の残量(80% など)に維持し、ユーザーが必要とするときは 100% まで充電します。 + このポリシーを True に設定した場合、アダプティブ充電モデルが有効になり、バッテリー寿命を延ばすため充電プロセスを保留します。このポリシーを False に設定するか未設定のままにした場合、アダプティブ充電モデルは充電プロセスに適用されません。</translation> <translation id="6397588391180665797">登録済みデバイスのユーザーのネットワーク設定を報告します。 このポリシーを false に設定した場合、この情報は報告されません。 @@ -5785,9 +5780,6 @@ このポリシーが未設定の場合、デフォルトで、企業の管理対象ユーザーは <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />、管理対象外のユーザーは <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> に設定されます。 今後、<ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> 値を使用して、<ph name="PRODUCT_OS_NAME" /> で <ph name="LACROS_NAME" /> を唯一の使用可能なブラウザとして設定できるようになる予定です。</translation> -<translation id="7509761893401042250">このポリシーは M96 でサポートが終了しました。代わりに <ph name="REPORT_DEVICE_CPU_INFO" />、<ph name="REPORT_DEVICE_MEMORY_INFO" />、<ph name="REPORT_DEVICE_STORAGE_STATUS" />、<ph name="REPORT_DEVICE_SECURITY_STATUS" />、<ph name="REPORT_DEVICE_AUDIO_STATUS" /> を使用してください。 - - このポリシーを有効にするか未設定のままにした場合、登録済みのデバイスは CPU/RAM 使用量などに関するハードウェアの統計情報を報告します。このポリシーを無効に設定した場合、登録済みのデバイスはハードウェアの統計情報を報告しません。</translation> <translation id="7512065400265675158"><ph name="USER_AGENT_HEADER_NAME" /> HTTP リクエスト ヘッダーは、今後、含められる情報の削減が予定されています。このポリシーでは、テストを行って互換性を確保できるように、この削減をすべてのウェブサイトに対して有効にすることができます。オリジン トライアルやフィールド トライアルによる削減の有効化を許可しないよう設定することもできます。 <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> とそのスケジュールについて詳しくは、こちらをご覧ください。 @@ -6005,6 +5997,10 @@ 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。 このポリシーでは、オリジンのみが照合されるため、URL パターンのパスは無視されます。</translation> <translation id="7771298620150437359">使用言語の内容と順序を設定する</translation> +<translation id="7773790010815041731">Chrome アプリは、<ph name="MS_WIN_NAME" />、<ph name="MAC_OS_NAME" />、<ph name="LINUX_OS_NAME" /> でのサポートが終了しています。 + このポリシーを有効に設定した場合、2022 年 6 月にすべてのプラットフォームで Chrome アプリのサポートが廃止される日まで、これらのプラットフォームでは引き続き <ph name="PRODUCT_NAME" /> で Chrome アプリを実行できます。 + このポリシーを無効に設定するか未設定のままにした場合、サポート終了の段階に応じて、一部の Chrome アプリは実行できなくなります。 + いずれの場合も、ポリシーにより自動インストールされた Chrome アプリについては引き続き実行できます。</translation> <translation id="7774768074957326919">システムのプロキシ設定を使用する</translation> <translation id="777734450201217641">ログイン画面でユーザー補助機能のショートカットを有効にします。 @@ -6750,13 +6746,6 @@ このポリシーを true に設定した場合、5 分以上バックグラウンドになっているタブは凍結可能になります。タブを凍結すると、CPU、バッテリー、メモリの使用量が削減されます。<ph name="PRODUCT_NAME" /> ではヒューリスティックにより、バックグラウンドで有用な処理(通知の表示、サウンドの再生、動画のストリーミングなど)を行うタブが凍結の対象から外されます。ウェブ デベロッパーが自身のサイトを凍結の対象から外すこともできます(https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md)。 このポリシーを false に設定した場合は、どのタブも凍結されません。</translation> -<translation id="8619480582976056396">このポリシーでは、禁止した URL のリストからのウェブページの読み込みを防止できます。このリストには、禁止する URL のパターンを指定します。このポリシーを未設定のままにした場合、ブラウザですべての URL が許可されます。URL のパターンは、https://www.chromium.org/administrators/url-blocklist-filter-format の形式で指定します。また、<ph name="URL_ALLOWLIST_POLICY_NAME" /> で最大 1,000 件の URL を例外として指定できます。 - - <ph name="PRODUCT_NAME" /> バージョン 73 以降では、「javascript://*」の URL をブロックできます。ただし、ブロックされるのはアドレスバーに入力された(またはブックマークレットなどの)JavaScript のみです。ページ内の JavaScript URL に動的に読み込まれるデータが含まれる場合、このポリシーは適用されません。たとえば、「example.com/abc」をブロックした場合でも、「example.com」では XMLHTTPRequest を使用して「example.com/abc」を読み込むことができます。 - - <ph name="PRODUCT_NAME" /> バージョン 92 以降、このポリシーはヘッドレス モードでもサポートされるようになりました。 - - 注: 「chrome://*」の内部 URL をブロックすると、予期しないエラーが発生する可能性があります。</translation> <translation id="8619748440665904084">初回実行時の自動入力フォームのデータのインポートを無効にする</translation> <translation id="8623672932476443039">このポリシーを有効に設定した場合、ユーザーは分離されたアプリのデベロッパー モードにアクセスできます。このポリシーを無効に設定した場合、ユーザーはこの機能を利用できません。このポリシーを未設定のままにした場合、デフォルトでは、Chrome OS 上で企業の管理対象ユーザーはこの機能を利用できず、他のすべてのユーザーと OS は利用できます。</translation> <translation id="8626826495474944836">すべてのサイトに対してサイト分離を必須にする</translation> @@ -6903,9 +6892,6 @@ <translation id="8807313206348471682">ログアウト確認ダイアログを表示する</translation> <translation id="8812091410765157924">ポップアップの表示元ページで操作が明示的に許可されている場合に限り、<ph name="BLANK_PAGE_NAME" /> をターゲットとして開いたポップアップにその表示元ページの操作を許可する</translation> <translation id="8816370949847593408">サポート終了の段階に応じて、一部の Chrome アプリの実行を許可しない。</translation> -<translation id="8818173863808665831">デバイスの地理的位置をレポートします。 - - このポリシーを設定していない場合、あるいは false に設定している場合、位置はレポートされません。</translation> <translation id="8818768076343557335">モバイル以外のネットワークでのネットワーク動作を予測します。 (バージョン 50 でサポート終了、バージョン 52 で削除。バージョン 52 以降は、値 1 が設定されている場合は 0 として扱われ、あらゆるネットワーク接続でネットワーク動作を予測します。)</translation> <translation id="8821678641132607468">このポリシーを有効に設定した場合、初回実行時に以前の既定のブラウザから閲覧履歴が読み込まれます。このポリシーを無効に設定するか未設定のままにした場合、初回実行時に閲覧履歴は読み込まれません。 @@ -7086,6 +7072,7 @@ 有効な入力パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。このポリシーでは、オリジンのみが照合されるため、URL パターンのパスは無視されます。</translation> <translation id="9010080992450148617">高度な保護機能プログラムに登録しているユーザーがダウンロードしたコンテンツを Google に送信して詳細なスキャンを行えるようにする</translation> +<translation id="9012101302849557459">Chrome アプリのサポートを <ph name="MS_WIN_NAME" />、<ph name="MAC_OS_NAME" />、<ph name="LINUX_OS_NAME" /> に拡張する。</translation> <translation id="9013875414788074110">ログイン時に、<ph name="PRODUCT_OS_NAME" /> は、サーバーに対して(オンライン)またはキャッシュに保存されたパスワードを使用して(オフライン)、認証を行うことができます。 このポリシーが -1 の値に設定されている場合、ユーザーは時間制限なくオフラインで認証を行うことができます。このポリシーが -1 以外の値に設定されている場合、その値は、ユーザーがオンライン認証を行ってから再度オンライン認証を行うことが必要になるまでの時間を表します。
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 66f63a2..374efa5 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -3572,13 +3572,6 @@ <translation id="482803100714220060">전체 URL 표시</translation> <translation id="4832852360828533362">사용자 및 기기 보고</translation> <translation id="4834526953114077364">충분한 여유 공간을 확보할 때까지 지난 3개월 이내에 로그인하지 않은 사용자 중 가장 오래된 사용자가 삭제됩니다.</translation> -<translation id="483544442646753291"><ph name="SYSTEM_FEATURES_DISABLE_LIST" /> 목록에 있는 사용 중지된 기능의 사용자 환경을 제어합니다. - - 정책을 '차단됨'으로 설정하면 사용 중지된 기능이 사용할 수 없게 되지만 여전히 사용자에게 표시됩니다. - - 정책을 '숨김'으로 설정하면 사용 중지된 기능이 사용할 수 없게 되며 사용자에게 표시되지도 않습니다. - - 정책을 설정하지 않거나 정책에 유효하지 않은 값이 있으면 시스템 기능의 사용 중지 모드가 '차단'됩니다.</translation> <translation id="4835470005923546373">기본적으로 배경 그래픽 인쇄 모드 사용 안 함</translation> <translation id="4835622243021053389">NTLMv2 인증을 사용합니다.</translation> <translation id="4840015507504937941">이 정책은 DataLeakPreventionRulesList 정책에서 정의된 클립보드 제한 규칙을 기준으로 확인될 클립보드 데이터의 최소 데이터 크기(단위: 바이트)를 설정합니다. @@ -4469,9 +4462,6 @@ 정책을 False로 설정하거나 설정하지 않으면 정보가 보고되지 않습니다. True로 설정하면 기기의 VPD 정보가 보고됩니다. VPD(필수 제품 데이터)는 기기와 관련된 구성 및 정보 데이터(예: 부품 및 일련번호)의 모음입니다.</translation> -<translation id="576158229686912964">이 정책은 M96부터 지원이 중단됩니다. 대신 <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> 및 <ph name="REPORT_DEVICE_NETWORK_STATUS" /> 정책을 사용해 주세요. - - 정책을 사용으로 설정하거나 설정하지 않으면 등록된 기기에서 네트워크 인터페이스 목록을 보고하며 유형 및 하드웨어 주소도 보고됩니다. 정책을 사용 안함으로 설정하면 등록된 기기에서 네트워크 인터페이스를 보고하지 않습니다.</translation> <translation id="5762969307102447459">주소 입력 시 자동 완성 사용 안함</translation> <translation id="5765780083710877561">설명:</translation> <translation id="5766438888216077649"><ph name="BLANK_PAGE_NAME" />을(를) 타겟팅하는 링크의 경우 <ph name="WINDOW_OPENER_PROPERTY" /> 속성을 설정하지 않음</translation> @@ -6153,9 +6143,6 @@ 설정하지 않으면 엔터프라이즈 관리 사용자의 경우 <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />, 관리되지 않는 사용자의 경우 <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />로 기본 설정됩니다. 나중에 <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> 값을 사용해 <ph name="LACROS_NAME" />를 <ph name="PRODUCT_OS_NAME" />에서 사용 가능한 유일한 브라우저로 지정할 수 있습니다.</translation> -<translation id="7509761893401042250">이 정책은 M96부터 지원이 중단됩니다. 대신 <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" />, <ph name="REPORT_DEVICE_AUDIO_STATUS" /> 정책을 사용해 주세요. - - 정책을 사용 설정하거나 설정하지 않으면 등록된 기기에서 CPU/RAM 사용 등의 하드웨어 통계를 보고합니다. 정책을 사용 중지하면 등록된 기기에서 하드웨어 통계를 보고하지 않습니다.</translation> <translation id="7512065400265675158"><ph name="USER_AGENT_HEADER_NAME" /> HTTP 요청 헤더가 축소될 예정입니다. 이 정책은 원활한 테스트 및 호환성을 위해 모든 웹사이트에서 축소 기능을 사용 설정하거나, 오리진 트라이얼 또는 필드 트라이얼을 통해 이를 사용하는 기능을 사용 중지할 수 있습니다. <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />와 관련 일정에 관해 자세히 알아보려면 다음 페이지를 참고하세요. @@ -7183,13 +7170,6 @@ 정책이 True로 설정되어 있으면 5분 이상 백그라운드에 있는 탭이 중단될 수 있습니다. 탭이 중단되면 CPU, 배터리, 메모리 사용량이 줄어듭니다. <ph name="PRODUCT_NAME" />은(는) 휴리스틱을 사용하여 백그라운드에서 유용한 작업(예: 디스플레이 알림, 사운드 재생, 동영상 스트리밍)을 하는 탭이 중단되지 않도록 합니다. 웹 개발자는 사이트가 중단되지 않도록 선택할 수도 있습니다(https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). False로 설정되어 있으면 어떠한 탭도 중단되지 않습니다.</translation> -<translation id="8619480582976056396">정책을 설정하면 URL이 금지된 웹페이지를 로드할 수 없습니다. 정책에는 금지된 URL을 지정하는 URL 패턴 목록이 있습니다. 정책을 설정하지 않으면 브라우저에서 어떤 URL도 금지되지 않습니다. URL 패턴 형식을 https://www.chromium.org/administrators/url-blocklist-filter-format 형식에 따라 지정합니다. <ph name="URL_ALLOWLIST_POLICY_NAME" />에서는 예외를 최대 1,000개까지 정의할 수 있습니다. - - <ph name="PRODUCT_NAME" /> 버전 73부터 javascript://* URL을 차단할 수 있지만 이는 주소 표시줄 또는 북마크릿 등에 입력된 자바스크립트에만 영향을 줍니다. 데이터가 동적으로 로드되는 인페이지 자바스크립트 URL에는 이 정책이 적용되지 않습니다. 예를 들어, example.com/abc를 차단해도 example.com에서 XMLHTTPRequest를 사용하여 여전히 example.com/abc를 로드할 수 있습니다. - - <ph name="PRODUCT_NAME" /> 버전 92부터 이 정책이 헤드리스 모드에서도 지원됩니다. - - 참고: 내부 chrome://* URL을 차단하면 예기치 못한 오류가 발생할 수 있습니다.</translation> <translation id="8619748440665904084">처음 실행 시 양식 자동 완성 데이터 가져오기 사용 중지</translation> <translation id="8623672932476443039">정책을 사용으로 설정하면 사용자가 분리된 앱 개발자 모드를 사용할 수 있습니다. 정책을 사용 안함으로 설정하면 사용자가 해당 기능에 액세스할 수 없게 됩니다. @@ -7336,9 +7316,6 @@ <translation id="8807313206348471682">로그아웃 확인 대화상자 표시</translation> <translation id="8812091410765157924">팝업이 열리는 페이지가 팝업 상호작용을 명시적으로 수락하는 경우 <ph name="BLANK_PAGE_NAME" /> 대상으로 열리는 팝업만 팝업을 표시하는 페이지와 상호작용하도록 허용</translation> <translation id="8816370949847593408">지원 중단 출시 상태에 따라 Chrome 앱이 실행되지 않을 수도 있습니다.</translation> -<translation id="8818173863808665831">기기의 지리적 위치를 신고합니다. - - 정책이 설정되지 않았거나 잘못 설정되어 있으면 위치가 신고되지 않습니다.</translation> <translation id="8818768076343557335">이동통신망을 사용하지 않는 모든 네트워크의 네트워크 활동을 예측합니다. (50에서 중지되고 52에서 삭제됩니다. 52가 넘은 경우 값을 1로 설정해도 0으로 처리됩니다. 모든 네트워크 연결 시 네트워크 활동을 예측합니다.)</translation> <translation id="8821678641132607468">정책을 '사용'으로 설정하면 최초 실행 시 이전 기본 브라우저의 방문 기록을 가져옵니다. 정책을 '사용 안함'으로 설정하거나 설정하지 않으면 최초 실행 시 방문 기록을 가져오지 않습니다.
diff --git a/components/policy/resources/policy_templates_nl.xtb b/components/policy/resources/policy_templates_nl.xtb index b599471..06d3707 100644 --- a/components/policy/resources/policy_templates_nl.xtb +++ b/components/policy/resources/policy_templates_nl.xtb
@@ -3511,13 +3511,6 @@ <translation id="482803100714220060">Volledige URL's tonen</translation> <translation id="4832852360828533362">Gebruikers- en apparaatrapporten</translation> <translation id="4834526953114077364">De gebruikers die het langst geleden gebruikt zijn en gedurende de laatste drie maanden niet zijn ingelogd, worden verwijderd totdat er voldoende vrije ruimte is</translation> -<translation id="483544442646753291">Hiermee beheer je de gebruikerservaring voor uitgezette functies die worden vermeld in <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Als je dit beleid instelt op Geblokkeerd, kunnen gebruikers de uitgezette functies niet gebruiken maar wel zien. - - Als je dit beleid instelt op Verborgen, kunnen gebruikers de uitgezette functies niet gebruiken en niet zien. - - Als je dit beleid niet instelt of instelt op een ongeldige waarde, wordt de stand voor het uitzetten van systeemfuncties geblokkeerd.</translation> <translation id="4835470005923546373">Modus voor afdrukken met achtergrondbeelden standaard uitzetten</translation> <translation id="4835622243021053389">NTLMv2-verificatie aanzetten.</translation> <translation id="4840015507504937941">Met dit beleid stel je de minimale gegevensgrootte (in bytes) in van de gegevens op het klembord die worden gecheckt aan de hand van de klembordbeperkingsregels die zijn gedefinieerd in het beleid DataLeakPreventionRulesList. @@ -4136,6 +4129,7 @@ <translation id="5464816904705580310">Hiermee configureer je instellingen voor beheerde gebruikers.</translation> <translation id="5466596281866046569">App-gegevens melden</translation> <translation id="546726650689747237">Vertraging van dimmen van scherm wanneer op netstroom wordt gewerkt</translation> +<translation id="546830339470589966">Domein automatisch aanvullen voor nieuwe Kerberos-tickets</translation> <translation id="5469143988693423708">Gebruiker mag Crostini uitvoeren</translation> <translation id="5469825884154817306">Afbeeldingen blokkeren op deze sites</translation> <translation id="5470500958458209831">De URL waar het Ansible-playbook kan worden gedownload.</translation> @@ -4394,9 +4388,6 @@ Als het beleid is ingesteld op False of niet is ingesteld, worden de gegevens niet gerapporteerd. Als het beleid is ingesteld op True, worden de VPD-gegevens van het apparaat gerapporteerd. VPD (Vital Product Data) is een verzameling configuratiegegevens en informatie, zoals onderdeel- en serienummers, die bij het apparaat horen.</translation> -<translation id="576158229686912964">Dit beleid is beëindigd in M96. Gebruik in plaats daarvan <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> en <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Als je het beleid toepast of niet instelt, rapporteren ingeschreven apparaten de lijst met netwerkinterfaces, met zowel het type als het hardwareadres. Als je het beleid niet toepast, rapporteren ingeschreven apparaten de netwerkinterface niet.</translation> <translation id="5762969307102447459">Automatisch invullen voor adressen uitzetten</translation> <translation id="5765780083710877561">Beschrijving:</translation> <translation id="5766438888216077649"><ph name="WINDOW_OPENER_PROPERTY" /> niet instellen voor links die <ph name="BLANK_PAGE_NAME" /> targeten</translation> @@ -4964,6 +4955,10 @@ Als dit beleid niet is ingesteld voor een site, is het beleid van <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> van toepassing op de site (als dit is ingesteld), anders worden de standaardinstellingen van de browser gevolgd en kunnen gebruikers per site kiezen of ze dit recht willen verlenen.</translation> <translation id="6384542789059421431">Weergave van resultatenpagina's van standaard zoekmachine in een zijvenster van de browser aanzetten.</translation> <translation id="6394350458541421998">Dit beleid wordt niet meer gebruikt sinds <ph name="PRODUCT_OS_NAME" /> versie 29. Gebruik het beleid PresentationScreenDimDelayScale.</translation> +<translation id="6396956366662970339">Geeft aan of een model voor aangepast opladen het oplaadproces mag onderbreken om de batterijduur te verlengen. + + Als het apparaat gebruikmaakt van wisselstroom, evalueert het model voor aangepast opladen of het oplaadproces moet worden onderbroken om de batterijduur te verlengen. Onderbreekt het model voor aangepast opladen het oplaadproces, dan wordt de batterij op een bepaald niveau gehouden (bijv. 80%) en wordt het apparaat helemaal opgeladen als de gebruiker dat nodig heeft. + Als je dit beleid instelt op True, wordt het model voor aangepast opladen aangezet en mag dit het oplaadproces onderbreken om de batterijduur te verlengen. Als je dit beleid instelt op False of niet instelt, heeft het model voor aangepast opladen geen invloed op het oplaadproces.</translation> <translation id="6397588391180665797">De netwerkconfiguratie van gebruikers op ingeschreven apparaten rapporteren. Als je het beleid instelt op False, worden de gegevens niet gerapporteerd. @@ -6058,9 +6053,6 @@ Als het beleid niet is ingesteld, is <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> de standaard voor gebruikers die op ondernemingsniveau worden beheerd en <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> voor niet-beheerde gebruikers. In de toekomst kun je van <ph name="LACROS_NAME" /> de enige beschikbare browser in <ph name="PRODUCT_OS_NAME" /> maken met de waarde <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Dit beleid is beëindigd vanaf M96. Gebruik in plaats daarvan <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> en <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Als je het beleid toepast of niet instelt, rapporteren ingeschreven apparaten hardwarestatistieken, zoals het CPU/RAM-gebruik. Als je het beleid niet toepast, rapporteren ingeschreven apparaten de hardwarestatistieken niet.</translation> <translation id="7512065400265675158">De <ph name="USER_AGENT_HEADER_NAME" /> HTTP-verzoekheader wordt volgens planning ingekort. Dit beleid kan de inkortfunctie voor alle websites aanzetten of de mogelijkheid uitzetten dat origin trials of field trials de functie aanzetten. Dit wordt gedaan om tests en compatibiliteit mogelijk te maken. Lees het volgende voor meer informatie over <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> en de bijbehorende tijdlijn: @@ -6297,6 +6289,10 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor gedetailleerde informatie over geldige <ph name="URL_LABEL" />-patronen. Dit beleid zoekt alleen overeenkomsten op basis van de herkomst, dus elk pad in het URL-patroon wordt genegeerd.</translation> <translation id="7771298620150437359">Voorkeurstalen en hun volgorde instellen</translation> +<translation id="7773790010815041731">Chrome-apps zijn beëindigd op <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> en <ph name="LINUX_OS_NAME" />. + Als je dit beleid toepast, staat <ph name="PRODUCT_NAME" /> nog steeds toe dat Chrome-apps worden uitgevoerd op deze platforms, tot de einddatum van juni 2022. Op dat moment wordt ondersteuning voor Chrome-apps op alle platforms verwijderd. + Als je dit beleid niet toepast of niet instelt, kunnen Chrome-apps misschien niet worden uitgevoerd, afhankelijk van de status van de uitrol van de beëindiging. + In beide gevallen zijn Chrome-apps die door het beleid afgedwongen worden geïnstalleerd, nog steeds toegestaan.</translation> <translation id="7774768074957326919">Proxyinstellingen van het systeem gebruiken</translation> <translation id="777734450201217641">Zet snelkoppelingen voor toegankelijkheidsfuncties aan op het inlogscherm. @@ -7078,13 +7074,6 @@ Als het beleid is ingesteld op 'True', kunnen tabbladen die minimaal vijf minuten op de achtergrond actief zijn worden vastgezet. Het vastzetten van tabbladen verlaagt het CPU-, batterij- en geheugengebruik. <ph name="PRODUCT_NAME" /> gebruikt bepaalde methoden om te voorkomen dat tabbladen worden vastgezet die nuttig werk op de achtergrond leveren (zoals meldingen tonen, geluid afspelen en video streamen). Webontwikkelaars kunnen daarnaast hun toestemming intrekken voor het vastzetten van hun site (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Als het beleid is ingesteld op 'False', worden er geen tabbladen vastgezet.</translation> -<translation id="8619480582976056396">Als je het beleid instelt, wordt voorkomen dat webpagina's met verboden URL's worden geladen. Het beleid biedt een lijst met URL-patronen die verboden URL's definiëren. Als je het beleid niet instelt, worden er geen URL's verboden in de browser. Gebruik een notatie voor het URL-patroon volgens deze indeling (https://www.chromium.org/administrators/url-blocklist-filter-format). Er kunnen maximaal 1000 uitzonderingen worden gedefinieerd in <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - Vanaf <ph name="PRODUCT_NAME" /> versie 73 kun je javascript://* URL's blokkeren. Maar dit heeft alleen gevolgen voor JavaScript die wordt opgegeven in de adresbalk (of bijvoorbeeld bookmarklets). In-page JavaScript-URL's met dynamisch geladen gegevens vallen niet onder dit beleid. Als je bijvoorbeeld example.com/abc blokkeert, kan de pagina example.com nog steeds example.com/abc laden via XMLHTTPRequest. - - Vanaf <ph name="PRODUCT_NAME" /> versie 92 wordt dit beleid ook ondersteund in de stand zonder interface. - - Opmerking: Het blokkeren van interne chrome://* URL's kan tot onverwachte fouten leiden.</translation> <translation id="8619748440665904084">Import van formuliergegevens voor automatisch invullen bij eerste uitvoering uitzetten</translation> <translation id="8623672932476443039">Als je het beleid toepast, hebben gebruikers toegang tot de ontwikkelaarsmodus voor geïsoleerde apps. Als je het beleid niet toepast, hebben gebruikers geen toegang tot deze mogelijkheden. @@ -7233,9 +7222,6 @@ <translation id="8807313206348471682">Het bevestigingsdialoogvenster voor uitloggen tonen</translation> <translation id="8812091410765157924">Alleen toestaan dat pop-ups die zijn geopend met het doel <ph name="BLANK_PAGE_NAME" />, interactie hebben met de pagina die de pop-up heeft geopend als de openende pagina expliciet toestemming geeft voor dergelijke interactie</translation> <translation id="8816370949847593408">Afhankelijk van de status van de uitrol van de beëindiging kun je mogelijk geen Chrome-apps uitvoeren.</translation> -<translation id="8818173863808665831">De geografische locatie van het apparaat rapporteren. - - Als het beleid niet is ingesteld of is ingesteld op 'false', wordt de locatie niet gerapporteerd.</translation> <translation id="8818768076343557335">Netwerkacties voorspellen op elk netwerk dat niet mobiel is. (Beëindigd in 50, verwijderd in 52. Als na 52 waarde 1 is ingesteld, wordt deze waarde verwerkt als 0 - netwerkacties voorspellen voor elke netwerkverbinding.)</translation> <translation id="8821678641132607468">Als je het beleid toepast, wordt de browsegeschiedenis van de vorige standaardbrowser geïmporteerd bij de eerste uitvoering. Als je het beleid niet toepast of niet instelt, wordt de browsegeschiedenis niet geïmporteerd bij de eerste uitvoering. @@ -7414,6 +7400,7 @@ Ga naar https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns voor meer informatie over geldige invoerpatronen. <ph name="WILDCARD_VALUE" /> is geen geaccepteerde waarde voor dit beleid. Dit beleid zoekt alleen overeenkomsten op basis van de herkomst, dus elk pad in het URL-patroon wordt genegeerd.</translation> <translation id="9010080992450148617">Downloads naar Google sturen voor uitgebreide scans voor gebruikers die zijn ingeschreven voor Geavanceerde beveiliging</translation> +<translation id="9012101302849557459">Ondersteuning voor Chrome-apps op <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> en <ph name="LINUX_OS_NAME" /> uitbreiden.</translation> <translation id="9013875414788074110">Tijdens het inloggen kan <ph name="PRODUCT_OS_NAME" /> de verificatie uitvoeren met behulp van een server (online) of door gebruik te maken van een gecachet wachtwoord (offline). Wanneer voor dit beleid de waarde -1 is ingesteld, kan de gebruiker zich offline oneindig verifiëren. Wanneer er een andere waarde voor dit beleid is opgegeven, wordt hiermee aangegeven na hoeveel tijd sinds de meest recente online verificatie de gebruiker opnieuw een online verificatie moet uitvoeren.
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index 4c64eae..838ae5b4 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -3564,13 +3564,6 @@ <translation id="482803100714220060">Exibir URLs completos</translation> <translation id="4832852360828533362">Relatórios de usuário e do dispositivo</translation> <translation id="4834526953114077364">Os usuários menos utilizados recentemente que não se conectaram nos últimos três meses serão removidos até que haja espaço livre suficiente</translation> -<translation id="483544442646753291">Controla a experiência do usuário com recursos desativados na <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Se a política for definida como "bloqueada", os recursos desativados não poderão ser utilizados, mas estarão visíveis para os usuários. - - Se ela for definida como "oculta", os recursos desativados não poderão ser utilizados e ficarão invisíveis para os usuários. - - Se a política for deixada sem definição ou tiver um valor inválido, o modo de desativação de recursos do sistema será "bloqueado".</translation> <translation id="4835470005923546373">Desativar modo de impressão de gráficos de segundo plano por padrão</translation> <translation id="4835622243021053389">Ativar autenticação NTLMv2.</translation> <translation id="4840015507504937941">Esta política define o tamanho mínimo (em bytes) dos dados da área de transferência que serão verificados de acordo com as regras de restrição definidas na política DataLeakPreventionRulesList. @@ -4188,6 +4181,7 @@ <translation id="5464816904705580310">Definir configurações para usuários gerenciados.</translation> <translation id="5466596281866046569">Relatar informações sobre aplicativos</translation> <translation id="546726650689747237">Intervalo de escurecimento da tela no funcionamento com alimentação CA</translation> +<translation id="546830339470589966">Domínio de preenchimento automático para novos tíquetes do Kerberos</translation> <translation id="5469143988693423708">O usuário tem permissão para executar o Crostini</translation> <translation id="5469825884154817306">Bloquear imagens nestes sites</translation> <translation id="5470500958458209831">O URL no qual o download do playbook Ansible pode ser feito.</translation> @@ -4456,9 +4450,6 @@ Se a política for definida como falsa ou se não for definida, as informações não serão enviadas. Se ela for definida como verdadeira, as informações sobre os VPD do dispositivo serão enviadas. Os VPD são um conjunto de dados informativos e de configuração, como números de série e peças, associados ao dispositivo.</translation> -<translation id="576158229686912964">Esta política foi descontinuada no M96. Use as políticas <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> e <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Se a política for ativada ou deixada sem definição, a lista de interfaces de rede com os tipos e endereços de hardware será informada pelos dispositivos registrados. Se a política for desativada, a interface de rede não será informada pelos dispositivos registrados.</translation> <translation id="5762969307102447459">Desativar o preenchimento automático de endereços</translation> <translation id="5765780083710877561">Descrição:</translation> <translation id="5766438888216077649">Não defina a propriedade <ph name="WINDOW_OPENER_PROPERTY" /> para links direcionados a <ph name="BLANK_PAGE_NAME" /></translation> @@ -5051,6 +5042,10 @@ Se esta política for deixada sem definição para um site, a política de <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> será aplicada, se configurada. Caso contrário, a permissão vai seguir os padrões do navegador e autorizar a escolha dos usuários para cada site.</translation> <translation id="6384542789059421431">Ativar a exibição de páginas de resultados do mecanismo de pesquisa padrão em um painel lateral do navegador.</translation> <translation id="6394350458541421998">Esta política teve o uso suspenso a partir da versão 29 do <ph name="PRODUCT_OS_NAME" />. Em vez dela, use a política PresentationScreenDimDelayScale.</translation> +<translation id="6396956366662970339">Especifica se um modelo de carregamento adaptável tem permissão para controlar o processo de carregamento e prolongar a vida útil da bateria. + + Quando o dispositivo está no carregamento adaptável, o modelo avalia se o processo precisa desse controle. Quando o modelo controla o processo de carregamento, ele mantém a bateria carregada até certo nível, como 80%, e só carrega o dispositivo até 100% quando o usuário precisa. + Se esta política for definida como verdadeira, o modelo de carregamento adaptável vai ser ativado e terá permissão para controlar o processo e prolongar a vida útil da bateria. Se a política for definida como falsa ou for deixada sem definição, o modelo de carregamento adaptável não vai influenciar no processo.</translation> <translation id="6397588391180665797">Informar a configuração de rede dos usuários em dispositivos registrados. Se a política for definida como falsa, as informações não serão enviadas. @@ -6143,9 +6138,6 @@ Se a política for deixada sem definição, o padrão será <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> para usuários gerenciados por empresas e <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> para usuários não gerenciados. No futuro, será possível fazer com que o <ph name="LACROS_NAME" /> seja o único navegador disponível no <ph name="PRODUCT_OS_NAME" /> usando o valor <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Esta política foi descontinuada no M96. Use as políticas <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> e <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Se a política for ativada ou for deixada sem definição, as estatísticas de hardware, como o uso de CPU/RAM, serão informadas pelos dispositivos registrados. Se a política for desativada, as estatísticas de hardware não serão informadas pelos dispositivos registrados.</translation> <translation id="7512065400265675158">O cabeçalho da solicitação HTTP <ph name="USER_AGENT_HEADER_NAME" /> foi programado para redução. Para facilitar os testes e a compatibilidade, esta política pode ativar o recurso de redução em todos os sites ou desativar os testes de origem ou campo para permitir a ativação do recurso. Para saber mais sobre o recurso <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> e o cronograma relacionado, acesse este link: @@ -6384,6 +6376,10 @@ Para informações detalhadas sobre padrões de <ph name="URL_LABEL" /> válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. A política só faz a correspondência com base na origem, então os caminhos no padrão do URL serão ignorados.</translation> <translation id="7771298620150437359">Configurar o conteúdo e a ordem dos idiomas preferidos</translation> +<translation id="7773790010815041731">Os apps do Chrome foram descontinuados no <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />. + Se esta política for ativada, o <ph name="PRODUCT_NAME" /> vai continuar permitindo a execução de apps do Chrome nessas plataformas até que o suporte a eles seja removido de na data final, em junho de 2022. + Se esta política for desativada ou deixada sem definição, é possível que a execução de apps do Chrome seja bloqueada, dependendo do status da descontinuação. + Nos dois casos, a execução dos apps do Chrome que forem instalados à força por políticas ainda vai ser permitida.</translation> <translation id="7774768074957326919">Usar configurações de proxy do sistema</translation> <translation id="777734450201217641">Ative atalhos de recursos de acessibilidade na tela de login. @@ -7169,13 +7165,6 @@ Se a política for definida como verdadeira, as guias que estiverem em segundo plano há pelo menos 5 minutos poderão ser congeladas. O congelamento de guias reduz o uso de CPU, bateria e memória. O <ph name="PRODUCT_NAME" /> usa a heurística para evitar o congelamento de guias que fazem um bom trabalho em segundo plano (por exemplo, exibir notificações, reproduzir som, fazer streaming de vídeo). Os desenvolvedores da Web também podem desativar o congelamento nos respectivos sites (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Se a política for definida como falsa, nenhuma guia será congelada.</translation> -<translation id="8619480582976056396">A definição da política impede que páginas da Web com URLs proibidos sejam carregadas. Ela fornece uma lista de padrões de URL que especificam URLs proibidos. Deixar a política sem definição significa que nenhum URL será proibido no navegador. Formate o padrão de URL da maneira descrita em https://www.chromium.org/administrators/url-blocklist-filter-format. Até 1.000 exceções podem ser definidas na <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - A partir da versão 73 do <ph name="PRODUCT_NAME" />, é possível bloquear URLs "javascript://*". No entanto, isso só afeta JavaScript inserido na barra de endereço (ou, por exemplo, bookmarklets). URLs com JavaScript na página que tenham dados dinamicamente carregados não estarão sujeitos a esta política. Por exemplo, se você bloquear example.com/abc, ainda será possível carregar example.com/abc na página example.com usando XMLHTTPRequest. - - A partir da versão 92 do <ph name="PRODUCT_NAME" />, esta política também será compatível com o modo headless. - - Observação: bloquear URLs chrome://* internos pode causar erros inesperados.</translation> <translation id="8619748440665904084">Desativar a importação de dados de preenchimento automático de formulários na primeira execução</translation> <translation id="8623672932476443039">Se a política for definida como "Ativada", os usuários vão poder acessar o modo de desenvolvedor para apps isolados. Se a política for definida como "Desativada", os usuários não vão conseguir acessar esses recursos. @@ -7324,9 +7313,6 @@ <translation id="8807313206348471682">Exibir a caixa de diálogo para confirmação de saída</translation> <translation id="8812091410765157924">Permitir que os pop-ups abertos direcionados a <ph name="BLANK_PAGE_NAME" /> interajam com a página que solicitou a abertura do pop-up caso ela aceite essa interação explicitamente</translation> <translation id="8816370949847593408">A execução de apps do Chrome pode ser bloqueada, dependendo do status da descontinuação.</translation> -<translation id="8818173863808665831">Informar a localização geográfica do dispositivo. - - Se a política não for configurada, ou for configurada como falsa, o local não será informado.</translation> <translation id="8818768076343557335">Prever ações de rede em qualquer rede que não seja a de celular. Uso suspenso na versão 50 e removido na 52. Depois da versão 52, se o valor 1 for definido, ele será tratado como 0: prever ações de rede em qualquer conexão de rede.</translation> <translation id="8821678641132607468">Se a política for definida como ativada, o histórico de navegação será importado do navegador padrão anterior durante a primeira execução. Se a política for definida como desativada ou não for definida, o histórico de navegação não será importado durante a primeira execução. @@ -7505,6 +7491,7 @@ Para informações detalhadas sobre padrões de entrada válidos, consulte https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> não é um valor aceitável para esta política. A política só faz a correspondência de origens, então os caminhos no padrão do URL serão ignorados.</translation> <translation id="9010080992450148617">Ativar o envio de downloads ao Google para verificação detalhada por usuários inscritos no Programa Proteção Avançada</translation> +<translation id="9012101302849557459">Oferecer suporte para apps do Chrome no <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> e <ph name="LINUX_OS_NAME" />.</translation> <translation id="9013875414788074110">Durante o login, o <ph name="PRODUCT_OS_NAME" /> pode fazer autenticação em um servidor (on-line) ou usando uma senha armazenada em cache (off-line). Quando esta política for definida para um valor de -1, o usuário poderá fazer a autenticação off-line indefinidamente. Quando esta política for definida como qualquer outro valor, ela especificará quanto tempo após a última autenticação on-line o usuário precisará usar novamente esse tipo de autenticação.
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index f3f84b4..9d98d8e 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -260,6 +260,7 @@ Если правило не настроено или значение не является допустимым именем хоста, то имя хоста не передается в DHCP-запросе.</translation> <translation id="1257550411839719984">Выбор каталога для скачивания по умолчанию</translation> <translation id="1265053460044691532">Ограничить время, на протяжении которого пользователи, выполнившие аутентификацию по протоколу SAML, могут входить в аккаунт офлайн</translation> +<translation id="1271811620059192171">Включить мини-группы правил</translation> <translation id="127264587838521316">Включить отправку запросов об установке расширений <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Включить переход устройств Chromad под облачное управление</translation> <translation id="1274997165432133392">Файлы cookie и другие данные сайтов</translation> @@ -2874,6 +2875,7 @@ Если правило отключено или не настроено, пользователю предлагается указать сертификат, только когда нет сертификатов, соответствующих правилу автоматического выбора.</translation> <translation id="3950110092991281616">Включить пассивную аутентификацию только для обычных сеансов</translation> <translation id="3950239119790560549">Правило ограничивает время поиска обновлений</translation> +<translation id="3956243291190637924">Скрывать заголовки и колонтитулы в окне предварительного просмотра печати</translation> <translation id="3956573780915784996">Разрешить пользователям сбор данных отслеживания производительности на уровне системы</translation> <translation id="3956686688560604829">Использовать правило SiteList из Internet Explorer для расширения "Поддержка альтернативного браузера"</translation> <translation id="3958586912393694012">Разрешить использование функции Smart Lock</translation> @@ -3121,6 +3123,18 @@ Если правило выключено или не настроено, пользователи могут переносить файлы на Диск по мобильной сети.</translation> <translation id="4248277954659222481">Разрешить автоматически воспроизводить видео на страницах из белого списка шаблонов URL</translation> <translation id="4250680216510889253">Нет</translation> +<translation id="4259636715493757956">Это правило позволяет настроить параметры списка URL аутентификации в <ph name="WEBVIEW_PRODUCT_NAME" />. + + Аутентификация с использованием этих URL выполняется в <ph name="WEBVIEW_PRODUCT_NAME" /> особым образом. Если для проверки подлинности на веб-странице, открытой в <ph name="WEBVIEW_PRODUCT_NAME" />, + нужно перейти по одному из указанных URL, запускается подходящее приложение для аутентификации от поставщика идентификационной информации. + + Это расширяет возможности поставщиков, например позволяет реализовать систему единого входа между приложениями + или повысить безопасность путем сбора данных с ненадежных устройств, чтобы определять состояние устройства во время аутентификации. + + Если на устройстве не установлено подходящее приложение для аутентификации, то переход по URL произойдет в <ph name="WEBVIEW_PRODUCT_NAME" />. + + Шаблон URL аутентификации должен быть оформлен в соответствии с требованиями на этой странице: https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Если правило включено, для каждого источника из списка, разделенного запятыми, запускается отдельный процесс, которому будет разрешено содержать документы только из этого источника и его субдоменов. Например, если вы укажете https://a1.example.com/, в этом же процессе можно будет запустить https://a2.a1.example.com/, но не https://example.com или https://b.example.com. Начиная с <ph name="PRODUCT_NAME" /> версии 77, диапазон источников, которые нужно изолировать, можно задать с помощью подстановочного знака. Например, если вы укажете https://[*.]corp.example.com, свой процесс будет выделяться для каждого источника, входящего в https://corp.example.com, включая сам домен https://corp.example.com, а также https://a1.corp.example.com и https://a2.a1.corp.example.com. @@ -3261,6 +3275,7 @@ <translation id="4432762137771104529">Включить передачу расширенных отчетов Безопасного просмотра</translation> <translation id="443454694385851356">Устаревшие (небезопасно)</translation> <translation id="443665821428652897">Удаление данных сайта при закрытии браузера (поддержка прекращена)</translation> +<translation id="4436941175475497595">Отключить предварительный просмотр печати</translation> <translation id="4439336120285389675">Выбор устаревших функций веб-платформы, которые необходимо включить заново. Это правило позволяет администраторам включить эти функции на ограниченное время. Функциям присвоены теги. Все функции с тегами, указанными в этом правиле, будут включены. @@ -3542,13 +3557,6 @@ <translation id="482803100714220060">Показ полных URL</translation> <translation id="4832852360828533362">Отчеты о пользователях и устройствах</translation> <translation id="4834526953114077364">Удалять неиспользуемые аккаунты, вход в которые не выполнялся ни разу за последние 3 месяца, пока на диске не освободится достаточно места</translation> -<translation id="483544442646753291">Позволяет задать параметры доступа пользователей к отключенным функциям, перечисленным в правиле <ph name="SYSTEM_FEATURES_DISABLE_LIST" />. - - Если выбрано значение blocked (заблокировано), отключенные функции станут недоступны, хотя и будут видны пользователям. - - Если задано значение hidden (скрыто), отключенные функции станут недоступны и будут скрыты. - - Если правило не настроено или задано неправильно, для отключенных системных функций будет использоваться значение blocked.</translation> <translation id="4835470005923546373">Отключить режим печати фоновых цветов и изображений по умолчанию</translation> <translation id="4835622243021053389">Включить аутентификацию NTLMv2</translation> <translation id="4840015507504937941">Это правило устанавливает для буфера обмена минимально допустимый объем данных (в байтах), который будет проверяться на соответствие требованиям по ограничению буфера обмена, определенным в правиле DataLeakPreventionRulesList. @@ -4301,6 +4309,7 @@ Примечание. Названия серверов нужно разделять запятыми. Допустимы подстановочные знаки (<ph name="WILDCARD_VALUE" />).</translation> <translation id="5645779841392247734">Разрешить файлы cookie на этих сайтах</translation> <translation id="5646234199535103501">Настройки коннектора OnBulkDataEntry для Chrome Enterprise</translation> +<translation id="5648016151508002741">Запретить онлайн-проверки <ph name="OCSP_CRL_LABEL" /></translation> <translation id="5649046890958064703">Если в правиле <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_BLACKLIST" />, правило <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> определяет принтеры, с которыми не может работать пользователь. Пользователям запрещено работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Это правило больше не поддерживается. Используйте вместо него правило <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation> @@ -4435,9 +4444,6 @@ Если правило не настроено или задано значение False, сведения не отправляются. Если указано значение True, данные передаются. VPD – это набор общих сведений (например, серийных номеров и кодов деталей) и данных о настройке, которые связаны с устройством.</translation> -<translation id="576158229686912964">Поддержка этого правила прекращена в версии M96. Используйте вместо него правила <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> и <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Если правило включено или не настроено, зарегистрированные устройства отправляют список сетевых интерфейсов с указанием их типов и адресов оборудования. Если правило отключено, эти данные не передаются.</translation> <translation id="5762969307102447459">Запретить автозаполнение адресов</translation> <translation id="5765780083710877561">Описание:</translation> <translation id="5766438888216077649">Не задавать свойство <ph name="WINDOW_OPENER_PROPERTY" /> для ссылок, открывающихся с использованием target="<ph name="BLANK_PAGE_NAME" />"</translation> @@ -4567,6 +4573,7 @@ <translation id="5893303508158298667">Если правило <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> не выключено, то включенное или ненастроенное правило <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> позволяет удаленным клиентам устанавливать соединение с этим компьютером через серверы ретрансляции, когда не удается подключиться напрямую (например, из-за ограничений брандмауэра). Если правило отключено, то удаленный доступ разрешен, но подключаться можно только из той же сети. При этом ретрансляция и протокол NAT Traversal недоступны.</translation> +<translation id="5897234314586602143">Показывать заголовки и колонтитулы в окне предварительного просмотра печати</translation> <translation id="5897913798715600338">Использовать технологию быстрой зарядки</translation> <translation id="5898486742390981550">Если в систему вошло несколько пользователей, приложения Android доступны только основному.</translation> <translation id="5899751601113377553">Заблокировать использование браузера <ph name="LACROS_NAME" /></translation> @@ -5084,6 +5091,13 @@ <translation id="6478258366184919502">Источники изображений экрана входа</translation> <translation id="6478261301433199402">Правило позволяет настроить образ <ph name="PLUGIN_VM_NAME" /> для пользователя. Чтобы настроить правило, укажите в формате JSON <ph name="URL_PLUGIN_VM_IMAGE_FIELD" />, по которому можно скачать образ на устройство, а также хеш SHA-256 в поле <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> для проверки целостности файла.</translation> <translation id="6481245670325946423">Разрешить использование режима консольного браузера</translation> +<translation id="648158446793103284">Это правило позволяет пользователям выбрать один из перечисленных вами способов ввода для сеансов в <ph name="PRODUCT_OS_NAME" />. + + Если правило не настроено или указан пустой список, пользователь может выбирать любой из поддерживаемых способов ввода. + + В M106 и более поздних версиях разрешенные способы ввода автоматически включаются в режиме киоска. + + Примечание. Если текущий способ ввода не поддерживается, будет использоваться аппаратная раскладка клавиатуры (если это разрешено) или первый подходящий способ из списка. Все недопустимые или неподдерживаемые способы ввода игнорируются.</translation> <translation id="6489084406497912050">Определяет, могут ли пользователи добавлять аккаунты Kerberos. Если правило не настроено или включено, пользователи могут добавлять аккаунты на странице настроек Kerberos. Пользователи полностью контролируют добавленные аккаунты, могут изменять их и удалять. @@ -5312,6 +5326,7 @@ Если значение False, то URL отображается в виде по умолчанию. Если значение не задано, URL отображается в виде по умолчанию, а пользователь может в контекстном меню выбрать вид URL в адресной строке. </translation> +<translation id="6670794785040100077">Запретить отправку документов на виртуальный принтер <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Разрешить пользователям менять фон на странице быстрого доступа</translation> <translation id="6672630473862787247">Включить пассивную аутентификацию для обычных и гостевых сеансов, а также режима инкогнито</translation> <translation id="6685903773201985073">Включить пассивную аутентификацию для гостевых и обычных сеансов</translation> @@ -5399,6 +5414,7 @@ Если правило <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> не настроено, для поисковых запросов используется метод GET.</translation> <translation id="6757613329154374267">Включить резервное копирование и восстановление</translation> <translation id="6758659208493449452">Это правило определяет, получают ли пользователи, зарегистрированные в программе Дополнительной защиты, доступ к расширенным функциям безопасности. Некоторые из этих функций предполагают отправку сведений в Google. Например, пользователи, зарегистрированные в программе Дополнительной защиты, могут отправлять скачиваемые файлы в Google для проверки на наличие вредоносного ПО. Если правило не настроено или задано значение True, пользователи, зарегистрированные в программе Дополнительной защиты, будут получать доступ к расширенным функциям безопасности. Если указано значение False, пользователи, зарегистрированные в программе Дополнительной защиты, будут получать доступ только к стандартным функциям.</translation> +<translation id="6763023079133439068">Разрешить сертификаты без расширения subjectAlternativeName, выданные локальными якорями доверия</translation> <translation id="6766216162565713893">Разрешить сайтам запрашивать доступ к находящимся поблизости Bluetooth-устройствам</translation> <translation id="6770454900105963262">Показывать информацию об активных сеансах киоска</translation> <translation id="6782977971207381602">Если правило включено, на устройстве с <ph name="PRODUCT_OS_NAME" /> можно запускать виртуальные машины. Чтобы использовать <ph name="PRODUCT_CROSTINI_NAME" />, необходимо включить правила <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> и <ph name="CROSTINI_ALLOWED_POLICY_NAME" />. Если правило выключено, на устройстве нельзя запускать виртуальные машины. Если выключить правило, оно начнет действовать при последующих попытках запустить любую виртуальную машину, но не будет распространяться на уже запущенные экземпляры. @@ -6019,6 +6035,7 @@ <translation id="7458437477941640506">Не выполнять откат к целевой версии, если на устройстве уже установлена более поздняя версия OC (обновления также будут отключены)</translation> <translation id="7459601923199346224">Устанавливает правила для управления сертификатами на уровне пользователя и устройства.</translation> <translation id="7459633275230216698">Разрешить использование диалоговых окон для выбора файлов</translation> +<translation id="7464058117970792805">Включить предварительный просмотр печати</translation> <translation id="7464991223784276288">Файлы cookie, сохраненные сайтами с URL из списка, удаляются после окончания сеанса</translation> <translation id="7468182772656807573">Правило позволяет задать частоту отправки сетевых пакетов в миллисекундах с интервалом от 30 секунд до 24 часов. Если указано число, которое не входит в этот диапазон, будет использоваться ближайшее подходящее значение. @@ -6114,9 +6131,6 @@ Если правило не настроено, для корпоративных аккаунтов по умолчанию задано значение <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />, а для остальных пользователей – значение <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />. В дальнейшем у пользователей появится возможность сделать браузер <ph name="LACROS_NAME" /> единственно доступным в <ph name="PRODUCT_OS_NAME" />, установив значение <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Поддержка этого правила прекращена в версии M96. Используйте вместо него правила <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> и <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Если правило включено или не настроено, зарегистрированные устройства отправляют статистические данные о работе аппаратного обеспечения, например об использовании процессора или оперативной памяти. Если правило отключено, эти данные не отправляются.</translation> <translation id="7512065400265675158">Заголовок HTTP-запроса <ph name="USER_AGENT_HEADER_NAME" /> планируется сократить. Чтобы упростить тестирование и обеспечить совместимость, это правило может включить функцию сокращения для всех сайтов или запретить возможность ее включения в пробных версиях или пробных версиях для источника. Дополнительная информация о функции <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> и этапах ее внедрения приведена на этой странице: @@ -6396,6 +6410,7 @@ <translation id="7823902813460802031">Если это правило включено, устройство <ph name="PRODUCT_OS_NAME" /> не сможет перейти в режим разработчика. Если правило выключено или не настроено, такое ограничение не действует.</translation> +<translation id="7824000841504721945">Отключить мини-группы правил</translation> <translation id="782661371433719637">Не разрешать сайтам запрашивать доступ на чтение файлов и каталогов через File System API</translation> <translation id="7827127381981620448">Приложение-платформа</translation> <translation id="7833148823006528332">Идентификатор приложения Android, например com.google.android.gm для Gmail.</translation> @@ -6481,6 +6496,7 @@ <translation id="793473937901685727">Настроить доступ к сертификатам для приложений ARC</translation> <translation id="7936302526928951356">Не фиксировать номер основной версии в строке агента пользователя</translation> <translation id="7937766917976512374">Включение или отключение функции захвата видео</translation> +<translation id="7941528208359969119">Разрешить онлайн-проверки <ph name="OCSP_CRL_LABEL" /></translation> <translation id="7941975817681987555">Никогда не предопределять параметры сети</translation> <translation id="7946350455013548764">Если задано значение "3", сайты могут запрашивать доступ к HID-устройствам. Если выбрано значение "2", доступ к HID-устройствам запрещен. @@ -6861,6 +6877,7 @@ Если правило <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> не настроено, для поисковых запросов используется метод GET.</translation> <translation id="8314214821702356835">Позволяет воспроизводить мультимедиа с заблокированного устройства</translation> +<translation id="8316940611391250886">Запретить сертификаты без расширения subjectAlternativeName</translation> <translation id="8319678975002906774">Устанавливает значения управляемой конфигурации для сайтов, соответствующих заданным источникам</translation> <translation id="8320149248919453401">Режим заряда батареи</translation> <translation id="8327651196906278510">Разрешить захват вкладки этими источниками</translation> @@ -7139,13 +7156,6 @@ Если для правила выбрано значение True, работа вкладок, которые были открыты в фоновом режиме 5 минут или дольше, может быть остановлена. Это позволит сократить использование памяти, а также ресурсов ЦП и батареи. На основе эвристических алгоритмов определяются вкладки, на которых в фоновом режиме выполняются полезные операции (например, отображаются уведомления, играет музыка или воспроизводится видео). <ph name="PRODUCT_NAME" /> не останавливает работу таких вкладок. Веб-разработчики могут также запретить остановку вкладок, на которых открыт их сайт (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Если выбрано значение False, вкладки всегда работают.</translation> -<translation id="8619480582976056396">Если настроить правило, страницы запрещенных URL не загружаются. В нем перечислены шаблоны запрещенных URL. Если правило не настроено, браузер не блокирует URL. Формат шаблона URL должен соответствовать требованиям, указанным на странице https://www.chromium.org/administrators/url-blocklist-filter-format. В правиле <ph name="URL_ALLOWLIST_POLICY_NAME" /> можно задавать не более 1000 исключений. - - В <ph name="PRODUCT_NAME" /> 73 и более поздних версиях можно блокировать URL формата javascript://*, однако такое правило будет влиять только на код JavaScript, который пользователь вводит в адресной строке браузера, и на некоторые другие элементы, например букмарклеты. Обратите внимание, что это правило не действует на URL со встроенным кодом JavaScript и динамически загружаемые данные. Например, если вы заблокируете адрес example.com/abc, сайт example.com по-прежнему сможет загрузить страницу example.com/abc, используя XMLHTTPRequest. - - Начиная с <ph name="PRODUCT_NAME" /> версии 92 это правило также поддерживается в режиме консольного браузера. - - Обратите внимание, что блокировать внутренние URL с префиксом chrome://* не рекомендуется: это может привести к непредвиденным ошибкам.</translation> <translation id="8619748440665904084">Запретить импорт данных для автозаполнения форм при первом запуске</translation> <translation id="8623672932476443039">Если правило включено, пользователям доступен режим разработчика изолированных приложений. Если правило отключено, этот режим недоступен. @@ -7294,9 +7304,6 @@ <translation id="8807313206348471682">Показывать диалоговое окно подтверждения выхода</translation> <translation id="8812091410765157924">Разрешить всплывающим окнам, открытым с использованием target="<ph name="BLANK_PAGE_NAME" />", взаимодействовать с открывшей их страницей, только если она явно предоставила согласие на это взаимодействие</translation> <translation id="8816370949847593408">Запуск приложений Chrome может быть запрещен (в зависимости от статуса прекращения поддержки)</translation> -<translation id="8818173863808665831">Отправка сведений о географическом местоположении устройства. - - Если это правило не настроено или настроено неверно, данные о местоположении не отправляются.</translation> <translation id="8818768076343557335">Предопределяет параметры сети только по Wi-Fi. Правило устарело в версии 50, удалено в версии 52. В более поздних версиях значение 1 приравнено к значению 0 ("Всегда предопределять параметры сети").</translation> <translation id="8821678641132607468">Если правило включено, при первом запуске будет импортирована история браузера, который ранее был основным. Если правило выключено или не настроено, история браузера не импортируется при первом запуске. @@ -7613,6 +7620,7 @@ <translation id="9135033364005346124">Включить прокси-сервер <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Отключить всплывающую подсказку о скачиваемых файлах</translation> <translation id="9136399279941091445">Время, когда не действуют правила, заданные для устройства</translation> +<translation id="9148720248753722892">Запретить сертификаты с подписью SHA-1</translation> <translation id="9150416707757015439">Это правило устарело, используйте вместо него правило IncognitoModeAvailability, активирующее режим инкогнито в <ph name="PRODUCT_NAME" />. Если оно включено или не настроено, просмотр веб-страниц в режиме инкогнито возможен, а если это правило отключено, режим инкогнито недоступен.</translation> <translation id="9152473318295429890">Правило определяет, увидит ли пользователь предложения похожих веб-страниц</translation> <translation id="9153446010242995516">Откатить до целевой версии и оставаться в ней, если установлена более поздняя версия ОС. По возможности перенести конфигурацию на уровне устройства (включая сетевые учетные данные). Выполнить откат и Powerwash, даже если восстановление данных невозможно (так как целевая версия не поддерживает восстановление данных и изменения будут выполнены без сохранения обратной совместимости).
diff --git a/components/policy/resources/policy_templates_th.xtb b/components/policy/resources/policy_templates_th.xtb index ef2ce971..80659e6 100644 --- a/components/policy/resources/policy_templates_th.xtb +++ b/components/policy/resources/policy_templates_th.xtb
@@ -258,6 +258,7 @@ การไม่ตั้งค่านโยบายหรือหากค่าหลังการแทนที่ไม่ใช่ชื่อโฮสต์ที่ถูกต้อง ก็จะไม่มีการกำหนดชื่อโฮสต์ในคำขอ DHCP</translation> <translation id="1257550411839719984">ตั้งค่าไดเรกทอรีเริ่มต้นสำหรับดาวน์โหลด</translation> <translation id="1265053460044691532">จำกัดเวลาที่ผู้ใช้ซึ่งตรวจสอบสิทธิ์ผ่าน SAML สามารถเข้าสู่ระบบในแบบออฟไลน์</translation> +<translation id="1271811620059192171">เปิดใช้นโยบายที่มาจากกลุ่มขนาดเล็ก</translation> <translation id="127264587838521316">เปิดใช้คำขอติดตั้งส่วนขยายของ <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">เปิดใช้การย้ายข้อมูลของอุปกรณ์ Chromad ไปยังการจัดการระบบคลาวด์</translation> <translation id="1274997165432133392">คุกกี้และข้อมูลอื่นของเว็บไซต์</translation> @@ -2840,6 +2841,7 @@ หากตั้งค่านโยบายนี้เป็น "ปิดใช้" หรือไม่ได้ตั้งค่า ระบบอาจแสดงข้อความแจ้งผู้ใช้เฉพาะในกรณีที่ไม่มีใบรับรองตรงกับการเลือกอัตโนมัติ</translation> <translation id="3950110092991281616">เปิดใช้การตรวจสอบสิทธิ์แบบแอมเบียนท์ในเซสชันปกติเท่านั้น</translation> <translation id="3950239119790560549">อัปเดตการจำกัดเวลา</translation> +<translation id="3956243291190637924">ซ่อนส่วนหัวและส่วนท้ายในการแสดงตัวอย่างก่อนพิมพ์</translation> <translation id="3956573780915784996">อนุญาตให้ผู้ใช้รวบรวมการติดตามประสิทธิภาพทั้งระบบ</translation> <translation id="3956686688560604829">ใช้นโยบาย SiteList ของ Internet Explorer กับการรองรับเบราว์เซอร์เวอร์ชันเก่า</translation> <translation id="3958586912393694012">อนุญาตให้ใช้ Smart Lock</translation> @@ -3076,6 +3078,16 @@ การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้ผู้ใช้โอนไฟล์ไปยัง Google ไดรฟ์ขณะเชื่อมต่อเครือข่ายมือถือได้</translation> <translation id="4248277954659222481">อนุญาตการเล่นสื่ออัตโนมัติในรายการรูปแบบ URL ที่อนุญาต</translation> <translation id="4250680216510889253">ไม่มี</translation> +<translation id="4259636715493757956">ให้คุณระบุค่ากำหนดสำหรับ URL การตรวจสอบสิทธิ์ใน "<ph name="WEBVIEW_PRODUCT_NAME" />" ได้ + + "<ph name="WEBVIEW_PRODUCT_NAME" />" จะดำเนินการกับ URL การตรวจสอบสิทธิ์เหล่านี้เป็นพิเศษ ซึ่งทำให้ในระหว่างการตรวจสอบสิทธิ์เมื่อมีการนำทางหน้าเว็บใน "<ph name="WEBVIEW_PRODUCT_NAME" />" ไปยัง URL ดังกล่าว ระบบจะเปิดแอป Authenticator ของผู้ให้บริการข้อมูลประจำตัวที่เกี่ยวข้องขึ้นมาที่สามารถจัดการ URL การตรวจสอบสิทธิ์นี้ได้ + + ผู้ให้บริการข้อมูลประจำตัวจะใช้ขั้นตอนการเปิดแอป Authenticator ดังกล่าวเพื่อเปิดใช้ Use Case ต่างๆ เช่น การให้บริการ SSO ในแอป หรือการรักษาความปลอดภัยที่ดียิ่งขึ้นโดยการรวบรวมสัญญาณของอุปกรณ์ Zero Trust เพื่อทราบตำแหน่งอุปกรณ์ในระหว่างการตรวจสอบสิทธิ์ + + หากไม่ติดตั้งแอปที่ใช้จัดการ URL การตรวจสอบสิทธิ์ได้ไว้ในอุปกรณ์ ระบบจะนำทางต่อใน "<ph name="WEBVIEW_PRODUCT_NAME" />" + + รูปแบบ URL การตรวจสอบสิทธิ์ต้องเป็นไปตาม https://www.chromium.org/administrators/url-blocklist-filter-format + </translation> <translation id="4260027436474745627">การตั้งค่านโยบายหมายความว่าต้นทางแต่ละแห่งที่มีชื่อในรายการที่คั่นด้วยคอมมาจะทำงานในกระบวนการเฉพาะ กระบวนการของต้นทางแต่ละแห่งที่มีชื่อจะได้รับอนุญาตให้มีเอกสารจากต้นทางนั้นและโดเมนย่อยเท่านั้น ตัวอย่างเช่น การระบุ https://a1.example.com/ จะอนุญาต https://a2.a1.example.com/ ในกระบวนการเดียวกัน แต่ไม่อนุญาต https://example.com หรือ https://b.example.com ตั้งแต่ <ph name="PRODUCT_NAME" /> เวอร์ชัน 77 คุณจะระบุช่วงต้นทางเพื่อแยกโดยใช้ไวลด์การ์ดได้ด้วย ตัวอย่างเช่น การระบุ https://[*.]corp.example.com จะทำให้ทุกต้นทางภายใต้ https://corp.example.com มีกระบวนการเฉพาะของตนเอง ซึ่งรวมถึง https://corp.example.com, https://a1.corp.example.com และ https://a2.a1.corp.example.com โปรดทราบว่าเว็บไซต์ทั้งหมด (เช่น รูปแบบบวก eTLD+1 อย่าง https://example.com) จะแยกไว้อยู่แล้วโดยค่าเริ่มต้นบนแพลตฟอร์มเดสก์ท็อปตามที่ได้ระบุในนโยบาย <ph name="SITE_PER_PROCESS_POLICY_NAME" /> นโยบาย <ph name="ISOLATE_ORIGINS_POLICY_NAME" /> นี้เป็นประโยชน์ในการแยกต้นทางเฉพาะบางแห่งในระดับที่ละเอียดกว่า (เช่น https://a.example.com) @@ -3214,6 +3226,7 @@ <translation id="4432762137771104529">เปิดใช้การรายงานแบบขยายของ Safe Browsing</translation> <translation id="443454694385851356">แบบเดิม (ไม่ปลอดภัย)</translation> <translation id="443665821428652897">ล้างข้อมูลไซต์เมื่อปิดเบราว์เซอร์ (เลิกใช้งานแล้ว)</translation> +<translation id="4436941175475497595">ปิดใช้การแสดงตัวอย่างก่อนพิมพ์</translation> <translation id="4439336120285389675">ระบุรายชื่อฟีเจอร์ของเว็บแพลตฟอร์มที่เลิกใช้แล้วเพื่อเปิดใช้ใหม่ชั่วคราว นโยบายนี้จะทำให้ผู้ดูแลระบบสามารถเปิดใช้ฟีเจอร์ของเว็บแพลตฟอร์มซึ่งเลิกใช้ไปแล้วได้ใหม่อีกครั้งครั้งในเวลาจำกัด ฟีเจอร์เหล่านี้จะระบุโดยสตริงแท็ก ซึ่งฟีเจอร์ที่สอดคล้องกับแท็กที่มีอยู่ในรายการที่นโยบายนี้กำหนดจะถูกเปิดใช้อีกครั้ง @@ -3497,13 +3510,6 @@ <translation id="482803100714220060">แสดง URL แบบเต็ม</translation> <translation id="4832852360828533362">การรายงานผู้ใช้และอุปกรณ์</translation> <translation id="4834526953114077364">ผู้ใช้ที่มีการใช้งานล่าสุดน้อยที่สุดที่ไม่ได้เข้าสู่ระบบภายใน 3 เดือนที่ผ่านมาจะถูกลบจากกว่าจะมีที่ว่างเพียงพอ</translation> -<translation id="483544442646753291">ควบคุมประสบการณ์ของผู้ใช้สำหรับฟีเจอร์ที่ปิดใช้ที่ระบุไว้ใน <ph name="SYSTEM_FEATURES_DISABLE_LIST" /> - - หากตั้งค่านโยบายนี้เป็น "บล็อก" ฟีเจอร์ที่ปิดใช้จะไม่สามารถใช้ได้ แต่ผู้ใช้จะยังคงมองเห็น - - หากตั้งค่านโยบายนี้เป็น "ซ่อน" ฟีเจอร์ที่ปิดใช้จะไม่สามารถใช้ได้และผู้ใช้จะมองไม่เห็น - - หากไม่ได้ตั้งค่านโยบายนี้หรือมีค่าไม่ถูกต้อง โหมดปิดใช้ของฟีเจอร์ของระบบจะ "ถูกบล็อก"</translation> <translation id="4835470005923546373">ปิดใช้โหมดการพิมพ์กราฟิกพื้นหลังโดยค่าเริ่มต้น</translation> <translation id="4835622243021053389">เปิดใช้การตรวจสอบสิทธิ์ NTLMv2</translation> <translation id="4840015507504937941">นโยบายนี้ตั้งค่าข้อมูลขนาดเล็ก (หน่วยไบต์) สำหรับข้อมูลในคลิปบอร์ดที่จะได้รับการตรวจสอบกับกฎข้อจำกัดของคลิปบอร์ดที่กำหนดไว้ในนโยบาย DataLeakPreventionRulesList @@ -4120,6 +4126,7 @@ <translation id="5464816904705580310">กำหนดการตั้งค่าสำหรับผู้ใช้ที่ได้รับการจัดการ</translation> <translation id="5466596281866046569">รายงานข้อมูลแอปพลิเคชัน</translation> <translation id="546726650689747237">ระยะหน่วงเวลาการหรี่แสงหน้าจอเมื่อทำงานโดยใช้ไฟ AC</translation> +<translation id="546830339470589966">เติมโดเมนอัตโนมัติสำหรับตั๋ว Kerberos ใหม่</translation> <translation id="5469143988693423708">อนุญาตให้ผู้ใช้เรียกใช้ Crostini ได้</translation> <translation id="5469825884154817306">บล็อกรูปภาพในเว็บไซต์เหล่านี้</translation> <translation id="5470500958458209831">URL ที่ระบบไปดาวน์โหลด Ansible Playbook ได้</translation> @@ -4253,6 +4260,7 @@ หมายเหตุ: คั่นชื่อเซิร์ฟเวอร์หลายรายการด้วยเครื่องหมายจุลภาค ใช้ไวลด์การ์ด (<ph name="WILDCARD_VALUE" />) ได้</translation> <translation id="5645779841392247734">อนุญาตให้ใช้คุกกี้บนไซต์เหล่านี้</translation> <translation id="5646234199535103501">นโยบายการกำหนดค่าสำหรับเครื่องมือเชื่อมต่อ Chrome Enterprise OnBulkDataEntry</translation> +<translation id="5648016151508002741">ป้องกันไม่ให้ดำเนินการตรวจสอบ <ph name="OCSP_CRL_LABEL" /> ออนไลน์</translation> <translation id="5649046890958064703">หากมีการเลือก <ph name="PRINTERS_BLACKLIST" /> ไว้สำหรับ <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> การตั้งค่า <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> จะระบุเครื่องพิมพ์ที่ผู้ใช้จะใช้ไม่ได้ เครื่องพิมพ์ทั้งหมดจะพร้อมให้ผู้ใช้นำมาใช้งาน ยกเว้นเครื่องที่มีรหัสตามที่ระบุไว้ในนโยบายนี้ รหัสดังกล่าวต้องตรงกับช่อง <ph name="ID_FIELD" /> หรือ <ph name="GUID_FIELD" /> ในไฟล์ที่ระบุไว้ใน <ph name="DEVICE_PRINTERS_POLICY_NAME" /> นโยบายนี้เลิกใช้งานไปแล้ว โปรดใช้ <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" /> แทน</translation> @@ -4377,9 +4385,6 @@ หากตั้งค่านโยบายเป็น "เท็จ" หรือไม่ได้ตั้งค่า จะไม่มีการรายงานข้อมูล หากตั้งค่าเป็น "จริง" จะมีการรายงานข้อมูล VPD ของอุปกรณ์ ข้อมูลผลิตภัณฑ์ที่สำคัญ (VPD) เป็นคอลเล็กชันการกำหนดค่าและข้อมูลต่างๆ (เช่น หมายเลขชิ้นส่วนและหมายเลขซีเรียล) ที่เชื่อมโยงกับอุปกรณ์</translation> -<translation id="576158229686912964">นโยบายนี้เลิกใช้งานไปแล้วในรุ่น M96 โปรดใช้ <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> และ <ph name="REPORT_DEVICE_NETWORK_STATUS" /> แทน - - การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ที่ลงทะเบียนไว้รายงานรายการอินเทอร์เฟซเครือข่ายพร้อมด้วยประเภทและที่อยู่ฮาร์ดแวร์ การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้อุปกรณ์ที่ลงทะเบียนไว้ไม่รายงานอินเทอร์เฟซเครือข่าย</translation> <translation id="5762969307102447459">ปิดใช้ฟีเจอร์ป้อนข้อความอัตโนมัติสำหรับที่อยู่</translation> <translation id="5765780083710877561">คำอธิบาย:</translation> <translation id="5766438888216077649">อย่าตั้งค่า <ph name="WINDOW_OPENER_PROPERTY" /> สำหรับลิงก์ที่กำหนดเป้าหมาย <ph name="BLANK_PAGE_NAME" /></translation> @@ -4498,6 +4503,7 @@ <translation id="5893303508158298667">หากตั้งค่า <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> เป็น "เปิดใช้" การตั้งค่า <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> เป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้สามารถใช้ไคลเอ็นต์ระยะไกลเพื่อใช้รีเลย์เซิร์ฟเวอร์ในการเชื่อมต่อกับเครื่องนี้เมื่อเชื่อมต่อโดยตรงไม่ได้ เช่น เนื่องจากข้อจำกัดด้านไฟร์วอลล์ การตั้งค่านโยบายเป็น "ปิดใช้" จะไม่ปิดการเข้าถึงระยะไกล แต่จะอนุญาตการเชื่อมต่อจากเครือข่ายเดียวกันเท่านั้น (ไม่อนุญาตการส่งผ่าน NAT หรือรีเลย์)</translation> +<translation id="5897234314586602143">แสดงส่วนหัวและส่วนท้ายในการแสดงตัวอย่างก่อนพิมพ์</translation> <translation id="5897913798715600338">ชาร์จแบตเตอรี่โดยใช้เทคโนโลยีการชาร์จเร็ว</translation> <translation id="5898486742390981550">เมื่อมีผู้ใช้หลายคนอยู่ในระบบ จะมีเพียงผู้ใช้หลักเท่านั้นที่ใช้แอป Android ได้</translation> <translation id="5899751601113377553">ป้องกันไม่ให้ผู้ใช้สามารถใช้ <ph name="LACROS_NAME" /> ได้</translation> @@ -4948,6 +4954,10 @@ หากไม่ได้ตั้งค่านโยบายนี้สำหรับเว็บไซต์ นโยบายจาก <ph name="DEFAULT_LOCAL_FONTS_SETTING_POLICY_NAME" /> ก็จะมีผลกับเว็บไซต์เมื่อตั้งค่าไว้ ไม่เช่นนั้นสิทธิ์ดังกล่าวจะเป็นไปตามค่าเริ่มต้นของเบราว์เซอร์และอนุญาตให้ผู้ใช้เลือกสิทธิ์สำหรับแต่ละเว็บไซต์</translation> <translation id="6384542789059421431">เปิดใช้การแสดงหน้าผลการค้นหาของเครื่องมือค้นหาเริ่มต้นในแผงด้านข้างของเบราว์เซอร์</translation> <translation id="6394350458541421998">นโยบายนี้ได้ถูกยกเลิกไปตั้งแต่ <ph name="PRODUCT_OS_NAME" /> เวอร์ชัน 29 โปรดใช้นโยบาย PresentationScreenDimDelayScale แทน</translation> +<translation id="6396956366662970339">ระบุว่าจะอนุญาตให้รูปแบบการชาร์จแบบปรับอัตโนมัติพักขั้นตอนการชาร์จไว้ชั่วคราวเพื่อยืดอายุการใช้งานแบตเตอรี่หรือไม่ + + เมื่อเสียบปลั๊กอุปกรณ์อยู่ รูปแบบการชาร์จแบบปรับอัตโนมัติจะประเมินว่าควรพักขั้นตอนการชาร์จไว้ชั่วคราวเพื่อยืดอายุการใช้งานแบตเตอรี่หรือไม่ หากรูปแบบการชาร์จแบบปรับอัตโนมัติพักขั้นตอนการชาร์จไว้ชั่วคราวก็จะคงแบตเตอรี่ไว้ที่ระดับหนึ่ง (เช่น 80%) จากนั้นจะชาร์จจนถึง 100% เมื่อผู้ใช้ต้องการ + หากตั้งค่านโยบายนี้เป็น "จริง" ระบบจะเปิดใช้การชาร์จแบบปรับอัตโนมัติและอนุญาตให้หยุดการชาร์จไว้ชั่วคราวได้เพื่อยืดอายุการใช้งานแบตเตอรี่ หากตั้งค่านโยบายนี้เป็น "เท็จ" หรือไม่ได้ตั้งค่า การชาร์จแบบปรับอัตโนมัติจะไม่ส่งผลต่อขั้นตอนการชาร์จ</translation> <translation id="6397588391180665797">รายงานการกำหนดค่าเครือข่ายของผู้ใช้ในอุปกรณ์ที่ลงทะเบียนไว้ หากตั้งค่านโยบายเป็น "เท็จ" จะไม่มีการรายงานข้อมูล @@ -5002,6 +5012,13 @@ <translation id="6478258366184919502">ต้นทางของการเข้าสู่ระบบและหน้าจอ</translation> <translation id="6478261301433199402">การตั้งค่านโยบายจะระบุรูปภาพ <ph name="PLUGIN_VM_NAME" /> สำหรับผู้ใช้ ระบุนโยบายนี้เป็นสตริงรูปแบบ JSON โดยที่ <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> ระบุตำแหน่งที่จะดาวน์โหลดรูปภาพและ <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> เป็นแฮช SHA-256 ที่ใช้เพื่อยืนยันความสมบูรณ์ของการดาวน์โหลด</translation> <translation id="6481245670325946423">อนุญาตให้ใช้โหมดไม่มีส่วนหัว</translation> +<translation id="648158446793103284">การตั้งค่านโยบายนี้จะอนุญาตให้ผู้ใช้เลือกวิธีการป้อนข้อมูลวิธีใดวิธีหนึ่งสำหรับเซสชันของ "<ph name="PRODUCT_OS_NAME" />" ที่คุณระบุ + + หากคุณไม่ได้ตั้งค่าหรือตั้งค่าเป็นรายการว่างเปล่า ผู้ใช้จะเลือกวิธีการป้อนข้อมูลวิธีใดก็ได้ที่รองรับ + + ตั้งแต่เวอร์ชัน M106 เป็นต้นไป ระบบจะเปิดใช้วิธีการป้อนข้อมูลที่อนุญาตโดยอัตโนมัติในเซสชันคีออสก์ + + หมายเหตุ: หากไม่รองรับวิธีการป้อนข้อมูลในปัจจุบัน ระบบจะเปลี่ยนไปใช้เลย์เอาต์ของแป้นพิมพ์ฮาร์ดแวร์ (หากอนุญาตให้ใช้ได้) หรือวิธีการแรกที่ใช้ได้ในรายการนี้ โดยจะไม่สนใจวิธีการที่ใช้ไม่ได้หรือไม่รองรับ</translation> <translation id="6489084406497912050">ควบคุมว่าผู้ใช้จะเพิ่มบัญชี Kerberos ได้หรือไม่ หากเปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ผู้ใช้จะเพิ่มบัญชี Kerberos ได้ผ่านการตั้งค่าบัญชี Kerberos ในหน้าการตั้งค่า Kerberos ผู้ใช้จะควบคุมบัญชีที่ตนเพิ่มไว้ได้โดยสมบูรณ์และจะแก้ไขหรือนำบัญชีออกได้ด้วย @@ -5230,6 +5247,7 @@ หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะใช้การแสดง URL โดยค่าเริ่มต้น หากไม่ได้ตั้งค่านโยบายนี้ ระบบจะใช้การแสดง URL โดยค่าเริ่มต้น และผู้ใช้จะสลับระหว่างการแสดง URL โดยค่าเริ่มต้นและแบบเต็มได้ด้วยตัวเลือกเมนูตามบริบท </translation> +<translation id="6670794785040100077">ปิดใช้การส่งเอกสารไปยัง "<ph name="CLOUD_PRINT_NAME" />"</translation> <translation id="6672070613706645316">อนุญาตให้ผู้ใช้ปรับแต่งพื้นหลังในหน้าแท็บใหม่</translation> <translation id="6672630473862787247">เปิดใช้การตรวจสอบสิทธิ์แบบแอมเบียนท์ในเซสชันปกติ เซสชันไม่ระบุตัวตน และเซสชันผู้เยี่ยมชม</translation> <translation id="6685903773201985073">เปิดใช้การตรวจสอบสิทธิ์แบบแอมเบียนท์ในเซสชันผู้เยี่ยมชมและเซสชันปกติ</translation> @@ -5317,6 +5335,7 @@ การไม่ตั้งค่า <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> จะทำให้ระบบส่งคำขอค้นหาโดยใช้เมธอด GET</translation> <translation id="6757613329154374267">การสำรองและกู้คืนข้อมูลเปิดใช้อยู่</translation> <translation id="6758659208493449452">นโยบายนี้ควบคุมว่าผู้ใช้ที่ลงทะเบียนในโปรแกรมการปกป้องขั้นสูงจะได้รับการปกป้องเพิ่มเติมหรือไม่ บางฟีเจอร์เหล่านี้อาจมีการแชร์ข้อมูลกับ Google (เช่น ผู้ใช้การปกป้องขั้นสูงจะส่งไฟล์ที่ดาวน์โหลดไปให้ Google สแกนหามัลแวร์ได้) หากตั้งค่าเป็น "จริง" หรือไม่ได้ตั้งค่า ผู้ใช้ที่ลงทะเบียนจะได้รับการปกป้องเพิ่มเติม หากตั้งค่าเป็น "เท็จ" ผู้ใช้การปกป้องขั้นสูงจะได้รับเฉพาะฟีเจอร์มาตรฐานสำหรับผู้ใช้ทั่วไป</translation> +<translation id="6763023079133439068">อนุญาตใบรับรองที่ไม่มีส่วนขยาย subjectAlternativeName เมื่อออกโดย Trust Anchor ในพื้นที่</translation> <translation id="6766216162565713893">อนุญาตให้เว็บไซต์ขอสิทธิ์เข้าถึงอุปกรณ์บลูทูธที่อยู่ใกล้เคียงจากผู้ใช้</translation> <translation id="6770454900105963262">รายงานข้อมูลเกี่ยวกับเซสชันคีออสก์ที่ใช้งาน</translation> <translation id="6782977971207381602">การตั้งค่านโยบายเป็น "เปิดใช้" จะอนุญาตให้อุปกรณ์เรียกใช้เครื่องเสมือนใน <ph name="PRODUCT_OS_NAME" /> ต้องเปิดใช้ <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> และ <ph name="CROSTINI_ALLOWED_POLICY_NAME" /> เพื่อใช้ <ph name="PRODUCT_CROSTINI_NAME" /> การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าอุปกรณ์เรียกใช้เครื่องเสมือนไม่ได้ การเปลี่ยนเป็น "ปิดใช้" จะเริ่มใช้นโยบายเพื่อเริ่มเครื่องเสมือนใหม่ ไม่ใช่เครื่องเสมือนที่ทำงานอยู่แล้ว @@ -5939,6 +5958,7 @@ <translation id="7458437477941640506">อย่าย้อนกลับไปเวอร์ชันเป้าหมายหากใช้ระบบปฏิบัติการเวอร์ชันที่ใหม่กว่า การอัปเดตต่างๆ จะถูกปิดการใช้งานเช่นกัน</translation> <translation id="7459601923199346224">ควบคุมนโยบายด้านผู้ใช้และอุปกรณ์สำหรับการจัดการใบรับรอง</translation> <translation id="7459633275230216698">อนุญาตกล่องโต้ตอบการเลือกไฟล์</translation> +<translation id="7464058117970792805">เปิดใช้การแสดงตัวอย่างก่อนพิมพ์</translation> <translation id="7464991223784276288">จำกัดคุกกี้จาก URL ที่ตรงกันให้อยู่ในเซสชันปัจจุบัน</translation> <translation id="7468182772656807573">การตั้งค่านโยบายจะกำหนดความถี่ในการส่งการตรวจสอบแพ็กเก็ตเครือข่ายเป็นมิลลิวินาที ช่วงเวลาอาจอยู่ที่ตั้งแต่ 30 วินาทีถึง 24 ชั่วโมง ค่าที่ไม่อยู่ในช่วงดังกล่าวจะถูกจำกัดตามช่วงนี้ @@ -6034,9 +6054,6 @@ หากไม่ได้ตั้งค่านโยบาย ค่าเริ่มต้นจะเป็น <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> สำหรับผู้ใช้ที่มีองค์กรเป็นผู้จัดการและ <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> สำหรับผู้ใช้ที่ไม่มีการจัดการ ในอนาคตคุณจะกำหนดให้ <ph name="LACROS_NAME" /> เป็นเพียงเบราว์เซอร์เดียวที่มีให้ใช้ใน <ph name="PRODUCT_OS_NAME" /> ได้ด้วยค่า <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /></translation> -<translation id="7509761893401042250">นโยบายนี้เลิกใช้งานไปแล้วตั้งแต่รุ่น M96 โปรดใช้ <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> และ <ph name="REPORT_DEVICE_AUDIO_STATUS" /> แทน - - การตั้งค่านโยบายเป็น "เปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ที่ลงทะเบียนไว้รายงานสถิติด้านฮาร์ดแวร์ เช่น การใช้งาน CPU/RAM การตั้งค่านโยบายเป็น "ปิดใช้" จะทำให้อุปกรณ์ที่ลงทะเบียนไว้ไม่รายงานสถิติด้านฮาร์ดแวร์</translation> <translation id="7512065400265675158">กำหนดเวลาลดส่วนหัวของคำขอ HTTP <ph name="USER_AGENT_HEADER_NAME" /> แล้ว นโยบายนี้สามารถเปิดใช้ฟีเจอร์การลดส่วนหัวสำหรับเว็บไซต์ทั้งหมด หรือปิดไม่ให้เปิดใช้ฟีเจอร์นี้ผ่านช่วงทดลองใช้จากต้นทางหรือช่วงทดลองใช้งานภาคสนาม เพื่อให้เอื้อต่อการทดสอบและความเข้ากันได้ ดูข้อมูลเพิ่มเติมเกี่ยวกับ <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> และไทม์ไลน์ได้ที่นี่ https://blog.chromium.org/2021/09/user-agent-reduction-origin-trial-and-dates.html @@ -6272,6 +6289,10 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบ <ph name="URL_LABEL" /> ที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns นโยบายนี้จะจับคู่โดยอิงตามต้นทางเท่านั้น ระบบจึงไม่สนใจเส้นทางใดก็ตามในรูปแบบ URL</translation> <translation id="7771298620150437359">กำหนดค่าเนื้อหาและลำดับภาษาที่ต้องการ</translation> +<translation id="7773790010815041731">แอป Chrome เลิกใช้งานแล้วใน <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> และ <ph name="LINUX_OS_NAME" /> + หากเปิดใช้นโยบายนี้ "<ph name="PRODUCT_NAME" />" จะอนุญาตให้แอป Chrome ทำงานในแพลตฟอร์มดังกล่าวต่อไปจนกระทั่งถึงวันที่เรายกเลิกการสนับสนุนแอป Chrome ในทุกแพลตฟอร์มเดือนมิถุนายน 2022 + หากปิดใช้นโยบายนี้หรือไม่ได้ตั้งค่า ระบบอาจไม่อนุญาตให้แอป Chrome ทำงาน ทั้งนี้ขึ้นอยู่กับสถานะของการเริ่มเลิกใช้งาน + ไม่ว่าจะเป็นกรณีใด แอป Chrome ที่นโยบายบังคับติดตั้งจะยังได้รับอนุญาตต่อไป</translation> <translation id="7774768074957326919">ใช้การตั้งค่าพร็อกซีของระบบ</translation> <translation id="777734450201217641">เปิดใช้แป้นพิมพ์ลัดของฟีเจอร์การช่วยเหลือพิเศษในหน้าจอการเข้าสู่ระบบ @@ -6314,6 +6335,7 @@ <translation id="7823902813460802031">การตั้งค่านโยบายเป็น "เปิดใช้" หมายความว่า <ph name="PRODUCT_OS_NAME" /> จะหยุดไม่ให้อุปกรณ์เข้าสู่โหมดนักพัฒนาซอฟต์แวร์ การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่าจะทำให้อุปกรณ์ใช้โหมดนักพัฒนาซอฟต์แวร์ได้เสมอ</translation> +<translation id="7824000841504721945">ปิดใช้นโยบายที่มาจากกลุ่มขนาดเล็ก</translation> <translation id="782661371433719637">ไม่อนุญาตให้เว็บไซต์ใดๆ ขอสิทธิ์การเข้าถึงในการอ่านไฟล์และไดเรกทอรีผ่าน File System API</translation> <translation id="7827127381981620448">แอปแพลตฟอร์ม</translation> <translation id="7833148823006528332">ตัวระบุแอป Android เช่น "com.google.android.gm" สำหรับ Gmail</translation> @@ -6399,6 +6421,7 @@ <translation id="793473937901685727">ตั้งค่าความพร้อมใช้งานของใบรับรองสำหรับแอป ARC</translation> <translation id="7936302526928951356">สตริง User-Agent จะไม่หยุดเวอร์ชันหลัก</translation> <translation id="7937766917976512374">อนุญาตหรือปฏิเสธการจับวิดีโอ</translation> +<translation id="7941528208359969119">อนุญาตให้ดำเนินการตรวจสอบ <ph name="OCSP_CRL_LABEL" /> ออนไลน์</translation> <translation id="7941975817681987555">อย่าคาดการณ์การทำงานของเครือข่ายจากการเชื่อมต่อเครือข่ายใดๆ</translation> <translation id="7946350455013548764">การตั้งค่านโยบายเป็น 3 จะให้เว็บไซต์ขอสิทธิ์เข้าถึงอุปกรณ์ HID ได้ การตั้งค่านโยบายเป็น 2 จะปฏิเสธการเข้าถึงอุปกรณ์ HID @@ -6771,6 +6794,7 @@ การไม่ตั้งค่า <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> จะทำให้ระบบส่งคำขอการค้นหารูปภาพโดยใช้เมธอด GET</translation> <translation id="8314214821702356835">อนุญาตให้ผู้ใช้เล่นสื่อเมื่อมีการล็อกอุปกรณ์อยู่</translation> +<translation id="8316940611391250886">ไม่อนุญาตใบรับรองที่ไม่มีส่วนขยาย subjectAlternativeName</translation> <translation id="8319678975002906774">ตั้งค่าการกำหนดค่าที่มีการจัดการสำหรับต้นทางที่เจาะจงของเว็บไซต์</translation> <translation id="8320149248919453401">โหมดการชาร์จแบตเตอรี่</translation> <translation id="8327651196906278510">อนุญาตให้ต้นทางเหล่านี้จับภาพแท็บ</translation> @@ -7049,13 +7073,6 @@ หากตั้งค่านโยบายนี้เป็น "จริง" ระบบอาจระงับแท็บที่ทำงานมาอย่างน้อย 5 นาทีในเบื้องหลัง การระงับแท็บจะช่วยลดการใช้งาน CPU, แบตเตอรี่ และหน่วยความจำ <ph name="PRODUCT_NAME" /> ใช้การเรียนรู้เพื่อหลีกเลี่ยงการระงับแท็บที่ทำงานในเบื้องหลังที่มีประโยชน์ (เช่น แสดงการแจ้งเตือน เล่นเสียง สตรีมวิดีโอ) ทั้งนี้ นักพัฒนาเว็บเลือกไม่ใช้การระงับกับเว็บไซต์ของตนได้ (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md) หากตั้งค่านโยบายนี้เป็น "เท็จ" ระบบจะไม่ระงับแท็บใดๆ ทั้งสิ้น</translation> -<translation id="8619480582976056396">การตั้งค่านโยบายนี้ทำให้หน้าเว็บที่ใช้ URL ต้องห้ามไม่สามารถโหลดได้ โดยจะมีรายการรูปแบบ URL ที่ระบุ URL ต้องห้ามไว้ การไม่ตั้งค่านโยบายจะทำให้ไม่มีการห้าม URL ใดเลยในเบราว์เซอร์ ให้จัดรูปแบบ URL ตามรูปแบบนี้ (https://www.chromium.org/administrators/url-blocklist-filter-format) คุณกำหนดข้อยกเว้นใน <ph name="URL_ALLOWLIST_POLICY_NAME" /> ได้ไม่เกิน 1,000 รายการ - - เริ่มจาก <ph name="PRODUCT_NAME" /> เวอร์ชัน 73 เป็นต้นไป คุณจะบล็อก URL javascript://* ได้ แต่จะมีผลเฉพาะกับ JavaScript ที่พิมพ์ลงในแถบที่อยู่ (หรือ bookmarklet เป็นต้น) นโยบายนี้ไม่มีผลกับ URL JavaScript แบบในหน้าเว็บและมีการโหลดข้อมูลแบบไดนามิก ตัวอย่างเช่น หากคุณบล็อก example.com/abc ไว้ example.com จะยังคงโหลด example.com/abc โดยใช้ XMLHTTPRequest ได้ - - มีการรองรับนโยบายนี้ในโหมดไม่มีส่วนหัวด้วยใน <ph name="PRODUCT_NAME" /> เวอร์ชัน 92 เป็นต้นไป - - หมายเหตุ: การบล็อก chrome://* ซึ่งเป็น URL ภายในอาจทำให้เกิดข้อผิดพลาดที่ไม่คาดคิด</translation> <translation id="8619748440665904084">ปิดใช้การนำเข้าข้อมูลแบบฟอร์มที่ป้อนอัตโนมัติเมื่อเรียกใช้ครั้งแรก</translation> <translation id="8623672932476443039">การตั้งค่านโยบายเป็น "เปิดใช้" จะทำให้ผู้ใช้เข้าถึงโหมดนักพัฒนาซอฟต์แวร์สำหรับแอปที่แยกไว้ได้ การตั้งค่านโยบายเป็น "ปิดใช้" หมายความว่าผู้ใช้จะไม่สามารถเข้าถึงโหมดดังกล่าว @@ -7202,9 +7219,6 @@ <translation id="8807313206348471682">แสดงกล่องโต้ตอบการยืนยันการออกจากระบบ</translation> <translation id="8812091410765157924">อนุญาตให้เปิดเฉพาะป๊อปอัปที่มีการกำหนดเป้าหมายแบบ <ph name="BLANK_PAGE_NAME" /> เพื่อโต้ตอบกับหน้าที่เปิดป๊อปอัป หากหน้าที่เปิดเลือกใช้การโต้ตอบดังกล่าวอย่างชัดแจ้ง</translation> <translation id="8816370949847593408">ระบบอาจไม่อนุญาตให้แอป Chrome ทำงาน ทั้งนี้ขึ้นอยู่กับสถานะของการเริ่มเลิกใช้งาน</translation> -<translation id="8818173863808665831">รายงานตำแหน่งทางภูมิศาสตร์ของอุปกรณ์ - - หากไม่ได้ตั้งค่านโยบายนี้เอาไว้ หรือตั้งค่าเป็นเท็จ ตำแหน่งจะไม่ถูกรายงาน</translation> <translation id="8818768076343557335">คาดคะเนการทำงานของเครือข่ายบนเครือข่ายต่างๆ ที่ไม่ใช่เครือข่ายมือถือ (เลิกใช้งานใน 50, นำออกใน 52 หลังจาก 52 หากมีการกำหนดค่า 1 ระบบจะถือว่าเป็นค่า 0 - คาดคะเนการทำงานของเครือข่ายบนการเชื่อมต่อเครือข่ายต่างๆ)</translation> <translation id="8821678641132607468">การตั้งค่านโยบายเป็น "เปิดใช้" จะนำเข้าประวัติการท่องเว็บจากเบราว์เซอร์เริ่มต้นก่อนหน้าเมื่อเรียกใช้ครั้งแรก การตั้งค่านโยบายเป็น "ปิดใช้" หรือไม่ได้ตั้งค่า หมายความว่าจะไม่มีการนำเข้าประวัติการท่องเว็บเมื่อเรียกใช้ครั้งแรก @@ -7383,6 +7397,7 @@ ดูข้อมูลโดยละเอียดเกี่ยวกับรูปแบบอินพุตที่ถูกต้องได้ที่ https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns <ph name="WILDCARD_VALUE" /> ไม่ใช่ค่าที่ยอมรับสำหรับนโยบายนี้ นโยบายนี้จะจับคู่โดยอิงตามต้นทางเท่านั้น ด้วยเหตุนี้จึงเพิกเฉยต่อเส้นทางใดก็ตามในรูปแบบ URL</translation> <translation id="9010080992450148617">เปิดใช้การส่งเนื้อหาที่ดาวน์โหลดไปให้ Google สแกนอย่างละเอียดสำหรับผู้ใช้ที่ลงทะเบียนในโปรแกรมการปกป้องขั้นสูง</translation> +<translation id="9012101302849557459">ขยายการรองรับแอป Chrome ใน <ph name="MS_WIN_NAME" />, <ph name="MAC_OS_NAME" /> และ <ph name="LINUX_OS_NAME" /></translation> <translation id="9013875414788074110">ในระหว่างการเข้าสู่ระบบ <ph name="PRODUCT_OS_NAME" /> จะตรวจสอบสิทธิ์กับเซิร์ฟเวอร์ (แบบออนไลน์) หรือใช้รหัสผ่านในแคช (แบบออฟไลน์) ได้ เมื่อตั้งค่านโยบายนี้เป็น -1 ผู้ใช้จะตรวจสอบสิทธิ์แบบออฟไลน์ได้ตลอดเวลา เมื่อตั้งค่านโยบายนี้เป็นค่าอื่นจะเป็นการระบุช่วงเวลานับตั้งแต่การตรวจสอบสิทธิ์ออนไลน์ครั้งสุดท้าย และผู้ใช้ต้องใช้การตรวจสอบสิทธิ์ออนไลน์อีกครั้งหลังจากช่วงเวลาดังกล่าว @@ -7518,6 +7533,7 @@ <translation id="9135033364005346124">เปิดใช้งานพร็อกซี <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">ปิดใช้ UI ลูกโป่งสำหรับดาวน์โหลด</translation> <translation id="9136399279941091445">ระยะเวลาปิดเครื่องเมื่อเผยแพร่นโยบายด้านอุปกรณ์ที่ระบุ</translation> +<translation id="9148720248753722892">ไม่อนุญาตใบรับรองที่ลงนามโดยใช้ SHA-1</translation> <translation id="9150416707757015439">นโยบายนี้เลิกใช้แล้ว โปรดใช้ IncognitoModeAvailability แทน เปิดใช้งานโหมดไม่ระบุตัวตนใน <ph name="PRODUCT_NAME" /> หากการตั้งค่านี้ถูกเปิดใช้งานหรือไม่ได้กำหนดค่าไว้ ผู้ใช้จะสามารถเปิดหน้าเว็บในโหมดไม่ระบุตัวตนได้ หากการตั้งค่านี้ถูกปิดใช้งาน ผู้ใช้จะไม่สามารถเปิดหน้าเว็บในโหมดไม่ระบุตัวตน หากนโยบายนี้ไม่ได้มีการตั้งค่าไว้ จะมีการเปิดใช้งานและผู้ใช้จะสามารถใช้โหมดไม่ระบุตัวตนได้</translation> <translation id="9152473318295429890">เปิดใช้คำแนะนำตามบริบทของหน้าเว็บที่เกี่ยวข้อง</translation> <translation id="9153446010242995516">ย้อนกลับไปใช้เวอร์ชันเป้าหมายและใช้เวอร์ชันเป้าหมายเสมอหากใช้ระบบปฏิบัติการเวอร์ชันที่ใหม่กว่า พยายามใช้ค่ากำหนดระดับอุปกรณ์ต่อไป (รวมถึงข้อมูลเข้าสู่ระบบเครือข่าย) ผ่านขั้นตอนการย้อนกลับเวอร์ชัน หากเป็นไปได้ แต่อย่าทำ Powerwash เต็มรูปแบบถ้าคืนค่าข้อมูลไม่ได้ (เพราะเวอร์ชันเป้าหมายไม่รองรับการคืนค่าข้อมูลหรือเพราะมีการเปลี่ยนแปลงย้อนหลังที่เข้ากันไม่ได้)
diff --git a/components/policy/resources/policy_templates_tr.xtb b/components/policy/resources/policy_templates_tr.xtb index 36de26c..df13cdf 100644 --- a/components/policy/resources/policy_templates_tr.xtb +++ b/components/policy/resources/policy_templates_tr.xtb
@@ -3546,13 +3546,6 @@ <translation id="482803100714220060">Tam URL'leri göster</translation> <translation id="4832852360828533362">Kullanıcı ve cihaz raporlaması</translation> <translation id="4834526953114077364">Yeterli boş alan sağlanıncaya kadar, son 3 ay içinde oturum açmayan ve en seyrek kullanılan kullanıcılar kaldırılır</translation> -<translation id="483544442646753291"><ph name="SYSTEM_FEATURES_DISABLE_LIST" /> içindeki devre dışı bırakılan özelliklerle ilgili kullanıcı deneyimini kontrol eder. - - Bu politika "engellendi" olarak ayarlanırsa, devre dışı bırakılan özellikler kullanılamaz hale gelir ama yine de kullanıcılar tarafından görülebilir. - - Bu politika "gizli" olarak ayarlanırsa, devre dışı bırakılan özellikler kullanılamaz hale gelir ve kullanıcılar tarafından görülemez. - - Bu politika ayarlanmadan bırakılırsa veya geçersiz bir değer içerirse sistem özelliklerinin devre dışı bırakma modu "engellenir".</translation> <translation id="4835470005923546373">Varsayılan olarak arka plan grafikleri yazdırma modunu devre dışı bırak</translation> <translation id="4835622243021053389">NTLMv2 kimlik doğrulamasını etkinleştir.</translation> <translation id="4840015507504937941">Bu politika, DataLeakPreventionRulesList politikasında belirtilen pano kısıtlama kuralları doğrultusunda kontrol edilecek pano verileri için minimum veri boyutunu (bayt cinsinden) belirler. @@ -4431,9 +4424,6 @@ Bu politika false (yanlış) değerine ayarlanırsa veya ayarlanmadan bırakılırsa bilgi raporlanmaz. True (doğru) değerine ayarlanırsa cihazın VPD bilgileri raporlanır. Önemli Ürün Verileri (Vital Product Data-VPD), cihazla ilişkilendirilmiş yapılandırma ve bilgi amaçlı (ör. parti ve seri numarası) verileri içerir.</translation> -<translation id="576158229686912964">Bu politika M96 sürümünde kullanımdan kaldırılmıştır. Bunun yerine lütfen <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> ve <ph name="REPORT_DEVICE_NETWORK_STATUS" /> politikalarını kullanın. - - Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa kayıtlı cihazlar, türleri ve donanım adresleriyle birlikte ağ arayüzleri listesini bildirir. Politika, Devre Dışı değerine ayarlanırsa kayıtlı cihazlar ağ arayüzünü bildirmez.</translation> <translation id="5762969307102447459">Adresleri otomatik doldurmayı devre dışı bırak</translation> <translation id="5765780083710877561">Açıklama:</translation> <translation id="5766438888216077649"><ph name="BLANK_PAGE_NAME" /> sayfasını hedefleyen bağlantılar için <ph name="WINDOW_OPENER_PROPERTY" /> özelliğini ayarlamayın</translation> @@ -6118,9 +6108,6 @@ Politika ayarlanmadan bırakılırsa varsayılan değer, kuruluş tarafından yönetilen kullanıcılar için <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />, yönetilmeyen kullanıcılar için de <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> olur. İleride <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> değeri kullanılarak <ph name="LACROS_NAME" /> tarayıcının <ph name="PRODUCT_OS_NAME" /> ile kullanılabilen tek tarayıcı olması sağlanabilecektir.</translation> -<translation id="7509761893401042250">Bu politika, M96 sürümüyle birlikte kullanımdan kaldırılmıştır. Bunun yerine lütfen <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> ve <ph name="REPORT_DEVICE_AUDIO_STATUS" /> politikalarını kullanın. - - Politika, Etkin değerine ayarlanır veya ayarlanmadan bırakılırsa kayıtlı cihazlar CPU/RAM kullanımı gibi donanım istatistiklerini bildirir. Politika, Devre Dışı değerine ayarlanırsa kayıtlı cihazlar donanım istatistiklerini bildirmez.</translation> <translation id="7512065400265675158"><ph name="USER_AGENT_HEADER_NAME" /> HTTP istek başlığı kısaltılacak. Bu politika, testi ve uyumluluk sağlanmasını kolaylaştırmak amacıyla kısaltma özelliğini tüm web siteleri için etkinleştirebilir ya da özelliği etkinleştirmek üzere kaynak denemelerini veya alan denemelerini devre dışı bırakabilir. <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> ve zaman çizelgesi hakkında daha fazla bilgiyi şu adreste bulabilirsiniz: @@ -7136,13 +7123,6 @@ Politika true (doğru) değerine ayarlanırsa en az 5 dakikadır arka planda bulunan sekmeler dondurulabilir. Sekme dondurma işlemi CPU, pil ve bellek kullanımını azaltır. <ph name="PRODUCT_NAME" />, arka planda faydalı işler yapan sekmelerin (ör. bildirimleri görüntüleme, ses çalma, video yayınlama) dondurulmaması için sezgisel yöntemler kullanır. Web geliştiricileri, sitelerinin dondurma kapsamı dışında kalmasını seçebilir (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Politika false (yanlış) değerine ayarlanırsa hiçbir sekme dondurulmaz.</translation> -<translation id="8619480582976056396">Politika ayarlanırsa yasaklı URL'leri olan web sayfalarının yüklenmesi önlenir. Yasaklı URL'leri belirten URL kalıpları listesi sağlar. Politika ayarlanmadan bırakılırsa tarayıcıda hiçbir URL yasaklanmaz. URL kalıbını şu biçime göre biçimlendirin ( https://www.chromium.org/administrators/url-blocklist-filter-format ). <ph name="URL_ALLOWLIST_POLICY_NAME" /> politikasında en çok 1.000 istisna tanımlanabilir. - - <ph name="PRODUCT_NAME" /> sürüm 73'ten itibaren javascript://* URL'lerini engelleyebilirsiniz. Ancak bu engelleme yalnızca adres çubuğuna girilen JavaScript'i (veya örneğin yer işareti uygulamalarını) etkiler. Dinamik olarak yüklenen verileri olan sayfa içi JavaScript URL'leri bu politikaya tabi değildir. Örneğin, example.com/abc URL'sini engellerseniz example.com yine de XMLHTTPRequest kullanarak example.com/abc URL'sini yükleyebilir. - - Bu politika, <ph name="PRODUCT_NAME" /> 92 sürümünden itibaren gözetimsiz modda da desteklenir. - - Not: Dahili chrome://* URL'lerinin engellenmesi beklenmedik hatalara neden olabilir.</translation> <translation id="8619748440665904084">İlk çalıştırmada form otomatik doldurma verilerinin içe aktarılmasını devre dışı bırak</translation> <translation id="8623672932476443039">Politika, etkin değerine ayarlanırsa kullanıcılar erişime kapalı uygulamalar için geliştirici moduna erişebilir. Politika, devre dışı değerine ayarlanırsa kullanıcılar bu özelliklere erişemez. @@ -7291,9 +7271,6 @@ <translation id="8807313206348471682">Oturum kapatma onayı iletişimini göster</translation> <translation id="8812091410765157924">Yalnızca <ph name="BLANK_PAGE_NAME" /> sayfasını hedefleyerek açılan pop-up'lara, pop-up'ı açan sayfayla etkileşimde bulunma izni ver. Bu izin, pop-up'ı açan sayfa böyle bir etkileşimi açıkça etkinleştirirse verilir.</translation> <translation id="8816370949847593408">Kullanımdan kaldırma durumuna bağlı olarak Chrome Uygulamalarının çalışmasına izin verilmeyebilir.</translation> -<translation id="8818173863808665831">Cihazın coğrafi konumunu bildirin. - - Bu politika ayarlanmazsa veya yanlış seçeneğine ayarlanırsa konum bildirilmez.</translation> <translation id="8818768076343557335">Hücresel olmayan ağlarda ağ işlemlerini tahmin et. (50'de kullanımdan kaldırılmıştır, 52'de kaldırılmıştır. 52'den sonra, 1 değeri ayarlanırsa 0 olarak (ağ bağlantılarında ağ işlemlerini tahmin et değeri gibi) işlem görür.)</translation> <translation id="8821678641132607468">Politika Etkin değerine ayarlanırsa önceki varsayılan tarayıcıdan tarama geçmişi ilk çalıştırmada içe aktarılır. Politika Devre dışı değerine ayarlanır veya ayarlanmadan bırakılırsa tarama geçmişi ilk çalıştırmada içe aktarılmaz.
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index 0e9305fe..4e6751e 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -263,6 +263,7 @@ Якщо це правило не налаштовано або значення після підстановки не є дійсним іменем хосту, у запитах DHCP не буде вказано імені хосту.</translation> <translation id="1257550411839719984">Указати каталог для завантаження за умовчанням</translation> <translation id="1265053460044691532">Обмеження часу, упродовж якого користувач, автентифікований через SAML, може входити в режимі офлайн</translation> +<translation id="1271811620059192171">Увімкнути елементарні групи правил</translation> <translation id="127264587838521316">Вмикає запити на встановлення розширень у <ph name="PRODUCT_NAME" /></translation> <translation id="1272798957154751008">Увімкнути перенесення пристроїв Chromad для хмарного керування</translation> <translation id="1274997165432133392">Файли cookie та інші дані із сайтів</translation> @@ -2888,6 +2889,7 @@ Якщо його вимкнути або не налаштувати, користувач бачитиме такий запит, лише якщо жоден сертифікат не відповідатиме автоматичному вибору.</translation> <translation id="3950110092991281616">Увімкнути фонову автентифікацію лише у звичайному сеансі.</translation> <translation id="3950239119790560549">Оновлення часових обмежень</translation> +<translation id="3956243291190637924">Приховувати верхні й нижні колонтитули в попередньому перегляді друку</translation> <translation id="3956573780915784996">Дозволити користувачам збирати дані про відстеження ефективності на рівні системи.</translation> <translation id="3956686688560604829">Використовувати правило Internet Explorer SiteList для підтримки застарілих веб-переглядачів.</translation> <translation id="3958586912393694012">Використовувати Smart Lock</translation> @@ -3136,6 +3138,17 @@ Якщо це правило деактивовано або не налаштовано, користувачі можуть переносити файли на Диск під час з'єднання через мобільний Інтернет.</translation> <translation id="4248277954659222481">Дозволити автоматично відтворювати медіафайли з білого списку шаблонів URL-адрес</translation> <translation id="4250680216510889253">ні</translation> +<translation id="4259636715493757956">Це правило дає змогу налаштовувати конфігурації для URL-адрес автентифікації в <ph name="WEBVIEW_PRODUCT_NAME" />. + + Автентифікація за такими URL-адресами відбувається в <ph name="WEBVIEW_PRODUCT_NAME" /> у такий спосіб: під час переходу з <ph name="WEBVIEW_PRODUCT_NAME" /> + за цими посиланнями запускається відповідний додаток для автентифікації від постачальника ідентифікаторів. + + Завдяки запуску додатка для автентифікації постачальник ідентифікаторів зможе реалізувати Систему єдиного входу між додатками або збирати сигнали пристроїв щодо моделі Zero Trust, щоб посилити безпеку й визначити стан пристрою під час автентифікації. + + Якщо на пристрої не встановлено додаток для обробки URL-адреси автентифікації, перехід за посиланнями буде виконано в <ph name="WEBVIEW_PRODUCT_NAME" />. + + Шаблон URL-адреси для автентифікації потрібно відформатувати відповідно до вказівок на сторінці https://www.chromium.org/administrators/url-blocklist-filter-format. + </translation> <translation id="4260027436474745627">Якщо це правило налаштувати, кожне джерело в списку значень, відокремлених комами, відкривається окремо. Кожний відповідний процес може містити лише документи з цього джерела та його субдоменів. Наприклад, якщо вказати https://a1.example.com/, то https://a2.a1.example.com/ зможе відкриватися в цьому ж процесі, а https://example.com чи https://b.example.com – ні. Починаючи з версії <ph name="PRODUCT_NAME" /> 77, ви можете скористатися символом підстановки, щоб указати діапазон джерел для ізоляції. Наприклад, якщо вказати https://[*.]corp.example.com, кожне джерело в домені https://corp.example.com відкриватиметься окремо (зокрема https://corp.example.com, https://a1.corp.example.com і https://a2.a1.corp.example.com). @@ -3276,6 +3289,7 @@ <translation id="4432762137771104529">Вмикає Розширене звітування безпечного перегляду</translation> <translation id="443454694385851356">Застарілий (небезпечно)</translation> <translation id="443665821428652897">Видаляти дані із сайтів, коли веб-переглядач закривається (не рекомендується)</translation> +<translation id="4436941175475497595">Вимкнути попередній перегляд друку</translation> <translation id="4439336120285389675">Указує список непідтримуваних функцій веб-платформи для тимчасового ввімкнення. Це правило дає адміністраторам змогу на певний період часу ввімкнути функції веб-платформи, які більше не підтримуються. Функції визначаються тегом рядка. Буде ввімкнено функції, які відповідають тегам у списку цього правила. @@ -3559,13 +3573,6 @@ <translation id="482803100714220060">Показувати повні URL-адреси</translation> <translation id="4832852360828533362">Звіти про користувачів і пристрої</translation> <translation id="4834526953114077364">Дані неактивних останнім часом користувачів, які не входили в обліковий запис протягом останніх 3-х місяців, видаляються, доки не буде звільнено достатньо місця</translation> -<translation id="483544442646753291">Керує взаємодією вимкнених функцій, зазначених у списку <ph name="SYSTEM_FEATURES_DISABLE_LIST" />, із користувачем. - - Якщо для цього правила вибрано значення "заблоковано", користувачі не зможуть користуватися вимкненими функціями, але бачитимуть їх. - - Якщо для нього вибрано значення "приховано", вимкнені функції будуть недоступні та сховані від користувачів. - - Якщо це правило не налаштовано або має недійсне значення, режим блокування системних функцій буде "заблоковано".</translation> <translation id="4835470005923546373">Вимкнути режим друку з фоновими зображеннями за умовчанням</translation> <translation id="4835622243021053389">Увімкнути автентифікацію NTLMv2.</translation> <translation id="4840015507504937941">Це правило вказує для буфера обміну мінімальний обсяг даних (у байтах), який буде перевірятися відповідно до обмежень для буфера, визначених у правилі DataLeakPreventionRulesList. @@ -4318,6 +4325,7 @@ Примітка: назви серверів потрібно розділяти комами. Дозволяються символи підстановки (<ph name="WILDCARD_VALUE" />).</translation> <translation id="5645779841392247734">Дозволити файли cookie на цих сайтах</translation> <translation id="5646234199535103501">Правило для налаштування конектора Chrome Enterprise OnBulkDataEntry</translation> +<translation id="5648016151508002741">Заборонити онлайн-перевірки <ph name="OCSP_CRL_LABEL" /></translation> <translation id="5649046890958064703">Якщо для правила <ph name="DEVICE_PRINTERS_ACCESS_MODE_POLICY_NAME" /> вибрано параметр <ph name="PRINTERS_BLACKLIST" />, тоді налаштування <ph name="DEVICE_NATIVE_PRINTERS_BLACKLIST_POLICY_NAME" /> визначає, які принтери не можна використовувати. Користувачам недоступні лише принтери з переліченими в правилі ідентифікаторами. Ідентифікатори мають відповідати полю <ph name="ID_FIELD" /> або <ph name="GUID_FIELD" /> у файлі, указаному в правилі <ph name="DEVICE_PRINTERS_POLICY_NAME" />. Це правило більше не підтримується. Натомість використовуйте <ph name="DEVICE_PRINTERS_BLOCKLIST_POLICY_NAME" />.</translation> @@ -4452,9 +4460,6 @@ Якщо для цього правила вибрано значення false або його не налаштовано, інформація не надсилатиметься. Якщо для цього правила вибрано значення true, ці дані повідомлятимуться. Важливі дані про продукт (VPD) – це набір пов'язаних із пристроєм параметрів та інформації (як-от номер деталі або серійний номер).</translation> -<translation id="576158229686912964">Це правило не підтримується у версії M96. Натомість використовуйте правила <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> і<ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Якщо ввімкнути або не налаштувати це правило, зареєстровані пристрої повідомлятимуть список мережевих інтерфейсів, а також їх типи й адреси апаратного забезпечення. Якщо його вимкнути, зареєстровані пристрої не повідомлятимуть такі дані.</translation> <translation id="5762969307102447459">Вимкнути функцію автозаповнення адрес</translation> <translation id="5765780083710877561">Опис:</translation> <translation id="5766438888216077649">Не вказуйте для параметра <ph name="WINDOW_OPENER_PROPERTY" /> посилання, націлені на <ph name="BLANK_PAGE_NAME" /></translation> @@ -4583,6 +4588,7 @@ <translation id="5893303508158298667">Якщо правило <ph name="REMOTE_ACCESS_HOST_FIREWALL_TRAVERSAL_POLICY_NAME" /> увімкнути, а правило <ph name="REMOTE_ACCESS_HOST_ALLOW_RELAYED_CONNECTION_POLICY_NAME" /> увімкнути або не налаштувати, клієнти віддаленого доступу можуть підключатися до цього пристрою через сервери ретрансляції, коли пряме з’єднання недоступне (наприклад, через обмеження брандмауера). Якщо це правило вимкнути, для віддаленого доступу дозволяються лише підключення з тієї ж мережі (не за допомогою обходу NAT або серверів ретрансляції).</translation> +<translation id="5897234314586602143">Показувати верхні й нижні колонтитули в попередньому перегляді друку</translation> <translation id="5897913798715600338">Заряджати акумулятор через технологію швидкого заряджання.</translation> <translation id="5898486742390981550">Якщо на пристрої здійснено вхід у декілька облікових записів, працювати в додатках Android може лише основний користувач.</translation> <translation id="5899751601113377553">Заборонити користувачам працювати в <ph name="LACROS_NAME" /></translation> @@ -5099,6 +5105,13 @@ <translation id="6478258366184919502">Джерела для екранів входу</translation> <translation id="6478261301433199402">За допомогою цього правила можна вибрати образ <ph name="PLUGIN_VM_NAME" /> для користувача. Його потрібно зазначати як рядок у форматі JSON, де поле <ph name="URL_PLUGIN_VM_IMAGE_FIELD" /> вказує, звідки завантажувати файл, а <ph name="HASH_PLUGIN_VM_IMAGE_FIELD" /> – це хеш SHA-256, який використовується для перевірки цілісності завантаження.</translation> <translation id="6481245670325946423">Дозволити використовувати режим headless</translation> +<translation id="648158446793103284">Якщо налаштувати це правило, користувачі зможуть вибирати один з указаних вами методів введення для <ph name="PRODUCT_OS_NAME" />. + + Якщо це правило не налаштувати або вказати для нього порожній список, користувачі можуть вибрати будь-який підтримуваний метод введення. + + Починаючи з версії M106, дозволені методи введення автоматично вмикаються під час сеансу термінала. + + Примітка: якщо поточний метод введення не підтримується, вмикається розкладка клавіатури апаратного забезпечення (якщо це дозволено) або перший дійсний метод у списку. Недійсні або непідтримувані методи ігноруються.</translation> <translation id="6489084406497912050">Указує, чи можуть користувачі додавати облікові записи Kerberos. Якщо ввімкнути або не налаштувати це правило, користувачі зможуть додавати облікові записи Kerberos у відповідних налаштуваннях на сторінці Kerberos. Користувачі повністю керують доданими обліковими записами та можуть змінювати чи видаляти їх. @@ -5327,6 +5340,7 @@ Якщо для нього вибрано значення False, застосовуватиметься налаштування відображення URL-адрес за умовчанням. Якщо це правило не налаштовано, застосовуватиметься налаштування відображення URL-адрес за умовчанням, але користувачі зможуть увімкнути показ повних URL-адрес у контекстному меню. </translation> +<translation id="6670794785040100077">Вимкнути надсилання документів у сервіс <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="6672070613706645316">Дозволити користувачам змінювати фон сторінки нової вкладки</translation> <translation id="6672630473862787247">Увімкнути фонову автентифікацію у звичайних, анонімних та гостьових сеансах.</translation> <translation id="6685903773201985073">Увімкнути фонову автентифікацію у звичайних і гостьових сеансах.</translation> @@ -5414,6 +5428,7 @@ Якщо правило <ph name="DEFAULT_SEARCH_PROVIDER_SEARCH_URL_POST_PARAMS_POLICY_NAME" /> не налаштовано, пошукові запити надсилаються за допомогою методу GET.</translation> <translation id="6757613329154374267">Резервне копіювання й відновлення ввімкнено</translation> <translation id="6758659208493449452">Це правило дає змогу вибрати, чи має користувач, який зареєструвався в Програмі додаткового захисту, доступ до функцій посиленої безпеки. Деякі з цих функцій можуть включати обмін даними з Google (наприклад, користувачі Додаткового захисту зможуть надсилати свої завантаження в Google для перевірки на наявність зловмисного програмного забезпечення). Якщо для цього правила вибрано значення true або його не налаштовано, зареєстровані користувачі отримають доступ до функцій посиленої безпеки. Якщо для нього вибрано значення false, користувачі Додаткового захисту матимуть доступ лише до стандартних користувацьких функцій.</translation> +<translation id="6763023079133439068">Дозволити сертифікати без розширення subjectAlternativeName, видані локальними якорами довіри</translation> <translation id="6766216162565713893">Дозволити сайтам запитувати в користувача доступ до пристрою Bluetooth поблизу</translation> <translation id="6770454900105963262">Повідомляти інформацію про активні сеанси терміналу</translation> <translation id="6782977971207381602">Якщо це правило ввімкнено, пристрій може запускати віртуальні машини в <ph name="PRODUCT_OS_NAME" />. Щоб дозволити використання <ph name="PRODUCT_CROSTINI_NAME" />, потрібно ввімкнути правила <ph name="VIRTUAL_MACHINES_ALLOWED_POLICY_NAME" /> і <ph name="CROSTINI_ALLOWED_POLICY_NAME" />. Якщо це правило вимкнено, пристрій не може запускати віртуальні машини. Якщо ви його вимкнете, змінені налаштування стосуватимуться запуску нових машин, а не вже активних. @@ -6036,6 +6051,7 @@ <translation id="7458437477941640506">Не відкочуватися до цільової версії, якщо версія ОС новіша. Оновлення також вимкнено.</translation> <translation id="7459601923199346224">Контролює правила для користувачів і пристроїв щодо керування сертифікатами.</translation> <translation id="7459633275230216698">Дозволити вікна вибору файлів</translation> +<translation id="7464058117970792805">Увімкнути попередній перегляд друку</translation> <translation id="7464991223784276288">Не дозволяє файлам cookie зіставляти URL-адреси з поточним сеансом</translation> <translation id="7468182772656807573">За допомогою цього правила можна вказати частоту в мілісекундах, з якою надсилатимуться мережеві пакети для відстеження. Діапазон інтервалів – від 30 секунд до 24 годин. Значення, які не входять у цей діапазон, прив'язуються до відповідної межі. @@ -6131,9 +6147,6 @@ Якщо правило не налаштувати, значенням за умовчанням буде <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> для користувачів, якими керує адміністратор, і <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> для тих, якими адміністратор не керує. У майбутньому буде можливість зробити <ph name="LACROS_NAME" /> єдиним доступним веб-переглядачем в <ph name="PRODUCT_OS_NAME" />, вибравши значення <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />.</translation> -<translation id="7509761893401042250">Це правило більше не підтримується у версії M96 і новіших. Натомість використовуйте правила <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> і <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Якщо ввімкнути або не налаштувати це правило, зареєстровані пристрої повідомлятимуть статистику апаратного забезпечення, наприклад дані про використання ЦП чи оперативної пам’яті. Якщо його вимкнути, зареєстровані пристрої не повідомлятимуть такі дані.</translation> <translation id="7512065400265675158">Заплановано скорочення заголовка запиту HTTP функції <ph name="USER_AGENT_HEADER_NAME" />. Для спрощення тестування та сумісності це правило може вмикати функцію скорочення для всіх веб-сайтів або забороняти вмикати її для пробних версій джерела чи етапу тестування. Докладніше про функцію <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> і її часову шкалу читайте на сторінці @@ -6414,6 +6427,7 @@ <translation id="7823902813460802031">Якщо це правило активовано, <ph name="PRODUCT_OS_NAME" /> не дозволить пристрою перейти в режим розробника. Якщо це правило деактивовано або не налаштовано, режим розробника буде й надалі доступний на пристрої.</translation> +<translation id="7824000841504721945">Вимкнути елементарні групи правил</translation> <translation id="782661371433719637">Заборонити всім сайтам запитувати дозвіл на перегляд файлів і каталогів через File System API</translation> <translation id="7827127381981620448">Додаток платформи</translation> <translation id="7833148823006528332">Ідентифікатор додатка Android, наприклад, "com.google.android.gm" для Gmail</translation> @@ -6499,6 +6513,7 @@ <translation id="793473937901685727">Налаштування доступності сертифікатів для додатків ARC</translation> <translation id="7936302526928951356">Номер основної версії не буде закріплено в сегменті агента користувача.</translation> <translation id="7937766917976512374">Дозволити чи заборонити запис відео</translation> +<translation id="7941528208359969119">Дозволити онлайн-перевірки <ph name="OCSP_CRL_LABEL" /></translation> <translation id="7941975817681987555">Не передбачати дії в мережі</translation> <translation id="7946350455013548764">Якщо для цього правила вибрати значення 3, веб-сайти зможуть запитувати дозвіл на доступ до пристроїв HID. Якщо для нього вибрати значення 2, доступ буде заблоковано. @@ -6881,6 +6896,7 @@ Якщо правило <ph name="DEFAULT_SEARCH_PROVIDER_IMAGE_URL_POST_PARMS_POLICY_NAME" /> не налаштовано, запити пошуку зображень надсилаються через метод GET.</translation> <translation id="8314214821702356835">Дає змогу користувачу відтворювати медіафайли на заблокованому пристрої</translation> +<translation id="8316940611391250886">Заборонити сертифікати без розширення subjectAlternativeName</translation> <translation id="8319678975002906774">Визначає значення керованої конфігурації для веб-сайтів, які відповідають указаним джерелам</translation> <translation id="8320149248919453401">Режим заряджання акумулятора</translation> <translation id="8327651196906278510">Дозволити цим джерелам записувати вкладки</translation> @@ -7158,13 +7174,6 @@ Якщо для цього правила вибрано значення true, вкладки, які були у фоновому режимі принаймні 5 хвилин, можуть зависати. Таким чином ЦП, акумулятор і пам'ять використовуються менше. За допомогою евристичних методів <ph name="PRODUCT_NAME" /> визначає вкладки, які виконують корисні завдання у фоновому режимі (як-от показують сповіщення, відтворюють звук, транслюють відео). Веб-розробники можуть вимкнути зависання для свого сайту (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Якщо для цього правила вибрано значення false, вкладки не зависатимуть.</translation> -<translation id="8619480582976056396">За допомогою цього правила можна заборонити завантаження веб-сторінок за певними URL-адресами. У правилі вказується список шаблонів заборонених URL-адрес. Якщо це правило не налаштовано, у веб-переглядачі дозволено відкривати всі сторінки. Шаблон URL-адрес має відповідати вимогам до формату: https://www.chromium.org/administrators/url-blocklist-filter-format. Винятки можна задати в правилі <ph name="URL_ALLOWLIST_POLICY_NAME" /> (до 1000). - - У <ph name="PRODUCT_NAME" /> 73 та новіших версіях ви можете блокувати URL-адреси "javascript://*". Однак блокуватимуться лише адреси JavaScript, введені в адресному рядку (або, наприклад, букмарклети). Це правило не стосується вбудованих URL-адрес JavaScript із динамічним завантаженням даних. Наприклад, якщо ви заблокували адресу "example.com/abc", сторінка "example.com" усе ще зможе завантажувати "example.com/abc" через XMLHTTPRequest. - - Починаючи з версії <ph name="PRODUCT_NAME" /> 92, це правило підтримується в режимі headless. - - Примітка: блокування внутрішніх URL-адрес "chrome://*" може призвести до неочікуваних помилок.</translation> <translation id="8619748440665904084">Вимкнути імпортування даних автозаповнення форм під час першого запуску</translation> <translation id="8623672932476443039">Якщо ввімкнути це правило, користувачі отримають доступ до режиму розробника для ізольованих додатків. Якщо його вимкнути, користувачі не отримають такий доступ. @@ -7313,9 +7322,6 @@ <translation id="8807313206348471682">Показувати вікно підтвердження виходу</translation> <translation id="8812091410765157924">Дозволити спливаючим вікнам, які націлені на атрибут <ph name="BLANK_PAGE_NAME" />, взаємодіяти зі сторінкою, що відкрила це вікно, лише якщо ця сторінка спеціально дозволяє таку взаємодію</translation> <translation id="8816370949847593408">Залежно від статусу припинення підтримки, запуск додатків Chrome може бути забороненим.</translation> -<translation id="8818173863808665831">Повідомляє географічне місцезнаходження пристрою. - - Якщо це правило не встановлено чи його значення встановлено як "false", місцезнаходження не повідомлятиметься.</translation> <translation id="8818768076343557335">Передбачати дії мережі у всіх мережах, окрім мобільних. (Не підтримується в 50 версії, видалено в 52 версії. У версіях, новіших за 52, значення 1 сприйматиметься як 0 – передбачати дії мережі у всіх мережевих з’єднаннях.)</translation> <translation id="8821678641132607468">Якщо це правило активовано, історія веб-перегляду з попереднього веб-переглядача за умовчанням імпортується під час першого запуску. Якщо це правило деактивовано або не налаштовано, історія веб-перегляду не імпортується під час першого запуску. @@ -7629,6 +7635,7 @@ <translation id="9135033364005346124">Увімкнути проксі-сервер <ph name="CLOUD_PRINT_NAME" /></translation> <translation id="9136212796239682721">Вимкнути інтерфейс зі спливаючою підказкою щодо завантаження</translation> <translation id="9136399279941091445">Інтервали неробочого часу, коли випускаються вказані правила для пристрою</translation> +<translation id="9148720248753722892">Заборонити сертифікати з підписом SHA-1</translation> <translation id="9150416707757015439">Це правило більше не використовується. Натомість використовуйте правило IncognitoModeAvailability. Вмикає режим анонімного перегляду в <ph name="PRODUCT_NAME" />. Якщо це налаштування ввімкнено чи не встановлено, користувачі можуть відкривати веб-сторінки в режимі анонімного перегляду. Якщо це налаштування вимкнено, користувачі не можуть відкривати веб-сторінки в режимі анонімного перегляду. Якщо це правило не встановлено, налаштування вмикається, і користувач може використовувати режим анонімного перегляду.</translation> <translation id="9152473318295429890">Вмикає контекстні пропозиції пов’язаних веб-сторінок</translation> <translation id="9153446010242995516">Відкочуватися до цільової версії та використовувати її, якщо версія ОС новіша. Якщо можливо, під час процесу відкочування спробуйте перенести налаштування пристрою (зокрема, облікові дані мережі), однак виконайте Powerwash, навіть якщо відновлення інформації неможливе (наприклад, цільова версія не підтримує його або така зміна несумісна).
diff --git a/components/policy/resources/policy_templates_vi.xtb b/components/policy/resources/policy_templates_vi.xtb index 5372a6e..20cd37de 100644 --- a/components/policy/resources/policy_templates_vi.xtb +++ b/components/policy/resources/policy_templates_vi.xtb
@@ -2351,11 +2351,6 @@ Nếu bạn không đặt chính sách này, thì người dùng sẽ được chọn hình nền cho màn hình đăng nhập và máy tính.</translation> <translation id="3315324240256767419">Bật tính năng cửa sổ ảo.</translation> -<translation id="3318139290984013203">Thêm một miền điền sẵn vào hộp thoại xác thực Kerberos. - - Nếu bạn đặt chính sách này, thì trường "tên người dùng Kerberos" sẽ hiển thị miền điền sẵn ở bên phải. Nếu người dùng nhập tên người dùng của họ, thì tên này sẽ được liên kết với miền điền sẵn. Nếu nội dung người dùng nhập vào có chứa "@", thì miền điền sẵn sẽ không hiển thị và không ảnh hưởng đến nội dung nhập. - - Nếu bạn không đặt chính sách này thì sẽ không có thông tin bổ sung nào hiển thị và quy trình tạo phiếu yêu cầu hỗ trợ sẽ diễn ra như bình thường.</translation> <translation id="3323819750604111729">Bật chính sách nhập dấu trang trong lần chạy đầu tiên</translation> <translation id="332771718998993005">Xác định tên được quảng cáo là đích <ph name="PRODUCT_NAME" />. @@ -3570,13 +3565,6 @@ <translation id="482803100714220060">Hiển thị URL đầy đủ</translation> <translation id="4832852360828533362">Báo cáo người dùng và thiết bị</translation> <translation id="4834526953114077364">Người dùng gần đây ít sử dụng nhất đã không đăng nhập trong 3 tháng qua và sẽ bị xóa cho tới khi đủ dung lượng trống</translation> -<translation id="483544442646753291">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" />. - - Nếu bạn đặt chính sách này thành "bị chặn", các tính năng bị tắt sẽ không dùng được nhưng vẫn hiển thị với người dùng. - - Nếu bạn đặt chính sách này thành "bị ẩn", các tính năng bị tắt sẽ không dùng được và không hiển thị với người dùng. - - Nếu bạn không đặt chính sách này hoặc đặt giá trị không hợp lệ, chế độ tắt của các tính năng hệ thống sẽ "bị chặn".</translation> <translation id="4835470005923546373">Tắt chế độ in đồ họa nền theo mặc định</translation> <translation id="4835622243021053389">Bật tính năng xác thực NTLMv2.</translation> <translation id="4840015507504937941">Chính sách này đặt kích thước dữ liệu tối thiểu (tính bằng byte) của dữ liệu trong khay nhớ tạm, dữ liệu sẽ được kiểm tra theo các quy tắc hạn chế khay nhớ tạm được xác định trong chính sách DataLeakPreventionRulesList. @@ -4471,9 +4459,6 @@ Nếu bạn đặt chính sách này thành false hoặc không đặt, 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ề VPD của thiết bị sẽ được báo cáo. Dữ liệu sản phẩm quan trọng (VPD) là một tập hợp dữ liệu cấu hình và thông tin (chẳng hạn như bộ phận và số sê-ri) liên quan đến thiết bị đó.</translation> -<translation id="576158229686912964">Chính sách này không còn dùng trong M96 nữa. Thay vào đó, vui lòng dùng <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> và <ph name="REPORT_DEVICE_NETWORK_STATUS" />. - - Nếu bạn bật hoặc không đặt chính sách này, thì những thiết bị đã đăng ký sẽ báo cáo danh sách các giao diện mạng kèm thông tin về loại giao diện và địa chỉ phần cứng. Nếu bạn tắt chính sách này thì các thiết bị đã đăng ký sẽ không báo cáo giao diện mạng.</translation> <translation id="5762969307102447459">Tắt tính năng Tự động điền đối với địa chỉ</translation> <translation id="5765780083710877561">Mô tả:</translation> <translation id="5766438888216077649">Không đặt <ph name="WINDOW_OPENER_PROPERTY" /> cho các đường liên kết nhắm đến <ph name="BLANK_PAGE_NAME" /></translation> @@ -5677,7 +5662,7 @@ <translation id="7002040773317582266">Tính năng kiểm tra các URL trong khung chính theo thời gian thực đang bật.</translation> <translation id="7003746348783715221">Tùy chọn <ph name="PRODUCT_NAME" /></translation> <translation id="7007283257527015835">Một cờ boolean cho biết liệu bạn có phải đặt trình xử lý giao thức làm tùy chọn mặc định hay không.</translation> -<translation id="7008308728445338159">Đã bật các tùy chọn kiểm tra chặn hệ thống tên miền (DNS)</translation> +<translation id="7008308728445338159">Đã bật chế độ kiểm tra việc chặn DNS</translation> <translation id="7010006999849135962">Bật chế độ xác thực không cần mã PIN đối với máy chủ truy cập từ xa</translation> <translation id="7016736684656067099">Nếu bạn đặt chính sách này thành 1, thì tất cả trang web có thể hiển thị hình ảnh. Nếu bạn đặt chính sách này thành 2, thì không trang web nào có thể hiển thị hình ảnh. @@ -6147,9 +6132,6 @@ Nếu bạn không đặt chính sách này, thì chế độ cài đặt mặc định sẽ là <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" /> đối với người dùng do doanh nghiệp quản lý và là <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" /> đối với người dùng không được quản lý. Trong tương lai, bạn có thể dùng giá trị <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> để đặt <ph name="LACROS_NAME" /> làm trình duyệt duy nhất sử dụng được trên <ph name="PRODUCT_OS_NAME" />.</translation> -<translation id="7509761893401042250">Chính sách này không còn dùng nữa kể từ M96. Thay vào đó, vui lòng dùng <ph name="REPORT_DEVICE_CPU_INFO" />, <ph name="REPORT_DEVICE_MEMORY_INFO" />, <ph name="REPORT_DEVICE_STORAGE_STATUS" />, <ph name="REPORT_DEVICE_SECURITY_STATUS" /> và <ph name="REPORT_DEVICE_AUDIO_STATUS" />. - - Nếu bạn bật hoặc không đặt chính sách này, thì các thiết bị đã đăng ký sẽ báo cáo số liệu thống kê phần cứng, chẳng hạn như mức sử dụng CPU/RAM. Nếu bạn tắt chính sách này thì thiết bị đã đăng ký sẽ không báo cáo số liệu thống kê phần cứng.</translation> <translation id="7512065400265675158">Tiêu đề của yêu cầu HTTP <ph name="USER_AGENT_HEADER_NAME" /> được lên lịch để giảm bớt. Để tạo điều kiện cho hoạt động thử nghiệm và khả năng tương thích, chính sách này có thể bật tính năng giảm thiểu cho mọi trang web hoặc tắt tính năng bản dùng thử theo nguyên gốc hoặc bản thử nghiệm để bật tính năng này. Để tìm hiểu thêm về <ph name="USER_AGENT_REDUCTION_FEATURE_NAME" /> và tiến trình của tác nhân này, hãy đọc tại đây: @@ -7187,13 +7169,6 @@ Nếu bạn đặt chính sách này thành true, thì các thẻ chạy trong nền trong tối thiểu 5 phút có thể bị đóng băng. Việc đóng băng thẻ sẽ giúp giảm mức sử dụng CPU, pin và bộ nhớ. <ph name="PRODUCT_NAME" /> sử dụng kỹ thuật "tự nghiệm học" để tránh đóng băng các thẻ hữu ích chạy trong nền (ví dụ: hiển thị thông báo, phát âm thanh, phát video trực tuyến). Các nhà phát triển web cũng có thể chọn không đóng băng trang web của mình (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md). Nếu bạn đặt chính sách thành false thì sẽ không có thẻ nào bị đóng băng.</translation> -<translation id="8619480582976056396">Việc đặt chính sách này sẽ khiến những trang web có URL bị cấm không tải được. Chính sách này cung cấp danh sách các mẫu URL chỉ định URL bị cấm. Nếu bạn không đặt chính sách này thì sẽ không có URL nào bị cấm trong trình duyệt. Đặt định dạng mẫu URL theo định dạng này (https://www.chromium.org/administrators/url-blocklist-filter-format). Bạn có thể xác định tối đa 1.000 trường hợp ngoại lệ trong <ph name="URL_ALLOWLIST_POLICY_NAME" />. - - Từ <ph name="PRODUCT_NAME" /> phiên bản 73, bạn có thể chặn các URL javascript://*. Tuy nhiên, chính sách này chỉ ảnh hưởng đến JavaScript đã nhập vào thanh địa chỉ (hoặc các bookmarklet). Các URL JavaScript trong trang có dữ liệu được tải động không phải tuân theo chính sách này. Ví dụ: nếu bạn chặn example.com/abc thì example.com vẫn có thể tải example.com/abc qua XMLHTTPRequest. - - Từ <ph name="PRODUCT_NAME" /> phiên bản 92, chính sách này cũng được hỗ trợ ở chế độ không có giao diện người dùng. - - Lưu ý: Việc chặn các URL chrome://* nội bộ có thể dẫn đến lỗi không mong muốn.</translation> <translation id="8619748440665904084">Tắt chính sách nhập dữ liệu từ biểu mẫu tự động điền trong lần chạy đầu tiên</translation> <translation id="8623672932476443039">Thao tác thiết lập chính sách này thành Bật sẽ cho phép người dùng truy cập Chế độ nhà phát triển cho các ứng dụng tách biệt. Nếu bạn thiết lập chính sách này thành Tắt, người dùng sẽ không truy cập được những tính năng này. @@ -7342,9 +7317,6 @@ <translation id="8807313206348471682">Hiển thị hộp thoại xác nhận đăng xuất</translation> <translation id="8812091410765157924">Chỉ cho phép cửa sổ bật lên ở trạng thái mở với mục tiêu <ph name="BLANK_PAGE_NAME" /> để tương tác với chính trang đã mở cửa sổ bật lên nếu trang mở thể hiện rõ việc chọn sử dụng hoạt động tương tác đó</translation> <translation id="8816370949847593408">Ứng dụng Chrome có thể không được phép chạy, tùy thuộc vào trạng thái của việc ngừng phát hành.</translation> -<translation id="8818173863808665831">Báo cáo vị trí địa lý của thiết bị. - - Nếu chính sách này không được đặt hoặc được đặt thành false, vị trí sẽ không được báo cáo.</translation> <translation id="8818768076343557335">Dự đoán các tác vụ mạng trên bất kỳ mạng nào không phải là mạng di động. (Không được dùng nữa là 50, đã xóa 52. Sau 52, nếu được đặt thì giá trị 1 sẽ được coi là 0 - dự đoán tác vụ mạng trên kết nối mạng bất kỳ.)</translation> <translation id="8821678641132607468">Nếu bạn đặt chính sách này thành Bật, thì nhật ký duyệt web trên trình duyệt mặc định trước sẽ được nhập trong lần chạy đầu tiên. Nếu bạn đặt chính sách này thành Tắt hoặc không đặt chính sách này, thì nhật ký duyệt web sẽ không được nhập trong lần chạy đầu tiên.
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index 68bb6c1..94a3f22 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -3507,13 +3507,6 @@ <translation id="482803100714220060">显示完整网址</translation> <translation id="4832852360828533362">用户和设备报告</translation> <translation id="4834526953114077364">删除最近3个月内未登录且使用最少的用户,直到有足够的可用空间</translation> -<translation id="483544442646753291">此政策用于控制 <ph name="SYSTEM_FEATURES_DISABLE_LIST" /> 中所列的已停用功能的用户体验。 - - 如果此政策设为“已禁用”,已停用的功能会不可用,但仍对用户可见。 - - 如果此政策设为“已隐藏”,已停用的功能会不可用,并且对用户不可见。 - - 如果此政策未设置或包含无效值,系统功能的停用模式将会是“已禁用”。</translation> <translation id="4835470005923546373">默认停用背景图片打印模式</translation> <translation id="4835622243021053389">启用 NTLMv2 身份验证。</translation> <translation id="4840015507504937941">此政策用于针对剪贴板中的数据设定大小下限(以字节为单位)。如果您设置了此政策,系统便会根据 DataLeakPreventionRulesList 政策中定义的剪贴板限制规则来检查不小于这一下限值的数据。 @@ -4389,9 +4382,6 @@ 如果此政策设为 false 或未设置,系统将不会报告这些信息。 如果此政策设为 true,系统将会报告设备的 VPD 信息。 重要产品数据 (VPD) 是指一系列与设备相关的配置数据和信息类数据,例如部件号和序列号。</translation> -<translation id="576158229686912964">此政策在 M96 中已弃用。请改用 <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> 和 <ph name="REPORT_DEVICE_NETWORK_STATUS" />。 - - 如果此政策已启用或未设置,已注册的设备会以列表形式报告网络接口及其类型和硬件地址。如果此政策已停用,已注册的设备不会报告网络接口。</translation> <translation id="5762969307102447459">禁止使用“自动填充”功能填写地址</translation> <translation id="5765780083710877561">说明:</translation> <translation id="5766438888216077649">不为那些定位到“<ph name="BLANK_PAGE_NAME" />”页面的链接设置 <ph name="WINDOW_OPENER_PROPERTY" /></translation> @@ -6056,9 +6046,6 @@ 如果您未设置此政策,受企业管理的用户将使用默认值“<ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />”,不受企业管理的用户将使用默认值“<ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />”。 将来可以使用“<ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" />”值将 <ph name="LACROS_NAME" /> 设为 <ph name="PRODUCT_OS_NAME" />中唯一可用的浏览器。</translation> -<translation id="7509761893401042250">自 M96 起,此政策已被弃用。请改用 <ph name="REPORT_DEVICE_CPU_INFO" />、<ph name="REPORT_DEVICE_MEMORY_INFO" />、<ph name="REPORT_DEVICE_STORAGE_STATUS" />、<ph name="REPORT_DEVICE_SECURITY_STATUS" /> 和 <ph name="REPORT_DEVICE_AUDIO_STATUS" />。 - - 如果此政策已启用或未设置,已注册的设备会报告硬件统计信息(例如 CPU/RAM 使用情况)。如果此政策已停用,已注册的设备不会报告硬件统计信息。</translation> <translation id="7512065400265675158">我们已排定缩短<ph name="USER_AGENT_HEADER_NAME" /> HTTP 请求标头的时间。为方便测试和提高兼容性,此政策可为所有网站启用缩短功能,也可禁止通过源试用或现场试验启用该功能。 如需详细了解“<ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />”功能及其发布阶段时间安排,请参阅: @@ -7067,13 +7054,6 @@ 如果此政策设为 true,系统可能会冻结已在后台运行至少 5 分钟的标签页。冻结标签页可以降低 CPU、电池和内存使用量。<ph name="PRODUCT_NAME" /> 会使用试探法来避免冻结在后台执行有用工作(例如显示通知、播放声音、流式传输视频)的标签页。网络开发者也可选择停用用于冻结网站标签页的功能 (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md)。 如果此政策设为 false,系统将不会冻结任何标签页。</translation> -<translation id="8619480582976056396">通过设置此政策,您可禁止加载已列入屏蔽名单的网址所对应的网页。此政策列出了一系列网址格式,用于指定禁止加载的网址。如果您未设置此政策,那么任何网址都能在浏览器中加载。所列网址必须采用 https://www.chromium.org/administrators/url-blocklist-filter-format 规定的格式。在 <ph name="URL_ALLOWLIST_POLICY_NAME" /> 中,您最多可定义 1000 个例外情况。 - - 从 <ph name="PRODUCT_NAME" /> 73 版开始,您可以屏蔽 javascript://* 网址。不过,这仅会影响在地址栏(或小书签等)中输入的 JavaScript 网址。凡是能动态加载数据的页内 JavaScript 网址都不会受此政策影响。例如,即使您屏蔽了 example.com/abc,example.com 仍可以使用 XMLHTTPRequest 加载 example.com/abc。 - - 从 <ph name="PRODUCT_NAME" /> 92 版开始,此政策在无头模式中也受支持。 - - 注意:屏蔽内部 chrome://* 网址可能会导致意外的错误。</translation> <translation id="8619748440665904084">禁止在首次运行时导入自动填充表单数据</translation> <translation id="8623672932476443039">如果启用此政策,用户可以访问已隔离应用的开发者模式。 如果停用此政策,用户将无法使用这些功能。 @@ -7222,9 +7202,6 @@ <translation id="8807313206348471682">显示让用户确认退出登录的对话框</translation> <translation id="8812091410765157924">允许以 <ph name="BLANK_PAGE_NAME" /> 为目标打开的弹出式窗口与那个打开弹出式窗口的页面互动,但前提是这个页面已明确接受此类互动</translation> <translation id="8816370949847593408">Chrome 应用能否运行取决于弃用安排的状态。</translation> -<translation id="8818173863808665831">报告设备的地理位置。 - - 如果未设置此政策或将其设为 false,系统将不会报告相关位置。</translation> <translation id="8818768076343557335">连上网络时一律预测网络操作(移动网络除外)。 (在版本 50 中已不适用,在版本 52 中已遭到移除。在 52 以上版本中,如果设置值为 1,则系统会视为 0 - 连上网络时一律预测网络操作。)</translation> <translation id="8821678641132607468">如果此政策已启用,当首次运行浏览器时,系统将会从先前的默认浏览器导入浏览记录。如果此政策已停用或未设置,当首次运行浏览器时,系统不会导入任何浏览记录。
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index acb4ec11..c314c10a 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -3507,13 +3507,6 @@ <translation id="482803100714220060">顯示完整網址</translation> <translation id="4832852360828533362">使用者與裝置回報功能</translation> <translation id="4834526953114077364">移除近期登入次數最少的使用者 (3 個月都未曾登入),直到有足夠的可用空間</translation> -<translation id="483544442646753291">控管 <ph name="SYSTEM_FEATURES_DISABLE_LIST" /> 所列已停用功能的使用者體驗。 - - 如果將這項政策設為「已封鎖」,已停用的功能將無法使用,但仍會顯示在畫面上。 - - 如果將這項政策設為「已隱藏」,已停用的功能將無法使用,且不會顯示在畫面上。 - - 如果未設定這項政策或設為無效的值,系統功能的停用模式將設為「已封鎖」。</translation> <translation id="4835470005923546373">預設停用背景圖形列印模式</translation> <translation id="4835622243021053389">啟用 NTLMv2 驗證。</translation> <translation id="4840015507504937941">這項政策設定的是系統會檢查的最低剪貼簿資料大小 (以位元組為單位),檢查作業將根據 DataLeakPreventionRulesList 政策定義的剪貼簿限制規則進行。 @@ -4378,9 +4371,6 @@ 如果將這項政策設為 False 或未設定,系統將不會回報這項資訊。 如果設為 True,系統將會回報裝置的 VPD 資訊。 重要產品資料 (VPD) 是與裝置相關聯的一組設定和說明資料 (例如零件和序號)。</translation> -<translation id="576158229686912964">這項政策已在 M96 遭到淘汰,請改用 <ph name="REPORT_DEVICE_NETWORK_CONFIGURATION" /> 和 <ph name="REPORT_DEVICE_NETWORK_STATUS" />。 - - 如果將這項政策設為啟用或不設定,已註冊的裝置會回報網路介面清單,當中包含網路介面類型和硬體位址資料。如果將這項政策設為停用,已註冊的裝置不會回報網路介面資訊。</translation> <translation id="5762969307102447459">停用地址的自動填入功能</translation> <translation id="5765780083710877561">說明:</translation> <translation id="5766438888216077649">不要為目標是 <ph name="BLANK_PAGE_NAME" /> 的連結設定 <ph name="WINDOW_OPENER_PROPERTY" /></translation> @@ -6039,9 +6029,6 @@ 如果不設定這項政策,受企業管理使用者的預設值為 <ph name="LACROS_AVAILABILITY_LACROS_DISALLOWED_VALUE" />;其他未受管理使用者的預設值則為 <ph name="LACROS_AVAILABILITY_USER_CHOICE_VALUE" />。 日後也可以使用 <ph name="LACROS_AVAILABILITY_LACROS_ONLY_VALUE" /> 一值,將 <ph name="LACROS_NAME" /> 設為 <ph name="PRODUCT_OS_NAME" /> 中唯一可用的瀏覽器。</translation> -<translation id="7509761893401042250">這項政策已在 M96 遭到淘汰,請改用 <ph name="REPORT_DEVICE_CPU_INFO" />、<ph name="REPORT_DEVICE_MEMORY_INFO" />、<ph name="REPORT_DEVICE_STORAGE_STATUS" />、<ph name="REPORT_DEVICE_SECURITY_STATUS" /> 和 <ph name="REPORT_DEVICE_AUDIO_STATUS" />。 - - 如果將這項政策設為啟用或不設定,已註冊的裝置會回報 CPU/RAM 使用量等硬體統計資料。如果將這項政策設為停用,已註冊的裝置不會回報硬體統計資料。</translation> <translation id="7512065400265675158">已排定縮減「<ph name="USER_AGENT_HEADER_NAME" />」要求標頭。為了方便測試及提高相容性,這項政策可以為所有網站啟用縮減功能,或停用來源試用或實際測試設定以啟用這項功能。 如要進一步瞭解「<ph name="USER_AGENT_REDUCTION_FEATURE_NAME" />」和其時間軸,請閱讀這篇文章: @@ -7039,13 +7026,6 @@ 如果將這項政策設為 True,系統可能會凍結在背景執行 5 分鐘以上的分頁。凍結分頁可降低 CPU、電力和記憶體的使用量。<ph name="PRODUCT_NAME" /> 會根據經驗法則判斷,不會凍結在背景執行實用作業 (例如顯示通知、播放音效、串流播放影片) 的分頁。網站開發人員也可以將自己的網站設為禁止凍結 (https://chromium.googlesource.com/chromium/src/+/HEAD/chrome/browser/performance_manager/docs/freezing_opt_out_opt_in.md)。 如果將這項政策設為 False,系統將不會凍結任何分頁。</translation> -<translation id="8619480582976056396">你可以透過這項政策,禁止系統載入網址遭到禁止的網頁。這項政策可提供網址模式清單,用於指定要禁止的網址。如果未設定這項政策,則瀏覽器不會禁止任何網址。網址模式如下:https://www.chromium.org/administrators/url-blocklist-filter-format。<ph name="URL_ALLOWLIST_POLICY_NAME" /> 中最多可定義 1000 個例外網址。 - - 自 <ph name="PRODUCT_NAME" /> 73 版開始,你可以封鎖 javascript://* 網址。不過,這項設定只適用於在網址列 (或書籤小程式等) 輸入的 JavaScript,動態載入資料的網頁內 JavaScript 網址不會受到這項政策影響。舉例來說,即使你封鎖了 example.com/abc,example.com 仍可透過 XMLHTTPRequest 載入 example.com/abc。 - - 自 <ph name="PRODUCT_NAME" /> 92 版起,系統在無頭模式下也會支援這項政策。 - - 注意:封鎖內部的 chrome://* 網址可能會導致非預期的錯誤。</translation> <translation id="8619748440665904084">不允許在第一次執行時匯入自動填入表單資料</translation> <translation id="8623672932476443039">如果將這項政策設為啟用,使用者可以存取「已隔離應用程式的開發人員模式」。 如果將這項政策設為停用,使用者將無法存取這些功能。 @@ -7190,9 +7170,6 @@ <translation id="8807313206348471682">顯示登出確認對話方塊</translation> <translation id="8812091410765157924">只有在要求開啟彈出式視窗的網頁明確同意與該彈出式視窗互動時,才允許透過 <ph name="BLANK_PAGE_NAME" /> 連結目標開啟的彈出式視窗進行這類互動</translation> <translation id="8816370949847593408">視淘汰實施狀態而定,系統可能會不允許執行 Chrome 應用程式。</translation> -<translation id="8818173863808665831">回報裝置的地理位置。 - - 如果未設定這項政策,或將其設定為 False,系統將不會回報位置。</translation> <translation id="8818768076343557335">連上網路時一律預測網路動作 (行動網路除外)。 (在版本 50 中已不適用,在版本 52 中已遭移除。在 52 以上版本中,如果設定值為 1,系統會視為 0 - 連上網路時一律預測網路動作。)</translation> <translation id="8821678641132607468">如果將這項政策設為啟用,瀏覽器會在首次執行時,從先前的預設瀏覽器中匯入瀏覽記錄。如果將這項政策設為停用或不設定,瀏覽器首次執行時不會匯入任何瀏覽記錄。
diff --git a/components/reporting/client/BUILD.gn b/components/reporting/client/BUILD.gn index 9b5e7cc..af45271 100644 --- a/components/reporting/client/BUILD.gn +++ b/components/reporting/client/BUILD.gn
@@ -75,7 +75,6 @@ "//components/reporting/storage:storage_module", "//components/reporting/storage:storage_module_interface", "//components/reporting/storage_selector", - "//components/reporting/util:shared_queue", "//components/reporting/util:status", "//components/reporting/util:status_macros", ]
diff --git a/components/reporting/client/mock_report_queue_provider.cc b/components/reporting/client/mock_report_queue_provider.cc index e225d445..bfaa9265 100644 --- a/components/reporting/client/mock_report_queue_provider.cc +++ b/components/reporting/client/mock_report_queue_provider.cc
@@ -10,6 +10,7 @@ #include "base/bind.h" #include "base/callback_helpers.h" #include "base/task/sequenced_task_runner.h" +#include "base/task/thread_pool.h" #include "base/test/gmock_callback_support.h" #include "base/threading/thread_task_runner_handle.h" #include "components/reporting/client/mock_report_queue.h"
diff --git a/components/reporting/client/report_queue_factory.cc b/components/reporting/client/report_queue_factory.cc index d963a6c..7e6f1ba 100644 --- a/components/reporting/client/report_queue_factory.cc +++ b/components/reporting/client/report_queue_factory.cc
@@ -10,6 +10,7 @@ #include "base/callback.h" #include "base/strings/string_piece.h" #include "base/task/bind_post_task.h" +#include "base/task/thread_pool.h" #include "base/threading/thread_task_runner_handle.h" #include "components/reporting/client/report_queue_configuration.h" #include "components/reporting/client/report_queue_provider.h"
diff --git a/components/reporting/client/report_queue_provider.cc b/components/reporting/client/report_queue_provider.cc index 53b1c7a..74278455 100644 --- a/components/reporting/client/report_queue_provider.cc +++ b/components/reporting/client/report_queue_provider.cc
@@ -10,7 +10,7 @@ #include "base/bind.h" #include "base/callback.h" #include "base/feature_list.h" -#include "base/memory/raw_ptr.h" +#include "base/memory/ptr_util.h" #include "base/memory/ref_counted.h" #include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" @@ -23,12 +23,68 @@ #include "components/reporting/client/report_queue_impl.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/storage/storage_module_interface.h" -#include "components/reporting/util/shared_queue.h" #include "components/reporting/util/status.h" +#include "components/reporting/util/status_macros.h" #include "components/reporting/util/statusor.h" namespace reporting { +using InitCompleteCallback = base::OnceCallback<void(Status)>; + +// Report queue creation request. Recorded in the `create_request_queue_` when +// provider cannot create queues yet. +class ReportQueueProvider::CreateReportQueueRequest { + public: + static void New(std::unique_ptr<ReportQueueConfiguration> config, + CreateReportQueueCallback create_cb) { + auto* const provider = GetInstance(); + DCHECK(provider) + << "Provider must exist, otherwise it is an internal error"; + auto request = base::WrapUnique( + new CreateReportQueueRequest(std::move(config), std::move(create_cb))); + provider->sequenced_task_runner_->PostTask( + FROM_HERE, + base::BindOnce( + [](base::WeakPtr<ReportQueueProvider> provider, + std::unique_ptr<CreateReportQueueRequest> request) { + if (!provider) { + std::move(request->release_create_cb()) + .Run(Status(error::UNAVAILABLE, + "Provider has been shut down")); + return; + } + DCHECK_CALLED_ON_VALID_SEQUENCE(provider->sequence_checker_); + provider->create_request_queue_.push(std::move(request)); + provider->CheckInitializationState(); + }, + provider->GetWeakPtr(), std::move(request))); + } + + CreateReportQueueRequest(const CreateReportQueueRequest& other) = delete; + CreateReportQueueRequest& operator=(const CreateReportQueueRequest& other) = + delete; + ~CreateReportQueueRequest() = default; + + std::unique_ptr<ReportQueueConfiguration> release_config() { + DCHECK(config_) << "Can only be released once"; + return std::move(config_); + } + + ReportQueueProvider::CreateReportQueueCallback release_create_cb() { + DCHECK(create_cb_) << "Can only be released once"; + return std::move(create_cb_); + } + + private: + // Constructor is only called by `New` factory method above. + CreateReportQueueRequest(std::unique_ptr<ReportQueueConfiguration> config, + CreateReportQueueCallback create_cb) + : config_(std::move(config)), create_cb_(std::move(create_cb)) {} + + std::unique_ptr<ReportQueueConfiguration> config_; + CreateReportQueueCallback create_cb_; +}; + // ReportQueueProvider core implementation. // static @@ -40,59 +96,9 @@ const base::Feature ReportQueueProvider::kEncryptedReportingPipeline{ "EncryptedReportingPipeline", base::FEATURE_ENABLED_BY_DEFAULT}; -// Context of a single initialization of the ReportQueueProvider. -// Once the result is collected, makes a call to |Complete| -// passing resulting status (if status is OK, -// |ReportQueueProvider::OnInitCompleted| will be called, and it may further -// update the provider). -class ReportQueueProvider::InitializingContext { - public: - InitializingContext( - ReportQueueProvider* provider, - InitCompleteCallback init_complete_cb, - scoped_refptr<InitializationStateTracker> init_state_tracker); - - // Start initialization. - void Start(); - - // Initialization is done, responds with status and self-destructs. - void Complete(Status status); - - protected: - // Accessor to the owning provider. - ReportQueueProvider* provider() const; - - // Destructor only called from Complete(). - // The class runs a series of callbacks each of which may invoke - // either the next callback or Complete(). Thus eventually Complete() - // is always called and InitializingContext instance is self-destruct. - ~InitializingContext(); - - private: - // Called upon leader promotion: OK means we are a leader and initialization - // can start by calling OnStart. ALREADY_EXIST means another leader has been - // assigned already. Any other code indicates an initialization error. - void OnLeaderPromotionResult( - StatusOr<InitializationStateTracker::ReleaseLeaderCallback> promo_result); - - // Handles StorageModule instantiation for the provider to refer to. - void OnStorageModuleConfigured( - StatusOr<scoped_refptr<StorageModuleInterface>> storage_result); - - const raw_ptr<ReportQueueProvider> provider_; - - InitializationStateTracker::ReleaseLeaderCallback release_leader_cb_; - scoped_refptr<InitializationStateTracker> init_state_tracker_; - - InitCompleteCallback init_complete_cb_; -}; - ReportQueueProvider::ReportQueueProvider( StorageModuleCreateCallback storage_create_cb) : storage_create_cb_(storage_create_cb), - create_request_queue_(SharedQueue<CreateReportQueueRequest>::Create()), - init_state_tracker_( - ReportQueueProvider::InitializationStateTracker::Create()), sequenced_task_runner_(base::ThreadPool::CreateSequencedTaskRunner( {base::TaskPriority::BEST_EFFORT, base::MayBlock()})) { DETACH_FROM_SEQUENCE(sequence_checker_); @@ -100,17 +106,37 @@ ReportQueueProvider::~ReportQueueProvider() = default; +base::WeakPtr<ReportQueueProvider> ReportQueueProvider::GetWeakPtr() { + return weak_ptr_factory_.GetWeakPtr(); +} + +scoped_refptr<StorageModuleInterface> ReportQueueProvider::storage() const { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + return storage_; +} + +scoped_refptr<base::SequencedTaskRunner> +ReportQueueProvider::sequenced_task_runner() const { + return sequenced_task_runner_; +} + void ReportQueueProvider::CreateNewQueue( std::unique_ptr<ReportQueueConfiguration> config, CreateReportQueueCallback cb) { sequenced_task_runner_->PostTask( FROM_HERE, base::BindOnce( - [](ReportQueueProvider* provider, + [](base::WeakPtr<ReportQueueProvider> provider, std::unique_ptr<ReportQueueConfiguration> config, CreateReportQueueCallback cb) { + if (!provider) { + std::move(cb).Run( + Status(error::UNAVAILABLE, "Provider has been shut down")); + return; + } // Configure report queue config with an appropriate DM token and - // proceed to create the queue if configuration was successful + // proceed to create the queue if configuration was successful. + DCHECK_CALLED_ON_VALID_SEQUENCE(provider->sequence_checker_); auto report_queue_configured_cb = base::BindOnce( [](scoped_refptr<StorageModuleInterface> storage, CreateReportQueueCallback cb, @@ -123,16 +149,19 @@ return; } - // proceed to create the queue - ReportQueueImpl::Create(std::move(config_result.ValueOrDie()), - storage, std::move(cb)); + // Proceed to create the queue on arbitrary thread. + base::ThreadPool::PostTask( + FROM_HERE, + base::BindOnce(&ReportQueueImpl::Create, + std::move(config_result.ValueOrDie()), + storage, std::move(cb))); }, - provider->storage(), std::move(cb)); + provider->storage_, std::move(cb)); provider->ConfigureReportQueue( std::move(config), std::move(report_queue_configured_cb)); }, - this, std::move(config), std::move(cb))); + GetWeakPtr(), std::move(config), std::move(cb))); } StatusOr<std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter>> @@ -155,11 +184,7 @@ std::move(create_cb).Run(not_enabled); return; } - auto* instance = GetInstance(); - instance->create_request_queue_->Push( - CreateReportQueueRequest(std::move(config), std::move(create_cb)), - base::BindOnce(&ReportQueueProvider::OnPushComplete, - base::Unretained(instance))); + CreateReportQueueRequest::New(std::move(config), std::move(create_cb)); } // static @@ -174,319 +199,76 @@ VLOG(1) << not_enabled; return not_enabled; } - auto* instance = GetInstance(); - // Instantiate speculative queue. - auto speculative_queue_result = instance->CreateNewSpeculativeQueue(); - if (!speculative_queue_result.ok()) { - return speculative_queue_result.status(); - } + // Instantiate speculative queue, bail out in case of an error. + ASSIGN_OR_RETURN(auto speculative_queue, + GetInstance()->CreateNewSpeculativeQueue()); // Initiate underlying queue creation. - auto speculative_queue = std::move(speculative_queue_result.ValueOrDie()); - instance->create_request_queue_->Push( - CreateReportQueueRequest(std::move(config), - speculative_queue->PrepareToAttachActualQueue()), - base::BindOnce(&ReportQueueProvider::OnPushComplete, - base::Unretained(instance))); + CreateReportQueueRequest::New( + std::move(config), speculative_queue->PrepareToAttachActualQueue()); return speculative_queue; } -void ReportQueueProvider::OnPushComplete() { - init_state_tracker_->GetInitState(base::BindOnce( - &ReportQueueProvider::OnInitState, base::Unretained(this))); -} - -void ReportQueueProvider::OnInitState(bool provider_configured) { - if (!provider_configured) { - // Schedule an InitializingContext to take care of initialization. - InitializingContext* const context = new InitializingContext( - this, - base::BindOnce(&ReportQueueProvider::OnInitializationComplete, - base::Unretained(this)), - init_state_tracker_); +void ReportQueueProvider::CheckInitializationState() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (!storage_) { + // Provider not ready. + DCHECK(!create_request_queue_.empty()) << "Request queue cannot be empty"; + if (create_request_queue_.size() > 1) { + // More than one request in the queue - it means Storage creation has + // already been started. + return; + } + // Start Storage creation on an arbitrary thread. Upon completion resume on + // sequenced task runner. base::ThreadPool::PostTask( FROM_HERE, - base::BindOnce(&InitializingContext::Start, base::Unretained(context))); + base::BindOnce( + [](StorageModuleCreateCallback storage_create_cb, + OnStorageModuleCreatedCallback on_storage_created_cb) { + storage_create_cb.Run(std::move(on_storage_created_cb)); + }, + storage_create_cb_, + base::BindPostTask( + sequenced_task_runner_, + base::BindOnce(&ReportQueueProvider::OnStorageModuleConfigured, + GetWeakPtr())))); return; } - // Client was configured, build the queue! - create_request_queue_->Pop(base::BindOnce( - &ReportQueueProvider::BuildRequestQueue, base::Unretained(this))); -} - -void ReportQueueProvider::OnInitializationComplete(Status init_status) { - if (init_status.error_code() == error::RESOURCE_EXHAUSTED) { - // This happens when a new request comes in while the ReportQueueProvider is - // undergoing initialization. The leader will either clear or build the - // queue when it completes. - return; - } - - // Configuration failed. Clear out all the requests that came in while we were - // attempting to configure. - if (!init_status.ok()) { - create_request_queue_->Swap( - base::queue<CreateReportQueueRequest>(), - base::BindOnce(&ReportQueueProvider::ClearRequestQueue, - base::Unretained(this))); - return; - } - create_request_queue_->Pop(base::BindOnce( - &ReportQueueProvider::BuildRequestQueue, base::Unretained(this))); -} - -void ReportQueueProvider::ClearRequestQueue( - base::queue<CreateReportQueueRequest> failed_requests) { - while (!failed_requests.empty()) { - // Post to general thread. - base::ThreadPool::PostTask( - FROM_HERE, base::BindOnce( - [](CreateReportQueueRequest queue_request) { - std::move(queue_request.create_cb()) - .Run(Status(error::UNAVAILABLE, - "Unable to build a ReportQueue")); - }, - std::move(failed_requests.front()))); - failed_requests.pop(); + // Storage ready, create all report queues that were submitted. + // Note that `CreateNewQueue` call offsets heavy work to arbitrary threads. + while (!create_request_queue_.empty()) { + auto& report_queue_request = create_request_queue_.front(); + CreateNewQueue(report_queue_request->release_config(), + report_queue_request->release_create_cb()); + create_request_queue_.pop(); } } -void ReportQueueProvider::BuildRequestQueue( - StatusOr<CreateReportQueueRequest> pop_result) { - // Queue is clear - nothing more to do. - if (!pop_result.ok()) { - return; - } - - // We don't want to block either the ReportQueueProvider - // sequenced_task_runner_ or the create_request_queue_.sequenced_task_runner_, - // so we post the task to a general thread. - base::ThreadPool::PostTask( - FROM_HERE, - base::BindOnce( - [](ReportQueueProvider* provider, - CreateReportQueueRequest report_queue_request) { - provider->CreateNewQueue(report_queue_request.config(), - report_queue_request.create_cb()); - }, - base::Unretained(this), std::move(pop_result.ValueOrDie()))); - - // Build the next item asynchronously - create_request_queue_->Pop(base::BindOnce( - &ReportQueueProvider::BuildRequestQueue, base::Unretained(this))); -} - -// CreateReportQueueRequest implementation. - -ReportQueueProvider::CreateReportQueueRequest::CreateReportQueueRequest( - std::unique_ptr<ReportQueueConfiguration> config, - CreateReportQueueCallback create_cb) - : config_(std::move(config)), create_cb_(std::move(create_cb)) {} - -ReportQueueProvider::CreateReportQueueRequest::~CreateReportQueueRequest() = - default; - -ReportQueueProvider::CreateReportQueueRequest::CreateReportQueueRequest( - ReportQueueProvider::CreateReportQueueRequest&& other) - : config_(other.config()), create_cb_(other.create_cb()) {} - -std::unique_ptr<ReportQueueConfiguration> -ReportQueueProvider::CreateReportQueueRequest::config() { - return std::move(config_); -} - -ReportQueueProvider::CreateReportQueueCallback -ReportQueueProvider::CreateReportQueueRequest::create_cb() { - return std::move(create_cb_); -} - -scoped_refptr<StorageModuleInterface> ReportQueueProvider::storage() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - return storage_; -} - -scoped_refptr<base::SequencedTaskRunner> -ReportQueueProvider::sequenced_task_runner() { - return sequenced_task_runner_; -} - -// InitializingContext implementation. - -ReportQueueProvider::InitializingContext::InitializingContext( - ReportQueueProvider* provider, - InitCompleteCallback init_complete_cb, - scoped_refptr<ReportQueueProvider::InitializationStateTracker> - init_state_tracker) - : provider_(provider), - init_state_tracker_(init_state_tracker), - init_complete_cb_(std::move(init_complete_cb)) { - DCHECK(provider_); -} - -ReportQueueProvider::InitializingContext::~InitializingContext() = default; - -ReportQueueProvider* ReportQueueProvider::InitializingContext::provider() - const { - return provider_; -} - -void ReportQueueProvider::InitializingContext::Start() { - init_state_tracker_->RequestLeaderPromotion(base::BindOnce( - &InitializingContext::OnLeaderPromotionResult, base::Unretained(this))); -} - -void ReportQueueProvider::InitializingContext::OnLeaderPromotionResult( - StatusOr< - ReportQueueProvider::InitializationStateTracker::ReleaseLeaderCallback> - promo_result) { - if (!promo_result.ok()) { - Complete(promo_result.status()); - return; - } - - release_leader_cb_ = std::move(promo_result.ValueOrDie()); - - // Proceed with storage creation asynchronously. - base::OnceCallback<void(StatusOr<scoped_refptr<StorageModuleInterface>>)> - result_cb = base::BindOnce( - &ReportQueueProvider::InitializingContext::OnStorageModuleConfigured, - base::Unretained(this)); - base::ThreadPool::PostTask( - FROM_HERE, {base::TaskPriority::BEST_EFFORT}, - base::BindOnce( - [](StorageModuleCreateCallback create_cb, - OnStorageModuleCreatedCallback storage_result_cb) { - create_cb.Run(std::move(storage_result_cb)); - }, - provider_->storage_create_cb_, - base::BindPostTask(provider_->sequenced_task_runner_, - std::move(result_cb)))); -} - -void ReportQueueProvider::InitializingContext::OnStorageModuleConfigured( +void ReportQueueProvider::OnStorageModuleConfigured( StatusOr<scoped_refptr<StorageModuleInterface>> storage_result) { - DCHECK_CALLED_ON_VALID_SEQUENCE(provider_->sequence_checker_); + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!storage_result.ok()) { - Complete(storage_result.status()); - return; - } - DCHECK(!provider_->storage_) << "Storage module already recorded"; - provider_->storage_ = storage_result.ValueOrDie(); - Complete(Status::StatusOK()); -} - -void ReportQueueProvider::InitializingContext::Complete(Status status) { - if (status.error_code() == error::RESOURCE_EXHAUSTED) { - // There is already a leader initializing the ReportQueueProvider. - std::move(init_complete_cb_).Run(status); - delete this; + // Storage creation failed, kill all requests. + while (!create_request_queue_.empty()) { + auto& report_queue_request = create_request_queue_.front(); + std::move(report_queue_request->release_create_cb()) + .Run(Status(error::UNAVAILABLE, "Unable to build a ReportQueue")); + create_request_queue_.pop(); + } return; } - if (status.ok()) { - // Let provider subclass do final adjustments in case of success. - provider_->OnInitCompleted(); - std::move(release_leader_cb_).Run(/*initialization_successful=*/true); - } else if (status.error_code() == error::ALREADY_EXISTS) { - // Between building this InitializingContext and attempting to promote to - // leader, the |ReportQueueProvider| was configured. Respond Ok but do not - // update the provider. - status = Status::StatusOK(); + // Storage ready, create all report queues that were submitted. + // Note that `CreateNewQueue` call offsets heavy work to arbitrary threads. + DCHECK(!storage_) << "Storage module already recorded"; + OnInitCompleted(); + storage_ = storage_result.ValueOrDie(); + while (!create_request_queue_.empty()) { + auto& report_queue_request = create_request_queue_.front(); + CreateNewQueue(report_queue_request->release_config(), + report_queue_request->release_create_cb()); + create_request_queue_.pop(); } - - std::move(init_complete_cb_).Run(status); - delete this; } - -// InitializationStateTracker implementation. - -ReportQueueProvider::InitializationStateTracker::InitializationStateTracker() - : sequenced_task_runner_(base::ThreadPool::CreateSequencedTaskRunner({})) { - DETACH_FROM_SEQUENCE(sequence_checker_); -} - -ReportQueueProvider::InitializationStateTracker::~InitializationStateTracker() = - default; - -// static -scoped_refptr<ReportQueueProvider::InitializationStateTracker> -ReportQueueProvider::InitializationStateTracker::Create() { - return base::WrapRefCounted( - new ReportQueueProvider::InitializationStateTracker()); -} - -void ReportQueueProvider::InitializationStateTracker::GetInitState( - GetInitStateCallback get_init_state_cb) { - sequenced_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&ReportQueueProvider::InitializationStateTracker:: - OnIsInitializedRequest, - this, std::move(get_init_state_cb))); -} - -void ReportQueueProvider::InitializationStateTracker::RequestLeaderPromotion( - LeaderPromotionRequestCallback promo_request_cb) { - sequenced_task_runner_->PostTask( - FROM_HERE, - base::BindOnce(&ReportQueueProvider::InitializationStateTracker:: - OnLeaderPromotionRequest, - this, std::move(promo_request_cb))); -} - -void ReportQueueProvider::InitializationStateTracker::OnIsInitializedRequest( - GetInitStateCallback get_init_state_cb) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - base::ThreadPool::PostTask( - FROM_HERE, - base::BindOnce( - [](GetInitStateCallback get_init_state_cb, bool is_initialized) { - std::move(get_init_state_cb).Run(is_initialized); - }, - std::move(get_init_state_cb), is_initialized_)); -} - -void ReportQueueProvider::InitializationStateTracker::OnLeaderPromotionRequest( - LeaderPromotionRequestCallback promo_request_cb) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - StatusOr<ReleaseLeaderCallback> result; - if (is_initialized_) { - result = Status(error::ALREADY_EXISTS, - "ReportQueueProvider is already configured"); - } else if (has_promoted_initializing_context_) { - result = - Status(error::RESOURCE_EXHAUSTED, - "ReportQueueProvider already has a lead initializing context."); - } else { - has_promoted_initializing_context_ = true; - result = base::BindOnce( - &ReportQueueProvider::InitializationStateTracker::ReleaseLeader, this); - } - - base::ThreadPool::PostTask( - FROM_HERE, base::BindOnce( - [](LeaderPromotionRequestCallback promo_request_cb, - StatusOr<ReleaseLeaderCallback> result) { - std::move(promo_request_cb).Run(std::move(result)); - }, - std::move(promo_request_cb), std::move(result))); -} - -void ReportQueueProvider::InitializationStateTracker::ReleaseLeader( - bool initialization_successful) { - sequenced_task_runner_->PostTask( - FROM_HERE, - base::BindOnce( - &ReportQueueProvider::InitializationStateTracker::OnLeaderRelease, - this, initialization_successful)); -} - -void ReportQueueProvider::InitializationStateTracker::OnLeaderRelease( - bool initialization_successful) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - if (initialization_successful) { - is_initialized_ = true; - } - has_promoted_initializing_context_ = false; -} - } // namespace reporting
diff --git a/components/reporting/client/report_queue_provider.h b/components/reporting/client/report_queue_provider.h index a4cd8c7..11b204f57 100644 --- a/components/reporting/client/report_queue_provider.h +++ b/components/reporting/client/report_queue_provider.h
@@ -6,6 +6,7 @@ #define COMPONENTS_REPORTING_CLIENT_REPORT_QUEUE_PROVIDER_H_ #include <memory> +#include <queue> #include <utility> #include "base/callback.h" @@ -17,7 +18,6 @@ #include "components/reporting/client/report_queue_configuration.h" #include "components/reporting/proto/synced/record_constants.pb.h" #include "components/reporting/storage/storage_module_interface.h" -#include "components/reporting/util/shared_queue.h" #include "components/reporting/util/status.h" #include "components/reporting/util/statusor.h" @@ -89,8 +89,6 @@ using CreateReportQueueCallback = base::OnceCallback<void(CreateReportQueueResponse)>; - using InitCompleteCallback = base::OnceCallback<void(Status)>; - using OnStorageModuleCreatedCallback = base::OnceCallback<void(StatusOr<scoped_refptr<StorageModuleInterface>>)>; using StorageModuleCreateCallback = @@ -102,6 +100,8 @@ using ReportQueueConfiguredCallback = base::OnceCallback<void( StatusOr<std::unique_ptr<ReportQueueConfiguration>>)>; + static const base::Feature kEncryptedReportingPipeline; + explicit ReportQueueProvider(StorageModuleCreateCallback storage_create_cb); ReportQueueProvider(const ReportQueueProvider& other) = delete; ReportQueueProvider& operator=(const ReportQueueProvider& other) = delete; @@ -128,80 +128,18 @@ static ReportQueueProvider* GetInstance(); static bool IsEncryptedReportingPipelineEnabled(); - static const base::Feature kEncryptedReportingPipeline; - protected: // Accessors. - scoped_refptr<StorageModuleInterface> storage(); - scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner(); + base::WeakPtr<ReportQueueProvider> GetWeakPtr(); + scoped_refptr<StorageModuleInterface> storage() const; + scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner() const; - class InitializationStateTracker - : public base::RefCountedThreadSafe<InitializationStateTracker> { - public: - using ReleaseLeaderCallback = base::OnceCallback<void(bool)>; - using LeaderPromotionRequestCallback = - base::OnceCallback<void(StatusOr<ReleaseLeaderCallback>)>; - using GetInitStateCallback = base::OnceCallback<void(bool)>; - - static scoped_refptr<InitializationStateTracker> Create(); - - // Will call |get_init_state_cb| with |is_initialized_| value. - void GetInitState(GetInitStateCallback get_init_state_cb); - - // Will promote one initializer to leader at a time. Will deny - // initialization requests if the provider is already initialized. If - // there are no errors will return a ReleaseLeaderCallback for releasing the - // initializing leadership. - // - // Error code responses: - // RESOURCE_EXHAUSTED - Returned when a promotion is requested when there is - // already a leader. - // FAILED_PRECONDITION - Returned when a promotion is requested when - // provider is already initialized. - void RequestLeaderPromotion( - LeaderPromotionRequestCallback promo_request_cb); - - private: - friend class base::RefCountedThreadSafe<InitializationStateTracker>; - InitializationStateTracker(); - virtual ~InitializationStateTracker(); - - void OnIsInitializedRequest(GetInitStateCallback get_init_state_cb); - - void OnLeaderPromotionRequest( - LeaderPromotionRequestCallback promo_request_cb); - - void ReleaseLeader(bool initialization_successful); - void OnLeaderRelease(bool initialization_successful); - - bool has_promoted_initializing_context_{false}; - bool is_initialized_{false}; - - scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; - SEQUENCE_CHECKER(sequence_checker_); - }; - - protected: // Storage module creator (can be substituted for testing purposes). StorageModuleCreateCallback storage_create_cb_; private: // Holds the creation request for a ReportQueue. - class CreateReportQueueRequest { - public: - CreateReportQueueRequest(std::unique_ptr<ReportQueueConfiguration> config, - CreateReportQueueCallback create_cb); - ~CreateReportQueueRequest(); - CreateReportQueueRequest(CreateReportQueueRequest&& other); - - std::unique_ptr<ReportQueueConfiguration> config(); - CreateReportQueueCallback create_cb(); - - private: - std::unique_ptr<ReportQueueConfiguration> config_; - CreateReportQueueCallback create_cb_; - }; - class InitializingContext; + class CreateReportQueueRequest; // Finalizes provider, if the initialization process succeeded. // May to be overridden by subclass to make more updates to the provider. @@ -222,25 +160,32 @@ std::unique_ptr<ReportQueueConfiguration> report_queue_config, ReportQueueConfiguredCallback completion_cb) = 0; - void OnPushComplete(); - void OnInitState(bool provider_configured); - void OnInitializationComplete(Status init_status); + // Checks whether the provider has been initialized, and if so, processes all + // pending queue creation requests. + void CheckInitializationState(); - void ClearRequestQueue(base::queue<CreateReportQueueRequest> failed_requests); - void BuildRequestQueue(StatusOr<CreateReportQueueRequest> pop_result); - - // Queue for storing creation requests while the provider is - // initializing. - scoped_refptr<SharedQueue<CreateReportQueueRequest>> create_request_queue_; - scoped_refptr<InitializationStateTracker> init_state_tracker_; - - // Storage module associated with the provider. It serves all queues created - // by it. Protected by sequenced_task_runner_. - scoped_refptr<StorageModuleInterface> storage_; + // Processes storage or error returned by async call to `storage_create_cb_`. + void OnStorageModuleConfigured( + StatusOr<scoped_refptr<StorageModuleInterface>> storage_result); // Task runner used for guarding the provider elements. scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner_; SEQUENCE_CHECKER(sequence_checker_); + + // Queue for storing creation requests while the provider is + // initializing. + std::queue<std::unique_ptr<CreateReportQueueRequest>> create_request_queue_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // Storage module associated with the provider. It serves all queues created + // by it. `storage_` is null initially and when it becomes non-null, the + // provider is ready to create actual queues (speculative queues can be + // created before that as well). + scoped_refptr<StorageModuleInterface> storage_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // Weak pointer factory. + base::WeakPtrFactory<ReportQueueProvider> weak_ptr_factory_{this}; }; } // namespace reporting
diff --git a/components/reporting/client/report_queue_provider_unittest.cc b/components/reporting/client/report_queue_provider_unittest.cc index 5ce03fdb..ee1c72f 100644 --- a/components/reporting/client/report_queue_provider_unittest.cc +++ b/components/reporting/client/report_queue_provider_unittest.cc
@@ -6,11 +6,14 @@ #include <memory> #include <string> +#include <utility> #include "base/bind.h" +#include "base/task/bind_post_task.h" #include "base/task/thread_pool.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" +#include "base/threading/sequenced_task_runner_handle.h" #include "components/reporting/client/mock_report_queue.h" #include "components/reporting/client/mock_report_queue_provider.h" #include "components/reporting/client/report_queue.h" @@ -31,6 +34,8 @@ namespace reporting { namespace { +constexpr char kTestMessage[] = "TEST MESSAGE"; + class ReportQueueProviderTest : public ::testing::Test { protected: void SetUp() override { @@ -52,8 +57,91 @@ base::BindRepeating([]() { return Status::StatusOK(); }); }; +// Asynchronously creates ReportingQueue and enqueue message. +// Returns result with callback. +void CreateQueuePostData( + std::string data, + Priority priority, + std::unique_ptr<ReportQueueConfiguration> config, + scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner, + ReportQueue::EnqueueCallback done_cb) { + base::OnceCallback<void(StatusOr<std::unique_ptr<ReportQueue>>)> queue_cb = + base::BindOnce( + [](std::string data, Priority priority, + ReportQueue::EnqueueCallback done_cb, + StatusOr<std::unique_ptr<ReportQueue>> report_queue_result) { + // Bail out if queue failed to create. + if (!report_queue_result.ok()) { + std::move(done_cb).Run(report_queue_result.status()); + return; + } + // Queue created successfully, enqueue the message on a random + // thread and verify. + EXPECT_CALL(*static_cast<MockReportQueue*>( + report_queue_result.ValueOrDie().get()), + AddRecord(StrEq(data), Eq(priority), _)) + .WillOnce( + WithArg<2>(Invoke([](ReportQueue::EnqueueCallback cb) { + std::move(cb).Run(Status::StatusOK()); + }))); + base::ThreadPool::PostTask( + FROM_HERE, + base::BindOnce( + [](std::unique_ptr<ReportQueue> queue, std::string data, + Priority priority, + ReportQueue::EnqueueCallback done_cb) { + queue->Enqueue(data, priority, std::move(done_cb)); + }, + std::move(report_queue_result.ValueOrDie()), data, priority, + std::move(done_cb))); + }, + std::string(data), priority, std::move(done_cb)); + ReportQueueProvider::CreateQueue( + std::move(config), + // Verification callback needs to be serialized, because EXPECT_... do not + // support multithreading. + base::BindPostTask(sequenced_task_runner, std::move(queue_cb))); +} + +// Asynchronously creates ReportingQueue and enqueue message. +// Returns result with callback. +void CreateSpeculativeQueuePostData( + std::string data, + Priority priority, + std::unique_ptr<ReportQueueConfiguration> config, + scoped_refptr<base::SequencedTaskRunner> sequenced_task_runner, + ReportQueue::EnqueueCallback done_cb) { + auto report_queue_result = + ReportQueueProvider::CreateSpeculativeQueue(std::move(config)); + // Bail out if queue failed to create. + if (!report_queue_result.ok()) { + std::move(done_cb).Run(report_queue_result.status()); + return; + } + // Queue created successfully, enqueue the message on a random thread and + // verify. + EXPECT_CALL( + *static_cast<MockReportQueue*>(report_queue_result.ValueOrDie().get()), + AddRecord(StrEq(data), Eq(priority), _)) + .WillOnce(WithArg<2>(Invoke([](ReportQueue::EnqueueCallback cb) { + std::move(cb).Run(Status::StatusOK()); + }))); + // Enqueue on a random thread again. + base::ThreadPool::PostTask( + FROM_HERE, + base::BindOnce( + [](std::unique_ptr<ReportQueue, base::OnTaskRunnerDeleter> queue, + std::string data, Priority priority, + ReportQueue::EnqueueCallback done_cb) { + queue->Enqueue(data, priority, std::move(done_cb)); + }, + std::move(report_queue_result.ValueOrDie()), data, priority, + // Verification callback needs to be serialized, because EXPECT_... do + // not support multithreading. + base::BindPostTask(sequenced_task_runner, std::move(done_cb)))); +} + TEST_F(ReportQueueProviderTest, CreateAndGetQueue) { - static constexpr char kTestMessage[] = "TEST MESSAGE"; // Create configuration. auto config_result = ReportQueueConfiguration::Create( EventType::kDevice, destination_, policy_checker_callback_); @@ -65,40 +153,106 @@ test::TestEvent<Status> e; base::ThreadPool::PostTask( FROM_HERE, - base::BindOnce( - [](base::StringPiece data, ReportQueue::EnqueueCallback done_cb, - std::unique_ptr<ReportQueueConfiguration> config) { - // Asynchronously create ReportingQueue. - base::OnceCallback<void(StatusOr<std::unique_ptr<ReportQueue>>)> - queue_cb = base::BindOnce( - [](std::string data, ReportQueue::EnqueueCallback done_cb, - StatusOr<std::unique_ptr<ReportQueue>> - report_queue_result) { - // Bail out if queue failed to create. - if (!report_queue_result.ok()) { - std::move(done_cb).Run(report_queue_result.status()); - return; - } - // Queue created successfully, enqueue the message. - EXPECT_CALL(*static_cast<MockReportQueue*>( - report_queue_result.ValueOrDie().get()), - AddRecord(StrEq(data), Eq(FAST_BATCH), _)) - .WillOnce(WithArg<2>( - Invoke([](ReportQueue::EnqueueCallback cb) { - std::move(cb).Run(Status::StatusOK()); - }))); - report_queue_result.ValueOrDie()->Enqueue( - std::move(data), FAST_BATCH, std::move(done_cb)); - }, - std::string(data), std::move(done_cb)); - ReportQueueProvider::CreateQueue(std::move(config), - std::move(queue_cb)); - }, - kTestMessage, e.cb(), std::move(config_result.ValueOrDie()))); + base::BindOnce(&CreateQueuePostData, kTestMessage, FAST_BATCH, + std::move(config_result.ValueOrDie()), + base::SequencedTaskRunnerHandle::Get(), e.cb())); const auto res = e.result(); EXPECT_OK(res) << res; } +TEST_F(ReportQueueProviderTest, CreateMultipleQueues) { + static constexpr std::array<std::pair<Priority, Destination>, 9> send_as{ + std::make_pair(FAST_BATCH, HEARTBEAT_EVENTS), + std::make_pair(SLOW_BATCH, CRD_EVENTS), + std::make_pair(IMMEDIATE, LOGIN_LOGOUT_EVENTS), + std::make_pair(SLOW_BATCH, HEARTBEAT_EVENTS), + std::make_pair(FAST_BATCH, CRD_EVENTS), + std::make_pair(IMMEDIATE, LOGIN_LOGOUT_EVENTS), + std::make_pair(FAST_BATCH, HEARTBEAT_EVENTS), + std::make_pair(IMMEDIATE, CRD_EVENTS), + std::make_pair(SLOW_BATCH, LOGIN_LOGOUT_EVENTS), + }; + test::TestCallbackAutoWaiter waiter; + waiter.Attach(send_as.size()); + // Expect only one InitCompleted callback. + EXPECT_CALL(*provider_.get(), OnInitCompletedMock()).Times(1); + // ... even though we create multiple queues. + provider_->ExpectCreateNewQueueAndReturnNewMockQueue(send_as.size()); + for (const auto& s : send_as) { + // Create configuration. + auto config_result = ReportQueueConfiguration::Create( + EventType::kDevice, /*destination=*/s.second, policy_checker_callback_); + ASSERT_OK(config_result); + // Compose the message. + std::string message = std::string(kTestMessage) + .append(" priority=") + .append(Priority_Name(s.first)) + .append(" destination=") + .append(Destination_Name(s.second)); + // Asynchronously create ReportingQueue and then asynchronously send the + // message. + auto done_cb = base::BindOnce( + [](test::TestCallbackWaiter* waiter, Status status) { + EXPECT_OK(status) << status; + waiter->Signal(); + }, + &waiter); + base::ThreadPool::PostTask( + FROM_HERE, base::BindOnce(&CreateQueuePostData, std::move(message), + /*priority=*/s.first, + std::move(config_result.ValueOrDie()), + base::SequencedTaskRunnerHandle::Get(), + std::move(done_cb))); + } + waiter.Signal(); // Release the waiter +} + +TEST_F(ReportQueueProviderTest, CreateMultipleSpeculativeQueues) { + static constexpr std::array<std::pair<Priority, Destination>, 9> send_as{ + std::make_pair(FAST_BATCH, HEARTBEAT_EVENTS), + std::make_pair(SLOW_BATCH, CRD_EVENTS), + std::make_pair(IMMEDIATE, LOGIN_LOGOUT_EVENTS), + std::make_pair(SLOW_BATCH, HEARTBEAT_EVENTS), + std::make_pair(FAST_BATCH, CRD_EVENTS), + std::make_pair(IMMEDIATE, LOGIN_LOGOUT_EVENTS), + std::make_pair(FAST_BATCH, HEARTBEAT_EVENTS), + std::make_pair(IMMEDIATE, CRD_EVENTS), + std::make_pair(SLOW_BATCH, LOGIN_LOGOUT_EVENTS), + }; + test::TestCallbackAutoWaiter waiter; + waiter.Attach(send_as.size()); + // Expect only one InitCompleted callback. + EXPECT_CALL(*provider_.get(), OnInitCompletedMock()).Times(1); + // ... even though we create multiple queues. + provider_->ExpectCreateNewSpeculativeQueueAndReturnNewMockQueue( + send_as.size()); + for (const auto& s : send_as) { + // Create configuration. + auto config_result = ReportQueueConfiguration::Create( + EventType::kDevice, /*destination=*/s.second, policy_checker_callback_); + ASSERT_OK(config_result); + // Compose the message. + std::string message = std::string(kTestMessage) + .append(" priority=") + .append(Priority_Name(s.first)) + .append(" destination=") + .append(Destination_Name(s.second)); + // Create SpeculativeReportingQueue and then asynchronously send the + // message. + auto done_cb = base::BindOnce( + [](test::TestCallbackWaiter* waiter, Status status) { + EXPECT_OK(status) << status; + waiter->Signal(); + }, + &waiter); + CreateSpeculativeQueuePostData( + std::move(message), + /*priority=*/s.first, std::move(config_result.ValueOrDie()), + base::SequencedTaskRunnerHandle::Get(), std::move(done_cb)); + } + waiter.Signal(); // Release the waiter +} + TEST_F(ReportQueueProviderTest, CreateReportQueueWithEncryptedReportingPipelineDisabled) { base::test::ScopedFeatureList feature_list; @@ -135,6 +289,5 @@ ASSERT_FALSE(result.ok()); EXPECT_EQ(result.status().code(), error::FAILED_PRECONDITION); } - } // namespace } // namespace reporting
diff --git a/components/segmentation_platform/components_unittests.filter b/components/segmentation_platform/components_unittests.filter index db2a3a76..8b9310b 100644 --- a/components/segmentation_platform/components_unittests.filter +++ b/components/segmentation_platform/components_unittests.filter
@@ -1,3 +1,4 @@ +ConfigParserTest.* CustomInputProcessorTest.* DatabaseMaintenanceImplTest.* DefaultModelManagerTest.* @@ -17,10 +18,6 @@ PriceTrackingActionModelTest.* PriceTrackingInputDelegateTest.* QueryTilesModelTest.* -SegmentInfoDatabaseTest.* -SegmentResultProviderTest.* -SegmentScoreProviderTest.* -SegmentSelectorTest.* SegmentationModelExecutorTest.* SegmentationPlatformDummyUkmManagerTest.* SegmentationPlatformServiceImplEmptyConfigTest.* @@ -28,6 +25,10 @@ SegmentationPlatformServiceImplTest.* SegmentationResultPrefsTest.* SegmentationUkmHelperTest.* +SegmentInfoDatabaseTest.* +SegmentResultProviderTest.* +SegmentScoreProviderTest.* +SegmentSelectorTest.* ServiceProxyImplTest.* SignalDatabaseImplTest.* SignalFilterProcessorTest.* @@ -38,8 +39,8 @@ StatsTest.* TrainingDataCollectorImplTest.* UkmConfigTest.* -UkmDataManagerImplTest.* UkmDatabaseBackendTest.* +UkmDataManagerImplTest.* UkmMetricsTableTest.* UkmObserverTest.* UkmUrlTableTest.*
diff --git a/components/segmentation_platform/internal/BUILD.gn b/components/segmentation_platform/internal/BUILD.gn index 23eafde4..470d1d48 100644 --- a/components/segmentation_platform/internal/BUILD.gn +++ b/components/segmentation_platform/internal/BUILD.gn
@@ -19,6 +19,8 @@ ] sources = [ + "config_parser.cc", + "config_parser.h", "constants.cc", "constants.h", "data_collection/dummy_training_data_collector.cc", @@ -90,8 +92,6 @@ "metadata/metadata_utils.h", "metadata/metadata_writer.cc", "metadata/metadata_writer.h", - "metric_filter_utils.cc", - "metric_filter_utils.h", "platform_options.cc", "platform_options.h", "scheduler/execution_service.cc", @@ -201,6 +201,7 @@ # IMPORTANT NOTE: When adding new tests, also remember to update the list of # tests in //components/segmentation_platform/components_unittests.filter sources = [ + "config_parser_unittest.cc", "data_collection/training_data_collector_impl_unittest.cc", "database/database_maintenance_impl_unittest.cc", "database/mock_signal_database.cc",
diff --git a/components/segmentation_platform/internal/config_parser.cc b/components/segmentation_platform/internal/config_parser.cc new file mode 100644 index 0000000..5f8b934c --- /dev/null +++ b/components/segmentation_platform/internal/config_parser.cc
@@ -0,0 +1,72 @@ +// 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/segmentation_platform/internal/config_parser.h" + +#include "base/json/json_reader.h" +#include "base/logging.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/string_util.h" +#include "components/segmentation_platform/public/config.h" + +namespace segmentation_platform { +namespace { + +constexpr char kSegmentationKey[] = "segmentation_key"; +constexpr char kSegmentationUmaName[] = "segmentation_uma_name"; +constexpr char kSegmentIds[] = "segments"; +constexpr char kSegmentUmaName[] = "segment_uma_name"; +constexpr char kSegmentSelectionTTL[] = "segment_selection_ttl_days"; +constexpr char kUnknownSegmentSelectionTTL[] = + "unknown_segment_selection_ttl_days"; + +} // namespace + +std::unique_ptr<Config> ParseConfigFromString(const std::string& config_str) { + auto value_with_error = + base::JSONReader::ReadAndReturnValueWithError(config_str); + if (!value_with_error.has_value()) { + VLOG(1) << "Config failed to parse: " << config_str + << ". with error: " << value_with_error.error().message; + return nullptr; + } + const base::Value::Dict& config_dict = value_with_error.value().GetDict(); + const std::string* key = config_dict.FindString(kSegmentationKey); + const std::string* uma_name = config_dict.FindString(kSegmentationUmaName); + const base::Value::Dict* segments = config_dict.FindDict(kSegmentIds); + const absl::optional<int> selection_ttl_days = + config_dict.FindInt(kSegmentSelectionTTL); + const absl::optional<int> unknown_selection_ttl_days = + config_dict.FindInt(kUnknownSegmentSelectionTTL); + + if (!key || !uma_name || !segments || !selection_ttl_days) { + return nullptr; + } + auto config = std::make_unique<Config>(); + config->segmentation_key = *key; + config->segmentation_uma_name = *uma_name; + config->segment_selection_ttl = base::Days(*selection_ttl_days); + if (unknown_selection_ttl_days) { + config->unknown_selection_ttl = base::Days(*unknown_selection_ttl_days); + } + + for (const auto segment_id : *segments) { + int segment = 0; + if (!base::StringToInt(segment_id.first, &segment)) { + return nullptr; + } + const base::Value::Dict& segment_dict = segment_id.second.GetDict(); + const std::string* segment_uma_name = + segment_dict.FindString(kSegmentUmaName); + if (!segment_uma_name) { + return nullptr; + } + + config->segments.insert( + {static_cast<proto::SegmentId>(segment), {*segment_uma_name}}); + } + + return config; +} +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/config_parser.h b/components/segmentation_platform/internal/config_parser.h new file mode 100644 index 0000000..61dcd09 --- /dev/null +++ b/components/segmentation_platform/internal/config_parser.h
@@ -0,0 +1,20 @@ +// 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_SEGMENTATION_PLATFORM_INTERNAL_CONFIG_PARSER_H_ +#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_CONFIG_PARSER_H_ + +#include <memory> +#include <string> + +namespace segmentation_platform { + +struct Config; + +// Parses and returns the segmentation config from JSON string. +std::unique_ptr<Config> ParseConfigFromString(const std::string& config_str); + +} // namespace segmentation_platform + +#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_CONFIG_PARSER_H_
diff --git a/components/segmentation_platform/internal/config_parser_unittest.cc b/components/segmentation_platform/internal/config_parser_unittest.cc new file mode 100644 index 0000000..2fbec70 --- /dev/null +++ b/components/segmentation_platform/internal/config_parser_unittest.cc
@@ -0,0 +1,70 @@ +// 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/segmentation_platform/internal/config_parser.h" + +#include "components/segmentation_platform/public/config.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace segmentation_platform { + +TEST(ConfigParserTest, ParseInvalidConfig) { + constexpr char kInvalidJson[] = + R"({"segmentation_key":"test_key, "uma_name":})"; + EXPECT_FALSE(ParseConfigFromString(kInvalidJson)); + + constexpr char kMissingFields[] = R"({"segmentation_key":"test_key"})"; + EXPECT_FALSE(ParseConfigFromString(kMissingFields)); +} + +TEST(ConfigParserTest, ParseValidConfig) { + constexpr char kValidConfig1[] = R"({ + "segmentation_key": "test_key", + "segmentation_uma_name": "TestKey", + "segments": { + "2" : {"segment_uma_name" : "LowEngagement"}, + "7" : {"segment_uma_name" : "HighEngagement"}, + "9" : {"segment_uma_name" : "MediumEngagement"} + }, + "segment_selection_ttl_days": 10 + })"; + auto config1 = ParseConfigFromString(kValidConfig1); + ASSERT_TRUE(config1); + EXPECT_EQ(config1->segmentation_key, "test_key"); + EXPECT_EQ(config1->segmentation_uma_name, "TestKey"); + std::unordered_map<proto::SegmentId, Config::SegmentMetadata> expected1{ + {proto::SegmentId::OPTIMIZATION_TARGET_MODEL_VALIDATION, + Config::SegmentMetadata{"HighEngagement"}}, + {proto::SegmentId:: + OPTIMIZATION_TARGET_NOTIFICATION_PERMISSION_PREDICTIONS, + Config::SegmentMetadata{"MediumEngagement"}}, + {proto::SegmentId::OPTIMIZATION_TARGET_LANGUAGE_DETECTION, + Config::SegmentMetadata{"LowEngagement"}}}; + EXPECT_EQ(config1->segments, expected1); + EXPECT_EQ(config1->segment_selection_ttl, base::Days(10)); + EXPECT_EQ(config1->unknown_selection_ttl, base::Days(0)); + + constexpr char kValidConfig2[] = R"({ + "segmentation_key": "test_key", + "segmentation_uma_name": "TestKey", + "segments": { + "9" : {"segment_uma_name" : "FeedUser"} + }, + "segment_selection_ttl_days": 10, + "unknown_segment_selection_ttl_days": 14 + })"; + auto config2 = ParseConfigFromString(kValidConfig2); + ASSERT_TRUE(config2); + EXPECT_EQ(config2->segmentation_key, "test_key"); + EXPECT_EQ(config2->segmentation_uma_name, "TestKey"); + std::unordered_map<proto::SegmentId, Config::SegmentMetadata> expected2{ + {proto::SegmentId:: + OPTIMIZATION_TARGET_NOTIFICATION_PERMISSION_PREDICTIONS, + Config::SegmentMetadata{"FeedUser"}}}; + EXPECT_EQ(config2->segments, expected2); + EXPECT_EQ(config2->segment_selection_ttl, base::Days(10)); + EXPECT_EQ(config2->unknown_selection_ttl, base::Days(14)); +} + +} // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc index 5e51cc6..6178fc4 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl.cc
@@ -60,10 +60,9 @@ return std::string(); for (const auto& config : *configs) { - if (std::find(config->segment_ids.begin(), config->segment_ids.end(), - segment_id) != config->segment_ids.end()) { + auto it = config->segments.find(segment_id); + if (it != config->segments.end()) return config->segmentation_key; - } } return std::string(); }
diff --git a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc index 9dd7199..6b9a165 100644 --- a/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc +++ b/components/segmentation_platform/internal/data_collection/training_data_collector_impl_unittest.cc
@@ -85,10 +85,11 @@ configs_.emplace_back(std::make_unique<Config>()); configs_[0]->segmentation_key = kSegmentationKey; - configs_[0]->segment_ids.push_back( - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB); - configs_[0]->segment_ids.push_back( - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE); + configs_[0]->segments.insert( + {SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, + {"UmaNameNewTab"}}); + configs_[0]->segments.insert( + {SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE, {"UmaNameShare"}}); SegmentationResultPrefs result_prefs(&prefs_); SelectedSegment selected_segment(
diff --git a/components/segmentation_platform/internal/metric_filter_utils.cc b/components/segmentation_platform/internal/metric_filter_utils.cc deleted file mode 100644 index b6c18495..0000000 --- a/components/segmentation_platform/internal/metric_filter_utils.cc +++ /dev/null
@@ -1,33 +0,0 @@ -// 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/segmentation_platform/internal/metric_filter_utils.h" - -#include "base/strings/strcat.h" -#include "components/segmentation_platform/internal/stats.h" - -namespace segmentation_platform::stats { -namespace { -using proto::SegmentId; - -} // namespace - -std::string OptimizationTargetToSegmentGroupName(SegmentId segment_id) { - return OptimizationTargetToHistogramVariant(segment_id); -} - -std::string SegmentationKeyToTrialName(const std::string& segmentation_key) { - return base::StrCat( - {"Segmentation_", SegmentationKeyToUmaName(segmentation_key)}); -} - -std::string SegmentationKeyToSubsegmentTrialName( - const std::string& segmentation_key, - proto::SegmentId segment_id) { - return base::StrCat({"Segmentation_", - SegmentationKeyToUmaName(segmentation_key), "_", - OptimizationTargetToHistogramVariant(segment_id)}); -} - -} // namespace segmentation_platform::stats
diff --git a/components/segmentation_platform/internal/metric_filter_utils.h b/components/segmentation_platform/internal/metric_filter_utils.h deleted file mode 100644 index f027cf6..0000000 --- a/components/segmentation_platform/internal/metric_filter_utils.h +++ /dev/null
@@ -1,33 +0,0 @@ -// 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_SEGMENTATION_PLATFORM_INTERNAL_METRIC_FILTER_UTILS_H_ -#define COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_METRIC_FILTER_UTILS_H_ - -#include <array> -#include <string> -#include <vector> - -#include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace segmentation_platform::stats { - -// Returns a name to be used in UMA dashboard as segment group for the given -// `segment_id`. -std::string OptimizationTargetToSegmentGroupName(proto::SegmentId segment_id); - -// Returns a name to be used in UMA dashboard as segmentation type for the given -// `segmentation_key`. -std::string SegmentationKeyToTrialName(const std::string& segmentation_key); - -// Returns a name to be used in UMA dashboard as segmentation subtype type for -// the given `segmentation_key` and `segment_id`. -std::string SegmentationKeyToSubsegmentTrialName( - const std::string& segmentation_key, - proto::SegmentId segment_id); - -} // namespace segmentation_platform::stats - -#endif // COMPONENTS_SEGMENTATION_PLATFORM_INTERNAL_METRIC_FILTER_UTILS_H_
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc index 72bc2bd..a105094 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_impl.cc +++ b/components/segmentation_platform/internal/segmentation_platform_service_impl.cc
@@ -43,8 +43,8 @@ const std::vector<std::unique_ptr<Config>>& configs) { base::flat_set<SegmentId> all_segment_ids; for (const auto& config : configs) { - for (const auto& segment_id : config->segment_ids) - all_segment_ids.insert(segment_id); + for (const auto& segment_id : config->segments) + all_segment_ids.insert(segment_id.first); } return all_segment_ids; }
diff --git a/components/segmentation_platform/internal/segmentation_platform_service_test_base.cc b/components/segmentation_platform/internal/segmentation_platform_service_test_base.cc index 8fa92fb..e425c96 100644 --- a/components/segmentation_platform/internal/segmentation_platform_service_test_base.cc +++ b/components/segmentation_platform/internal/segmentation_platform_service_test_base.cc
@@ -12,6 +12,7 @@ #include "components/segmentation_platform/internal/database/segment_info_database.h" #include "components/segmentation_platform/internal/execution/mock_model_provider.h" #include "components/segmentation_platform/internal/segmentation_platform_service_impl.h" +#include "components/segmentation_platform/internal/stats.h" #include "components/segmentation_platform/internal/ukm_data_manager.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/field_trial_register.h" @@ -20,6 +21,13 @@ namespace { +#define SEGMENT_ID_ENTRY(segment) \ + { \ + segment, Config::SegmentMetadata { \ + stats::OptimizationTargetToHistogramVariant(segment) \ + } \ + } + class MockFieldTrialRegister : public FieldTrialRegister { public: MOCK_METHOD2(RegisterFieldTrial, @@ -37,23 +45,26 @@ std::unique_ptr<Config> config = std::make_unique<Config>(); config->segmentation_key = kTestSegmentationKey1; config->segment_selection_ttl = base::Days(28); - config->segment_ids = {SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE}; + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB), + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE)}; configs.push_back(std::move(config)); } { std::unique_ptr<Config> config = std::make_unique<Config>(); config->segmentation_key = kTestSegmentationKey2; config->segment_selection_ttl = base::Days(10); - config->segment_ids = {SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE}; + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE), + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_VOICE)}; configs.push_back(std::move(config)); } { std::unique_ptr<Config> config = std::make_unique<Config>(); config->segmentation_key = kTestSegmentationKey3; config->segment_selection_ttl = base::Days(14); - config->segment_ids = {SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB}; + config->segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB)}; configs.push_back(std::move(config)); } { @@ -103,8 +114,8 @@ std::vector<std::unique_ptr<Config>> configs = CreateTestConfigs(); base::flat_set<SegmentId> all_segment_ids; for (const auto& config : configs) { - for (const auto& segment_id : config->segment_ids) - all_segment_ids.insert(segment_id); + for (const auto& segment_id : config->segments) + all_segment_ids.insert(segment_id.first); } auto storage_service = std::make_unique<StorageService>( std::move(segment_db), std::move(signal_db),
diff --git a/components/segmentation_platform/internal/selection/experimental_group_recorder.cc b/components/segmentation_platform/internal/selection/experimental_group_recorder.cc index f7078cf..61e294f 100644 --- a/components/segmentation_platform/internal/selection/experimental_group_recorder.cc +++ b/components/segmentation_platform/internal/selection/experimental_group_recorder.cc
@@ -7,27 +7,26 @@ #include "base/bind.h" #include "base/strings/strcat.h" #include "components/segmentation_platform/internal/metadata/metadata_utils.h" -#include "components/segmentation_platform/internal/metric_filter_utils.h" #include "components/segmentation_platform/internal/selection/segment_result_provider.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/field_trial_register.h" -#include "base/logging.h" - namespace segmentation_platform { ExperimentalGroupRecorder::ExperimentalGroupRecorder( SegmentResultProvider* result_provider, FieldTrialRegister* field_trial_register, - const std::string& segmentation_key, - proto::SegmentId selected_segment) + const Config& config, + proto::SegmentId segment_id) : field_trial_register_(field_trial_register), - segmentation_key_(segmentation_key), - segment_id_(selected_segment) { + subsegment_trial_name_( + base::StrCat({config.GetSegmentationFilterName(), "_", + config.GetSegmentUmaName(segment_id)})), + segment_id_(segment_id) { auto options = std::make_unique<SegmentResultProvider::GetResultOptions>(); options->segmentation_key = - base::StrCat({segmentation_key, kSubsegmentDiscreteMappingSuffix}); - options->segment_id = selected_segment; + base::StrCat({config.segmentation_key, kSubsegmentDiscreteMappingSuffix}); + options->segment_id = segment_id; options->callback = base::BindOnce(&ExperimentalGroupRecorder::OnGetSegment, weak_ptr_factory_.GetWeakPtr()); options->ignore_db_scores = false; @@ -38,8 +37,6 @@ void ExperimentalGroupRecorder::OnGetSegment( std::unique_ptr<SegmentResultProvider::SegmentResult> result) { - const std::string trial_name = stats::SegmentationKeyToSubsegmentTrialName( - segmentation_key_, segment_id_); int rank = 0; if (result && result->rank) { rank = *result->rank; @@ -48,7 +45,7 @@ // Can be nullptr in tests. if (field_trial_register_) { field_trial_register_->RegisterSubsegmentFieldTrialIfNeeded( - trial_name, segment_id_, rank); + subsegment_trial_name_, segment_id_, rank); } }
diff --git a/components/segmentation_platform/internal/selection/experimental_group_recorder.h b/components/segmentation_platform/internal/selection/experimental_group_recorder.h index f6c0f4d1..e77ed09 100644 --- a/components/segmentation_platform/internal/selection/experimental_group_recorder.h +++ b/components/segmentation_platform/internal/selection/experimental_group_recorder.h
@@ -14,6 +14,7 @@ namespace segmentation_platform { +struct Config; class FieldTrialRegister; // Records experimental sub groups for the given optimization target. @@ -24,8 +25,8 @@ // recording is complete, can be used only once. ExperimentalGroupRecorder(SegmentResultProvider* result_provider, FieldTrialRegister* field_trial_register, - const std::string& segmentation_key, - proto::SegmentId selected_segment); + const Config& config, + proto::SegmentId segment_id); ~ExperimentalGroupRecorder(); ExperimentalGroupRecorder(ExperimentalGroupRecorder&) = delete; @@ -36,7 +37,7 @@ std::unique_ptr<SegmentResultProvider::SegmentResult> result); const raw_ptr<FieldTrialRegister> field_trial_register_; - const std::string segmentation_key_; + const std::string subsegment_trial_name_; const proto::SegmentId segment_id_; base::WeakPtrFactory<ExperimentalGroupRecorder> weak_ptr_factory_{this};
diff --git a/components/segmentation_platform/internal/selection/segment_selector_impl.cc b/components/segmentation_platform/internal/selection/segment_selector_impl.cc index ccbd8097..38d40d2a 100644 --- a/components/segmentation_platform/internal/selection/segment_selector_impl.cc +++ b/components/segmentation_platform/internal/selection/segment_selector_impl.cc
@@ -6,17 +6,14 @@ #include "base/containers/contains.h" #include "base/containers/flat_map.h" -#include "base/containers/flat_set.h" #include "base/logging.h" #include "base/strings/strcat.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/clock.h" #include "base/time/time.h" -#include "components/segmentation_platform/internal/constants.h" #include "components/segmentation_platform/internal/database/segment_info_database.h" #include "components/segmentation_platform/internal/database/signal_storage_config.h" #include "components/segmentation_platform/internal/metadata/metadata_utils.h" -#include "components/segmentation_platform/internal/metric_filter_utils.h" #include "components/segmentation_platform/internal/platform_options.h" #include "components/segmentation_platform/internal/proto/model_prediction.pb.h" #include "components/segmentation_platform/internal/selection/experimental_group_recorder.h" @@ -108,8 +105,7 @@ // Read selected segment from prefs. const auto& selected_segment = result_prefs_->ReadSegmentationResultFromPref(config_->segmentation_key); - std::string trial_name = - stats::SegmentationKeyToTrialName(config_->segmentation_key); + const std::string& trial_name = config_->GetSegmentationFilterName(); std::string group_name; if (selected_segment.has_value()) { selected_segment_last_session_.segment = selected_segment->segment_id; @@ -118,8 +114,7 @@ config_->segmentation_key, stats::SegmentationSelectionFailureReason::kSelectionAvailableInPrefs); - group_name = stats::OptimizationTargetToSegmentGroupName( - selected_segment->segment_id); + group_name = config_->GetSegmentUmaName(selected_segment->segment_id); } else { stats::RecordSegmentSelectionFailure( config_->segmentation_key, stats::SegmentationSelectionFailureReason:: @@ -149,11 +144,11 @@ // TODO(ssid): Store the scores in prefs so that this can be recorded earlier // in startup. if (selected_segment_last_session_.is_ready) { - for (const SegmentId segment_id : config_->segment_ids) { + for (const auto& segment_id : config_->segments) { experimental_group_recorder_.emplace_back( std::make_unique<ExperimentalGroupRecorder>( - segment_result_provider_.get(), field_trial_register_, - config_->segmentation_key, segment_id)); + segment_result_provider_.get(), field_trial_register_, *config_, + segment_id.first)); } } } @@ -181,7 +176,7 @@ DCHECK(segment_result_provider_); // If the |segment_id| is not in config, then skip any updates early. - if (!base::Contains(config_->segment_ids, segment_id)) + if (!base::Contains(config_->segments, segment_id)) return; if (!IsPreviousSelectionInvalid()) @@ -227,18 +222,18 @@ std::unique_ptr<SegmentRanks> ranks, scoped_refptr<InputContext> input_context, SegmentSelectionCallback callback) { - for (SegmentId needed_segment : config_->segment_ids) { - if (ranks->count(needed_segment) == 0) { + for (const auto& needed_segment : config_->segments) { + if (ranks->count(needed_segment.first) == 0) { auto options = std::make_unique<SegmentResultProvider::GetResultOptions>(); - options->segment_id = needed_segment; + options->segment_id = needed_segment.first; options->segmentation_key = config_->segmentation_key; options->ignore_db_scores = config_->on_demand_execution; options->input_context = input_context; - options->callback = - base::BindOnce(&SegmentSelectorImpl::OnGetResultForSegmentSelection, - weak_ptr_factory_.GetWeakPtr(), std::move(ranks), - input_context, std::move(callback), needed_segment); + options->callback = base::BindOnce( + &SegmentSelectorImpl::OnGetResultForSegmentSelection, + weak_ptr_factory_.GetWeakPtr(), std::move(ranks), input_context, + std::move(callback), needed_segment.first); segment_result_provider_->GetSegmentResult(std::move(options)); return;
diff --git a/components/segmentation_platform/internal/selection/segment_selector_unittest.cc b/components/segmentation_platform/internal/selection/segment_selector_unittest.cc index 3ad9bea1..a44bad0 100644 --- a/components/segmentation_platform/internal/selection/segment_selector_unittest.cc +++ b/components/segmentation_platform/internal/selection/segment_selector_unittest.cc
@@ -14,8 +14,8 @@ #include "components/segmentation_platform/internal/execution/default_model_manager.h" #include "components/segmentation_platform/internal/execution/mock_model_provider.h" #include "components/segmentation_platform/internal/metadata/metadata_utils.h" -#include "components/segmentation_platform/internal/metric_filter_utils.h" #include "components/segmentation_platform/internal/selection/segmentation_result_prefs.h" +#include "components/segmentation_platform/internal/stats.h" #include "components/segmentation_platform/public/config.h" #include "components/segmentation_platform/public/field_trial_register.h" #include "testing/gmock/include/gmock/gmock.h" @@ -33,6 +33,13 @@ namespace { +#define SEGMENT_ID_ENTRY(segment) \ + { \ + segment, Config::SegmentMetadata { \ + stats::OptimizationTargetToHistogramVariant(segment) \ + } \ + } + class MockFieldTrialRegister : public FieldTrialRegister { public: MOCK_METHOD2(RegisterFieldTrial, @@ -48,10 +55,12 @@ Config CreateTestConfig() { Config config; config.segmentation_key = "test_key"; + config.segmentation_uma_name = "TestKey"; config.segment_selection_ttl = base::Days(28); config.unknown_selection_ttl = base::Days(14); - config.segment_ids = {SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE}; + config.segments = { + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB), + SEGMENT_ID_ENTRY(SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_SHARE)}; return config; } @@ -89,8 +98,11 @@ void SetUpWithConfig(const Config& config) { clock_.SetNow(base::Time::Now()); config_ = config; - default_manager_ = std::make_unique<DefaultModelManager>( - &provider_factory_, config_.segment_ids); + std::vector<proto::SegmentId> all_segments; + for (auto it : config.segments) + all_segments.push_back(it.first); + default_manager_ = + std::make_unique<DefaultModelManager>(&provider_factory_, all_segments); segment_database_ = std::make_unique<test::TestSegmentInfoDatabase>(); auto prefs_moved = std::make_unique<TestSegmentationResultPrefs>(); prefs_ = prefs_moved.get(); @@ -320,8 +332,8 @@ TEST_F(SegmentSelectorTest, UnknownSegmentTtlExpiryForBooleanModel) { Config config = CreateTestConfig(); - config.segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID}; + config.segments = {SEGMENT_ID_ENTRY( + SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID)}; SetUpWithConfig(config); SegmentId segment_id = @@ -465,7 +477,7 @@ // Create config with Feed segment. Config config = CreateTestConfig(); - config.segment_ids.push_back(kSubsegmentEnabledTarget); + config.segments.insert(SEGMENT_ID_ENTRY(kSubsegmentEnabledTarget)); // Previous selection result is not available at this time, so it should // record unselected. EXPECT_CALL(field_trial_register_, @@ -512,30 +524,37 @@ &config_, &field_trial_register_, &clock_, PlatformOptions::CreateDefault(), default_manager_.get()); - // When segment result is missing, unknown subsegment is recorded. - EXPECT_CALL( - field_trial_register_, - RegisterSubsegmentFieldTrialIfNeeded( - base::StringPiece("Segmentation_TestKey_Share"), segment_id0, 0)); - EXPECT_CALL( - field_trial_register_, - RegisterSubsegmentFieldTrialIfNeeded( - base::StringPiece("Segmentation_TestKey_NewTab"), - proto::SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 0)); - - // The new selector will record subsegment metric groups based on the mapping. + // When segment result is missing, unknown subsegment is recorded, otherwise + // record metrics based on the subsegment mapping. base::RunLoop wait_for_subsegment; + std::vector<std::tuple<base::StringPiece, SegmentId, int>> actual_calls; + int call_count = 0; + EXPECT_CALL(field_trial_register_, - RegisterSubsegmentFieldTrialIfNeeded( - base::StringPiece("Segmentation_TestKey_FeedUserSegment"), - kSubsegmentEnabledTarget, 3)) - .WillOnce( - Invoke([&wait_for_subsegment](base::StringPiece, SegmentId, int) { - wait_for_subsegment.QuitClosure().Run(); + RegisterSubsegmentFieldTrialIfNeeded(_, _, _)) + .Times(3) + .WillRepeatedly( + Invoke([&wait_for_subsegment, &actual_calls, &call_count]( + base::StringPiece trial, SegmentId id, int rank) { + actual_calls.emplace_back(trial, id, rank); + call_count++; + if (call_count == 3) + wait_for_subsegment.QuitClosure().Run(); })); segment_selector_->OnPlatformInitialized(nullptr); wait_for_subsegment.Run(); + EXPECT_THAT( + actual_calls, + testing::UnorderedElementsAre( + std::make_tuple(base::StringPiece("Segmentation_TestKey_Share"), + segment_id0, 0), + std::make_tuple( + base::StringPiece("Segmentation_TestKey_NewTab"), + proto::SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_NEW_TAB, 0), + std::make_tuple( + base::StringPiece("Segmentation_TestKey_FeedUserSegment"), + kSubsegmentEnabledTarget, 3))); } } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/service_proxy_impl.cc b/components/segmentation_platform/internal/service_proxy_impl.cc index 10f6e23..551d922 100644 --- a/components/segmentation_platform/internal/service_proxy_impl.cc +++ b/components/segmentation_platform/internal/service_proxy_impl.cc
@@ -180,12 +180,12 @@ } } result.emplace_back(config->segmentation_key, selected); - for (const auto& segment_id : config->segment_ids) { - if (!segment_ids.contains(segment_id)) + for (const auto& segment_id : config->segments) { + if (!segment_ids.contains(segment_id.first)) continue; - const auto& info = segment_ids[segment_id]; + const auto& info = segment_ids[segment_id.first]; result.back().segment_status.emplace_back( - segment_id, SegmentMetadataToString(info), + segment_id.first, SegmentMetadataToString(info), PredictionResultToString(info), signal_storage_config_ ? signal_storage_config_->MeetsSignalCollectionRequirement(
diff --git a/components/segmentation_platform/internal/service_proxy_impl_unittest.cc b/components/segmentation_platform/internal/service_proxy_impl_unittest.cc index a2acb02..d4cd3c9 100644 --- a/components/segmentation_platform/internal/service_proxy_impl_unittest.cc +++ b/components/segmentation_platform/internal/service_proxy_impl_unittest.cc
@@ -43,7 +43,7 @@ info.set_segment_id(segment_id); db_entries->insert( std::make_pair(base::NumberToString(static_cast<int>(segment_id)), info)); - config->segment_ids.emplace_back(segment_id); + config->segments.insert({segment_id, {"UmaName"}}); return info; }
diff --git a/components/segmentation_platform/public/config.cc b/components/segmentation_platform/public/config.cc index 4bf4403..54bb957 100644 --- a/components/segmentation_platform/public/config.cc +++ b/components/segmentation_platform/public/config.cc
@@ -4,8 +4,14 @@ #include "components/segmentation_platform/public/config.h" +#include "base/strings/strcat.h" + namespace segmentation_platform { +bool Config::SegmentMetadata::operator==(const SegmentMetadata& other) const { + return other.uma_name == uma_name; +} + Config::Config() = default; Config::~Config() = default; @@ -14,4 +20,17 @@ Config& Config::operator=(const Config& other) = default; +std::string Config::GetSegmentationFilterName() const { + return base::StrCat({"Segmentation_", segmentation_uma_name}); +} + +std::string Config::GetSegmentUmaName(proto::SegmentId segment) const { + std::string name = "Other"; + auto it = segments.find(segment); + if (it == segments.end()) { + return "Other"; + } + return it->second.uma_name; +} + } // namespace segmentation_platform
diff --git a/components/segmentation_platform/public/config.h b/components/segmentation_platform/public/config.h index ee2564b..d3030bd2 100644 --- a/components/segmentation_platform/public/config.h +++ b/components/segmentation_platform/public/config.h
@@ -6,6 +6,7 @@ #define COMPONENTS_SEGMENTATION_PLATFORM_PUBLIC_CONFIG_H_ #include <string> +#include <unordered_map> #include "base/time/time.h" #include "components/segmentation_platform/public/proto/segmentation_platform.pb.h" @@ -61,6 +62,9 @@ // discrete mapping and writing results to prefs. std::string segmentation_key; + // The name used for the segmentation key in UMA filters. + std::string segmentation_uma_name; + // The trigger event type that triggers segment selection. If trigger is // non-none, |on_demand_execution| must be true. TriggerType trigger = TriggerType::kNone; @@ -76,13 +80,26 @@ // as output option after having served other valid segments. base::TimeDelta unknown_selection_ttl; - // List of segment ids that the current config requires to be available. - std::vector<proto::SegmentId> segment_ids; + // List of segments needed to make a selection. + struct SegmentMetadata { + // The name used for this segment in UMA filters. + std::string uma_name; + + bool operator==(const SegmentMetadata& other) const; + }; + std::unordered_map<proto::SegmentId, SegmentMetadata> segments; // The selection only supports returning results from on-demand model // executions instead of returning result from previous sessions. The // selection TTLs are ignored in this config. bool on_demand_execution = false; + + // Returns the filter name that will be shown in the metrics for this + // segmentation config. + std::string GetSegmentationFilterName() const; + + // Returns the segment name for the `segment` used by the metrics. + std::string GetSegmentUmaName(proto::SegmentId segment) const; }; } // namespace segmentation_platform
diff --git a/components/services/storage/indexed_db/scopes/leveldb_scopes_tasks_unittest.cc b/components/services/storage/indexed_db/scopes/leveldb_scopes_tasks_unittest.cc index 09ca4951..f16ada59 100644 --- a/components/services/storage/indexed_db/scopes/leveldb_scopes_tasks_unittest.cc +++ b/components/services/storage/indexed_db/scopes/leveldb_scopes_tasks_unittest.cc
@@ -259,7 +259,7 @@ scopes_encoder_.UndoTaskKeyPrefix(metadata_prefix_, kScopeNumber))); } -TEST_F(LevelDBScopesTasksTest, ErrorsDuringCleanupArePropogated) { +TEST_F(LevelDBScopesTasksTest, ErrorsDuringCleanupArePropagated) { const int64_t kScopeNumber = 1; // This test will fail if the pattern of leveldb operations in this test @@ -296,7 +296,7 @@ } } -TEST_F(LevelDBScopesTasksTest, ErrorsDuringRevertArePropogated) { +TEST_F(LevelDBScopesTasksTest, ErrorsDuringRevertArePropagated) { const int64_t kScopeNumber = 1; // This test will fail if the pattern of leveldb operations in this test
diff --git a/components/signin/core/browser/BUILD.gn b/components/signin/core/browser/BUILD.gn index df0893c..71a713e 100644 --- a/components/signin/core/browser/BUILD.gn +++ b/components/signin/core/browser/BUILD.gn
@@ -80,7 +80,7 @@ "active_directory_account_reconcilor_delegate.h", ] deps += [ - "//ash/components/tpm", + "//chromeos/ash/components/install_attributes", "//chromeos/crosapi/mojom", ] } @@ -144,7 +144,7 @@ if (is_chromeos_ash) { deps += [ - "//ash/components/tpm:test_support", + "//chromeos/ash/components/install_attributes:test_support", "//chromeos/crosapi/mojom", ] sources -= [
diff --git a/components/signin/core/browser/DEPS b/components/signin/core/browser/DEPS index b166d8a8..2d38d7d 100644 --- a/components/signin/core/browser/DEPS +++ b/components/signin/core/browser/DEPS
@@ -6,10 +6,10 @@ specific_include_rules = { "active_directory_account_reconcilor_delegate.cc": [ - "+ash/components/tpm/install_attributes.h" + "+chromeos/ash/components/install_attributes/install_attributes.h" ], "account_reconcilor_unittest.cc": [ - "+ash/components/tpm/stub_install_attributes.h" + "+chromeos/ash/components/install_attributes/stub_install_attributes.h" ], # TODO(crbug.com/1198528): remove Lacros deps after the rollout. "chrome_connected_header_helper.cc": [
diff --git a/components/signin/core/browser/account_reconcilor_unittest.cc b/components/signin/core/browser/account_reconcilor_unittest.cc index 7fae952..f1835003 100644 --- a/components/signin/core/browser/account_reconcilor_unittest.cc +++ b/components/signin/core/browser/account_reconcilor_unittest.cc
@@ -49,7 +49,7 @@ #endif #if BUILDFLAG(IS_CHROMEOS_ASH) -#include "ash/components/tpm/stub_install_attributes.h" +#include "chromeos/ash/components/install_attributes/stub_install_attributes.h" #include "components/signin/core/browser/active_directory_account_reconcilor_delegate.h" #endif
diff --git a/components/signin/core/browser/active_directory_account_reconcilor_delegate.cc b/components/signin/core/browser/active_directory_account_reconcilor_delegate.cc index 54629b0..f2687e27 100644 --- a/components/signin/core/browser/active_directory_account_reconcilor_delegate.cc +++ b/components/signin/core/browser/active_directory_account_reconcilor_delegate.cc
@@ -4,8 +4,8 @@ #include "components/signin/core/browser/active_directory_account_reconcilor_delegate.h" -#include "ash/components/tpm/install_attributes.h" #include "base/containers/contains.h" +#include "chromeos/ash/components/install_attributes/install_attributes.h" #include "google_apis/gaia/core_account_id.h" namespace signin {
diff --git a/components/strings/components_strings_af.xtb b/components/strings/components_strings_af.xtb index 3b8e07d..739459d 100644 --- a/components/strings/components_strings_af.xtb +++ b/components/strings/components_strings_af.xtb
@@ -1071,6 +1071,7 @@ <translation id="3835233591525155343">Jou toestelgebruik</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, druk Tab en dan Enter om vinnig 'n nuwe Google Dokument te skep</translation> <translation id="385051799172605136">Terug</translation> +<translation id="3853684360927654006">Wagwoordsterkteberekenaar</translation> <translation id="3858027520442213535">Dateer datum en tyd op</translation> <translation id="3858860766373142691">Naam</translation> <translation id="3872834068356954457">Wetenskap</translation>
diff --git a/components/strings/components_strings_ar.xtb b/components/strings/components_strings_ar.xtb index 3ca55eff..d59cc9e 100644 --- a/components/strings/components_strings_ar.xtb +++ b/components/strings/components_strings_ar.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">الإجمالي</translation> <translation id="163669211644121865">إعداد الضرائب والتخطيط الضريبي</translation> <translation id="1638780421120290329">يتعذّر حفظ البطاقة</translation> -<translation id="1639239467298939599">جارٍ التحميل.</translation> +<translation id="1639239467298939599">جارٍ التحميل</translation> <translation id="1640180200866533862">سياسات المستخدم</translation> <translation id="1640244768702815859">جرّب <ph name="BEGIN_LINK" />الانتقال إلى الصفحة الرئيسية للموقع<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">تأخير الإخراج حتى</translation>
diff --git a/components/strings/components_strings_da.xtb b/components/strings/components_strings_da.xtb index 00508725e..0a214956 100644 --- a/components/strings/components_strings_da.xtb +++ b/components/strings/components_strings_da.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Total</translation> <translation id="163669211644121865">Skatteangivelse og -rådgivning</translation> <translation id="1638780421120290329">Kortet kan ikke gemmes</translation> -<translation id="1639239467298939599">Indlæser...</translation> +<translation id="1639239467298939599">Indlæser</translation> <translation id="1640180200866533862">Brugerpolitikker</translation> <translation id="1640244768702815859">Prøv at <ph name="BEGIN_LINK" />gå til websitets startside<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Forsink output indtil</translation>
diff --git a/components/strings/components_strings_de.xtb b/components/strings/components_strings_de.xtb index c868ec45..d124336 100644 --- a/components/strings/components_strings_de.xtb +++ b/components/strings/components_strings_de.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Gesamt</translation> <translation id="163669211644121865">Steuerberatung</translation> <translation id="1638780421120290329">Karte kann nicht gespeichert werden</translation> -<translation id="1639239467298939599">Wird geladen...</translation> +<translation id="1639239467298939599">Wird geladen</translation> <translation id="1640180200866533862">Nutzerrichtlinien</translation> <translation id="1640244768702815859">Versuche, <ph name="BEGIN_LINK" />die Startseite aufzurufen<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Ausgabe verzögern bis</translation> @@ -1069,6 +1069,7 @@ <translation id="3835233591525155343">Meine Gerätenutzung</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" /> – drücke die Tabulatortaste und dann die Eingabetaste, um schnell ein neues Google-Dokument zu erstellen</translation> <translation id="385051799172605136">Zurück</translation> +<translation id="3853684360927654006">Passwortstärke-Rechner</translation> <translation id="3858027520442213535">Datum und Uhrzeit aktualisieren</translation> <translation id="3858860766373142691">Name</translation> <translation id="3872834068356954457">Wissenschaft</translation>
diff --git a/components/strings/components_strings_el.xtb b/components/strings/components_strings_el.xtb index dfdfa43..d30c041 100644 --- a/components/strings/components_strings_el.xtb +++ b/components/strings/components_strings_el.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Σύνολο</translation> <translation id="163669211644121865">Προετοιμασία και προγραμματισμός φόρου</translation> <translation id="1638780421120290329">Δεν είναι δυνατή η αποθήκευση της κάρτας</translation> -<translation id="1639239467298939599">Γίνεται φόρτωση</translation> +<translation id="1639239467298939599">Φόρτωση</translation> <translation id="1640180200866533862">Πολιτικές χρηστών</translation> <translation id="1640244768702815859">Δοκιμάστε να <ph name="BEGIN_LINK" />επισκεφτείτε την αρχική σελίδα του ιστότοπου<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Καθυστέρηση εξόδου έως</translation>
diff --git a/components/strings/components_strings_fa.xtb b/components/strings/components_strings_fa.xtb index f732e0b8..f588ef2 100644 --- a/components/strings/components_strings_fa.xtb +++ b/components/strings/components_strings_fa.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">مجموع</translation> <translation id="163669211644121865">آمادهسازی و برنامهریزی مالیاتی</translation> <translation id="1638780421120290329">نمیتوان کارت را ذخیره کرد</translation> -<translation id="1639239467298939599">بارگیری</translation> +<translation id="1639239467298939599">در حال بارگیری</translation> <translation id="1640180200866533862">خطمشیهای کاربر</translation> <translation id="1640244768702815859">از<ph name="BEGIN_LINK" />صفحه اصلی سایت دیدن کنید<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">تأخیر خروجی تا</translation>
diff --git a/components/strings/components_strings_fr.xtb b/components/strings/components_strings_fr.xtb index f3871874..0c17f4e 100644 --- a/components/strings/components_strings_fr.xtb +++ b/components/strings/components_strings_fr.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Total</translation> <translation id="163669211644121865">Planification fiscale et établissement de déclarations fiscales</translation> <translation id="1638780421120290329">Impossible d'enregistrer cette carte</translation> -<translation id="1639239467298939599">Chargement en cours</translation> +<translation id="1639239467298939599">Chargement en cours…</translation> <translation id="1640180200866533862">Règles relatives aux utilisateurs</translation> <translation id="1640244768702815859">Essayez de <ph name="BEGIN_LINK" />consulter la page d'accueil du site<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Retarder la sortie jusqu'à</translation>
diff --git a/components/strings/components_strings_gu.xtb b/components/strings/components_strings_gu.xtb index 0605c29a..f93db186 100644 --- a/components/strings/components_strings_gu.xtb +++ b/components/strings/components_strings_gu.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">કુલ</translation> <translation id="163669211644121865">ટેક્સની ગણતરી અને તેનું પ્લાનિંગ</translation> <translation id="1638780421120290329">કાર્ડ સાચવી શકાતું નથી</translation> -<translation id="1639239467298939599">લોડ કરી રહ્યું છે</translation> +<translation id="1639239467298939599">લોડ થઇ રહી છે</translation> <translation id="1640180200866533862">વપરાશકર્તા પૉલિસીઓ</translation> <translation id="1640244768702815859"><ph name="BEGIN_LINK" />સાઇટના હોમપેજની મુલાકાત લેવાનો<ph name="END_LINK" /> પ્રયાસ કરો.</translation> <translation id="1641976391427233992">આટલા સમય સુધી આઉટપુટ વિલંબિત કરો</translation>
diff --git a/components/strings/components_strings_hi.xtb b/components/strings/components_strings_hi.xtb index ea48806b..eedeb94 100644 --- a/components/strings/components_strings_hi.xtb +++ b/components/strings/components_strings_hi.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">कुल</translation> <translation id="163669211644121865">टैक्स भरने से जुड़ी जानकारी तैयार करने और सलाह देने वाली सेवाएं</translation> <translation id="1638780421120290329">कार्ड सेव नहीं किया जा सकता</translation> -<translation id="1639239467298939599">लोड हो रहा है</translation> +<translation id="1639239467298939599">लोड हो रही है</translation> <translation id="1640180200866533862">उपयोगकर्ता नीतियां</translation> <translation id="1640244768702815859"><ph name="BEGIN_LINK" />साइट के मुखपृष्ठ पर विज़िट करके<ph name="END_LINK" /> देखें.</translation> <translation id="1641976391427233992">यहां तक के आउटपुट में देरी</translation>
diff --git a/components/strings/components_strings_ja.xtb b/components/strings/components_strings_ja.xtb index d8b0e64..fe39e2c 100644 --- a/components/strings/components_strings_ja.xtb +++ b/components/strings/components_strings_ja.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">合計</translation> <translation id="163669211644121865">確定申告、税務</translation> <translation id="1638780421120290329">カードを保存できません</translation> -<translation id="1639239467298939599">読み込み中</translation> +<translation id="1639239467298939599">読み込んでいます</translation> <translation id="1640180200866533862">ユーザー ポリシー</translation> <translation id="1640244768702815859"><ph name="BEGIN_LINK" />サイトのホームページにアクセス<ph name="END_LINK" />してみてください。</translation> <translation id="1641976391427233992">出力のタイミング</translation>
diff --git a/components/strings/components_strings_mr.xtb b/components/strings/components_strings_mr.xtb index daf0905..59332b9 100644 --- a/components/strings/components_strings_mr.xtb +++ b/components/strings/components_strings_mr.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">एकूण</translation> <translation id="163669211644121865">कर भरणा आणि नियोजन</translation> <translation id="1638780421120290329">कार्ड सेव्ह करू शकलो नाही</translation> -<translation id="1639239467298939599">लोड करीत आहे</translation> +<translation id="1639239467298939599">लोड करत आहे</translation> <translation id="1640180200866533862">वापरकर्ता धोरणे</translation> <translation id="1640244768702815859"><ph name="BEGIN_LINK" />साइटच्या होमवर भेट देऊन<ph name="END_LINK" /> पहा.</translation> <translation id="1641976391427233992">या कालावधीपर्यंत आउटपुटला विलंब करा</translation>
diff --git a/components/strings/components_strings_pt-PT.xtb b/components/strings/components_strings_pt-PT.xtb index d0f7f485..27a2522 100644 --- a/components/strings/components_strings_pt-PT.xtb +++ b/components/strings/components_strings_pt-PT.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Total</translation> <translation id="163669211644121865">Preparação e planeamento de impostos</translation> <translation id="1638780421120290329">Não é possível guardar o cartão</translation> -<translation id="1639239467298939599">A carregar</translation> +<translation id="1639239467298939599">A carregar…</translation> <translation id="1640180200866533862">Políticas do utilizador</translation> <translation id="1640244768702815859">Experimente <ph name="BEGIN_LINK" />aceder à página inicial do site<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Atrasar saída até</translation>
diff --git a/components/strings/components_strings_ru.xtb b/components/strings/components_strings_ru.xtb index 49e522f..172138a 100644 --- a/components/strings/components_strings_ru.xtb +++ b/components/strings/components_strings_ru.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Всего</translation> <translation id="163669211644121865">Расчет и планирование налогов</translation> <translation id="1638780421120290329">Не удалось сохранить карту</translation> -<translation id="1639239467298939599">Загрузка</translation> +<translation id="1639239467298939599">Загрузка…</translation> <translation id="1640180200866533862">Пользовательские правила</translation> <translation id="1640244768702815859">Попробуйте <ph name="BEGIN_LINK" />открыть главную страницу сайта<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Задержать вывод результатов</translation>
diff --git a/components/strings/components_strings_sk.xtb b/components/strings/components_strings_sk.xtb index 368c8ee1..879d636 100644 --- a/components/strings/components_strings_sk.xtb +++ b/components/strings/components_strings_sk.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Celkove</translation> <translation id="163669211644121865">Daňová príprava a plánovanie</translation> <translation id="1638780421120290329">Karta sa nedá uložiť</translation> -<translation id="1639239467298939599">Prebieha načítavanie</translation> +<translation id="1639239467298939599">Načítava sa</translation> <translation id="1640180200866533862">Pravidlá pre používateľa</translation> <translation id="1640244768702815859">Skúste <ph name="BEGIN_LINK" />navštíviť domovskú stránku webu<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Odložiť výstup do</translation>
diff --git a/components/strings/components_strings_sr-Latn.xtb b/components/strings/components_strings_sr-Latn.xtb index 8ffd393f8..059d7d2 100644 --- a/components/strings/components_strings_sr-Latn.xtb +++ b/components/strings/components_strings_sr-Latn.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Ukupno</translation> <translation id="163669211644121865">Priprema i planiranje poreza</translation> <translation id="1638780421120290329">Čuvanje kartice nije uspelo</translation> -<translation id="1639239467298939599">Učitavanje</translation> +<translation id="1639239467298939599">Učitava se</translation> <translation id="1640180200866533862">Smernice za korisnike</translation> <translation id="1640244768702815859">Pokušajte da <ph name="BEGIN_LINK" />posetite početnu stranicu sajta<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Odloži izlaz do</translation>
diff --git a/components/strings/components_strings_sr.xtb b/components/strings/components_strings_sr.xtb index 579f9d2..5d9247f6 100644 --- a/components/strings/components_strings_sr.xtb +++ b/components/strings/components_strings_sr.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Укупно</translation> <translation id="163669211644121865">Припрема и планирање пореза</translation> <translation id="1638780421120290329">Чување картице није успело</translation> -<translation id="1639239467298939599">Учитавање</translation> +<translation id="1639239467298939599">Учитава се</translation> <translation id="1640180200866533862">Смернице за кориснике</translation> <translation id="1640244768702815859">Покушајте да <ph name="BEGIN_LINK" />посетите почетну страницу сајта<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Одложи излаз до</translation>
diff --git a/components/strings/components_strings_sv.xtb b/components/strings/components_strings_sv.xtb index bdfb3eb..0794769 100644 --- a/components/strings/components_strings_sv.xtb +++ b/components/strings/components_strings_sv.xtb
@@ -276,7 +276,7 @@ <translation id="1634828734222219955">Totalt</translation> <translation id="163669211644121865">Skattefrågor och skatteplanering</translation> <translation id="1638780421120290329">Det gick inte att spara kortet</translation> -<translation id="1639239467298939599">Läser in</translation> +<translation id="1639239467298939599">Profilen läses in</translation> <translation id="1640180200866533862">Användarpolicyer</translation> <translation id="1640244768702815859">Testa att <ph name="BEGIN_LINK" />besöka webbplatsens startsida<ph name="END_LINK" />.</translation> <translation id="1641976391427233992">Senarelägga utmatning till</translation>
diff --git a/components/strings/components_strings_te.xtb b/components/strings/components_strings_te.xtb index 28a06bb..c00835b 100644 --- a/components/strings/components_strings_te.xtb +++ b/components/strings/components_strings_te.xtb
@@ -125,7 +125,7 @@ <translation id="1292571435393770077">ట్రే 16</translation> <translation id="1292701964462482250">"మీ కంప్యూటర్లో ఉన్న సాఫ్ట్వేర్ కారణంగా Chrome సురక్షితంగా వెబ్కు కనెక్ట్ కాలేకపోతోంది" (Windows కంప్యూటర్ల కోసం మాత్రమే)</translation> <translation id="1294154142200295408">ఆదేశ-పంక్తి వ్యత్యాసాలు</translation> -<translation id="129553762522093515">ఇటీవల మూసివెయ్యబడినవి</translation> +<translation id="129553762522093515">ఇటీవల మూసివేయబడినవి</translation> <translation id="1296930489679394997">విక్రయాలు</translation> <translation id="129863573139666797"><ph name="BEGIN_LINK" />మీ కుక్కీలను తీసివేయడానికి ప్రయత్నించండి<ph name="END_LINK" /></translation> <translation id="1301324364792935241">మీ సెక్యూర్ DNS సెట్టింగ్లను చెక్ చేయండి</translation> @@ -228,7 +228,7 @@ <translation id="1507202001669085618"><p>ఆన్లైన్కు వెళ్లడం కంటే ముందు సైన్ ఇన్ చేయాల్సిన అవసరం ఉన్న Wi-Fi పోర్టల్ను మీరు ఉపయోగిస్తున్నట్లయితే మీకు ఈ ఎర్రర్ కనిపిస్తుంది.</p> <p>ఎర్రర్ను పరిష్కరించడానికి, మీరు తెరవాలనుకుంటున్న పేజీలో <strong>కనెక్ట్ చేయి</strong>ని నొక్కండి.</p></translation> <translation id="1507780850870535225">ల్యాండ్స్కేప్ డిజైన్</translation> -<translation id="1513706915089223971">చరిత్ర నమోదుల లిస్ట్</translation> +<translation id="1513706915089223971">హిస్టరీ నమోదుల లిస్ట్</translation> <translation id="1516097932025103760">ఇది ఎన్క్రిప్ట్ చేయబడుతుంది, సురక్షితంగా సేవ్ చేయబడుతుంది, అలాగే CVC ఎప్పుడూ స్టోర్ చేయబడదు.</translation> <translation id="1517433312004943670">ఫోన్ నంబర్ అవసరం</translation> <translation id="1519264250979466059">బిల్డ్ తేదీ</translation> @@ -278,7 +278,7 @@ <translation id="1634828734222219955">మొత్తం</translation> <translation id="163669211644121865">ట్యాక్స్ రూపకల్పన & ప్లానింగ్</translation> <translation id="1638780421120290329">కార్డ్ను సేవ్ చేయలేకపోయింది</translation> -<translation id="1639239467298939599">లోడ్ అవుతోంది</translation> +<translation id="1639239467298939599">లోడ్ చేస్తోంది</translation> <translation id="1640180200866533862">వినియోగదారు విధానాలు</translation> <translation id="1640244768702815859"><ph name="BEGIN_LINK" />సైట్ యొక్క హోమ్పేజీని సందర్శించడం<ph name="END_LINK" /> ప్రయత్నించండి.</translation> <translation id="1641976391427233992">అవుట్పుట్ను ఇప్పటి వరకు ఆలస్యం చేయి</translation> @@ -653,7 +653,7 @@ <translation id="2666117266261740852">ఇతర ట్యాబ్లు లేదా యాప్లను మూసివేయండి</translation> <translation id="2672201172023654893">మీ బ్రౌజర్ మేనేజ్ చేయబడలేదు.</translation> <translation id="2673968385134502798">గేమ్లు</translation> -<translation id="2674170444375937751">మీ చరిత్ర నుండి ఈ పేజీలను తొలగించదలిచారా?</translation> +<translation id="2674170444375937751">మీ హిస్టరీ నుండి ఈ పేజీలను తొలగించదలిచారా?</translation> <translation id="2674804415323431591">సూచనలను దాచు</translation> <translation id="2676271551327853224">ROC 8K</translation> <translation id="2677696497921480781">పుట్టినరోజులు & నామకరణం చేసిన రోజులు</translation> @@ -980,7 +980,7 @@ <translation id="3614934205542186002"><ph name="RUN_CHROME_SAFETY_CHECK_FOCUSED_FRIENDLY_MATCH_TEXT" />, Chrome సెట్టింగ్లలో భద్రతా తనిఖీని రన్ చేయడానికి 'Tab'ను నొక్కి ఆపై 'Enter'ను నొక్కండి</translation> <translation id="3615877443314183785">చెల్లుబాటు అయ్యే గడువు ముగింపు తేదీని నమోదు చేయండి</translation> <translation id="36224234498066874">బ్రౌజింగ్ డేటాను క్లియర్ చేయండి...</translation> -<translation id="362276910939193118">పూర్తి చరిత్రను చూపించు</translation> +<translation id="362276910939193118">పూర్తి హిస్టరీని చూపించు</translation> <translation id="3630155396527302611">ఇప్పటికే ఇది నెట్వర్క్ను యాక్సెస్ చేయడానికి అనుమతించబడిన ప్రోగ్రామ్ లాగా లిస్ట్ చేయబడి ఉంటే, దీన్ని లిస్ట్ నుండి తీసివేసి, ఆపై మళ్లీ జోడించి ప్రయత్నించండి.</translation> <translation id="3630699740441428070">ఈ పరికరానికి సంబంధించిన అడ్మినిస్ట్రేటర్లు మీ నెట్వర్క్ కనెక్షన్ను కాన్ఫిగర్ చేశారు, ఇది మీరు సందర్శించే వెబ్సైట్లతో సహా మీ నెట్వర్క్ ట్రాఫిక్ను చూడటానికి వారిని అనుమతించవచ్చు.</translation> @@ -1832,7 +1832,7 @@ <translation id="5955063559762970069">హోటళ్లు & వసతులు</translation> <translation id="5963413905009737549">విభాగం</translation> <translation id="5967592137238574583">సంప్రదింపు సమాచారాన్ని ఎడిట్ చేయండి</translation> -<translation id="5967867314010545767">చరిత్ర నుండి తీసివేయండి</translation> +<translation id="5967867314010545767">హిస్టరీ నుండి తీసివేయండి</translation> <translation id="5968793460449681917">ప్రతి సందర్శనలో</translation> <translation id="5974052231147553524">సిక్స్త్ రోల్</translation> <translation id="5975083100439434680">దూరంగా జూమ్ చేయి</translation> @@ -2887,7 +2887,7 @@ <translation id="8963213021028234748"><ph name="MARKUP_1" />సూచనలు:<ph name="MARKUP_2" />మీకు డేటా కనెక్షన్ ఉందని నిర్ధారించుకోండి<ph name="MARKUP_3" />ఈ వెబ్పేజీని తర్వాత మళ్లీ లోడ్ చేయండి<ph name="MARKUP_4" />మీరు నమోదు చేసిన అడ్రస్ చెక్ చేయండి<ph name="MARKUP_5" /></translation> <translation id="8968766641738584599">కార్డ్ని సేవ్ చేయండి</translation> <translation id="8971063699422889582">సర్వర్ ప్రమాణపత్రం గడువు ముగిసింది.</translation> -<translation id="8975012916872825179">ఫోన్ నంబర్లు, ఈమెయిల్ అడ్రస్లు మరియు డెలివరీ అడ్రస్లు లాంటి సమాచారం ఉంటుంది</translation> +<translation id="8975012916872825179">ఫోన్ నంబర్లు, ఈమెయిల్ అడ్రస్లు మరియు డెలివరీ అడ్రస్ల వంటి సమాచారం ఉంటుంది</translation> <translation id="8975263830901772334">మీరు ముద్రించే ఫైళ్ల పేర్లు</translation> <translation id="8978053250194585037">Google సురక్షిత బ్రౌజింగ్ ఇటీవల <ph name="SITE" />లో <ph name="BEGIN_LINK" />ఫిషింగ్ని గుర్తించింది<ph name="END_LINK" />. ఫిషింగ్ సైట్లు వేరే వెబ్సైట్ల లాగా ప్రవర్తించడం ద్వారా మిమ్మల్ని మాయ చేయవచ్చు.</translation> <translation id="8983369100812962543">మీరు ఇప్పుడు యాప్ పరిమాణం మార్చవచ్చు</translation> @@ -2926,7 +2926,7 @@ <translation id="9062620674789239642">ఇది తరలించబడి గానీ, ఎడిట్ చేసి గానీ లేదా తొలగించబడి ఉండవచ్చు.</translation> <translation id="9063800855227801443">గోప్యమైన కంటెంట్ను క్యాప్చర్ చేయడం సాధ్యం కాదు</translation> <translation id="9065203028668620118">ఎడిట్</translation> -<translation id="9065745800631924235">చరిత్ర నుండి <ph name="TEXT" /> శోధన</translation> +<translation id="9065745800631924235">హిస్టరీ నుండి <ph name="TEXT" /> శోధన</translation> <translation id="9069693763241529744">ఎక్స్టెన్షన్ ద్వారా బ్లాక్ చేయబడింది</translation> <translation id="9073799351042754113">మీరు ఈ సైట్ కోసం సెక్యూరిటీ హెచ్చరికలను ఆఫ్ చేయాల్సిందిగా ఎంచుకున్నారు.</translation> <translation id="9078964945751709336">మరింత సమాచారం ఆవశ్యకం</translation>
diff --git a/components/strings/components_strings_zu.xtb b/components/strings/components_strings_zu.xtb index 47ffb24d..0342fa6 100644 --- a/components/strings/components_strings_zu.xtb +++ b/components/strings/components_strings_zu.xtb
@@ -1068,6 +1068,7 @@ <translation id="3835233591525155343">Umsebenzi wedivayisi yakho</translation> <translation id="3848487483475744267"><ph name="CREATE_GOOGLE_DOC_FOCUSED_FRIENDLY_MATCH_TEXT" />, cindezela u-Tab bese u-Enter ukuze udale i-Google Doc entsha ngokushesha</translation> <translation id="385051799172605136">Emuva</translation> +<translation id="3853684360927654006">Isibali Samandla Ephasiwedi</translation> <translation id="3858027520442213535">Buyekeza idethi nesikhathi</translation> <translation id="3858860766373142691">Igama</translation> <translation id="3872834068356954457">Isayensi</translation>
diff --git a/components/viz/service/BUILD.gn b/components/viz/service/BUILD.gn index e3056ad8..90e1c4a 100644 --- a/components/viz/service/BUILD.gn +++ b/components/viz/service/BUILD.gn
@@ -16,8 +16,6 @@ viz_component("service") { sources = [ - "debugger/rwlock.cc", - "debugger/rwlock.h", "debugger/viz_debugger.cc", "debugger/viz_debugger.h", "display/aggregated_frame.cc", @@ -450,13 +448,7 @@ viz_source_set("unit_tests") { testonly = true sources = [ - "debugger/viz_debugger_unittests/viz_debugger_internal.cc", - "debugger/viz_debugger_unittests/viz_debugger_internal.h", - "debugger/viz_debugger_unittests/viz_debugger_multithread_unittest.cc", - "debugger/viz_debugger_unittests/viz_debugger_rwlock_unittest.cc", - "debugger/viz_debugger_unittests/viz_debugger_unittest.cc", - "debugger/viz_debugger_unittests/viz_debugger_unittest_base.cc", - "debugger/viz_debugger_unittests/viz_debugger_unittest_base.h", + "debugger/viz_debugger_unittest.cc", "display/bsp_tree_unittest.cc", "display/copy_output_scaling_pixeltest.cc", "display/delegated_ink_point_pixel_test_helper.cc",
diff --git a/components/viz/service/debugger/rwlock.cc b/components/viz/service/debugger/rwlock.cc deleted file mode 100644 index 8c0fc3f7..0000000 --- a/components/viz/service/debugger/rwlock.cc +++ /dev/null
@@ -1,45 +0,0 @@ -// 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/viz/service/debugger/rwlock.h" - -namespace rwlock { - -void RWLock::ReadLock() { - int32_t expected = state_.load(std::memory_order_acquire); - int32_t desired = expected + 1; - - if (expected == -1) { - expected = 0; - desired = 1; - } - - while (!std::atomic_compare_exchange_weak(&state_, &expected, desired)) { - if (expected == -1) { - // A thread is writing. Wait for write-release to read. - expected = 0; - } - desired = expected + 1; - } -} -void RWLock::ReadUnlock() { - state_--; -} - -void RWLock::WriteLock() { - // There should be no readers - int32_t expected = 0; - int32_t desired = -1; - while (!std::atomic_compare_exchange_weak(&state_, &expected, desired)) { - if (expected == -1) { - // Another thread has the write lock. - } - expected = 0; - } -} -void RWLock::WriteUnLock() { - state_++; -} - -} // namespace rwlock
diff --git a/components/viz/service/debugger/rwlock.h b/components/viz/service/debugger/rwlock.h deleted file mode 100644 index 6233a5e8..0000000 --- a/components/viz/service/debugger/rwlock.h +++ /dev/null
@@ -1,28 +0,0 @@ -// 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_VIZ_SERVICE_DEBUGGER_RWLOCK_H_ -#define COMPONENTS_VIZ_SERVICE_DEBUGGER_RWLOCK_H_ - -#include <cstdint> -#include <unordered_map> -#include "components/viz/service/viz_service_export.h" - -namespace rwlock { -// Read-Write lock. -class VIZ_SERVICE_EXPORT RWLock { - public: - RWLock() : state_(0) {} - void ReadLock(); - void ReadUnlock(); - void WriteLock(); - void WriteUnLock(); - - private: - std::atomic<int32_t> state_; -}; - -} // namespace rwlock - -#endif // COMPONENTS_VIZ_SERVICE_DEBUGGER_RWLOCK_H_
diff --git a/components/viz/service/debugger/viz_debugger.cc b/components/viz/service/debugger/viz_debugger.cc index 090f891..63d77c97 100644 --- a/components/viz/service/debugger/viz_debugger.cc +++ b/components/viz/service/debugger/viz_debugger.cc
@@ -1,7 +1,6 @@ // Copyright 2020 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 <algorithm> #include <atomic> #include <string> @@ -13,9 +12,9 @@ #if VIZ_DEBUGGER_IS_ON() -#include "base/threading/platform_thread.h" +#include "base/json/json_reader.h" +#include "base/json/json_writer.h" #include "base/threading/sequenced_task_runner_handle.h" -#include "base/threading/thread_id_name_manager.h" namespace viz { @@ -60,7 +59,6 @@ base::DictionaryValue dict; dict.SetInteger("drawindex", draw_index); dict.SetInteger("source_index", source_index); - dict.SetInteger("thread_id", thread_id); dict.SetKey("option", std::move(option_dict)); return dict; } @@ -75,6 +73,7 @@ VizDebugger::VizDebugger() : gpu_thread_task_runner_(base::SequencedTaskRunnerHandle::Get()) { + DETACH_FROM_THREAD(viz_compositor_thread_checker_); enabled_.store(false); } @@ -93,6 +92,7 @@ // TODO(petermcneeley): When we move to multithread we need to do something // like an atomic swap here. Currently all multithreading concerns are handled // by having a lock around the |json_frame_output_| object. + common_lock_.AssertAcquired(); submission_count_ = 0; base::DictionaryValue global_dict; @@ -106,7 +106,6 @@ base::ListValue new_sources; for (size_t i = last_sent_source_count_; i < sources_.size(); i++) { const StaticSource* each = sources_[i]; - base::DictionaryValue dict; dict.SetString("file", each->file); dict.SetInteger("line", each->line); @@ -120,56 +119,26 @@ last_sent_source_count_ = sources_.size(); global_dict.SetKey("new_sources", std::move(new_sources)); - // We take the minimum between tail index and buffer size to make sure we - // don't go out of bounds. - size_t const max_rect_calls_index = - std::min(static_cast<int>(draw_rect_calls_tail_idx_), - static_cast<int>(draw_rect_calls_.size())); - size_t const max_text_calls_index = - std::min(static_cast<int>(draw_text_calls_tail_idx_), - static_cast<int>(draw_text_calls_.size())); - size_t const max_logs_index = std::min(static_cast<int>(logs_tail_idx_), - static_cast<int>(logs_.size())); - base::ListValue draw_calls; - // We are also grabbing the active threads while parsing draw calls. - base::ListValue new_threads; - // Hash set to keep track of threads that have been registered already. - base::flat_set<int> registered_threads; - for (size_t i = 0; i < max_rect_calls_index; ++i) { - base::DictionaryValue dict = draw_rect_calls_[i].GetDictionaryValue(); - base::DictionaryValue threads_dict; + for (auto&& each : draw_rect_calls_) { + base::DictionaryValue dict = each.GetDictionaryValue(); { base::ListValue list_xy; - list_xy.Append(draw_rect_calls_[i].obj_size.width()); - list_xy.Append(draw_rect_calls_[i].obj_size.height()); + list_xy.Append(each.obj_size.width()); + list_xy.Append(each.obj_size.height()); dict.SetKey("size", std::move(list_xy)); } { base::ListValue list_xy; - list_xy.Append(static_cast<double>(draw_rect_calls_[i].pos.x())); - list_xy.Append(static_cast<double>(draw_rect_calls_[i].pos.y())); + list_xy.Append(static_cast<double>(each.pos.x())); + list_xy.Append(static_cast<double>(each.pos.y())); dict.SetKey("pos", std::move(list_xy)); } - dict.SetInteger("buff_id", std::move(draw_rect_calls_[i].buff_id)); - - // Thread ID and Name processing stuff. - int cur_thread_id = draw_rect_calls_[i].thread_id; - // If new thread is not registered yet, then register it and mark it as - // registered. - if (registered_threads.find(cur_thread_id) == registered_threads.end()) { - std::string cur_thread_name = - base::ThreadIdNameManager::GetInstance()->GetName(cur_thread_id); - threads_dict.SetInteger("thread_id", cur_thread_id); - threads_dict.SetString("thread_name", cur_thread_name); - new_threads.Append(std::move(threads_dict)); - registered_threads.insert(cur_thread_id); - } + dict.SetInteger("buff_id", std::move(each.buff_id)); draw_calls.Append(std::move(dict)); } global_dict.SetKey("drawcalls", std::move(draw_calls)); - global_dict.SetKey("threads", std::move(new_threads)); base::DictionaryValue buff_map; for (auto&& each : buffers_) { @@ -189,36 +158,35 @@ global_dict.SetKey("buff_map", std::move(buff_map)); base::ListValue logs; - for (size_t i = 0; i < max_logs_index; ++i) { - base::DictionaryValue dict = logs_[i].GetDictionaryValue(); - dict.SetString("value", std::move(logs_[i].value)); + for (auto&& log : logs_) { + base::DictionaryValue dict = log.GetDictionaryValue(); + dict.SetString("value", std::move(log.value)); logs.Append(std::move(dict)); } global_dict.SetKey("logs", std::move(logs)); base::ListValue texts; - for (size_t i = 0; i < max_text_calls_index; ++i) { - base::DictionaryValue dict = draw_text_calls_[i].GetDictionaryValue(); + for (auto&& text : draw_text_calls_) { + base::DictionaryValue dict = text.GetDictionaryValue(); { base::ListValue list_xy; - list_xy.Append(static_cast<double>(draw_text_calls_[i].pos.x())); - list_xy.Append(static_cast<double>(draw_text_calls_[i].pos.y())); + list_xy.Append(static_cast<double>(text.pos.x())); + list_xy.Append(static_cast<double>(text.pos.y())); dict.SetKey("pos", std::move(list_xy)); } - dict.SetString("text", draw_text_calls_[i].text); + dict.SetString("text", text.text); texts.Append(std::move(dict)); } global_dict.SetKey("text", std::move(texts)); - // Reset index counters for each buffer. - draw_rect_calls_tail_idx_ = 0; - draw_text_calls_tail_idx_ = 0; - logs_tail_idx_ = 0; - + logs_.clear(); + draw_rect_calls_.clear(); + draw_text_calls_.clear(); return std::move(global_dict); } void VizDebugger::UpdateFilters() { + common_lock_.AssertAcquired(); if (apply_new_filters_next_frame_) { cached_filters_ = new_filters_; for (auto&& source : sources_) { @@ -232,13 +200,13 @@ void VizDebugger::CompleteFrame(uint64_t counter, const gfx::Size& window_pix, base::TimeTicks time_ticks) { - read_write_lock_.WriteLock(); + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); + base::AutoLock scoped_lock(common_lock_); UpdateFilters(); json_frame_output_ = FrameAsJson(counter, window_pix, time_ticks); gpu_thread_task_runner_->PostTask( FROM_HERE, base::BindOnce(&VizDebugger::AddFrame, base::Unretained(this))); - read_write_lock_.WriteUnLock(); } void VizDebugger::ApplyFilters(VizDebugger::StaticSource* src) { @@ -267,12 +235,11 @@ } void VizDebugger::RegisterSource(StaticSource* src) { - read_write_lock_.WriteLock(); + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); int index = sources_.size(); src->reg_index = index; ApplyFilters(src); sources_.push_back(src); - read_write_lock_.WriteUnLock(); } void VizDebugger::Draw(const gfx::SizeF& obj_size, @@ -280,6 +247,7 @@ const VizDebugger::StaticSource* dcs, VizDebugger::DrawOption option, int* id) { + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); Draw(gfx::Size(obj_size.width(), obj_size.height()), pos, dcs, option, id); } @@ -288,6 +256,7 @@ const VizDebugger::StaticSource* dcs, VizDebugger::DrawOption option, int* id) { + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); DrawInternal(obj_size, pos, dcs, option, id); } @@ -296,53 +265,21 @@ const VizDebugger::StaticSource* dcs, VizDebugger::DrawOption option, int* id) { + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); int local_id_buffer = -1; if (id != nullptr) { local_id_buffer = buffer_id++; *id = local_id_buffer; } - - // Store atomic insertion index in local variable to use to insert into - // buffer. - int insertion_index; - - for (;;) { - read_write_lock_.ReadLock(); - // Get call insertion index. - insertion_index = draw_rect_calls_tail_idx_++; - // If the insertion index is within bounds, insert call into buffer. - if (static_cast<size_t>(insertion_index) < draw_rect_calls_.size()) { - int cur_thread_id = base::PlatformThread::CurrentId(); - draw_rect_calls_[insertion_index] = DrawCall{submission_count_++, - dcs->reg_index, - cur_thread_id, - option, - obj_size, - pos, - local_id_buffer}; - // Return when call insertion is successful. - read_write_lock_.ReadUnlock(); - return; - } - read_write_lock_.ReadUnlock(); - // Take write lock to resize and re-adjust buffer tail index after buffer - // overflow. - read_write_lock_.WriteLock(); - // If tail index is over buffer size, then resizing is definitely needed. - // Also re-adjust tail index so it's at the start of the new buffer space. - if (static_cast<size_t>(draw_rect_calls_tail_idx_) >= - draw_rect_calls_.size()) { - draw_rect_calls_tail_idx_ = draw_rect_calls_.size(); - draw_rect_calls_.resize(draw_rect_calls_.size() * 2); - } - read_write_lock_.WriteUnLock(); - } + draw_rect_calls_.emplace_back(submission_count_++, dcs->reg_index, option, + obj_size, pos, local_id_buffer); } void VizDebugger::DrawText(const gfx::PointF& pos, const std::string& text, const VizDebugger::StaticSource* dcs, VizDebugger::DrawOption option) { + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); DrawText(gfx::Vector2dF(pos.OffsetFromOrigin()), text, dcs, option); } @@ -350,6 +287,7 @@ const std::string& text, const VizDebugger::StaticSource* dcs, VizDebugger::DrawOption option) { + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); DrawText(gfx::Vector2dF(pos.x(), pos.y()), text, dcs, option); } @@ -357,56 +295,24 @@ const std::string& text, const VizDebugger::StaticSource* dcs, VizDebugger::DrawOption option) { - // Store atomic insertion index in local variable to use to insert into - // buffer. - int insertion_index; - - for (;;) { - read_write_lock_.ReadLock(); - // Get call insertion index. - insertion_index = draw_text_calls_tail_idx_++; - // If the insertion index is within bounds, insert call into buffer. - if (static_cast<size_t>(insertion_index) < draw_text_calls_.size()) { - int cur_thread_id = base::PlatformThread::CurrentId(); - draw_text_calls_[insertion_index] = DrawTextCall{submission_count_++, - dcs->reg_index, - cur_thread_id, - option, - pos, - text}; - // Return when call insertion is successful. - read_write_lock_.ReadUnlock(); - return; - } - read_write_lock_.ReadUnlock(); - // Take write lock to resize and re-adjust buffer tail index after buffer - // overflow. - read_write_lock_.WriteLock(); - // If tail index is over buffer size, then resizing is definitely needed. - // Also re-adjust tail index so it's at the start of the new buffer space. - if (static_cast<size_t>(draw_text_calls_tail_idx_) >= - draw_text_calls_.size()) { - draw_text_calls_tail_idx_ = draw_text_calls_.size(); - draw_text_calls_.resize(draw_text_calls_.size() * 2); - } - read_write_lock_.WriteUnLock(); - } + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); + draw_text_calls_.emplace_back(submission_count_++, dcs->reg_index, option, + pos, text); } void VizDebugger::AddFrame() { // TODO(petermcneeley): This code has duel thread entry. One to launch the // task and one for the task to run. We should improve on this design in the // future and have a better multithreaded frame data aggregation system. - read_write_lock_.WriteLock(); + base::AutoLock scoped_lock(common_lock_); DCHECK(gpu_thread_task_runner_->RunsTasksInCurrentSequence()); if (debug_output_.is_bound()) { debug_output_->LogFrame(std::move(json_frame_output_)); } - read_write_lock_.WriteUnLock(); } void VizDebugger::FilterDebugStream(base::Value json) { - read_write_lock_.WriteLock(); + base::AutoLock scoped_lock(common_lock_); DCHECK(gpu_thread_task_runner_->RunsTasksInCurrentSequence()); const base::Value* value = &(json); const base::Value* filterlist = value->FindPath("filters"); @@ -446,12 +352,11 @@ } apply_new_filters_next_frame_ = true; - read_write_lock_.WriteUnLock(); } void VizDebugger::StartDebugStream( mojo::PendingRemote<mojom::VizDebugOutput> pending_debug_output) { - read_write_lock_.WriteLock(); + base::AutoLock scoped_lock(common_lock_); DCHECK(gpu_thread_task_runner_->RunsTasksInCurrentSequence()); debug_output_.Bind(std::move(pending_debug_output)); debug_output_.reset_on_disconnect(); @@ -467,49 +372,21 @@ debug_output_->LogFrame(std::move(dict)); enabled_.store(true); - read_write_lock_.WriteUnLock(); } void VizDebugger::StopDebugStream() { - read_write_lock_.WriteLock(); + base::AutoLock scoped_lock(common_lock_); DCHECK(gpu_thread_task_runner_->RunsTasksInCurrentSequence()); debug_output_.reset(); enabled_.store(false); - read_write_lock_.WriteUnLock(); } void VizDebugger::AddLogMessage(std::string log, const VizDebugger::StaticSource* dcs, DrawOption option) { - // Store atomic insertion index in local variable to use to insert into - // buffer. - int insertion_index; - - for (;;) { - read_write_lock_.ReadLock(); - // Get call insertion index. - insertion_index = logs_tail_idx_++; - // If the insertion index is within bounds, insert call into buffer. - if (static_cast<size_t>(insertion_index) < logs_.size()) { - int cur_thread_id = base::PlatformThread::CurrentId(); - logs_[insertion_index] = LogCall{submission_count_++, dcs->reg_index, - cur_thread_id, option, std::move(log)}; - // Return when call insertion is successful. - read_write_lock_.ReadUnlock(); - return; - } - read_write_lock_.ReadUnlock(); - // Take write lock to resize and re-adjust buffer tail index after buffer - // overflow. - read_write_lock_.WriteLock(); - // If tail index is over buffer size, then resizing is definitely needed. - // Also re-adjust tail index so it's at the start of the new buffer space. - if (static_cast<size_t>(logs_tail_idx_) >= logs_.size()) { - logs_tail_idx_ = logs_.size(); - logs_.resize(logs_.size() * 2); - } - read_write_lock_.WriteUnLock(); - } + DCHECK_CALLED_ON_VALID_THREAD(viz_compositor_thread_checker_); + logs_.emplace_back(submission_count_++, dcs->reg_index, option, + std::move(log)); } } // namespace viz
diff --git a/components/viz/service/debugger/viz_debugger.h b/components/viz/service/debugger/viz_debugger.h index 3577364..26952cc 100644 --- a/components/viz/service/debugger/viz_debugger.h +++ b/components/viz/service/debugger/viz_debugger.h
@@ -12,12 +12,13 @@ #include <vector> #include "base/debug/debugging_buildflags.h" +#include "base/strings/stringprintf.h" +#include "base/synchronization/lock.h" #include "base/task/sequenced_task_runner.h" #include "base/threading/thread_checker.h" #include "base/time/time.h" #include "base/values.h" #include "components/viz/common/buildflags.h" -#include "components/viz/service/debugger/rwlock.h" #include "components/viz/service/viz_service_export.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" @@ -151,29 +152,22 @@ scoped_refptr<base::SequencedTaskRunner> gpu_thread_task_runner_; struct CallSubmitCommon { - CallSubmitCommon() = default; - CallSubmitCommon(int index, int source, int thread, DrawOption draw_option) - : draw_index(index), - source_index(source), - thread_id(thread), - option(draw_option) {} + CallSubmitCommon(int index, int source, DrawOption draw_option) + : draw_index(index), source_index(source), option(draw_option) {} base::DictionaryValue GetDictionaryValue() const; int draw_index; int source_index; - int thread_id; VizDebugger::DrawOption option; }; struct DrawCall : public CallSubmitCommon { - DrawCall() = default; DrawCall(int index, int source, - int thread, DrawOption draw_option, gfx::Size size, gfx::Vector2dF position, int buffer_id) - : CallSubmitCommon(index, source, thread, draw_option), + : CallSubmitCommon(index, source, draw_option), obj_size(size), pos(position), buff_id(buffer_id) {} @@ -183,14 +177,12 @@ }; struct DrawTextCall : public CallSubmitCommon { - DrawTextCall() = default; DrawTextCall(int index, int source, - int thread, DrawOption draw_option, gfx::Vector2dF position, std::string str) - : CallSubmitCommon(index, source, thread, draw_option), + : CallSubmitCommon(index, source, draw_option), pos(position), text(str) {} gfx::Vector2dF pos; @@ -198,14 +190,8 @@ }; struct LogCall : public CallSubmitCommon { - LogCall() = default; - LogCall(int index, - int source, - int thread, - DrawOption draw_option, - std::string str) - : CallSubmitCommon(index, source, thread, draw_option), - value(std::move(str)) {} + LogCall(int index, int source, DrawOption draw_option, std::string str) + : CallSubmitCommon(index, source, draw_option), value(std::move(str)) {} std::string value; }; @@ -224,13 +210,12 @@ bool enabled = false; }; - // Synchronize access to buffers and variables mutated by multiple threads. - rwlock::RWLock read_write_lock_; - + // Synchronize access to the variables in the block below as it is mutated by + // multiple threads. + base::Lock common_lock_; // New filters to promoted to cached filters on next frame. std::vector<FilterBlock> new_filters_; bool apply_new_filters_next_frame_ = false; - // Json is saved out every frame on the call to 'CompleteFrame' but may not be // uploaded immediately due to task runner sequencing. base::Value json_frame_output_; @@ -238,29 +223,16 @@ // Cached filters to apply filtering to new sources not just on filter update. std::vector<FilterBlock> cached_filters_; + // Common counter for all submissions. + int submission_count_ = 0; int buffer_id = 0; - - // Common counter for all submissions. This variable can be accessed by - // multiple threads atomically. - std::atomic<int> submission_count_ = 0; - - // Default starting size for each buffer/vector. - static constexpr int kDefaultBufferSize = 64; - - // Buffers/vectors for each type of debug calls. These vectors can be accessed - // and mutated by multiple threads simultaneously or individually. - std::vector<DrawCall> draw_rect_calls_{kDefaultBufferSize}; - std::vector<DrawTextCall> draw_text_calls_{kDefaultBufferSize}; - std::vector<LogCall> logs_{kDefaultBufferSize}; + std::vector<DrawCall> draw_rect_calls_; + std::vector<DrawTextCall> draw_text_calls_; + std::vector<LogCall> logs_; std::vector<StaticSource*> sources_; std::vector<Buffer> buffers_; - // Individual tail indices tracker variables for next insertion index in - // each buffer. These variables can be accessed by multiple threads - // atomically. - std::atomic<int> draw_rect_calls_tail_idx_ = 0; - std::atomic<int> draw_text_calls_tail_idx_ = 0; - std::atomic<int> logs_tail_idx_ = 0; + THREAD_CHECKER(viz_compositor_thread_checker_); }; } // namespace viz
diff --git a/components/viz/service/debugger/viz_debugger_unittest.cc b/components/viz/service/debugger/viz_debugger_unittest.cc new file mode 100644 index 0000000..0c8a7ef0 --- /dev/null +++ b/components/viz/service/debugger/viz_debugger_unittest.cc
@@ -0,0 +1,795 @@ +// Copyright 2014 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 <stddef.h> + +#include <cstddef> +#include <cstdio> +#include <unordered_map> +#include <utility> +#include <vector> + +#include "base/bind.h" +#include "base/callback_helpers.h" +#include "base/json/json_reader.h" +#include "base/strings/string_number_conversions.h" +#include "base/strings/stringprintf.h" +#include "base/time/time.h" +#include "components/viz/service/debugger/viz_debugger.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/gfx/geometry/vector2d_f.h" + +#if VIZ_DEBUGGER_IS_ON() +using testing::_; +using testing::Mock; + +namespace viz { + +class VizDebuggerInternal : public VizDebugger { + public: + void ForceEnabled() { enabled_ = true; } + bool Reset(); + + int GetSourceCount() { return static_cast<int>(sources_.size()); } + + using VizDebugger::CallSubmitCommon; + using VizDebugger::common_lock_; + using VizDebugger::DrawCall; + using VizDebugger::DrawTextCall; + using VizDebugger::FrameAsJson; + using VizDebugger::LogCall; + using VizDebugger::UpdateFilters; +}; + +bool VizDebuggerInternal::Reset() { + submission_count_ = 0; + buffer_id = 0; + draw_rect_calls_.clear(); + buffers_.clear(); + draw_text_calls_.clear(); + logs_.clear(); + last_sent_source_count_ = 0; + sources_.clear(); + return true; +} + +namespace { + +struct TestFilter { + std::string anno; + std::string func; + std::string file; + bool active = true; + bool enabled = true; +}; + +static_assert(sizeof(VizDebuggerInternal) == sizeof(VizDebugger), + "This test code exposes the internals of |VizDebugger| via an " + "upcast; thus they must be the same size."); + +class VisualDebuggerTest : public testing::Test { + protected: + VizDebuggerInternal* GetInternal() { + return static_cast<VizDebuggerInternal*>(VizDebugger::GetInstance()); + } + + void SetUp() override { GetInternal()->Reset(); } + void TearDown() override { GetInternal()->Reset(); } + + void SetFilter(std::vector<TestFilter> filters) { + base::DictionaryValue filters_json; + base::ListValue filters_list; + for (auto&& each : filters) { + base::DictionaryValue full_filter; + base::DictionaryValue selector; + if (!each.file.empty()) + selector.SetString("file", each.file); + + if (!each.func.empty()) + selector.SetString("func", each.func); + + selector.SetString("anno", each.anno); + + full_filter.SetKey("selector", std::move(selector)); + full_filter.SetBoolean("active", each.active); + full_filter.SetBoolean("enabled", each.enabled); + filters_list.Append(std::move(full_filter)); + } + filters_json.SetKey("filters", std::move(filters_list)); + GetInternal()->FilterDebugStream(std::move(filters_json)); + GetInternal()->common_lock_.Acquire(); + GetInternal()->UpdateFilters(); + GetInternal()->common_lock_.Release(); + } + + public: + struct StaticSource { + std::string file; + std::string func; + std::string anno; + int line; + int index; + }; + + void GetFrameData() { + sources_.clear(); + draw_calls_.clear(); + buffers_.clear(); + log_calls_.clear(); + draw_text_calls_.clear(); + GetInternal()->common_lock_.Acquire(); + absl::optional<base::Value> global_dict = GetInternal()->FrameAsJson( + frame_counter_, gfx::Size(window_x_, window_y_), base::TimeTicks()); + GetInternal()->common_lock_.Release(); + frame_counter_++; + + EXPECT_TRUE(global_dict->is_dict()); + + base::StringToUint64(global_dict->FindKey("frame")->GetString().c_str(), + &counter_); + static const int kNoVal = -1; + int expected_version = + global_dict->FindKey("version")->GetIfInt().value_or(kNoVal); + // Check to update these unit tests if a backwards compatible change has + // been made. + EXPECT_EQ(1, expected_version); + + window_x_ = global_dict->FindKey("windowx")->GetIfInt().value_or(kNoVal); + window_y_ = global_dict->FindKey("windowy")->GetIfInt().value_or(kNoVal); + + base::Value* list_source = global_dict->FindListKey("new_sources"); + EXPECT_TRUE(list_source->is_list()); + + for (size_t i = 0; i < list_source->GetListDeprecated().size(); i++) { + auto&& local_dict = list_source->GetListDeprecated()[i]; + StaticSource ss; + ss.file = local_dict.FindKey("file")->GetString(); + ss.func = local_dict.FindKey("func")->GetString(); + ss.anno = local_dict.FindKey("anno")->GetString(); + ss.line = local_dict.FindKey("line")->GetIfInt().value_or(kNoVal); + ss.index = local_dict.FindKey("index")->GetIfInt().value_or(kNoVal); + sources_.push_back(ss); + } + + base::Value* draw_call_list = global_dict->FindListKey("drawcalls"); + EXPECT_TRUE(draw_call_list->is_list()); + + auto func_common_call = [](const base::Value& dict, int* draw_index, + int* source_index, + VizDebugger::DrawOption* option) { + *draw_index = dict.FindKey("drawindex")->GetIfInt().value_or(kNoVal); + *source_index = dict.FindKey("source_index")->GetIfInt().value_or(kNoVal); + + const base::Value* option_dict = dict.FindDictKey("option"); + + uint32_t red; + uint32_t green; + uint32_t blue; + std::sscanf(option_dict->FindKey("color")->GetString().c_str(), "#%x%x%x", + &red, &green, &blue); + + option->color_r = red; + option->color_g = green; + option->color_b = blue; + option->color_a = static_cast<uint8_t>( + option_dict->FindKey("alpha")->GetIfInt().value_or(kNoVal)); + }; + + for (size_t i = 0; i < draw_call_list->GetListDeprecated().size(); i++) { + const base::Value& local_dict = draw_call_list->GetListDeprecated()[i]; + int draw_index; + int source_index; + VizDebugger::DrawOption option; + func_common_call(local_dict, &draw_index, &source_index, &option); + + const base::Value* list_size = local_dict.FindListKey("size"); + EXPECT_TRUE(list_size->is_list()); + int size_x = + list_size->GetListDeprecated()[0].GetIfInt().value_or(kNoVal); + int size_y = + list_size->GetListDeprecated()[1].GetIfInt().value_or(kNoVal); + + const base::Value* list_pos = local_dict.FindListKey("pos"); + EXPECT_TRUE(list_pos->is_list()); + float pos_x = + list_pos->GetListDeprecated()[0].GetIfDouble().value_or(kNoVal); + float pos_y = + list_pos->GetListDeprecated()[1].GetIfDouble().value_or(kNoVal); + + const base::Value* buffer_id = local_dict.FindKey("buff_id"); + + VizDebuggerInternal::DrawCall draw_call( + draw_index, source_index, option, gfx::Size(size_x, size_y), + gfx::Vector2dF(pos_x, pos_y), buffer_id ? buffer_id->GetInt() : -1); + + draw_calls_.push_back(draw_call); + } + + base::Value* buffer_map_dict = global_dict->FindKey("buff_map"); + if (buffer_map_dict) { + for (base::Value::Dict::iterator itr = buffer_map_dict->GetDict().begin(); + itr != buffer_map_dict->GetDict().end(); itr++) { + base::Value* buffer_dict = buffer_map_dict->FindKey(itr->first); + EXPECT_TRUE(buffer_dict); + int width = buffer_dict->FindKey("width")->GetIfInt().value_or(kNoVal); + int height = + buffer_dict->FindKey("height")->GetIfInt().value_or(kNoVal); + base::Value* buffer_info = buffer_dict->FindKey("buffer"); + EXPECT_TRUE(buffer_info->is_list()); + VizDebuggerInternal::BufferInfo buff; + buff.width = width; + buff.height = height; + buff.buffer.resize(width * height); + for (size_t i = 0; i < buffer_info->GetList().size() / 4; i++) { + uint8_t temp1 = buffer_info->GetList()[i * 4].GetInt(); + uint8_t temp2 = buffer_info->GetList()[i * 4 + 1].GetInt(); + uint8_t temp3 = buffer_info->GetList()[i * 4 + 2].GetInt(); + uint8_t temp4 = buffer_info->GetList()[i * 4 + 3].GetInt(); + buff.buffer[i] = {temp1, temp2, temp3, temp4}; + } + int id; + base::StringToInt(itr->first, &id); + VizDebuggerInternal::Buffer buffer; + buffer.id = id; + buffer.buffer_info = buff; + buffers_.push_back(buffer); + } + } + + base::Value* text_call_list = global_dict->FindListKey("text"); + EXPECT_TRUE(text_call_list->is_list()); + + for (size_t i = 0; i < text_call_list->GetListDeprecated().size(); i++) { + const base::Value& local_dict = text_call_list->GetListDeprecated()[i]; + int draw_index; + int source_index; + VizDebugger::DrawOption option; + + func_common_call(local_dict, &draw_index, &source_index, &option); + + const base::Value* list_pos = local_dict.FindListKey("pos"); + EXPECT_TRUE(list_pos->is_list()); + float pos_x = + list_pos->GetListDeprecated()[0].GetIfDouble().value_or(kNoVal); + float pos_y = + list_pos->GetListDeprecated()[1].GetIfDouble().value_or(kNoVal); + + VizDebuggerInternal::DrawTextCall text_call( + draw_index, source_index, option, gfx::Vector2dF(pos_x, pos_y), + local_dict.FindKey("text")->GetString()); + + draw_text_calls_.push_back(text_call); + } + + base::Value* log_call_list = global_dict->FindListKey("logs"); + EXPECT_TRUE(log_call_list->is_list()); + + for (size_t i = 0; i < log_call_list->GetListDeprecated().size(); i++) { + const base::Value& local_dict = log_call_list->GetListDeprecated()[i]; + int draw_index; + int source_index; + VizDebugger::DrawOption option; + func_common_call(local_dict, &draw_index, &source_index, &option); + + VizDebuggerInternal::LogCall log_call( + draw_index, source_index, option, + local_dict.FindKey("value")->GetString()); + + log_calls_.push_back(log_call); + } + } + + uint64_t frame_counter_ = 0; + + // Cached result of call to 'GetFrameData' to simplify code. + uint64_t counter_; + int window_x_ = 256; + int window_y_ = 256; + std::vector<StaticSource> sources_; + std::vector<VizDebuggerInternal::DrawCall> draw_calls_; + std::vector<VizDebuggerInternal::Buffer> buffers_; + std::vector<VizDebuggerInternal::LogCall> log_calls_; + std::vector<VizDebuggerInternal::DrawTextCall> draw_text_calls_; +}; + +TEST_F(VisualDebuggerTest, GeneralDrawSubmission) { + const char kAnnoRect[] = "annorect"; + const char kAnnoText[] = "annotext"; + const char kAnnoLog[] = "annolog"; + const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); + static const int kNumFrames = 4; + GetInternal()->ForceEnabled(); + for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { + SetFilter({TestFilter({""})}); + + static const int kNumSubmission = 8; + for (int i = 0; i < kNumSubmission; i++) { + DBG_DRAW_RECT(kAnnoRect, kTestRect); + DBG_DRAW_TEXT(kAnnoText, kTestRect.origin(), + base::StringPrintf("Text %d", i)); + DBG_LOG(kAnnoLog, "%d", i); + } + + GetFrameData(); + + EXPECT_EQ(counter_, frame_idx); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(draw_calls_.size(), static_cast<size_t>(kNumSubmission)); + EXPECT_EQ(log_calls_.size(), static_cast<size_t>(kNumSubmission)); + EXPECT_EQ(draw_text_calls_.size(), static_cast<size_t>(kNumSubmission)); + + if (frame_idx == 0) { + EXPECT_EQ(sources_.size(), 3u); + EXPECT_EQ(sources_[0].func, "TestBody"); + EXPECT_EQ(sources_[0].file, __FILE__); + EXPECT_EQ(sources_[0].anno, kAnnoRect); + EXPECT_EQ(sources_[1].func, "TestBody"); + EXPECT_EQ(sources_[1].file, __FILE__); + EXPECT_EQ(sources_[1].anno, kAnnoText); + EXPECT_EQ(sources_[2].func, "TestBody"); + EXPECT_EQ(sources_[2].file, __FILE__); + EXPECT_EQ(sources_[2].anno, kAnnoLog); + } else { + // After the first frame there are no new sources in the loop. + EXPECT_EQ(sources_.size(), 0u); + } + + for (int i = 0; i < kNumSubmission; i++) { + EXPECT_EQ(draw_calls_[i].pos, + gfx::Vector2dF(kTestRect.origin().x(), kTestRect.origin().y())); + EXPECT_EQ(draw_calls_[i].obj_size, kTestRect.size()); + EXPECT_EQ(draw_calls_[i].source_index, 0); + EXPECT_EQ(draw_calls_[i].draw_index, i * 3); + + EXPECT_EQ(draw_text_calls_[i].pos, + gfx::Vector2dF(kTestRect.origin().x(), kTestRect.origin().y())); + EXPECT_EQ(draw_text_calls_[i].source_index, 1); + EXPECT_EQ(draw_text_calls_[i].draw_index, i * 3 + 1); + EXPECT_EQ(draw_text_calls_[i].text, base::StringPrintf("Text %d", i)); + + EXPECT_EQ(log_calls_[i].value, base::StringPrintf("%d", i)); + EXPECT_EQ(log_calls_[i].source_index, 2); + EXPECT_EQ(log_calls_[i].draw_index, i * 3 + 2); + } + } +} + +static void FunctionNameTest(const char* anno_rect, gfx::Rect rect) { + DBG_DRAW_RECT(anno_rect, rect); +} + +TEST_F(VisualDebuggerTest, FilterDrawSubmission) { + const char kAnnoRect[] = "annorect"; + const char kAnnoMissing[] = "testmissing"; + const char kAnnoMatch[] = "before_annorect_after"; + + GetInternal()->ForceEnabled(); + const gfx::Rect kTestRect = gfx::Rect(10, 30, 50, 70); + const gfx::Rect kMissingRect = gfx::Rect(11, 33, 55, 77); + std::vector<int> valid_indices; + SetFilter({TestFilter({"annorect"})}); + valid_indices.push_back(GetInternal()->GetSourceCount()); + FunctionNameTest(kAnnoRect, kTestRect); + valid_indices.push_back(GetInternal()->GetSourceCount()); + DBG_DRAW_RECT(kAnnoRect, kTestRect); + DBG_DRAW_RECT(kAnnoMissing, kMissingRect); + valid_indices.push_back(GetInternal()->GetSourceCount()); + DBG_DRAW_RECT(kAnnoMatch, kTestRect); + + SetFilter({TestFilter({"", "FunctionNameTest"})}); + DBG_DRAW_RECT(kAnnoRect, kMissingRect); + valid_indices.push_back(0); + FunctionNameTest(kAnnoRect, kTestRect); + + SetFilter({TestFilter({"", "TestBody"})}); + FunctionNameTest(kAnnoRect, kMissingRect); + valid_indices.push_back(GetInternal()->GetSourceCount()); + DBG_DRAW_RECT(kAnnoRect, kTestRect); + + SetFilter({TestFilter({"", "", "no_file"})}); + DBG_DRAW_RECT(kAnnoRect, kMissingRect); + + SetFilter({TestFilter({"", "", __FILE__})}); + valid_indices.push_back(GetInternal()->GetSourceCount()); + DBG_DRAW_RECT(kAnnoRect, kTestRect); + + GetFrameData(); + EXPECT_EQ(sources_[0].func, "FunctionNameTest"); + EXPECT_EQ(sources_[0].file, __FILE__); + EXPECT_EQ(sources_[0].anno, kAnnoRect); + EXPECT_EQ(sources_[1].func, "TestBody"); + EXPECT_EQ(sources_[1].file, __FILE__); + EXPECT_EQ(sources_[1].anno, kAnnoRect); + EXPECT_EQ(sources_[2].anno, kAnnoMissing); + EXPECT_EQ(sources_[3].anno, kAnnoMatch); + + auto check_draw = [](const VizDebuggerInternal::DrawCall& draw_call, + const gfx::Rect& rect, int src_idx, int draw_idx) { + EXPECT_EQ(draw_call.pos, + gfx::Vector2dF(rect.origin().x(), rect.origin().y())); + EXPECT_EQ(draw_call.obj_size, rect.size()); + EXPECT_EQ(draw_call.source_index, src_idx); + EXPECT_EQ(draw_call.draw_index, draw_idx); + }; + + // Makes sure all valid indices are here and have the correct rect. + for (size_t i = 0; i < draw_calls_.size(); i++) { + check_draw(draw_calls_[i], kTestRect, valid_indices[i], i); + } +} + +constexpr const char kTestFlagFunctionAnnoName[] = "testflagfunctionanno"; + +DBG_FLAG_FBOOL(kTestFlagFunctionAnnoName, check_flag_enabled) + +static bool FlagFunctionTestEnable() { + return check_flag_enabled(); +} + +TEST_F(VisualDebuggerTest, TestDebugFlagAnnoAndFunction) { + GetInternal()->ForceEnabled(); + + // Set our test flag to be disabled. + SetFilter({TestFilter({kTestFlagFunctionAnnoName, "", "", true, false})}); + EXPECT_FALSE(FlagFunctionTestEnable()); + SetFilter({TestFilter({kTestFlagFunctionAnnoName, "", "", true, true})}); + EXPECT_TRUE(FlagFunctionTestEnable()); + SetFilter({TestFilter({kTestFlagFunctionAnnoName, "", "", true, false})}); + EXPECT_FALSE(FlagFunctionTestEnable()); +} + +// This tests makes sure that expensive string logging has no cost unless it is +// actively being filtered. +TEST_F(VisualDebuggerTest, NonFilterActiveNoCost) { + GetInternal()->ForceEnabled(); + const char* kStrA = "anno_A"; + const char* kStrB = "anno_B"; + // These integers are mutated on a function invocation. + int count_a = 0; + int count_b = 0; + + auto get_a_string = [&count_a, &kStrA]() { + count_a++; + return std::string(kStrA); + }; + auto get_b_string = [&count_b, &kStrB]() { + count_b++; + return std::string(kStrB); + }; + + // Filter on "anno_A" which should call 'get_a_string'. + SetFilter({TestFilter({kStrA})}); + DBG_DRAW_TEXT(kStrA, gfx::Point(), get_a_string()); + DBG_DRAW_TEXT(kStrB, gfx::Point(), get_b_string()); + EXPECT_EQ(1, count_a); + EXPECT_EQ(0, count_b); + + // Filter on "anno_B" which should call 'get_b_string'. + SetFilter({TestFilter({kStrB})}); + DBG_DRAW_TEXT(kStrA, gfx::Point(), get_a_string()); + DBG_DRAW_TEXT(kStrB, gfx::Point(), get_b_string()); + EXPECT_EQ(1, count_a); + EXPECT_EQ(1, count_b); +} + +// This tests passing a single buffer synchronously into the visual debuggeer +TEST_F(VisualDebuggerTest, SingleBufferSync) { + const char kAnnoRect[] = "annorect"; + const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); + static const int kNumFrames = 1; + GetInternal()->ForceEnabled(); + VizDebuggerInternal::BufferInfo buffer_info; + buffer_info.width = 4; + buffer_info.height = 4; + buffer_info.buffer.resize(buffer_info.width * buffer_info.height); + for (int i = 0; i < buffer_info.height * buffer_info.width; i++) { + // Random numbers between 0-255 for RGBA values + uint8_t temp1 = 123; + uint8_t temp2 = 140; + uint8_t temp3 = 203; + uint8_t temp4 = 255; + buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; + } + VizDebuggerInternal::Buffer buffer; + buffer.id = 0; + buffer.buffer_info = buffer_info; + for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { + SetFilter({TestFilter({""})}); + + static const int kNumSubmission = 1; + int id = 0; + DBG_COMPLETE_BUFFERS(id, buffer.buffer_info); + DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); + + GetFrameData(); + + EXPECT_EQ(counter_, frame_idx); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(draw_calls_.size(), static_cast<size_t>(kNumSubmission)); + EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); + + if (frame_idx == 0) { + EXPECT_EQ(sources_.size(), 1u); + EXPECT_EQ(sources_[0].func, "TestBody"); + EXPECT_EQ(sources_[0].file, __FILE__); + EXPECT_EQ(sources_[0].anno, kAnnoRect); + } else { + // After the first frame there are no new sources in the loop. + EXPECT_EQ(sources_.size(), 0u); + } + + EXPECT_EQ(draw_calls_[0].buff_id, 0); + + EXPECT_EQ(buffers_[0].buffer_info.width, buffer.buffer_info.width); + EXPECT_EQ(buffers_[0].buffer_info.height, buffer.buffer_info.height); + for (int j = 0; + j < buffers_[0].buffer_info.width * buffers_[0].buffer_info.height; + j++) { + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_r), + static_cast<int>(buffer.buffer_info.buffer[j].color_r)); + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_g), + static_cast<int>(buffer.buffer_info.buffer[j].color_g)); + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_b), + static_cast<int>(buffer.buffer_info.buffer[j].color_b)); + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_a), + static_cast<int>(buffer.buffer_info.buffer[j].color_a)); + } + } +} + +// This tests passing multiple buffers into the visual debugger synchronously +TEST_F(VisualDebuggerTest, MultipleBuffersSync) { + const char kAnnoRect[] = "annorect"; + const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); + static const int kNumFrames = 1; + GetInternal()->ForceEnabled(); + GetInternal()->Reset(); + VizDebuggerInternal::BufferInfo buffer_info; + buffer_info.width = 4; + buffer_info.height = 4; + buffer_info.buffer.resize(buffer_info.width * buffer_info.height); + for (int i = 0; i < buffer_info.height * buffer_info.width; i++) { + // Random numbers between 0-255 for RGBA values + uint8_t temp1 = 123; + uint8_t temp2 = 140; + uint8_t temp3 = 203; + uint8_t temp4 = 255; + buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; + } + VizDebuggerInternal::Buffer buffer; + buffer.id = 0; + buffer.buffer_info = buffer_info; + for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { + SetFilter({TestFilter({""})}); + + static const int kNumSubmission = 8; + for (int i = 0; i < kNumSubmission; i++) { + int id = i; + DBG_COMPLETE_BUFFERS(id, buffer.buffer_info); + DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); + } + + GetFrameData(); + + EXPECT_EQ(counter_, frame_idx); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(draw_calls_.size(), static_cast<size_t>(kNumSubmission)); + EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); + + if (frame_idx == 0) { + EXPECT_EQ(sources_.size(), 1u); + EXPECT_EQ(sources_[0].func, "TestBody"); + EXPECT_EQ(sources_[0].file, __FILE__); + EXPECT_EQ(sources_[0].anno, kAnnoRect); + } else { + // After the first frame there are no new sources in the loop. + EXPECT_EQ(sources_.size(), 0u); + } + + for (int i = 0; i < kNumSubmission; i++) { + EXPECT_EQ(draw_calls_[i].buff_id, i); + + EXPECT_EQ(buffers_[i].buffer_info.width, buffer.buffer_info.width); + EXPECT_EQ(buffers_[i].buffer_info.height, buffer.buffer_info.height); + for (int j = 0; + j < buffers_[i].buffer_info.width * buffers_[i].buffer_info.height; + j++) { + EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_r), + static_cast<int>(buffer.buffer_info.buffer[j].color_r)); + EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_g), + static_cast<int>(buffer.buffer_info.buffer[j].color_g)); + EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_b), + static_cast<int>(buffer.buffer_info.buffer[j].color_b)); + EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_a), + static_cast<int>(buffer.buffer_info.buffer[j].color_a)); + } + } + } +} + +// This tests passing a single buffer into the visual debugger asynchronously +TEST_F(VisualDebuggerTest, SingleBufferAsync) { + const char kAnnoRect[] = "annorect"; + const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); + static const int kNumFrames = 2; + GetInternal()->ForceEnabled(); + GetInternal()->Reset(); + VizDebuggerInternal::BufferInfo buffer_info; + buffer_info.width = 4; + buffer_info.height = 4; + buffer_info.buffer.resize(buffer_info.width * buffer_info.height); + for (int i = 0; i < buffer_info.height * buffer_info.width; i++) { + // Random numbers between 0-255 for RGBA values + uint8_t temp1 = 123; + uint8_t temp2 = 140; + uint8_t temp3 = 203; + uint8_t temp4 = 255; + buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; + } + VizDebuggerInternal::Buffer buffer; + buffer.id = 0; + buffer.buffer_info = buffer_info; + for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { + SetFilter({TestFilter({""})}); + + static const int kNumSubmission = 1; + static std::vector<VizDebuggerInternal::Buffer> previous_textures; + for (auto&& each : previous_textures) { + DBG_COMPLETE_BUFFERS(each.id, each.buffer_info) + } + + int id = 0; + DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); + buffer.id = id; + previous_textures.emplace_back(buffer); + + GetFrameData(); + + EXPECT_EQ(counter_, frame_idx); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(draw_calls_.size(), static_cast<size_t>(kNumSubmission)); + + if (frame_idx == 0) { + EXPECT_EQ(sources_.size(), 1u); + EXPECT_EQ(sources_[0].func, "TestBody"); + EXPECT_EQ(sources_[0].file, __FILE__); + EXPECT_EQ(sources_[0].anno, kAnnoRect); + EXPECT_EQ(buffers_.size(), static_cast<size_t>(0)); + } else { + // After the first frame there are no new sources in the loop. + EXPECT_EQ(sources_.size(), 0u); + EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); + EXPECT_EQ(draw_calls_[0].buff_id, 1); + EXPECT_EQ(buffers_[0].buffer_info.width, buffer.buffer_info.width); + EXPECT_EQ(buffers_[0].buffer_info.height, buffer.buffer_info.height); + for (int j = 0; + j < buffers_[0].buffer_info.width * buffers_[0].buffer_info.height; + j++) { + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_r), + static_cast<int>(buffer.buffer_info.buffer[j].color_r)); + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_g), + static_cast<int>(buffer.buffer_info.buffer[j].color_g)); + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_b), + static_cast<int>(buffer.buffer_info.buffer[j].color_b)); + EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_a), + static_cast<int>(buffer.buffer_info.buffer[j].color_a)); + } + } + } +} + +// This tests passing multiple buffers into the visual debugger asynchronously +TEST_F(VisualDebuggerTest, MultipleBuffersAsync) { + const char kAnnoRect[] = "annorect"; + const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); + static const int kNumFrames = 2; + GetInternal()->ForceEnabled(); + GetInternal()->Reset(); + VizDebuggerInternal::BufferInfo buffer_info; + buffer_info.width = 4; + buffer_info.height = 4; + buffer_info.buffer.resize(buffer_info.width * buffer_info.height); + VizDebuggerInternal::Buffer buffer; + buffer.id = 0; + for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { + SetFilter({TestFilter({""})}); + + static const int kNumSubmission = 8; + static std::vector<VizDebuggerInternal::Buffer> previous_textures; + static std::vector<VizDebuggerInternal::Buffer> test_buffers; + for (auto&& each : previous_textures) { + for (int i = 0; i < buffer_info.width * buffer_info.height; i++) { + // Random numbers between 0-255 for RGBA values + uint8_t temp1 = (each.id + 15) * 11231; + uint8_t temp2 = (each.id + 24) * 32461231; + uint8_t temp3 = (each.id + 523) * 72321231; + uint8_t temp4 = (each.id + 52) * 321231; + buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; + } + buffer.id = each.id; + buffer.buffer_info = buffer_info; + test_buffers.emplace(test_buffers.begin(), buffer); + DBG_COMPLETE_BUFFERS(buffer.id, buffer.buffer_info); + } + previous_textures.resize(kNumSubmission); + previous_textures.clear(); + for (int i = 0; i < kNumSubmission; i++) { + int id = i; + buffer.id = id; + DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); + buffer.buffer_info = buffer_info; + previous_textures.emplace(previous_textures.end() - i, buffer); + } + + GetFrameData(); + + EXPECT_EQ(counter_, frame_idx); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(window_x_, 256); + EXPECT_EQ(draw_calls_.size(), static_cast<size_t>(kNumSubmission)); + + if (frame_idx == 0) { + EXPECT_EQ(sources_.size(), 1u); + EXPECT_EQ(sources_[0].func, "TestBody"); + EXPECT_EQ(sources_[0].file, __FILE__); + EXPECT_EQ(sources_[0].anno, kAnnoRect); + EXPECT_EQ(buffers_.size(), static_cast<size_t>(0)); + } else { + // After the first frame there are no new sources in the loop + EXPECT_EQ(sources_.size(), 0u); + EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); + for (int i = 0; i < kNumSubmission; i++) { + EXPECT_EQ(draw_calls_[i].buff_id, i + 8); + EXPECT_EQ(buffers_[i].buffer_info.width, + test_buffers[i].buffer_info.width); + EXPECT_EQ(buffers_[i].buffer_info.height, + test_buffers[i].buffer_info.height); + for (int j = 0; + j < buffers_[i].buffer_info.width * buffers_[i].buffer_info.height; + j++) { + EXPECT_EQ( + static_cast<int>(buffers_[i].buffer_info.buffer[j].color_r), + static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_r)); + EXPECT_EQ( + static_cast<int>(buffers_[i].buffer_info.buffer[j].color_g), + static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_g)); + EXPECT_EQ( + static_cast<int>(buffers_[i].buffer_info.buffer[j].color_b), + static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_b)); + EXPECT_EQ( + static_cast<int>(buffers_[i].buffer_info.buffer[j].color_a), + static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_a)); + } + } + } + } +} + +} // namespace +} // namespace viz +#else // VIZ_DEBUGGER_IS_ON() + +class VisualDebuggerTest : public testing::Test {}; + +DBG_FLAG_FBOOL("unit.test.fake.anno", flag_default_value_check) + +TEST_F(VisualDebuggerTest, TestDebugFlagAnnoAndFunction) { + // Visual debugger is disabled at build level this check should always return + // false. + EXPECT_FALSE(viz::VizDebugger::GetInstance()->IsEnabled()); + // The default value for a bool flag when the visual debugger is disabled is + // false. + EXPECT_FALSE(flag_default_value_check()); +} + +// For optimization purposes the flag fbool values return false as a constexpr. +// This allows the compiler to constant propagate and remove unused codepaths. +static_assert(flag_default_value_check() == false, + "Default value when debugger is disabled is false."); + +#endif
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.cc b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.cc deleted file mode 100644 index 62572ffc..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.cc +++ /dev/null
@@ -1,94 +0,0 @@ -// 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/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h" - -#if VIZ_DEBUGGER_IS_ON() - -namespace viz { - -void VizDebuggerInternal::ForceEnabled() { - enabled_ = true; -} - -std::vector<VizDebuggerInternal::DrawCall> -VizDebuggerInternal::GetDrawRectCalls() { - return draw_rect_calls_; -} - -std::vector<VizDebuggerInternal::DrawTextCall> -VizDebuggerInternal::GetDrawTextCalls() { - return draw_text_calls_; -} - -std::vector<VizDebuggerInternal::LogCall> VizDebuggerInternal::GetLogs() { - return logs_; -} - -int VizDebuggerInternal::GetSourceCount() { - return static_cast<int>(sources_.size()); -} - -int VizDebuggerInternal::GetSubmissionCount() { - return submission_count_; -} - -int VizDebuggerInternal::GetRectCallsTailIdx() { - return draw_rect_calls_tail_idx_; -} - -int VizDebuggerInternal::GetTextCallsTailIdx() { - return draw_text_calls_tail_idx_; -} - -int VizDebuggerInternal::GetLogsTailIdx() { - return logs_tail_idx_; -} - -int VizDebuggerInternal::GetRectCallsSize() { - return draw_rect_calls_.size(); -} - -int VizDebuggerInternal::GetTextCallsSize() { - return draw_text_calls_.size(); -} - -int VizDebuggerInternal::GetLogsSize() { - return logs_.size(); -} - -rwlock::RWLock* VizDebuggerInternal::GetRWLock() { - return &read_write_lock_; -} - -void VizDebuggerInternal::SetBufferCapacities(uint32_t bufferSize) { - draw_rect_calls_.resize(bufferSize); - draw_text_calls_.resize(bufferSize); - logs_.resize(bufferSize); - sources_.reserve(bufferSize); -} - -bool VizDebuggerInternal::Reset() { - submission_count_ = 0; - buffer_id = 0; - draw_rect_calls_.clear(); - draw_text_calls_.clear(); - logs_.clear(); - buffers_.clear(); - - draw_rect_calls_.resize(kDefaultBufferSize); - draw_text_calls_.resize(kDefaultBufferSize); - logs_.resize(kDefaultBufferSize); - - last_sent_source_count_ = 0; - sources_.clear(); - // Reset index counters for each buffer. - draw_rect_calls_tail_idx_ = 0; - draw_text_calls_tail_idx_ = 0; - logs_tail_idx_ = 0; - return true; -} -} // namespace viz - -#endif // VIZ_DEBUGGER_IS_ON()
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h deleted file mode 100644 index 4088654d..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h +++ /dev/null
@@ -1,67 +0,0 @@ -// 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_VIZ_SERVICE_DEBUGGER_VIZ_DEBUGGER_UNITTESTS_VIZ_DEBUGGER_INTERNAL_H_ -#define COMPONENTS_VIZ_SERVICE_DEBUGGER_VIZ_DEBUGGER_UNITTESTS_VIZ_DEBUGGER_INTERNAL_H_ - -#include <stddef.h> - -#include <cstdint> -#include <cstdio> -#include <unordered_map> -#include <utility> -#include <vector> - -#include "components/viz/service/debugger/viz_debugger.h" - -#if BUILDFLAG(USE_VIZ_DEBUGGER) - -namespace viz { - -// The VizDebuggerInternal class is used for creating a -// VizDebugger instance for VizDebugger unit tests. -class VizDebuggerInternal : public VizDebugger { - public: - VizDebuggerInternal(); - ~VizDebuggerInternal(); - void ForceEnabled(); - int GetSubmissionCount(); - void SetBufferCapacities(uint32_t bufferSize); - // Resets and clears all the VizDebugger instance variables - // and vectors. - bool Reset(); - - // Returns copies of corresponding buffers/vectors in the - // VizDebugger instance. - std::vector<DrawCall> GetDrawRectCalls(); - std::vector<DrawTextCall> GetDrawTextCalls(); - std::vector<LogCall> GetLogs(); - - // These functions return the tail index of each type of buffers. - int GetRectCallsTailIdx(); - int GetTextCallsTailIdx(); - int GetLogsTailIdx(); - - // These functions get the size of each buffer. - int GetRectCallsSize(); - int GetTextCallsSize(); - int GetLogsSize(); - - // This function returns a pointer to the Read-Write lock used - // for VizDebugger's thread-safety. - rwlock::RWLock* GetRWLock(); - - int GetSourceCount(); - - using VizDebugger::CallSubmitCommon; - using VizDebugger::DrawCall; - using VizDebugger::DrawTextCall; - using VizDebugger::FrameAsJson; - using VizDebugger::LogCall; - using VizDebugger::UpdateFilters; -}; -} // namespace viz - -#endif // BUILDFLAG(USE_VIZ_DEBUGGER) -#endif
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_multithread_unittest.cc b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_multithread_unittest.cc deleted file mode 100644 index a1792b8..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_multithread_unittest.cc +++ /dev/null
@@ -1,483 +0,0 @@ -// 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 <stddef.h> - -#include <cstdint> -#include <cstdio> -#include <unordered_map> -#include <utility> -#include <vector> - -#include "base/strings/string_number_conversions.h" -#include "base/strings/stringprintf.h" -#include "base/threading/platform_thread.h" -#include "components/viz/service/debugger/viz_debugger.h" -#include "components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h" -#include "components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "ui/gfx/geometry/vector2d_f.h" - -#if VIZ_DEBUGGER_IS_ON() -using testing::_; -using testing::Mock; - -namespace viz { - -namespace { - -class VizDebuggerMultithreadTest : public VisualDebuggerTestBase {}; - -static_assert(sizeof(VizDebuggerInternal) == sizeof(VizDebugger), - "This test code exposes the internals of |VizDebugger| via an " - "upcast; thus they must be the same size."); - -enum class VizDebugCommandType { - kDbgDrawRectCommand, - kDbgDrawTextCommand, - kDbgLogCommand -}; - -// Data structure to hold pre-determined commands for unit test. -struct DbgTestConfig { - std::vector<std::vector<VizDebugCommandType>> dbg_commands; -}; - -struct DbgCommandIdentifier { - int dbg_command_thread_id; - int dbg_command_id; - int dbg_command_frame_id; -}; - -// Reader thread. -class ReaderTestThread : public base::PlatformThread::Delegate { - public: - ReaderTestThread() = default; - - ReaderTestThread(const ReaderTestThread&) = delete; - ReaderTestThread& operator=(const ReaderTestThread&) = delete; - - // Index variables to keep track of which debug command calls are being - // checked in each called debug command cache. - int rect_command_idx = 0; - int text_command_idx = 0; - int log_command_idx = 0; - - // Identification pairs consisting of debug command ID and type of command. - std::vector<std::vector<DbgCommandIdentifier>> draw_rect_command_history; - std::vector<std::vector<DbgCommandIdentifier>> draw_text_command_history; - std::vector<std::vector<DbgCommandIdentifier>> log_command_history; - - // Initialize debug commands before threads run. - void Init(DbgTestConfig& config, uint32_t num_frames, uint32_t spin_amount) { - thread_test_config_ = config; - num_frames_ = num_frames; - spin_amount_ = spin_amount; - } - - void ThreadMain() override { - thread_id_ = base::PlatformThread::CurrentId(); - draw_rect_command_history.resize(num_frames_); - draw_text_command_history.resize(num_frames_); - log_command_history.resize(num_frames_); - for (int i = 0; - static_cast<uint32_t>(i) < thread_test_config_.dbg_commands[0].size(); - ++i) { - // Spin to allow writer to jump in once in a while. - for (uint32_t _ = 0; _ < spin_amount_; ++_) { - ++spin_inc_var_; - } - // The position of the rect is used as a unique identifier - // for draw rect and text command calls for cross-checking later. - // The x-position represents the thread ID and the - // y-position represents the debug command ID per thread. - // gfx::Rect(int x, int y, int width, int height) - const gfx::Rect testRect = gfx::Rect(thread_id_, i, 12, 34); - if (thread_test_config_.dbg_commands[0][i] == - VizDebugCommandType::kDbgDrawRectCommand) { - DBG_DRAW_RECT("multithread rect", testRect); - draw_rect_command_history[0].push_back({thread_id_, i}); - } else if (thread_test_config_.dbg_commands[0][i] == - VizDebugCommandType::kDbgDrawTextCommand) { - DBG_DRAW_TEXT("multithread anno", testRect.origin(), "text"); - draw_text_command_history[0].push_back({thread_id_, i}); - // The log string/message is used as a unique identifier for - // each log command called for cross-checking later. - // The format for unique identifier is as such: - // [THREAD ID]-[COMMAND ID]. - } else { // kDbgLogCommand case - DBG_LOG("multithread log", "%d-%d", thread_id_, i); - log_command_history[0].push_back({thread_id_, i}); - } - } - } - - private: - DbgTestConfig thread_test_config_; - int thread_id_; - uint32_t num_frames_; - uint32_t spin_amount_; - std::atomic<int> spin_inc_var_ = 0; -}; - -// Writer thread. -class WriterTestThread : public base::PlatformThread::Delegate { - public: - WriterTestThread() = default; - - WriterTestThread(const WriterTestThread&) = delete; - WriterTestThread& operator=(const WriterTestThread&) = delete; - - // Initialize parameters before threads run. - void Init(VizDebuggerMultithreadTest* test_fixture_ptr, - uint32_t num_writer_tries, - uint32_t spin_amount) { - spin_amount_ = spin_amount; - test_fixture_ptr_ = test_fixture_ptr; - num_writer_tries_ = num_writer_tries; - } - - void ThreadMain() override { - for (uint32_t _ = 0; _ < num_writer_tries_; ++_) { - // Spin to add delays before writer tries again. - for (uint32_t _ = 0; _ < spin_amount_; ++_) { - ++spin_inc_var_; - } - test_fixture_ptr_->GetFrameData(false); - } - } - - private: - uint32_t spin_amount_; - std::atomic<int> spin_inc_var_ = 0; - VizDebuggerMultithreadTest* test_fixture_ptr_; - uint32_t num_writer_tries_; -}; - -// Tests k-number of READ operations from k different threads. -TEST_F(VizDebuggerMultithreadTest, kReadersTest) { - static const unsigned kNumReaderThreads = 3; - - ReaderTestThread threads[kNumReaderThreads]; - base::PlatformThreadHandle handles[kNumReaderThreads]; - - SetFilter({TestFilter("")}); - // Enable viz debugger - GetInternal()->ForceEnabled(); - - DbgTestConfig test_config; - - static const unsigned kNumDrawRectCommandsPerFrame = 64; - static const unsigned kNumDrawTextCommandsPerFrame = 64; - static const unsigned kNumLogCommandsPerFrame = 64; - uint32_t kNumCommandsPerFrame = kNumDrawRectCommandsPerFrame + - kNumDrawTextCommandsPerFrame + - kNumLogCommandsPerFrame; - - // pre-process test commands vector - test_config.dbg_commands.resize(1); - test_config.dbg_commands[0].reserve(kNumCommandsPerFrame); - - for (uint32_t i = 0; i < kNumDrawRectCommandsPerFrame; ++i) { - test_config.dbg_commands[0].push_back( - VizDebugCommandType::kDbgDrawRectCommand); - } - for (uint32_t i = 0; i < kNumDrawTextCommandsPerFrame; ++i) { - test_config.dbg_commands[0].push_back( - VizDebugCommandType::kDbgDrawTextCommand); - } - for (uint32_t i = 0; i < kNumLogCommandsPerFrame; ++i) { - test_config.dbg_commands[0].push_back(VizDebugCommandType::kDbgLogCommand); - } - - // Initialize each thread and start thread - for (uint32_t i = 0; i < kNumReaderThreads; ++i) { - threads[i].Init(test_config, 1, 0); - } - for (uint32_t i = 0; i < kNumReaderThreads; ++i) { - ASSERT_TRUE(base::PlatformThread::Create(0, &threads[i], &handles[i])); - } - - // Collect all threads - for (auto& handle : handles) { - base::PlatformThread::Join(handle); - } - - int expected_submission_count = kNumCommandsPerFrame * kNumReaderThreads; - - EXPECT_EQ(GetInternal()->GetSubmissionCount(), expected_submission_count); - - std::vector<VizDebuggerInternal::DrawCall> rect_calls_result = - GetInternal()->GetDrawRectCalls(); - std::vector<VizDebuggerInternal::DrawTextCall> text_calls_result = - GetInternal()->GetDrawTextCalls(); - std::vector<VizDebuggerInternal::LogCall> logs_result = - GetInternal()->GetLogs(); - - size_t const kNumDrawCallSubmission = static_cast<size_t>(std::min( - GetInternal()->GetRectCallsTailIdx(), GetInternal()->GetRectCallsSize())); - size_t const kNumTextCallSubmission = static_cast<size_t>(std::min( - GetInternal()->GetTextCallsTailIdx(), GetInternal()->GetTextCallsSize())); - size_t const kNumLogSubmission = static_cast<size_t>( - std::min(GetInternal()->GetLogsTailIdx(), GetInternal()->GetLogsSize())); - - bool valid_command_found; - - // Final cross-checking for draw rect calls. - for (size_t i = 0; i < kNumDrawCallSubmission; ++i) { - valid_command_found = false; - for (auto&& thread : threads) { - // If debug calls from a thread is exhausted, skip this thread. - if (static_cast<uint32_t>(thread.rect_command_idx) >= - thread.draw_rect_command_history[0].size()) { - continue; - } - DbgCommandIdentifier cur_thread_command_identifier = - thread.draw_rect_command_history[0][thread.rect_command_idx]; - - // Check if debug command ID matches. Refer to ReaderTestThread's - // ThreadMain() function to see how command ID's are formatted. - if (rect_calls_result[i].pos.x() == - cur_thread_command_identifier.dbg_command_thread_id && - rect_calls_result[i].pos.y() == - cur_thread_command_identifier.dbg_command_id) { - valid_command_found = true; - ++thread.rect_command_idx; - break; - } - } - EXPECT_TRUE(valid_command_found); - } - - // Final cross-checking for draw text calls. - for (size_t i = 0; i < kNumTextCallSubmission; ++i) { - valid_command_found = false; - for (auto&& thread : threads) { - // If debug calls from a thread is exhausted, skip this thread. - if (static_cast<uint32_t>(thread.text_command_idx) >= - thread.draw_text_command_history[0].size()) { - continue; - } - DbgCommandIdentifier cur_thread_command_identifier = - thread.draw_text_command_history[0][thread.text_command_idx]; - - // Check if debug command ID matches. Refer to ReaderTestThread's - // ThreadMain() function to see how command ID's are formatted. - if (text_calls_result[i].pos.x() == - cur_thread_command_identifier.dbg_command_thread_id && - text_calls_result[i].pos.y() == - cur_thread_command_identifier.dbg_command_id) { - valid_command_found = true; - ++thread.text_command_idx; - break; - } - } - EXPECT_TRUE(valid_command_found); - } - - // Final cross-checking for logs. - for (size_t i = 0; i < kNumLogSubmission; ++i) { - valid_command_found = false; - for (auto&& thread : threads) { - // If debug calls from a thread is exhausted, skip this thread. - if (static_cast<uint32_t>(thread.log_command_idx) >= - thread.log_command_history[0].size()) { - continue; - } - DbgCommandIdentifier cur_thread_command_identifier = - thread.log_command_history[0][thread.log_command_idx]; - - // Extract debug command identifier information from log result. - // Information is being extracted froma string below. Refer to - // ReaderTestThread's ThreadMain() function to see how command ID's - // are formatted. - std::string log_result_identifier = logs_result[i].value; - int log_split_position = log_result_identifier.find("-"); - int log_thread_id; - int log_command_id; - base::StringToInt(log_result_identifier.substr(0, log_split_position), - &log_thread_id); - base::StringToInt(log_result_identifier.substr(log_split_position + 1), - &log_command_id); - - // Check if debug command ID matches. - if (log_thread_id == - cur_thread_command_identifier.dbg_command_thread_id && - log_command_id == cur_thread_command_identifier.dbg_command_id) { - valid_command_found = true; - ++thread.log_command_idx; - break; - } - } - EXPECT_TRUE(valid_command_found); - } -} - -TEST_F(VizDebuggerMultithreadTest, kReadersOneWriterCommandsSequenceTest) { - // Number of Reader Threads - static const unsigned kNumReaderThreads = 3; - // Number of times writer thread tries to run - static const unsigned kNumWriterTries = 20; - // Number of DBG calls per frame for each type - static const unsigned kNumDrawRectCommandsPerFrame = 64; - static const unsigned kNumDrawTextCommandsPerFrame = 64; - static const unsigned kNumLogCommandsPerFrame = 64; - // Amount of spin delay for each type of thread - static const unsigned kWriterSpinAmount = 900; - static const unsigned kReaderSpinAmount = 100; - - WriterTestThread writer_thread; - base::PlatformThreadHandle writer_thread_handle; - ReaderTestThread reader_threads[kNumReaderThreads]; - base::PlatformThreadHandle reader_thread_handles[kNumReaderThreads]; - - SetFilter({TestFilter("")}); - // Enable viz debugger - GetInternal()->ForceEnabled(); - - DbgTestConfig test_config; - - uint32_t kNumCommandsPerFrame = kNumDrawRectCommandsPerFrame + - kNumDrawTextCommandsPerFrame + - kNumLogCommandsPerFrame; - - // Pre-process test commands vector. - test_config.dbg_commands.resize(1); - test_config.dbg_commands[0].reserve(kNumCommandsPerFrame); - - // Populate test commands vectors with enums representing command types. - for (uint32_t i = 0; i < kNumDrawRectCommandsPerFrame; ++i) { - test_config.dbg_commands[0].push_back( - VizDebugCommandType::kDbgDrawRectCommand); - } - for (uint32_t i = 0; i < kNumDrawTextCommandsPerFrame; ++i) { - test_config.dbg_commands[0].push_back( - VizDebugCommandType::kDbgDrawTextCommand); - } - for (uint32_t i = 0; i < kNumLogCommandsPerFrame; ++i) { - test_config.dbg_commands[0].push_back(VizDebugCommandType::kDbgLogCommand); - } - - // Initialize and start each thread. Each thread will start making VizDebugger - // debug calls simultaneously upon starting. - for (uint32_t i = 0; i < kNumReaderThreads; ++i) { - reader_threads[i].Init(test_config, 1, kReaderSpinAmount); - } - for (uint32_t i = 0; i < kNumReaderThreads; ++i) { - ASSERT_TRUE(base::PlatformThread::Create(0, &reader_threads[i], - &reader_thread_handles[i])); - } - writer_thread.Init(this, kNumWriterTries, kWriterSpinAmount); - ASSERT_TRUE( - base::PlatformThread::Create(0, &writer_thread, &writer_thread_handle)); - - // Collect all threads. - base::PlatformThread::Join(writer_thread_handle); - for (auto& reader_thread_handle : reader_thread_handles) { - base::PlatformThread::Join(reader_thread_handle); - } - - // One last call to GetFrameData() to collect any remaining calls not yet - // added to the debug calls cache. - GetFrameData(false); - int expected_submission_count = kNumCommandsPerFrame * kNumReaderThreads; - int calls_cache_total_size = draw_rect_calls_cache_.size() + - draw_text_calls_cache_.size() + - log_calls_cache_.size(); - EXPECT_EQ(calls_cache_total_size, expected_submission_count); - - bool valid_command_found; - - // Final cross-checking for draw rect calls. - for (auto&& rect_call : draw_rect_calls_cache_) { - valid_command_found = false; - for (auto&& thread : reader_threads) { - // If debug calls from a thread is exhausted, skip this thread. - if (static_cast<uint32_t>(thread.rect_command_idx) >= - thread.draw_rect_command_history[0].size()) { - continue; - } - DbgCommandIdentifier cur_thread_command_identifier = - thread.draw_rect_command_history[0][thread.rect_command_idx]; - - // Check if debug command ID matches. Refer to ReaderTestThread's - // ThreadMain() function to see how command ID's are formatted. - if (rect_call.pos.x() == - cur_thread_command_identifier.dbg_command_thread_id && - rect_call.pos.y() == cur_thread_command_identifier.dbg_command_id) { - valid_command_found = true; - ++thread.rect_command_idx; - break; - } - } - EXPECT_TRUE(valid_command_found); - } - - // Final cross-checking for draw text calls. - for (auto&& text_call : draw_text_calls_cache_) { - valid_command_found = false; - for (auto&& thread : reader_threads) { - // If debug calls from a thread is exhausted, skip this thread. - if (static_cast<uint32_t>(thread.text_command_idx) >= - thread.draw_text_command_history[0].size()) { - continue; - } - DbgCommandIdentifier cur_thread_command_identifier = - thread.draw_text_command_history[0][thread.text_command_idx]; - - // Check if debug command ID matches. Refer to ReaderTestThread's - // ThreadMain() function to see how command ID's are formatted. - if (text_call.pos.x() == - cur_thread_command_identifier.dbg_command_thread_id && - text_call.pos.y() == cur_thread_command_identifier.dbg_command_id) { - valid_command_found = true; - ++thread.text_command_idx; - break; - } - } - EXPECT_TRUE(valid_command_found); - } - - // Final cross-checking for logs. - for (auto&& log_call : log_calls_cache_) { - valid_command_found = false; - for (auto&& thread : reader_threads) { - // If debug calls from a thread is exhausted, skip this thread. - if (static_cast<uint32_t>(thread.log_command_idx) >= - thread.log_command_history[0].size()) { - continue; - } - DbgCommandIdentifier cur_thread_command_identifier = - thread.log_command_history[0][thread.log_command_idx]; - - // Extract debug command identifier information from log result. - // Information is being extracted from a string below. Refer to - // ReaderTestThread's ThreadMain() function to see how command ID's - // are formatted. - std::string log_result_identifier = log_call.value; - int log_split_position = log_result_identifier.find("-"); - int log_thread_id; - int log_command_id; - base::StringToInt(log_result_identifier.substr(0, log_split_position), - &log_thread_id); - base::StringToInt(log_result_identifier.substr(log_split_position + 1), - &log_command_id); - - // Check if debug command ID matches. - if (log_thread_id == - cur_thread_command_identifier.dbg_command_thread_id && - log_command_id == cur_thread_command_identifier.dbg_command_id) { - valid_command_found = true; - ++thread.log_command_idx; - break; - } - } - EXPECT_TRUE(valid_command_found); - } -} -} // namespace -} // namespace viz - -#endif // VIZ_DEBUGGER_IS_ON()
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_rwlock_unittest.cc b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_rwlock_unittest.cc deleted file mode 100644 index ae45bb9..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_rwlock_unittest.cc +++ /dev/null
@@ -1,143 +0,0 @@ -// 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 "base/threading/platform_thread.h" -#include "components/viz/service/debugger/rwlock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace { -// Shared global variables -int writer_count = 0; -static const unsigned kNumCounts = 1000000; - -class RWLockTest : public testing::Test { - private: - public: - static rwlock::RWLock test_rwlock; -}; - -rwlock::RWLock RWLockTest::test_rwlock; - -// The writer thread reads through the entire vector at a certain -// state left by the readers, sums up all the existing integer -// values, stores it, and resets the vector to provide a blank -// slate for the reader threads to continue working on. -class WriterThread : public base::PlatformThread::Delegate { - private: - std::vector<int>* array_; - int size_; - volatile int delay_counter = 0; - static const unsigned kNumWriterTries = 100; - static const unsigned kNumTimeDelay = 500000; - - public: - WriterThread() = default; - - void ThreadMain() override { - for (uint32_t _ = 0; _ < kNumWriterTries; ++_) { - RWLockTest::test_rwlock.WriteLock(); - - for (int i = 0; i < size_; ++i) { - writer_count += (*array_)[i]; - (*array_)[i] = 0; - } - // Reset the shared vector. - (*array_).clear(); - (*array_).resize(size_); - - RWLockTest::test_rwlock.WriteUnLock(); - - // Time delay so that the writer thread does not - // "burn out" too fast. - for (uint32_t _ = 0; _ < kNumTimeDelay; ++_) { - ++delay_counter; - } - } - } - - void Init(std::vector<int>* array, int size) { - array_ = array; - size_ = size; - } -}; - -// Each reader thread has a corresponding slot within the shared -// vector. Within each slot, each reader thread increments the slot's -// integer value by 1 for k number (kNumCounts) of iterations. -// Within each iteration, there is a small time buffer/delay (kNumTimeDelay) -// to allow the writer thread to squeeze and take the lock. -class ReaderThread : public base::PlatformThread::Delegate { - private: - static const unsigned kNumTimeDelay = 100; - volatile int delay_counter = 0; - std::vector<int>* array_; - int array_index; - - public: - ReaderThread() = default; - - ReaderThread(const ReaderThread&) = delete; - ReaderThread& operator=(const ReaderThread&) = delete; - - void ThreadMain() override { - for (uint32_t _ = 0; _ < kNumCounts; ++_) { - RWLockTest::test_rwlock.ReadLock(); - ++(*array_)[array_index]; - RWLockTest::test_rwlock.ReadUnlock(); - - // Time buffer/delay element for writer to squeeze in - for (uint32_t _ = 0; _ < kNumTimeDelay; ++_) { - delay_counter++; - } - } - } - - void Init(std::vector<int>* array, int index) { - array_ = array; - array_index = index; - } -}; - -TEST_F(RWLockTest, ReadWrite) { - static const unsigned kNumReaders = 4; - WriterThread writer; - ReaderThread readers[kNumReaders]; - base::PlatformThreadHandle handles[kNumReaders]; - - std::vector<int> arr(kNumReaders); - - // Initialize and start each reader thread. - for (uint32_t i = 0; i < kNumReaders; ++i) { - readers[i].Init(&arr, i); - } - for (uint32_t i = 0; i < kNumReaders; ++i) { - ASSERT_TRUE(base::PlatformThread::Create(0, &readers[i], &handles[i])); - } - - // Initialize and start writer thread. - writer.Init(&arr, kNumReaders); - base::PlatformThreadHandle writer_handle; - ASSERT_TRUE(base::PlatformThread::Create(0, &writer, &writer_handle)); - - // Collect all reader threads. - for (auto& handle : handles) { - base::PlatformThread::Join(handle); - } - - // Collect writer thread. - base::PlatformThread::Join(writer_handle); - - int total_sum = 0; - - // Add number counted by the remainder of reader threads. - for (uint32_t i = 0; i < kNumReaders; ++i) { - total_sum += arr[i]; - } - - // Add number counted by writer thread. - total_sum += writer_count; - - EXPECT_EQ(static_cast<uint32_t>(total_sum), kNumReaders * kNumCounts); -} -} // namespace
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest.cc b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest.cc deleted file mode 100644 index d56c98bf..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest.cc +++ /dev/null
@@ -1,536 +0,0 @@ -// Copyright 2014 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 <stddef.h> - -#include <cstdio> -#include <unordered_map> -#include <utility> -#include <vector> - -#include "base/strings/stringprintf.h" -#include "components/viz/service/debugger/viz_debugger.h" -#include "components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h" -#include "components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "ui/gfx/geometry/vector2d_f.h" - -#if VIZ_DEBUGGER_IS_ON() -using testing::_; -using testing::Mock; - -namespace viz { - -namespace { - -static_assert(sizeof(VizDebuggerInternal) == sizeof(VizDebugger), - "This test code exposes the internals of |VizDebugger| via an " - "upcast; thus they must be the same size."); - -class VisualDebuggerTest : public VisualDebuggerTestBase {}; - -TEST_F(VisualDebuggerTest, GeneralDrawSubmission) { - const char kAnnoRect[] = "annorect"; - const char kAnnoText[] = "annotext"; - const char kAnnoLog[] = "annolog"; - const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); - static const int kNumFrames = 4; - GetInternal()->ForceEnabled(); - for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { - SetFilter({TestFilter("")}); - - static const int kNumSubmission = 8; - for (int i = 0; i < kNumSubmission; i++) { - DBG_DRAW_RECT(kAnnoRect, kTestRect); - DBG_DRAW_TEXT(kAnnoText, kTestRect.origin(), - base::StringPrintf("Text %d", i)); - DBG_LOG(kAnnoLog, "%d", i); - } - - GetFrameData(true); - EXPECT_EQ(counter_, frame_idx); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(static_cast<int>(draw_rect_calls_cache_.size()), kNumSubmission); - EXPECT_EQ(static_cast<int>(log_calls_cache_.size()), kNumSubmission); - EXPECT_EQ(static_cast<int>(draw_text_calls_cache_.size()), kNumSubmission); - - if (frame_idx == 0) { - EXPECT_EQ(sources_cache_.size(), 3u); - EXPECT_EQ(sources_cache_[0].func, "TestBody"); - EXPECT_EQ(sources_cache_[0].file, __FILE__); - EXPECT_EQ(sources_cache_[0].anno, kAnnoRect); - EXPECT_EQ(sources_cache_[1].func, "TestBody"); - EXPECT_EQ(sources_cache_[1].file, __FILE__); - EXPECT_EQ(sources_cache_[1].anno, kAnnoText); - EXPECT_EQ(sources_cache_[2].func, "TestBody"); - EXPECT_EQ(sources_cache_[2].file, __FILE__); - EXPECT_EQ(sources_cache_[2].anno, kAnnoLog); - } else { - // After the first frame there are no new sources in the loop. - EXPECT_EQ(sources_cache_.size(), 0u); - } - - for (int i = 0; i < kNumSubmission; i++) { - EXPECT_EQ(draw_rect_calls_cache_[i].pos, - gfx::Vector2dF(kTestRect.origin().x(), kTestRect.origin().y())); - EXPECT_EQ(draw_rect_calls_cache_[i].obj_size, kTestRect.size()); - EXPECT_EQ(draw_rect_calls_cache_[i].source_index, 0); - EXPECT_EQ(draw_rect_calls_cache_[i].draw_index, i * 3); - - EXPECT_EQ(draw_text_calls_cache_[i].pos, - gfx::Vector2dF(kTestRect.origin().x(), kTestRect.origin().y())); - EXPECT_EQ(draw_text_calls_cache_[i].source_index, 1); - EXPECT_EQ(draw_text_calls_cache_[i].draw_index, i * 3 + 1); - EXPECT_EQ(draw_text_calls_cache_[i].text, - base::StringPrintf("Text %d", i)); - - EXPECT_EQ(log_calls_cache_[i].value, base::StringPrintf("%d", i)); - EXPECT_EQ(log_calls_cache_[i].source_index, 2); - EXPECT_EQ(log_calls_cache_[i].draw_index, i * 3 + 2); - } - } -} - -static void FunctionNameTest(const char* anno_rect, gfx::Rect rect) { - DBG_DRAW_RECT(anno_rect, rect); -} - -TEST_F(VisualDebuggerTest, FilterDrawSubmission) { - const char kAnnoRect[] = "annorect"; - const char kAnnoMissing[] = "testmissing"; - const char kAnnoMatch[] = "before_annorect_after"; - - GetInternal()->ForceEnabled(); - const gfx::Rect kTestRect = gfx::Rect(10, 30, 50, 70); - const gfx::Rect kMissingRect = gfx::Rect(11, 33, 55, 77); - std::vector<int> valid_indices; - SetFilter({TestFilter("annorect")}); - valid_indices.push_back(GetInternal()->GetSourceCount()); - FunctionNameTest(kAnnoRect, kTestRect); - valid_indices.push_back(GetInternal()->GetSourceCount()); - DBG_DRAW_RECT(kAnnoRect, kTestRect); - DBG_DRAW_RECT(kAnnoMissing, kMissingRect); - valid_indices.push_back(GetInternal()->GetSourceCount()); - DBG_DRAW_RECT(kAnnoMatch, kTestRect); - - SetFilter({TestFilter("", "FunctionNameTest")}); - DBG_DRAW_RECT(kAnnoRect, kMissingRect); - valid_indices.push_back(0); - FunctionNameTest(kAnnoRect, kTestRect); - - SetFilter({TestFilter("", "TestBody")}); - FunctionNameTest(kAnnoRect, kMissingRect); - valid_indices.push_back(GetInternal()->GetSourceCount()); - DBG_DRAW_RECT(kAnnoRect, kTestRect); - - SetFilter({TestFilter("", "", "no_file")}); - DBG_DRAW_RECT(kAnnoRect, kMissingRect); - - SetFilter({TestFilter("", "", __FILE__)}); - valid_indices.push_back(GetInternal()->GetSourceCount()); - DBG_DRAW_RECT(kAnnoRect, kTestRect); - - size_t const kNumDrawCalls = GetInternal()->GetRectCallsTailIdx(); - GetFrameData(true); - - EXPECT_EQ(sources_cache_[0].func, "FunctionNameTest"); - EXPECT_EQ(sources_cache_[0].file, __FILE__); - EXPECT_EQ(sources_cache_[0].anno, kAnnoRect); - EXPECT_EQ(sources_cache_[1].func, "TestBody"); - EXPECT_EQ(sources_cache_[1].file, __FILE__); - EXPECT_EQ(sources_cache_[1].anno, kAnnoRect); - EXPECT_EQ(sources_cache_[2].anno, kAnnoMissing); - EXPECT_EQ(sources_cache_[3].anno, kAnnoMatch); - - auto check_draw = [](const VizDebuggerInternal::DrawCall& draw_call, - const gfx::Rect& rect, int src_idx, int draw_idx) { - EXPECT_EQ(draw_call.pos, - gfx::Vector2dF(rect.origin().x(), rect.origin().y())); - EXPECT_EQ(draw_call.obj_size, rect.size()); - EXPECT_EQ(draw_call.source_index, src_idx); - EXPECT_EQ(draw_call.draw_index, draw_idx); - }; - // Makes sure all valid indices are here and have the correct rect. - for (size_t i = 0; i < kNumDrawCalls; i++) { - check_draw(draw_rect_calls_cache_[i], kTestRect, valid_indices[i], i); - } -} - -constexpr const char kTestFlagFunctionAnnoName[] = "testflagfunctionanno"; - -DBG_FLAG_FBOOL(kTestFlagFunctionAnnoName, check_flag_enabled) - -static bool FlagFunctionTestEnable() { - return check_flag_enabled(); -} - -TEST_F(VisualDebuggerTest, TestDebugFlagAnnoAndFunction) { - GetInternal()->ForceEnabled(); - - // Set our test flag to be disabled. - SetFilter({TestFilter(kTestFlagFunctionAnnoName, "", "", true, false)}); - EXPECT_FALSE(FlagFunctionTestEnable()); - SetFilter({TestFilter(kTestFlagFunctionAnnoName, "", "", true, true)}); - EXPECT_TRUE(FlagFunctionTestEnable()); - SetFilter({TestFilter(kTestFlagFunctionAnnoName, "", "", true, false)}); - EXPECT_FALSE(FlagFunctionTestEnable()); -} - -// This tests makes sure that expensive string logging has no cost unless it is -// actively being filtered. -TEST_F(VisualDebuggerTest, NonFilterActiveNoCost) { - GetInternal()->ForceEnabled(); - const char* kStrA = "anno_A"; - const char* kStrB = "anno_B"; - // These integers are mutated on a function invocation. - int count_a = 0; - int count_b = 0; - - auto get_a_string = [&count_a, &kStrA]() { - count_a++; - return std::string(kStrA); - }; - auto get_b_string = [&count_b, &kStrB]() { - count_b++; - return std::string(kStrB); - }; - - // Filter on "anno_A" which should call 'get_a_string'. - SetFilter({TestFilter(kStrA)}); - DBG_DRAW_TEXT(kStrA, gfx::Point(), get_a_string()); - DBG_DRAW_TEXT(kStrB, gfx::Point(), get_b_string()); - EXPECT_EQ(1, count_a); - EXPECT_EQ(0, count_b); - - // Filter on "anno_B" which should call 'get_b_string'. - SetFilter({TestFilter(kStrB)}); - DBG_DRAW_TEXT(kStrA, gfx::Point(), get_a_string()); - DBG_DRAW_TEXT(kStrB, gfx::Point(), get_b_string()); - EXPECT_EQ(1, count_a); - EXPECT_EQ(1, count_b); -} - -// This tests passing a single buffer synchronously into the visual debuggeer -TEST_F(VisualDebuggerTest, SingleBufferSync) { - const char kAnnoRect[] = "annorect"; - const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); - static const int kNumFrames = 1; - GetInternal()->ForceEnabled(); - VizDebuggerInternal::BufferInfo buffer_info; - buffer_info.width = 4; - buffer_info.height = 4; - buffer_info.buffer.resize(buffer_info.width * buffer_info.height); - for (int i = 0; i < buffer_info.height * buffer_info.width; i++) { - // Random numbers between 0-255 for RGBA values - uint8_t temp1 = 123; - uint8_t temp2 = 140; - uint8_t temp3 = 203; - uint8_t temp4 = 255; - buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; - } - VizDebuggerInternal::Buffer buffer; - buffer.id = 0; - buffer.buffer_info = buffer_info; - for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { - SetFilter({TestFilter({""})}); - - static const int kNumSubmission = 1; - int id = 0; - DBG_COMPLETE_BUFFERS(id, buffer.buffer_info); - DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); - - GetFrameData(true); - - EXPECT_EQ(counter_, frame_idx); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(draw_rect_calls_cache_.size(), - static_cast<size_t>(kNumSubmission)); - EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); - - if (frame_idx == 0) { - EXPECT_EQ(sources_cache_.size(), 1u); - EXPECT_EQ(sources_cache_[0].func, "TestBody"); - EXPECT_EQ(sources_cache_[0].file, __FILE__); - EXPECT_EQ(sources_cache_[0].anno, kAnnoRect); - } else { - // After the first frame there are no new sources in the loop. - EXPECT_EQ(sources_cache_.size(), 0u); - } - - EXPECT_EQ(draw_rect_calls_cache_[0].buff_id, 0); - - EXPECT_EQ(buffers_[0].buffer_info.width, buffer.buffer_info.width); - EXPECT_EQ(buffers_[0].buffer_info.height, buffer.buffer_info.height); - for (int j = 0; - j < buffers_[0].buffer_info.width * buffers_[0].buffer_info.height; - j++) { - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_r), - static_cast<int>(buffer.buffer_info.buffer[j].color_r)); - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_g), - static_cast<int>(buffer.buffer_info.buffer[j].color_g)); - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_b), - static_cast<int>(buffer.buffer_info.buffer[j].color_b)); - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_a), - static_cast<int>(buffer.buffer_info.buffer[j].color_a)); - } - } -} - -// This tests passing multiple buffers into the visual debugger synchronously -TEST_F(VisualDebuggerTest, MultipleBuffersSync) { - const char kAnnoRect[] = "annorect"; - const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); - static const int kNumFrames = 1; - GetInternal()->ForceEnabled(); - GetInternal()->Reset(); - VizDebuggerInternal::BufferInfo buffer_info; - buffer_info.width = 4; - buffer_info.height = 4; - buffer_info.buffer.resize(buffer_info.width * buffer_info.height); - for (int i = 0; i < buffer_info.height * buffer_info.width; i++) { - // Random numbers between 0-255 for RGBA values - uint8_t temp1 = 123; - uint8_t temp2 = 140; - uint8_t temp3 = 203; - uint8_t temp4 = 255; - buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; - } - VizDebuggerInternal::Buffer buffer; - buffer.id = 0; - buffer.buffer_info = buffer_info; - for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { - SetFilter({TestFilter("")}); - - static const int kNumSubmission = 8; - for (int i = 0; i < kNumSubmission; i++) { - int id = i; - DBG_COMPLETE_BUFFERS(id, buffer.buffer_info); - DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); - } - - GetFrameData(true); - - EXPECT_EQ(counter_, frame_idx); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(draw_rect_calls_cache_.size(), - static_cast<size_t>(kNumSubmission)); - EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); - - if (frame_idx == 0) { - EXPECT_EQ(sources_cache_.size(), 1u); - EXPECT_EQ(sources_cache_[0].func, "TestBody"); - EXPECT_EQ(sources_cache_[0].file, __FILE__); - EXPECT_EQ(sources_cache_[0].anno, kAnnoRect); - } else { - // After the first frame there are no new sources in the loop. - EXPECT_EQ(sources_cache_.size(), 0u); - } - - for (int i = 0; i < kNumSubmission; i++) { - EXPECT_EQ(draw_rect_calls_cache_[i].buff_id, i); - - EXPECT_EQ(buffers_[i].buffer_info.width, buffer.buffer_info.width); - EXPECT_EQ(buffers_[i].buffer_info.height, buffer.buffer_info.height); - for (int j = 0; - j < buffers_[i].buffer_info.width * buffers_[i].buffer_info.height; - j++) { - EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_r), - static_cast<int>(buffer.buffer_info.buffer[j].color_r)); - EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_g), - static_cast<int>(buffer.buffer_info.buffer[j].color_g)); - EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_b), - static_cast<int>(buffer.buffer_info.buffer[j].color_b)); - EXPECT_EQ(static_cast<int>(buffers_[i].buffer_info.buffer[j].color_a), - static_cast<int>(buffer.buffer_info.buffer[j].color_a)); - } - } - } -} - -// This tests passing a single buffer into the visual debugger asynchronously -TEST_F(VisualDebuggerTest, SingleBufferAsync) { - const char kAnnoRect[] = "annorect"; - const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); - static const int kNumFrames = 2; - GetInternal()->ForceEnabled(); - GetInternal()->Reset(); - VizDebuggerInternal::BufferInfo buffer_info; - buffer_info.width = 4; - buffer_info.height = 4; - buffer_info.buffer.resize(buffer_info.width * buffer_info.height); - for (int i = 0; i < buffer_info.height * buffer_info.width; i++) { - // Random numbers between 0-255 for RGBA values - uint8_t temp1 = 123; - uint8_t temp2 = 140; - uint8_t temp3 = 203; - uint8_t temp4 = 255; - buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; - } - VizDebuggerInternal::Buffer buffer; - buffer.id = 0; - buffer.buffer_info = buffer_info; - for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { - SetFilter({TestFilter("")}); - - static const int kNumSubmission = 1; - static std::vector<VizDebuggerInternal::Buffer> previous_textures; - for (auto&& each : previous_textures) { - DBG_COMPLETE_BUFFERS(each.id, each.buffer_info) - } - - int id = 0; - DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); - buffer.id = id; - previous_textures.emplace_back(buffer); - - GetFrameData(true); - - EXPECT_EQ(counter_, frame_idx); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(draw_rect_calls_cache_.size(), - static_cast<size_t>(kNumSubmission)); - - if (frame_idx == 0) { - EXPECT_EQ(sources_cache_.size(), 1u); - EXPECT_EQ(sources_cache_[0].func, "TestBody"); - EXPECT_EQ(sources_cache_[0].file, __FILE__); - EXPECT_EQ(sources_cache_[0].anno, kAnnoRect); - EXPECT_EQ(buffers_.size(), static_cast<size_t>(0)); - } else { - // After the first frame there are no new sources in the loop. - EXPECT_EQ(sources_cache_.size(), 0u); - EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); - EXPECT_EQ(draw_rect_calls_cache_[0].buff_id, 1); - EXPECT_EQ(buffers_[0].buffer_info.width, buffer.buffer_info.width); - EXPECT_EQ(buffers_[0].buffer_info.height, buffer.buffer_info.height); - for (int j = 0; - j < buffers_[0].buffer_info.width * buffers_[0].buffer_info.height; - j++) { - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_r), - static_cast<int>(buffer.buffer_info.buffer[j].color_r)); - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_g), - static_cast<int>(buffer.buffer_info.buffer[j].color_g)); - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_b), - static_cast<int>(buffer.buffer_info.buffer[j].color_b)); - EXPECT_EQ(static_cast<int>(buffers_[0].buffer_info.buffer[j].color_a), - static_cast<int>(buffer.buffer_info.buffer[j].color_a)); - } - } - } -} - -// This tests passing multiple buffers into the visual debugger asynchronously -TEST_F(VisualDebuggerTest, MultipleBuffersAsync) { - const char kAnnoRect[] = "annorect"; - const gfx::Rect kTestRect = gfx::Rect(12, 34, 56, 78); - static const int kNumFrames = 2; - GetInternal()->ForceEnabled(); - GetInternal()->Reset(); - VizDebuggerInternal::BufferInfo buffer_info; - buffer_info.width = 4; - buffer_info.height = 4; - buffer_info.buffer.resize(buffer_info.width * buffer_info.height); - VizDebuggerInternal::Buffer buffer; - buffer.id = 0; - for (uint64_t frame_idx = 0; frame_idx < kNumFrames; frame_idx++) { - SetFilter({TestFilter({""})}); - - static const int kNumSubmission = 8; - static std::vector<VizDebuggerInternal::Buffer> previous_textures; - static std::vector<VizDebuggerInternal::Buffer> test_buffers; - for (auto&& each : previous_textures) { - for (int i = 0; i < buffer_info.width * buffer_info.height; i++) { - // Random numbers between 0-255 for RGBA values - uint8_t temp1 = (each.id + 15) * 11231; - uint8_t temp2 = (each.id + 24) * 32461231; - uint8_t temp3 = (each.id + 523) * 72321231; - uint8_t temp4 = (each.id + 52) * 321231; - buffer_info.buffer[i] = {temp1, temp2, temp3, temp4}; - } - buffer.id = each.id; - buffer.buffer_info = buffer_info; - test_buffers.emplace(test_buffers.begin(), buffer); - DBG_COMPLETE_BUFFERS(buffer.id, buffer.buffer_info); - } - previous_textures.resize(kNumSubmission); - previous_textures.clear(); - for (int i = 0; i < kNumSubmission; i++) { - int id = i; - buffer.id = id; - DBG_DRAW_RECT_BUFF(kAnnoRect, kTestRect, &id); - buffer.buffer_info = buffer_info; - previous_textures.emplace(previous_textures.end() - i, buffer); - } - - GetFrameData(true); - - EXPECT_EQ(counter_, frame_idx); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(window_x_, 256); - EXPECT_EQ(draw_rect_calls_cache_.size(), - static_cast<size_t>(kNumSubmission)); - - if (frame_idx == 0) { - EXPECT_EQ(sources_cache_.size(), 1u); - EXPECT_EQ(sources_cache_[0].func, "TestBody"); - EXPECT_EQ(sources_cache_[0].file, __FILE__); - EXPECT_EQ(sources_cache_[0].anno, kAnnoRect); - EXPECT_EQ(buffers_.size(), static_cast<size_t>(0)); - } else { - // After the first frame there are no new sources in the loop - EXPECT_EQ(sources_cache_.size(), 0u); - EXPECT_EQ(buffers_.size(), static_cast<size_t>(kNumSubmission)); - for (int i = 0; i < kNumSubmission; i++) { - EXPECT_EQ(draw_rect_calls_cache_[i].buff_id, i + 8); - EXPECT_EQ(buffers_[i].buffer_info.width, - test_buffers[i].buffer_info.width); - EXPECT_EQ(buffers_[i].buffer_info.height, - test_buffers[i].buffer_info.height); - for (int j = 0; - j < buffers_[i].buffer_info.width * buffers_[i].buffer_info.height; - j++) { - EXPECT_EQ( - static_cast<int>(buffers_[i].buffer_info.buffer[j].color_r), - static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_r)); - EXPECT_EQ( - static_cast<int>(buffers_[i].buffer_info.buffer[j].color_g), - static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_g)); - EXPECT_EQ( - static_cast<int>(buffers_[i].buffer_info.buffer[j].color_b), - static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_b)); - EXPECT_EQ( - static_cast<int>(buffers_[i].buffer_info.buffer[j].color_a), - static_cast<int>(test_buffers[i].buffer_info.buffer[j].color_a)); - } - } - } - } -} -} // namespace -} // namespace viz -#else // VIZ_DEBUGGER_IS_ON() - -class VisualDebuggerTest : public testing::Test {}; - -DBG_FLAG_FBOOL("unit.test.fake.anno", flag_default_value_check) - -TEST_F(VisualDebuggerTest, TestDebugFlagAnnoAndFunction) { - // Visual debugger is disabled at build level this check should always return - // false. - EXPECT_FALSE(viz::VizDebugger::GetInstance()->IsEnabled()); - // The default value for a bool flag when the visual debugger is disabled is - // false. - EXPECT_FALSE(flag_default_value_check()); -} - -// For optimization purposes the flag fbool values return false as a constexpr. -// This allows the compiler to constant propagate and remove unused codepaths. -static_assert(flag_default_value_check() == false, - "Default value when debugger is disabled is false."); - -#endif
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.cc b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.cc deleted file mode 100644 index b276fdd..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.cc +++ /dev/null
@@ -1,267 +0,0 @@ -// 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/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.h" -#include <algorithm> -#include <string> -#include "base/strings/string_number_conversions.h" - -#if VIZ_DEBUGGER_IS_ON() - -namespace viz { - -TestFilter::TestFilter() = default; -TestFilter::~TestFilter() = default; - -TestFilter::TestFilter(const std::string& anno_) : anno(anno_) {} - -TestFilter::TestFilter(const std::string& anno_, const std::string& func_) - : anno(anno_), func(func_) {} - -TestFilter::TestFilter(const std::string& anno_, - const std::string& func_, - const std::string& file_) - : anno(anno_), func(func_), file(file_) {} - -TestFilter::TestFilter(const std::string& anno_, - const std::string& func_, - const std::string& file_, - const bool& active_, - const bool& enabled_) - : anno(anno_), - func(func_), - file(file_), - active(active_), - enabled(enabled_) {} - -TestFilter::TestFilter(const TestFilter& other) = default; - -StaticSource::StaticSource() = default; -StaticSource::~StaticSource() = default; -StaticSource::StaticSource(const StaticSource& other) = default; - -VizDebuggerInternal* VisualDebuggerTestBase::GetInternal() { - return static_cast<VizDebuggerInternal*>(VizDebugger::GetInstance()); -} - -void VisualDebuggerTestBase::SetUp() { - GetInternal()->Reset(); -} -void VisualDebuggerTestBase::TearDown() { - GetInternal()->Reset(); -} - -VisualDebuggerTestBase::VisualDebuggerTestBase() = default; -VisualDebuggerTestBase::~VisualDebuggerTestBase() = default; - -void VisualDebuggerTestBase::SetFilter(std::vector<TestFilter> filters) { - base::DictionaryValue filters_json; - base::ListValue filters_list; - for (auto&& each : filters) { - base::DictionaryValue full_filter; - base::DictionaryValue selector; - if (!each.file.empty()) - selector.SetString("file", each.file); - - if (!each.func.empty()) - selector.SetString("func", each.func); - - selector.SetString("anno", each.anno); - - full_filter.SetKey("selector", std::move(selector)); - full_filter.SetBoolean("active", each.active); - full_filter.SetBoolean("enabled", each.enabled); - filters_list.Append(std::move(full_filter)); - } - filters_json.SetKey("filters", std::move(filters_list)); - GetInternal()->FilterDebugStream(std::move(filters_json)); - GetInternal()->GetRWLock()->WriteLock(); - GetInternal()->UpdateFilters(); - GetInternal()->GetRWLock()->WriteUnLock(); -} - -void VisualDebuggerTestBase::GetFrameData(bool clear_cache) { - if (clear_cache) { - sources_cache_.clear(); - draw_rect_calls_cache_.clear(); - log_calls_cache_.clear(); - draw_text_calls_cache_.clear(); - buffers_.clear(); - } - - GetInternal()->GetRWLock()->WriteLock(); - size_t const kNumDrawCallSubmission = static_cast<size_t>(std::min( - GetInternal()->GetRectCallsTailIdx(), GetInternal()->GetRectCallsSize())); - size_t const kNumTextCallSubmission = static_cast<size_t>(std::min( - GetInternal()->GetTextCallsTailIdx(), GetInternal()->GetTextCallsSize())); - size_t const kNumLogSubmission = static_cast<size_t>( - std::min(GetInternal()->GetLogsTailIdx(), GetInternal()->GetLogsSize())); - - absl::optional<base::Value> global_dict = GetInternal()->FrameAsJson( - frame_counter_, gfx::Size(window_x_, window_y_), base::TimeTicks()); - GetInternal()->GetRWLock()->WriteUnLock(); - frame_counter_++; - - EXPECT_TRUE(global_dict->is_dict()); - - base::StringToUint64(global_dict->FindKey("frame")->GetString().c_str(), - &counter_); - static const int kNoVal = -1; - int expected_version = - global_dict->FindKey("version")->GetIfInt().value_or(kNoVal); - // Check to update these unit tests if a backwards compatible change has - // been made. - EXPECT_EQ(1, expected_version); - - window_x_ = global_dict->FindKey("windowx")->GetIfInt().value_or(kNoVal); - window_y_ = global_dict->FindKey("windowy")->GetIfInt().value_or(kNoVal); - - base::Value* list_source = global_dict->FindListKey("new_sources"); - EXPECT_TRUE(list_source->is_list()); - - for (size_t i = 0; i < list_source->GetListDeprecated().size(); i++) { - auto&& local_dict = list_source->GetListDeprecated()[i]; - StaticSource ss; - ss.file = local_dict.FindKey("file")->GetString(); - ss.func = local_dict.FindKey("func")->GetString(); - ss.anno = local_dict.FindKey("anno")->GetString(); - ss.line = local_dict.FindKey("line")->GetIfInt().value_or(kNoVal); - ss.index = local_dict.FindKey("index")->GetIfInt().value_or(kNoVal); - sources_cache_.push_back(ss); - } - - base::Value* draw_call_list = global_dict->FindListKey("drawcalls"); - EXPECT_TRUE(draw_call_list->is_list()); - - auto func_common_call = [](const base::Value& dict, int* draw_index, - int* source_index, int* thread_id, - VizDebugger::DrawOption* option) { - *draw_index = dict.FindKey("drawindex")->GetIfInt().value_or(kNoVal); - *source_index = dict.FindKey("source_index")->GetIfInt().value_or(kNoVal); - *thread_id = dict.FindKey("thread_id")->GetIfInt().value_or(kNoVal); - - const base::Value* option_dict = dict.FindDictKey("option"); - - uint32_t red; - uint32_t green; - uint32_t blue; - std::sscanf(option_dict->FindKey("color")->GetString().c_str(), "#%x%x%x", - &red, &green, &blue); - - option->color_r = red; - option->color_g = green; - option->color_b = blue; - option->color_a = static_cast<uint8_t>( - option_dict->FindKey("alpha")->GetIfInt().value_or(kNoVal)); - }; - - for (size_t i = 0; i < kNumDrawCallSubmission; i++) { - const base::Value& local_dict = draw_call_list->GetListDeprecated()[i]; - int draw_index; - int source_index; - int thread_id; - VizDebugger::DrawOption option; - func_common_call(local_dict, &draw_index, &source_index, &thread_id, - &option); - - const base::Value* list_size = local_dict.FindListKey("size"); - EXPECT_TRUE(list_size->is_list()); - int size_x = list_size->GetListDeprecated()[0].GetIfInt().value_or(kNoVal); - int size_y = list_size->GetListDeprecated()[1].GetIfInt().value_or(kNoVal); - - const base::Value* list_pos = local_dict.FindListKey("pos"); - EXPECT_TRUE(list_pos->is_list()); - float pos_x = - list_pos->GetListDeprecated()[0].GetIfDouble().value_or(kNoVal); - float pos_y = - list_pos->GetListDeprecated()[1].GetIfDouble().value_or(kNoVal); - - const base::Value* buffer_id = local_dict.FindKey("buff_id"); - - VizDebuggerInternal::DrawCall draw_call( - draw_index, source_index, thread_id, option, gfx::Size(size_x, size_y), - gfx::Vector2dF(pos_x, pos_y), buffer_id ? buffer_id->GetInt() : -1); - - draw_rect_calls_cache_.push_back(draw_call); - } - - base::Value* buffer_map_dict = global_dict->FindKey("buff_map"); - if (buffer_map_dict) { - for (base::Value::Dict::iterator itr = buffer_map_dict->GetDict().begin(); - itr != buffer_map_dict->GetDict().end(); itr++) { - base::Value* buffer_dict = buffer_map_dict->FindKey(itr->first); - EXPECT_TRUE(buffer_dict); - int width = buffer_dict->FindKey("width")->GetIfInt().value_or(kNoVal); - int height = buffer_dict->FindKey("height")->GetIfInt().value_or(kNoVal); - base::Value* buffer_info = buffer_dict->FindKey("buffer"); - EXPECT_TRUE(buffer_info->is_list()); - VizDebuggerInternal::BufferInfo buff; - buff.width = width; - buff.height = height; - buff.buffer.resize(width * height); - for (size_t i = 0; i < buffer_info->GetList().size() / 4; i++) { - uint8_t temp1 = buffer_info->GetList()[i * 4].GetInt(); - uint8_t temp2 = buffer_info->GetList()[i * 4 + 1].GetInt(); - uint8_t temp3 = buffer_info->GetList()[i * 4 + 2].GetInt(); - uint8_t temp4 = buffer_info->GetList()[i * 4 + 3].GetInt(); - buff.buffer[i] = {temp1, temp2, temp3, temp4}; - } - int id; - base::StringToInt(itr->first, &id); - VizDebuggerInternal::Buffer buffer; - buffer.id = id; - buffer.buffer_info = buff; - buffers_.push_back(buffer); - } - } - - base::Value* text_call_list = global_dict->FindListKey("text"); - EXPECT_TRUE(text_call_list->is_list()); - - for (size_t i = 0; i < kNumTextCallSubmission; i++) { - const base::Value& local_dict = text_call_list->GetListDeprecated()[i]; - int draw_index; - int source_index; - int thread_id; - VizDebugger::DrawOption option; - - func_common_call(local_dict, &draw_index, &source_index, &thread_id, - &option); - - const base::Value* list_pos = local_dict.FindListKey("pos"); - EXPECT_TRUE(list_pos->is_list()); - float pos_x = - list_pos->GetListDeprecated()[0].GetIfDouble().value_or(kNoVal); - float pos_y = - list_pos->GetListDeprecated()[1].GetIfDouble().value_or(kNoVal); - - VizDebuggerInternal::DrawTextCall text_call( - draw_index, source_index, thread_id, option, - gfx::Vector2dF(pos_x, pos_y), local_dict.FindKey("text")->GetString()); - - draw_text_calls_cache_.push_back(text_call); - } - - base::Value* log_call_list = global_dict->FindListKey("logs"); - EXPECT_TRUE(log_call_list->is_list()); - - for (size_t i = 0; i < kNumLogSubmission; i++) { - const base::Value& local_dict = log_call_list->GetListDeprecated()[i]; - int draw_index; - int source_index; - int thread_id; - VizDebugger::DrawOption option; - func_common_call(local_dict, &draw_index, &source_index, &thread_id, - &option); - - VizDebuggerInternal::LogCall log_call( - draw_index, source_index, thread_id, option, - local_dict.FindKey("value")->GetString()); - - log_calls_cache_.push_back(log_call); - } -} -} // namespace viz - -#endif // VIZ_DEBUGGER_IS_ON()
diff --git a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.h b/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.h deleted file mode 100644 index 75f41169..0000000 --- a/components/viz/service/debugger/viz_debugger_unittests/viz_debugger_unittest_base.h +++ /dev/null
@@ -1,98 +0,0 @@ -// 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_VIZ_SERVICE_DEBUGGER_VIZ_DEBUGGER_UNITTESTS_VIZ_DEBUGGER_UNITTEST_BASE_H_ -#define COMPONENTS_VIZ_SERVICE_DEBUGGER_VIZ_DEBUGGER_UNITTESTS_VIZ_DEBUGGER_UNITTEST_BASE_H_ - -#include <cstdint> -#include <cstdio> -#include <string> -#include <unordered_map> -#include <utility> -#include <vector> - -#include "components/viz/service/debugger/viz_debugger_unittests/viz_debugger_internal.h" -#include "testing/gtest/include/gtest/gtest.h" - -#if BUILDFLAG(USE_VIZ_DEBUGGER) - -namespace viz { - -struct TestFilter { - std::string anno; - std::string func; - std::string file; - bool active = true; - bool enabled = true; - - TestFilter(); - - ~TestFilter(); - - explicit TestFilter(const std::string& anno_); - - TestFilter(const std::string& anno_, const std::string& func_); - - TestFilter(const std::string& anno_, - const std::string& func_, - const std::string& file_); - - TestFilter(const std::string& anno_, - const std::string& func_, - const std::string& file_, - const bool& active_, - const bool& enabled_); - - TestFilter(const TestFilter& other); -}; - -struct StaticSource { - std::string file; - std::string func; - std::string anno; - int line; - int index; - - StaticSource(); - ~StaticSource(); - StaticSource(const StaticSource& other); -}; - -// The VisualDebuggerTestBase class is the base unit test class used for -// multiple VizDebugger unit tests (VisualDebuggerUnitTest and -// VizDebuggerMultithreadTest). This class is inherited by the different -// unit tests for use. -class VisualDebuggerTestBase : public testing::Test { - protected: - VizDebuggerInternal* GetInternal(); - - void SetUp() override; - void TearDown() override; - - void SetFilter(std::vector<TestFilter> filters); - - public: - VisualDebuggerTestBase(); - ~VisualDebuggerTestBase() override; - - // Gets frame data from VizDebugger. Takes in boolean that will - // either clear the cached results of GetFrameData or not. - void GetFrameData(bool clear_cache); - - uint64_t frame_counter_ = 0; - - // Cached result of call to 'GetFrameData' to simplify code. - uint64_t counter_; - int window_x_ = 256; - int window_y_ = 256; - std::vector<StaticSource> sources_cache_; - std::vector<VizDebuggerInternal::DrawCall> draw_rect_calls_cache_; - std::vector<VizDebuggerInternal::LogCall> log_calls_cache_; - std::vector<VizDebuggerInternal::DrawTextCall> draw_text_calls_cache_; - std::vector<VizDebuggerInternal::Buffer> buffers_; -}; -} // namespace viz - -#endif // BUILDFLAG(USE_VIZ_DEBUGGER) -#endif
diff --git a/components/viz/service/display/overlay_processor_ozone.cc b/components/viz/service/display/overlay_processor_ozone.cc index 07303d6..cdccfaf 100644 --- a/components/viz/service/display/overlay_processor_ozone.cc +++ b/components/viz/service/display/overlay_processor_ozone.cc
@@ -41,6 +41,7 @@ ui::OverlaySurfaceCandidate* ozone_candidate) { ozone_candidate->transform = primary_plane.transform; ozone_candidate->format = primary_plane.format; + ozone_candidate->color_space = primary_plane.color_space; ozone_candidate->display_rect = primary_plane.display_rect; ozone_candidate->crop_rect = primary_plane.uv_rect; ozone_candidate->clip_rect.reset(); @@ -57,6 +58,7 @@ ui::OverlaySurfaceCandidate* ozone_candidate) { ozone_candidate->transform = overlay_candidate.transform; ozone_candidate->format = overlay_candidate.format; + ozone_candidate->color_space = overlay_candidate.color_space; ozone_candidate->display_rect = overlay_candidate.display_rect; ozone_candidate->crop_rect = overlay_candidate.uv_rect; ozone_candidate->clip_rect = overlay_candidate.clip_rect;
diff --git a/components/viz/test/test_raster_interface.h b/components/viz/test/test_raster_interface.h index a47b8f1b..e99de82 100644 --- a/components/viz/test/test_raster_interface.h +++ b/components/viz/test/test_raster_interface.h
@@ -89,6 +89,7 @@ void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, SkYUVColorSpace planes_yuv_color_space, + const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, SkYUVAInfo::Subsampling subsampling, const gpu::Mailbox yuva_plane_mailboxes[]) override {}
diff --git a/components/web_package/web_bundle_parser.cc b/components/web_package/web_bundle_parser.cc index c18752e..de70aeeb 100644 --- a/components/web_package/web_bundle_parser.cc +++ b/components/web_package/web_bundle_parser.cc
@@ -910,6 +910,7 @@ const std::string& message, mojom::BundleParseErrorType error_type = mojom::BundleParseErrorType::kFormatError) { + DLOG(ERROR) << "Parsing web bundle error: " << message; mojom::BundleMetadataParseErrorPtr err = mojom::BundleMetadataParseError::New(error_type, message); std::move(callback_).Run(nullptr, std::move(err));
diff --git a/content/app/content_main_runner_impl.cc b/content/app/content_main_runner_impl.cc index ed19f7f..2c24497 100644 --- a/content/app/content_main_runner_impl.cc +++ b/content/app/content_main_runner_impl.cc
@@ -114,6 +114,7 @@ #include <cstring> #include "base/trace_event/trace_event_etw_export_win.h" +#include "base/win/dark_mode_support.h" #include "ui/base/l10n/l10n_util_win.h" #include "ui/display/win/dpi.h" #elif BUILDFLAG(IS_MAC) @@ -838,6 +839,11 @@ if (base::StringToDouble(scale_factor_string, &scale_factor)) display::win::SetDefaultDeviceScaleFactor(scale_factor); } + + // Make sure the 'uxtheme.dll' is pinned and that the process enabled to + // support the OS dark mode only for the browser process. + if (process_type.empty()) + base::win::AllowDarkModeForApp(true); #endif RegisterContentSchemes(delegate_->ShouldLockSchemeRegistry());
diff --git a/content/browser/attribution_reporting/attribution_header_utils.cc b/content/browser/attribution_reporting/attribution_header_utils.cc index 12097b96..452e8e6 100644 --- a/content/browser/attribution_reporting/attribution_header_utils.cc +++ b/content/browser/attribution_reporting/attribution_header_utils.cc
@@ -53,16 +53,6 @@ url::Origin reporting_origin, url::Origin source_origin, AttributionSourceType source_type) { - uint64_t source_event_id; - { - const std::string* s = registration.FindString("source_event_id"); - if (!s) - return absl::nullopt; - - if (!base::StringToUint64(*s, &source_event_id)) - source_event_id = 0; - } - url::Origin destination; { const std::string* s = registration.FindString("destination"); @@ -74,6 +64,12 @@ return absl::nullopt; } + uint64_t source_event_id = 0; + if (const std::string* s = registration.FindString("source_event_id")) { + if (!base::StringToUint64(*s, &source_event_id)) + source_event_id = 0; + } + int64_t priority = ParsePriority(registration); absl::optional<base::TimeDelta> expiry;
diff --git a/content/browser/attribution_reporting/attribution_header_utils_unittest.cc b/content/browser/attribution_reporting/attribution_header_utils_unittest.cc index 24a0c7f9..87d5aa7 100644 --- a/content/browser/attribution_reporting/attribution_header_utils_unittest.cc +++ b/content/browser/attribution_reporting/attribution_header_utils_unittest.cc
@@ -272,6 +272,15 @@ } kTestCases[] = { { "required_fields_only", + R"json({"destination":"https://d.example"})json", + StorableSource(CommonSourceInfo( + /*source_event_id=*/0, source_origin, destination_origin, + reporting_origin, source_time, default_expiry_time, source_type, + /*priority=*/0, AttributionFilterData(), + /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), + }, + { + "source_event_id_valid", R"json({"source_event_id":"1","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( /*source_event_id=*/1, source_origin, destination_origin, @@ -280,14 +289,13 @@ /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { - "source_event_id_missing", - R"json({"destination":"https://d.example"})json", - absl::nullopt, - }, - { "source_event_id_wrong_type", R"json({"source_event_id":1,"destination":"https://d.example"})json", - absl::nullopt, + StorableSource(CommonSourceInfo( + /*source_event_id=*/0, source_origin, destination_origin, + reporting_origin, source_time, default_expiry_time, source_type, + /*priority=*/0, AttributionFilterData(), + /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "source_event_id_invalid_defaults_to_0", @@ -300,46 +308,46 @@ }, { "destination_missing", - R"json({"source_event_id":"1"})json", + R"json({})json", absl::nullopt, }, { "destination_wrong_type", - R"json({"source_event_id":"1","destination":0})json", + R"json({"destination":0})json", absl::nullopt, }, { "priority_valid", - R"json({"priority":"-5","source_event_id":"1","destination":"https://d.example"})json", + R"json({"priority":"-5","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/-5, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "priority_wrong_type_defaults_to_0", - R"json({"priority":-5,"source_event_id":"1","destination":"https://d.example"})json", + R"json({"priority":-5,"destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "priority_invalid_defaults_to_0", - R"json({"priority":"abc","source_event_id":"1","destination":"https://d.example"})json", + R"json({"priority":"abc","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "expiry_valid", - R"json({"expiry":"172801","source_event_id":"1","destination":"https://d.example"})json", + R"json({"expiry":"172801","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, /*expiry_time=*/source_time + base::Seconds(172801), source_type, /*priority=*/0, AttributionFilterData(), @@ -347,27 +355,27 @@ }, { "expiry_wrong_type", - R"json({"expiry":172800,"source_event_id":"1","destination":"https://d.example"})json", + R"json({"expiry":172800,"destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "expiry_invalid", - R"json({"expiry":"abc","source_event_id":"1","destination":"https://d.example"})json", + R"json({"expiry":"abc","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "expiry_below_min", - R"json({"expiry":"86399","source_event_id":"1","destination":"https://d.example"})json", + R"json({"expiry":"86399","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, /*expiry_time=*/source_time + base::Days(1), source_type, /*priority=*/0, AttributionFilterData(), @@ -375,36 +383,36 @@ }, { "debug_key_valid", - R"json({"debug_key":"5","source_event_id":"1","destination":"https://d.example"})json", + R"json({"debug_key":"5","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/5, AttributionAggregationKeys())), }, { "debug_key_invalid", - R"json({"debug_key":"-5","source_event_id":"1","destination":"https://d.example"})json", + R"json({"debug_key":"-5","destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "debug_key_wrong_type", - R"json({"debug_key":5,"source_event_id":"1","destination":"https://d.example"})json", + R"json({"debug_key":5,"destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, AttributionAggregationKeys())), }, { "filter_data_valid", - R"json({"filter_data":{"a":["b"]},"source_event_id":"1","destination":"https://d.example"})json", + R"json({"filter_data":{"a":["b"]},"destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData::CreateForTesting({{"a", {"b"}}}), @@ -412,14 +420,14 @@ }, { "filter_data_wrong_type", - R"json({"filter_data":5,"source_event_id":"1","destination":"https://d.example"})json", + R"json({"filter_data":5,"destination":"https://d.example"})json", absl::nullopt, }, { "aggregation_keys_valid", - R"json({"aggregation_keys":{"a":"0x1"},"source_event_id":"1","destination":"https://d.example"})json", + R"json({"aggregation_keys":{"a":"0x1"},"destination":"https://d.example"})json", StorableSource(CommonSourceInfo( - /*source_event_id=*/1, source_origin, destination_origin, + /*source_event_id=*/0, source_origin, destination_origin, reporting_origin, source_time, default_expiry_time, source_type, /*priority=*/0, AttributionFilterData(), /*debug_key=*/absl::nullopt, @@ -428,7 +436,7 @@ }, { "aggregation_keys_wrong_type", - R"json({"aggregation_keys":5,"source_event_id":"1","destination":"https://d.example"})json", + R"json({"aggregation_keys":5,"destination":"https://d.example"})json", absl::nullopt, }, };
diff --git a/content/browser/net/sandboxed_socket_broker_browsertest.cc b/content/browser/net/sandboxed_socket_broker_browsertest.cc index f9fce79..0b0f3f7 100644 --- a/content/browser/net/sandboxed_socket_broker_browsertest.cc +++ b/content/browser/net/sandboxed_socket_broker_browsertest.cc
@@ -5,7 +5,6 @@ #include "base/feature_list.h" #include "base/run_loop.h" #include "base/test/scoped_feature_list.h" -#include "content/browser/buildflags.h" #include "content/browser/net/socket_broker_impl.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/network_service_instance.h" @@ -71,7 +70,11 @@ } void SetUp() override { -#if BUILDFLAG(USE_SOCKET_BROKER) +#if BUILDFLAG(IS_WIN) + // TODO(https://crbug.com/1311014): Run these tests on Windows once the + // broker can open and release sockets. + GTEST_SKIP(); +#else if (check_sandbox_) { ASSERT_TRUE(IsOutOfProcessNetworkService()); ASSERT_TRUE(sandbox::policy::features::IsNetworkSandboxEnabled()); @@ -83,12 +86,10 @@ ASSERT_TRUE(embedded_test_server_.InitializeAndListen()); ContentBrowserTest::SetUp(); -#else - GTEST_SKIP(); #endif } -#if BUILDFLAG(USE_SOCKET_BROKER) +#if !BUILDFLAG(IS_WIN) void SetUpOnMainThread() override { embedded_test_server_.StartAcceptingConnections(); } @@ -114,17 +115,6 @@ bool check_sandbox_ = true; }; -mojo::Remote<network::mojom::NetworkContext> CreateNetworkContext() { - mojo::Remote<network::mojom::NetworkContext> network_context; - network::mojom::NetworkContextParamsPtr context_params = - network::mojom::NetworkContextParams::New(); - context_params->cert_verifier_params = GetCertVerifierParams( - cert_verifier::mojom::CertVerifierCreationParams::New()); - CreateNetworkContextInNetworkService( - network_context.BindNewPipeAndPassReceiver(), std::move(context_params)); - return network_context; -} - void OnConnected(base::OnceClosure quit_closure, int result, const absl::optional<net::IPEndPoint>& local_addr, @@ -221,39 +211,5 @@ EXPECT_EQ(socket_broker.tcp_socket_count(), 1); } -IN_PROC_BROWSER_TEST_F(SandboxedSocketBrokerBrowserTest, - TcpEndToEndCrashingService) { - if (IsInProcessNetworkService()) - GTEST_SKIP(); - - auto network_context = CreateNetworkContext(); - - ASSERT_TRUE(network_context.is_bound()); - - // Run test on the first network context. - RunTcpEndToEndTest(network_context.get(), embedded_test_server_); - - // Manually call SimulateCrash instead of - // BrowserTestBase::SimulateNetworkServiceCrash to avoid the cleanup and - // reconnection work it does. - mojo::Remote<network::mojom::NetworkServiceTest> network_service_test; - GetNetworkService()->BindTestInterface( - network_service_test.BindNewPipeAndPassReceiver()); - IgnoreNetworkServiceCrashes(); - network_service_test->SimulateCrash(); - - // Make sure the cached mojo::Remote<NetworkService> receives error - // notification. - FlushNetworkServiceInstanceForTesting(); - - network_context.FlushForTesting(); - - auto network_context2 = CreateNetworkContext(); - ASSERT_TRUE(network_context2.is_bound()); - - // Run the test again, in the new network service. - RunTcpEndToEndTest(network_context2.get(), embedded_test_server_); -} - } // namespace } // namespace content
diff --git a/content/browser/network_service_instance_impl.cc b/content/browser/network_service_instance_impl.cc index a9b6d29..8fc4e67 100644 --- a/content/browser/network_service_instance_impl.cc +++ b/content/browser/network_service_instance_impl.cc
@@ -283,17 +283,8 @@ } } - // This might recreate g_client if the network service needed to be restarted. - auto* network_service = GetNetworkService(); - -#if BUILDFLAG(USE_SOCKET_BROKER) - if (GetContentClient()->browser()->ShouldSandboxNetworkService() && - !params->socket_broker) { - params->socket_broker = g_client->BindSocketBroker(); - } -#endif // BUILDFLAG(USE_SOCKET_BROKER) - - network_service->CreateNetworkContext(std::move(context), std::move(params)); + GetNetworkService()->CreateNetworkContext(std::move(context), + std::move(params)); } scoped_refptr<base::SequencedTaskRunner>& GetNetworkTaskRunnerStorage() { @@ -844,6 +835,13 @@ .InitWithNewPipeAndPassReceiver()); } +#if BUILDFLAG(USE_SOCKET_BROKER) + if (GetContentClient()->browser()->ShouldSandboxNetworkService() && + !params->socket_broker) { + params->socket_broker = g_client->BindSocketBroker(); + } +#endif // BUILDFLAG(USE_SOCKET_BROKER) + #if BUILDFLAG(IS_ANDROID) // On Android, if a cookie_manager pending receiver was passed then migration // should not be attempted as the cookie file is already being accessed by the
diff --git a/content/browser/preloading/preloading_attempt_impl.cc b/content/browser/preloading/preloading_attempt_impl.cc index 3346dee..0662eac 100644 --- a/content/browser/preloading/preloading_attempt_impl.cc +++ b/content/browser/preloading/preloading_attempt_impl.cc
@@ -25,26 +25,32 @@ PreloadingTriggeringOutcome::kReady, PreloadingTriggeringOutcome::kSuccess, PreloadingTriggeringOutcome::kFailure, - PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown}}, + PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, + PreloadingTriggeringOutcome::kTriggeredButUpgradedToPrerender}}, {PreloadingTriggeringOutcome::kDuplicate, {}}, {PreloadingTriggeringOutcome::kRunning, {PreloadingTriggeringOutcome::kReady, - PreloadingTriggeringOutcome::kFailure}}, + PreloadingTriggeringOutcome::kFailure, + PreloadingTriggeringOutcome::kTriggeredButUpgradedToPrerender}}, // It can be possible that the preloading attempt may end up failing // after being ready to use, for cases where we have to cancel the // attempt for performance and security reasons. {PreloadingTriggeringOutcome::kReady, {PreloadingTriggeringOutcome::kSuccess, - PreloadingTriggeringOutcome::kFailure}}, + PreloadingTriggeringOutcome::kFailure, + PreloadingTriggeringOutcome::kTriggeredButUpgradedToPrerender}}, {PreloadingTriggeringOutcome::kSuccess, {}}, {PreloadingTriggeringOutcome::kFailure, {}}, {PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown, {}}, + + {PreloadingTriggeringOutcome::kTriggeredButUpgradedToPrerender, + {PreloadingTriggeringOutcome::kFailure}}, })); DCHECK_STATE_TRANSITION(allowed_transitions, /*old_state=*/old_state, @@ -186,6 +192,9 @@ case PreloadingTriggeringOutcome::kTriggeredButOutcomeUnknown: os << "TriggeredButOutcomeUnknown"; break; + case PreloadingTriggeringOutcome::kTriggeredButUpgradedToPrerender: + os << "TriggeredButUpgradedToPrerender"; + break; } return os; }
diff --git a/content/browser/preloading/prerender/prerender_browsertest.cc b/content/browser/preloading/prerender/prerender_browsertest.cc index cfa3d2c..46fd15c 100644 --- a/content/browser/preloading/prerender/prerender_browsertest.cc +++ b/content/browser/preloading/prerender/prerender_browsertest.cc
@@ -193,7 +193,6 @@ host_resolver()->AddRule("*", "127.0.0.1"); attempt_ukm_entry_builder_ = std::make_unique<test::PreloadingAttemptUkmEntryBuilder>( - PreloadingType::kPrerender, ToPreloadingPredictor( ContentPreloadingPredictor::kSpeculationRules)); prediction_ukm_entry_builder_ = @@ -490,8 +489,8 @@ EXPECT_EQ(attempt_ukm_entries.size(), 1u); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, - PreloadingHoldbackStatus::kAllowed, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kSuccess, PreloadingFailureReason::kUnspecified, /*accurate=*/true); @@ -541,8 +540,9 @@ EXPECT_EQ(attempt_ukm_entries.size(), 1u); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, - PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kReady, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, + PreloadingTriggeringOutcome::kReady, PreloadingFailureReason::kUnspecified, /*accurate=*/false); @@ -780,8 +780,8 @@ Preloading_Attempt::kEntryName, test::kPreloadingAttemptUkmMetrics); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, - PreloadingHoldbackStatus::kAllowed, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kFailure, ToPreloadingFailureReason( PrerenderHost::FinalStatus::kLoginAuthRequested), @@ -1209,8 +1209,8 @@ Preloading_Attempt::kEntryName, test::kPreloadingAttemptUkmMetrics); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, - PreloadingHoldbackStatus::kAllowed, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kSuccess, PreloadingFailureReason::kUnspecified, /*accurate=*/true); @@ -3586,7 +3586,8 @@ Preloading_Attempt::kEntryName, test::kPreloadingAttemptUkmMetrics); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kLowMemory, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kLowMemory, PreloadingHoldbackStatus::kUnspecified, PreloadingTriggeringOutcome::kUnspecified, PreloadingFailureReason::kUnspecified, @@ -5067,13 +5068,15 @@ std::vector<UkmEntry> expected_entries = { attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kSuccess, PreloadingFailureReason::kUnspecified, /*accurate=*/true), attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kAllowed, PreloadingTriggeringOutcome::kFailure, PreloadingFailureReason::kUnspecified, @@ -5405,7 +5408,8 @@ EXPECT_EQ(attempt_ukm_entries.size(), 1u); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kCrossOrigin, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kCrossOrigin, PreloadingHoldbackStatus::kUnspecified, PreloadingTriggeringOutcome::kUnspecified, PreloadingFailureReason::kUnspecified, @@ -6437,8 +6441,8 @@ Preloading_Attempt::kEntryName, test::kPreloadingAttemptUkmMetrics); UkmEntry attempt_expected_entry = attempt_ukm_entry_builder().BuildEntry( - ukm_source_id, PreloadingEligibility::kEligible, - PreloadingHoldbackStatus::kHoldback, + ukm_source_id, PreloadingType::kPrerender, + PreloadingEligibility::kEligible, PreloadingHoldbackStatus::kHoldback, PreloadingTriggeringOutcome::kUnspecified, PreloadingFailureReason::kUnspecified, /*accurate=*/true);
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc index 135276b..20ebf96 100644 --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -60,6 +60,7 @@ #include "third_party/blink/public/common/page_state/page_state.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom.h" #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h" using base::Time;
diff --git a/content/browser/scheduler/responsiveness/calculator.cc b/content/browser/scheduler/responsiveness/calculator.cc index 278d5ac..a992c16d 100644 --- a/content/browser/scheduler/responsiveness/calculator.cc +++ b/content/browser/scheduler/responsiveness/calculator.cc
@@ -18,13 +18,13 @@ namespace { -// We divide the measurement interval into discretized time slices. -// Each slice is marked as janky if it contained a janky task. A janky task is -// one whose execution latency is greater than kJankThreshold. -constexpr auto kMeasurementInterval = base::Seconds(30); +// We divide the measurement interval into discretized time slices. Each slice +// is marked as congested if it contained a congested task. A congested task is +// one whose execution latency is greater than kCongestionThreshold. +constexpr auto kMeasurementPeriod = base::Seconds(30); -// A task or event longer than kJankThreshold is considered janky. -constexpr auto kJankThreshold = base::Milliseconds(100); +// A task or event longer than kCongestionThreshold is considered congested. +constexpr auto kCongestionThreshold = base::Milliseconds(100); // If there have been no events/tasks on the UI thread for a significant period // of time, it's likely because Chrome was suspended. @@ -33,37 +33,41 @@ constexpr char kLatencyEventCategory[] = "latency"; -// The names emitted for MainThreadsCongestion measurement events. +// The names emitted for CongestedIntervals measurement events. constexpr char kCongestedIntervalEvent[] = "CongestedInterval"; -constexpr char kMainThreadsCongestionsEvent[] = "MainThreadsCongestion"; +constexpr char kCongestedIntervalsMeasurementEvent[] = + "CongestedIntervals measurement period"; -// Given a |jank|, finds each janky slice between |start_time| and |end_time|, -// and adds it to |janky_slices|. -void AddJankySlices(std::set<int>* janky_slices, - const Calculator::Jank& jank, - base::TimeTicks start_time, - base::TimeTicks end_time) { - // Ignore the first jank threshold, since that's the part of the task/event - // that wasn't janky. - base::TimeTicks jank_start = jank.start_time + kJankThreshold; +// Given a |congestion|, finds each congested slice between |start_time| and +// |end_time|, and adds it to |congested_slices|. +void AddCongestedSlices(std::set<int>* congested_slices, + const Calculator::Congestion& congestion, + base::TimeTicks start_time, + base::TimeTicks end_time) { + // Ignore the first congestion threshold, since that's the part of the + // task/event that wasn't congested. + base::TimeTicks congestion_start = + congestion.start_time + kCongestionThreshold; // Bound by |start_time| and |end_time|. - jank_start = std::max(jank_start, start_time); - base::TimeTicks jank_end = std::min(jank.end_time, end_time); + congestion_start = std::max(congestion_start, start_time); + base::TimeTicks congestion_end = std::min(congestion.end_time, end_time); - // Find each janky slice, and add it to |janky_slices|. - while (jank_start < jank_end) { - // Convert |jank_start| to a slice label. - int64_t label = (jank_start - start_time).IntDiv(kJankThreshold); - janky_slices->insert(label); + // Find each congested slice, and add it to |congested_slices|. + while (congestion_start < congestion_end) { + // Convert |congestion_start| to a slice label. + int64_t label = + (congestion_start - start_time).IntDiv(kCongestionThreshold); + congested_slices->insert(label); - jank_start += kJankThreshold; + congestion_start += kCongestionThreshold; } } } // namespace -Calculator::Jank::Jank(base::TimeTicks start_time, base::TimeTicks end_time) +Calculator::Congestion::Congestion(base::TimeTicks start_time, + base::TimeTicks end_time) : start_time(start_time), end_time(end_time) { DCHECK_LE(start_time, end_time); } @@ -102,12 +106,11 @@ DCHECK_CURRENTLY_ON(BrowserThread::UI); DCHECK_GE(execution_start_time, queue_time); - if (execution_finish_time - queue_time >= kJankThreshold) { - GetQueueAndExecutionJanksOnUIThread().emplace_back(queue_time, - execution_finish_time); - if (execution_finish_time - execution_start_time >= kJankThreshold) { - GetExecutionJanksOnUIThread().emplace_back(execution_start_time, - execution_finish_time); + if (execution_finish_time - queue_time >= kCongestionThreshold) { + GetCongestionOnUIThread().emplace_back(queue_time, execution_finish_time); + if (execution_finish_time - execution_start_time >= kCongestionThreshold) { + GetExecutionCongestionOnUIThread().emplace_back(execution_start_time, + execution_finish_time); } } @@ -122,13 +125,12 @@ DCHECK_CURRENTLY_ON(BrowserThread::IO); DCHECK_GE(execution_start_time, queue_time); - if (execution_finish_time - queue_time >= kJankThreshold) { + if (execution_finish_time - queue_time >= kCongestionThreshold) { base::AutoLock lock(io_thread_lock_); - queue_and_execution_janks_on_io_thread_.emplace_back(queue_time, - execution_finish_time); - if (execution_finish_time - execution_start_time >= kJankThreshold) { - execution_janks_on_io_thread_.emplace_back(execution_start_time, - execution_finish_time); + congestion_on_io_thread_.emplace_back(queue_time, execution_finish_time); + if (execution_finish_time - execution_start_time >= kCongestionThreshold) { + execution_congestion_on_io_thread_.emplace_back(execution_start_time, + execution_finish_time); } } } @@ -139,70 +141,76 @@ past_first_idle_ = true; } -void Calculator::EmitResponsiveness(JankType jank_type, - size_t janky_slices, +void Calculator::EmitResponsiveness(CongestionType congestion_type, + size_t num_congested_slices, StartupStage startup_stage) { DCHECK_CURRENTLY_ON(BrowserThread::UI); - constexpr size_t kMaxJankySlices = 300; - DCHECK_LE(janky_slices, kMaxJankySlices); - switch (jank_type) { - case JankType::kExecution: { + constexpr size_t kMaxCongestedSlices = + kMeasurementPeriod / kCongestionThreshold; + DCHECK_LE(num_congested_slices, kMaxCongestedSlices); + switch (congestion_type) { + case CongestionType::kExecutionOnly: { UMA_HISTOGRAM_COUNTS_1000("Browser.MainThreadsCongestion.RunningOnly", - janky_slices); + num_congested_slices); // Only kFirstInterval and kPeriodic are reported with a suffix, stages // in between are only part of the unsuffixed histogram. if (startup_stage_ == StartupStage::kFirstInterval) { UMA_HISTOGRAM_COUNTS_1000( - "Browser.MainThreadsCongestion.RunningOnly.Initial", janky_slices); + "Browser.MainThreadsCongestion.RunningOnly.Initial", + num_congested_slices); } else if (startup_stage_ == StartupStage::kPeriodic) { UMA_HISTOGRAM_COUNTS_1000( - "Browser.MainThreadsCongestion.RunningOnly.Periodic", janky_slices); + "Browser.MainThreadsCongestion.RunningOnly.Periodic", + num_congested_slices); } // Emit the old name until M107. UMA_HISTOGRAM_COUNTS_1000( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds", - janky_slices); + num_congested_slices); // Only kFirstInterval and kPeriodic are reported with a suffix, stages // in between are only part of the unsuffixed histogram. if (startup_stage_ == StartupStage::kFirstInterval) { UMA_HISTOGRAM_COUNTS_1000( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Initial", - janky_slices); + num_congested_slices); } else if (startup_stage_ == StartupStage::kPeriodic) { UMA_HISTOGRAM_COUNTS_1000( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds.Periodic", - janky_slices); + num_congested_slices); } break; } - case JankType::kQueueAndExecution: { - // Queuing jank doesn't count before OnFirstIdle(). + case CongestionType::kQueueAndExecution: { + // Queuing congestion doesn't count before OnFirstIdle(). if (startup_stage_ == StartupStage::kFirstInterval || startup_stage_ == StartupStage::kFirstIntervalDoneWithoutFirstIdle) { break; } - UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion", janky_slices, - 1, kMaxJankySlices, 50); + UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion", + num_congested_slices, 1, kMaxCongestedSlices, + 50); if (startup_stage_ == StartupStage::kFirstIntervalAfterFirstIdle) { UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion.Initial", - janky_slices, 1, kMaxJankySlices, 50); + num_congested_slices, 1, + kMaxCongestedSlices, 50); } else if (startup_stage_ == StartupStage::kPeriodic) { UMA_HISTOGRAM_CUSTOM_COUNTS("Browser.MainThreadsCongestion.Periodic", - janky_slices, 1, kMaxJankySlices, 50); + num_congested_slices, 1, + kMaxCongestedSlices, 50); } // Emit the old name until M107. UMA_HISTOGRAM_CUSTOM_COUNTS( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3", - janky_slices, 1, kMaxJankySlices, 50); + num_congested_slices, 1, kMaxCongestedSlices, 50); if (startup_stage_ == StartupStage::kFirstIntervalAfterFirstIdle) { UMA_HISTOGRAM_CUSTOM_COUNTS( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Initial", - janky_slices, 1, kMaxJankySlices, 50); + num_congested_slices, 1, kMaxCongestedSlices, 50); } else if (startup_stage_ == StartupStage::kPeriodic) { UMA_HISTOGRAM_CUSTOM_COUNTS( "Browser.Responsiveness.JankyIntervalsPerThirtySeconds3.Periodic", - janky_slices, 1, kMaxJankySlices, 50); + num_congested_slices, 1, kMaxCongestedSlices, 50); } break; } @@ -210,59 +218,61 @@ } void Calculator::EmitResponsivenessTraceEvents( - JankType jank_type, + CongestionType congestion_type, base::TimeTicks start_time, base::TimeTicks end_time, - const std::set<int>& janky_slices) { - // Only output JankyIntervalsPerThirtySeconds3 event when there are janky - // slices during the measurement. - if (janky_slices.empty() || jank_type != JankType::kQueueAndExecution) + const std::set<int>& congested_slices) { + // Only output kCongestedIntervalsMeasurementEvent event when there are + // congested slices during the measurement. + if (congested_slices.empty() || + congestion_type != CongestionType::kQueueAndExecution) return; - // Emit a trace event to highlight the duration of janky intervals + // Emit a trace event to highlight the duration of congested intervals // measurement. - EmitJankyIntervalsMeasurementTraceEvent(start_time, end_time, - janky_slices.size()); + EmitCongestedIntervalsMeasurementTraceEvent(start_time, end_time, + congested_slices.size()); - // |janky_slices| contains the id of janky slices, e.g. {3,6,7,8,41,42}. - // As such if the slice following slice x is x+1, we coalesce it. - std::set<int>::const_iterator jank_slice_it = janky_slices.begin(); - while (jank_slice_it != janky_slices.end()) { - const int start_slice = *jank_slice_it; + // |congested_slices| contains the id of congested slices, e.g. + // {3,6,7,8,41,42}. As such if the slice following slice x is x+1, we coalesce + // it. + std::set<int>::const_iterator congested_slice_it = congested_slices.begin(); + while (congested_slice_it != congested_slices.end()) { + const int start_slice = *congested_slice_it; // Find the first slice that is not in the current sequence. After the loop, - // |jank_slice| will point to the first janky slice in the next sequence - // (or end() if at the end of the slices) while |current_slice| will - // point to the first non-janky slice number which correspond to the end of - // the current sequence. + // |congested_slice_it| will point to the first congested slice in the next + // sequence(or end() if at the end of the slices) while |current_slice| + // will point to the first non-congested slice number which correspond to + // the end of the current sequence. int current_slice = start_slice; do { - ++jank_slice_it; + ++congested_slice_it; ++current_slice; - } while (jank_slice_it != janky_slices.end() && - *jank_slice_it == current_slice); + } while (congested_slice_it != congested_slices.end() && + *congested_slice_it == current_slice); // Output a trace event for the range [start_slice, current_slice[. - EmitJankyIntervalsJankTraceEvent( - start_time + start_slice * kJankThreshold, - start_time + current_slice * kJankThreshold); + EmitCongestedIntervalTraceEvent( + start_time + start_slice * kCongestionThreshold, + start_time + current_slice * kCongestionThreshold); } } -void Calculator::EmitJankyIntervalsMeasurementTraceEvent( +void Calculator::EmitCongestedIntervalsMeasurementTraceEvent( base::TimeTicks start_time, base::TimeTicks end_time, size_t amount_of_slices) { TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP1( - kLatencyEventCategory, kMainThreadsCongestionsEvent, TRACE_ID_LOCAL(this), - start_time, "amount_of_slices", amount_of_slices); + kLatencyEventCategory, kCongestedIntervalsMeasurementEvent, + TRACE_ID_LOCAL(this), start_time, "amount_of_slices", amount_of_slices); TRACE_EVENT_NESTABLE_ASYNC_END_WITH_TIMESTAMP0( - kLatencyEventCategory, kMainThreadsCongestionsEvent, TRACE_ID_LOCAL(this), - end_time); + kLatencyEventCategory, kCongestedIntervalsMeasurementEvent, + TRACE_ID_LOCAL(this), end_time); } -void Calculator::EmitJankyIntervalsJankTraceEvent(base::TimeTicks start_time, - base::TimeTicks end_time) { +void Calculator::EmitCongestedIntervalTraceEvent(base::TimeTicks start_time, + base::TimeTicks end_time) { TRACE_EVENT_NESTABLE_ASYNC_BEGIN_WITH_TIMESTAMP0( kLatencyEventCategory, kCongestedIntervalEvent, TRACE_ID_LOCAL(this), start_time); @@ -295,51 +305,51 @@ #endif if (is_suspended) { last_calculation_time_ = current_time; - GetExecutionJanksOnUIThread().clear(); - GetQueueAndExecutionJanksOnUIThread().clear(); + GetExecutionCongestionOnUIThread().clear(); + GetCongestionOnUIThread().clear(); { base::AutoLock lock(io_thread_lock_); - execution_janks_on_io_thread_.clear(); - queue_and_execution_janks_on_io_thread_.clear(); + execution_congestion_on_io_thread_.clear(); + congestion_on_io_thread_.clear(); } return; } base::TimeDelta time_since_last_calculation = current_time - last_calculation_time_; - if (time_since_last_calculation <= kMeasurementInterval) + if (time_since_last_calculation <= kMeasurementPeriod) return; - // At least |kMeasurementInterval| time has passed, so we want to move forward - // |last_calculation_time_| and make measurements based on janks in that + // At least |kMeasurementPeriod| time has passed, so we want to move forward + // |last_calculation_time_| and make measurements based on congestions in that // interval. const base::TimeTicks new_calculation_time = - current_time - (time_since_last_calculation % kMeasurementInterval); + current_time - (time_since_last_calculation % kMeasurementPeriod); - // Acquire the janks in the measurement interval from the UI and IO threads. - std::vector<JankList> execution_janks_from_multiple_threads; - std::vector<JankList> queue_and_execution_janks_from_multiple_threads; - execution_janks_from_multiple_threads.push_back(TakeJanksOlderThanTime( - &GetExecutionJanksOnUIThread(), new_calculation_time)); - queue_and_execution_janks_from_multiple_threads.push_back( - TakeJanksOlderThanTime(&GetQueueAndExecutionJanksOnUIThread(), - new_calculation_time)); + // Acquire the congestions in the measurement interval from the UI and IO + // threads. + std::vector<CongestionList> execution_congestion_from_multiple_threads; + std::vector<CongestionList> congestion_from_multiple_threads; + execution_congestion_from_multiple_threads.push_back( + TakeCongestionsOlderThanTime(&GetExecutionCongestionOnUIThread(), + new_calculation_time)); + congestion_from_multiple_threads.push_back(TakeCongestionsOlderThanTime( + &GetCongestionOnUIThread(), new_calculation_time)); { base::AutoLock lock(io_thread_lock_); - execution_janks_from_multiple_threads.push_back(TakeJanksOlderThanTime( - &execution_janks_on_io_thread_, new_calculation_time)); - queue_and_execution_janks_from_multiple_threads.push_back( - TakeJanksOlderThanTime(&queue_and_execution_janks_on_io_thread_, - new_calculation_time)); + execution_congestion_from_multiple_threads.push_back( + TakeCongestionsOlderThanTime(&execution_congestion_on_io_thread_, + new_calculation_time)); + congestion_from_multiple_threads.push_back(TakeCongestionsOlderThanTime( + &congestion_on_io_thread_, new_calculation_time)); } - CalculateResponsiveness(JankType::kExecution, - std::move(execution_janks_from_multiple_threads), + CalculateResponsiveness(CongestionType::kExecutionOnly, + std::move(execution_congestion_from_multiple_threads), last_calculation_time_, new_calculation_time); - CalculateResponsiveness( - JankType::kQueueAndExecution, - std::move(queue_and_execution_janks_from_multiple_threads), - last_calculation_time_, new_calculation_time); + CalculateResponsiveness(CongestionType::kQueueAndExecution, + std::move(congestion_from_multiple_threads), + last_calculation_time_, new_calculation_time); if (startup_stage_ == StartupStage::kFirstInterval) startup_stage_ = StartupStage::kFirstIntervalDoneWithoutFirstIdle; @@ -355,15 +365,15 @@ } void Calculator::CalculateResponsiveness( - JankType jank_type, - std::vector<JankList> janks_from_multiple_threads, + CongestionType congestion_type, + std::vector<CongestionList> congestions_from_multiple_threads, base::TimeTicks start_time, base::TimeTicks end_time) { DCHECK_CURRENTLY_ON(BrowserThread::UI); while (start_time < end_time) { const base::TimeTicks current_interval_end_time = - start_time + kMeasurementInterval; + start_time + kMeasurementPeriod; // We divide the current measurement interval into slices. Each slice is // given a monotonically increasing label, from 0 to |kNumberOfSlices - 1|. @@ -373,42 +383,45 @@ // The slice [50235, 50335] is labeled 1. // ... // The slice [80035, 80135] is labeled 299. - std::set<int> janky_slices; + std::set<int> congested_slices; - for (const JankList& janks : janks_from_multiple_threads) { - for (const Jank& jank : janks) { - AddJankySlices(&janky_slices, jank, start_time, - current_interval_end_time); + for (const CongestionList& congestions : + congestions_from_multiple_threads) { + for (const Congestion& congestion : congestions) { + AddCongestedSlices(&congested_slices, congestion, start_time, + current_interval_end_time); } } - EmitResponsiveness(jank_type, janky_slices.size(), startup_stage_); + EmitResponsiveness(congestion_type, congested_slices.size(), + startup_stage_); - // If the 'latency' tracing category is enabled and we are ready to emit - // JankyIntervalsPerThirtySeconds3, emit trace events for the measurement - // duration and the janky slices. + // If the 'latency' tracing category is enabled and we are ready to observe + // queuing times (past first idle), emit trace events for the measurement + // duration and the congested slices. bool latency_category_enabled; TRACE_EVENT_CATEGORY_GROUP_ENABLED(kLatencyEventCategory, &latency_category_enabled); if (latency_category_enabled && (startup_stage_ == StartupStage::kFirstIntervalAfterFirstIdle || startup_stage_ == StartupStage::kPeriodic)) { - EmitResponsivenessTraceEvents(jank_type, start_time, - current_interval_end_time, janky_slices); + EmitResponsivenessTraceEvents(congestion_type, start_time, + current_interval_end_time, + congested_slices); } start_time = current_interval_end_time; } } -Calculator::JankList& Calculator::GetExecutionJanksOnUIThread() { +Calculator::CongestionList& Calculator::GetExecutionCongestionOnUIThread() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - return execution_janks_on_ui_thread_; + return execution_congestion_on_ui_thread_; } -Calculator::JankList& Calculator::GetQueueAndExecutionJanksOnUIThread() { +Calculator::CongestionList& Calculator::GetCongestionOnUIThread() { DCHECK_CURRENTLY_ON(content::BrowserThread::UI); - return queue_and_execution_janks_on_ui_thread_; + return congestion_on_ui_thread_; } #if BUILDFLAG(IS_ANDROID) @@ -432,27 +445,31 @@ #endif // static -Calculator::JankList Calculator::TakeJanksOlderThanTime( - JankList* janks, +Calculator::CongestionList Calculator::TakeCongestionsOlderThanTime( + CongestionList* congestions, base::TimeTicks end_time) { - // Find all janks with Jank.start_time < |end_time|. - auto it = std::partition( - janks->begin(), janks->end(), - [&end_time](const Jank& jank) { return jank.start_time < end_time; }); + // Find all congestions with Congestion.start_time < |end_time|. + auto it = std::partition(congestions->begin(), congestions->end(), + [&end_time](const Congestion& congestion) { + return congestion.start_time < end_time; + }); - // Early exit. We don't need to remove any Janks either, since Jank.end_time - // >= Jank.start_time. - if (it == janks->begin()) - return JankList(); + // Early exit. We don't need to remove any Congestions either, since + // Congestion.end_time + // >= Congestion.start_time. + if (it == congestions->begin()) + return CongestionList(); - JankList janks_to_return(janks->begin(), it); + CongestionList congestions_to_return(congestions->begin(), it); - // Remove all janks with Jank.end_time < |end_time|. - auto first_jank_to_keep = std::partition( - janks->begin(), janks->end(), - [&end_time](const Jank& jank) { return jank.end_time < end_time; }); - janks->erase(janks->begin(), first_jank_to_keep); - return janks_to_return; + // Remove all congestions with Congestion.end_time < |end_time|. + auto first_congestion_to_keep = + std::partition(congestions->begin(), congestions->end(), + [&end_time](const Congestion& congestion) { + return congestion.end_time < end_time; + }); + congestions->erase(congestions->begin(), first_congestion_to_keep); + return congestions_to_return; } } // namespace responsiveness
diff --git a/content/browser/scheduler/responsiveness/calculator.h b/content/browser/scheduler/responsiveness/calculator.h index 00675d2..b4286ab 100644 --- a/content/browser/scheduler/responsiveness/calculator.h +++ b/content/browser/scheduler/responsiveness/calculator.h
@@ -23,8 +23,8 @@ // This class receives execution latency on events and tasks, and uses that to // estimate responsiveness. // -// All members are UI-thread affine, with the exception of -// |janks_on_io_thread_| which is protected by |io_thread_lock_|. +// All members are UI-thread affine, with the exception of |*_on_io_thread_| +// which are protected by |io_thread_lock_|. class CONTENT_EXPORT Calculator { public: Calculator(); @@ -63,18 +63,18 @@ // Change the Power state of the process. Must be called from the UI thread. void SetProcessSuspended(bool suspended); - // Each janking task/event is fully defined by |start_time| and |end_time|. + // Each congested task/event is fully defined by |start_time| and |end_time|. // Note that |duration| = |end_time| - |start_time|. - struct Jank { - Jank(base::TimeTicks start_time, base::TimeTicks end_time); + struct Congestion { + Congestion(base::TimeTicks start_time, base::TimeTicks end_time); base::TimeTicks start_time; base::TimeTicks end_time; }; - // Types of jank recorded by this Calculator. Public for testing. - enum class JankType { - kExecution, + // Types of congestion recorded by this Calculator. Public for testing. + enum class CongestionType { + kExecutionOnly, kQueueAndExecution, }; @@ -95,34 +95,34 @@ protected: // Emits an UMA metric for responsiveness of a single measurement interval. // Exposed for testing. - virtual void EmitResponsiveness(JankType jank_type, - size_t janky_slices, + virtual void EmitResponsiveness(CongestionType congestion_type, + size_t num_congested_slices, StartupStage startup_stage); // Emits trace events for responsiveness metric. A trace event is emitted for // the whole duration of the metric interval and sub events are emitted for - // the specific janky slices. + // the specific congested slices. // Exposed for testing. - void EmitResponsivenessTraceEvents(JankType jank_type, + void EmitResponsivenessTraceEvents(CongestionType congestion_type, base::TimeTicks start_time, base::TimeTicks end_time, - const std::set<int>& janky_slices); + const std::set<int>& congested_slices); // Exposed for testing. - virtual void EmitJankyIntervalsMeasurementTraceEvent( + virtual void EmitCongestedIntervalsMeasurementTraceEvent( base::TimeTicks start_time, base::TimeTicks end_time, size_t amount_of_slices); // Exposed for testing. - virtual void EmitJankyIntervalsJankTraceEvent(base::TimeTicks start_time, - base::TimeTicks end_time); + virtual void EmitCongestedIntervalTraceEvent(base::TimeTicks start_time, + base::TimeTicks end_time); // Exposed for testing. base::TimeTicks GetLastCalculationTime(); private: - using JankList = std::vector<Jank>; + using CongestionList = std::vector<Congestion>; // If sufficient time has passed since the last calculation, then calculate // responsiveness again and update |last_calculation_time_|. @@ -135,23 +135,24 @@ // Responsiveness is calculated by: // 1) Discretizing time into small intervals. - // 2) In each interval, looking to see if there is a Janky event. If so, the - // interval is marked as |janky|. - // 3) Computing the percentage of intervals that are janky. + // 2) In each interval, looking to see if there is a Congestion. If so, the + // interval is marked as |congested|. + // 3) Computing the percentage of intervals that are congested. // - // This method intentionally takes a std::vector<JankList>, as we may want to - // extend it in the future to take JankLists from other threads/processes. + // This method intentionally takes a std::vector<CongestionList>, as we may + // want to extend it in the future to take CongestionLists from other + // threads/processes. void CalculateResponsiveness( - JankType jank_type, - std::vector<JankList> janks_from_multiple_threads, + CongestionType congestion_type, + std::vector<CongestionList> congestions_from_multiple_threads, base::TimeTicks start_time, base::TimeTicks end_time); - // Accessors for |execution_janks_on_ui_thread_| and - // ||queue_and_execution_janks_on_ui_thread_|. Must be called from the UI + // Accessors for |execution_congestion_on_ui_thread_| and + // ||congestion_on_ui_thread_|. Must be called from the UI // thread. - JankList& GetExecutionJanksOnUIThread(); - JankList& GetQueueAndExecutionJanksOnUIThread(); + CongestionList& GetExecutionCongestionOnUIThread(); + CongestionList& GetCongestionOnUIThread(); #if BUILDFLAG(IS_ANDROID) // Callback invoked when the application state changes. @@ -159,20 +160,22 @@ #endif // This helper method: - // 1) Removes all Janks with Jank.end_time < |end_time| from |janks|. - // 2) Returns all Janks with Jank.start_time < |end_time|. - static JankList TakeJanksOlderThanTime(JankList* janks, - base::TimeTicks end_time); + // 1) Removes all Congestions with Congestion.end_time < |end_time| from + // |congestions|. 2) Returns all Congestions with Congestion.start_time < + // |end_time|. + static CongestionList TakeCongestionsOlderThanTime( + CongestionList* congestions, + base::TimeTicks end_time); - // Janks from tasks/events with a long execution time on the UI thread. Should - // only be accessed via the accessor, which checks that the caller is on the - // UI thread. - JankList execution_janks_on_ui_thread_; + // Congestion from tasks/events with a long execution time on the UI thread. + // Should only be accessed via the accessor, which checks that the caller is + // on the UI thread. + CongestionList execution_congestion_on_ui_thread_; - // Janks from tasks/events with a long queueing + execution time on the UI - // thread. Should only be accessed via the accessor, which checks that the + // Congestion from tasks/events with a long queueing + execution time on the + // UI thread. Should only be accessed via the accessor, which checks that the // caller is on the UI thread. - JankList queue_and_execution_janks_on_ui_thread_; + CongestionList congestion_on_ui_thread_; #if BUILDFLAG(IS_ANDROID) // Stores the current visibility state of the application. Accessed only on @@ -188,16 +191,16 @@ // to a lock-free data structure. base::Lock io_thread_lock_; - // Janks from tasks/events with a long execution time on the IO thread. - JankList execution_janks_on_io_thread_ GUARDED_BY(io_thread_lock_); + // Congestion from tasks/events with a long execution time on the IO thread. + CongestionList execution_congestion_on_io_thread_ GUARDED_BY(io_thread_lock_); - // Janks from tasks/events with a long queueing + execution time on the IO - // thread. - JankList queue_and_execution_janks_on_io_thread_ GUARDED_BY(io_thread_lock_); + // Congestion from tasks/events with a long queueing + execution time on the + // IO thread. + CongestionList congestion_on_io_thread_ GUARDED_BY(io_thread_lock_); - // The last time at which metrics were emitted. All janks older than this time - // have been consumed. Newer janks are still in their JankLists waiting to be - // consumed. + // The last time at which metrics were emitted. All congestions older than + // this time have been consumed. Newer congestions are still in their + // CongestionLists waiting to be consumed. base::TimeTicks last_calculation_time_; // This class keeps track of the time at which any activity occurred on the UI
diff --git a/content/browser/scheduler/responsiveness/calculator_unittest.cc b/content/browser/scheduler/responsiveness/calculator_unittest.cc index 85a5c3d..fad884b 100644 --- a/content/browser/scheduler/responsiveness/calculator_unittest.cc +++ b/content/browser/scheduler/responsiveness/calculator_unittest.cc
@@ -15,36 +15,37 @@ namespace content { namespace responsiveness { -using JankType = Calculator::JankType; +using CongestionType = Calculator::CongestionType; using StartupStage = Calculator::StartupStage; using ::testing::_; namespace { // Copied from calculator.cc. constexpr int kMeasurementIntervalInMs = 30 * 1000; -constexpr int kJankThresholdInMs = 100; +constexpr int kCongestionThresholdInMs = 100; class FakeCalculator : public Calculator { public: MOCK_METHOD3(EmitResponsivenessMock, - void(JankType jank_type, - size_t janky_slices, + void(CongestionType congestion_type, + size_t congested_slices, StartupStage startup_stage)); - void EmitResponsiveness(JankType jank_type, - size_t janky_slices, + void EmitResponsiveness(CongestionType congestion_type, + size_t congested_slices, StartupStage startup_stage) override { - EmitResponsivenessMock(jank_type, janky_slices, startup_stage); + EmitResponsivenessMock(congestion_type, congested_slices, startup_stage); // Emit the histograms anyways for verification in some tests. - Calculator::EmitResponsiveness(jank_type, janky_slices, startup_stage); + Calculator::EmitResponsiveness(congestion_type, congested_slices, + startup_stage); } - MOCK_METHOD3(EmitJankyIntervalsMeasurementTraceEvent, + MOCK_METHOD3(EmitCongestedIntervalsMeasurementTraceEvent, void(base::TimeTicks start_time, base::TimeTicks end_time, size_t amount_of_slices)); - MOCK_METHOD2(EmitJankyIntervalsJankTraceEvent, + MOCK_METHOD2(EmitCongestedIntervalTraceEvent, void(base::TimeTicks start_time, base::TimeTicks end_time)); using Calculator::EmitResponsivenessTraceEvents; @@ -100,198 +101,203 @@ base::TimeTicks last_calculation_time_; }; -#define EXPECT_EXECUTION_JANKY_SLICES(num_slices, phase) \ - EXPECT_CALL(*calculator_, EmitResponsivenessMock(JankType::kExecution, \ - num_slices, phase)); -#define EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(num_slices, phase) \ - EXPECT_CALL(*calculator_, \ - EmitResponsivenessMock(JankType::kQueueAndExecution, num_slices, \ - phase)); +#define EXPECT_EXECUTION_CONGESTED_SLICES(num_slices, phase) \ + EXPECT_CALL(*calculator_, \ + EmitResponsivenessMock(CongestionType::kExecutionOnly, \ + num_slices, phase)); +#define EXPECT_CONGESTED_SLICES(num_slices, phase) \ + EXPECT_CALL(*calculator_, \ + EmitResponsivenessMock(CongestionType::kQueueAndExecution, \ + num_slices, phase)); -// A single event executing slightly longer than kJankThresholdInMs. -TEST_F(ResponsivenessCalculatorTest, ShortExecutionJank) { +// A single event executing slightly longer than kCongestionThresholdInMs. +TEST_F(ResponsivenessCalculatorTest, ShortExecutionCongestion) { constexpr int kQueueTime = 35; constexpr int kStartTime = 40; - constexpr int kFinishTime = kStartTime + kJankThresholdInMs + 5; + constexpr int kFinishTime = kStartTime + kCongestionThresholdInMs + 5; AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); TriggerCalculation(); } -// A single event queued slightly longer than kJankThresholdInMs. -TEST_F(ResponsivenessCalculatorTest, ShortQueueJank) { +// A single event queued slightly longer than kCongestionThresholdInMs. +TEST_F(ResponsivenessCalculatorTest, ShortQueueCongestion) { constexpr int kQueueTime = 35; - constexpr int kStartTime = kQueueTime + kJankThresholdInMs + 5; + constexpr int kStartTime = kQueueTime + kCongestionThresholdInMs + 5; constexpr int kFinishTime = kStartTime + 5; AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); TriggerCalculation(); } // A single event whose queuing and execution time together take longer than -// kJankThresholdInMs. -TEST_F(ResponsivenessCalculatorTest, ShortCombinedQueueAndExecutionJank) { +// kCongestionThresholdInMs. +TEST_F(ResponsivenessCalculatorTest, ShortCombinedQueueAndExecutionCongestion) { constexpr int kQueueTime = 35; - constexpr int kStartTime = kQueueTime + (kJankThresholdInMs / 2); - constexpr int kFinishTime = kStartTime + (kJankThresholdInMs / 2) + 1; + constexpr int kStartTime = kQueueTime + (kCongestionThresholdInMs / 2); + constexpr int kFinishTime = kStartTime + (kCongestionThresholdInMs / 2) + 1; AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); TriggerCalculation(); } -// A single event executing slightly longer than 10 * kJankThresholdInMs. -TEST_F(ResponsivenessCalculatorTest, LongExecutionJank) { +// A single event executing slightly longer than 10 * kCongestionThresholdInMs. +TEST_F(ResponsivenessCalculatorTest, LongExecutionCongestion) { constexpr int kQueueTime = 35; constexpr int kStartTime = 40; - constexpr int kFinishTime = kStartTime + 10 * kJankThresholdInMs + 5; + constexpr int kFinishTime = kStartTime + 10 * kCongestionThresholdInMs + 5; AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_EXECUTION_JANKY_SLICES(10, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(10u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(10, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(10u, StartupStage::kFirstInterval); TriggerCalculation(); } -// A single event executing slightly longer than 10 * kJankThresholdInMs. -TEST_F(ResponsivenessCalculatorTest, LongQueueJank) { +// A single event executing slightly longer than 10 * kCongestionThresholdInMs. +TEST_F(ResponsivenessCalculatorTest, LongQueueCongestion) { constexpr int kQueueTime = 35; - constexpr int kStartTime = kQueueTime + 10 * kJankThresholdInMs + 5; + constexpr int kStartTime = kQueueTime + 10 * kCongestionThresholdInMs + 5; constexpr int kFinishTime = kStartTime + 5; AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(10u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(10u, StartupStage::kFirstInterval); TriggerCalculation(); } -// Events that execute in less than 100ms do not jank, regardless of start time. -TEST_F(ResponsivenessCalculatorTest, NoExecutionJank) { +// Events that execute in less than 100ms are not congested, regardless of start +// time. +TEST_F(ResponsivenessCalculatorTest, NoExecutionCongestion) { int base_time = 30; - for (int i = 0; i < kJankThresholdInMs; ++i) { + for (int i = 0; i < kCongestionThresholdInMs; ++i) { AddEventUI(base_time, base_time, base_time + i); } - base_time += kJankThresholdInMs; - for (int i = 0; i < kJankThresholdInMs; ++i) { + base_time += kCongestionThresholdInMs; + for (int i = 0; i < kCongestionThresholdInMs; ++i) { AddEventUI(base_time + i, base_time + i, base_time + 2 * i); } - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); TriggerCalculation(); } -// Events that are queued and execute in less than 100ms do not jank, regardless -// of start time. -TEST_F(ResponsivenessCalculatorTest, NoQueueJank) { +// Events that are queued and execute in less than 100ms are not congested, +// regardless of start time. +TEST_F(ResponsivenessCalculatorTest, NoQueueCongestion) { int base_time = 30; - for (int i = 0; i < kJankThresholdInMs; ++i) { + for (int i = 0; i < kCongestionThresholdInMs; ++i) { AddEventUI(base_time, base_time + i, base_time + i); } - base_time += kJankThresholdInMs; - for (int i = 0; i < kJankThresholdInMs; ++i) { + base_time += kCongestionThresholdInMs; + for (int i = 0; i < kCongestionThresholdInMs; ++i) { AddEventUI(base_time + i, base_time + 2 * i, base_time + 2 * i); } - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); TriggerCalculation(); } -// 10 execution jank events, but very closely overlapping. Time slices are +// 10 execution congestion events, but very closely overlapping. Time slices are // discretized and fixed, e.g. [0 100] [100 200] [200 300]. In this test, the // events all start in the [0 100] slice and end in the [100 200] slice. All of -// them end up marking the [100 200] slice as janky. -TEST_F(ResponsivenessCalculatorTest, OverlappingExecutionJank) { +// them end up marking the [100 200] slice as congested. +TEST_F(ResponsivenessCalculatorTest, OverlappingExecutionCongestion) { int base_time = 30; for (int i = 0; i < 10; ++i) { const int queue_time = base_time; const int start_time = base_time; - const int finish_time = start_time + kJankThresholdInMs + i; + const int finish_time = start_time + kCongestionThresholdInMs + i; AddEventUI(queue_time, start_time, finish_time); } - EXPECT_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); TriggerCalculation(); } -// 10 queue jank events, but very closely overlapping. Time slices are +// 10 queue congestion events, but very closely overlapping. Time slices are // discretized and fixed, e.g. [0 100] [100 200] [200 300]. In this test, the // events are all queued in the [0 100] slice and start executing in the [100 -// 200] slice. All of them end up marking the [100 200] slice as janky. -TEST_F(ResponsivenessCalculatorTest, OverlappingQueueJank) { +// 200] slice. All of them end up marking the [100 200] slice as congested. +TEST_F(ResponsivenessCalculatorTest, OverlappingQueueCongestion) { int base_time = 30; for (int i = 0; i < 10; ++i) { const int queue_time = base_time; - const int start_time = base_time + kJankThresholdInMs + i; + const int start_time = base_time + kCongestionThresholdInMs + i; const int finish_time = start_time + 1; AddEventUI(queue_time, start_time, finish_time); } - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); TriggerCalculation(); } -// UI thread has 3 execution jank events on slices 1, 2, 3 -// IO thread has 3 execution jank events on slices 3, 4, 5, -// There should be a total of 5 jank events. -TEST_F(ResponsivenessCalculatorTest, OverlappingExecutionJankMultipleThreads) { +// UI thread has 3 execution congestion events on slices 1, 2, 3 +// IO thread has 3 execution congestion events on slices 3, 4, 5, +// There should be a total of 5 congestion events. +TEST_F(ResponsivenessCalculatorTest, + OverlappingExecutionCongestionMultipleThreads) { int base_time = 105; for (int i = 0; i < 3; ++i) { - const int queue_time = base_time + i * kJankThresholdInMs; + const int queue_time = base_time + i * kCongestionThresholdInMs; const int start_time = queue_time; - const int finish_time = start_time + kJankThresholdInMs + 10; + const int finish_time = start_time + kCongestionThresholdInMs + 10; AddEventUI(queue_time, start_time, finish_time); } base_time = 305; for (int i = 0; i < 3; ++i) { - const int queue_time = base_time + i * kJankThresholdInMs; + const int queue_time = base_time + i * kCongestionThresholdInMs; const int start_time = queue_time; - const int finish_time = start_time + kJankThresholdInMs + 10; + const int finish_time = start_time + kCongestionThresholdInMs + 10; AddEventIO(queue_time, start_time, finish_time); } - EXPECT_EXECUTION_JANKY_SLICES(5u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(5u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(5u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(5u, StartupStage::kFirstInterval); TriggerCalculation(); } -// UI thread has 3 queue jank events on slices 1, 2, 3 -// IO thread has 3 queue jank events on slices 3, 4, 5, -// There should be a total of 5 jank events. -TEST_F(ResponsivenessCalculatorTest, OverlappingQueueJankMultipleThreads) { +// UI thread has 3 queue congestion events on slices 1, 2, 3 +// IO thread has 3 queue congestion events on slices 3, 4, 5, +// There should be a total of 5 congestion events. +TEST_F(ResponsivenessCalculatorTest, + OverlappingQueueCongestionMultipleThreads) { int base_time = 105; for (int i = 0; i < 3; ++i) { - const int queue_time = base_time + i * kJankThresholdInMs; - const int start_time = queue_time + kJankThresholdInMs + 10; + const int queue_time = base_time + i * kCongestionThresholdInMs; + const int start_time = queue_time + kCongestionThresholdInMs + 10; const int finish_time = start_time; AddEventUI(queue_time, start_time, finish_time); } base_time = 305; for (int i = 0; i < 3; ++i) { - const int queue_time = base_time + i * kJankThresholdInMs; - const int start_time = queue_time + kJankThresholdInMs + 10; + const int queue_time = base_time + i * kCongestionThresholdInMs; + const int start_time = queue_time + kCongestionThresholdInMs + 10; const int finish_time = start_time; AddEventIO(queue_time, start_time, finish_time); } - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(5u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(5u, StartupStage::kFirstInterval); TriggerCalculation(); } -// Three execution janks, each of length 2, separated by some shorter events. -TEST_F(ResponsivenessCalculatorTest, SeparatedExecutionJanks) { +// Three execution congestions, each of length 2, separated by some shorter +// events. +TEST_F(ResponsivenessCalculatorTest, SeparatedExecutionCongestions) { int base_time = 105; for (int i = 0; i < 3; ++i) { @@ -304,19 +310,19 @@ { const int queue_time = base_time; const int start_time = base_time; - const int finish_time = base_time + 2 * kJankThresholdInMs + 1; + const int finish_time = base_time + 2 * kCongestionThresholdInMs + 1; AddEventUI(queue_time, start_time, finish_time); } - base_time += 10 * kJankThresholdInMs; + base_time += 10 * kCongestionThresholdInMs; } - EXPECT_EXECUTION_JANKY_SLICES(6u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(6u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(6u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(6u, StartupStage::kFirstInterval); TriggerCalculation(); } -// Three queue janks, each of length 2, separated by some shorter events. -TEST_F(ResponsivenessCalculatorTest, SeparatedQueueJanks) { +// Three queue congestions, each of length 2, separated by some shorter events. +TEST_F(ResponsivenessCalculatorTest, SeparatedQueueCongestions) { int base_time = 105; for (int i = 0; i < 3; ++i) { @@ -328,32 +334,33 @@ } { const int queue_time = base_time; - const int start_time = base_time + 2 * kJankThresholdInMs + 1; + const int start_time = base_time + 2 * kCongestionThresholdInMs + 1; const int finish_time = start_time; AddEventUI(queue_time, start_time, finish_time); } - base_time += 10 * kJankThresholdInMs; + base_time += 10 * kCongestionThresholdInMs; } - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(6u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(6u, StartupStage::kFirstInterval); TriggerCalculation(); } TEST_F(ResponsivenessCalculatorTest, MultipleTrigger) { int base_time = 105; - // 3 Janks, then trigger, then repeat. + // 3 Congestions, then trigger, then repeat. for (int i = 0; i < 10; ++i) { for (int j = 0; j < 3; ++j) { - AddEventUI(base_time, base_time, base_time + 3 * kJankThresholdInMs + 1); - base_time += 3 * kJankThresholdInMs; + AddEventUI(base_time, base_time, + base_time + 3 * kCongestionThresholdInMs + 1); + base_time += 3 * kCongestionThresholdInMs; } - EXPECT_EXECUTION_JANKY_SLICES( + EXPECT_EXECUTION_CONGESTED_SLICES( 9u, i == 0 ? StartupStage::kFirstInterval : StartupStage::kFirstIntervalDoneWithoutFirstIdle); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES( + EXPECT_CONGESTED_SLICES( 9u, i == 0 ? StartupStage::kFirstInterval : StartupStage::kFirstIntervalDoneWithoutFirstIdle); TriggerCalculation(); @@ -364,7 +371,8 @@ // A long delay means that the machine likely went to sleep. TEST_F(ResponsivenessCalculatorTest, LongDelay) { int base_time = 105; - AddEventUI(base_time, base_time, base_time + 3 * kJankThresholdInMs + 1); + AddEventUI(base_time, base_time, + base_time + 3 * kCongestionThresholdInMs + 1); base_time += 10 * kMeasurementIntervalInMs; AddEventUI(base_time, base_time, base_time + 1); @@ -384,7 +392,7 @@ TEST_F(ResponsivenessCalculatorTest, ApplicationInBackground) { constexpr int kQueueTime = 35; constexpr int kStartTime = 40; - constexpr int kFinishTime = kStartTime + kJankThresholdInMs + 5; + constexpr int kFinishTime = kStartTime + kCongestionThresholdInMs + 5; AddEventUI(kQueueTime, kStartTime, kFinishTime); base::android::ApplicationStatusListener::NotifyApplicationStateChange( @@ -399,18 +407,18 @@ TEST_F(ResponsivenessCalculatorTest, StartupStages) { constexpr int kQueueTime = 35; - constexpr int kStartTime = kQueueTime + 10 * kJankThresholdInMs + 5; + constexpr int kStartTime = kQueueTime + 10 * kCongestionThresholdInMs + 5; constexpr int kFinishTime = kStartTime + 5; absl::optional<base::HistogramTester> histograms; - // Queue jank event during the first kMeasurementInterval. + // Queue congestion event during the first kMeasurementInterval. AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL(*calculator_, - EmitResponsivenessMock(JankType::kExecution, 0, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, StartupStage::kFirstInterval)); EXPECT_CALL(*calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstInterval)); histograms.emplace(); TriggerCalculation(); @@ -424,16 +432,16 @@ histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); - // Queue jank event during a few kMeasurementInterval (without having seen - // OnFirstIdle()). Neither .Initial nor .Periodic + // Queue congestion event during a few kMeasurementInterval (without having + // seen OnFirstIdle()). Neither .Initial nor .Periodic AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL( *calculator_, - EmitResponsivenessMock(JankType::kExecution, 0, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, StartupStage::kFirstIntervalDoneWithoutFirstIdle)); EXPECT_CALL( *calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstIntervalDoneWithoutFirstIdle)); histograms.emplace(); TriggerCalculation(); @@ -449,11 +457,11 @@ AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL( *calculator_, - EmitResponsivenessMock(JankType::kExecution, 0, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, StartupStage::kFirstIntervalDoneWithoutFirstIdle)); EXPECT_CALL( *calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstIntervalDoneWithoutFirstIdle)); histograms.emplace(); TriggerCalculation(); @@ -473,11 +481,11 @@ calculator_->OnFirstIdle(); EXPECT_CALL( *calculator_, - EmitResponsivenessMock(JankType::kExecution, 0, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, StartupStage::kFirstIntervalDoneWithoutFirstIdle)); EXPECT_CALL( *calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstIntervalDoneWithoutFirstIdle)); histograms.emplace(); TriggerCalculation(); @@ -491,13 +499,14 @@ histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Initial", 0); histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); - // Events in intervals after OnFirstIdle(). Janky3.Initial still no .Periodic. + // Events in intervals after OnFirstIdle(). congested3.Initial still no + // .Periodic. AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL(*calculator_, EmitResponsivenessMock( - JankType::kExecution, 0, + CongestionType::kExecutionOnly, 0, StartupStage::kFirstIntervalAfterFirstIdle)); EXPECT_CALL(*calculator_, EmitResponsivenessMock( - JankType::kQueueAndExecution, 10u, + CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstIntervalAfterFirstIdle)); histograms.emplace(); TriggerCalculation(); @@ -513,10 +522,11 @@ histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_CALL(*calculator_, EmitResponsivenessMock(JankType::kExecution, 0, - StartupStage::kPeriodic)); EXPECT_CALL(*calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, + StartupStage::kPeriodic)); + EXPECT_CALL(*calculator_, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kPeriodic)); histograms.emplace(); TriggerCalculation(); @@ -534,7 +544,7 @@ TEST_F(ResponsivenessCalculatorTest, FastStartupStages) { constexpr int kQueueTime = 35; - constexpr int kStartTime = kQueueTime + 10 * kJankThresholdInMs + 5; + constexpr int kStartTime = kQueueTime + 10 * kCongestionThresholdInMs + 5; constexpr int kFinishTime = kStartTime + 5; absl::optional<base::HistogramTester> histograms; @@ -545,10 +555,10 @@ AddEventUI(kQueueTime, kStartTime, kFinishTime); calculator_->OnFirstIdle(); EXPECT_CALL(*calculator_, - EmitResponsivenessMock(JankType::kExecution, 0, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, StartupStage::kFirstInterval)); EXPECT_CALL(*calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstInterval)); histograms.emplace(); TriggerCalculation(); @@ -564,10 +574,10 @@ AddEventUI(kQueueTime, kStartTime, kFinishTime); EXPECT_CALL(*calculator_, EmitResponsivenessMock( - JankType::kExecution, 0, + CongestionType::kExecutionOnly, 0, StartupStage::kFirstIntervalAfterFirstIdle)); EXPECT_CALL(*calculator_, EmitResponsivenessMock( - JankType::kQueueAndExecution, 10u, + CongestionType::kQueueAndExecution, 10u, StartupStage::kFirstIntervalAfterFirstIdle)); histograms.emplace(); TriggerCalculation(); @@ -583,10 +593,11 @@ histograms->ExpectTotalCount("Browser.MainThreadsCongestion.Periodic", 0); AddEventUI(kQueueTime, kStartTime, kFinishTime); - EXPECT_CALL(*calculator_, EmitResponsivenessMock(JankType::kExecution, 0, - StartupStage::kPeriodic)); EXPECT_CALL(*calculator_, - EmitResponsivenessMock(JankType::kQueueAndExecution, 10u, + EmitResponsivenessMock(CongestionType::kExecutionOnly, 0, + StartupStage::kPeriodic)); + EXPECT_CALL(*calculator_, + EmitResponsivenessMock(CongestionType::kQueueAndExecution, 10u, StartupStage::kPeriodic)); histograms.emplace(); TriggerCalculation(); @@ -611,15 +622,16 @@ AddEventUI(kTime, kTime, kTime); } - // The event goes from [29801, 30150]. It should count as 1 jank in the first - // measurement interval and 2 in the second. + // The event goes from [29801, 30150]. It should count as 1 congestion in the + // first measurement interval and 2 in the second. { - EXPECT_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); const int queue_time = - kMeasurementIntervalInMs - 2 * kJankThresholdInMs + 1; + kMeasurementIntervalInMs - 2 * kCongestionThresholdInMs + 1; const int start_time = queue_time; - const int finish_time = kMeasurementIntervalInMs + 1.5 * kJankThresholdInMs; + const int finish_time = + kMeasurementIntervalInMs + 1.5 * kCongestionThresholdInMs; AddEventUI(queue_time, start_time, finish_time); } @@ -630,10 +642,9 @@ } // Trigger another calculation. - EXPECT_EXECUTION_JANKY_SLICES( + EXPECT_EXECUTION_CONGESTED_SLICES( 2u, StartupStage::kFirstIntervalDoneWithoutFirstIdle); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES( - 2u, StartupStage::kFirstIntervalDoneWithoutFirstIdle); + EXPECT_CONGESTED_SLICES(2u, StartupStage::kFirstIntervalDoneWithoutFirstIdle); const int kTime = 2 * kMeasurementIntervalInMs + 1; AddEventUI(kTime, kTime, kTime); @@ -648,14 +659,15 @@ AddEventUI(kTime, kTime, kTime); } - // The event goes from [29801, 30150]. It should count as 1 jank in the first - // measurement interval and 2 in the second. + // The event goes from [29801, 30150]. It should count as 1 congestion in the + // first measurement interval and 2 in the second. { - EXPECT_EXECUTION_JANKY_SLICES(0u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(1u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(0u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(1u, StartupStage::kFirstInterval); const int queue_time = - kMeasurementIntervalInMs - 2 * kJankThresholdInMs + 1; - const int start_time = kMeasurementIntervalInMs + 1.5 * kJankThresholdInMs; + kMeasurementIntervalInMs - 2 * kCongestionThresholdInMs + 1; + const int start_time = + kMeasurementIntervalInMs + 1.5 * kCongestionThresholdInMs; const int finish_time = start_time; AddEventUI(queue_time, start_time, finish_time); } @@ -667,10 +679,9 @@ } // Trigger another calculation. - EXPECT_EXECUTION_JANKY_SLICES( + EXPECT_EXECUTION_CONGESTED_SLICES( 0u, StartupStage::kFirstIntervalDoneWithoutFirstIdle); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES( - 2u, StartupStage::kFirstIntervalDoneWithoutFirstIdle); + EXPECT_CONGESTED_SLICES(2u, StartupStage::kFirstIntervalDoneWithoutFirstIdle); const int kTime = 2 * kMeasurementIntervalInMs + 1; AddEventUI(kTime, kTime, kTime); @@ -689,8 +700,8 @@ // [1050, 1200, 1201] // [1050, 1390, 1391] <- B // - // The execution jank in A subsumes all other execution janks. The queue jank - // in B subsumes all other queue janks. + // The execution congestion in A subsumes all other execution congestions. The + // queue congestion in B subsumes all other queue congestions. AddEventUI(100, 100, 250); AddEventUI(150, 150, 300); AddEventUI(50, 50, 200); @@ -701,8 +712,8 @@ AddEventUI(1050, 1200, 1201); AddEventUI(1050, 1390, 1391); - EXPECT_EXECUTION_JANKY_SLICES(3u, StartupStage::kFirstInterval); - EXPECT_QUEUE_AND_EXECUTION_JANKY_SLICES(6u, StartupStage::kFirstInterval); + EXPECT_EXECUTION_CONGESTED_SLICES(3u, StartupStage::kFirstInterval); + EXPECT_CONGESTED_SLICES(6u, StartupStage::kFirstInterval); TriggerCalculation(); } @@ -710,52 +721,58 @@ constexpr base::TimeTicks kStartTime = base::TimeTicks(); constexpr base::TimeTicks kFinishTime = kStartTime + base::Milliseconds(kMeasurementIntervalInMs); - const std::set<int> janky_slices; + const std::set<int> congested_slices; - EXPECT_CALL(*calculator_, EmitJankyIntervalsMeasurementTraceEvent(_, _, _)) + EXPECT_CALL(*calculator_, + EmitCongestedIntervalsMeasurementTraceEvent(_, _, _)) .Times(0); - calculator_->EmitResponsivenessTraceEvents( - JankType::kQueueAndExecution, kStartTime, kFinishTime, janky_slices); + calculator_->EmitResponsivenessTraceEvents(CongestionType::kQueueAndExecution, + kStartTime, kFinishTime, + congested_slices); } TEST_F(ResponsivenessCalculatorTest, EmitResponsivenessTraceEventsWrongMetric) { constexpr base::TimeTicks kStartTime = base::TimeTicks(); constexpr base::TimeTicks kFinishTime = kStartTime + base::Milliseconds(kMeasurementIntervalInMs); - const std::set<int> janky_slices = {1}; + const std::set<int> congested_slices = {1}; - EXPECT_CALL(*calculator_, EmitJankyIntervalsMeasurementTraceEvent(_, _, _)) + EXPECT_CALL(*calculator_, + EmitCongestedIntervalsMeasurementTraceEvent(_, _, _)) .Times(0); - calculator_->EmitResponsivenessTraceEvents(JankType::kExecution, kStartTime, - kFinishTime, janky_slices); + calculator_->EmitResponsivenessTraceEvents(CongestionType::kExecutionOnly, + kStartTime, kFinishTime, + congested_slices); } TEST_F(ResponsivenessCalculatorTest, EmitResponsivenessTraceEvents) { constexpr base::TimeDelta kSliceInterval = - base::Milliseconds(kJankThresholdInMs); + base::Milliseconds(kCongestionThresholdInMs); constexpr base::TimeTicks kStartTime = base::TimeTicks(); constexpr base::TimeTicks kFinishTime = kStartTime + base::Milliseconds(kMeasurementIntervalInMs); - const std::set<int> janky_slices = {3, 4, 5, 12, 15}; + const std::set<int> congested_slices = {3, 4, 5, 12, 15}; - EXPECT_CALL(*calculator_, EmitJankyIntervalsMeasurementTraceEvent( - kStartTime, kFinishTime, janky_slices.size())); + EXPECT_CALL(*calculator_, + EmitCongestedIntervalsMeasurementTraceEvent( + kStartTime, kFinishTime, congested_slices.size())); - EXPECT_CALL(*calculator_, EmitJankyIntervalsJankTraceEvent( - kStartTime + 3 * kSliceInterval, - kStartTime + 6 * kSliceInterval)); - EXPECT_CALL(*calculator_, EmitJankyIntervalsJankTraceEvent( + EXPECT_CALL(*calculator_, + EmitCongestedIntervalTraceEvent(kStartTime + 3 * kSliceInterval, + kStartTime + 6 * kSliceInterval)); + EXPECT_CALL(*calculator_, EmitCongestedIntervalTraceEvent( kStartTime + 12 * kSliceInterval, kStartTime + 13 * kSliceInterval)); - EXPECT_CALL(*calculator_, EmitJankyIntervalsJankTraceEvent( + EXPECT_CALL(*calculator_, EmitCongestedIntervalTraceEvent( kStartTime + 15 * kSliceInterval, kStartTime + 16 * kSliceInterval)); - calculator_->EmitResponsivenessTraceEvents( - JankType::kQueueAndExecution, kStartTime, kFinishTime, janky_slices); + calculator_->EmitResponsivenessTraceEvents(CongestionType::kQueueAndExecution, + kStartTime, kFinishTime, + congested_slices); } } // namespace responsiveness
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index cdfe4d1..a77c6d8 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -32,12 +32,12 @@ import "third_party/blink/public/mojom/conversions/conversions.mojom"; import "third_party/blink/public/mojom/devtools/console_message.mojom"; import "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom"; -import "third_party/blink/public/mojom/frame/frame.mojom"; import "third_party/blink/public/mojom/frame/frame_owner_properties.mojom"; import "third_party/blink/public/mojom/frame/frame_policy.mojom"; import "third_party/blink/public/mojom/frame/frame_replication_state.mojom"; import "third_party/blink/public/mojom/frame/lifecycle.mojom"; import "third_party/blink/public/mojom/frame/policy_container.mojom"; +import "third_party/blink/public/mojom/frame/remote_frame.mojom"; import "third_party/blink/public/mojom/frame/tree_scope_type.mojom"; import "third_party/blink/public/mojom/loader/referrer.mojom"; import "third_party/blink/public/mojom/navigation/navigation_policy.mojom";
diff --git a/content/public/browser/preloading.h b/content/public/browser/preloading.h index 94e5ef39..92234fc 100644 --- a/content/public/browser/preloading.h +++ b/content/public/browser/preloading.h
@@ -27,6 +27,12 @@ // origin. kPreconnect = 2, + // Prefetch operation comes after Preresolve and Preconnect. Chrome spends a + // significant amount time idle, waiting for the main frame HTML fetch. The + // prefetch preloading operation fetches the HTML before the user starts + // navigating in order to load the page much faster. + kPrefetch = 3, + // This speedup technique comes with the most impact and overhead. We preload // and render a page before the user navigates to it. This will make the next // page navigation nearly instant as we would activate a fully prepared @@ -165,6 +171,12 @@ // kTriggeredButOutcomeUnknown, meaning that preloading was triggered but we // don't know if it was successful. kTriggeredButOutcomeUnknown = 7, + + // A preloading feature (e.g., prefetch) completed successfully and was + // upgraded to Prerender. For PreloadingType::kPrefetch this is different from + // kSuccess reason which only tracks when the navigation directly uses the + // Prefetch. Please note that this doesn't ensure Prerender was successful. + kTriggeredButUpgradedToPrerender = 8, }; // These values are persisted to logs. Entries should not be renumbered and
diff --git a/content/public/browser/web_contents.h b/content/public/browser/web_contents.h index f07dd54..257630e 100644 --- a/content/public/browser/web_contents.h +++ b/content/public/browser/web_contents.h
@@ -39,7 +39,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/mojom/favicon/favicon_url.mojom-forward.h" #include "third_party/blink/public/mojom/frame/find_in_page.mojom-forward.h" -#include "third_party/blink/public/mojom/frame/frame.mojom-forward.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-forward.h" #include "third_party/blink/public/mojom/input/pointer_lock_result.mojom.h" #include "third_party/blink/public/mojom/media/capture_handle_config.mojom-forward.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h"
diff --git a/content/public/common/content_switch_dependent_feature_overrides.cc b/content/public/common/content_switch_dependent_feature_overrides.cc index 5510de8..b3d68ee 100644 --- a/content/public/common/content_switch_dependent_feature_overrides.cc +++ b/content/public/common/content_switch_dependent_feature_overrides.cc
@@ -75,9 +75,6 @@ std::cref(blink::features::kPrefersColorSchemeClientHintHeader), base::FeatureList::OVERRIDE_ENABLE_FEATURE}, {switches::kEnableExperimentalWebPlatformFeatures, - std::cref(blink::features::kViewportHeightClientHintHeader), - base::FeatureList::OVERRIDE_ENABLE_FEATURE}, - {switches::kEnableExperimentalWebPlatformFeatures, std::cref(blink::features::kClientHintsMetaHTTPEquivAcceptCH), base::FeatureList::OVERRIDE_ENABLE_FEATURE}, {switches::kEnableExperimentalWebPlatformFeatures,
diff --git a/content/public/test/browser_test_utils.h b/content/public/test/browser_test_utils.h index f684fff..a41588c 100644 --- a/content/public/test/browser_test_utils.h +++ b/content/public/test/browser_test_utils.h
@@ -53,6 +53,7 @@ #include "third_party/blink/public/common/input/web_mouse_event.h" #include "third_party/blink/public/common/input/web_mouse_wheel_event.h" #include "third_party/blink/public/mojom/frame/frame.mojom-test-utils.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-test-utils.h" #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h" #include "third_party/perfetto/include/perfetto/tracing/traced_value_forward.h" #include "ui/accessibility/ax_node_data.h"
diff --git a/content/public/test/fake_remote_frame.h b/content/public/test/fake_remote_frame.h index e6d3a57..9435f3a6 100644 --- a/content/public/test/fake_remote_frame.h +++ b/content/public/test/fake_remote_frame.h
@@ -7,10 +7,10 @@ #include "mojo/public/cpp/bindings/associated_receiver.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" -#include "third_party/blink/public/mojom/frame/frame.mojom.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h" #include "third_party/blink/public/mojom/frame/fullscreen.mojom.h" #include "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom.h" #include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom.h"
diff --git a/content/public/test/preloading_test_util.cc b/content/public/test/preloading_test_util.cc index 1a820a2..51a229d 100644 --- a/content/public/test/preloading_test_util.cc +++ b/content/public/test/preloading_test_util.cc
@@ -30,12 +30,12 @@ }; PreloadingAttemptUkmEntryBuilder::PreloadingAttemptUkmEntryBuilder( - PreloadingType preloading_type, PreloadingPredictor predictor) - : preloading_type_(preloading_type), predictor_(predictor) {} + : predictor_(predictor) {} UkmEntry PreloadingAttemptUkmEntryBuilder::BuildEntry( ukm::SourceId source_id, + PreloadingType preloading_type, PreloadingEligibility eligibility, PreloadingHoldbackStatus holdback_status, PreloadingTriggeringOutcome triggering_outcome, @@ -45,7 +45,7 @@ source_id, { {Preloading_Attempt::kPreloadingTypeName, - static_cast<int64_t>(preloading_type_)}, + static_cast<int64_t>(preloading_type)}, {Preloading_Attempt::kPreloadingPredictorName, static_cast<int64_t>(predictor_)}, {Preloading_Attempt::kEligibilityName,
diff --git a/content/public/test/preloading_test_util.h b/content/public/test/preloading_test_util.h index 1982bb15..3ccfb4b1 100644 --- a/content/public/test/preloading_test_util.h +++ b/content/public/test/preloading_test_util.h
@@ -22,11 +22,11 @@ // TestUkmRecorder::HumanReadableUkmEntry for EXPECT_EQ for PreloadingAttempt. class PreloadingAttemptUkmEntryBuilder { public: - PreloadingAttemptUkmEntryBuilder(PreloadingType preloading_type, - PreloadingPredictor predictor); + explicit PreloadingAttemptUkmEntryBuilder(PreloadingPredictor predictor); ukm::TestUkmRecorder::HumanReadableUkmEntry BuildEntry( ukm::SourceId source_id, + PreloadingType preloading_type, PreloadingEligibility eligibility, PreloadingHoldbackStatus holdback_status, PreloadingTriggeringOutcome triggering_outcome, @@ -34,7 +34,6 @@ bool accurate) const; private: - PreloadingType preloading_type_; PreloadingPredictor predictor_; };
diff --git a/content/public/test/render_view_test.cc b/content/public/test/render_view_test.cc index c99beea..83de6e3b 100644 --- a/content/public/test/render_view_test.cc +++ b/content/public/test/render_view_test.cc
@@ -34,7 +34,6 @@ #include "content/renderer/mock_agent_scheduling_group.h" #include "content/renderer/render_process.h" #include "content/renderer/render_thread_impl.h" -#include "content/renderer/render_view_impl.h" #include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/renderer_main_platform_delegate.h" #include "content/test/test_content_client.h" @@ -510,18 +509,16 @@ view_params->hidden = false; view_params->never_composited = false; - RenderViewImpl* view = RenderViewImpl::Create( - *agent_scheduling_group_, std::move(view_params), - /*was_created_by_renderer=*/false, base::ThreadTaskRunnerHandle::Get()); + web_view_ = + agent_scheduling_group_->CreateWebView(std::move(view_params), + /*was_created_by_renderer=*/false); - RenderFrameWasShownWaiter waiter(RenderFrame::FromWebFrame( - view->GetWebView()->MainFrame()->ToWebLocalFrame())); + RenderFrameWasShownWaiter waiter( + RenderFrame::FromWebFrame(web_view_->MainFrame()->ToWebLocalFrame())); render_widget_host_->widget_remote_for_testing()->WasShown( /*was_evicted=*/false, blink::mojom::RecordContentToVisibleTimeRequestPtr()); waiter.Wait(); - - web_view_ = view->GetWebView(); } void RenderViewTest::TearDown() {
diff --git a/content/renderer/BUILD.gn b/content/renderer/BUILD.gn index 801d6c6..ac56b78 100644 --- a/content/renderer/BUILD.gn +++ b/content/renderer/BUILD.gn
@@ -114,8 +114,6 @@ "render_process_impl.h", "render_thread_impl.cc", "render_thread_impl.h", - "render_view_impl.cc", - "render_view_impl.h", "renderer_blink_platform_impl.cc", "renderer_blink_platform_impl.h", "renderer_main.cc",
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index a950bfe..9f97bac2 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -14,19 +14,22 @@ #include "base/threading/sequence_bound.h" #include "base/types/pass_key.h" #include "content/common/agent_scheduling_group.mojom.h" +#include "content/public/common/content_client.h" #include "content/public/common/content_features.h" +#include "content/public/renderer/content_renderer_client.h" #include "content/renderer/render_frame_impl.h" #include "content/renderer/render_thread_impl.h" -#include "content/renderer/render_view_impl.h" #include "content/services/shared_storage_worklet/public/mojom/shared_storage_worklet_service.mojom.h" #include "content/services/shared_storage_worklet/shared_storage_worklet_service_impl.h" #include "ipc/ipc_channel_mojo.h" #include "ipc/ipc_listener.h" #include "ipc/ipc_sync_channel.h" #include "third_party/blink/public/mojom/frame/frame.mojom.h" +#include "third_party/blink/public/mojom/page/page.mojom.h" #include "third_party/blink/public/platform/scheduler/web_thread_scheduler.h" #include "third_party/blink/public/web/web_remote_frame.h" #include "third_party/blink/public/web/web_view.h" +#include "third_party/blink/public/web/web_view_client.h" namespace content { @@ -57,6 +60,13 @@ : features::MBIMode::kLegacy; } +// Blink inappropriately makes decisions if there is a WebViewClient set, +// so currently we need to always create a WebViewClient. +class SelfOwnedWebViewClient : public blink::WebViewClient { + public: + void OnDestruct() override { delete this; } +}; + // A thread for running shared storage worklet operations. It hosts a worklet // environment belonging to one Document. The object owns itself, cleaning up // when the worklet has shut down. @@ -253,9 +263,72 @@ renderer.SetScrollAnimatorEnabled( params->web_preferences.enable_scroll_animator, PassKey()); - RenderViewImpl::Create(*this, std::move(params), - /*was_created_by_renderer=*/false, - agent_group_scheduler_->DefaultTaskRunner()); + CreateWebView(std::move(params), + /*was_created_by_renderer=*/false); +} + +blink::WebView* AgentSchedulingGroup::CreateWebView( + mojom::CreateViewParamsPtr params, + bool was_created_by_renderer) { + DCHECK(RenderThread::IsMainThread()); + + blink::WebFrame* opener_frame = nullptr; + if (params->opener_frame_token) + opener_frame = + blink::WebFrame::FromFrameToken(params->opener_frame_token.value()); + + blink::WebView* web_view = blink::WebView::Create( + new SelfOwnedWebViewClient(), params->hidden, params->is_prerendering, + params->type == mojom::ViewWidgetType::kPortal ? true : false, + params->type == mojom::ViewWidgetType::kFencedFrame + ? absl::make_optional(params->fenced_frame_mode) + : absl::nullopt, + /*compositing_enabled=*/true, params->never_composited, + opener_frame ? opener_frame->View() : nullptr, + std::move(params->blink_page_broadcast), agent_group_scheduler(), + params->session_storage_namespace_id, params->base_background_color); + + bool local_main_frame = params->main_frame->is_local_params(); + + web_view->SetRendererPreferences(params->renderer_preferences); + web_view->SetWebPreferences(params->web_preferences); + + if (local_main_frame) { + RenderFrameImpl::CreateMainFrame( + *this, web_view, opener_frame, + /*is_for_nested_main_frame=*/params->type != + mojom::ViewWidgetType::kTopLevel, + /*is_for_scalable_page=*/params->type != + mojom::ViewWidgetType::kFencedFrame, + std::move(params->replication_state), params->devtools_main_frame_token, + std::move(params->main_frame->get_local_params())); + } else { + blink::WebRemoteFrame::CreateMainFrame( + web_view, params->main_frame->get_remote_params()->token, + params->devtools_main_frame_token, opener_frame, + std::move(params->main_frame->get_remote_params() + ->frame_interfaces->frame_host), + std::move(params->main_frame->get_remote_params() + ->frame_interfaces->frame_receiver), + std::move(params->replication_state)); + // Root frame proxy has no ancestors to point to their RenderWidget. + + // The WebRemoteFrame created here was already attached to the Page as its + // main frame, so we can call WebView's DidAttachRemoteMainFrame(). + web_view->DidAttachRemoteMainFrame( + std::move(params->main_frame->get_remote_params() + ->main_frame_interfaces->main_frame_host), + std::move(params->main_frame->get_remote_params() + ->main_frame_interfaces->main_frame)); + } + + // TODO(davidben): Move this state from Blink into content. + if (params->window_was_opened_by_another_window) + web_view->SetOpenedByDOM(); + + GetContentClient()->renderer()->WebViewCreated(web_view, + was_created_by_renderer); + return web_view; } void AgentSchedulingGroup::CreateFrame(mojom::CreateFrameParamsPtr params) {
diff --git a/content/renderer/agent_scheduling_group.h b/content/renderer/agent_scheduling_group.h index 823c88c..ce265a1 100644 --- a/content/renderer/agent_scheduling_group.h +++ b/content/renderer/agent_scheduling_group.h
@@ -31,6 +31,10 @@ class SyncChannel; } // namespace IPC +namespace blink { +class WebView; +} // namespace blink + namespace content { class RenderThread; @@ -72,6 +76,10 @@ return *agent_group_scheduler_; } + // Create a new WebView in this AgentSchedulingGroup. + blink::WebView* CreateWebView(mojom::CreateViewParamsPtr params, + bool was_created_by_renderer); + protected: // mojom::AgentSchedulingGroup: void BindAssociatedInterfaces(
diff --git a/content/renderer/dom_serializer_browsertest.cc b/content/renderer/dom_serializer_browsertest.cc index 52d9e972..6292dadf 100644 --- a/content/renderer/dom_serializer_browsertest.cc +++ b/content/renderer/dom_serializer_browsertest.cc
@@ -68,6 +68,9 @@ // https://crbug.com/788788 #if BUILDFLAG(IS_ANDROID) && defined(ADDRESS_SANITIZER) #define MAYBE_DomSerializerTests DISABLED_DomSerializerTests +#elif defined(THREAD_SANITIZER) +// http://crbug.com/1350508 +#define MAYBE_DomSerializerTests DISABLED_DomSerializerTests #else #define MAYBE_DomSerializerTests DomSerializerTests #endif // BUILDFLAG(IS_ANDROID) && defined(ADDRESS_SANITIZER)
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 6101f608..9d47696 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -76,6 +76,7 @@ #include "content/public/renderer/render_frame_visitor.h" #include "content/public/renderer/render_thread.h" #include "content/public/renderer/renderer_ppapi_host.h" +#include "content/public/renderer/window_features_converter.h" #include "content/renderer/accessibility/aom_content_ax_tree.h" #include "content/renderer/accessibility/ax_tree_distiller.h" #include "content/renderer/accessibility/ax_tree_snapshotter_impl.h" @@ -97,7 +98,6 @@ #include "content/renderer/policy_container_util.h" #include "content/renderer/render_process.h" #include "content/renderer/render_thread_impl.h" -#include "content/renderer/render_view_impl.h" #include "content/renderer/renderer_blink_platform_impl.h" #include "content/renderer/service_worker/service_worker_network_provider_for_frame.h" #include "content/renderer/service_worker/web_service_worker_provider_impl.h" @@ -170,6 +170,7 @@ #include "third_party/blink/public/mojom/page/widget.mojom.h" #include "third_party/blink/public/mojom/permissions/permission.mojom.h" #include "third_party/blink/public/mojom/render_accessibility.mojom.h" +#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h" #include "third_party/blink/public/mojom/widget/platform_widget.mojom.h" #include "third_party/blink/public/platform/file_path_conversion.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" @@ -214,6 +215,7 @@ #include "third_party/blink/public/web/web_navigation_policy.h" #include "third_party/blink/public/web/web_navigation_timings.h" #include "third_party/blink/public/web/web_performance.h" +#include "third_party/blink/public/web/web_picture_in_picture_window_options.h" #include "third_party/blink/public/web/web_plugin.h" #include "third_party/blink/public/web/web_plugin_container.h" #include "third_party/blink/public/web/web_plugin_document.h" @@ -229,6 +231,7 @@ #include "third_party/blink/public/web/web_v8_features.h" #include "third_party/blink/public/web/web_view.h" #include "third_party/blink/public/web/web_widget.h" +#include "third_party/blink/public/web/web_window_features.h" #include "ui/accessibility/ax_tree_update.h" #include "ui/events/base_event_utils.h" #include "url/origin.h" @@ -1132,6 +1135,39 @@ } } +content::mojom::WindowContainerType WindowFeaturesToContainerType( + const blink::WebWindowFeatures& window_features) { + if (window_features.background) { + if (window_features.persistent) + return content::mojom::WindowContainerType::PERSISTENT; + else + return content::mojom::WindowContainerType::BACKGROUND; + } else { + return content::mojom::WindowContainerType::NORMAL; + } +} + +WindowOpenDisposition NavigationPolicyToDisposition( + WebNavigationPolicy policy) { + switch (policy) { + case blink::kWebNavigationPolicyDownload: + return WindowOpenDisposition::SAVE_TO_DISK; + case blink::kWebNavigationPolicyCurrentTab: + return WindowOpenDisposition::CURRENT_TAB; + case blink::kWebNavigationPolicyNewBackgroundTab: + return WindowOpenDisposition::NEW_BACKGROUND_TAB; + case blink::kWebNavigationPolicyNewForegroundTab: + return WindowOpenDisposition::NEW_FOREGROUND_TAB; + case blink::kWebNavigationPolicyNewWindow: + return WindowOpenDisposition::NEW_WINDOW; + case blink::kWebNavigationPolicyNewPopup: + case blink::kWebNavigationPolicyPictureInPicture: + return WindowOpenDisposition::NEW_POPUP; + } + NOTREACHED() << "Unexpected WebNavigationPolicy"; + return WindowOpenDisposition::IGNORE_ACTION; +} + } // namespace RenderFrameImpl::AssertNavigationCommits::AssertNavigationCommits( @@ -2500,7 +2536,7 @@ SCOPED_CRASH_KEY_BOOL( "old_page_info", "old_is_hidden", old_page_info->new_lifecycle_state_for_old_page->visibility == - PageVisibilityState::kHidden); + blink::mojom::PageVisibilityState::kHidden); SCOPED_CRASH_KEY_BOOL( "old_page_info", "old_pagehide_dispatch", old_page_info->new_lifecycle_state_for_old_page->pagehide_dispatch == @@ -2510,7 +2546,7 @@ return; } DCHECK_EQ(old_page_info->new_lifecycle_state_for_old_page->visibility, - PageVisibilityState::kHidden); + blink::mojom::PageVisibilityState::kHidden); DCHECK_NE(old_page_info->new_lifecycle_state_for_old_page->pagehide_dispatch, blink::mojom::PagehideDispatch::kNotDispatched); WebFrame* old_main_web_frame = old_main_render_frame->GetWebFrame(); @@ -3949,7 +3985,7 @@ SendUpdateState(); return; } else if (GetWebView()->GetVisibilityState() != - PageVisibilityState::kVisible) + blink::mojom::PageVisibilityState::kVisible) delay = kDelaySecondsForContentStateSyncHidden; else delay = kDelaySecondsForContentStateSync; @@ -5343,7 +5379,7 @@ params->referrer = blink::mojom::Referrer::New( blink::WebStringToGURL(info->url_request.ReferrerString()), info->url_request.GetReferrerPolicy()); - params->disposition = RenderViewImpl::NavigationPolicyToDisposition(policy); + params->disposition = NavigationPolicyToDisposition(policy); params->triggering_event_info = info->triggering_event_info; params->blob_url_token = CloneBlobURLToken(info->blob_url_token); params->should_replace_current_entry = @@ -6099,4 +6135,175 @@ this, has_played_media_before, std::move(closure)); } +WebView* RenderFrameImpl::CreateNewWindow( + const WebURLRequest& request, + const blink::WebWindowFeatures& features, + const WebString& frame_name, + WebNavigationPolicy policy, + network::mojom::WebSandboxFlags sandbox_flags, + const blink::SessionStorageNamespaceId& session_storage_namespace_id, + bool& consumed_user_gesture, + const absl::optional<blink::Impression>& impression, + const absl::optional<blink::WebPictureInPictureWindowOptions>& + pip_options) { + consumed_user_gesture = false; + mojom::CreateNewWindowParamsPtr params = mojom::CreateNewWindowParams::New(); + + // The user activation check is done at the browser process through + // |frame_host->CreateNewWindow()| call below. But the extensions case + // handled through the following |if| is an exception. + params->allow_popup = false; + if (GetContentClient()->renderer()->AllowPopup()) + params->allow_popup = true; + + params->window_container_type = WindowFeaturesToContainerType(features); + + params->session_storage_namespace_id = session_storage_namespace_id; + if (!features.noopener) { + params->clone_from_session_storage_namespace_id = + GetWebView()->GetSessionStorageNamespaceId(); + } + + const std::string& frame_name_utf8 = frame_name.Utf8( + WebString::UTF8ConversionMode::kStrictReplacingErrorsWithFFFD); + params->frame_name = frame_name_utf8; + params->opener_suppressed = features.noopener; + params->disposition = NavigationPolicyToDisposition(policy); + if (!request.IsNull()) { + params->target_url = request.Url(); + params->referrer = blink::mojom::Referrer::New( + blink::WebStringToGURL(request.ReferrerString()), + request.GetReferrerPolicy()); + } + params->features = ConvertWebWindowFeaturesToMojoWindowFeatures(features); + + params->is_form_submission = request.IsFormSubmission(); + params->form_submission_post_data = + blink::GetRequestBodyForWebURLRequest(request); + params->form_submission_post_content_type = request.HttpContentType().Utf8(); + + params->impression = impression; + + if (pip_options) { + CHECK_EQ(policy, blink::kWebNavigationPolicyPictureInPicture); + auto pip_mojom_opts = blink::mojom::PictureInPictureWindowOptions::New(); + pip_mojom_opts->initial_aspect_ratio = pip_options->initial_aspect_ratio; + pip_mojom_opts->lock_aspect_ratio = pip_options->lock_aspect_ratio; + params->pip_options = std::move(pip_mojom_opts); + } + + params->download_policy.ApplyDownloadFramePolicy( + /*is_opener_navigation=*/false, request.HasUserGesture(), + // `openee_can_access_opener_origin` only matters for opener navigations, + // so its value here is irrelevant. + /*openee_can_access_opener_origin=*/true, + !GetWebFrame()->IsAllowedToDownload(), GetWebFrame()->IsAdFrame()); + + // We preserve this information before sending the message since |params| is + // moved on send. + bool is_background_tab = + params->disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB; + + mojom::CreateNewWindowStatus status; + mojom::CreateNewWindowReplyPtr reply; + auto* frame_host = GetFrameHost(); + if (!frame_host->CreateNewWindow(std::move(params), &status, &reply)) { + // The sync IPC failed, e.g. maybe the render process is in the middle of + // shutting down. Can't create a new window without the browser process, + // so just bail out. + return nullptr; + } + + // If creation of the window was blocked (e.g. because this frame doesn't + // have user activation), return before consuming user activation. A frame + // that isn't allowed to open a window shouldn't be able to consume the + // activation for the rest of the frame tree. + if (status == mojom::CreateNewWindowStatus::kBlocked) + return nullptr; + + // For Android WebView, we support a pop-up like behavior for window.open() + // even if the embedding app doesn't support multiple windows. In this case, + // window.open() will return "window" and navigate it to whatever URL was + // passed. We also don't need to consume user gestures to protect against + // multiple windows being opened, because, well, the app doesn't support + // multiple windows. + // TODO(dcheng): It's awkward that this is plumbed into Blink but not really + // used much in Blink, except to enable web testing... perhaps this should + // be checked directly in the browser side. + if (status == mojom::CreateNewWindowStatus::kReuse) + return GetWebView(); + + // Consume the transient user activation in the current renderer. + consumed_user_gesture = GetWebFrame()->ConsumeTransientUserActivation( + blink::UserActivationUpdateSource::kBrowser); + + // If we should ignore the new window (e.g. because of `noopener`), return + // now that user activation was consumed. + if (status == mojom::CreateNewWindowStatus::kIgnore) + return nullptr; + + DCHECK(reply); + DCHECK_NE(MSG_ROUTING_NONE, reply->main_frame_route_id); + DCHECK_NE(MSG_ROUTING_NONE, reply->widget_params->routing_id); + + // While this view may be a background extension page, it can spawn a visible + // render view. So we just assume that the new one is not another background + // page instead of passing on our own value. + // TODO(vangelis): Can we tell if the new view will be a background page? + bool never_composited = false; + + // The initial hidden state for the RenderViewImpl here has to match what the + // browser will eventually decide for the given disposition. Since we have to + // return from this call synchronously, we just have to make our best guess + // and rely on the browser sending a WasHidden / WasShown message if it + // disagrees. + mojom::CreateViewParamsPtr view_params = mojom::CreateViewParams::New(); + + view_params->opener_frame_token = GetWebFrame()->GetFrameToken(); + view_params->window_was_opened_by_another_window = true; + view_params->renderer_preferences = GetWebView()->GetRendererPreferences(); + view_params->web_preferences = GetWebView()->GetWebPreferences(); + + view_params->replication_state = blink::mojom::FrameReplicationState::New(); + view_params->replication_state->frame_policy.sandbox_flags = sandbox_flags; + view_params->replication_state->name = frame_name_utf8; + view_params->devtools_main_frame_token = reply->devtools_main_frame_token; + + auto main_frame_params = mojom::CreateLocalMainFrameParams::New(); + main_frame_params->token = reply->main_frame_token; + main_frame_params->routing_id = reply->main_frame_route_id; + main_frame_params->frame = std::move(reply->frame); + main_frame_params->interface_broker = + std::move(reply->main_frame_interface_broker); + main_frame_params->policy_container = std::move(reply->policy_container); + main_frame_params->associated_interface_provider_remote = + std::move(reply->associated_interface_provider); + main_frame_params->widget_params = std::move(reply->widget_params); + main_frame_params->subresource_loader_factories = + base::WrapUnique(static_cast<blink::PendingURLLoaderFactoryBundle*>( + CloneLoaderFactories()->Clone().release())); + + view_params->main_frame = + mojom::CreateMainFrameUnion::NewLocalParams(std::move(main_frame_params)); + view_params->blink_page_broadcast = std::move(reply->page_broadcast); + view_params->session_storage_namespace_id = + reply->cloned_session_storage_namespace_id; + DCHECK(!view_params->session_storage_namespace_id.empty()) + << "Session storage namespace must be populated."; + view_params->hidden = is_background_tab; + view_params->never_composited = never_composited; + + WebView* web_view = + agent_scheduling_group_.CreateWebView(std::move(view_params), + /*was_created_by_renderer=*/true); + + if (reply->wait_for_debugger) { + blink::WebFrameWidget* frame_widget = + web_view->MainFrame()->ToWebLocalFrame()->LocalRoot()->FrameWidget(); + frame_widget->WaitForDebuggerWhenShown(); + } + + return web_view; +} + } // namespace content
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 7a7a9f7..06fd7fd8 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -616,6 +616,17 @@ void OnStopLoading() override; void DraggableRegionsChanged() override; blink::BrowserInterfaceBrokerProxy* GetBrowserInterfaceBroker() override; + blink::WebView* CreateNewWindow( + const blink::WebURLRequest& request, + const blink::WebWindowFeatures& features, + const blink::WebString& frame_name, + blink::WebNavigationPolicy policy, + network::mojom::WebSandboxFlags sandbox_flags, + const blink::SessionStorageNamespaceId& session_storage_namespace_id, + bool& consumed_user_gesture, + const absl::optional<blink::Impression>& impression, + const absl::optional<blink::WebPictureInPictureWindowOptions>& + pip_options) override; // Dispatches the current state of selection on the webpage to the browser if // it has changed or if the forced flag is passed. The forced flag is used
diff --git a/content/renderer/render_thread_impl_discardable_memory_browsertest.cc b/content/renderer/render_thread_impl_discardable_memory_browsertest.cc index c096a41..5f15087 100644 --- a/content/renderer/render_thread_impl_discardable_memory_browsertest.cc +++ b/content/renderer/render_thread_impl_discardable_memory_browsertest.cc
@@ -92,8 +92,14 @@ base::DiscardableMemoryAllocator* discardable_memory_allocator_; }; +// Flaky. http://crbug.com/1350563 +#if defined(THREAD_SANITIZER) +#define MAYBE_LockDiscardableMemory DISABLED_LockDiscardableMemory +#else +#define MAYBE_LockDiscardableMemory LockDiscardableMemory +#endif IN_PROC_BROWSER_TEST_F(RenderThreadImplDiscardableMemoryBrowserTest, - LockDiscardableMemory) { + MAYBE_LockDiscardableMemory) { const size_t kSize = 1024 * 1024; // 1MiB. std::unique_ptr<base::DiscardableMemory> memory = @@ -148,8 +154,14 @@ } #endif +// Flaky. http://crbug.com/1350563 +#if defined(THREAD_SANITIZER) +#define MAYBE_ReleaseFreeDiscardableMemory DISABLED_ReleaseFreeDiscardableMemory +#else +#define MAYBE_ReleaseFreeDiscardableMemory ReleaseFreeDiscardableMemory +#endif IN_PROC_BROWSER_TEST_F(RenderThreadImplDiscardableMemoryBrowserTest, - ReleaseFreeDiscardableMemory) { + MAYBE_ReleaseFreeDiscardableMemory) { const size_t kSize = 1024 * 1024; // 1MiB. base::DiscardableMemoryBacking impl = base::GetDiscardableMemoryBacking(); @@ -208,8 +220,14 @@ EXPECT_EQ(0U, discardable_memory_allocator()->GetBytesAllocated()); } +// Flaky. http://crbug.com/1350563 +#if defined(THREAD_SANITIZER) +#define MAYBE_CheckReleaseMemory DISABLED_CheckReleaseMemory +#else +#define MAYBE_CheckReleaseMemory CheckReleaseMemory +#endif IN_PROC_BROWSER_TEST_F(RenderThreadImplDiscardableMemoryBrowserTest, - CheckReleaseMemory) { + MAYBE_CheckReleaseMemory) { std::vector<std::unique_ptr<base::DiscardableMemory>> all_memory; auto* allocator = static_cast<discardable_memory::ClientDiscardableSharedMemoryManager*>(
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index 76613d8..84a8b71 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -51,7 +51,6 @@ #include "content/renderer/document_state.h" #include "content/renderer/navigation_state.h" #include "content/renderer/render_process.h" -#include "content/renderer/render_view_impl.h" #include "content/renderer/service_worker/service_worker_network_provider_for_frame.h" #include "content/shell/browser/shell.h" #include "content/shell/browser/shell_browser_context.h" @@ -78,6 +77,7 @@ #include "third_party/blink/public/common/widget/device_emulation_params.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom.h" #include "third_party/blink/public/mojom/frame/tree_scope_type.mojom.h" #include "third_party/blink/public/mojom/loader/request_context_frame_type.mojom.h" #include "third_party/blink/public/platform/modules/service_worker/web_service_worker_network_provider.h" @@ -99,6 +99,7 @@ #include "third_party/blink/public/web/web_origin_trials.h" #include "third_party/blink/public/web/web_page_popup.h" #include "third_party/blink/public/web/web_performance.h" +#include "third_party/blink/public/web/web_picture_in_picture_window_options.h" #include "third_party/blink/public/web/web_remote_frame.h" #include "third_party/blink/public/web/web_script_source.h" #include "third_party/blink/public/web/web_settings.h" @@ -976,8 +977,8 @@ popup_request.SetMode(network::mojom::RequestMode::kNavigate); popup_request.SetRedirectMode(network::mojom::RedirectMode::kManual); popup_request.SetRequestContext(blink::mojom::RequestContextType::INTERNAL); - blink::WebView* new_web_view = web_view_->Client()->CreateView( - GetMainFrame(), popup_request, blink::WebWindowFeatures(), "foo", + blink::WebView* new_web_view = frame()->CreateNewWindow( + popup_request, blink::WebWindowFeatures(), "foo", blink::kWebNavigationPolicyNewForegroundTab, network::mojom::WebSandboxFlags::kNone, blink::AllocateSessionStorageNamespaceId(), consumed_user_gesture,
diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc deleted file mode 100644 index f99a5a0..0000000 --- a/content/renderer/render_view_impl.cc +++ /dev/null
@@ -1,378 +0,0 @@ -// Copyright (c) 2012 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 "content/renderer/render_view_impl.h" - -#include <map> -#include <memory> - -#include "base/bind.h" -#include "base/command_line.h" -#include "base/feature_list.h" -#include "base/lazy_instance.h" -#include "base/location.h" -#include "base/memory/ptr_util.h" -#include "base/strings/string_piece.h" -#include "base/task/single_thread_task_runner.h" -#include "build/build_config.h" -#include "cc/trees/ukm_manager.h" -#include "content/common/agent_scheduling_group.mojom.h" -#include "content/public/common/content_client.h" -#include "content/public/common/content_constants.h" -#include "content/public/common/content_features.h" -#include "content/public/common/content_switches.h" -#include "content/public/renderer/content_renderer_client.h" -#include "content/public/renderer/render_thread.h" -#include "content/public/renderer/window_features_converter.h" -#include "content/renderer/agent_scheduling_group.h" -#include "content/renderer/render_frame_impl.h" -#include "third_party/blink/public/mojom/page/page.mojom.h" -#include "third_party/blink/public/platform/modules/video_capture/web_video_capture_impl_manager.h" -#include "third_party/blink/public/platform/url_conversion.h" -#include "third_party/blink/public/platform/web_url_request_util.h" -#include "third_party/blink/public/web/modules/mediastream/web_media_stream_device_observer.h" -#include "third_party/blink/public/web/web_frame_widget.h" -#include "third_party/blink/public/web/web_local_frame.h" -#include "third_party/blink/public/web/web_page_popup.h" -#include "third_party/blink/public/web/web_remote_frame.h" -#include "third_party/blink/public/web/web_view.h" -#include "third_party/blink/public/web/web_window_features.h" -#include "ui/base/ui_base_features.h" - -using blink::WebFrame; -using blink::WebLocalFrame; -using blink::WebNavigationPolicy; -using blink::WebString; -using blink::WebURLRequest; -using blink::WebView; -using blink::WebWindowFeatures; - -namespace content { - -// static -WindowOpenDisposition RenderViewImpl::NavigationPolicyToDisposition( - WebNavigationPolicy policy) { - switch (policy) { - case blink::kWebNavigationPolicyDownload: - return WindowOpenDisposition::SAVE_TO_DISK; - case blink::kWebNavigationPolicyCurrentTab: - return WindowOpenDisposition::CURRENT_TAB; - case blink::kWebNavigationPolicyNewBackgroundTab: - return WindowOpenDisposition::NEW_BACKGROUND_TAB; - case blink::kWebNavigationPolicyNewForegroundTab: - return WindowOpenDisposition::NEW_FOREGROUND_TAB; - case blink::kWebNavigationPolicyNewWindow: - return WindowOpenDisposition::NEW_WINDOW; - case blink::kWebNavigationPolicyNewPopup: - case blink::kWebNavigationPolicyPictureInPicture: - return WindowOpenDisposition::NEW_POPUP; - default: - NOTREACHED() << "Unexpected WebNavigationPolicy"; - return WindowOpenDisposition::IGNORE_ACTION; - } -} - -/////////////////////////////////////////////////////////////////////////////// - -namespace { - -content::mojom::WindowContainerType WindowFeaturesToContainerType( - const blink::WebWindowFeatures& window_features) { - if (window_features.background) { - if (window_features.persistent) - return content::mojom::WindowContainerType::PERSISTENT; - else - return content::mojom::WindowContainerType::BACKGROUND; - } else { - return content::mojom::WindowContainerType::NORMAL; - } -} - -} // namespace - -RenderViewImpl::RenderViewImpl(AgentSchedulingGroup& agent_scheduling_group, - const mojom::CreateViewParams& params) - : agent_scheduling_group_(agent_scheduling_group) { - // Please put all logic in RenderViewImpl::Initialize(). -} - -void RenderViewImpl::Initialize( - mojom::CreateViewParamsPtr params, - bool was_created_by_renderer, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) { - DCHECK(RenderThread::IsMainThread()); - - WebFrame* opener_frame = nullptr; - if (params->opener_frame_token) - opener_frame = WebFrame::FromFrameToken(params->opener_frame_token.value()); - - // The newly created webview_ is owned by this instance. - webview_ = WebView::Create( - this, params->hidden, params->is_prerendering, - params->type == mojom::ViewWidgetType::kPortal ? true : false, - params->type == mojom::ViewWidgetType::kFencedFrame - ? params->fenced_frame_mode - : static_cast<absl::optional<blink::mojom::FencedFrameMode>>( - absl::nullopt), - /*compositing_enabled=*/true, params->never_composited, - opener_frame ? opener_frame->View() : nullptr, - std::move(params->blink_page_broadcast), - agent_scheduling_group_.agent_group_scheduler(), - params->session_storage_namespace_id, params->base_background_color); - - bool local_main_frame = params->main_frame->is_local_params(); - - webview_->SetRendererPreferences(params->renderer_preferences); - webview_->SetWebPreferences(params->web_preferences); - - if (local_main_frame) { - RenderFrameImpl::CreateMainFrame( - agent_scheduling_group_, webview_, opener_frame, - /*is_for_nested_main_frame=*/params->type != - mojom::ViewWidgetType::kTopLevel, - /*is_for_scalable_page=*/params->type != - mojom::ViewWidgetType::kFencedFrame, - std::move(params->replication_state), params->devtools_main_frame_token, - std::move(params->main_frame->get_local_params())); - } else { - blink::WebRemoteFrame::CreateMainFrame( - webview_, params->main_frame->get_remote_params()->token, - params->devtools_main_frame_token, opener_frame, - std::move(params->main_frame->get_remote_params() - ->frame_interfaces->frame_host), - std::move(params->main_frame->get_remote_params() - ->frame_interfaces->frame_receiver), - std::move(params->replication_state)); - // Root frame proxy has no ancestors to point to their RenderWidget. - - // The WebRemoteFrame created here was already attached to the Page as its - // main frame, so we can call WebView's DidAttachRemoteMainFrame(). - webview_->DidAttachRemoteMainFrame( - std::move(params->main_frame->get_remote_params() - ->main_frame_interfaces->main_frame_host), - std::move(params->main_frame->get_remote_params() - ->main_frame_interfaces->main_frame)); - } - - // TODO(davidben): Move this state from Blink into content. - if (params->window_was_opened_by_another_window) - GetWebView()->SetOpenedByDOM(); - - GetContentClient()->renderer()->WebViewCreated(webview_, - was_created_by_renderer); -} - -RenderViewImpl::~RenderViewImpl() = default; - -/*static*/ -RenderViewImpl* RenderViewImpl::Create( - AgentSchedulingGroup& agent_scheduling_group, - mojom::CreateViewParamsPtr params, - bool was_created_by_renderer, - scoped_refptr<base::SingleThreadTaskRunner> task_runner) { - DCHECK(!params->session_storage_namespace_id.empty()) - << "Session storage namespace must be populated."; - - RenderViewImpl* render_view = - new RenderViewImpl(agent_scheduling_group, *params); - render_view->Initialize(std::move(params), was_created_by_renderer, - std::move(task_runner)); - return render_view; -} - -// blink::WebViewClient ------------------------------------------------------ - -void RenderViewImpl::OnDestruct() { - delete this; -} - -// TODO(csharrison): Migrate this method to WebLocalFrameClient / -// RenderFrameImpl, as it is now serviced by a mojo interface scoped to the -// opener frame. -WebView* RenderViewImpl::CreateView( - WebLocalFrame* creator, - const WebURLRequest& request, - const WebWindowFeatures& features, - const WebString& frame_name, - WebNavigationPolicy policy, - network::mojom::WebSandboxFlags sandbox_flags, - const blink::SessionStorageNamespaceId& session_storage_namespace_id, - bool& consumed_user_gesture, - const absl::optional<blink::Impression>& impression, - const absl::optional<blink::WebPictureInPictureWindowOptions>& - pip_options) { - consumed_user_gesture = false; - RenderFrameImpl* creator_frame = RenderFrameImpl::FromWebFrame(creator); - mojom::CreateNewWindowParamsPtr params = mojom::CreateNewWindowParams::New(); - - // The user activation check is done at the browser process through - // |frame_host->CreateNewWindow()| call below. But the extensions case - // handled through the following |if| is an exception. - params->allow_popup = false; - if (GetContentClient()->renderer()->AllowPopup()) - params->allow_popup = true; - - params->window_container_type = WindowFeaturesToContainerType(features); - - params->session_storage_namespace_id = session_storage_namespace_id; - if (!features.noopener) { - params->clone_from_session_storage_namespace_id = - GetWebView()->GetSessionStorageNamespaceId(); - } - - const std::string& frame_name_utf8 = frame_name.Utf8( - WebString::UTF8ConversionMode::kStrictReplacingErrorsWithFFFD); - params->frame_name = frame_name_utf8; - params->opener_suppressed = features.noopener; - params->disposition = NavigationPolicyToDisposition(policy); - if (!request.IsNull()) { - params->target_url = request.Url(); - params->referrer = blink::mojom::Referrer::New( - blink::WebStringToGURL(request.ReferrerString()), - request.GetReferrerPolicy()); - } - params->features = ConvertWebWindowFeaturesToMojoWindowFeatures(features); - - params->is_form_submission = request.IsFormSubmission(); - params->form_submission_post_data = - blink::GetRequestBodyForWebURLRequest(request); - params->form_submission_post_content_type = request.HttpContentType().Utf8(); - - params->impression = impression; - - if (pip_options) { - CHECK_EQ(policy, blink::kWebNavigationPolicyPictureInPicture); - auto pip_mojom_opts = blink::mojom::PictureInPictureWindowOptions::New(); - pip_mojom_opts->initial_aspect_ratio = pip_options->initial_aspect_ratio; - pip_mojom_opts->lock_aspect_ratio = pip_options->lock_aspect_ratio; - params->pip_options = std::move(pip_mojom_opts); - } - - params->download_policy.ApplyDownloadFramePolicy( - /*is_opener_navigation=*/false, request.HasUserGesture(), - // `openee_can_access_opener_origin` only matters for opener navigations, - // so its value here is irrelevant. - /*openee_can_access_opener_origin=*/true, !creator->IsAllowedToDownload(), - creator->IsAdFrame()); - - // We preserve this information before sending the message since |params| is - // moved on send. - bool is_background_tab = - params->disposition == WindowOpenDisposition::NEW_BACKGROUND_TAB; - - mojom::CreateNewWindowStatus status; - mojom::CreateNewWindowReplyPtr reply; - auto* frame_host = creator_frame->GetFrameHost(); - if (!frame_host->CreateNewWindow(std::move(params), &status, &reply)) { - // The sync IPC failed, e.g. maybe the render process is in the middle of - // shutting down. Can't create a new window without the browser process, - // so just bail out. - return nullptr; - } - - // If creation of the window was blocked (e.g. because this frame doesn't - // have user activation), return before consuming user activation. A frame - // that isn't allowed to open a window shouldn't be able to consume the - // activation for the rest of the frame tree. - if (status == mojom::CreateNewWindowStatus::kBlocked) - return nullptr; - - // For Android WebView, we support a pop-up like behavior for window.open() - // even if the embedding app doesn't support multiple windows. In this case, - // window.open() will return "window" and navigate it to whatever URL was - // passed. We also don't need to consume user gestures to protect against - // multiple windows being opened, because, well, the app doesn't support - // multiple windows. - // TODO(dcheng): It's awkward that this is plumbed into Blink but not really - // used much in Blink, except to enable web testing... perhaps this should - // be checked directly in the browser side. - if (status == mojom::CreateNewWindowStatus::kReuse) - return GetWebView(); - - // Consume the transient user activation in the current renderer. - consumed_user_gesture = creator->ConsumeTransientUserActivation( - blink::UserActivationUpdateSource::kBrowser); - - // If we should ignore the new window (e.g. because of `noopener`), return - // now that user activation was consumed. - if (status == mojom::CreateNewWindowStatus::kIgnore) - return nullptr; - - DCHECK(reply); - DCHECK_NE(MSG_ROUTING_NONE, reply->main_frame_route_id); - DCHECK_NE(MSG_ROUTING_NONE, reply->widget_params->routing_id); - - // While this view may be a background extension page, it can spawn a visible - // render view. So we just assume that the new one is not another background - // page instead of passing on our own value. - // TODO(vangelis): Can we tell if the new view will be a background page? - bool never_composited = false; - - // The initial hidden state for the RenderViewImpl here has to match what the - // browser will eventually decide for the given disposition. Since we have to - // return from this call synchronously, we just have to make our best guess - // and rely on the browser sending a WasHidden / WasShown message if it - // disagrees. - mojom::CreateViewParamsPtr view_params = mojom::CreateViewParams::New(); - - view_params->opener_frame_token = creator->GetFrameToken(); - DCHECK_EQ(GetWebView(), creator->View()); - - view_params->window_was_opened_by_another_window = true; - view_params->renderer_preferences = webview_->GetRendererPreferences(); - view_params->web_preferences = webview_->GetWebPreferences(); - - view_params->replication_state = blink::mojom::FrameReplicationState::New(); - view_params->replication_state->frame_policy.sandbox_flags = sandbox_flags; - view_params->replication_state->name = frame_name_utf8; - view_params->devtools_main_frame_token = reply->devtools_main_frame_token; - - auto main_frame_params = mojom::CreateLocalMainFrameParams::New(); - main_frame_params->token = reply->main_frame_token; - main_frame_params->routing_id = reply->main_frame_route_id; - main_frame_params->frame = std::move(reply->frame); - main_frame_params->interface_broker = - std::move(reply->main_frame_interface_broker); - main_frame_params->policy_container = std::move(reply->policy_container); - main_frame_params->associated_interface_provider_remote = - std::move(reply->associated_interface_provider); - main_frame_params->widget_params = std::move(reply->widget_params); - main_frame_params->subresource_loader_factories = - base::WrapUnique(static_cast<blink::PendingURLLoaderFactoryBundle*>( - creator_frame->CloneLoaderFactories()->Clone().release())); - - view_params->main_frame = - mojom::CreateMainFrameUnion::NewLocalParams(std::move(main_frame_params)); - view_params->blink_page_broadcast = std::move(reply->page_broadcast); - view_params->session_storage_namespace_id = - reply->cloned_session_storage_namespace_id; - DCHECK(!view_params->session_storage_namespace_id.empty()) - << "Session storage namespace must be populated."; - view_params->hidden = is_background_tab; - view_params->never_composited = never_composited; - - RenderViewImpl* view = RenderViewImpl::Create( - agent_scheduling_group_, std::move(view_params), - /*was_created_by_renderer=*/true, - creator->GetTaskRunner(blink::TaskType::kInternalDefault)); - - if (reply->wait_for_debugger) { - blink::WebFrameWidget* frame_widget = view->GetWebView() - ->MainFrame() - ->ToWebLocalFrame() - ->LocalRoot() - ->FrameWidget(); - frame_widget->WaitForDebuggerWhenShown(); - } - - return view->GetWebView(); -} - -// RenderView implementation --------------------------------------------------- - -blink::WebView* RenderViewImpl::GetWebView() { - return webview_; -} - -} // namespace content
diff --git a/content/renderer/render_view_impl.h b/content/renderer/render_view_impl.h deleted file mode 100644 index 6a3cba8..0000000 --- a/content/renderer/render_view_impl.h +++ /dev/null
@@ -1,166 +0,0 @@ -// Copyright (c) 2012 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 CONTENT_RENDERER_RENDER_VIEW_IMPL_H_ -#define CONTENT_RENDERER_RENDER_VIEW_IMPL_H_ - -#include <stddef.h> -#include <stdint.h> - -#include "base/containers/id_map.h" -#include "base/gtest_prod_util.h" -#include "base/process/process.h" -#include "base/strings/string_piece.h" -#include "base/task/single_thread_task_runner.h" -#include "base/timer/timer.h" -#include "build/build_config.h" -#include "content/common/content_export.h" -#include "content/common/frame.mojom-forward.h" -#include "content/public/common/drop_data.h" -#include "content/public/common/page_visibility_state.h" -#include "content/public/common/page_zoom.h" -#include "content/public/common/referrer.h" -#include "ipc/ipc_platform_file.h" -#include "mojo/public/cpp/bindings/pending_remote.h" -#include "mojo/public/cpp/bindings/remote_set.h" -#include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h" -#include "third_party/blink/public/common/input/web_input_event.h" -#include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h" -#include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" -#include "third_party/blink/public/common/web_preferences/web_preferences.h" -#include "third_party/blink/public/mojom/renderer_preference_watcher.mojom.h" -#include "third_party/blink/public/platform/web_security_origin.h" -#include "third_party/blink/public/web/web_ax_object.h" -#include "third_party/blink/public/web/web_console_message.h" -#include "third_party/blink/public/web/web_element.h" -#include "third_party/blink/public/web/web_history_item.h" -#include "third_party/blink/public/web/web_navigation_type.h" -#include "third_party/blink/public/web/web_node.h" -#include "third_party/blink/public/web/web_view_client.h" -#include "ui/base/window_open_disposition.h" -#include "ui/gfx/geometry/rect.h" -#include "ui/gfx/geometry/rect_f.h" -#include "ui/surface/transport_dib.h" - -namespace blink { -class WebURLRequest; -struct WebWindowFeatures; -} // namespace blink - -namespace content { -class AgentSchedulingGroup; -class RenderFrameImpl; -class RenderViewImplTest; -class RenderViewTest; - -namespace mojom { -class CreateViewParams; -} - -// RenderViewImpl is the renderer process object that owns the blink frame tree. -// -// Each top-level web container has a frame tree, and thus a RenderViewImpl. -// Typically such a container is a browser tab, or a tab-less window. It can -// also be other cases such as a background page or extension. -// -// Under site isolation, frames in the main frame's tree may be moved out -// to a separate frame tree (possibly in another process), leaving remote -// placeholders behind. Each such frame tree also includes a RenderViewImpl as -// the owner of it. Thus a tab may have multiple RenderViewImpls, one for the -// main frame, and one for each other frame tree generated. -class CONTENT_EXPORT RenderViewImpl : public blink::WebViewClient { - public: - // Creates a new RenderView. Note that if the original opener has been closed, - // |params.window_was_created_with_opener| will be true and - // |params.opener_frame_route_id| will be MSG_ROUTING_NONE. - // When |params.proxy_routing_id| instead of |params.main_frame_routing_id| is - // specified, a RenderFrameProxy will be created for this RenderViewImpl's - // main RenderFrame. The opener should provide a non-null value for - // |show_callback| if it needs to send an additional IPC to finish making this - // view visible. - static RenderViewImpl* Create( - AgentSchedulingGroup& agent_scheduling_group, - mojom::CreateViewParamsPtr params, - bool was_created_by_renderer, - scoped_refptr<base::SingleThreadTaskRunner> task_runner); - - RenderViewImpl(const RenderViewImpl&) = delete; - RenderViewImpl& operator=(const RenderViewImpl&) = delete; - - // blink::WebViewClient implementation -------------------------------------- - - blink::WebView* CreateView( - blink::WebLocalFrame* creator, - const blink::WebURLRequest& request, - const blink::WebWindowFeatures& features, - const blink::WebString& frame_name, - blink::WebNavigationPolicy policy, - network::mojom::WebSandboxFlags sandbox_flags, - const blink::SessionStorageNamespaceId& session_storage_namespace_id, - bool& consumed_user_gesture, - const absl::optional<blink::Impression>& impression, - const absl::optional<blink::WebPictureInPictureWindowOptions>& - pip_options) override; - void OnDestruct() override; - - blink::WebView* GetWebView(); - - // Please do not add your stuff randomly to the end here. If there is an - // appropriate section, add it there. If not, there are some random functions - // nearer to the top you can add it to. - - private: - // For unit tests. - friend class RenderViewImplTest; - friend class RenderViewTest; - - // TODO(nasko): Temporarily friend RenderFrameImpl, so we don't duplicate - // utility functions needed in both classes, while we move frame specific - // code away from this class. - friend class RenderFrameImpl; - - RenderViewImpl(AgentSchedulingGroup& agent_scheduling_group, - const mojom::CreateViewParams& params); - ~RenderViewImpl() override; - - // Initialize() is separated out from the constructor because it is possible - // to accidentally call virtual functions. All RenderViewImpl creation is - // fronted by the Create() method which ensures Initialize() is always called - // before any other code can interact with instances of this call. - void Initialize(mojom::CreateViewParamsPtr params, - bool was_created_by_renderer, - scoped_refptr<base::SingleThreadTaskRunner> task_runner); - - static WindowOpenDisposition NavigationPolicyToDisposition( - blink::WebNavigationPolicy policy); - - // --------------------------------------------------------------------------- - // ADDING NEW FUNCTIONS? Please keep private functions alphabetized and put - // it in the same order in the .cc file as it was in the header. - // --------------------------------------------------------------------------- - - // View ---------------------------------------------------------------------- - - // This class owns this member, and is responsible for calling - // WebView::Close(). - blink::WebView* webview_ = nullptr; - - // Helper objects ------------------------------------------------------------ - - // The `AgentSchedulingGroup` this view is associated with. - AgentSchedulingGroup& agent_scheduling_group_; - - // --------------------------------------------------------------------------- - // ADDING NEW DATA? Please see if it fits appropriately in one of the above - // sections rather than throwing it randomly at the end. If you're adding a - // bunch of stuff, you should probably create a helper class and put your - // data and methods on that to avoid bloating RenderViewImpl more. You can - // use the Observer interface to filter IPC messages and receive frame change - // notifications. - // --------------------------------------------------------------------------- -}; - -} // namespace content - -#endif // CONTENT_RENDERER_RENDER_VIEW_IMPL_H_
diff --git a/content/shell/browser/shell_browser_context.cc b/content/shell/browser/shell_browser_context.cc index 1ddd8c9..510a944 100644 --- a/content/shell/browser/shell_browser_context.cc +++ b/content/shell/browser/shell_browser_context.cc
@@ -87,6 +87,8 @@ path_ = base::MakeAbsoluteFilePath(path_); if (!path_.empty()) { FinishInitWhileIOAllowed(); + base::PathService::OverrideAndCreateIfNeeded( + SHELL_DIR_USER_DATA, path_, /*is_absolute=*/true, /*create=*/false); return; } } else {
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 6c5d0bb..e00d9af 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -1555,7 +1555,6 @@ "//components/web_package", "//components/web_package/test_support", "//content/app:for_content_tests", - "//content/browser:buildflags", "//content/browser:for_content_tests", "//content/browser/attribution_reporting:attribution_reporting_proto", "//content/browser/background_sync:background_sync_proto",
diff --git a/content/test/attribution_simulator_input_parser.cc b/content/test/attribution_simulator_input_parser.cc index 775c564..c78945b 100644 --- a/content/test/attribution_simulator_input_parser.cc +++ b/content/test/attribution_simulator_input_parser.cc
@@ -259,7 +259,8 @@ if (!ParseAttributionEvent( source_dict, "Attribution-Reporting-Register-Source", base::BindLambdaForTesting([&](const base::Value::Dict& dict) { - source_event_id = ParseRequiredUint64(dict, "source_event_id"); + source_event_id = + ParseOptionalUint64(dict, "source_event_id").value_or(0); destination_origin = ParseOrigin(dict, "destination"); debug_key = ParseOptionalUint64(dict, "debug_key"); priority = ParseOptionalInt64(dict, "priority").value_or(0); @@ -446,11 +447,6 @@ return value; } - uint64_t ParseRequiredUint64(const base::Value::Dict& dict, - base::StringPiece key) { - return ParseUint64(dict.FindString(key), key); - } - absl::optional<uint64_t> ParseOptionalUint64(const base::Value::Dict& dict, base::StringPiece key) { const base::Value* value = dict.Find(key);
diff --git a/content/test/attribution_simulator_input_parser_unittest.cc b/content/test/attribution_simulator_input_parser_unittest.cc index f9ed13a..463f7ad5 100644 --- a/content/test/attribution_simulator_input_parser_unittest.cc +++ b/content/test/attribution_simulator_input_parser_unittest.cc
@@ -131,7 +131,6 @@ "reporting_origin": "https://b.r.test", "source_origin": "https://b.s.test", "Attribution-Reporting-Register-Source": { - "source_event_id": "456", "destination": "https://b.d.test" } }, @@ -192,7 +191,7 @@ url::Origin::Create(GURL("https://b.r.test"))) .SetImpressionOrigin( url::Origin::Create(GURL("https://b.s.test"))) - .SetSourceEventId(456) + .SetSourceEventId(0) // default .SetConversionOrigin( url::Origin::Create(GURL("https://b.d.test"))) .SetExpiry(base::Days(30)) // default @@ -713,18 +712,6 @@ }]})json", }, { - R"(["sources"][0]["Attribution-Reporting-Register-Source"]["source_event_id"]: must be a uint64 formatted)", - R"json({"sources": [{ - "timestamp": "1643235574000", - "source_type": "navigation", - "reporting_origin": "https://a.r.test", - "source_origin": "https://a.s.test", - "Attribution-Reporting-Register-Source": { - "destination": "https://a.d.test" - } - }]})json", - }, - { R"(["sources"][0]["Attribution-Reporting-Register-Source"]["destination"]: must be a valid, secure origin)", R"json({"sources": [{ "timestamp": "1643235574000",
diff --git a/content/test/data/attribution_reporting/simulator/README.md b/content/test/data/attribution_reporting/simulator/README.md index fb61706..16e08ce 100644 --- a/content/test/data/attribution_reporting/simulator/README.md +++ b/content/test/data/attribution_reporting/simulator/README.md
@@ -22,7 +22,7 @@ // Required dictionary data to register a source. "Attribution-Reporting-Register-Source": { - // Required uint64 formatted as a base-10 string. + // Optional uint64 formatted as a base-10 string. Defaults to 0. "source_event_id": "123456789", // Required site on which the source will be attributed.
diff --git a/content/test/data/gpu/pixel_webgpu_canvas_capture_to_video.html b/content/test/data/gpu/pixel_webgpu_canvas_capture_to_video.html index 8137e31..cd01397d 100644 --- a/content/test/data/gpu/pixel_webgpu_canvas_capture_to_video.html +++ b/content/test/data/gpu/pixel_webgpu_canvas_capture_to_video.html
@@ -13,9 +13,16 @@ var g_swapsBeforeAck = 15; var g_videoFrameReceived = false; + const parsedString = new URLSearchParams(window.location.search); + async function main() { + const has_alpha_string = parsedString.get('has_alpha'); + + has_alpha = (has_alpha_string != null) ? + has_alpha_string == 'true' : false; + const gpuCanvas = document.getElementById('canvas_gpu'); - const [device, swapChain] = await webGpuUtils.init(gpuCanvas, /*has_alpha=*/false); + const [device, swapChain] = await webGpuUtils.init(gpuCanvas, /*has_alpha=*/has_alpha); if (!device || !swapChain) { console.error("Failed to initialize WebGPU - skipping test"); domAutomationController.send("FAILURE");
diff --git a/content/test/gpu/gpu_tests/pixel_test_pages.py b/content/test/gpu/gpu_tests/pixel_test_pages.py index 6fb57a0..1afe471 100644 --- a/content/test/gpu/gpu_tests/pixel_test_pages.py +++ b/content/test/gpu/gpu_tests/pixel_test_pages.py
@@ -501,25 +501,43 @@ browser_args_canvas_disable_one_copy_capture = webgpu_args + [ '--disable-features=OneCopyCanvasCapture' ] - other_args_canvas_disable_one_copy_capture = {'one_copy': False} + other_args_canvas_accelerated_two_copy = { + 'one_copy': False, + 'accelerated_two_copy': True + } + other_args_canvas_cpu_two_copy = { + 'one_copy': False, + 'accelerated_two_copy': False + } # Setting grace_period_end to monitor the affects on bots for 2 weeks # without making the bots red unexpectedly. return [ + # Enabled OneCopyCapture PixelTestPage('pixel_webgpu_canvas_capture_to_video.html', base_name + '_WebGPUCanvasOneCopyCapture', test_rect=[0, 0, 400, 200], matching_algorithm=GENERAL_MP4_ALGO, browser_args=browser_args_canvas_one_copy_capture, - other_args=other_args_canvas_one_copy_capture, - grace_period_end=date(2022, 7, 30)), - PixelTestPage('pixel_webgpu_canvas_capture_to_video.html', - base_name + '_WebGPUCanvasDisableOneCopyCapture', - test_rect=[0, 0, 400, 200], - matching_algorithm=GENERAL_MP4_ALGO, - browser_args=browser_args_canvas_disable_one_copy_capture, - other_args=other_args_canvas_disable_one_copy_capture, - grace_period_end=date(2022, 7, 30)), + other_args=other_args_canvas_one_copy_capture), + # Disabled OneCopyCapture + canvas is opaque + PixelTestPage( + 'pixel_webgpu_canvas_capture_to_video.html?has_alpha=false', + base_name + '_WebGPUCanvasDisableOneCopyCapture_Accelerated', + test_rect=[0, 0, 400, 200], + matching_algorithm=GENERAL_MP4_ALGO, + browser_args=browser_args_canvas_disable_one_copy_capture, + other_args=other_args_canvas_accelerated_two_copy, + grace_period_end=date(2022, 8, 30)), + # Disabled OneCopyCapture + canvas has alpha + PixelTestPage( + 'pixel_webgpu_canvas_capture_to_video.html?has_alpha=true', + base_name + '_WebGPUCanvasDisableOneCopyCapture_CpuReadback', + test_rect=[0, 0, 400, 200], + matching_algorithm=GENERAL_MP4_ALGO, + browser_args=browser_args_canvas_disable_one_copy_capture, + other_args=other_args_canvas_cpu_two_copy, + grace_period_end=date(2022, 8, 30)), ]
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 89c18eb4..f2776f3c 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -220,7 +220,7 @@ # WebGPU canvas capture hang on mac ASAN bot (also see crbug.com/1213170) crbug.com/1345767 [ mac asan ] Pixel_WebGPUCanvasOneCopyCapture [ Skip ] -crbug.com/1345767 [ mac asan ] Pixel_WebGPUCanvasDisableOneCopyCapture [ Skip ] +crbug.com/1345767 [ mac asan ] Pixel_WebGPUCanvasDisableOneCopyCapture* [ Skip ] ################### # Failures/Flakes #
diff --git a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt index 8d596ab..e84a36b 100644 --- a/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/trace_test_expectations.txt
@@ -126,7 +126,7 @@ # WebGPU canvas capture hang on mac ASAN bot (also see crbug.com/1213170) crbug.com/1345767 [ mac asan ] WebGPUTraceTest_WebGPUCanvasOneCopyCapture [ Skip ] -crbug.com/1345767 [ mac asan ] WebGPUTraceTest_WebGPUCanvasDisableOneCopyCapture [ Skip ] +crbug.com/1345767 [ mac asan ] WebGPUTraceTest_WebGPUCanvasDisableOneCopyCapture* [ Skip ] ############################### # Temporary Skip Expectations # @@ -201,9 +201,6 @@ crbug.com/852089 [ chromeos ] WebGPUTraceTest_* [ Skip ] crbug.com/852089 [ fuchsia ] WebGPUTraceTest_* [ Skip ] -# one copy feature is only supported on mac for now. -crbug.com/1298812 [ win ] WebGPUTraceTest_WebGPUCanvasOneCopyCapture [ Failure ] - ####################################################################### # Automated Entries After This Point - Do Not Manually Add Below Here # #######################################################################
diff --git a/content/test/gpu/gpu_tests/trace_integration_test.py b/content/test/gpu/gpu_tests/trace_integration_test.py index 2e4cefa..bd6690ce6 100644 --- a/content/test/gpu/gpu_tests/trace_integration_test.py +++ b/content/test/gpu/gpu_tests/trace_integration_test.py
@@ -113,6 +113,9 @@ _HTML_CANVAS_NOTIFY_LISTENERS_CANVAS_CHANGED_EVENT_NAME =\ 'HTMLCanvasElement::NotifyListenersCanvasChanged' +_STATIC_BITMAP_TO_VID_FRAME_CONVERT_EVENT_NAME =\ + 'StaticBitmapImageToVideoFrameCopier::Convert' + class _TraceTestArguments(): """Struct-like object for passing trace test arguments instead of dicts.""" @@ -561,28 +564,49 @@ def _EvaluateSuccess_CheckWebGPUCanvasCapture(self, category: str, event_iterator: Iterator, other_args: dict) -> None: - expected_one_copy = other_args.get('one_copy', False) + expected_one_copy = other_args.get('one_copy', None) + expected_accelerated_two_copy = other_args.get('accelerated_two_copy', None) + if expected_one_copy and expected_accelerated_two_copy: + self.fail('one_copy and accelerated_two_copy are mutually exclusive') + found_one_copy_event = False + found_accelerated_two_copy_event = False # Verify expectations through captured trace events. for event in event_iterator: if event.category != category: continue - if event.name != _HTML_CANVAS_NOTIFY_LISTENERS_CANVAS_CHANGED_EVENT_NAME: - continue - detected_one_copy = event.args.get('OneCopyCanvasCapture', None) - if detected_one_copy is None: - detected_one_copy = False - else: - found_one_copy_event = True - if expected_one_copy != detected_one_copy: - self.fail('OneCopyCanvasCapture mismatch, expected %s got %s' % - (expected_one_copy, detected_one_copy)) + if (expected_one_copy is not None and event.name == + _HTML_CANVAS_NOTIFY_LISTENERS_CANVAS_CHANGED_EVENT_NAME): + detected_one_copy = event.args.get('one_copy_canvas_capture', None) - if expected_one_copy and found_one_copy_event is False: - self.fail('%s events with OneCopyCanvasCapture were not found' % + if detected_one_copy is not None: + found_one_copy_event = True + if expected_one_copy != detected_one_copy: + self.fail('one_copy_canvas_capture mismatch, expected %s got %s' % + (expected_one_copy, detected_one_copy)) + + elif (expected_accelerated_two_copy is not None + and event.name == _STATIC_BITMAP_TO_VID_FRAME_CONVERT_EVENT_NAME): + detected_accelerated_two_copy = event.args.get( + 'accelerated_frame_pool_copy', None) + + if detected_accelerated_two_copy is not None: + found_accelerated_two_copy_event = True + if expected_accelerated_two_copy != detected_accelerated_two_copy: + self.fail( + 'accelerated_frame_pool_copy mismatch, expected %s got %s' % + (expected_accelerated_two_copy, detected_accelerated_two_copy)) + + if expected_one_copy is not None and found_one_copy_event is False: + self.fail('%s events with one_copy_canvas_capture were not found' % _HTML_CANVAS_NOTIFY_LISTENERS_CANVAS_CHANGED_EVENT_NAME) + if (expected_accelerated_two_copy is not None + and found_accelerated_two_copy_event is False): + self.fail('%s events with accelerated_frame_pool_copy were not found' % + _STATIC_BITMAP_TO_VID_FRAME_CONVERT_EVENT_NAME) + @classmethod def ExpectationsFiles(cls) -> List[str]: return [
diff --git a/content/test/test_page_broadcast.cc b/content/test/test_page_broadcast.cc index eaf5a1e..6199648 100644 --- a/content/test/test_page_broadcast.cc +++ b/content/test/test_page_broadcast.cc
@@ -6,6 +6,7 @@ #include "third_party/blink/public/mojom/frame/frame.mojom.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom.h" namespace content {
diff --git a/crypto/BUILD.gn b/crypto/BUILD.gn index 44b0c8e..69594cb 100644 --- a/crypto/BUILD.gn +++ b/crypto/BUILD.gn
@@ -84,11 +84,6 @@ # target if possible. "mock_apple_keychain_mac.cc", ] - - # TODO(crbug.com/1348251) Disable SecKeychain is deprecated errors. - if (target_os == "ios") { - cflags = [ "-Wno-deprecated-declarations" ] - } } if (is_ios) { sources += [
diff --git a/crypto/apple_keychain_mac.cc b/crypto/apple_keychain_mac.cc index 2571641..58420a8 100644 --- a/crypto/apple_keychain_mac.cc +++ b/crypto/apple_keychain_mac.cc
@@ -41,6 +41,12 @@ } // namespace +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + namespace crypto { AppleKeychain::AppleKeychain() = default; @@ -109,4 +115,6 @@ } } +#pragma clang diagnostic pop + } // namespace crypto
diff --git a/dbus/property.h b/dbus/property.h index d4f85dd..1675e0e 100644 --- a/dbus/property.h +++ b/dbus/property.h
@@ -97,7 +97,7 @@ // // This now allows code using the client implementation to access properties // in a type-safe manner, and assuming the PropertyChanged callback is -// propogated up to observers, be notified of changes. A typical access of +// propagated up to observers, be notified of changes. A typical access of // the current value of the name property would be: // // ExampleClient::Properties* p = example_client->GetProperties(object_path);
diff --git a/docs/testing/web_tests.md b/docs/testing/web_tests.md index b489ed9..1589ac3 100644 --- a/docs/testing/web_tests.md +++ b/docs/testing/web_tests.md
@@ -59,8 +59,8 @@ The test runner script is in `third_party/blink/tools/run_web_tests.py`. To specify which build directory to use (e.g. out/Default, etc.) -you should pass the `-t` or `--target` parameter. For example, to -use the build in `out/Default`, use: +you should pass the `-t` or `--target` parameter. If no directory is specified, +`out/Release` will be used. To use the build in `out/Default`, use: ```bash third_party/blink/tools/run_web_tests.py -t Default
diff --git a/extensions/browser/extension_prefs.cc b/extensions/browser/extension_prefs.cc index f6d38b8..147e9fa 100644 --- a/extensions/browser/extension_prefs.cc +++ b/extensions/browser/extension_prefs.cc
@@ -782,7 +782,7 @@ return ReadPrefAsBoolean(extension_id, pref_key, &out_value) && out_value; } -std::unique_ptr<const PermissionSet> ExtensionPrefs::ReadPrefAsPermissionSet( +std::unique_ptr<PermissionSet> ExtensionPrefs::ReadPrefAsPermissionSet( const std::string& extension_id, base::StringPiece pref_key) const { if (!GetExtensionPref(extension_id)) @@ -882,9 +882,9 @@ const PermissionSet& permissions, const char* pref_name) { CHECK(crx_file::id_util::IdIsValid(extension_id)); - std::unique_ptr<const PermissionSet> current = + std::unique_ptr<PermissionSet> current = ReadPrefAsPermissionSet(extension_id, pref_name); - std::unique_ptr<const PermissionSet> union_set; + std::unique_ptr<PermissionSet> union_set; if (current) union_set = PermissionSet::CreateUnion(permissions, *current); // The new permissions are the union of the already stored permissions and the @@ -899,7 +899,7 @@ const char* pref_name) { CHECK(crx_file::id_util::IdIsValid(extension_id)); - std::unique_ptr<const PermissionSet> current = + std::unique_ptr<PermissionSet> current = ReadPrefAsPermissionSet(extension_id, pref_name); if (!current) @@ -1188,7 +1188,7 @@ std::make_unique<base::Value>(active)); } -std::unique_ptr<const PermissionSet> ExtensionPrefs::GetGrantedPermissions( +std::unique_ptr<PermissionSet> ExtensionPrefs::GetGrantedPermissions( const std::string& extension_id) const { CHECK(crx_file::id_util::IdIsValid(extension_id)); return ReadPrefAsPermissionSet(extension_id, kPrefGrantedPermissions); @@ -1206,8 +1206,7 @@ kPrefGrantedPermissions); } -std::unique_ptr<const PermissionSet> -ExtensionPrefs::GetDesiredActivePermissions( +std::unique_ptr<PermissionSet> ExtensionPrefs::GetDesiredActivePermissions( const std::string& extension_id) const { CHECK(crx_file::id_util::IdIsValid(extension_id)); return ReadPrefAsPermissionSet(extension_id, kPrefDesiredActivePermissions); @@ -1258,8 +1257,7 @@ return ext && ext->FindKey(kPrefWithholdingPermissions); } -std::unique_ptr<const PermissionSet> -ExtensionPrefs::GetRuntimeGrantedPermissions( +std::unique_ptr<PermissionSet> ExtensionPrefs::GetRuntimeGrantedPermissions( const ExtensionId& extension_id) const { CHECK(crx_file::id_util::IdIsValid(extension_id)); return ReadPrefAsPermissionSet(extension_id, kPrefRuntimeGrantedPermissions);
diff --git a/extensions/browser/extension_prefs.h b/extensions/browser/extension_prefs.h index 34cda2b..1fd512f 100644 --- a/extensions/browser/extension_prefs.h +++ b/extensions/browser/extension_prefs.h
@@ -463,7 +463,7 @@ // Returns the granted permission set for the extension with |extension_id|, // and NULL if no preferences were found for |extension_id|. // This passes ownership of the returned set to the caller. - std::unique_ptr<const PermissionSet> GetGrantedPermissions( + std::unique_ptr<PermissionSet> GetGrantedPermissions( const std::string& extension_id) const; // Adds |permissions| to the granted permissions set for the extension with @@ -484,7 +484,7 @@ // because the user may have withheld certain permissions, as well as because // of possible enterprise policy settings. Use `PermissionsData` to determine // the current effective permissions of an extension. - std::unique_ptr<const PermissionSet> GetDesiredActivePermissions( + std::unique_ptr<PermissionSet> GetDesiredActivePermissions( const std::string& extension_id) const; // Sets the desired active permissions for the given `extension_id` to @@ -514,7 +514,7 @@ // as those granted through the permissions API or the runtime host // permissions feature). Note that, similar to granted permissions, this can // include permissions granted to the extension, even if they are not active. - std::unique_ptr<const PermissionSet> GetRuntimeGrantedPermissions( + std::unique_ptr<PermissionSet> GetRuntimeGrantedPermissions( const ExtensionId& extension_id) const; // Adds to the set of runtime-granted permissions. @@ -824,7 +824,7 @@ // Interprets |pref_key| in |extension_id|'s preferences as an // PermissionSet, and passes ownership of the set to the caller. - std::unique_ptr<const PermissionSet> ReadPrefAsPermissionSet( + std::unique_ptr<PermissionSet> ReadPrefAsPermissionSet( const std::string& extension_id, base::StringPiece pref_key) const;
diff --git a/extensions/browser/extensions_browser_client.cc b/extensions/browser/extensions_browser_client.cc index 1f7c5cf..87df226 100644 --- a/extensions/browser/extensions_browser_client.cc +++ b/extensions/browser/extensions_browser_client.cc
@@ -175,11 +175,8 @@ return {browser_context}; } -std::unique_ptr<const PermissionSet> -ExtensionsBrowserClient::AddAdditionalAllowedHosts( +void ExtensionsBrowserClient::AddAdditionalAllowedHosts( const PermissionSet& desired_permissions, - const PermissionSet& granted_permissions) const { - return granted_permissions.Clone(); -} + PermissionSet* granted_permissions) const {} } // namespace extensions
diff --git a/extensions/browser/extensions_browser_client.h b/extensions/browser/extensions_browser_client.h index b060c13..50105246 100644 --- a/extensions/browser/extensions_browser_client.h +++ b/extensions/browser/extensions_browser_client.h
@@ -445,10 +445,10 @@ const Extension& extension) const; // Adds any hosts that should be automatically considered "granted" if - // requested, returning a modified permission set. - virtual std::unique_ptr<const PermissionSet> AddAdditionalAllowedHosts( + // requested to `granted_permissions`. + virtual void AddAdditionalAllowedHosts( const PermissionSet& desired_permissions, - const PermissionSet& granted_permissions) const; + PermissionSet* granted_permissions) const; private: std::vector<std::unique_ptr<ExtensionsBrowserAPIProvider>> providers_;
diff --git a/extensions/browser/permissions_manager.cc b/extensions/browser/permissions_manager.cc index 90e26c3b..b37b94c 100644 --- a/extensions/browser/permissions_manager.cc +++ b/extensions/browser/permissions_manager.cc
@@ -260,7 +260,7 @@ // runtime-granted permissions (where the user said "this extension may run // on this site") and `user_permitted_set` (sites the user allows any // extension to run on). - std::unique_ptr<const PermissionSet> allowed_permissions = + std::unique_ptr<PermissionSet> allowed_permissions = PermissionSet::CreateUnion(user_permitted_set, *GetRuntimePermissionsFromPrefs(extension)); @@ -269,23 +269,20 @@ // different than granted, as extensions can remove permissions from // themselves via chrome.permissions.remove() (which removes the // permission from the active set, but not the granted set). - std::unique_ptr<const PermissionSet> bounded_desired = + std::unique_ptr<PermissionSet> bounded_desired = GetBoundedExtensionDesiredPermissions(extension); // 3) Add in any always-approved hosts that shouldn't be removed (such as // chrome://favicon). - allowed_permissions = - ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( - *bounded_desired, *allowed_permissions); + ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( + *bounded_desired, allowed_permissions.get()); // 4) Finalize the allowed set. Since we don't allow withholding of API and // manifest permissions, the allowed set always contains all (bounded) // requested API and manifest permissions. - allowed_permissions = std::make_unique<const PermissionSet>( - bounded_desired->apis().Clone(), - bounded_desired->manifest_permissions().Clone(), - allowed_permissions->explicit_hosts().Clone(), - allowed_permissions->scriptable_hosts().Clone()); + allowed_permissions->SetAPIPermissions(bounded_desired->apis().Clone()); + allowed_permissions->SetManifestPermissions( + bounded_desired->manifest_permissions().Clone()); // 5) Calculate the new active and withheld permissions. The active // permissions are the intersection of all permissions the extension is @@ -294,13 +291,11 @@ // user approved it. // Withheld permissions are any required permissions that are not in the // new active set. - std::unique_ptr<const PermissionSet> new_active = - PermissionSet::CreateIntersection( - *allowed_permissions, *bounded_desired, - URLPatternSet::IntersectionBehavior::kDetailed); - std::unique_ptr<const PermissionSet> new_withheld = - PermissionSet::CreateDifference( - PermissionsParser::GetRequiredPermissions(&extension), *new_active); + std::unique_ptr<PermissionSet> new_active = PermissionSet::CreateIntersection( + *allowed_permissions, *bounded_desired, + URLPatternSet::IntersectionBehavior::kDetailed); + std::unique_ptr<PermissionSet> new_withheld = PermissionSet::CreateDifference( + PermissionsParser::GetRequiredPermissions(&extension), *new_active); // Set the new permissions on the extension. extension.permissions_data()->SetPermissions(std::move(new_active), @@ -403,10 +398,10 @@ return extension_prefs_->GetWithholdingPermissions(extension_id); } -std::unique_ptr<const PermissionSet> +std::unique_ptr<PermissionSet> PermissionsManager::GetRuntimePermissionsFromPrefs( const Extension& extension) const { - std::unique_ptr<const PermissionSet> permissions = + std::unique_ptr<PermissionSet> permissions = extension_prefs_->GetRuntimeGrantedPermissions(extension.id()); // If there are no stored permissions, there's nothing to adjust. @@ -460,12 +455,11 @@ new_explicit_hosts.AddPattern(std::move(new_pattern)); } - return std::make_unique<PermissionSet>( - permissions->apis().Clone(), permissions->manifest_permissions().Clone(), - std::move(new_explicit_hosts), permissions->scriptable_hosts().Clone()); + permissions->SetExplicitHosts(std::move(new_explicit_hosts)); + return permissions; } -std::unique_ptr<const PermissionSet> +std::unique_ptr<PermissionSet> PermissionsManager::GetBoundedExtensionDesiredPermissions( const Extension& extension) const { // Determine the extension's "required" permissions (though even these can @@ -478,7 +472,7 @@ // might not be all granted permissions, since extensions can revoke their // own permissions via chrome.permissions.remove() (which removes the // permission from the active set, but not the granted set). - std::unique_ptr<const PermissionSet> desired_active_permissions = + std::unique_ptr<PermissionSet> desired_active_permissions = extension_prefs_->GetDesiredActivePermissions(extension.id()); // The stored desired permissions may be null if the extension has never // used the permissions API to modify its active permissions. In this case, @@ -491,7 +485,7 @@ // extension (depending on how its permissions have changed). // Start by calculating the set of all current potentially-desired // permissions by combining the required and optional permissions. - std::unique_ptr<const PermissionSet> requested_permissions = + std::unique_ptr<PermissionSet> requested_permissions = PermissionSet::CreateUnion( required_permissions, PermissionsParser::GetOptionalPermissions(&extension)); @@ -500,7 +494,7 @@ // permissions. This filters out any previously-stored permissions that are // no longer used (which we continue to store in prefs in case the extension // wants them back in the future). - std::unique_ptr<const PermissionSet> bounded_desired = + std::unique_ptr<PermissionSet> bounded_desired = PermissionSet::CreateIntersection(*desired_active_permissions, *requested_permissions); @@ -516,7 +510,7 @@ return bounded_desired; } -std::unique_ptr<const PermissionSet> +std::unique_ptr<PermissionSet> PermissionsManager::GetEffectivePermissionsToGrant( const Extension& extension, const PermissionSet& desired_permissions) const { @@ -547,15 +541,14 @@ // Determine the permissions granted by the user at runtime. If none are found // in prefs, default it to an empty set. - std::unique_ptr<const PermissionSet> granted_permissions = + std::unique_ptr<PermissionSet> granted_permissions = GetRuntimePermissionsFromPrefs(extension); if (!granted_permissions) granted_permissions = std::make_unique<PermissionSet>(); // Add any additional hosts that should be auto-granted. - granted_permissions = - ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( - desired_permissions, *granted_permissions); + ExtensionsBrowserClient::Get()->AddAdditionalAllowedHosts( + desired_permissions, granted_permissions.get()); URLPatternSet granted_scriptable_hosts = granted_permissions->scriptable_hosts().Clone();
diff --git a/extensions/browser/permissions_manager.h b/extensions/browser/permissions_manager.h index 6dba24cb..9b36ac24 100644 --- a/extensions/browser/permissions_manager.h +++ b/extensions/browser/permissions_manager.h
@@ -175,20 +175,20 @@ // Returns null if there are no stored runtime-granted permissions. // TODO(https://crbug.com/931881): ExtensionPrefs should return // properly-bounded permissions. - std::unique_ptr<const PermissionSet> GetRuntimePermissionsFromPrefs( + std::unique_ptr<PermissionSet> GetRuntimePermissionsFromPrefs( const Extension& extension) const; // Returns the set of permissions that the `extension` wants to have active at // this time. This does *not* take into account user-granted or runtime- // withheld permissions. - std::unique_ptr<const PermissionSet> GetBoundedExtensionDesiredPermissions( + std::unique_ptr<PermissionSet> GetBoundedExtensionDesiredPermissions( const Extension& extension) const; // Returns the set of permissions that should be granted to the given // `extension` according to the runtime-granted permissions and current // preferences, omitting host permissions if the extension supports it and // the user has withheld permissions. - std::unique_ptr<const PermissionSet> GetEffectivePermissionsToGrant( + std::unique_ptr<PermissionSet> GetEffectivePermissionsToGrant( const Extension& extension, const PermissionSet& desired_permissions) const;
diff --git a/extensions/common/permissions/permission_set.cc b/extensions/common/permissions/permission_set.cc index 3edb798c..eddc976b 100644 --- a/extensions/common/permissions/permission_set.cc +++ b/extensions/common/permissions/permission_set.cc
@@ -26,30 +26,7 @@ manifest_permissions_(std::move(manifest_permissions)), explicit_hosts_(std::move(explicit_hosts)), scriptable_hosts_(std::move(scriptable_hosts)) { - // For explicit hosts, we require the path to be "/*". This is a little - // tricky, since URLPatternSets are backed by a std::set<>, where the - // elements are immutable (because they themselves are the keys). In order to - // work around this, we find the patterns we need to update, collect updated - // versions, remove them, and then insert the updated ones. This isn't very - // clean, but does mean that all the other URLPatterns in the set (which is - // likely the majority) get to be std::move'd efficiently. - // NOTE(devlin): This would be non-issue if URLPatternSet() was backed by e.g. - // a vector. - std::vector<URLPattern> modified_patterns; - for (auto iter = explicit_hosts_.begin(); iter != explicit_hosts_.end();) { - if (iter->path() == "/*") { - ++iter; - continue; - } - URLPattern modified_pattern(*iter); - modified_pattern.SetPath("/*"); - modified_patterns.push_back(std::move(modified_pattern)); - iter = explicit_hosts_.erase(iter); - } - - for (URLPattern& pattern : modified_patterns) - explicit_hosts_.AddPattern(std::move(pattern)); - + CleanExplicitHostPaths(); InitImplicitPermissions(); InitEffectiveHosts(); } @@ -61,7 +38,7 @@ PermissionSet& PermissionSet::operator=(PermissionSet&& other) = default; // static -std::unique_ptr<const PermissionSet> PermissionSet::CreateDifference( +std::unique_ptr<PermissionSet> PermissionSet::CreateDifference( const PermissionSet& set1, const PermissionSet& set2) { APIPermissionSet apis; @@ -78,13 +55,13 @@ URLPatternSet scriptable_hosts = URLPatternSet::CreateDifference( set1.scriptable_hosts(), set2.scriptable_hosts()); - return base::WrapUnique(new PermissionSet( + return std::make_unique<PermissionSet>( std::move(apis), std::move(manifest_permissions), - std::move(explicit_hosts), std::move(scriptable_hosts))); + std::move(explicit_hosts), std::move(scriptable_hosts)); } // static -std::unique_ptr<const PermissionSet> PermissionSet::CreateIntersection( +std::unique_ptr<PermissionSet> PermissionSet::CreateIntersection( const PermissionSet& set1, const PermissionSet& set2, URLPatternSet::IntersectionBehavior intersection_behavior) { @@ -101,13 +78,13 @@ URLPatternSet scriptable_hosts = URLPatternSet::CreateIntersection( set1.scriptable_hosts(), set2.scriptable_hosts(), intersection_behavior); - return base::WrapUnique(new PermissionSet( + return std::make_unique<PermissionSet>( std::move(apis), std::move(manifest_permissions), - std::move(explicit_hosts), std::move(scriptable_hosts))); + std::move(explicit_hosts), std::move(scriptable_hosts)); } // static -std::unique_ptr<const PermissionSet> PermissionSet::CreateUnion( +std::unique_ptr<PermissionSet> PermissionSet::CreateUnion( const PermissionSet& set1, const PermissionSet& set2) { APIPermissionSet apis; @@ -124,9 +101,9 @@ URLPatternSet scriptable_hosts = URLPatternSet::CreateUnion( set1.scriptable_hosts(), set2.scriptable_hosts()); - return base::WrapUnique(new PermissionSet( + return std::make_unique<PermissionSet>( std::move(apis), std::move(manifest_permissions), - std::move(explicit_hosts), std::move(scriptable_hosts))); + std::move(explicit_hosts), std::move(scriptable_hosts)); } bool PermissionSet::operator==( @@ -235,6 +212,40 @@ return effective_hosts().MatchesURL(url); } +void PermissionSet::SetAPIPermissions(APIPermissionSet new_apis) { + apis_ = std::move(new_apis); + // Since we're rewriting the API permissions, we need to re-initialize the + // value of whether to warn about all hosts and re-add any implicit API + // permissions. + InitImplicitPermissions(); + api_permissions_should_warn_all_hosts_ = UNINITIALIZED; +} + +void PermissionSet::SetManifestPermissions( + ManifestPermissionSet new_manifest_permissions) { + manifest_permissions_ = std::move(new_manifest_permissions); +} + +void PermissionSet::SetExplicitHosts(URLPatternSet new_explicit_hosts) { + explicit_hosts_ = std::move(new_explicit_hosts); + // Since we're rewriting the host permissions, we need to re-initialize the + // value of whether to warn about all hosts, clean up the paths for the + // explicit hosts, and re-calculate the effective hosts (the combination of + // explicit and scriptable hosts). + host_permissions_should_warn_all_hosts_ = UNINITIALIZED; + CleanExplicitHostPaths(); + InitEffectiveHosts(); +} + +void PermissionSet::SetScriptableHosts(URLPatternSet new_scriptable_hosts) { + scriptable_hosts_ = std::move(new_scriptable_hosts); + // Since we're rewriting the host permissions, we need to re-initialize the + // value of whether to warn about all hosts and also the effective hosts (the + // combination of explicit and scriptable hosts). + host_permissions_should_warn_all_hosts_ = UNINITIALIZED; + InitEffectiveHosts(); +} + PermissionSet::PermissionSet(const PermissionSet& other) : apis_(other.apis_.Clone()), manifest_permissions_(other.manifest_permissions_.Clone()), @@ -242,6 +253,32 @@ scriptable_hosts_(other.scriptable_hosts_.Clone()), effective_hosts_(other.effective_hosts_.Clone()) {} +void PermissionSet::CleanExplicitHostPaths() { + // For explicit hosts, we require the path to be "/*". This is a little + // tricky, since URLPatternSets are backed by a std::set<>, where the + // elements are immutable (because they themselves are the keys). In order to + // work around this, we find the patterns we need to update, collect updated + // versions, remove them, and then insert the updated ones. This isn't very + // clean, but does mean that all the other URLPatterns in the set (which is + // likely the majority) get to be std::move'd efficiently. + // NOTE(devlin): This would be non-issue if URLPatternSet() was backed by e.g. + // a vector. + std::vector<URLPattern> modified_patterns; + for (auto iter = explicit_hosts_.begin(); iter != explicit_hosts_.end();) { + if (iter->path() == "/*") { + ++iter; + continue; + } + URLPattern modified_pattern(*iter); + modified_pattern.SetPath("/*"); + modified_patterns.push_back(std::move(modified_pattern)); + iter = explicit_hosts_.erase(iter); + } + + for (URLPattern& pattern : modified_patterns) + explicit_hosts_.AddPattern(std::move(pattern)); +} + void PermissionSet::InitImplicitPermissions() { // The downloads permission implies the internal version as well. if (apis_.find(APIPermissionID::kDownloads) != apis_.end())
diff --git a/extensions/common/permissions/permission_set.h b/extensions/common/permissions/permission_set.h index 752c590..95560f6 100644 --- a/extensions/common/permissions/permission_set.h +++ b/extensions/common/permissions/permission_set.h
@@ -19,13 +19,9 @@ namespace extensions { -// The PermissionSet is an immutable class that encapsulates an -// extension's permissions. The class exposes set operations for combining and -// manipulating the permissions. -// TODO(sashab): PermissionIDSet should be called PermissionSet. Once -// PermissionMessageProvider::GetPermissionMessages() is the only -// method used for generating permission messages, find the other users of this -// class and deprecate or rename it as appropriate. +// The PermissionSet is a class that encapsulates extension permissions of +// different types (manifest permissions, API permissions, explicit hosts, and +// scriptable hosts). class PermissionSet { public: // Creates an empty permission set (e.g. default permissions). @@ -48,7 +44,7 @@ PermissionSet& operator=(PermissionSet&& other); // Creates a new permission set equal to |set1| - |set2|. - static std::unique_ptr<const PermissionSet> CreateDifference( + static std::unique_ptr<PermissionSet> CreateDifference( const PermissionSet& set1, const PermissionSet& set2); @@ -56,16 +52,15 @@ // |set2|. // TODO(https://crbug.com/867549): Audit callers of CreateIntersection() and // have them determine the proper intersection behavior. - static std::unique_ptr<const PermissionSet> CreateIntersection( + static std::unique_ptr<PermissionSet> CreateIntersection( const PermissionSet& set1, const PermissionSet& set2, URLPatternSet::IntersectionBehavior intersection_behavior = URLPatternSet::IntersectionBehavior::kPatternsContainedByBoth); // Creates a new permission set equal to the union of |set1| and |set2|. - static std::unique_ptr<const PermissionSet> CreateUnion( - const PermissionSet& set1, - const PermissionSet& set2); + static std::unique_ptr<PermissionSet> CreateUnion(const PermissionSet& set1, + const PermissionSet& set2); bool operator==(const PermissionSet& rhs) const; bool operator!=(const PermissionSet& rhs) const; @@ -119,16 +114,18 @@ // Returns true if this permission set includes effective access to |url|. bool HasEffectiveAccessToURL(const GURL& url) const; - const APIPermissionSet& apis() const { return apis_; } + // Sets the different permissions on the PermissionSet. + void SetAPIPermissions(APIPermissionSet new_apis); + void SetManifestPermissions(ManifestPermissionSet new_manifest_permissions); + void SetExplicitHosts(URLPatternSet new_explicit_hosts); + void SetScriptableHosts(URLPatternSet new_scriptable_hosts); + const APIPermissionSet& apis() const { return apis_; } const ManifestPermissionSet& manifest_permissions() const { return manifest_permissions_; } - const URLPatternSet& effective_hosts() const { return effective_hosts_; } - const URLPatternSet& explicit_hosts() const { return explicit_hosts_; } - const URLPatternSet& scriptable_hosts() const { return scriptable_hosts_; } private: @@ -138,6 +135,10 @@ // Deliberate copy constructor for cloning the set. PermissionSet(const PermissionSet& permission_set); + // Cleans up any explicit host paths - explicit hosts require the path to be + // "/*", and we implicitly make this change. + void CleanExplicitHostPaths(); + // Adds permissions implied independently of other context. void InitImplicitPermissions(); @@ -158,11 +159,9 @@ ManifestPermissionSet manifest_permissions_; // The list of hosts that can be accessed directly from the extension. - // TODO(jstritar): Rename to "hosts_"? URLPatternSet explicit_hosts_; // The list of hosts that can be scripted by content scripts. - // TODO(jstritar): Rename to "user_script_hosts_"? URLPatternSet scriptable_hosts_; // The list of hosts this effectively grants access to.
diff --git a/fuchsia_web/webengine/BUILD.gn b/fuchsia_web/webengine/BUILD.gn index 7a11fa7..feb5b650 100644 --- a/fuchsia_web/webengine/BUILD.gn +++ b/fuchsia_web/webengine/BUILD.gn
@@ -309,6 +309,8 @@ "common/web_engine_content_client.h", "renderer/web_engine_audio_device_factory.cc", "renderer/web_engine_audio_device_factory.h", + "renderer/web_engine_audio_output_device.cc", + "renderer/web_engine_audio_output_device.h", "renderer/web_engine_audio_renderer.cc", "renderer/web_engine_audio_renderer.h", "renderer/web_engine_content_renderer_client.cc", @@ -622,6 +624,7 @@ "context_provider_impl_unittest.cc", "fake_context.cc", "fake_context.h", + "renderer/web_engine_audio_output_device_test.cc", "renderer/web_engine_audio_renderer_test.cc", "test/run_all_unittests.cc", ] @@ -636,6 +639,7 @@ "//components/url_rewrite/mojom", "//content/test:test_support", "//fuchsia_web/common/test:test_support", + "//media/fuchsia/audio:test_support", "//mojo/core/embedder", "//services/media_session/public/mojom", "//services/network:network_service",
diff --git a/fuchsia_web/webengine/renderer/web_engine_audio_device_factory.cc b/fuchsia_web/webengine/renderer/web_engine_audio_device_factory.cc index cd8f1a181..0090697 100644 --- a/fuchsia_web/webengine/renderer/web_engine_audio_device_factory.cc +++ b/fuchsia_web/webengine/renderer/web_engine_audio_device_factory.cc
@@ -9,8 +9,8 @@ #include "base/check.h" #include "content/public/renderer/render_frame.h" #include "fuchsia_web/webengine/mojom/web_engine_media_resource_provider.mojom.h" +#include "fuchsia_web/webengine/renderer/web_engine_audio_output_device.h" #include "media/base/audio_renderer_sink.h" -#include "media/fuchsia/audio/fuchsia_audio_output_device.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/remote.h" #include "third_party/blink/public/common/browser_interface_broker_proxy.h" @@ -92,6 +92,6 @@ fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer; media_resource_provider->CreateAudioConsumer(audio_consumer.NewRequest()); - return media::FuchsiaAudioOutputDevice::CreateOnDefaultThread( + return WebEngineAudioOutputDevice::CreateOnDefaultThread( std::move(audio_consumer)); }
diff --git a/media/fuchsia/audio/fuchsia_audio_output_device.cc b/fuchsia_web/webengine/renderer/web_engine_audio_output_device.cc similarity index 74% rename from media/fuchsia/audio/fuchsia_audio_output_device.cc rename to fuchsia_web/webengine/renderer/web_engine_audio_output_device.cc index 8012389..31bb4ca 100644 --- a/media/fuchsia/audio/fuchsia_audio_output_device.cc +++ b/fuchsia_web/webengine/renderer/web_engine_audio_output_device.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 "media/fuchsia/audio/fuchsia_audio_output_device.h" +#include "fuchsia_web/webengine/renderer/web_engine_audio_output_device.h" #include "base/fuchsia/fuchsia_logging.h" #include "base/logging.h" @@ -13,8 +13,6 @@ #include "base/threading/thread_task_runner_handle.h" #include "media/base/audio_timestamp_helper.h" -namespace media { - namespace { // Total number of buffers used for AudioConsumer. @@ -34,7 +32,7 @@ class DefaultAudioThread { public: - DefaultAudioThread() : thread_("FuchsiaAudioOutputDevice") { + DefaultAudioThread() : thread_("WebEngineAudioOutputDevice") { base::Thread::Options options(base::MessagePumpType::IO, 0); options.thread_type = base::ThreadType::kRealtimeAudio; thread_.StartWithOptions(std::move(options)); @@ -57,34 +55,36 @@ } // namespace // static -scoped_refptr<FuchsiaAudioOutputDevice> FuchsiaAudioOutputDevice::Create( +scoped_refptr<WebEngineAudioOutputDevice> WebEngineAudioOutputDevice::Create( fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle, scoped_refptr<base::SingleThreadTaskRunner> task_runner) { - scoped_refptr<FuchsiaAudioOutputDevice> result( - new FuchsiaAudioOutputDevice(task_runner)); + scoped_refptr<WebEngineAudioOutputDevice> result( + new WebEngineAudioOutputDevice(task_runner)); task_runner->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::BindAudioConsumerOnAudioThread, - result, std::move(audio_consumer_handle))); + base::BindOnce( + &WebEngineAudioOutputDevice::BindAudioConsumerOnAudioThread, result, + std::move(audio_consumer_handle))); return result; } // static -scoped_refptr<FuchsiaAudioOutputDevice> -FuchsiaAudioOutputDevice::CreateOnDefaultThread( +scoped_refptr<WebEngineAudioOutputDevice> +WebEngineAudioOutputDevice::CreateOnDefaultThread( fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle) { return Create(std::move(audio_consumer_handle), GetDefaultAudioTaskRunner()); } -FuchsiaAudioOutputDevice::FuchsiaAudioOutputDevice( +WebEngineAudioOutputDevice::WebEngineAudioOutputDevice( scoped_refptr<base::SingleThreadTaskRunner> task_runner) : task_runner_(std::move(task_runner)) {} -FuchsiaAudioOutputDevice::~FuchsiaAudioOutputDevice() = default; +WebEngineAudioOutputDevice::~WebEngineAudioOutputDevice() = default; -void FuchsiaAudioOutputDevice::Initialize(const AudioParameters& params, - RenderCallback* callback) { +void WebEngineAudioOutputDevice::Initialize( + const media::AudioParameters& params, + RenderCallback* callback) { DCHECK(callback); // Save |callback| synchronously here to handle the case when Stop() is called @@ -97,17 +97,17 @@ task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::InitializeOnAudioThread, this, + base::BindOnce(&WebEngineAudioOutputDevice::InitializeOnAudioThread, this, params)); } -void FuchsiaAudioOutputDevice::Start() { +void WebEngineAudioOutputDevice::Start() { task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::StartOnAudioThread, this)); + base::BindOnce(&WebEngineAudioOutputDevice::StartOnAudioThread, this)); } -void FuchsiaAudioOutputDevice::Stop() { +void WebEngineAudioOutputDevice::Stop() { { base::AutoLock auto_lock(callback_lock_); callback_ = nullptr; @@ -115,62 +115,62 @@ task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::StopOnAudioThread, this)); + base::BindOnce(&WebEngineAudioOutputDevice::StopOnAudioThread, this)); } -void FuchsiaAudioOutputDevice::Pause() { +void WebEngineAudioOutputDevice::Pause() { task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::PauseOnAudioThread, this)); + base::BindOnce(&WebEngineAudioOutputDevice::PauseOnAudioThread, this)); } -void FuchsiaAudioOutputDevice::Play() { +void WebEngineAudioOutputDevice::Play() { task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::PlayOnAudioThread, this)); + base::BindOnce(&WebEngineAudioOutputDevice::PlayOnAudioThread, this)); } -void FuchsiaAudioOutputDevice::Flush() { +void WebEngineAudioOutputDevice::Flush() { task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::FlushOnAudioThread, this)); + base::BindOnce(&WebEngineAudioOutputDevice::FlushOnAudioThread, this)); } -bool FuchsiaAudioOutputDevice::SetVolume(double volume) { +bool WebEngineAudioOutputDevice::SetVolume(double volume) { task_runner_->PostTask( FROM_HERE, - base::BindOnce(&FuchsiaAudioOutputDevice::SetVolumeOnAudioThread, this, + base::BindOnce(&WebEngineAudioOutputDevice::SetVolumeOnAudioThread, this, volume)); return true; } -OutputDeviceInfo FuchsiaAudioOutputDevice::GetOutputDeviceInfo() { +media::OutputDeviceInfo WebEngineAudioOutputDevice::GetOutputDeviceInfo() { // AudioConsumer doesn't provider any information about the output device. // // TODO(crbug.com/852834): Update this method when that functionality is // implemented. - return OutputDeviceInfo( - std::string(), OUTPUT_DEVICE_STATUS_OK, - AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, - CHANNEL_LAYOUT_STEREO, 48000, 480)); + return media::OutputDeviceInfo( + std::string(), media::OUTPUT_DEVICE_STATUS_OK, + media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + media::CHANNEL_LAYOUT_STEREO, 48000, 480)); } -void FuchsiaAudioOutputDevice::GetOutputDeviceInfoAsync( +void WebEngineAudioOutputDevice::GetOutputDeviceInfoAsync( OutputDeviceInfoCB info_cb) { std::move(info_cb).Run(GetOutputDeviceInfo()); } -bool FuchsiaAudioOutputDevice::IsOptimizedForHardwareParameters() { +bool WebEngineAudioOutputDevice::IsOptimizedForHardwareParameters() { // AudioConsumer doesn't provide device parameters (since target device may // change). return false; } -bool FuchsiaAudioOutputDevice::CurrentThreadIsRenderingThread() { +bool WebEngineAudioOutputDevice::CurrentThreadIsRenderingThread() { return task_runner_->BelongsToCurrentThread(); } -void FuchsiaAudioOutputDevice::BindAudioConsumerOnAudioThread( +void WebEngineAudioOutputDevice::BindAudioConsumerOnAudioThread( fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle) { DCHECK(CurrentThreadIsRenderingThread()); @@ -183,19 +183,19 @@ }); } -void FuchsiaAudioOutputDevice::InitializeOnAudioThread( - const AudioParameters& params) { +void WebEngineAudioOutputDevice::InitializeOnAudioThread( + const media::AudioParameters& params) { DCHECK(CurrentThreadIsRenderingThread()); params_ = params; - audio_bus_ = AudioBus::Create(params_); + audio_bus_ = media::AudioBus::Create(params_); UpdateVolume(); WatchAudioConsumerStatus(); } -void FuchsiaAudioOutputDevice::StartOnAudioThread() { +void WebEngineAudioOutputDevice::StartOnAudioThread() { DCHECK(CurrentThreadIsRenderingThread()); if (!audio_consumer_) @@ -212,7 +212,7 @@ // will then call SchedulePumpSamples() to start sending audio packets. } -void FuchsiaAudioOutputDevice::StopOnAudioThread() { +void WebEngineAudioOutputDevice::StopOnAudioThread() { DCHECK(CurrentThreadIsRenderingThread()); if (!audio_consumer_) @@ -226,7 +226,7 @@ volume_control_.Unbind(); } -void FuchsiaAudioOutputDevice::PauseOnAudioThread() { +void WebEngineAudioOutputDevice::PauseOnAudioThread() { DCHECK(CurrentThreadIsRenderingThread()); if (!audio_consumer_) @@ -237,7 +237,7 @@ pump_samples_timer_.Stop(); } -void FuchsiaAudioOutputDevice::PlayOnAudioThread() { +void WebEngineAudioOutputDevice::PlayOnAudioThread() { DCHECK(CurrentThreadIsRenderingThread()); if (!audio_consumer_) @@ -247,7 +247,7 @@ audio_consumer_->SetRate(1.0); } -void FuchsiaAudioOutputDevice::FlushOnAudioThread() { +void WebEngineAudioOutputDevice::FlushOnAudioThread() { DCHECK(CurrentThreadIsRenderingThread()); if (!stream_sink_) @@ -256,7 +256,7 @@ stream_sink_->DiscardAllPacketsNoReply(); } -void FuchsiaAudioOutputDevice::SetVolumeOnAudioThread(double volume) { +void WebEngineAudioOutputDevice::SetVolumeOnAudioThread(double volume) { DCHECK(CurrentThreadIsRenderingThread()); volume_ = volume; @@ -264,12 +264,12 @@ UpdateVolume(); } -void FuchsiaAudioOutputDevice::CreateStreamSink() { +void WebEngineAudioOutputDevice::CreateStreamSink() { DCHECK(CurrentThreadIsRenderingThread()); DCHECK(audio_consumer_); // Allocate buffers for the StreamSink. - size_t buffer_size = params_.GetBytesPerBuffer(kSampleFormatF32); + size_t buffer_size = params_.GetBytesPerBuffer(media::kSampleFormatF32); stream_sink_buffers_.reserve(kNumBuffers); available_buffers_indices_.clear(); std::vector<zx::vmo> vmos_for_stream_sink; @@ -308,7 +308,7 @@ }); } -void FuchsiaAudioOutputDevice::UpdateVolume() { +void WebEngineAudioOutputDevice::UpdateVolume() { DCHECK(CurrentThreadIsRenderingThread()); DCHECK(audio_consumer_); if (!volume_control_) { @@ -320,13 +320,13 @@ volume_control_->SetVolume(volume_); } -void FuchsiaAudioOutputDevice::WatchAudioConsumerStatus() { +void WebEngineAudioOutputDevice::WatchAudioConsumerStatus() { DCHECK(CurrentThreadIsRenderingThread()); audio_consumer_->WatchStatus(fit::bind_member( - this, &FuchsiaAudioOutputDevice::OnAudioConsumerStatusChanged)); + this, &WebEngineAudioOutputDevice::OnAudioConsumerStatusChanged)); } -void FuchsiaAudioOutputDevice::OnAudioConsumerStatusChanged( +void WebEngineAudioOutputDevice::OnAudioConsumerStatusChanged( fuchsia::media::AudioConsumerStatus status) { DCHECK(CurrentThreadIsRenderingThread()); @@ -358,7 +358,7 @@ WatchAudioConsumerStatus(); } -void FuchsiaAudioOutputDevice::SchedulePumpSamples() { +void WebEngineAudioOutputDevice::SchedulePumpSamples() { DCHECK(CurrentThreadIsRenderingThread()); if (paused_ || timeline_reference_time_.is_null() || @@ -367,8 +367,8 @@ } // Current position in the stream. - auto media_pos = AudioTimestampHelper::FramesToTime(media_pos_frames_, - params_.sample_rate()); + auto media_pos = media::AudioTimestampHelper::FramesToTime( + media_pos_frames_, params_.sample_rate()); // Calculate expected playback time for the next sample based on the // presentation timeline provided by the AudioConsumer. @@ -389,11 +389,11 @@ base::TimeDelta delay = target_time - now; pump_samples_timer_.Start( FROM_HERE, delay, - base::BindOnce(&FuchsiaAudioOutputDevice::PumpSamples, this, + base::BindOnce(&WebEngineAudioOutputDevice::PumpSamples, this, playback_time)); } -void FuchsiaAudioOutputDevice::PumpSamples(base::TimeTicks playback_time) { +void WebEngineAudioOutputDevice::PumpSamples(base::TimeTicks playback_time) { DCHECK(CurrentThreadIsRenderingThread()); auto now = base::TimeTicks::Now(); @@ -406,8 +406,8 @@ if (lead_time < min_lead_time_) { auto new_playback_time = now + min_lead_time_; auto skipped_time = new_playback_time - playback_time; - skipped_frames = - AudioTimestampHelper::TimeToFrames(skipped_time, params_.sample_rate()); + skipped_frames = media::AudioTimestampHelper::TimeToFrames( + skipped_time, params_.sample_rate()); media_pos_frames_ += skipped_frames; playback_time += skipped_time; } @@ -430,14 +430,14 @@ int buffer_index = available_buffers_indices_.back(); available_buffers_indices_.pop_back(); - audio_bus_->ToInterleaved<Float32SampleTypeTraitsNoClip>( + audio_bus_->ToInterleaved<media::Float32SampleTypeTraitsNoClip>( frames_filled, static_cast<float*>(stream_sink_buffers_[buffer_index].memory())); fuchsia::media::StreamPacket packet; packet.payload_buffer_id = buffer_index; - packet.pts = AudioTimestampHelper::FramesToTime(media_pos_frames_, - params_.sample_rate()) + packet.pts = media::AudioTimestampHelper::FramesToTime( + media_pos_frames_, params_.sample_rate()) .InNanoseconds(); packet.payload_offset = 0; packet.payload_size = frames_filled * sizeof(float) * params_.channels(); @@ -452,14 +452,14 @@ SchedulePumpSamples(); } -void FuchsiaAudioOutputDevice::OnStreamSendDone(size_t buffer_index) { +void WebEngineAudioOutputDevice::OnStreamSendDone(size_t buffer_index) { DCHECK(CurrentThreadIsRenderingThread()); available_buffers_indices_.push_back(buffer_index); SchedulePumpSamples(); } -void FuchsiaAudioOutputDevice::ReportError() { +void WebEngineAudioOutputDevice::ReportError() { DCHECK(CurrentThreadIsRenderingThread()); audio_consumer_.Unbind(); @@ -472,5 +472,3 @@ callback_->OnRenderError(); } } - -} // namespace media
diff --git a/media/fuchsia/audio/fuchsia_audio_output_device.h b/fuchsia_web/webengine/renderer/web_engine_audio_output_device.h similarity index 78% rename from media/fuchsia/audio/fuchsia_audio_output_device.h rename to fuchsia_web/webengine/renderer/web_engine_audio_output_device.h index 985aac96..8ad907d2 100644 --- a/media/fuchsia/audio/fuchsia_audio_output_device.h +++ b/fuchsia_web/webengine/renderer/web_engine_audio_output_device.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 MEDIA_FUCHSIA_AUDIO_FUCHSIA_AUDIO_OUTPUT_DEVICE_H_ -#define MEDIA_FUCHSIA_AUDIO_FUCHSIA_AUDIO_OUTPUT_DEVICE_H_ +#ifndef FUCHSIA_WEB_WEBENGINE_RENDERER_WEB_ENGINE_AUDIO_OUTPUT_DEVICE_H_ +#define FUCHSIA_WEB_WEBENGINE_RENDERER_WEB_ENGINE_AUDIO_OUTPUT_DEVICE_H_ #include <fuchsia/media/cpp/fidl.h> @@ -15,38 +15,35 @@ #include "base/synchronization/lock.h" #include "base/time/time.h" #include "base/timer/timer.h" +#include "fuchsia_web/webengine/web_engine_export.h" #include "media/base/audio_renderer_sink.h" -#include "media/base/media_export.h" namespace base { class SingleThreadTaskRunner; class WritableSharedMemoryMapping; } // namespace base -namespace media { - -// AudioRendererSink implementation for Fuchsia. It sends audio to AudioConsumer -// provided by the OS. Unlike AudioOutputDevice (used by default on other -// platforms) this class sends to the system directly from the renderer process, -// without additional IPC layer to the audio service. -// All work is performed on the TaskRunner passed to Create(). It must be an IO -// thread to allow FIDL usage. AudioRendererSink can be used on a different -// thread. -class MEDIA_EXPORT FuchsiaAudioOutputDevice : public AudioRendererSink { +// AudioRendererSink implementation for WebEngine. It sends audio to +// AudioConsumer provided by the OS. Unlike AudioOutputDevice this class sends +// to the system directly from the renderer process. All work is performed on +// the TaskRunner passed to Create(). It must be an IO thread to allow FIDL +// usage. AudioRendererSink can be used on a different thread. +class WEB_ENGINE_EXPORT WebEngineAudioOutputDevice + : public media::AudioRendererSink { public: - static scoped_refptr<FuchsiaAudioOutputDevice> Create( + static scoped_refptr<WebEngineAudioOutputDevice> Create( fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle, scoped_refptr<base::SingleThreadTaskRunner> task_runner); - // Same as above, but creates a FuchsiaAudioOutputDevice that runs on the + // Same as above, but creates a WebEngineAudioOutputDevice that runs on the // default audio thread. - static scoped_refptr<FuchsiaAudioOutputDevice> CreateOnDefaultThread( + static scoped_refptr<WebEngineAudioOutputDevice> CreateOnDefaultThread( fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle); // AudioRendererSink implementation. - void Initialize(const AudioParameters& params, + void Initialize(const media::AudioParameters& params, RenderCallback* callback) override; void Start() override; void Stop() override; @@ -54,24 +51,24 @@ void Play() override; void Flush() override; bool SetVolume(double volume) override; - OutputDeviceInfo GetOutputDeviceInfo() override; + media::OutputDeviceInfo GetOutputDeviceInfo() override; void GetOutputDeviceInfoAsync(OutputDeviceInfoCB info_cb) override; bool IsOptimizedForHardwareParameters() override; bool CurrentThreadIsRenderingThread() override; private: - friend class FuchsiaAudioOutputDeviceTest; + friend class WebEngineAudioOutputDeviceTest; - explicit FuchsiaAudioOutputDevice( + explicit WebEngineAudioOutputDevice( scoped_refptr<base::SingleThreadTaskRunner> task_runner); - ~FuchsiaAudioOutputDevice() override; + ~WebEngineAudioOutputDevice() override; void BindAudioConsumerOnAudioThread( fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer_handle); // AudioRendererSink handlers for the audio thread. - void InitializeOnAudioThread(const AudioParameters& params); + void InitializeOnAudioThread(const media::AudioParameters& params); void StartOnAudioThread(); void StopOnAudioThread(); void PauseOnAudioThread(); @@ -114,7 +111,7 @@ fuchsia::media::StreamSinkPtr stream_sink_; fuchsia::media::audio::VolumeControlPtr volume_control_; - AudioParameters params_; + media::AudioParameters params_; // Lock used to control access to |callback_|. base::Lock callback_lock_; @@ -162,9 +159,7 @@ // AudioBus used in PumpSamples(). Stored here to avoid re-allocating it for // every packet. - std::unique_ptr<AudioBus> audio_bus_; + std::unique_ptr<media::AudioBus> audio_bus_; }; -} // namespace media - -#endif // MEDIA_FUCHSIA_AUDIO_FUCHSIA_AUDIO_OUTPUT_DEVICE_H_ +#endif // FUCHSIA_WEB_WEBENGINE_RENDERER_WEB_ENGINE_AUDIO_OUTPUT_DEVICE_H_
diff --git a/media/fuchsia/audio/fuchsia_audio_output_device_test.cc b/fuchsia_web/webengine/renderer/web_engine_audio_output_device_test.cc similarity index 75% rename from media/fuchsia/audio/fuchsia_audio_output_device_test.cc rename to fuchsia_web/webengine/renderer/web_engine_audio_output_device_test.cc index d7f80d3..f5aa65a 100644 --- a/media/fuchsia/audio/fuchsia_audio_output_device_test.cc +++ b/fuchsia_web/webengine/renderer/web_engine_audio_output_device_test.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 "media/fuchsia/audio/fuchsia_audio_output_device.h" +#include "fuchsia_web/webengine/renderer/web_engine_audio_output_device.h" #include "base/logging.h" #include "base/memory/ref_counted.h" @@ -15,16 +15,18 @@ #include "media/fuchsia/audio/fake_audio_consumer.h" #include "testing/gtest/include/gtest/gtest.h" -namespace media { +namespace { constexpr int kSampleRate = 44100; -constexpr ChannelLayout kChannelLayout = CHANNEL_LAYOUT_STEREO; +constexpr media::ChannelLayout kChannelLayout = media::CHANNEL_LAYOUT_STEREO; constexpr int kNumChannels = 2; constexpr uint64_t kTestSessionId = 42; constexpr base::TimeDelta kPeriod = base::Milliseconds(10); constexpr int kFramesPerPeriod = 441; -class TestRenderer : public AudioRendererSink::RenderCallback { +} // namespace + +class TestRenderer : public media::AudioRendererSink::RenderCallback { public: TestRenderer() = default; ~TestRenderer() override = default; @@ -33,7 +35,7 @@ int Render(base::TimeDelta delay, base::TimeTicks delay_timestamp, int prior_frames_skipped, - AudioBus* dest) override { + media::AudioBus* dest) override { EXPECT_EQ(dest->channels(), kNumChannels); frames_skipped_ += prior_frames_skipped; frames_rendered_ += dest->frames(); @@ -64,31 +66,31 @@ base::TimeTicks last_presentation_time_; }; -class FuchsiaAudioOutputDeviceTest : public testing::Test { +class WebEngineAudioOutputDeviceTest : public testing::Test { public: - FuchsiaAudioOutputDeviceTest() { + WebEngineAudioOutputDeviceTest() { fidl::InterfaceHandle<fuchsia::media::AudioConsumer> audio_consumer; - fake_audio_consumer_ = std::make_unique<FakeAudioConsumer>( + fake_audio_consumer_ = std::make_unique<media::FakeAudioConsumer>( kTestSessionId, audio_consumer.NewRequest()); - output_device_ = FuchsiaAudioOutputDevice::Create( + output_device_ = WebEngineAudioOutputDevice::Create( std::move(audio_consumer), base::ThreadTaskRunnerHandle::Get()); } - ~FuchsiaAudioOutputDeviceTest() override { + ~WebEngineAudioOutputDeviceTest() override { // Stop() must be called before destruction to release resources. output_device_->Stop(); - // FuchsiaAudioOutputDevice::Stop() posts a task to run StopOnAudioThread() - // on `task_runner_`. RunUntilIdle() ensures the request to stop is - // fulfilled. + // WebEngineAudioOutputDevice::Stop() posts a task to run + // StopOnAudioThread() on `task_runner_`. RunUntilIdle() ensures the request + // to stop is fulfilled. task_environment_.RunUntilIdle(); } protected: void Initialize() { output_device_->Initialize( - AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, kChannelLayout, - kSampleRate, kFramesPerPeriod), + media::AudioParameters(media::AudioParameters::AUDIO_PCM_LOW_LATENCY, + kChannelLayout, kSampleRate, kFramesPerPeriod), &renderer_); task_environment_.RunUntilIdle(); @@ -98,7 +100,7 @@ void InitializeAndStart() { Initialize(); - // As soon as Start() is processed FuchsiaAudioOutputDevice is expected to + // As soon as Start() is processed WebEngineAudioOutputDevice is expected to // start rendering some samples. output_device_->Start(); task_environment_.RunUntilIdle(); @@ -113,25 +115,25 @@ void ValidatePresentationTime() { // Verify that the current renderer lead time is in the // [min_lead_time, min_lead_time + 30ms] range. 30ms is chosen to allow - // FuchsiaAudioOutputDevice to pre-render slightely ahead of the target + // WebEngineAudioOutputDevice to pre-render slightely ahead of the target // time, while keeping latency reasonably low. auto lead_time = renderer_.last_presentation_time() - base::TimeTicks::Now(); - EXPECT_GT(lead_time, FakeAudioConsumer::kMinLeadTime); + EXPECT_GT(lead_time, media::FakeAudioConsumer::kMinLeadTime); EXPECT_LT(lead_time, - FakeAudioConsumer::kMinLeadTime + base::Milliseconds(30)); + media::FakeAudioConsumer::kMinLeadTime + base::Milliseconds(30)); } base::test::SingleThreadTaskEnvironment task_environment_{ base::test::SingleThreadTaskEnvironment::MainThreadType::IO, base::test::TaskEnvironment::TimeSource::MOCK_TIME}; - std::unique_ptr<FakeAudioConsumer> fake_audio_consumer_; + std::unique_ptr<media::FakeAudioConsumer> fake_audio_consumer_; TestRenderer renderer_; - scoped_refptr<FuchsiaAudioOutputDevice> output_device_; + scoped_refptr<WebEngineAudioOutputDevice> output_device_; }; -TEST_F(FuchsiaAudioOutputDeviceTest, Start) { +TEST_F(WebEngineAudioOutputDeviceTest, Start) { Initialize(); // Verify that playback doesn't start before Start(). @@ -146,12 +148,12 @@ ValidatePresentationTime(); } -TEST_F(FuchsiaAudioOutputDeviceTest, StartAndPlay) { +TEST_F(WebEngineAudioOutputDeviceTest, StartAndPlay) { InitializeAndStart(); renderer_.reset_frames_rendered(); - // Try advancing time and verify that FuchsiaAudioOutputDevice keeps calling + // Try advancing time and verify that WebEngineAudioOutputDevice keeps calling // Render(). for (int i = 0; i < 3; ++i) { task_environment_.FastForwardBy(kPeriod); @@ -161,12 +163,12 @@ } } -TEST_F(FuchsiaAudioOutputDeviceTest, Pause) { +TEST_F(WebEngineAudioOutputDeviceTest, Pause) { InitializeAndStart(); renderer_.reset_frames_rendered(); - // Advancing time and verify that FuchsiaAudioOutputDevice keeps calling + // Advancing time and verify that WebEngineAudioOutputDevice keeps calling // Render(). task_environment_.FastForwardBy(kPeriod); EXPECT_EQ(renderer_.frames_rendered(), kFramesPerPeriod); @@ -185,13 +187,13 @@ EXPECT_EQ(renderer_.frames_skipped(), 0); } -TEST_F(FuchsiaAudioOutputDeviceTest, Underflow) { +TEST_F(WebEngineAudioOutputDeviceTest, Underflow) { InitializeAndStart(); renderer_.reset_frames_rendered(); // Missing the timer once should not cause any issues. Timer tasks can't - // always run at the exact scheduled time. FuchsiaAudioOutputDevice should + // always run at the exact scheduled time. WebEngineAudioOutputDevice should // be resilient to small delays. task_environment_.AdvanceClock(kPeriod * 2); task_environment_.RunUntilIdle(); @@ -209,7 +211,7 @@ ValidatePresentationTime(); } -TEST_F(FuchsiaAudioOutputDeviceTest, Error) { +TEST_F(WebEngineAudioOutputDeviceTest, Error) { InitializeAndStart(); renderer_.reset_frames_rendered(); @@ -221,7 +223,7 @@ EXPECT_EQ(renderer_.frames_rendered(), 0); } -TEST_F(FuchsiaAudioOutputDeviceTest, Stop) { +TEST_F(WebEngineAudioOutputDeviceTest, Stop) { InitializeAndStart(); renderer_.reset_frames_rendered(); @@ -232,5 +234,3 @@ CallPumpSamples(); EXPECT_EQ(renderer_.frames_rendered(), 0); } - -} // namespace media
diff --git a/fuchsia_web/webengine/renderer/web_engine_content_renderer_client.cc b/fuchsia_web/webengine/renderer/web_engine_content_renderer_client.cc index f75bf84e..a49ee98 100644 --- a/fuchsia_web/webengine/renderer/web_engine_content_renderer_client.cc +++ b/fuchsia_web/webengine/renderer/web_engine_content_renderer_client.cc
@@ -71,23 +71,22 @@ return supported_codecs_; } - absl::optional<media::EmeConfigRule> GetRobustnessConfigRule( + media::EmeConfig::Rule GetRobustnessConfigRule( const std::string& /*key_system*/, media::EmeMediaType /*media_type*/, const std::string& requested_robustness, const bool* /*hw_secure_requirement*/) const override { // Only empty robustness string is currently supported. if (requested_robustness.empty()) { - return media::EmeConfigRule{.hw_secure_codecs = - media::EmeConfigRuleState::kRequired}; + return media::EmeConfig{.hw_secure_codecs = + media::EmeConfigRuleState::kRequired}; } - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } - absl::optional<media::EmeConfigRule> GetPersistentLicenseSessionSupport() - const override { - return absl::nullopt; + media::EmeConfig::Rule GetPersistentLicenseSessionSupport() const override { + return media::EmeConfig::UnsupportedRule(); } media::EmeFeatureSupport GetPersistentStateSupport() const override { @@ -98,13 +97,13 @@ return media::EmeFeatureSupport::ALWAYS_ENABLED; } - absl::optional<media::EmeConfigRule> GetEncryptionSchemeConfigRule( + media::EmeConfig::Rule GetEncryptionSchemeConfigRule( media::EncryptionScheme encryption_mode) const override { if (encryption_mode == ::media::EncryptionScheme::kCenc) { - return media::EmeConfigRule(); + return media::EmeConfig::SupportedRule(); } - return absl::nullopt; + return media::EmeConfig::UnsupportedRule(); } private:
diff --git a/google_apis/gcm/engine/registration_request.cc b/google_apis/gcm/engine/registration_request.cc index 6b402e0..1250ee4 100644 --- a/google_apis/gcm/engine/registration_request.cc +++ b/google_apis/gcm/engine/registration_request.cc
@@ -267,6 +267,20 @@ response.substr(error_pos + std::size(kErrorPrefix) - 1); LOG(ERROR) << "Registration response error message: " << error; RegistrationRequest::Status status = GetStatusFromError(error); + +#if BUILDFLAG(IS_CHROMEOS_ASH) + // TODO(crbug.com/1327973): Temporarily log additional information for + // INVALID_SENDER errors. Remove once the investigation is complete! + if (status == RegistrationRequest::Status::INVALID_SENDER) { + SCOPED_CRASH_KEY_STRING64("gcm_registration", "url", + source->GetFinalURL().spec()); + SCOPED_CRASH_KEY_STRING256("gcm_registration", "request_body", + request_body); + SCOPED_CRASH_KEY_STRING256("gcm_registration", "response_body", response); + base::debug::DumpWithoutCrashing(FROM_HERE, + /*time_between_dumps=*/base::Hours(12)); + } +#endif // BUILDFLAG(IS_CHROMEOS_ASH) return status; }
diff --git a/gpu/command_buffer/build_raster_cmd_buffer.py b/gpu/command_buffer/build_raster_cmd_buffer.py index 55a6244..87ebe04 100755 --- a/gpu/command_buffer/build_raster_cmd_buffer.py +++ b/gpu/command_buffer/build_raster_cmd_buffer.py
@@ -230,7 +230,7 @@ 'decoder_func': 'DoConvertYUVAMailboxesToRGBINTERNAL', 'internal': True, 'type': 'PUT', - 'count': 80, #GL_MAILBOX_SIZE_CHROMIUM x5 + 'count': 144, #GL_MAILBOX_SIZE_CHROMIUM x5 + 16 floats 'unit_test': False, 'trace_level': 2, },
diff --git a/gpu/command_buffer/client/raster_implementation.cc b/gpu/command_buffer/client/raster_implementation.cc index 5e55c88..311957e 100644 --- a/gpu/command_buffer/client/raster_implementation.cc +++ b/gpu/command_buffer/client/raster_implementation.cc
@@ -1258,17 +1258,42 @@ void RasterImplementation::ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, SkYUVColorSpace planes_yuv_color_space, + const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, SkYUVAInfo::Subsampling subsampling, const gpu::Mailbox yuva_plane_mailboxes[]) { - gpu::Mailbox mailboxes[kNumMailboxes]{}; - for (int i = 0; i < SkYUVAInfo::NumPlanes(plane_config); ++i) { - mailboxes[i] = yuva_plane_mailboxes[i]; + if (!planes_rgb_color_space) { + SetGLError(GL_INVALID_VALUE, "ConvertYUVAMailboxesToRGB", + "invalid color space"); + return; } - mailboxes[kNumMailboxes - 1] = dest_mailbox; + skcms_Matrix3x3 primaries = {{{0}}}; + skcms_TransferFunction transfer = {0}; + planes_rgb_color_space->toXYZD50(&primaries); + planes_rgb_color_space->transferFn(&transfer); + + constexpr size_t kByteSize = sizeof(gpu::Mailbox) * (kNumMailboxes) + + sizeof(skcms_TransferFunction) + + sizeof(skcms_Matrix3x3); + static_assert(kByteSize == 144); + GLbyte bytes[kByteSize] = {0}; + size_t offset = 0; + for (int i = 0; i < SkYUVAInfo::NumPlanes(plane_config); ++i) { + memcpy(bytes + offset, yuva_plane_mailboxes + i, sizeof(gpu::Mailbox)); + offset += sizeof(gpu::Mailbox); + } + offset = SkYUVAInfo::kMaxPlanes * sizeof(gpu::Mailbox); + memcpy(bytes + offset, &dest_mailbox, sizeof(gpu::Mailbox)); + offset += sizeof(gpu::Mailbox); + memcpy(bytes + offset, &transfer, sizeof(transfer)); + offset += sizeof(transfer); + memcpy(bytes + offset, &primaries, sizeof(primaries)); + offset += sizeof(primaries); + DCHECK_EQ(offset, kByteSize); + helper_->ConvertYUVAMailboxesToRGBINTERNALImmediate( planes_yuv_color_space, static_cast<GLenum>(plane_config), - static_cast<GLenum>(subsampling), reinterpret_cast<GLbyte*>(mailboxes)); + static_cast<GLenum>(subsampling), reinterpret_cast<GLbyte*>(bytes)); } void RasterImplementation::ConvertRGBAToYUVAMailboxes(
diff --git a/gpu/command_buffer/client/raster_implementation.h b/gpu/command_buffer/client/raster_implementation.h index 8201083..a1b47e6 100644 --- a/gpu/command_buffer/client/raster_implementation.h +++ b/gpu/command_buffer/client/raster_implementation.h
@@ -137,6 +137,7 @@ void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, SkYUVColorSpace planes_yuv_color_space, + const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, SkYUVAInfo::Subsampling subsampling, const gpu::Mailbox yuva_plane_mailboxes[]) override;
diff --git a/gpu/command_buffer/client/raster_implementation_gles.cc b/gpu/command_buffer/client/raster_implementation_gles.cc index 71ea25c..973eec6 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.cc +++ b/gpu/command_buffer/client/raster_implementation_gles.cc
@@ -200,6 +200,7 @@ void RasterImplementationGLES::ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, SkYUVColorSpace planes_yuv_color_space, + const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, SkYUVAInfo::Subsampling subsampling, const gpu::Mailbox yuva_plane_mailboxes[]) {
diff --git a/gpu/command_buffer/client/raster_implementation_gles.h b/gpu/command_buffer/client/raster_implementation_gles.h index 11e8de5..d153133 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.h +++ b/gpu/command_buffer/client/raster_implementation_gles.h
@@ -79,6 +79,7 @@ void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, SkYUVColorSpace planes_yuv_color_space, + const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, SkYUVAInfo::Subsampling subsampling, const gpu::Mailbox yuva_plane_mailboxes[]) override;
diff --git a/gpu/command_buffer/client/raster_interface.h b/gpu/command_buffer/client/raster_interface.h index e582b779..72fed25 100644 --- a/gpu/command_buffer/client/raster_interface.h +++ b/gpu/command_buffer/client/raster_interface.h
@@ -68,9 +68,13 @@ const SkImageInfo& src_info, const void* src_pixels) = 0; + // Copy `yuva_plane_mailboxes` to `dest_mailbox`. The color space for the + // source of the copy is split into `planes_yuv_color_space` which converts + // into full range RGB, and `planes_rgb_color_space` which an RGB color space. virtual void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, SkYUVColorSpace planes_yuv_color_space, + const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, SkYUVAInfo::Subsampling subsampling, const gpu::Mailbox yuva_plane_mailboxes[]) = 0;
diff --git a/gpu/command_buffer/common/raster_cmd_format_autogen.h b/gpu/command_buffer/common/raster_cmd_format_autogen.h index 0e9f513..04c63b0 100644 --- a/gpu/command_buffer/common/raster_cmd_format_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_autogen.h
@@ -1214,7 +1214,7 @@ static const uint8_t cmd_flags = CMD_FLAG_SET_TRACE_LEVEL(2); static uint32_t ComputeDataSize() { - return static_cast<uint32_t>(sizeof(GLbyte) * 80); + return static_cast<uint32_t>(sizeof(GLbyte) * 144); } static uint32_t ComputeSize() {
diff --git a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h index b7e092e..67b4e67 100644 --- a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
@@ -568,6 +568,70 @@ static_cast<GLbyte>(kSomeBaseValueToTestWith + 77), static_cast<GLbyte>(kSomeBaseValueToTestWith + 78), static_cast<GLbyte>(kSomeBaseValueToTestWith + 79), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 80), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 81), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 82), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 83), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 84), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 85), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 86), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 87), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 88), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 89), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 90), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 91), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 92), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 93), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 94), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 95), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 96), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 97), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 98), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 99), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 100), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 101), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 102), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 103), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 104), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 105), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 106), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 107), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 108), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 109), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 110), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 111), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 112), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 113), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 114), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 115), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 116), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 117), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 118), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 119), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 120), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 121), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 122), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 123), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 124), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 125), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 126), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 127), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 128), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 129), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 130), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 131), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 132), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 133), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 134), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 135), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 136), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 137), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 138), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 139), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 140), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 141), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 142), + static_cast<GLbyte>(kSomeBaseValueToTestWith + 143), }; cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate& cmd = *GetBufferAs<cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate>();
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 66bb5d7..26781419 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -750,6 +750,8 @@ GLuint v_stride, const volatile GLbyte* mailbox); + sk_sp<SkColorSpace> ReadSkColorSpace(const volatile GLbyte* bytes) const; + // Return true if all of `sk_yuv_color_space`, `sk_plane_config`, // `sk_subsampling`, `rgba_image, `num_yuva_images`, and `yuva_images` were // successfully populated. Return false on error. If this returns false, some @@ -1343,6 +1345,8 @@ feature_info()->feature_flags().enable_texture_half_float_linear; } #if BUILDFLAG(IS_WIN) + caps.shared_image_d3d = + D3DImageBackingFactory::IsD3DSharedImageSupported(gpu_preferences_); caps.shared_image_swap_chain = D3DImageBackingFactory::IsSwapChainSupported(); #endif // BUILDFLAG(IS_WIN) caps.disable_legacy_mailbox = disable_legacy_mailbox_; @@ -2916,6 +2920,19 @@ *result = 1; } +sk_sp<SkColorSpace> RasterDecoderImpl::ReadSkColorSpace( + const volatile GLbyte* bytes) const { + size_t offset = 0; + const volatile skcms_TransferFunction* transfer = + reinterpret_cast<const volatile skcms_TransferFunction*>(bytes + offset); + offset += sizeof(skcms_TransferFunction); + const volatile skcms_Matrix3x3* primaries = + reinterpret_cast<const volatile skcms_Matrix3x3*>(bytes + offset); + return SkColorSpace::MakeRGB( + const_cast<const skcms_TransferFunction&>(*transfer), + const_cast<const skcms_Matrix3x3&>(*primaries)); +} + bool RasterDecoderImpl::ConvertYUVACommon( const char* function_name, GLenum yuv_color_space_in, @@ -2995,8 +3012,8 @@ GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, - const volatile GLbyte* mailboxes_in) { - SkYUVColorSpace src_color_space; + const volatile GLbyte* bytes_in) { + SkYUVColorSpace src_yuv_color_space; SkYUVAInfo::PlaneConfig src_plane_config; SkYUVAInfo::Subsampling src_subsampling; std::unique_ptr<SkiaImageRepresentation> rgba_image; @@ -3004,11 +3021,13 @@ std::array<std::unique_ptr<SkiaImageRepresentation>, SkYUVAInfo::kMaxPlanes> yuva_images; if (!ConvertYUVACommon("ConvertYUVAMailboxesToRGB", planes_yuv_color_space, - plane_config, subsampling, mailboxes_in, - src_color_space, src_plane_config, src_subsampling, + plane_config, subsampling, bytes_in, + src_yuv_color_space, src_plane_config, src_subsampling, rgba_image, num_src_planes, yuva_images)) { return; } + sk_sp<SkColorSpace> src_rgb_color_space = ReadSkColorSpace( + bytes_in + (SkYUVAInfo::kMaxPlanes + 1) * sizeof(gpu::Mailbox)); std::vector<GrBackendSemaphore> begin_semaphores; std::vector<GrBackendSemaphore> end_semaphores; @@ -3062,11 +3081,11 @@ SkISize dest_size = SkISize::Make(dest_surface->width(), dest_surface->height()); SkYUVAInfo yuva_info(dest_size, src_plane_config, src_subsampling, - src_color_space); + src_yuv_color_space); GrYUVABackendTextures yuva_backend_textures(yuva_info, yuva_textures.data(), kTopLeft_GrSurfaceOrigin); - auto result_image = - SkImage::MakeFromYUVATextures(gr_context(), yuva_backend_textures); + auto result_image = SkImage::MakeFromYUVATextures( + gr_context(), yuva_backend_textures, src_rgb_color_space); if (!result_image) { LOCAL_SET_GL_ERROR( GL_INVALID_OPERATION, "glConvertYUVAMailboxesToRGB",
diff --git a/gpu/command_buffer/service/raster_decoder_autogen.h b/gpu/command_buffer/service/raster_decoder_autogen.h index 6b456df4..fbe9972 100644 --- a/gpu/command_buffer/service/raster_decoder_autogen.h +++ b/gpu/command_buffer/service/raster_decoder_autogen.h
@@ -397,7 +397,7 @@ GLenum plane_config = static_cast<GLenum>(c.plane_config); GLenum subsampling = static_cast<GLenum>(c.subsampling); uint32_t mailboxes_size; - if (!gles2::GLES2Util::ComputeDataSize<GLbyte, 80>(1, &mailboxes_size)) { + if (!gles2::GLES2Util::ComputeDataSize<GLbyte, 144>(1, &mailboxes_size)) { return error::kOutOfBounds; } if (mailboxes_size > immediate_data_size) {
diff --git a/gpu/config/gpu_finch_features.cc b/gpu/config/gpu_finch_features.cc index f7b135e2..d084986 100644 --- a/gpu/config/gpu_finch_features.cc +++ b/gpu/config/gpu_finch_features.cc
@@ -472,11 +472,8 @@ } bool IsANGLEValidationEnabled() { - if (!UsePassthroughCommandDecoder()) { - return false; - } - - return base::FeatureList::IsEnabled(kDefaultEnableANGLEValidation); + return base::FeatureList::IsEnabled(kDefaultEnableANGLEValidation) && + UsePassthroughCommandDecoder(); } #if BUILDFLAG(IS_ANDROID)
diff --git a/gpu/ipc/common/gpu_command_buffer_traits_multi.h b/gpu/ipc/common/gpu_command_buffer_traits_multi.h index 612743c..9b1d576 100644 --- a/gpu/ipc/common/gpu_command_buffer_traits_multi.h +++ b/gpu/ipc/common/gpu_command_buffer_traits_multi.h
@@ -137,6 +137,7 @@ IPC_STRUCT_TRAITS_MEMBER(msaa_is_slow) IPC_STRUCT_TRAITS_MEMBER(disable_one_component_textures) IPC_STRUCT_TRAITS_MEMBER(gpu_rasterization) + IPC_STRUCT_TRAITS_MEMBER(shared_image_d3d) IPC_STRUCT_TRAITS_MEMBER(chromium_image_rgb_emulation) IPC_STRUCT_TRAITS_MEMBER(dc_layers) IPC_STRUCT_TRAITS_MEMBER(protected_video_swap_chain)
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index 137146e..1db1c55 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -312,6 +312,14 @@ * [`//third_party/blink/renderer/core/svg/.+`](https://cs.chromium.org/chromium/src/third_party/blink/renderer/core/svg/) * [`//third_party/blink/renderer/platform/graphics/.+`](https://cs.chromium.org/chromium/src/third_party/blink/renderer/platform/graphics/) +* [linux-blink-web-tests-force-accessibility-rel](https://ci.chromium.org/p/chromium/builders/try/linux-blink-web-tests-force-accessibility-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-blink-web-tests-force-accessibility-rel"")) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+""linux-blink-web-tests-force-accessibility-rel"")) + + Path regular expressions: + * [`//third_party/blink/renderer/modules/accessibility/.+`](https://cs.chromium.org/chromium/src/third_party/blink/renderer/modules/accessibility/) + * [`//content/renderer/accessibility/.+`](https://cs.chromium.org/chromium/src/content/renderer/accessibility/) + * [`//content/browser/accessibility/.+`](https://cs.chromium.org/chromium/src/content/browser/accessibility/) + * [`//ui/accessibility/.+`](https://cs.chromium.org/chromium/src/ui/accessibility/) + * [linux-cfm-rel](https://ci.chromium.org/p/chromium/builders/try/linux-cfm-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-cfm-rel"")) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+""linux-cfm-rel"")) Path regular expressions: @@ -490,7 +498,7 @@ * Experiment percentage: 3.0 * [fuchsia-binary-size](https://ci.chromium.org/p/chromium/builders/try/fuchsia-binary-size) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""fuchsia-binary-size"")) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+""fuchsia-binary-size"")) - * Experiment percentage: 20.0 + * Experiment percentage: 50.0 * [linux-1mbu-compile-fyi-rel](https://ci.chromium.org/p/chromium/builders/try/linux-1mbu-compile-fyi-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-1mbu-compile-fyi-rel"")) ([matching builders](https://cs.chromium.org/search?q=+file:trybots.py+""linux-1mbu-compile-fyi-rel"")) * Experiment percentage: 5.0
diff --git a/infra/config/generated/cq-usage/full.cfg b/infra/config/generated/cq-usage/full.cfg index 99d11f7..ef5466ba 100644 --- a/infra/config/generated/cq-usage/full.cfg +++ b/infra/config/generated/cq-usage/full.cfg
@@ -357,6 +357,15 @@ location_regexp_exclude: ".+/[+]/infra/config/.+" } builders { + name: "chromium/try/linux-blink-web-tests-force-accessibility-rel" + location_regexp: ".+/[+]/third_party/blink/renderer/modules/accessibility/.+" + location_regexp: ".+/[+]/content/renderer/accessibility/.+" + location_regexp: ".+/[+]/content/browser/accessibility/.+" + location_regexp: ".+/[+]/ui/accessibility/.+" + location_regexp_exclude: ".+/[+]/docs/.+" + location_regexp_exclude: ".+/[+]/infra/config/.+" + } + builders { name: "chromium/try/linux-cfm-rel" location_regexp: ".+/[+]/chromeos/ash/components/chromebox_for_meetings/.+" location_regexp: ".+/[+]/chromeos/ash/components/dbus/chromebox_for_meetings/.+"
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 8fa70ea..d49c8a9 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -1871,7 +1871,7 @@ } builders { name: "chromium/try/fuchsia-binary-size" - experiment_percentage: 20 + experiment_percentage: 50 location_regexp: ".*" location_regexp_exclude: ".+/[+]/docs/.+" location_regexp_exclude: ".+/[+]/infra/config/.+" @@ -2545,7 +2545,44 @@ } builders { name: "chromium/try/linux-blink-web-tests-force-accessibility-rel" - includable_only: true + location_regexp: ".+/[+]/third_party/blink/renderer/modules/accessibility/.+" + location_regexp: ".+/[+]/content/renderer/accessibility/.+" + location_regexp: ".+/[+]/content/browser/accessibility/.+" + location_regexp: ".+/[+]/ui/accessibility/.+" + location_regexp_exclude: ".+/[+]/docs/.+" + location_regexp_exclude: ".+/[+]/infra/config/.+" + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "third_party/blink/renderer/modules/accessibility/.+" + } + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "content/renderer/accessibility/.+" + } + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "content/browser/accessibility/.+" + } + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "ui/accessibility/.+" + } + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "docs/.+" + exclude: true + } + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "infra/config/.+" + exclude: true + } } builders { name: "chromium/try/linux-cfm-rel"
diff --git a/infra/config/generated/luci/project.cfg b/infra/config/generated/luci/project.cfg index bddd90a..4c731471 100644 --- a/infra/config/generated/luci/project.cfg +++ b/infra/config/generated/luci/project.cfg
@@ -7,7 +7,7 @@ name: "chromium" access: "group:all" lucicfg { - version: "1.31.4" + version: "1.31.5" package_dir: "../.." config_dir: "generated/luci" entry_point: "main.star"
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star b/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star index 2579fec..67ed084c 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.accessibility.star
@@ -27,4 +27,12 @@ try_.builder( name = "linux-blink-web-tests-force-accessibility-rel", mirrors = ["ci/linux-blink-web-tests-force-accessibility-rel"], + tryjob = try_.job( + location_regexp = [ + ".+/[+]/third_party/blink/renderer/modules/accessibility/.+", + ".+/[+]/content/renderer/accessibility/.+", + ".+/[+]/content/browser/accessibility/.+", + ".+/[+]/ui/accessibility/.+", + ], + ), )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star index 6e05a41..18be405 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.fuchsia.star
@@ -61,7 +61,7 @@ }, }, tryjob = try_.job( - experiment_percentage = 20, + experiment_percentage = 50, ), )
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index 5b3b4b0..0a75111 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Jy kan vir bykomende veiligheid wagwoorde op jou toestel enkripteer voordat dit in Google Wagwoordbestuurder gestoor word.</translation> <translation id="7993619969781047893">Kenmerke op sommige werwe kan breek</translation> <translation id="800361585186029508">Maak die URL'e wat ingevoer is in Google Chrome oop.</translation> +<translation id="8016714545083187120">Gebruik altyd veilige verbindings</translation> <translation id="802154636333426148">Kon nie aflaai nie</translation> <translation id="8023878949384262191">Vou hierdie afdeling uit.</translation> <translation id="8027581147000338959">Maak in nuwe venster oop</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index 9f07d54..04418ef 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">ደህንነቱ አልተጠበቀም</translation> <translation id="3533202363250687977">ሁሉንም ማንነት የማያሳውቅ ትሮችን ዝጋ</translation> <translation id="3533436815740441613">አዲስ ትር</translation> +<translation id="3547799431091898961">በሁሉም ድር ጣቢያዎች ላይ የእርስዎን የGoogle መለያ ዘግተው ለመውጣት <ph name="BEGIN_LINK" />ከChrome ዘግተው ይውጡ<ph name="END_LINK" />።</translation> <translation id="3551320343578183772">ትር ዝጋ</translation> <translation id="3581564640715911333">በሌሎች ቋንቋዎች ለመተርጎም ሐሳብ አቅርብ</translation> <translation id="3588820906588687999">ምስሉን በአዲስ ትር ውስጥ ክፈት</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">አጉላ</translation> <translation id="6583087784430677195">ለማጥፋት <ph name="BEGIN_LINK" />ቅንብሮች<ph name="END_LINK" />ን ይክፈቱ እና ወደ የይለፍ ቃላትም በራስ-ሙላ ይሂዱ።</translation> <translation id="6585618849026997638">ዕልባት በማከል ለእርስዎ አስፈላጊ ወደ ሆነ ገጽ መመለስ ይችላሉ</translation> +<translation id="6596481460663245319">ምስልን በGoogle ይፈልጉ</translation> <translation id="6598875554591387303">በአታሚ ደርድር</translation> <translation id="6603393121510733479">የእርስዎ ድርጅት የግል አሰሳዎችን አጥፍቷል። <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index 9a9be6d..4f717e5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -313,6 +313,7 @@ <translation id="3529024052484145543">غير آمن</translation> <translation id="3533202363250687977">إغلاق جميع علامات تبويب التصفُّح المتخفي</translation> <translation id="3533436815740441613">علامة تبويب جديدة</translation> +<translation id="3547799431091898961">لتسجيل الخروج من حسابك على Google في جميع المواقع الإلكترونية، <ph name="BEGIN_LINK" />سجِّل الخروج من متصفِّح Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">إغلاق علامة التبويب</translation> <translation id="3581564640715911333">اقتراح ترجمة الصفحات المكتوبة بلغات أخرى</translation> <translation id="3588820906588687999">فتح صورة في علامة تبويب جديدة</translation> @@ -683,6 +684,7 @@ <translation id="6561262006871132942">تكبير</translation> <translation id="6583087784430677195">لإيقاف ميزة "الملء التلقائي"، افتح <ph name="BEGIN_LINK" />Settings (الإعدادات)<ph name="END_LINK" /> ثم انتقِل إلى Passwords (كلمات المرور).</translation> <translation id="6585618849026997638">يمكنك الرجوع إلى أي صفحة تهمك من خلال إضافة إشارة مرجعية لها.</translation> +<translation id="6596481460663245319">البحث باستخدام صورة مع Google</translation> <translation id="6598875554591387303">الترتيب حسب الناشر</translation> <translation id="6603393121510733479">أوقفت مؤسستك وضع "التصفّح بخصوصيّة تامّة". <ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index 74c99dcc..51e7102c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">অতিৰিক্ত সুৰক্ষাৰ বাবে, Google পাছৱৰ্ড পৰিচালকত ছেভ কৰাৰ পূৰ্বে আপোনাৰ ডিভাইচত পাছৱৰ্ড এনক্ৰিপ্ট কৰক।</translation> <translation id="7993619969781047893">কিছুমান ছাইটত সুবিধাসমূহ ব্যাহত হ’ব পাৰে</translation> <translation id="800361585186029508">ইনপুট কৰা URLসমূহ Google Chromeত খোলে।</translation> +<translation id="8016714545083187120">সদায় সুৰক্ষিত সংযোগ ব্যৱহাৰ কৰক</translation> <translation id="802154636333426148">ডাউনল’ড কৰিব পৰা নগ’ল</translation> <translation id="8023878949384262191">শাখাটো বিস্তাৰ কৰে।</translation> <translation id="8027581147000338959">নতুন ৱিণ্ড’ত খোলক</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index 5b79485..d1d2f02 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Təhlükəsizliyi artırmaq üçün Google Parol Menecerində saxlanmazdan əvvəl cihazınızda parolları şifrələyin.</translation> <translation id="7993619969781047893">Bəzi saytlardakı xüsusiyyətlər işləməyə bilər</translation> <translation id="800361585186029508">Google Chrome'da daxil edilən keçidləri açır.</translation> +<translation id="8016714545083187120">Həmişə Güvənli Bağlantılardan istifadə edin</translation> <translation id="802154636333426148">Endirmə alınmadı</translation> <translation id="8023878949384262191">Bölməni genişləndirir.</translation> <translation id="8027581147000338959">Yeni Pəncərədə Açın</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_be.xtb b/ios/chrome/app/strings/resources/ios_strings_be.xtb index b61c018b..398a5469 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Небяспечнае змесціва</translation> <translation id="3533202363250687977">Закрыць усе ўкладкі інкогніта</translation> <translation id="3533436815740441613">Новая ўкладка</translation> +<translation id="3547799431091898961">Каб выйсці з Уліковага запісу Google на ўсіх вэб-сайтах, <ph name="BEGIN_LINK" />выйдзіце з Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Закрыць укладку</translation> <translation id="3581564640715911333">Прапаноўваць перакладаць старонкі на іншых мовах</translation> <translation id="3588820906588687999">Адкрыць відарыс у новай укладцы</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Павялічыць</translation> <translation id="6583087784430677195">Для выключэння адкрыйце <ph name="BEGIN_LINK" />Налады<ph name="END_LINK" /> і перайдзіце ў раздзел "Аўтазапаўненне пароляў".</translation> <translation id="6585618849026997638">Каб мець магчымасць вярнуцца да важнай для вас старонкі пазней, можна дадаць закладку</translation> +<translation id="6596481460663245319">Пошук відарыса ў Google</translation> <translation id="6598875554591387303">Сартаваць па выдаўцу</translation> <translation id="6603393121510733479">Ваша арганізацыя адключыла прыватны прагляд. <ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 94aa113..d00dcf2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Няма защита</translation> <translation id="3533202363250687977">Затв. на разделите „инкогнито“</translation> <translation id="3533436815740441613">Нов раздел</translation> +<translation id="3547799431091898961">За да излезете от профила си в Google на всички уебсайтове, <ph name="BEGIN_LINK" />излезте от профила си в Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Затваряне на раздела</translation> <translation id="3581564640715911333">Извеждане на предложения за превод на страниците, написани на други езици</translation> <translation id="3588820906588687999">Отваряне на изображението в нов раздел</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Приближаване</translation> <translation id="6583087784430677195">За да изключите функцията, отворете <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" /> и след това AutoFill Passwords.</translation> <translation id="6585618849026997638">Можете да се върнете на важна за вас страница, като добавите отметка</translation> +<translation id="6596481460663245319">Търсене на изобр. с Google</translation> <translation id="6598875554591387303">Сортиране по издател</translation> <translation id="6603393121510733479">Организацията ви е изключила режима за частно сърфиране. <ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 3779a66..9ce585e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -852,6 +852,7 @@ <translation id="7987685713885608670">অতিরিক্ত নিরাপত্তার জন্য, Google পাসওয়ার্ড ম্যানেজারে সেভ করার আগে আপনার ডিভাইসে পাসওয়ার্ড এনক্রিপ্ট করুন।</translation> <translation id="7993619969781047893">কিছু কিছু সাইটের ফিচারগুলি কাজ নাও করতে পারে</translation> <translation id="800361585186029508">Google Chrome-এ ইনপুট করা ইউআরএলগুলি খোলে।</translation> +<translation id="8016714545083187120">সবসময় সুরক্ষিত কানেকশন ব্যবহার করুন</translation> <translation id="802154636333426148">ডাউনলোড করা যায়নি</translation> <translation id="8023878949384262191">বিভাগটি প্রসারিত করে।</translation> <translation id="8027581147000338959">নতুন উইন্ডোতে খুলুন</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index 55634c9d..e439d57 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -311,7 +311,7 @@ <translation id="3529024052484145543">Nije sigurno</translation> <translation id="3533202363250687977">Zatvori sve anonimne kartice</translation> <translation id="3533436815740441613">Nova kartica</translation> -<translation id="3547799431091898961">Da biste se odjavili sa svojeg Google računa na svim web-lokacijama, <ph name="BEGIN_LINK" />odjavite se iz Chromea<ph name="END_LINK" />.</translation> +<translation id="3547799431091898961">Da se odjavite s Google računa na svim web lokacijama, <ph name="BEGIN_LINK" />odjavite se iz Chromea<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Zatvori karticu</translation> <translation id="3581564640715911333">Ponudi prevođenje stranica na drugim jezicima</translation> <translation id="3588820906588687999">Otvori sliku na novoj kartici</translation> @@ -682,7 +682,7 @@ <translation id="6561262006871132942">Uvećaj</translation> <translation id="6583087784430677195">Da isključite, otvorite <ph name="BEGIN_LINK" />Postavke<ph name="END_LINK" /> i idite u Automatsko popunjavanje lozinki.</translation> <translation id="6585618849026997638">Dodavanjem oznake možete se vratiti na stranicu koja vam je važna</translation> -<translation id="6596481460663245319">Pretraži sliku na Googleu</translation> +<translation id="6596481460663245319">Pretražite sliku pomoću Googlea</translation> <translation id="6598875554591387303">Poredaj po izdavaču</translation> <translation id="6603393121510733479">Vaša organizacija je isključila privatno pregledavanje. <ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index f47c22b..b111347 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Nezabezpečeno</translation> <translation id="3533202363250687977">Zavřít všechny anonymní karty</translation> <translation id="3533436815740441613">Nová karta</translation> +<translation id="3547799431091898961">Pokud se chcete odhlásit od účtu Google na všech webech, <ph name="BEGIN_LINK" />odhlaste se z Chromu<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Zavřít kartu</translation> <translation id="3581564640715911333">Nabízet překlad stránek v jiných jazycích</translation> <translation id="3588820906588687999">Otevřít obrázek na nové kartě</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Přiblížit</translation> <translation id="6583087784430677195">Pokud tuto funkci chcete vypnout, otevřete <ph name="BEGIN_LINK" />Nastavení<ph name="END_LINK" /> a přejděte na Automatické vyplnění hesel.</translation> <translation id="6585618849026997638">Na stránky, které si přidáte do záložek, se budete moci snadno rychle vrátit</translation> +<translation id="6596481460663245319">Vyhledat obrázek pomocí Googlu</translation> <translation id="6598875554591387303">Seřadit podle vydavatele</translation> <translation id="6603393121510733479">Vaše organizace vypnula soukromé prohlížení. <ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Za účelem zvýšení zabezpečení zašifrovat hesla v zařízení před uložením do Správce hesel Google.</translation> <translation id="7993619969781047893">Některé weby mohou přestat fungovat</translation> <translation id="800361585186029508">Otevře zadané adresy URL v prohlížeči Google Chrome.</translation> +<translation id="8016714545083187120">Vždy používat zabezpečená připojení</translation> <translation id="802154636333426148">Stažení se nezdařilo</translation> <translation id="8023878949384262191">Rozbalí sekci.</translation> <translation id="8027581147000338959">Otevřít v novém okně</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index 1d99901..53fdbe83 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Am ddiogelwch ychwanegol, amgryptiwch gyfrineiriau ar eich dyfais cyn iddynt gael eu cadw i Reolwr Cyfrineiriau Google.</translation> <translation id="7993619969781047893">Mae'n bosib y bydd nodweddion ar rai gwefannau yn torri</translation> <translation id="800361585186029508">Yn agor y cyfeiriadau URL a fewnbynnwyd yn Google Chrome.</translation> +<translation id="8016714545083187120">Defnyddio Cysylltiadau Diogel Bob Tro</translation> <translation id="802154636333426148">Wedi methu â lawrlwytho</translation> <translation id="8023878949384262191">Yn ehangu'r adran.</translation> <translation id="8027581147000338959">Agor mewn Ffenestr Newydd</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index c76919e7..3b8b6095 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">For at beskytte adgangskoderne yderligere krypteres de på din enhed, inden de gemmes i Googles Adgangskodeadministrator.</translation> <translation id="7993619969781047893">Funktioner på visse websites fungerer muligvis ikke</translation> <translation id="800361585186029508">Åbner de angivne webadresser i Google Chrome.</translation> +<translation id="8016714545083187120">Brug altid sikre forbindelser</translation> <translation id="802154636333426148">Download mislykkedes</translation> <translation id="8023878949384262191">Udvider sektionen.</translation> <translation id="8027581147000338959">Åbn i nyt vindue</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index 1b25d9de..2b74856 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Nicht sicher</translation> <translation id="3533202363250687977">Alle Inkognito-Tabs schließen</translation> <translation id="3533436815740441613">Neuer Tab</translation> +<translation id="3547799431091898961">Du kannst dich auf allen Websites aus deinem Google-Konto abmelden, indem du dich <ph name="BEGIN_LINK" />von Chrome abmeldest<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Tab schließen</translation> <translation id="3581564640715911333">Übersetzung für Seiten in andere Sprachen anbieten</translation> <translation id="3588820906588687999">Bild in neuem Tab öffnen</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Heranzoomen</translation> <translation id="6583087784430677195">Öffne zum Deaktivieren die <ph name="BEGIN_LINK" />Einstellungen<ph name="END_LINK" /> und gehe zu „Passwörter automatisch ausfüllen“.</translation> <translation id="6585618849026997638">Du kannst Lesezeichen setzen, damit du zu Seiten zurückfindest, die für dich interessant sind</translation> +<translation id="6596481460663245319">Bild mit Google suchen</translation> <translation id="6598875554591387303">Nach Publisher sortieren</translation> <translation id="6603393121510733479">Deine Organisation hat das private Surfen deaktiviert. <ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 45b7248..f6c0a44 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -852,6 +852,7 @@ <translation id="7987685713885608670">Για επιπλέον ασφάλεια, κρυπτογραφήστε τους κωδικούς πρόσβασης στη συσκευή σας προτού αποθηκευτούν στον Διαχειριστή κωδικών πρόσβασης Google.</translation> <translation id="7993619969781047893">Μπορεί να παρουσιαστούν προβλήματα στις λειτουργίες ορισμένων ιστοτόπων.</translation> <translation id="800361585186029508">Άνοιγμα των εισαγόμενων URL στο Google Chrome.</translation> +<translation id="8016714545083187120">Να χρησιμοποιούνται πάντα ασφαλείς συνδέσεις</translation> <translation id="802154636333426148">Η λήψη απέτυχε</translation> <translation id="8023878949384262191">Ανάπτυξη ενότητας.</translation> <translation id="8027581147000338959">Άνοιγμα σε Νέο Παράθυρο</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb index 5a498257c..e70e6ce 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">No seguro</translation> <translation id="3533202363250687977">Cerrar todas las pestañas de incógnito</translation> <translation id="3533436815740441613">Nueva pestaña</translation> +<translation id="3547799431091898961">Para salir de tu Cuenta de Google en todos los sitios web, debes <ph name="BEGIN_LINK" />salir de Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Cerrar pestaña</translation> <translation id="3581564640715911333">Ofrecer la traducción de páginas en otros idiomas</translation> <translation id="3588820906588687999">Abrir imagen en nueva pestaña</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Acercar</translation> <translation id="6583087784430677195">Para desactivar esta función, abre <ph name="BEGIN_LINK" />Configuración<ph name="END_LINK" /> y ve a Autocompletar contraseñas.</translation> <translation id="6585618849026997638">Agrega un favorito para poder regresar a una página que consideres importante</translation> +<translation id="6596481460663245319">Buscar imagen con Google</translation> <translation id="6598875554591387303">Ordenar por publicador</translation> <translation id="6603393121510733479">Tu organización desactivó la navegación privada. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Para más seguridad, encripta las contraseñas en tu dispositivo antes de que se guarden en el Administrador de contraseñas de Google.</translation> <translation id="7993619969781047893">Es posible que las características de algunos sitios no funcionen de forma correcta</translation> <translation id="800361585186029508">Abre las URL ingresadas en Google Chrome.</translation> +<translation id="8016714545083187120">Usar siempre conexiones seguras</translation> <translation id="802154636333426148">Error en la descarga</translation> <translation id="8023878949384262191">Expande la sección.</translation> <translation id="8027581147000338959">Abrir en una nueva ventana</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index a50134e..5453c08 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">No es seguro</translation> <translation id="3533202363250687977">Cerrar todas las pestañas de incógnito</translation> <translation id="3533436815740441613">Nueva pestaña</translation> +<translation id="3547799431091898961">Para cerrar sesión en tu cuenta de Google en todos los sitios web, <ph name="BEGIN_LINK" />cierra sesión en Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Cerrar pestaña</translation> <translation id="3581564640715911333">Ofrecer la traducción de páginas que estén en otros idiomas</translation> <translation id="3588820906588687999">Abrir imagen en una pestaña nueva</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Ampliar</translation> <translation id="6583087784430677195">Para desactivar esta función, abre <ph name="BEGIN_LINK" />Ajustes<ph name="END_LINK" /> y ve a Autorellenar contraseñas.</translation> <translation id="6585618849026997638">Si añades un marcador a una página que consideres importante, podrás volver a ella más tarde.</translation> +<translation id="6596481460663245319">Buscar imagen con Google</translation> <translation id="6598875554591387303">Ordenar por editor</translation> <translation id="6603393121510733479">Tu organización ha desactivado la navegación privada. <ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index d3beb29..fb8c687 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Turvalisuse suurendamiseks krüpteerige paroolid oma seadmes, enne kui need salvestatakse Google'i paroolihaldurisse.</translation> <translation id="7993619969781047893">Mõne saidi funktsioonid ei pruugi töötada.</translation> <translation id="800361585186029508">Sisestatud URL-id avatakse Google Chrome'is.</translation> +<translation id="8016714545083187120">Kasuta alati turvalisi ühendusi</translation> <translation id="802154636333426148">Allalaadimine ebaõnnestus</translation> <translation id="8023878949384262191">Laiendab jaotist.</translation> <translation id="8027581147000338959">Ava uues aknas</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 2b2516b3..65d331c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Seguruagoa izan dadin, enkriptatu pasahitzak gailuan bertan Google-ren Pasahitz-kudeatzailea zerbitzuan gorde aurretik.</translation> <translation id="7993619969781047893">Baliteke webgune batzuetako eginbideek ez funtzionatzea</translation> <translation id="800361585186029508">Idatzitako URLak Google Chrome-n irekitzen ditu.</translation> +<translation id="8016714545083187120">Erabili beti konexio seguruak</translation> <translation id="802154636333426148">Ezin izan da deskargatu</translation> <translation id="8023878949384262191">Hautapena zabaltzen du.</translation> <translation id="8027581147000338959">Ireki beste leiho batean</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index 9c05a1b..73a4810 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">ناامن</translation> <translation id="3533202363250687977">بستن همه برگههای حالت ناشناس</translation> <translation id="3533436815740441613">برگه جدید</translation> +<translation id="3547799431091898961">برای خارج شدن از سیستم «حساب Google» خود در همه وبسایتها، <ph name="BEGIN_LINK" />از سیستم Chrome خارج شوید<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">بستن برگه</translation> <translation id="3581564640715911333">پیشنهاد ترجمه صفحات نوشتهشده به زبانهای دیگر</translation> <translation id="3588820906588687999">باز کردن تصویر در برگه جدید</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">بزرگ کردن</translation> <translation id="6583087784430677195">برای خاموش کردن، <ph name="BEGIN_LINK" />تنظیمات<ph name="END_LINK" /> را باز کنید و به «تکمیل خودکار گذرواژهها» بروید.</translation> <translation id="6585618849026997638">با اضافه کردن نشانک، میتوانید به صفحهای که برایتان مهم است برگردید</translation> +<translation id="6596481460663245319">جستجوی تصویر با Google</translation> <translation id="6598875554591387303">مرتبسازی براساس ناشر</translation> <translation id="6603393121510733479">سازمانتان مرور خصوصی را خاموش کرده است. <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">برای افزایش ایمنی، گذرواژهها را قبلاز ذخیره شدن در «مدیر گذرواژه Google» در دستگاهتان رمزگذاری میکند.</translation> <translation id="7993619969781047893">ویژگیهای بعضی از سایتها ممکن است درست کار نکنند</translation> <translation id="800361585186029508">نشانیهای وب واردشده در Google Chrome را باز میکند.</translation> +<translation id="8016714545083187120">همیشه از اتصالهای امن استفاده شود</translation> <translation id="802154636333426148">بارگیری نشد</translation> <translation id="8023878949384262191">بخش را بزرگ میکند.</translation> <translation id="8027581147000338959">باز کردن در پنجرهٔ جدید</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 0602011..c3d26266 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Salasanat kannattaa salata turvallisuussyistä laitteella ennen niiden tallentamista Googlen Salasanojen ylläpitoon.</translation> <translation id="7993619969781047893">Joidenkin sivustojen ominaisuudet saattavat lakata toimimasta</translation> <translation id="800361585186029508">Avaa syötetyt URL-osoitteet Google Chromessa.</translation> +<translation id="8016714545083187120">Käytä aina suojattuja yhteyksiä</translation> <translation id="802154636333426148">Lataus epäonnistui.</translation> <translation id="8023878949384262191">Laajentaa osion.</translation> <translation id="8027581147000338959">Avaa uudessa ikkunassa</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 83045857..b3b05e95 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Hindi secure</translation> <translation id="3533202363250687977">Isara ang Lahat ng Tab na Incognito</translation> <translation id="3533436815740441613">Bagong Tab</translation> +<translation id="3547799431091898961">Para mag-sign out sa iyong Google Account sa lahat ng website, <ph name="BEGIN_LINK" />mag-sign out sa chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Isara ang Tab</translation> <translation id="3581564640715911333">Mag-alok na mag-translate ng mga page sa iba pang wika</translation> <translation id="3588820906588687999">Buksan ang Larawan sa Bagong Tab</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Mag-zoom In</translation> <translation id="6583087784430677195">Para i-off, buksan ang <ph name="BEGIN_LINK" />Mga Setting<ph name="END_LINK" /> at pumunta sa I-autofill ang Mga Password.</translation> <translation id="6585618849026997638">Mababalikan mo ang isang page na mahalaga sa iyo sa pamamagitan ng pagdaragdag ng bookmark</translation> +<translation id="6596481460663245319">Hanapin ang Larawan gamit ang Google</translation> <translation id="6598875554591387303">Pagbukud-bukurin ayon sa Publisher</translation> <translation id="6603393121510733479">Na-off ng iyong organisasyon ang pribadong pag-browse. <ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index 8a4d2204..ae4d602 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Non sécurisé</translation> <translation id="3533202363250687977">Fermer tous les onglets de navigation privée</translation> <translation id="3533436815740441613">Nouvel onglet</translation> +<translation id="3547799431091898961">Pour vous déconnecter de votre compte Google sur tous les sites Web, <ph name="BEGIN_LINK" />déconnectez-vous de Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Fermer l'onglet</translation> <translation id="3581564640715911333">Proposer de traduire les pages dans d'autres langues</translation> <translation id="3588820906588687999">Ouvrir l'image dans un nouvel onglet</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Zoom avant</translation> <translation id="6583087784430677195">Pour désactiver cela, ouvrez les <ph name="BEGIN_LINK" />Réglages<ph name="END_LINK" />, puis accédez à "Saisir automatiquement les mots de passe".</translation> <translation id="6585618849026997638">Ajoutez les pages qui vous intéressent à vos favoris pour pouvoir y revenir facilement</translation> +<translation id="6596481460663245319">Rechercher dans l'image avec Google</translation> <translation id="6598875554591387303">Trier par éditeur</translation> <translation id="6603393121510733479">Votre organisation a désactivé la navigation privée. <ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index 76a71a8..d8bdc05 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">सुरक्षित नहीं है</translation> <translation id="3533202363250687977">सभी 'गुप्त' टैब बंद करें</translation> <translation id="3533436815740441613">नया टैब</translation> +<translation id="3547799431091898961">सभी वेबसाइटों पर, अपने Google खाते से साइन आउट करने के लिए, <ph name="BEGIN_LINK" />Chrome से साइन आउट करें<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">टैब बंद करें</translation> <translation id="3581564640715911333">दूसरी भाषाओं में पेजों का अनुवाद करने की सुविधा दें</translation> <translation id="3588820906588687999">इमेज को 'नए टैब' में खोलें</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">ज़ूम इन करें</translation> <translation id="6583087784430677195">इसे बंद करने के लिए, <ph name="BEGIN_LINK" />सेटिंग<ph name="END_LINK" /> खोलें और पासवर्ड अपने-आप भरने की सुविधा पर जाएं.</translation> <translation id="6585618849026997638">किसी भी अहम पेज पर आसानी से वापस जाने के लिए, आप उसे बुकमार्क कर सकते हैं</translation> +<translation id="6596481460663245319">Google की मदद से इमेज खोजें</translation> <translation id="6598875554591387303">पब्लिशर के मुताबिक क्रम से लगाएं</translation> <translation id="6603393121510733479">आपके संगठन ने निजी ब्राउज़िंग की सुविधा बंद कर दी है. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index f5b093ff..c9367a4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Անվտանգ չէ</translation> <translation id="3533202363250687977">Փակել բոլոր ինկոգնիտո ներդիրները</translation> <translation id="3533436815740441613">Նոր ներդիր</translation> +<translation id="3547799431091898961">Բոլոր կայքերում ձեր Google հաշվից դուրս գալու համար <ph name="BEGIN_LINK" />դուրս եկեք Chrome-ից<ph name="END_LINK" />։</translation> <translation id="3551320343578183772">Փակել ներդիրը</translation> <translation id="3581564640715911333">Առաջարկել էջերի թարգմանությունն այլ լեզուներով</translation> <translation id="3588820906588687999">Բացել պատկերը նոր ներդիրում</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Մեծացնել</translation> <translation id="6583087784430677195">Անջատելու համար բացեք <ph name="BEGIN_LINK" />Կարգավորումները<ph name="END_LINK" /> և անցեք «Գաղտնաբառերի ինքնալրացում»։</translation> <translation id="6585618849026997638">Էջանշեք կարևոր էջերը, որպեսզի կարողանաք վերադառնալ դրանց</translation> +<translation id="6596481460663245319">Որոնել պատկեր Google-ում</translation> <translation id="6598875554591387303">Տեսակավորել ըստ հրատարակչի</translation> <translation id="6603393121510733479">Ձեր կազմակերպությունն անջատել է ինկոգնիտո ռեժիմը։ <ph name="BEGIN_LINK" />Իմանալ ավելին<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Անվտանգության մակարդակը բարձրացնելու համար գաղտնաբառերը գաղտնագրեք ձեր սարքում՝ նախքան Google Գաղտնաբառերի կառավարիչում պահելը։</translation> <translation id="7993619969781047893">Որոշ կայքերում գործառույթները կարող են չաշխատել։</translation> <translation id="800361585186029508">Մուտքագրված URL-ները բացվում են Google Chrome-ում։</translation> +<translation id="8016714545083187120">Միշտ օգտագործել անվտանգ միացումներ</translation> <translation id="802154636333426148">Ներբեռնումը ձախողվեց</translation> <translation id="8023878949384262191">Ընդարձակում է բաժինը:</translation> <translation id="8027581147000338959">Բացել նոր պատուհանում</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index 60af67cf..9df8545 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Untuk keamanan tambahan, enkripsi sandi di perangkat Anda sebelum disimpan ke Pengelola Sandi Google.</translation> <translation id="7993619969781047893">Fitur pada beberapa situs mungkin error</translation> <translation id="800361585186029508">Membuka URL yang dimasukkan di Google Chrome.</translation> +<translation id="8016714545083187120">Selalu Gunakan Koneksi Aman</translation> <translation id="802154636333426148">Download gagal</translation> <translation id="8023878949384262191">Luaskan bagian.</translation> <translation id="8027581147000338959">Buka di Jendela Baru</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index 07f07707..f45aa9c04 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Ekki öruggt</translation> <translation id="3533202363250687977">Loka öllum huliðsflipum</translation> <translation id="3533436815740441613">Nýr flipi</translation> +<translation id="3547799431091898961">Til að skrá þig út af Google reikningnum þínum á öllum vefsvæðum skaltu <ph name="BEGIN_LINK" />skrá þig út af Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Loka flipa</translation> <translation id="3581564640715911333">Bjóðast til að þýða síður á önnur tungumál</translation> <translation id="3588820906588687999">Opna mynd í nýjum flipa</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Auka aðdrátt</translation> <translation id="6583087784430677195">Opnaðu <ph name="BEGIN_LINK" />Stillingar<ph name="END_LINK" /> og síðan „Sjálfvirk útfylling aðgangsorða“ til að slökkva.</translation> <translation id="6585618849026997638">Þú getur komist aftur á mikilvæga síðu á einfaldan hátt með því að setja inn bókamerki</translation> +<translation id="6596481460663245319">Leita að mynd með Google</translation> <translation id="6598875554591387303">Raða eftir útgefanda</translation> <translation id="6603393121510733479">Fyrirtækið þitt slökkti á óskráðri vefnotkun. <ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Dulkóðaðu aðgangsorðin þín í tækinu áður en þau eru vistuð í aðgangsorðastjórnun Google til að auka öryggið.</translation> <translation id="7993619969781047893">Ekki er víst að allir eiginleikar á öllum vefsvæðum virki</translation> <translation id="800361585186029508">Opnar innslegnar vefslóðir í Google Chrome.</translation> +<translation id="8016714545083187120">Nota ávallt öruggar tengingar</translation> <translation id="802154636333426148">Niðurhal mistókst</translation> <translation id="8023878949384262191">Stækkar hlutann.</translation> <translation id="8027581147000338959">Opna í nýjum glugga</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 03bb472..a20a77a8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">כדי לשפר את הבטיחות, כדאי להצפין את הסיסמאות במכשיר שלך לפני שהן נשמרות במנהל הסיסמאות של Google.</translation> <translation id="7993619969781047893">ייתכן שהתכונות של חלק מהאתרים לא יפעלו כראוי</translation> <translation id="800361585186029508">פתיחת כתובות ה-URL שהוזנו ב-Google Chrome.</translation> +<translation id="8016714545083187120">להשתמש תמיד בחיבורים מאובטחים</translation> <translation id="802154636333426148">ההורדה נכשלה</translation> <translation id="8023878949384262191">מרחיב את הקטע.</translation> <translation id="8027581147000338959">פתיחה בחלון חדש</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index c6e0269..c74890b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Қауіпсіз емес</translation> <translation id="3533202363250687977">Барлық инкогнито қойындыларын жабу</translation> <translation id="3533436815740441613">Жаңа қойынды</translation> +<translation id="3547799431091898961">Барлық веб-сайтта Google аккаунтынан шығу үшін <ph name="BEGIN_LINK" />Chrome-де аккаунттан шығыңыз<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Қойындыны жабу</translation> <translation id="3581564640715911333">Басқа тілдердегі беттердің аудармасын ұсыну</translation> <translation id="3588820906588687999">Кескінді жаңа қойындыда ашу</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Ұлғайту</translation> <translation id="6583087784430677195">Өшіру үшін <ph name="BEGIN_LINK" />Параметрлерді<ph name="END_LINK" /> ашып, "Құпия сөздерді автоматты түрде толтыру" бөліміне өтіңіз.</translation> <translation id="6585618849026997638">Бетбелгі енгізу арқылы маңызды бетке орала аласыз.</translation> +<translation id="6596481460663245319">Кескінді Google-мен іздеу</translation> <translation id="6598875554591387303">Жариялаушы бойынша сұрыптау</translation> <translation id="6603393121510733479">Ұйымыңыз құпия шарлау режимін өшірді. <ph name="BEGIN_LINK" />Толығырақ<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Қосымша қауіпсіздікті қамтамасыз ету үшін құрылғыдағы құпия сөздерді Google Құпия сөздер реттегішіне сақтамас бұрын шифрлаңыз.</translation> <translation id="7993619969781047893">Кейбір сайттағы функциялар дұрыс жұмыс істемеуі мүмкін.</translation> <translation id="800361585186029508">Google Chrome браузерінде енгізілген URL мекенжайларын ашады.</translation> +<translation id="8016714545083187120">Әрдайым қауіпсіз байланыстарды пайдалану</translation> <translation id="802154636333426148">Жүктеу сәтсіз аяқталды</translation> <translation id="8023878949384262191">Бөлімді кеңейтеді.</translation> <translation id="8027581147000338959">Жаңа терезеден ашу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index b038b9e..5a48720 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">គ្មានសុវត្ថិភាពទេ</translation> <translation id="3533202363250687977">បិទផ្ទាំងឯកជនទាំងអស់</translation> <translation id="3533436815740441613">ផ្ទាំងថ្មី</translation> +<translation id="3547799431091898961">ដើម្បីចេញពីគណនី Google របស់អ្នកនៅលើគ្រប់គេហទំព័រ សូម<ph name="BEGIN_LINK" />ចេញពី chrome<ph name="END_LINK" />។</translation> <translation id="3551320343578183772">បិទផ្ទាំង</translation> <translation id="3581564640715911333">ផ្តល់ជូនការបកប្រែទំព័រជាភាសាផ្សេងទៀត</translation> <translation id="3588820906588687999">បើករូបភាពនៅក្នុងផ្ទាំងថ្មី</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">ពង្រីក</translation> <translation id="6583087784430677195">ដើម្បីបិទ សូមបើក<ph name="BEGIN_LINK" />ការកំណត់<ph name="END_LINK" /> ហើយចូលទៅកាន់ "បំពេញពាក្យសម្ងាត់ស្វ័យប្រវត្តិ"។</translation> <translation id="6585618849026997638">អ្នកអាចត្រឡប់ទៅទំព័រដែលសំខាន់ចំពោះអ្នក តាមរយៈការបញ្ចូលចំណាំ</translation> +<translation id="6596481460663245319">ស្វែងរករូបភាពតាម Google</translation> <translation id="6598875554591387303">តម្រៀបតាមអ្នកបោះផ្សាយ</translation> <translation id="6603393121510733479">ស្ថាប័នរបស់អ្នកបានបិទការរុករកលក្ខណៈឯកជន។ <ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 333f7982..e4b7d12 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">ಹೆಚ್ಚಿನ ಸುರಕ್ಷತೆಗಾಗಿ, ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು Google ಪಾಸ್ವರ್ಡ್ ನಿರ್ವಾಹಕದಲ್ಲಿ ಉಳಿಸುವ ಮೊದಲು ಅವುಗಳನ್ನು ನಿಮ್ಮ ಸಾಧನದಲ್ಲಿ ಎನ್ಕ್ರಿಪ್ಟ್ ಮಾಡಿ.</translation> <translation id="7993619969781047893">ಕೆಲವು ಸೈಟ್ಗಳಲ್ಲಿನ ಫೀಚರ್ಗಳು ಕಾರ್ಯನಿರ್ವಹಿಸುವುದನ್ನು ನಿಲ್ಲಿಸಬಹುದು</translation> <translation id="800361585186029508">Google Chrome ನಲ್ಲಿ ಇನ್ಪುಟ್ ಮಾಡಿದ URL ಗಳನ್ನು ತೆರೆಯುತ್ತದೆ.</translation> +<translation id="8016714545083187120">ಯಾವಾಗಲೂ ಸುರಕ್ಷಿತವಾದ ಕನೆಕ್ಷನ್ಗಳನ್ನು ಬಳಸಿ</translation> <translation id="802154636333426148">ಡೌನ್ಲೋಡ್ ವಿಫಲಗೊಂಡಿದೆ</translation> <translation id="8023878949384262191">ವಿಭಾಗವನ್ನು ವಿಸ್ತರಿಸುತ್ತದೆ.</translation> <translation id="8027581147000338959">ಹೊಸ ವಿಂಡೋದಲ್ಲಿ ತೆರೆಯಿರಿ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index a4e18af..f004f16 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">보안 강화를 위해 비밀번호를 기기 내에서 암호화한 후 Google 비밀번호 관리자에 저장합니다</translation> <translation id="7993619969781047893">일부 사이트에서는 기능이 작동하지 않을 수 있음</translation> <translation id="800361585186029508">입력된 URL을 Chrome에서 엽니다.</translation> +<translation id="8016714545083187120">항상 보안 연결 사용</translation> <translation id="802154636333426148">다운로드 실패</translation> <translation id="8023878949384262191">섹션을 확장합니다.</translation> <translation id="8027581147000338959">새 창에서 열기</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index 3c33725..14edc17 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Кооптуу</translation> <translation id="3533202363250687977">Бардык жашыруун өтмөктөрдү жабуу</translation> <translation id="3533436815740441613">Жаңы өтмөк</translation> +<translation id="3547799431091898961">Бардык вебсайттарда Google аккаунтуңуздан чыгуу үчүн <ph name="BEGIN_LINK" />Chrome'дон чыгыңыз<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Өтмөктү жабуу</translation> <translation id="3581564640715911333">Башка тилдердеги барактарды которуу сунушталсын</translation> <translation id="3588820906588687999">Сүрөттү жаңы өтмөктө ачуу</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Чоңойтуу</translation> <translation id="6583087784430677195">Өчүрүү үчүн <ph name="BEGIN_LINK" />Жөндөөлөрдү<ph name="END_LINK" /> ачып, Сырсөздөрдү автотолтурууга өтүңүз.</translation> <translation id="6585618849026997638">Маанилүү барактарга кайра кайтып келүү үчүн кыстармаларды кошуп коюңуз</translation> +<translation id="6596481460663245319">Сүрөттү Google менен издөө</translation> <translation id="6598875554591387303">Жарыялоочу боюнча иреттөө</translation> <translation id="6603393121510733479">Уюмуңуз жекече серептөөнү өчүрүп койду. <ph name="BEGIN_LINK" />Кеңири маалымат<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 190d3d9..4b55d35a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Kad būtų saugiau, šifruokite slaptažodžius įrenginyje prieš išsaugodami juos „Google“ slaptažodžių tvarkytuvėje.</translation> <translation id="7993619969781047893">Funkcijos gali neveikti tam tikrose svetainėse</translation> <translation id="800361585186029508">Atidaromi įvesti URL naršyklėje „Google Chrome“.</translation> +<translation id="8016714545083187120">Visada naudoti saugų ryšį</translation> <translation id="802154636333426148">Įvyko atsisiuntimo klaida</translation> <translation id="8023878949384262191">Išplečia skiltį.</translation> <translation id="8027581147000338959">Atidaryti naujame lange</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 9b7888d..95ae6a2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Nav droši</translation> <translation id="3533202363250687977">Aizvērt visas inkognito cilnes</translation> <translation id="3533436815740441613">Jauna cilne</translation> +<translation id="3547799431091898961">Lai izrakstītos no sava Google konta visās vietnēs, <ph name="BEGIN_LINK" />izrakstieties no pārlūka Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Aizvērt cilni</translation> <translation id="3581564640715911333">Piedāvāt tulkot lapas citās valodās</translation> <translation id="3588820906588687999">Atvērt attēlu jaunā cilnē</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Tuvināt</translation> <translation id="6583087784430677195">Atveriet sadaļu <ph name="BEGIN_LINK" />Settings<ph name="END_LINK" /> (Iestatījumi) un pārejiet uz iestatījumu “AutoFill Passwords” (Automātiska paroļu aizpilde), lai to izslēgtu.</translation> <translation id="6585618849026997638">Varat pievienot grāmatzīmi, lai varētu atgriezties vajadzīgajā lapā</translation> +<translation id="6596481460663245319">Meklēt attēlu ar Google</translation> <translation id="6598875554591387303">Kārtot pēc izdevēja</translation> <translation id="6603393121510733479">Jūsu organizācija izslēdza privātu pārlūkošanu. <ph name="BEGIN_LINK" />Uzzināt vairāk<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Lai gādātu par papildu drošību, šifrējiet paroles savā ierīcē, pirms tās tiek saglabātas Google paroļu pārvaldniekā.</translation> <translation id="7993619969781047893">Noteiktās vietnēs funkcijas var nedarboties</translation> <translation id="800361585186029508">Ievadītie vietrāži URL tiek atvērti pārlūkā Google Chrome.</translation> +<translation id="8016714545083187120">Vienmēr izmantot drošus savienojumus</translation> <translation id="802154636333426148">Lejupielāde neizdevās</translation> <translation id="8023878949384262191">Izvērš sadaļu.</translation> <translation id="8027581147000338959">Atvērt jaunā logā</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index b46388c2..aa7c6710 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Untuk keselamatan tambahan, sulitkan kata laluan pada peranti sebelum disimpan ke Pengurus Kata Laluan Google.</translation> <translation id="7993619969781047893">Ciri pada sesetengah tapak mungkin rosak</translation> <translation id="800361585186029508">Membuka URL yang dimasukkan dalam Google Chrome.</translation> +<translation id="8016714545083187120">Sentiasa Gunakan Sambungan Selamat</translation> <translation id="802154636333426148">Muat turun gagal</translation> <translation id="8023878949384262191">Mengembangkan bahagian.</translation> <translation id="8027581147000338959">Buka dalam Tetingkap Baharu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index e6352668..be4babc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">ସୁରକ୍ଷିତ ନୁହେଁ</translation> <translation id="3533202363250687977">ସମସ୍ତ ଇନ୍କଗ୍ନିଟୋ ଟାବ୍ଗୁଡ଼ିକୁ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="3533436815740441613">ନୂତନ ଟାବ୍</translation> +<translation id="3547799431091898961">ସମସ୍ତ ୱେବସାଇଟରେ ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରୁ ସାଇନ ଆଉଟ କରିବା ପାଇଁ, <ph name="BEGIN_LINK" />Chromeରୁ ସାଇନ ଆଉଟ କରନ୍ତୁ<ph name="END_LINK" />।</translation> <translation id="3551320343578183772">ଟାବ୍ ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="3581564640715911333">ଅନ୍ୟ ଭାଷାରେ ପୃଷ୍ଠାଗୁଡ଼ିକୁ ଅନୁବାଦ କରିବାକୁ ଅଫର୍ ଦିଅନ୍ତୁ</translation> <translation id="3588820906588687999">ନୂଆ ଟାବ୍ରେ ଛବି ଖୋଲନ୍ତୁ</translation> @@ -679,6 +680,7 @@ <translation id="6561262006871132942">ଜୁମ୍ ଇନ୍ କରନ୍ତୁ</translation> <translation id="6583087784430677195">ବନ୍ଦ କରିବାକୁ, <ph name="BEGIN_LINK" />ସେଟିଂସ<ph name="END_LINK" /> ଖୋଲି "ପାସାୱାର୍ଡଗୁଡ଼ିକୁ ସ୍ୱତଃପୂରଣ କରନ୍ତୁ"କୁ ଯାଆନ୍ତୁ।</translation> <translation id="6585618849026997638">ଆପଣ ଏକ ବୁକମାର୍କ ଯୋଗ କରି ଆପଣଙ୍କ ପାଇଁ ଗୁରୁତ୍ୱପୂର୍ଣ୍ଣ ଥିବା ଏକ ପୃଷ୍ଠାକୁ ଫେରି ପାରିବେ</translation> +<translation id="6596481460663245319">Google ମାଧ୍ୟମରେ ଇମେଜ ସନ୍ଧାନ କରନ୍ତୁ</translation> <translation id="6598875554591387303">ପବ୍ଲିସର ଅନୁସାରେ ସର୍ଟ କରନ୍ତୁ</translation> <translation id="6603393121510733479">ଆପଣଙ୍କ ସଂସ୍ଥା ପ୍ରାଇଭେଟ୍ ବ୍ରାଉଜିଂକୁ ବନ୍ଦ କରି ଦେଇଛି। <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> @@ -847,6 +849,7 @@ <translation id="7987685713885608670">ଅତିରିକ୍ତ ସୁରକ୍ଷା ପାଇଁ, ପାସୱାର୍ଡଗୁଡ଼ିକ Google ପାସୱାର୍ଡ ମ୍ୟାନେଜରରେ ସେଭ ହେବା ପୂର୍ବରୁ ସେଗୁଡ଼ିକୁ ଆପଣଙ୍କ ଡିଭାଇସରେ ଏନକ୍ରିପ୍ଟ କରନ୍ତୁ।</translation> <translation id="7993619969781047893">କିଛି ସାଇଟରେ ଫିଚରଗୁଡ଼ିକ ଠିକ୍ ଭାବେ କାମ କରିନପାରେ</translation> <translation id="800361585186029508">ଇନପୁଟ୍ କରାଯାଇଥିବା URLଗୁଡ଼ିକୁ Google Chromeରେ ଖୋଲା ଯାଇଥାଏ।</translation> +<translation id="8016714545083187120">ସର୍ବଦା ସୁରକ୍ଷିତ କନେକ୍ସନଗୁଡ଼ିକୁ ବ୍ୟବହାର କରନ୍ତୁ</translation> <translation id="802154636333426148">ଡାଉନ୍ଲୋଡ୍ ବିଫଳ ହୋଇଛି</translation> <translation id="8023878949384262191">ବିଭାଗ ପ୍ରସାରିତ କରନ୍ତୁ।</translation> <translation id="8027581147000338959">ନୂଆ ୱିଣ୍ଡୋରେ ଖୋଲନ୍ତୁ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index 4d5e6f7d..0712bbb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Niezabezpieczona</translation> <translation id="3533202363250687977">Zamknij karty incognito</translation> <translation id="3533436815740441613">Nowa karta</translation> +<translation id="3547799431091898961">Aby wylogować się z konta Google na wszystkich stronach, <ph name="BEGIN_LINK" />wyloguj się z Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Zamknij kartę</translation> <translation id="3581564640715911333">Proponuj tłumaczenie stron w innych językach</translation> <translation id="3588820906588687999">Otwórz grafikę w nowej karcie</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Powiększ</translation> <translation id="6583087784430677195">Aby wyłączyć funkcję, otwórz <ph name="BEGIN_LINK" />Ustawienia<ph name="END_LINK" /> i przejdź do sekcji Automatyczne wypełnianie haseł.</translation> <translation id="6585618849026997638">Utwórz zakładkę, jeśli chcesz wrócić do interesującej Cię strony</translation> +<translation id="6596481460663245319">Szukaj grafiki z Google</translation> <translation id="6598875554591387303">Sortuj według wydawcy</translation> <translation id="6603393121510733479">Twoja organizacja wyłączyła przeglądanie prywatne. <ph name="BEGIN_LINK" />Więcej informacji<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Zanim zapiszesz hasła w menedżerze haseł Google, zaszyfruj je na urządzeniu, aby zwiększyć ich bezpieczeństwo.</translation> <translation id="7993619969781047893">Funkcje niektórych stron mogą nie działać prawidłowo</translation> <translation id="800361585186029508">Otwiera wpisane adresy URL w Google Chrome.</translation> +<translation id="8016714545083187120">Zawsze używaj bezpiecznych połączeń</translation> <translation id="802154636333426148">Nie udało się pobrać</translation> <translation id="8023878949384262191">Rozwija sekcję.</translation> <translation id="8027581147000338959">Otwórz w nowym oknie</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 32a09b66..68dc87b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Автозаполнение не используется</translation> <translation id="3533202363250687977">Закрыть все вкладки инкогнито</translation> <translation id="3533436815740441613">Новая вкладка</translation> +<translation id="3547799431091898961">Чтобы выйти из аккаунта Google на всех сайтах, <ph name="BEGIN_LINK" />выйдите из Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Закрыть вкладку</translation> <translation id="3581564640715911333">Предлагать перевести страницы на других языках.</translation> <translation id="3588820906588687999">Открыть изображение в новой вкладке</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Увеличить</translation> <translation id="6583087784430677195">Чтобы отключить автозаполнение, выберите <ph name="BEGIN_LINK" />Настройки<ph name="END_LINK" /> и перейдите в раздел "Автозаполнение паролей".</translation> <translation id="6585618849026997638">Добавьте страницу с важными сведениями в закладки, и вы всегда сможете вернуться к ней.</translation> +<translation id="6596481460663245319">Найти изображение в Google</translation> <translation id="6598875554591387303">Сортировать по издателю</translation> <translation id="6603393121510733479">В вашей организации режим инкогнито отключен. <ph name="BEGIN_LINK" />Подробнее…<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index 443008d..e7e42e5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">සුරක්ෂිත නැත</translation> <translation id="3533202363250687977">සියලු අප්රසිද්ධ පටිති වසන්න</translation> <translation id="3533436815740441613">නව පටිත්ත</translation> +<translation id="3547799431091898961">සියලු වෙබ් අඩවිවල ඔබේ Google ගිණුමෙන් වැරීම සඳහා, <ph name="BEGIN_LINK" />Chrome වෙතින් වරන්න<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">ටැබය වසන්න</translation> <translation id="3581564640715911333">වෙනත් භාෂාවල පිටු පරිවර්තනයට පිරිනමන්න</translation> <translation id="3588820906588687999">රූපය නව පටිත්තක විවෘත කරන්න</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">විශාලන කරන්න</translation> <translation id="6583087784430677195">ක්රියාවිරහිත කිරීමට, <ph name="BEGIN_LINK" />සැකසීම්<ph name="END_LINK" /> විවෘත කර මුරපද ස්වයං පිරවුම වෙත යන්න.</translation> <translation id="6585618849026997638">පිටුසනක් එක් කිරීමෙන් ඔබට වැදගත් වන පිටුවකට ආපසු පැමිණීමට ඔබට හැකිය</translation> +<translation id="6596481460663245319">Google සමග රූපය සොයන්න</translation> <translation id="6598875554591387303">ප්රකාශකයා අනුව පිළිවෙලට සකසන්න</translation> <translation id="6603393121510733479">ඔබගේ සංවිධානය රහසිගත බ්රවුස් කිරීම ක්රියාවිරහිත කර දැමීය. <ph name="BEGIN_LINK" />තව දැන ගන්න<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index aa4cf8b..0169ef2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Ni varno</translation> <translation id="3533202363250687977">Zapri vse anonimne zavihke</translation> <translation id="3533436815740441613">Nov zavihek</translation> +<translation id="3547799431091898961">Če se želite odjaviti iz računa Google na vseh spletnih mestih, <ph name="BEGIN_LINK" />se odjavite iz Chroma<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Zapri zavihek</translation> <translation id="3581564640715911333">Ponudi prevajanje strani v drugih jezikih</translation> <translation id="3588820906588687999">Odpri sliko na novem zavihku</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Povečaj</translation> <translation id="6583087784430677195">Če želite izklopiti, odprite <ph name="BEGIN_LINK" />Nastavitve<ph name="END_LINK" /> in nato »Samodejno izpolnjevanje gesel«.</translation> <translation id="6585618849026997638">Na stran, ki vam je pomembna, se lahko vrnete tako, da jo dodate med zaznamke.</translation> +<translation id="6596481460663245319">Iskanje slike z Googlom</translation> <translation id="6598875554591387303">Razvrsti glede na izdajatelja</translation> <translation id="6603393121510733479">Vaša organizacija je izklopila zasebno brskanje. <ph name="BEGIN_LINK" />Več o tem<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">Zaradi dodatne varnosti šifrirajte gesla v napravi, preden se shranijo v Google Upravitelju gesel.</translation> <translation id="7993619969781047893">Funkcije na nekaterih spletnih mestih morda ne bodo delovale</translation> <translation id="800361585186029508">Odpre vnesene URL-je v Google Chromu.</translation> +<translation id="8016714545083187120">Vedno dovoli varne povezave</translation> <translation id="802154636333426148">Prenos ni uspel</translation> <translation id="8023878949384262191">Razširi razdelek.</translation> <translation id="8027581147000338959">Odpri v novem oknu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index 7770dc5..4af0de848 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Jo e sigurt</translation> <translation id="3533202363250687977">Mbylli të gjitha skedat "e fshehta"</translation> <translation id="3533436815740441613">Skedë e re</translation> +<translation id="3547799431091898961">Për të dalë nga "Llogaria jote e Google" në të gjitha sajtet e uebit, <ph name="BEGIN_LINK" />dil nga Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Mbylle skedën</translation> <translation id="3581564640715911333">Ofro që t'i përkthesh faqet në gjuhë të tjera</translation> <translation id="3588820906588687999">Hape imazhin në skedë të re</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Zmadho</translation> <translation id="6583087784430677195">Për ta fikur, hap <ph name="BEGIN_LINK" />Cilësimet<ph name="END_LINK" /> dhe shko te "Plotësimi automatik i fjalëkalimeve".</translation> <translation id="6585618849026997638">Mund të kthehesh te një faqe që është e rëndësishme për ty duke shtuar një faqeshënues</translation> +<translation id="6596481460663245319">Kërko në imazh me Google</translation> <translation id="6598875554591387303">Rendit sipas "Publikuesit"</translation> <translation id="6603393121510733479">Organizata jote ka çaktivizuar shfletimin privat. <ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index c589f1625..152e729 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Inte säkert</translation> <translation id="3533202363250687977">Stäng alla inkognitoflikar</translation> <translation id="3533436815740441613">Ny flik</translation> +<translation id="3547799431091898961"><ph name="BEGIN_LINK" />Logga ut från Chrome<ph name="END_LINK" /> om du vill logga ut från Google-kontot på alla webbplatser.</translation> <translation id="3551320343578183772">Stäng flik</translation> <translation id="3581564640715911333">Erbjud översättning av sidor till andra språk</translation> <translation id="3588820906588687999">Öppna bild på ny flik</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Zooma in</translation> <translation id="6583087784430677195">Inaktivera genom att öppna <ph name="BEGIN_LINK" />Inställningar<ph name="END_LINK" /> och sedan Autofyll lösenord.</translation> <translation id="6585618849026997638">Du kan återgå till en sida som är viktig för dig genom att lägga till ett bokmärke</translation> +<translation id="6596481460663245319">Bildsökning med Google</translation> <translation id="6598875554591387303">Sortera efter utgivare</translation> <translation id="6603393121510733479">Organisationen har inaktiverat möjligheten att surfa privat. <ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index d64fab3..71da924 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Si salama</translation> <translation id="3533202363250687977">Funga Vichupo Vyote Fiche</translation> <translation id="3533436815740441613">Kichupo Kipya</translation> +<translation id="3547799431091898961">Ili uondoke kwenye akaunti yako ya Google katika tovuti zote, <ph name="BEGIN_LINK" />ondoka kwenye akaunti yako katika kivinjari cha Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Funga Kichupo</translation> <translation id="3581564640715911333">Jitolee kutafsiri kurasa katika lugha nyingine</translation> <translation id="3588820906588687999">Fungua Picha Katika Kichupo Kipya</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Vuta karibu</translation> <translation id="6583087784430677195">Ili uzime, fungua <ph name="BEGIN_LINK" />Mipangilio<ph name="END_LINK" /> kisha uende kwenye sehemu ya Kujaza Manenosiri Kiotomatiki.</translation> <translation id="6585618849026997638">Unaweza kurudi kwenye ukurasa ambao ni muhimu kwako kwa kuuweka alamisho.</translation> +<translation id="6596481460663245319">Tafuta picha ukitumia Google</translation> <translation id="6598875554591387303">Panga kulingana na Mchapishaji</translation> <translation id="6603393121510733479">Shirika lako limezima kipengele cha kuvinjari kwa faragha. <ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 998c4bc..1776db1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">பாதுகாப்பற்றது</translation> <translation id="3533202363250687977">எல்லா மறைநிலைத் தாவல்களையும் மூடு</translation> <translation id="3533436815740441613">புதிய தாவல்</translation> +<translation id="3547799431091898961">இணையதளங்கள் அனைத்திலும் உங்கள் Google கணக்கில் இருந்து வெளியேற <ph name="BEGIN_LINK" />Chromeமில் இருந்து வெளியேறுங்கள்<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">தாவலை மூடுக</translation> <translation id="3581564640715911333">பக்கங்களைப் பிற மொழிகளில் மொழிபெயர்க்க அனுமதி</translation> <translation id="3588820906588687999">படத்தைப் புதிய தாவலில் திற</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">பெரிதாக்கு</translation> <translation id="6583087784430677195">முடக்க, <ph name="BEGIN_LINK" />அமைப்புகள்<ph name="END_LINK" /> என்பதைத் திறந்து ‘தன்னிரப்பிக் கடவுச்சொற்கள்’ என்பதற்குச் செல்லவும்.</translation> <translation id="6585618849026997638">முக்கியமான பக்கங்களை புக்மார்க் செய்வதன் மூலம் எப்போது வேண்டுமானாலும் அவற்றை உடனடியாக அணுகலாம்</translation> +<translation id="6596481460663245319">Google மூலம் படத்தைத் தேடு</translation> <translation id="6598875554591387303">வெளியீட்டாளரின்படி வரிசைப்படுத்து</translation> <translation id="6603393121510733479">மறைநிலை உலாவலை உங்கள் நிறுவனம் முடக்கியுள்ளது. <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">கூடுதல் பாதுகாப்பைப் பெற, Google கடவுச்சொல் நிர்வாகியில் சேமிக்கப்படுவதற்கு முன்பு உங்கள் சாதனத்தில் கடவுச்சொற்கள் என்க்ரிப்ஷன் செய்யப்படும்.</translation> <translation id="7993619969781047893">சில தளங்களிலுள்ள அம்சங்கள் செயல்படாமல் போகக்கூடும்</translation> <translation id="800361585186029508">உள்ளிடப்பட்ட URLகளை Google Chromeமில் திறக்கும்.</translation> +<translation id="8016714545083187120">பாதுகாப்பான இணைப்புகளையே எப்போதும் பயன்படுத்து</translation> <translation id="802154636333426148">பதிவிறக்க முடியவில்லை</translation> <translation id="8023878949384262191">பிரிவை விரிவாக்கும்.</translation> <translation id="8027581147000338959">புதிய சாளரத்தில் திற</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index e15fa8a..042b761 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -458,7 +458,7 @@ <translation id="48274138579728272">చదివినట్లు గుర్తు పెట్టు</translation> <translation id="4833686396768033263">ఇటీవలి ట్యాబ్లు అందుబాటులో లేవు</translation> <translation id="4833786495304741580">Googleకు ఆటోమేటిక్గా వినియోగ గణాంకాలు, క్రాష్ రిపోర్ట్లను పంపుతుంది.</translation> -<translation id="4840495572919996524">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు మరియు మరిన్ని ఇప్పటి నుండి మీ Google ఖాతాకి సింక్ చేయబడవు.</translation> +<translation id="4840495572919996524">మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు మరియు మరిన్ని ఇప్పటి నుండి మీ Google ఖాతాకి సింక్ చేయబడవు.</translation> <translation id="4844899002472726590">మీకు ఆసక్తి ఉన్న టాపిక్లను చూడండి, ఎడిట్ చేయండి</translation> <translation id="4854345657858711387">పాస్కోడ్ని సెట్ చేయండి</translation> <translation id="4858786880085262208">సాధ్యమైనప్పుడు, HTTPSకు అప్గ్రేడ్ చేయండి. సురక్షిత సైట్లు సురక్షితం కాని కంటెంట్ను పొందుపరచవచ్చు.</translation> @@ -474,7 +474,7 @@ <translation id="4944543191714094452">పేజీలో కనుగొను…</translation> <translation id="4945756290001680296">పాస్వర్డ్ సెట్టింగ్లను యాక్సెస్ చేయండి</translation> <translation id="4971735654804503942">ప్రమాదకరమైన వెబ్సైట్లు, డౌన్లోడ్లు, ఎక్స్టెన్షన్ల నుండి మరింత వేగవంతమైన, క్రియాశీలమైన రక్షణ. పాస్వర్డ్ ఉల్లంఘనల గురించి మిమ్మల్ని హెచ్చరిస్తుంది. బ్రౌజింగ్ డేటాను Googleకు పంపాల్సి ఉంటుంది.</translation> -<translation id="4979397965658815378">మీ బుక్మార్క్లు, పాస్వర్డ్లు, చరిత్ర మరియు ఇతర సెట్టింగ్లను మీ అన్ని పరికరాలలో పొందడానికి మీ Google ఖాతాతో సైన్ ఇన్ చేయండి</translation> +<translation id="4979397965658815378">మీ బుక్మార్క్లు, పాస్వర్డ్లు, హిస్టరీ మరియు ఇతర సెట్టింగ్లను మీ అన్ని పరికరాలలో పొందడానికి మీ Google ఖాతాతో సైన్ ఇన్ చేయండి</translation> <translation id="4986678885919050584">ఈ పరికరం నుండి తీసివేయండి</translation> <translation id="4989542687859782284">అందుబాటులో లేనివి</translation> <translation id="498985224078955265">ఈ ట్యాబ్ను మరొక పరికరానికి పంపడానికి, రెండు పరికరాల్లోనూ Chromeకు సైన్ ఇన్ చేయండి.</translation> @@ -492,7 +492,7 @@ <translation id="509789154667432072">బుక్మార్క్ను జోడించండి</translation> <translation id="5118713593561876160">ఆసక్తులు</translation> <translation id="5118764316110575523">ఆఫ్ చేయబడి ఉంది</translation> -<translation id="5132942445612118989">అన్ని పరికరాల్లో మీ పాస్వర్డ్లు, చరిత్ర, మరిన్నింటిని సింక్ చేయండి</translation> +<translation id="5132942445612118989">అన్ని పరికరాల్లో మీ పాస్వర్డ్లు, హిస్టరీ, మరిన్నింటిని సింక్ చేయండి</translation> <translation id="5140288047769711648">Chrome మీకు సంబంధించి ఈ పాస్వర్డ్ను గుర్తుంచుకుంటుంది. మీరు గుర్తుంచుకోనవసరం లేదు.</translation> <translation id="5150492518600715772">మీ పరికరానికి పంపండి</translation> <translation id="5168414296986405587">iPadOS కోసం బిల్డ్ చేయబడింది</translation> @@ -782,7 +782,7 @@ <translation id="7400418766976504921">URL</translation> <translation id="7409985198648820906"><ph name="UNREAD_COUNT" /> చదవని కథనాలు ఉన్నాయి.</translation> <translation id="7412027924265291969">కొనసాగించు</translation> -<translation id="7425346204213733349">మీ బుక్మార్క్లు, చరిత్ర, పాస్వర్డ్లు, ఇతర సెట్టింగ్లకు చేసే మార్పులు ఇకపై మీ Google ఖాతాకు సింక్ చేయబడవు. అయితే, ఇప్పటికే ఉన్న మీ డేటా మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది.</translation> +<translation id="7425346204213733349">మీ బుక్మార్క్లు, హిస్టరీ, పాస్వర్డ్లు, ఇతర సెట్టింగ్లకు చేసే మార్పులు ఇకపై మీ Google ఖాతాకు సింక్ చేయబడవు. అయితే, ఇప్పటికే ఉన్న మీ డేటా మీ Google ఖాతాలో అలాగే నిల్వ చేయబడి ఉంటుంది.</translation> <translation id="7431991332293347422">సెర్చ్లు మరియు మరిన్నింటిని వ్యక్తిగతీకరించడానికి మీ బ్రౌజింగ్ హిస్టరీ ఎలా ఉపయోగించబడుతుందో నియంత్రించండి</translation> <translation id="7435356471928173109">మీ అడ్మినిస్ట్రేటర్ ఆఫ్ చేశారు</translation> <translation id="7438481509621345350">మీరు కొత్త ట్యాబ్ను తెరిచినప్పుడు మీకు ఇప్పుడు <ph name="CHANNEL_NAME" /> నుండి స్టోరీలు కనిపిస్తాయి.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index c13d3139..b9a6515 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">ไม่ปลอดภัย</translation> <translation id="3533202363250687977">ปิดแท็บไม่ระบุตัวตนทั้งหมด</translation> <translation id="3533436815740441613">แท็บใหม่</translation> +<translation id="3547799431091898961">หากต้องการออกจากระบบบัญชี Google ในเว็บไซต์ทั้งหมด ให้<ph name="BEGIN_LINK" />ออกจากระบบ Chrome<ph name="END_LINK" /></translation> <translation id="3551320343578183772">ปิดแท็บ</translation> <translation id="3581564640715911333">เสนอที่จะแปลหน้าเว็บในภาษาอื่นๆ</translation> <translation id="3588820906588687999">เปิดภาพในแท็บใหม่</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">ซูมเข้า</translation> <translation id="6583087784430677195">หากต้องการปิด ให้เปิด<ph name="BEGIN_LINK" />การตั้งค่า<ph name="END_LINK" />แล้วไปที่ "ป้อนรหัสผ่านอัตโนมัติ"</translation> <translation id="6585618849026997638">กลับไปที่หน้าที่สำคัญกับคุณได้โดยการเพิ่มบุ๊กมาร์ก</translation> +<translation id="6596481460663245319">ค้นหารูปภาพด้วย Google</translation> <translation id="6598875554591387303">จัดเรียงตามผู้เผยแพร่เนื้อหา</translation> <translation id="6603393121510733479">องค์กรปิดการเรียกดูแบบส่วนตัวไว้ <ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" /></translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index e5fbc64..a2da4458 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -851,6 +851,7 @@ <translation id="7987685713885608670">Ek güvenlik için, Google Şifre Yöneticisi'ne kaydedilmeden önce şifrelerinizi cihazınızda şifreleyin.</translation> <translation id="7993619969781047893">Bazı sitelerdeki özellikler çalışmayabilir</translation> <translation id="800361585186029508">Girilen URL'leri Google Chrome'da açar.</translation> +<translation id="8016714545083187120">Her Zaman Güvenli Bağlantılar Kullan</translation> <translation id="802154636333426148">İndirilemedi</translation> <translation id="8023878949384262191">Seçimi genişletir.</translation> <translation id="8027581147000338959">Yeni Pencerede Aç</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index cc16bea9..6af54b0e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -311,6 +311,7 @@ <translation id="3529024052484145543">Небезпечно</translation> <translation id="3533202363250687977">Закрити всі анонімні вкладки</translation> <translation id="3533436815740441613">Нова вкладка</translation> +<translation id="3547799431091898961">Щоб вийти з облікового запису Google на всіх веб-сайтах, <ph name="BEGIN_LINK" />вийдіть із Chrome<ph name="END_LINK" />.</translation> <translation id="3551320343578183772">Закрити вкладку</translation> <translation id="3581564640715911333">Пропозиція перекладати сторінки іншими мовами</translation> <translation id="3588820906588687999">Відкрити зображення в новій вкладці</translation> @@ -681,6 +682,7 @@ <translation id="6561262006871132942">Наблизити</translation> <translation id="6583087784430677195">Щоб вимкнути, відкрийте <ph name="BEGIN_LINK" />Параметри<ph name="END_LINK" /> та перейдіть у розділ "Автозаповнення паролів".</translation> <translation id="6585618849026997638">Щоб повернутися на важливу сторінку пізніше, додайте закладку</translation> +<translation id="6596481460663245319">Шукати зображення за допомогою Google</translation> <translation id="6598875554591387303">Сортувати за категорією "Видавець"</translation> <translation id="6603393121510733479">Адміністратор вашої організації вимкнув режим анонімного перегляду. <ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /></translation> @@ -849,6 +851,7 @@ <translation id="7987685713885608670">З міркувань додаткового захисту шифруйте паролі на пристрої, перш ніж вони збережуться в Менеджері паролів Google.</translation> <translation id="7993619969781047893">Функції на деяких сайтах можуть не працювати</translation> <translation id="800361585186029508">Відкриває введені URL-адреси в Google Chrome.</translation> +<translation id="8016714545083187120">Завжди використовувати надійні з’єднання</translation> <translation id="802154636333426148">Не вдалося завантажити</translation> <translation id="8023878949384262191">Розгортає розділ.</translation> <translation id="8027581147000338959">Відкрити в новому вікні</translation>
diff --git a/ios/chrome/browser/BUILD.gn b/ios/chrome/browser/BUILD.gn index 831c25c..3bb3ecd 100644 --- a/ios/chrome/browser/BUILD.gn +++ b/ios/chrome/browser/BUILD.gn
@@ -247,6 +247,8 @@ "//ios/chrome/browser/policy", "//ios/chrome/browser/prefs", "//ios/chrome/browser/prefs:browser_prefs", + "//ios/chrome/browser/promos_manager", + "//ios/chrome/browser/promos_manager:features", "//ios/chrome/browser/safe_browsing", "//ios/chrome/browser/segmentation_platform", "//ios/chrome/browser/send_tab_to_self",
diff --git a/ios/chrome/browser/application_context.h b/ios/chrome/browser/application_context.h index 99aed09..5737820c 100644 --- a/ios/chrome/browser/application_context.h +++ b/ios/chrome/browser/application_context.h
@@ -70,6 +70,7 @@ class ApplicationContext; class BrowserPolicyConnectorIOS; +class PromosManager; class IOSChromeIOThread; class PrefService; class SafeBrowsingService; @@ -162,6 +163,10 @@ // system. May be |nullptr| if policy is not enabled. virtual BrowserPolicyConnectorIOS* GetBrowserPolicyConnector() = 0; + // Gets the Promos Manager. For v1, this will be a Fullscreen Promos Manager. + // May be |nullptr| if feature kFullscreenPromosManager is not enabled. + virtual PromosManager* GetPromosManager() = 0; + // Returns the BreadcrumbPersistentStorageManager writing breadcrumbs to disk. // Will be null if breadcrumb collection is not enabled. virtual breadcrumbs::BreadcrumbPersistentStorageManager*
diff --git a/ios/chrome/browser/application_context_impl.h b/ios/chrome/browser/application_context_impl.h index 1fc7ca9..47435c1 100644 --- a/ios/chrome/browser/application_context_impl.h +++ b/ios/chrome/browser/application_context_impl.h
@@ -78,6 +78,7 @@ SafeBrowsingService* GetSafeBrowsingService() override; network::NetworkConnectionTracker* GetNetworkConnectionTracker() override; BrowserPolicyConnectorIOS* GetBrowserPolicyConnector() override; + PromosManager* GetPromosManager() override; breadcrumbs::BreadcrumbPersistentStorageManager* GetBreadcrumbPersistentStorageManager() override; id<SingleSignOnService> GetSSOService() override; @@ -106,6 +107,10 @@ // service, the policy connector must live outside the keyed services. std::unique_ptr<BrowserPolicyConnectorIOS> browser_policy_connector_; + // Promos Manager which coordinates the display of app-wide promos. + // Will be null if feature, kFullscreenPromosManager, is not enabled. + std::unique_ptr<PromosManager> promos_manager_; + std::unique_ptr<PrefService> local_state_; std::unique_ptr<net_log::NetExportFileWriter> net_export_file_writer_; std::unique_ptr<network_time::NetworkTimeTracker> network_time_tracker_;
diff --git a/ios/chrome/browser/application_context_impl.mm b/ios/chrome/browser/application_context_impl.mm index 653c4780..0b655c8 100644 --- a/ios/chrome/browser/application_context_impl.mm +++ b/ios/chrome/browser/application_context_impl.mm
@@ -58,6 +58,8 @@ #include "ios/chrome/browser/pref_names.h" #include "ios/chrome/browser/prefs/browser_prefs.h" #include "ios/chrome/browser/prefs/ios_chrome_pref_service_factory.h" +#import "ios/chrome/browser/promos_manager/features.h" +#import "ios/chrome/browser/promos_manager/promos_manager.h" #include "ios/chrome/browser/segmentation_platform/otr_web_state_observer.h" #include "ios/chrome/browser/update_client/ios_chrome_update_query_params_delegate.h" #include "ios/chrome/common/channel_info.h" @@ -459,6 +461,14 @@ return browser_policy_connector_.get(); } +PromosManager* ApplicationContextImpl::GetPromosManager() { + DCHECK(thread_checker_.CalledOnValidThread()); + if (IsFullscreenPromosManagerEnabled() && !promos_manager_) { + promos_manager_ = std::make_unique<PromosManager>(); + } + return promos_manager_.get(); +} + breadcrumbs::BreadcrumbPersistentStorageManager* ApplicationContextImpl::GetBreadcrumbPersistentStorageManager() { DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index 8a1292a..52e10d2 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -417,6 +417,12 @@ {kTrendingQueriesHideShortcutsParam, "true"}, {kTrendingQueriesDisabledFeedParam, "false"}, {kTrendingQueriesSignedOutParam, "true"}}; +const FeatureEntry::FeatureParam + kTrendingQueriesEnableNeverShowHideShortcuts[] = { + {kTrendingQueriesHideShortcutsParam, "true"}, + {kTrendingQueriesDisabledFeedParam, "false"}, + {kTrendingQueriesSignedOutParam, "false"}, + {kTrendingQueriesNeverShowModuleParam, "true"}}; const FeatureEntry::FeatureVariation kTrendingQueriesModuleVariations[] = { {"Enabled All Users", kTrendingQueriesEnableAllUsers, @@ -428,6 +434,10 @@ std::size(kTrendingQueriesEnableFeedDisabled), nullptr}, {"Enabled Signed Out", kTrendingQueriesEnableSignedOut, std::size(kTrendingQueriesEnableSignedOut), nullptr}, + {"Enabled Never Show and Hide Shortcuts", + kTrendingQueriesEnableNeverShowHideShortcuts, + std::size(kTrendingQueriesEnableNeverShowHideShortcuts), nullptr}, + }; const FeatureEntry::FeatureParam kNewMICEFREWithUMADialog[] = {
diff --git a/ios/chrome/browser/follow/resources/rss_link.ts b/ios/chrome/browser/follow/resources/rss_link.ts index c4b21ea4..1116213 100644 --- a/ios/chrome/browser/follow/resources/rss_link.ts +++ b/ios/chrome/browser/follow/resources/rss_link.ts
@@ -8,9 +8,8 @@ * @fileoverview Functions used to parse RSS links from a web page. */ - /* Gets RSS links. */ -gCrWeb.rssLink.getRSSLinks = function(): string[] { +function getRSSLinks(): string[] { const linkTags = document.head.getElementsByTagName('link'); const rssLinks: string[] = []; @@ -27,3 +26,5 @@ } return rssLinks; } + +gCrWeb.rssLink = {getRSSLinks};
diff --git a/ios/chrome/browser/promos_manager/BUILD.gn b/ios/chrome/browser/promos_manager/BUILD.gn index 3ebd0b7..1133434 100644 --- a/ios/chrome/browser/promos_manager/BUILD.gn +++ b/ios/chrome/browser/promos_manager/BUILD.gn
@@ -2,6 +2,15 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +source_set("promos_manager") { + sources = [ + "promos_manager.h", + "promos_manager.mm", + ] + configs += [ "//build/config/compiler:enable_arc" ] + deps = [ ":features" ] +} + source_set("features") { sources = [ "features.h",
diff --git a/ios/chrome/browser/promos_manager/promos_manager.h b/ios/chrome/browser/promos_manager/promos_manager.h new file mode 100644 index 0000000..0e9c73a --- /dev/null +++ b/ios/chrome/browser/promos_manager/promos_manager.h
@@ -0,0 +1,17 @@ +// 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 IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_ +#define IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_ + +// Centralized promos manager for coordinating and scheduling the display of +// app-wide promos. Feature teams interested in displaying promos should +// leverage this manager. +class PromosManager { + public: + PromosManager(); + ~PromosManager(); +}; + +#endif // IOS_CHROME_BROWSER_PROMOS_MANAGER_PROMOS_MANAGER_H_
diff --git a/ios/chrome/browser/promos_manager/promos_manager.mm b/ios/chrome/browser/promos_manager/promos_manager.mm new file mode 100644 index 0000000..dd2d97a --- /dev/null +++ b/ios/chrome/browser/promos_manager/promos_manager.mm
@@ -0,0 +1,13 @@ +// 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. + +#import "ios/chrome/browser/promos_manager/promos_manager.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +#pragma mark - PromosManager +PromosManager::PromosManager() = default; +PromosManager::~PromosManager() = default;
diff --git a/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm b/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm index 240e1b49..08e4428 100644 --- a/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm +++ b/ios/chrome/browser/segmentation_platform/segmentation_platform_config.mm
@@ -10,6 +10,7 @@ #import "base/metrics/field_trial_params.h" #import "base/time/time.h" #import "components/segmentation_platform/embedder/default_model/feed_user_segment.h" +#import "components/segmentation_platform/internal/stats.h" #import "components/segmentation_platform/public/config.h" #import "components/segmentation_platform/public/features.h" #import "components/segmentation_platform/public/model_provider.h" @@ -32,9 +33,13 @@ std::unique_ptr<Config> GetConfigForFeedSegments() { auto config = std::make_unique<Config>(); config->segmentation_key = kFeedUserSegmentationKey; - config->segment_ids = { - SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER, - }; + config->segmentation_uma_name = + stats::SegmentationKeyToUmaName(config->segmentation_key); + const proto::SegmentId segment_id = + SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER; + std::string feed_segment_name = + stats::OptimizationTargetToHistogramVariant(segment_id); + config->segments.insert({segment_id, Config::SegmentMetadata{feed_segment_name}}); config->segment_selection_ttl = base::Days(base::GetFieldTrialParamByFeatureAsInt( features::kSegmentationPlatformFeedSegmentFeature,
diff --git a/ios/chrome/browser/text_selection/BUILD.gn b/ios/chrome/browser/text_selection/BUILD.gn index 767737b..5854928 100644 --- a/ios/chrome/browser/text_selection/BUILD.gn +++ b/ios/chrome/browser/text_selection/BUILD.gn
@@ -19,7 +19,22 @@ "//components/optimization_guide/proto:optimization_guide_proto", "//ios/chrome/browser/browser_state", "//ios/chrome/browser/optimization_guide", - "//ios/public/provider/chrome/browser/text_classifier:text_classifier_api", - "//mojo/public/cpp/bindings", + ] +} + +source_set("test_support") { + configs += [ "//build/config/compiler:enable_arc" ] + testonly = true + sources = [ + "text_classifier_model_service_fake.h", + "text_classifier_model_service_fake.mm", + ] + deps = [ + ":text_selection", + "//base", + "//components/keyed_service/ios", + "//components/optimization_guide/core", + "//ios/chrome/browser/browser_state", + "//ios/chrome/browser/optimization_guide", ] }
diff --git a/ios/chrome/browser/text_selection/text_classifier_model_service.h b/ios/chrome/browser/text_selection/text_classifier_model_service.h index 021f5c6..7b7e952 100644 --- a/ios/chrome/browser/text_selection/text_classifier_model_service.h +++ b/ios/chrome/browser/text_selection/text_classifier_model_service.h
@@ -37,6 +37,9 @@ const optimization_guide::ModelInfo& model_info) override; private: + FRIEND_TEST_ALL_PREFIXES(InternalContextMenuProviderTest, + TCUsedWhenTCModelAvailable); + SEQUENCE_CHECKER(sequence_checker_); base::FilePath model_path_; // Optimization Guide Service that provides model files for this service.
diff --git a/ios/chrome/browser/text_selection/text_classifier_model_service.mm b/ios/chrome/browser/text_selection/text_classifier_model_service.mm index 348fb49..167e16f9 100644 --- a/ios/chrome/browser/text_selection/text_classifier_model_service.mm +++ b/ios/chrome/browser/text_selection/text_classifier_model_service.mm
@@ -4,16 +4,13 @@ #import "ios/chrome/browser/text_selection/text_classifier_model_service.h" -#import <iostream> #import <string> #import "base/files/file_path.h" -#import "base/files/file_util.h" #import "base/task/sequenced_task_runner.h" #import "base/task/thread_pool.h" #import "components/optimization_guide/core/optimization_guide_model_provider.h" #import "components/optimization_guide/proto/models.pb.h" -#import "ios/public/provider/chrome/browser/text_classifier/text_classifier_api.h" #if !defined(__has_feature) || !__has_feature(objc_arc) #error "This file requires ARC support."
diff --git a/ios/chrome/browser/text_selection/text_classifier_model_service_fake.h b/ios/chrome/browser/text_selection/text_classifier_model_service_fake.h new file mode 100644 index 0000000..2143d2b --- /dev/null +++ b/ios/chrome/browser/text_selection/text_classifier_model_service_fake.h
@@ -0,0 +1,28 @@ +// 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 IOS_CHROME_BROWSER_TEXT_SELECTION_TEXT_CLASSIFIER_MODEL_SERVICE_FAKE_H_ +#define IOS_CHROME_BROWSER_TEXT_SELECTION_TEXT_CLASSIFIER_MODEL_SERVICE_FAKE_H_ + +#include <memory> + +#import "ios/chrome/browser/text_selection/text_classifier_model_service.h" + +namespace web { +class BrowserState; +} // namespace web +class OptimizationGuideService; + +// Fake implementation of TextClassifierModelService that can be used by tests. +class TextClassifierModelServiceFake : public TextClassifierModelService { + public: + static std::unique_ptr<KeyedService> CreateTextClassifierModelService( + web::BrowserState* browser_state); + ~TextClassifierModelServiceFake() override; + + private: + TextClassifierModelServiceFake(OptimizationGuideService* opt_guide); +}; + +#endif // IOS_CHROME_BROWSER_TEXT_SELECTION_TEXT_CLASSIFIER_MODEL_SERVICE_FAKE_H_
diff --git a/ios/chrome/browser/text_selection/text_classifier_model_service_fake.mm b/ios/chrome/browser/text_selection/text_classifier_model_service_fake.mm new file mode 100644 index 0000000..be9c105 --- /dev/null +++ b/ios/chrome/browser/text_selection/text_classifier_model_service_fake.mm
@@ -0,0 +1,35 @@ +// 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. + +#import "ios/chrome/browser/text_selection/text_classifier_model_service_fake.h" + +#import <memory> + +#import "ios/chrome/browser/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/optimization_guide/optimization_guide_service.h" +#import "ios/chrome/browser/optimization_guide/optimization_guide_service_factory.h" +#import "ios/chrome/browser/text_selection/text_classifier_model_service.h" + +#if !defined(__has_feature) || !__has_feature(objc_arc) +#error "This file requires ARC support." +#endif + +// static +std::unique_ptr<KeyedService> +TextClassifierModelServiceFake::CreateTextClassifierModelService( + web::BrowserState* context) { + ChromeBrowserState* browser_state = + ChromeBrowserState::FromBrowserState(context); + auto* opt_guide = + OptimizationGuideServiceFactory::GetForBrowserState(browser_state); + auto service = + base::WrapUnique(new TextClassifierModelServiceFake(opt_guide)); + return service; +} + +TextClassifierModelServiceFake::~TextClassifierModelServiceFake() {} + +TextClassifierModelServiceFake::TextClassifierModelServiceFake( + OptimizationGuideService* opt_guide) + : TextClassifierModelService(opt_guide) {}
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h index 60e3595..fe0b136c 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.h
@@ -25,6 +25,7 @@ extern const char kTrendingQueriesHideShortcutsParam[]; extern const char kTrendingQueriesDisabledFeedParam[]; extern const char kTrendingQueriesSignedOutParam[]; +extern const char kTrendingQueriesNeverShowModuleParam[]; // A parameter to indicate whether the native UI is enabled for the discover // feed. @@ -50,4 +51,8 @@ // Whether the Trending Queries module should only be shown to signed out users. bool ShouldOnlyShowTrendingQueriesForSignedOut(); +// Whether the Trending Queries module should not be shown even if the feature +// is enabled. +bool ShouldNeverShowTrendingQueriesModule(); + #endif // IOS_CHROME_BROWSER_UI_CONTENT_SUGGESTIONS_CONTENT_SUGGESTIONS_FEATURE_H_
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm index 8f8f503..3f832f3 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_feature.mm
@@ -28,6 +28,7 @@ const char kTrendingQueriesHideShortcutsParam[] = "hide_shortcuts"; const char kTrendingQueriesDisabledFeedParam[] = "disabled_feed_only"; const char kTrendingQueriesSignedOutParam[] = "signed_out_only"; +const char kTrendingQueriesNeverShowModuleParam[] = "never_show_module"; // A parameter to indicate whether the native UI is enabled for the discover // feed. @@ -42,7 +43,8 @@ } bool IsTrendingQueriesModuleEnabled() { - return base::FeatureList::IsEnabled(kTrendingQueriesModule); + return base::FeatureList::IsEnabled(kTrendingQueriesModule) && + !ShouldNeverShowTrendingQueriesModule(); } bool ShouldHideShortcutsForTrendingQueries() { @@ -59,3 +61,8 @@ return base::GetFieldTrialParamByFeatureAsBool( kTrendingQueriesModule, kTrendingQueriesSignedOutParam, false); } + +bool ShouldNeverShowTrendingQueriesModule() { + return base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesNeverShowModuleParam, false); +}
diff --git a/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm b/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm index b7039ba..0275938 100644 --- a/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm +++ b/ios/chrome/browser/ui/first_run/first_run_two_steps_egtest.mm
@@ -51,6 +51,8 @@ FRESigninIntentSigninDisabledByPolicy, // FRE with an enterprise policy. FRESigninIntentSigninWithPolicy, + // FRE with no UMA link in the first screen. + FRESigninIntentSigninWithUMAReportingDisabledPolicy, }; NSString* const kSyncPassphrase = @"hello"; @@ -121,7 +123,7 @@ return config; } -#pragma mark Tests +#pragma mark - Tests // Tests FRE with UMA default value and without sign-in. - (void)testWithUMACheckedAndNoSignin { @@ -720,7 +722,39 @@ [SigninEarlGrey verifySignedOut]; } -#pragma mark Helper +// Tests that the UMA link does not appear in FRE when UMA is disabled by +// enterprise policy. +- (void)testUMADisabledByPolicy { + // Configure the policy to disable UMA. + [self relaunchAppWithPolicyKey:policy::key::kMetricsReportingEnabled + xmlPolicyValue:"<false/>"]; + // Add identity. + FakeChromeIdentity* fakeIdentity = [FakeChromeIdentity fakeIdentity1]; + [SigninEarlGrey addFakeIdentity:fakeIdentity]; + // Verify 2 step FRE with no UMA footer. + [self verifyEnterpriseWelcomeScreenIsDisplayedWithFRESigninIntent: + FRESigninIntentSigninWithUMAReportingDisabledPolicy]; + // Accept sign-in. + [[self + elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher() + scrollViewIdentifier: + kPromoStyleScrollViewAccessibilityIdentifier] + performAction:grey_tap()]; + // Accept sync. + [[self + elementInteractionWithGreyMatcher:PromoStylePrimaryActionButtonMatcher() + scrollViewIdentifier: + kPromoStyleScrollViewAccessibilityIdentifier] + performAction:grey_tap()]; + // Check that UMA is off. + GREYAssertFalse( + [FirstRunAppInterface isUMACollectionEnabled], + @"kMetricsReportingEnabled pref was unexpectedly true by default."); + // Check signed in. + [SigninEarlGrey verifySignedInWithFakeIdentity:fakeIdentity]; +} + +#pragma mark - Helper - (void)relaunchAppWithBrowserSigninMode:(BrowserSigninMode)mode { std::string xmlPolicyValue("<integer>"); @@ -753,21 +787,32 @@ assertWithMatcher:grey_notNil()]; NSString* title = nil; NSString* subtitle = nil; - NSMutableArray* disclaimerStrings = [NSMutableArray array]; + NSArray* disclaimerStrings = nil; switch (FRESigninIntent) { case FRESigninIntentRegular: title = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE); subtitle = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SHORT); + disclaimerStrings = @[ + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING), + ]; break; case FRESigninIntentSigninForcedByPolicy: title = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE_SIGNIN_FORCED); subtitle = l10n_util::GetNSString( IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SIGNIN_FORCED); - [disclaimerStrings - addObject:l10n_util::GetNSString( - IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED)]; + disclaimerStrings = @[ + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING), + ]; break; case FRESigninIntentSigninDisabledByPolicy: if ([ChromeEarlGrey isIPadIdiom]) { @@ -779,25 +824,40 @@ } subtitle = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_WELCOME_SCREEN_SUBTITLE); - [disclaimerStrings - addObject:l10n_util::GetNSString( - IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED)]; + disclaimerStrings = @[ + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING), + ]; break; case FRESigninIntentSigninWithPolicy: title = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE); subtitle = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SHORT); - [disclaimerStrings - addObject:l10n_util::GetNSString( - IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED)]; + disclaimerStrings = @[ + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING), + ]; + break; + case FRESigninIntentSigninWithUMAReportingDisabledPolicy: + title = l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_TITLE); + subtitle = + l10n_util::GetNSString(IDS_IOS_FIRST_RUN_SIGNIN_SUBTITLE_SHORT); + disclaimerStrings = @[ + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_BROWSER_MANAGED), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE), + ]; break; } - [disclaimerStrings - addObject:l10n_util::GetNSString( - IDS_IOS_FIRST_RUN_WELCOME_SCREEN_TERMS_OF_SERVICE)]; - [disclaimerStrings - addObject:l10n_util::GetNSString( - IDS_IOS_FIRST_RUN_WELCOME_SCREEN_METRIC_REPORTING)]; // Validate the Title text. [[self elementInteractionWithGreyMatcher:grey_allOf( grey_text(title),
diff --git a/ios/chrome/browser/ui/first_run/trending_queries_field_trial.cc b/ios/chrome/browser/ui/first_run/trending_queries_field_trial.cc index 263073d3..767c59f 100644 --- a/ios/chrome/browser/ui/first_run/trending_queries_field_trial.cc +++ b/ios/chrome/browser/ui/first_run/trending_queries_field_trial.cc
@@ -31,6 +31,8 @@ const char kTrendingQueriesEnabledDisabledFeedGroup[] = "EnabledDisabledFeed-V1"; const char kTrendingQueriesEnabledSignedOutGroup[] = "EnabledSignedOut-V1"; +const char kTrendingQueriesEnabledNeverShowModuleGroup[] = + "EnabledNeverShowModule-V1"; const char kTrendingQueriesControlGroup[] = "Control-V1"; const char kTrendingQueriesDefaultGroup[] = "Default"; @@ -41,6 +43,7 @@ {kTrendingQueriesEnabledAllUsersHideShortcutsID, 0}, {kTrendingQueriesEnabledDisabledFeedID, 0}, {kTrendingQueriesEnabledSignedOutID, 0}, + {kTrendingQueriesEnabledNeverShowModuleID, 0}, {kTrendingQueriesControlID, 0}}; switch (GetChannel()) { case version_info::Channel::UNKNOWN: @@ -51,6 +54,7 @@ weight_by_id[kTrendingQueriesEnabledAllUsersHideShortcutsID] = 10; weight_by_id[kTrendingQueriesEnabledDisabledFeedID] = 10; weight_by_id[kTrendingQueriesEnabledSignedOutID] = 10; + weight_by_id[kTrendingQueriesEnabledNeverShowModuleID] = 10; weight_by_id[kTrendingQueriesControlID] = 10; break; case version_info::Channel::STABLE: @@ -89,6 +93,7 @@ params[kTrendingQueriesHideShortcutsParam] = "false"; params[kTrendingQueriesDisabledFeedParam] = "false"; params[kTrendingQueriesSignedOutParam] = "false"; + params[kTrendingQueriesNeverShowModuleParam] = "false"; base::AssociateFieldTrialParams(kTrendingQueriesModule.name, kTrendingQueriesEnabledAllUsersGroup, params); @@ -98,6 +103,7 @@ params[kTrendingQueriesHideShortcutsParam] = "true"; params[kTrendingQueriesDisabledFeedParam] = "false"; params[kTrendingQueriesSignedOutParam] = "false"; + params[kTrendingQueriesNeverShowModuleParam] = "false"; base::AssociateFieldTrialParams( kTrendingQueriesModule.name, kTrendingQueriesEnabledAllUsersHideShortcutsGroup, params); @@ -108,6 +114,7 @@ params[kTrendingQueriesHideShortcutsParam] = "false"; params[kTrendingQueriesDisabledFeedParam] = "true"; params[kTrendingQueriesSignedOutParam] = "false"; + params[kTrendingQueriesNeverShowModuleParam] = "false"; base::AssociateFieldTrialParams(kTrendingQueriesModule.name, kTrendingQueriesEnabledDisabledFeedGroup, params); @@ -118,9 +125,22 @@ params[kTrendingQueriesHideShortcutsParam] = "true"; params[kTrendingQueriesDisabledFeedParam] = "false"; params[kTrendingQueriesSignedOutParam] = "true"; + params[kTrendingQueriesNeverShowModuleParam] = "false"; base::AssociateFieldTrialParams(kTrendingQueriesModule.name, kTrendingQueriesEnabledSignedOutGroup, params); + + config.AddGroup(kTrendingQueriesEnabledNeverShowModuleGroup, + kTrendingQueriesEnabledNeverShowModuleID, + weight_by_id[kTrendingQueriesEnabledNeverShowModuleID]); + params[kTrendingQueriesHideShortcutsParam] = "true"; + params[kTrendingQueriesDisabledFeedParam] = "false"; + params[kTrendingQueriesSignedOutParam] = "false"; + params[kTrendingQueriesNeverShowModuleParam] = "true"; + base::AssociateFieldTrialParams(kTrendingQueriesModule.name, + kTrendingQueriesEnabledNeverShowModuleGroup, + params); + scoped_refptr<base::FieldTrial> trial = config.CreateOneTimeRandomizedTrial( kTrendingQueriesDefaultGroup, low_entropy_provider); @@ -132,7 +152,8 @@ if (group_name == kTrendingQueriesEnabledAllUsersGroup || group_name == kTrendingQueriesEnabledAllUsersHideShortcutsGroup || group_name == kTrendingQueriesEnabledDisabledFeedGroup || - group_name == kTrendingQueriesEnabledSignedOutGroup) { + group_name == kTrendingQueriesEnabledSignedOutGroup || + group_name == kTrendingQueriesEnabledNeverShowModuleGroup) { feature_list->RegisterFieldTrialOverride( kTrendingQueriesModule.name, base::FeatureList::OVERRIDE_ENABLE_FEATURE, trial.get()); @@ -155,7 +176,7 @@ // is needed for explicit flag settings in chrome://flags. if (feature_list->IsFeatureOverriddenFromCommandLine( kTrendingQueriesModule.name) || - IsTrendingQueriesModuleEnabled()) { + base::FeatureList::IsEnabled(kTrendingQueriesModule)) { return; }
diff --git a/ios/chrome/browser/ui/first_run/trending_queries_field_trial.h b/ios/chrome/browser/ui/first_run/trending_queries_field_trial.h index 09dc36f5..a36ca7b3 100644 --- a/ios/chrome/browser/ui/first_run/trending_queries_field_trial.h +++ b/ios/chrome/browser/ui/first_run/trending_queries_field_trial.h
@@ -19,6 +19,8 @@ 3350761; const variations::VariationID kTrendingQueriesEnabledDisabledFeedID = 3350762; const variations::VariationID kTrendingQueriesEnabledSignedOutID = 3350763; +const variations::VariationID kTrendingQueriesEnabledNeverShowModuleID = + 4833277; const variations::VariationID kTrendingQueriesControlID = 3350764; } // namespace
diff --git a/ios/chrome/browser/ui/first_run/trending_queries_field_trial_unittest.mm b/ios/chrome/browser/ui/first_run/trending_queries_field_trial_unittest.mm index 4953248..e1a5a5dd 100644 --- a/ios/chrome/browser/ui/first_run/trending_queries_field_trial_unittest.mm +++ b/ios/chrome/browser/ui/first_run/trending_queries_field_trial_unittest.mm
@@ -26,6 +26,7 @@ {kTrendingQueriesEnabledAllUsersHideShortcutsID, 0}, {kTrendingQueriesEnabledDisabledFeedID, 0}, {kTrendingQueriesEnabledSignedOutID, 0}, + {kTrendingQueriesEnabledNeverShowModuleID, 0}, {kTrendingQueriesControlID, 0}}; } @@ -71,6 +72,8 @@ kTrendingQueriesModule, kTrendingQueriesDisabledFeedParam, true)); EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( kTrendingQueriesModule, kTrendingQueriesSignedOutParam, true)); + EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesNeverShowModuleParam, false)); } // Tests kTrendingQueriesEnabledAllUsersHideShortcutsID field trial. @@ -91,6 +94,8 @@ kTrendingQueriesModule, kTrendingQueriesDisabledFeedParam, true)); EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( kTrendingQueriesModule, kTrendingQueriesSignedOutParam, true)); + EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesNeverShowModuleParam, false)); } // Tests kTrendingQueriesEnabledDisabledFeedID field trial. @@ -111,6 +116,8 @@ kTrendingQueriesModule, kTrendingQueriesDisabledFeedParam, false)); EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( kTrendingQueriesModule, kTrendingQueriesSignedOutParam, true)); + EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesNeverShowModuleParam, false)); } // Tests kTrendingQueriesEnabledSignedOutID field trial. @@ -131,4 +138,28 @@ kTrendingQueriesModule, kTrendingQueriesDisabledFeedParam, true)); EXPECT_TRUE(base::GetFieldTrialParamByFeatureAsBool( kTrendingQueriesModule, kTrendingQueriesSignedOutParam, false)); + EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesNeverShowModuleParam, false)); +} + +// Tests kTrendingQueriesEnabledNeverShowModuleID field trial. +TEST_F(TrendingQueriesFieldTrialTest, TestEnabledNeverShowModule) { + auto feature_list = std::make_unique<base::FeatureList>(); + weight_by_id_[kTrendingQueriesEnabledNeverShowModuleID] = 100; + trending_queries_field_trial::testing::CreateTrendingQueriesTrialForTesting( + weight_by_id_, low_entropy_provider_, feature_list.get()); + + // Substitute the existing feature list with the one with field trial + // configurations we are testing, and check assertions. + scoped_feature_list_.InitWithFeatureList(std::move(feature_list)); + ASSERT_TRUE(base::FieldTrialList::IsTrialActive(kTrendingQueriesModule.name)); + EXPECT_TRUE(base::FeatureList::IsEnabled(kTrendingQueriesModule)); + EXPECT_TRUE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesHideShortcutsParam, false)); + EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesDisabledFeedParam, false)); + EXPECT_FALSE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesSignedOutParam, false)); + EXPECT_TRUE(base::GetFieldTrialParamByFeatureAsBool( + kTrendingQueriesModule, kTrendingQueriesNeverShowModuleParam, false)); }
diff --git a/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm b/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm index 06366ef..b4c1278 100644 --- a/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm +++ b/ios/chrome/browser/ui/ntp/feed_metrics_recorder.mm
@@ -380,68 +380,76 @@ - (void)recordDiscoverFeedPreviewTapped { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedDiscoverFeedPreview]; + kTappedDiscoverFeedPreview + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionPreviewTapped)); } - (void)recordHeaderMenuLearnMoreTapped { - [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedLearnMore]; + [self + recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedLearnMore + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionLearnMoreTapped)); } - (void)recordHeaderMenuManageTapped { - [self - recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedManage]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedManage + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionManageTapped)); } - (void)recordHeaderMenuManageActivityTapped { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedManageActivity]; + kTappedManageActivity + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionManageActivityTapped)); } - (void)recordHeaderMenuManageInterestsTapped { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedManageInterests]; + kTappedManageInterests + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionManageInterestsTapped)); } - (void)recordHeaderMenuManageHiddenTapped { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedManageHidden]; + kTappedManageHidden + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionManageHiddenTapped)); } - (void)recordHeaderMenuManageFollowingTapped { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedManageFollowing]; + kTappedManageFollowing + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionManageFollowingTapped)); } - (void)recordDiscoverFeedVisibilityChanged:(BOOL)visible { if (visible) { - [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedTurnOn]; + [self + recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedTurnOn + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionTurnOn)); } else { - [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedTurnOff]; + [self + recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedTurnOff + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionTurnOff)); } } - (void)recordOpenURLInSameTab { - [self - recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedOnCard]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::kTappedOnCard + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionOpenSameTab)); [self recordOpenURL]; @@ -449,7 +457,8 @@ - (void)recordOpenURLInNewTab { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedOpenInNewTab]; + kTappedOpenInNewTab + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionOpenNewTab)); [self recordOpenURL]; @@ -457,7 +466,8 @@ - (void)recordOpenURLInIncognitoTab { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedOpenInNewIncognitoTab]; + kTappedOpenInNewIncognitoTab + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionOpenIncognitoTab)); [self recordOpenURL]; @@ -465,72 +475,80 @@ - (void)recordAddURLToReadLater { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kAddedToReadLater]; + kAddedToReadLater + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionReadLaterTapped)); } - (void)recordTapSendFeedback { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedSendFeedback]; + kTappedSendFeedback + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionSendFeedbackOpened)); } - (void)recordOpenBackOfCardMenu { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kOpenedContextMenu]; + kOpenedContextMenu + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionContextMenuOpened)); } - (void)recordCloseBackOfCardMenu { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kClosedContextMenu]; + kClosedContextMenu + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionCloseContextMenu)); } - (void)recordOpenNativeBackOfCardMenu { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kOpenedNativeActionSheet]; + kOpenedNativeActionSheet + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionNativeActionSheetOpened)); } - (void)recordShowDialog { - [self - recordDiscoverFeedUserActionHistogram:FeedUserActionType::kOpenedDialog]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::kOpenedDialog + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionReportContentOpened)); } - (void)recordDismissDialog { - [self - recordDiscoverFeedUserActionHistogram:FeedUserActionType::kClosedDialog]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::kClosedDialog + asInteraction:YES]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionReportContentClosed)); } - (void)recordDismissCard { - [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kEphemeralChange]; + [self + recordDiscoverFeedUserActionHistogram:FeedUserActionType::kEphemeralChange + asInteraction:YES]; base::RecordAction(base::UserMetricsAction(kDiscoverFeedUserActionHideStory)); } - (void)recordUndoDismissCard { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kEphemeralChangeRejected]; + kEphemeralChangeRejected + asInteraction:YES]; } - (void)recordCommittDismissCard { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kEphemeralChangeCommited]; + kEphemeralChangeCommited + asInteraction:YES]; } - (void)recordShowSnackbar { - [self - recordDiscoverFeedUserActionHistogram:FeedUserActionType::kShowSnackbar]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType::kShowSnackbar + asInteraction:NO]; } - (void)recordCommandID:(int)commandID { @@ -609,12 +627,14 @@ - (void)recordNativeContextMenuVisibilityChanged:(BOOL)shown { if (shown) { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kOpenedNativeContextMenu]; + kOpenedNativeContextMenu + asInteraction:YES]; base::RecordAction(base::UserMetricsAction( kDiscoverFeedUserActionNativeContextMenuOpened)); } else { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kClosedNativeContextMenu]; + kClosedNativeContextMenu + asInteraction:YES]; base::RecordAction(base::UserMetricsAction( kDiscoverFeedUserActionNativeContextMenuClosed)); } @@ -623,12 +643,14 @@ - (void)recordNativePulldownMenuVisibilityChanged:(BOOL)shown { if (shown) { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kOpenedNativePulldownMenu]; + kOpenedNativePulldownMenu + asInteraction:YES]; base::RecordAction(base::UserMetricsAction( kDiscoverFeedUserActionNativePulldownMenuOpened)); } else { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kClosedNativePulldownMenu]; + kClosedNativePulldownMenu + asInteraction:YES]; base::RecordAction(base::UserMetricsAction( kDiscoverFeedUserActionNativePulldownMenuClosed)); } @@ -653,12 +675,14 @@ switch (feedType) { case FeedTypeDiscover: [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kDiscoverFeedSelected]; + kDiscoverFeedSelected + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kDiscoverFeedSelected)); break; case FeedTypeFollowing: [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kFollowingFeedSelected]; + kFollowingFeedSelected + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kFollowingFeedSelected)); NSUInteger followCount = [self.followDelegate followedPublisherCount]; if (followCount > 0 && @@ -726,13 +750,15 @@ - (void)recordFollowFromMenu { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedFollowButton]; + kTappedFollowButton + asInteraction:NO]; base::RecordAction(base::UserMetricsAction("MobileMenuUnfollow")); } - (void)recordUnfollowFromMenu { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kTappedUnfollowButton]; + kTappedUnfollowButton + asInteraction:NO]; base::RecordAction(base::UserMetricsAction("MobileMenuFollow")); } @@ -766,25 +792,29 @@ (FollowSnackbarActionType)followSnackbarActionType { switch (followSnackbarActionType) { case FollowSnackbarActionType::kSnackbarActionGoToFeed: - [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedGoToFeedOnSnackbar]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: + kTappedGoToFeedOnSnackbar + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kSnackbarGoToFeedButtonTapped)); break; case FollowSnackbarActionType::kSnackbarActionUndo: [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedRefollowAfterUnfollowOnSnackbar]; + FeedUserActionType::kTappedRefollowAfterUnfollowOnSnackbar + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kSnackbarUndoButtonTapped)); break; case FollowSnackbarActionType::kSnackbarActionRetryFollow: [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedFollowTryAgainOnSnackbar]; + FeedUserActionType::kTappedFollowTryAgainOnSnackbar + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kSnackbarRetryFollowButtonTapped)); break; case FollowSnackbarActionType::kSnackbarActionRetryUnfollow: [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedUnfollowTryAgainOnSnackbar]; + FeedUserActionType::kTappedUnfollowTryAgainOnSnackbar + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kSnackbarRetryUnfollowButtonTapped)); break; @@ -793,45 +823,52 @@ - (void)recordManagementTappedUnfollow { [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedUnfollowOnManagementSurface]; + FeedUserActionType::kTappedUnfollowOnManagementSurface + asInteraction:NO]; base::RecordAction( base::UserMetricsAction(kDiscoverFeedUserActionManagementTappedUnfollow)); } - (void)recordManagementTappedRefollowAfterUnfollowOnSnackbar { [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedRefollowAfterUnfollowOnSnackbar]; + FeedUserActionType::kTappedRefollowAfterUnfollowOnSnackbar + asInteraction:NO]; base::RecordAction(base::UserMetricsAction( kDiscoverFeedUserActionManagementTappedRefollowAfterUnfollowOnSnackbar)); } - (void)recordManagementTappedUnfollowTryAgainOnSnackbar { [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kTappedUnfollowTryAgainOnSnackbar]; + FeedUserActionType::kTappedUnfollowTryAgainOnSnackbar + asInteraction:NO]; base::RecordAction(base::UserMetricsAction( kDiscoverFeedUserActionManagementTappedUnfollowTryAgainOnSnackbar)); } - (void)recordFirstFollowShown { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kFirstFollowSheetShown]; + kFirstFollowSheetShown + asInteraction:NO]; } - (void)recordFirstFollowTappedGoToFeed { [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kFirstFollowSheetTappedGoToFeed]; + FeedUserActionType::kFirstFollowSheetTappedGoToFeed + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kFirstFollowGoToFeedButtonTapped)); } - (void)recordFirstFollowTappedGotIt { [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: - kFirstFollowSheetTappedGotIt]; + kFirstFollowSheetTappedGotIt + asInteraction:NO]; base::RecordAction(base::UserMetricsAction(kFirstFollowGotItButtonTapped)); } - (void)recordFollowRecommendationIPHShown { - [self recordDiscoverFeedUserActionHistogram: - FeedUserActionType::kFollowRecommendationIPHShown]; + [self recordDiscoverFeedUserActionHistogram:FeedUserActionType:: + kFollowRecommendationIPHShown + asInteraction:NO]; } #pragma mark - Private @@ -872,10 +909,14 @@ } } -// Records histogram metrics for Discover feed user actions. -- (void)recordDiscoverFeedUserActionHistogram:(FeedUserActionType)actionType { +// Records histogram metrics for Discover feed user actions. If |isInteraction|, +// also logs an interaction to the visible feed. +- (void)recordDiscoverFeedUserActionHistogram:(FeedUserActionType)actionType + asInteraction:(BOOL)isInteraction { UMA_HISTOGRAM_ENUMERATION(kDiscoverFeedUserActionHistogram, actionType); - [self recordInteraction]; + if (isInteraction) { + [self recordInteraction]; + } } // Records Feed engagement.
diff --git a/ios/chrome/browser/ui/util/transparent_link_button.mm b/ios/chrome/browser/ui/util/transparent_link_button.mm index 3f30922b..bbad7a86 100644 --- a/ios/chrome/browser/ui/util/transparent_link_button.mm +++ b/ios/chrome/browser/ui/util/transparent_link_button.mm
@@ -50,7 +50,7 @@ lineHeight:(CGFloat)lineHeight NS_DESIGNATED_INITIALIZER; // Sets the properties, propogating state to its adjacent link buttons. -// `sender` is the TransparentLinkButon whose state is being propogated to +// `sender` is the TransparentLinkButon whose state is being propagated to // `self`. - (void)setHighlighted:(BOOL)highlighted sender:(TransparentLinkButton*)sender; - (void)setSelected:(BOOL)selected sender:(TransparentLinkButton*)sender;
diff --git a/ios/chrome/browser/ui/webui/download_internals_ui.cc b/ios/chrome/browser/ui/webui/download_internals_ui.cc index 1d88ed4..71e6c34 100644 --- a/ios/chrome/browser/ui/webui/download_internals_ui.cc +++ b/ios/chrome/browser/ui/webui/download_internals_ui.cc
@@ -65,25 +65,28 @@ } // download::Logger::Observer implementation. - void OnServiceStatusChanged(const base::Value& service_status) override { + void OnServiceStatusChanged( + const base::Value::Dict& service_status) override { web_ui()->FireWebUIListener("service-status-changed", service_status); } void OnServiceDownloadsAvailable( - const base::Value& service_downloads) override { + const base::Value::List& service_downloads) override { web_ui()->FireWebUIListener("service-downloads-available", service_downloads); } - void OnServiceDownloadChanged(const base::Value& service_download) override { + void OnServiceDownloadChanged( + const base::Value::Dict& service_download) override { web_ui()->FireWebUIListener("service-download-changed", service_download); } - void OnServiceDownloadFailed(const base::Value& service_download) override { + void OnServiceDownloadFailed( + const base::Value::Dict& service_download) override { web_ui()->FireWebUIListener("service-download-failed", service_download); } - void OnServiceRequestMade(const base::Value& service_request) override { + void OnServiceRequestMade(const base::Value::Dict& service_request) override { web_ui()->FireWebUIListener("service-request-made", service_request); }
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index ddb613e..2431feb 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -173,6 +173,7 @@ "//ios/chrome/common/ui/promo_style:constants", "//ios/chrome/test/app:test_support", "//ios/chrome/test/variations_smoke_test:eg_app_support+eg2", + "//ios/public/provider/chrome/browser/lens:lens_api", "//ios/public/provider/chrome/browser/signin:fake_chrome_identity", "//ios/testing:block_swizzler", "//ios/testing:hardware_keyboarr_support",
diff --git a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm index 92577c4..f9d1ef1 100644 --- a/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm +++ b/ios/chrome/test/earl_grey/chrome_earl_grey_app_interface.mm
@@ -52,6 +52,7 @@ #import "ios/chrome/test/app/tab_test_util.h" #import "ios/chrome/test/app/window_test_util.h" #import "ios/chrome/test/earl_grey/accessibility_util.h" +#import "ios/public/provider/chrome/browser/lens/lens_api.h" #import "ios/public/provider/chrome/browser/signin/fake_chrome_identity.h" #import "ios/testing/hardware_keyboard_util.h" #import "ios/testing/nserror_util.h" @@ -1130,7 +1131,8 @@ } + (BOOL)isUseLensToSearchForImageEnabled { - return base::FeatureList::IsEnabled(kUseLensToSearchForImage); + return base::FeatureList::IsEnabled(kUseLensToSearchForImage) && + ios::provider::IsLensSupported(); } + (BOOL)isThumbstripEnabledForWindowWithNumber:(int)windowNumber {
diff --git a/ios/chrome/test/testing_application_context.h b/ios/chrome/test/testing_application_context.h index 474ae2b..223c824 100644 --- a/ios/chrome/test/testing_application_context.h +++ b/ios/chrome/test/testing_application_context.h
@@ -66,6 +66,7 @@ SafeBrowsingService* GetSafeBrowsingService() override; network::NetworkConnectionTracker* GetNetworkConnectionTracker() override; BrowserPolicyConnectorIOS* GetBrowserPolicyConnector() override; + PromosManager* GetPromosManager() override; breadcrumbs::BreadcrumbPersistentStorageManager* GetBreadcrumbPersistentStorageManager() override; id<SingleSignOnService> GetSSOService() override;
diff --git a/ios/chrome/test/testing_application_context.mm b/ios/chrome/test/testing_application_context.mm index 4c28430c..62c2d24 100644 --- a/ios/chrome/test/testing_application_context.mm +++ b/ios/chrome/test/testing_application_context.mm
@@ -211,6 +211,11 @@ return browser_policy_connector_.get(); } +PromosManager* TestingApplicationContext::GetPromosManager() { + DCHECK(thread_checker_.CalledOnValidThread()); + return nullptr; +} + breadcrumbs::BreadcrumbPersistentStorageManager* TestingApplicationContext::GetBreadcrumbPersistentStorageManager() { DCHECK(thread_checker_.CalledOnValidThread());
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 92cd297..2d9947d 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 @@ -9e70bf093b5d3f9d18b625dc1720060e3d4b66fa \ No newline at end of file +0d4278da614e8918142233db1d33bf9deeacae9f \ 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 5dd8096f2..92d07b3 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 @@ -1718d0f6c3c71267b1c8c8891411a0f86632233d \ No newline at end of file +7ab49ee0ec9b270e97a342c36abc301129e63a96 \ 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 6b54a37d..d02e429 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 @@ -286ff4bd1e1bb3c99fa87ccb1503db4736f8c902 \ No newline at end of file +b7be878e6e1d7b4500e1ac90416ef572b35abcdc \ 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 b4ce9a1..ea8daae9 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 @@ -dc910631aab14a3230ae1f7f9b94a45cf4ceac2b \ No newline at end of file +e7dfef64798e8a5948b912a91739d25370a0fa70 \ 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 251af531..bcfc2848 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 @@ -4f250ae0007d11e53398c9f0c83069ea223bfe20 \ No newline at end of file +e2a79c8604cb750762ce76422d977b4fc6f68afc \ 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 c55dfdf2..7164aa7 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 @@ -fe0bdd2b92530cb9ff22e821617776ba4b23b38b \ No newline at end of file +ee2abbde8fb8c0d45795a8192402ad70a8a23e31 \ 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 708a9b3c..9ba9927e 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 @@ -4b04f92fef9c92592a3a2090a4dadcc0092d1021 \ No newline at end of file +09e3b88555acb92ece71ea71a116399f83f174e0 \ 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 c4e63ba..5a3d39a1 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 @@ -7f531b5d34bef70a49fe77111358a76430995aca \ No newline at end of file +a0577e201776b9e43962509fd81c5738154442f1 \ 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 4ca8ce8d..0e70cc6 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 @@ -c5cad04dff3b3cad98154492f17856f5ae14c55b \ No newline at end of file +88701d0afc39730fe19b5cddf720221353808028 \ 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 1f1f6e2..9e9c2df 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 @@ -949090e2b96bf2b51eb00f48be99ba8096491b0f \ No newline at end of file +9284b8e54dcd621317e9eb708d4bd6437692e1e3 \ No newline at end of file
diff --git a/ios/web/find_in_page/resources/find_in_page.ts b/ios/web/find_in_page/resources/find_in_page.ts index 8e3f86a..656c193d 100644 --- a/ios/web/find_in_page/resources/find_in_page.ts +++ b/ios/web/find_in_page/resources/find_in_page.ts
@@ -176,24 +176,100 @@ } /** + * A part of a Match, within a Section. A Match may cover multiple sections_ in + * |allText_|, so it must be split into multiple PartialMatches and then + * dispatched into the Sections they belong. The range of a PartialMatch in + * |allText_| is [begin, end). Exactly one <chrome_find> will be created for + * each PartialMatch. + */ +class PartialMatch { + /** + * @param {number} matchId ID of the Match to which this PartialMatch belongs. + * @param {number} begin Beginning index of partial match text in |allText_|. + * @param {number} end Ending index of partial match text in |allText_|. + */ + constructor( + public matchId: number, public begin: number, public end: number) {} +} + +/** + * A Replacement represents a DOM operation that swaps |oldNode| with |newNodes| + * under the parent of |oldNode| to highlight the match result inside |oldNode|. + * |newNodes| may contain plain TEXT Nodes for unhighlighted parts and + * <chrome_find> nodes for highlighted parts. This operation will be executed + * reversely when clearing current highlights for next FindInPage action. + */ +class Replacement { + /** + * @param {Node} HTMLElement The HTML Node containing search result. + * @param {Array<HTMLElement>} newNodes New HTML Nodes created for + * substitution of |oldNode|. + */ + constructor( + private readonly oldNode: HTMLElement, + private readonly newNodes: HTMLElement[]) {} + + /** + * Executes the replacement to highlight search result. + */ + doSwap(): void { + let parentNode = this.oldNode.parentNode; + if (!parentNode) + return; + for (const newNode of this.newNodes) { + parentNode.insertBefore(newNode, this.oldNode); + } + parentNode.removeChild(this.oldNode); + } + + /** + * Executes the replacement reversely to clear the highlight. + */ + undoSwap(): void { + const firstNewNode = this.newNodes[0]; + if (!firstNewNode) { + return; + } + let parentNode = firstNewNode.parentNode; + if (!parentNode) + return; + parentNode.insertBefore(this.oldNode, firstNewNode); + for (const newNode of this.newNodes) { + parentNode.removeChild(newNode); + } + } +} + +/** * A Section contains the info of one TEXT node in the |allText_|. The node's * textContent is [begin, end) of |allText_|. */ class Section { - begin: number; - end: number; - node: Node; - /** * @param {number} begin Beginning index of |node|.textContent in |allText_|. * @param {number} end Ending index of |node|.textContent in |allText_|. * @param {Node} node The TEXT Node of this section. */ - constructor(begin: number, end: number, node: Node) { - this.begin = begin; - this.end = end; - this.node = node; + constructor(public begin: number, public end: number, public node: Node) {} +} + +/** + * A timer that checks timeout for long tasks. + */ +class Timer { + private beginTime = Date.now(); + + /** + * @param {Number} timeoutMs Timeout in milliseconds. + */ + constructor(private timeoutMs: number) {} + + /** + * @return {Boolean} Whether this timer has been reached. + */ + overtime(): boolean { + return Date.now() - this.beginTime > this.timeoutMs; } } -export {CSS_CLASS_NAME_SELECT, Match, Section} +export {CSS_CLASS_NAME_SELECT, Match, PartialMatch, Replacement, Section, Timer}
diff --git a/ios/web/find_in_page/resources/find_in_page_native_api.js b/ios/web/find_in_page/resources/find_in_page_native_api.js index 881e913..9ebb70b5 100644 --- a/ios/web/find_in_page/resources/find_in_page_native_api.js +++ b/ios/web/find_in_page/resources/find_in_page_native_api.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 {CSS_CLASS_NAME_SELECT, Match, Section} from '//ios/web/find_in_page/resources/find_in_page.js'; +import {CSS_CLASS_NAME_SELECT, Match, PartialMatch, Replacement, Section, Timer} from '//ios/web/find_in_page/resources/find_in_page.js'; /** * Based on code from the Google iOS app. @@ -91,79 +91,12 @@ let matchId_ = 0; /** - * A part of a Match, within a Section. A Match may cover multiple sections_ in - * |allText_|, so it must be split into multiple PartialMatches and then - * dispatched into the Sections they belong. The range of a PartialMatch in - * |allText_| is [begin, end). Exactly one <chrome_find> will be created for - * each PartialMatch. - */ -class PartialMatch { - /** - * @param {number} matchId ID of the Match to which this PartialMatch belongs. - * @param {number} begin Beginning index of partial match text in |allText_|. - * @param {number} end Ending index of partial match text in |allText_|. - */ - constructor(matchId, begin, end) { - this.matchId = matchId; - this.begin = begin; - this.end = end; - } -} - -/** * A temporary array used for storing all PartialMatches inside current Section. * @type {Array<PartialMatch>} */ let partialMatches_ = []; /** - * A Replacement represents a DOM operation that swaps |oldNode| with |newNodes| - * under the parent of |oldNode| to highlight the match result inside |oldNode|. - * |newNodes| may contain plain TEXT Nodes for unhighlighted parts and - * <chrome_find> nodes for highlighted parts. This operation will be executed - * reversely when clearing current highlights for next FindInPage action. - */ -class Replacement { - /** - * @param {Node} oldNode The HTML Node containing search result. - * @param {Array<Node>} newNodes New HTML Nodes created for substitution of - * |oldNode|. - */ - constructor(oldNode, newNodes) { - this.oldNode = oldNode; - this.newNodes = newNodes; - } - - /** - * Executes the replacement to highlight search result. - * @return {undefined} - */ - doSwap() { - let parentNode = this.oldNode.parentNode; - if (!parentNode) - return; - for (var i = 0; i < this.newNodes.length; ++i) { - parentNode.insertBefore(this.newNodes[i], this.oldNode); - } - parentNode.removeChild(this.oldNode); - } - - /** - * Executes the replacement reversely to clear the highlight. - * @return {undefined} - */ - undoSwap() { - let parentNode = this.newNodes[0].parentNode; - if (!parentNode) - return; - parentNode.insertBefore(this.oldNode, this.newNodes[0]); - for (var i = 0; i < this.newNodes.length; ++i) { - parentNode.removeChild(this.newNodes[i]); - } - } -} - -/** * The replacements of current FindInPage action. * @type {Array<Replacement>} */ @@ -320,26 +253,6 @@ }; /** - * A timer that checks timeout for long tasks. - */ -class Timer { - /** - * @param {Number} timeoutMs Timeout in milliseconds. - */ - constructor(timeoutMs) { - this.beginTime = Date.now(); - this.timeoutMs = timeoutMs; - } - - /** - * @return {Boolean} Whether this timer has been reached. - */ - overtime() { - return Date.now() - this.beginTime > this.timeoutMs; - } -} - -/** * Looks for a phrase in the DOM. * @param {string} string Phrase to look for like "ben franklin". * @param {number} timeout Maximum time to run.
diff --git a/media/BUILD.gn b/media/BUILD.gn index 7d0170e..bc88823 100644 --- a/media/BUILD.gn +++ b/media/BUILD.gn
@@ -215,7 +215,6 @@ if (is_fuchsia) { deps += [ - "//media/fuchsia/audio:unittests", "//media/fuchsia/cdm/service:unittests", "//media/fuchsia/video:unittests", ]
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn index 2a9cf962..e3e0f8e 100644 --- a/media/audio/BUILD.gn +++ b/media/audio/BUILD.gn
@@ -325,7 +325,6 @@ "fuchsia/audio_output_stream_fuchsia.h", ] deps += [ - "//media/fuchsia/audio", "//media/fuchsia/common", "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media", "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp",
diff --git a/media/base/eme_constants.h b/media/base/eme_constants.h index 9cd7ed4..4d4dcd7 100644 --- a/media/base/eme_constants.h +++ b/media/base/eme_constants.h
@@ -9,6 +9,7 @@ #include "media/base/media_export.h" #include "media/media_buildflags.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace media { @@ -160,35 +161,45 @@ }; enum class EmeConfigRuleState { - // To correctly identify the EmeConfigRule as Supported, - // we use the enum value kUnset for each of the rules so - // that it is easy to check for, and cannot be confused. + // To correctly identify the EmeConfig as Supported, we use the enum value + // kUnset for each of the rules so that it is easy to check for, and cannot be + // confused. kUnset, - // Not Allowed represents when the rule in the collection of - // EmeConfigRules is not allowed by the current system. + // Not Allowed represents when the rule in the collection of EmeConfigRules is + // not allowed by the current system. kNotAllowed, - // Recommended represents when the rule in the collection of - // EmeConfigRules is recommended by the current system. In - // our design, the recommended takes a second priority and - // cannot override the NotAllowed or Required value. + // Recommended represents when the rule in the collection of EmeConfigRules is + // recommended by the current system. In our design, the recommended takes a + // second priority and cannot override the NotAllowed or Required value. kRecommended, - // Required represents when the rule in the collection of - // EmeConfigRules is required by the current system. + // Required represents when the rule in the collection of EmeConfigRules is + // required by the current system. kRequired, }; -struct MEDIA_EXPORT EmeConfigRule { - // Refer to the EME spec for definitions on what - // identifier, persistence, and hw_secure_codecs represent. +struct MEDIA_EXPORT EmeConfig { + using Rule = absl::optional<EmeConfig>; + + // Refer to the EME spec for definitions on what identifier, persistence, and + // hw_secure_codecs represent. EmeConfigRuleState identifier = EmeConfigRuleState::kUnset; EmeConfigRuleState persistence = EmeConfigRuleState::kUnset; EmeConfigRuleState hw_secure_codecs = EmeConfigRuleState::kUnset; + + // To represent an EmeConfig::Rule where the feature is supported without any + // special requirements. This type adds nothing during the AddRule() function. + // Internally, we represent Supported as all the States set to kUnset. + static EmeConfig::Rule SupportedRule() { return EmeConfig(); } + + // To represent an EmeConfig::Rule where the feature is not supported. + // Internally, we represent Unsupported as absl::nullopt. + static EmeConfig::Rule UnsupportedRule() { return absl::nullopt; } }; -inline bool operator==(EmeConfigRule const& lhs, EmeConfigRule const& rhs) { +inline bool operator==(EmeConfig const& lhs, EmeConfig const& rhs) { return lhs.persistence == rhs.persistence && lhs.identifier == rhs.identifier && lhs.hw_secure_codecs == rhs.hw_secure_codecs;
diff --git a/media/base/key_system_properties.h b/media/base/key_system_properties.h index 0ade370..4500f4e 100644 --- a/media/base/key_system_properties.h +++ b/media/base/key_system_properties.h
@@ -39,7 +39,7 @@ EmeInitDataType init_data_type) const = 0; // Returns the configuration rule for supporting |encryption_scheme|. - virtual absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + virtual EmeConfig::Rule GetEncryptionSchemeConfigRule( EncryptionScheme encryption_scheme) const = 0; // Returns the codecs supported by this key system. @@ -59,21 +59,20 @@ // must be applied. // TODO(crbug.com/1204284): Refactor this and remove the // `hw_secure_requirement` argument. - virtual absl::optional<EmeConfigRule> GetRobustnessConfigRule( + virtual EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* hw_secure_requirement) const = 0; // Returns the support this key system provides for persistent-license - // sessions. The returned `EmeConfigRule` (if supported) assumes persistence + // sessions. The returned `EmeConfig` (if supported) assumes persistence // requirement, which is enforced by `KeySystemConfigSelector`. Therefore, the - // returned `EmeConfigRule` doesn't need to specify persistence requirement + // returned `EmeConfig` doesn't need to specify persistence requirement // explicitly. - // TODO(crbug.com/1324262): Refactor `EmeConfigRule` to make it easier to + // TODO(crbug.com/1324262): Refactor `EmeConfig` to make it easier to // express combinations of requirements. - virtual absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport() - const = 0; + virtual EmeConfig::Rule GetPersistentLicenseSessionSupport() const = 0; // Returns the support this key system provides for persistent state. virtual EmeFeatureSupport GetPersistentStateSupport() const = 0;
diff --git a/media/base/key_systems.cc b/media/base/key_systems.cc index 7d5d025..0b27e769 100644 --- a/media/base/key_systems.cc +++ b/media/base/key_systems.cc
@@ -152,18 +152,18 @@ init_data_type == EmeInitDataType::KEYIDS; } - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( media::EncryptionScheme encryption_scheme) const final { switch (encryption_scheme) { case media::EncryptionScheme::kCenc: case media::EncryptionScheme::kCbcs: { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } case media::EncryptionScheme::kUnencrypted: break; } NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } SupportedCodecs GetSupportedCodecs() const final { @@ -173,21 +173,20 @@ return EME_CODEC_WEBM_ALL | EME_CODEC_MP4_ALL; } - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* /*hw_secure_requirement*/) const final { if (requested_robustness.empty()) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } else { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } } - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport() - const final { - return absl::nullopt; + EmeConfig::Rule GetPersistentLicenseSessionSupport() const final { + return EmeConfig::UnsupportedRule(); } EmeFeatureSupport GetPersistentStateSupport() const final { @@ -291,20 +290,20 @@ bool CanUseAesDecryptor(const std::string& key_system) const override; bool IsSupportedInitDataType(const std::string& key_system, EmeInitDataType init_data_type) const override; - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( const std::string& key_system, EncryptionScheme encryption_scheme) const override; - absl::optional<EmeConfigRule> GetContentTypeConfigRule( + EmeConfig::Rule GetContentTypeConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& container_mime_type, const std::vector<std::string>& codecs) const override; - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* hw_secure_requirement) const override; - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport( + EmeConfig::Rule GetPersistentLicenseSessionSupport( const std::string& key_system) const override; EmeFeatureSupport GetPersistentStateSupport( const std::string& key_system) const override; @@ -588,7 +587,7 @@ return properties->IsSupportedInitDataType(init_data_type); } -absl::optional<EmeConfigRule> KeySystemsImpl::GetEncryptionSchemeConfigRule( +EmeConfig::Rule KeySystemsImpl::GetEncryptionSchemeConfigRule( const std::string& key_system, EncryptionScheme encryption_scheme) const { DCHECK(thread_checker_.CalledOnValidThread()); @@ -596,7 +595,7 @@ const auto* properties = GetKeySystemProperties(key_system); if (!properties) { NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } return properties->GetEncryptionSchemeConfigRule(encryption_scheme); @@ -665,7 +664,7 @@ return properties->UseAesDecryptor(); } -absl::optional<EmeConfigRule> KeySystemsImpl::GetContentTypeConfigRule( +EmeConfig::Rule KeySystemsImpl::GetContentTypeConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& container_mime_type, @@ -677,13 +676,13 @@ case EmeMediaType::AUDIO: if (!base::StartsWith(container_mime_type, "audio/", base::CompareCase::SENSITIVE)) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } break; case EmeMediaType::VIDEO: if (!base::StartsWith(container_mime_type, "video/", base::CompareCase::SENSITIVE)) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } break; } @@ -692,7 +691,7 @@ const auto* properties = GetKeySystemProperties(key_system); if (!properties) { NOTREACHED() << "Key system support should have been checked"; - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // Look up the key system's supported codecs and secure codecs. @@ -707,7 +706,7 @@ if ((key_system_codec_mask & mime_type_codec_mask) == 0) { DVLOG(2) << "Container " << container_mime_type << " not supported by " << key_system; - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // Check that the codecs are supported by the key system and container based @@ -717,13 +716,13 @@ // yes | no | HW_SECURE_CODECS_NOT_ALLOWED // no | yes | HW_SECURE_CODECS_REQUIRED // no | no | NOT_SUPPORTED - auto to_support = EmeConfigRule(); + auto to_support = EmeConfig::SupportedRule(); for (auto& codec_iterator : codecs) { EmeCodec codec = GetEmeCodecForString(media_type, container_mime_type, codec_iterator); if (codec == EME_CODEC_NONE) { DVLOG(2) << "Unsupported codec string \"" << codec_iterator << "\""; - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // Currently all EmeCodecs only have one bit set. In case there could be @@ -735,34 +734,34 @@ codec) { DVLOG(2) << "Container/codec pair (" << container_mime_type << " / " << codec_iterator << ") not supported by " << key_system; - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // Check whether the codec supports a hardware-secure mode (any level). if ((codec & key_system_hw_secure_codec_mask) != codec) { DCHECK_EQ(codec & key_system_codec_mask, codec); - if (to_support.hw_secure_codecs == EmeConfigRuleState::kRequired) { - return absl::nullopt; + if (to_support->hw_secure_codecs == EmeConfigRuleState::kRequired) { + return EmeConfig::UnsupportedRule(); } - to_support.hw_secure_codecs = EmeConfigRuleState::kNotAllowed; + to_support->hw_secure_codecs = EmeConfigRuleState::kNotAllowed; } // Check whether the codec requires a hardware-secure mode (any level). if ((codec & key_system_codec_mask) != codec) { DCHECK_EQ(codec & key_system_hw_secure_codec_mask, codec); - if (to_support.hw_secure_codecs == EmeConfigRuleState::kNotAllowed) { - return absl::nullopt; + if (to_support->hw_secure_codecs == EmeConfigRuleState::kNotAllowed) { + return EmeConfig::UnsupportedRule(); } - to_support.hw_secure_codecs = EmeConfigRuleState::kRequired; + to_support->hw_secure_codecs = EmeConfigRuleState::kRequired; } } return to_support; } -absl::optional<EmeConfigRule> KeySystemsImpl::GetRobustnessConfigRule( +EmeConfig::Rule KeySystemsImpl::GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, @@ -772,22 +771,21 @@ const auto* properties = GetKeySystemProperties(key_system); if (!properties) { NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } return properties->GetRobustnessConfigRule( key_system, media_type, requested_robustness, hw_secure_requirement); } -absl::optional<EmeConfigRule> -KeySystemsImpl::GetPersistentLicenseSessionSupport( +EmeConfig::Rule KeySystemsImpl::GetPersistentLicenseSessionSupport( const std::string& key_system) const { DCHECK(thread_checker_.CalledOnValidThread()); const auto* properties = GetKeySystemProperties(key_system); if (!properties) { NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } return properties->GetPersistentLicenseSessionSupport();
diff --git a/media/base/key_systems.h b/media/base/key_systems.h index ed002d7..4a24550 100644 --- a/media/base/key_systems.h +++ b/media/base/key_systems.h
@@ -55,13 +55,13 @@ EmeInitDataType init_data_type) const = 0; // Returns the configuration rule for supporting |encryption_scheme|. - virtual absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + virtual EmeConfig::Rule GetEncryptionSchemeConfigRule( const std::string& key_system, EncryptionScheme encryption_scheme) const = 0; // Returns the configuration rule for supporting a container and a list of // codecs. - virtual absl::optional<EmeConfigRule> GetContentTypeConfigRule( + virtual EmeConfig::Rule GetContentTypeConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& container_mime_type, @@ -75,14 +75,14 @@ // must be applied. // TODO(crbug.com/1204284): Refactor this and remove the // `hw_secure_requirement` argument. - virtual absl::optional<EmeConfigRule> GetRobustnessConfigRule( + virtual EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* hw_secure_requirement) const = 0; // Returns the support |key_system| provides for persistent-license sessions. - virtual absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport( + virtual EmeConfig::Rule GetPersistentLicenseSessionSupport( const std::string& key_system) const = 0; // Returns the support |key_system| provides for persistent state.
diff --git a/media/base/key_systems_unittest.cc b/media/base/key_systems_unittest.cc index 823dc327..771cf26 100644 --- a/media/base/key_systems_unittest.cc +++ b/media/base/key_systems_unittest.cc
@@ -77,15 +77,15 @@ return EME_CODEC_WEBM_ALL | TEST_CODEC_FOO_AUDIO | TEST_CODEC_FOO_VIDEO; } - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* /*hw_secure_requirement*/) const override { if (requested_robustness.empty()) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } }; @@ -95,18 +95,17 @@ std::string GetBaseKeySystemName() const override { return name_; } - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( EncryptionScheme encryption_scheme) const override { if ((encryption_scheme == EncryptionScheme::kUnencrypted || encryption_scheme == EncryptionScheme::kCenc)) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport() - const override { - return absl::nullopt; + EmeConfig::Rule GetPersistentLicenseSessionSupport() const override { + return EmeConfig::UnsupportedRule(); } EmeFeatureSupport GetPersistentStateSupport() const override { @@ -129,18 +128,17 @@ // Pretend clear (unencrypted) and 'cenc' content are always supported. But // 'cbcs' is not supported by hardware secure codecs. - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( EncryptionScheme encryption_scheme) const override { switch (encryption_scheme) { case media::EncryptionScheme::kUnencrypted: case media::EncryptionScheme::kCenc: - return EmeConfigRule(); + return EmeConfig::SupportedRule(); case media::EncryptionScheme::kCbcs: - return EmeConfigRule{.hw_secure_codecs = - EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // We have hardware secure codec support for FOO_VIDEO and FOO_SECURE_VIDEO. @@ -148,26 +146,25 @@ return TEST_CODEC_FOO_VIDEO | TEST_CODEC_FOO_SECURE_VIDEO; } - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, const bool* /*hw_secure_requirement*/) const override { if (requested_robustness == kRobustnessSupported) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } else if (requested_robustness == kRobustnessSecureCodecsRequired) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } else if (requested_robustness == kRobustnessNotSupported) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } else { NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } } - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport() - const override { - return absl::nullopt; + EmeConfig::Rule GetPersistentLicenseSessionSupport() const override { + return EmeConfig::UnsupportedRule(); } EmeFeatureSupport GetPersistentStateSupport() const override { @@ -179,16 +176,15 @@ } }; -void ExpectEncryptionSchemeConfigRule( - const std::string& key_system, - EncryptionScheme encryption_scheme, - absl::optional<EmeConfigRule> expected_rule) { +void ExpectEncryptionSchemeConfigRule(const std::string& key_system, + EncryptionScheme encryption_scheme, + EmeConfig::Rule expected_rule) { EXPECT_EQ(expected_rule, KeySystems::GetInstance()->GetEncryptionSchemeConfigRule( key_system, encryption_scheme)); } -absl::optional<EmeConfigRule> GetVideoContentTypeConfigRule( +EmeConfig::Rule GetVideoContentTypeConfigRule( const std::string& mime_type, const std::vector<std::string>& codecs, const std::string& key_system) { @@ -220,7 +216,7 @@ return KeySystems::GetInstance()->IsSupportedKeySystem(key_system); } -absl::optional<EmeConfigRule> GetRobustnessConfigRule( +EmeConfig::Rule GetRobustnessConfigRule( const std::string& requested_robustness) { return KeySystems::GetInstance()->GetRobustnessConfigRule( kExternal, EmeMediaType::VIDEO, requested_robustness, nullptr); @@ -632,8 +628,8 @@ TEST_F(KeySystemsTest, IsSupportedKeySystem_UsesAesDecryptor_EncryptionSchemes) { - auto supported = EmeConfigRule(); - auto not_supported = absl::nullopt; + auto supported = EmeConfig::SupportedRule(); + auto not_supported = EmeConfig::UnsupportedRule(); ExpectEncryptionSchemeConfigRule(kUsesAes, EncryptionScheme::kUnencrypted, supported); ExpectEncryptionSchemeConfigRule(kUsesAes, EncryptionScheme::kCenc, @@ -756,9 +752,9 @@ TEST_F(KeySystemsTest, IsSupportedKeySystem_ExternalDecryptor_EncryptionSchemes) { - auto supported = EmeConfigRule(); + auto supported = EmeConfig::SupportedRule(); auto hw_secure_codecs_not_allowed = - EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; ExpectEncryptionSchemeConfigRule(kExternal, EncryptionScheme::kUnencrypted, supported); ExpectEncryptionSchemeConfigRule(kExternal, EncryptionScheme::kCenc, @@ -804,10 +800,10 @@ } TEST_F(KeySystemsTest, GetContentTypeConfigRule) { - auto supported = EmeConfigRule(); - auto not_supported = absl::nullopt; + auto supported = EmeConfig::SupportedRule(); + auto not_supported = EmeConfig::UnsupportedRule(); auto hw_secure_codecs_required = - EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; EXPECT_EQ(supported, GetRobustnessConfigRule(kRobustnessSupported)); EXPECT_EQ(not_supported, GetRobustnessConfigRule(kRobustnessNotSupported)); EXPECT_TRUE(hw_secure_codecs_required == @@ -815,12 +811,12 @@ } TEST_F(KeySystemsTest, HardwareSecureCodecs) { - auto supported = EmeConfigRule(); - auto not_supported = absl::nullopt; + auto supported = EmeConfig::SupportedRule(); + auto not_supported = EmeConfig::UnsupportedRule(); auto hw_secure_codecs_required = - EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; auto hw_secure_codecs_not_allowed = - EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; EXPECT_EQ(hw_secure_codecs_not_allowed, GetVideoContentTypeConfigRule(kVideoWebM, vp8_codec(), kUsesAes));
diff --git a/media/fuchsia/audio/BUILD.gn b/media/fuchsia/audio/BUILD.gn index 3e842fc..d188693 100644 --- a/media/fuchsia/audio/BUILD.gn +++ b/media/fuchsia/audio/BUILD.gn
@@ -2,27 +2,6 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("audio") { - public_deps = [ "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media" ] - - deps = [ - "//base", - "//media/base", - "//media/filters", - "//media/fuchsia/cdm", - "//media/fuchsia/common", - "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media.audio", - "//third_party/fuchsia-sdk/sdk/pkg/sys_cpp", - ] - - configs += [ "//media:subcomponent_config" ] - - sources = [ - "fuchsia_audio_output_device.cc", - "fuchsia_audio_output_device.h", - ] -} - source_set("test_support") { testonly = true deps = [ "//testing/gtest" ] @@ -53,18 +32,3 @@ ] deps = [ "//testing/gtest" ] } - -source_set("unittests") { - testonly = true - - deps = [ - ":test_support", - "//base", - "//base/test:test_support", - "//media", - "//testing/gtest", - "//third_party/fuchsia-sdk/sdk/fidl/fuchsia.media.audio", - ] - - sources = [ "fuchsia_audio_output_device_test.cc" ] -}
diff --git a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc index 10310af..8e79aea 100644 --- a/media/gpu/chromeos/video_decoder_pipeline_unittest.cc +++ b/media/gpu/chromeos/video_decoder_pipeline_unittest.cc
@@ -108,6 +108,10 @@ void(const DecryptConfig*, const std::vector<uint8_t>&, chromeos::ChromeOsCdmContext::GetHwKeyDataCB)); + MOCK_METHOD1(GetHwConfigData, + void(chromeos::ChromeOsCdmContext::GetHwConfigDataCB)); + MOCK_METHOD1(GetScreenResolutions, + void(chromeos::ChromeOsCdmContext::GetScreenResolutionsCB)); MOCK_METHOD0(GetCdmContextRef, std::unique_ptr<CdmContextRef>()); MOCK_CONST_METHOD0(UsingArcCdm, bool()); };
diff --git a/media/gpu/v4l2/test/av1_decoder.cc b/media/gpu/v4l2/test/av1_decoder.cc index f688110..cb3a1063 100644 --- a/media/gpu/v4l2/test/av1_decoder.cc +++ b/media/gpu/v4l2/test/av1_decoder.cc
@@ -603,6 +603,51 @@ } } +// Section 5.11. Tile Group OBU syntax +void FillTileGroupParams( + v4l2_ctrl_av1_tile_group* tile_group_params, + std::vector<struct v4l2_ctrl_av1_tile_group_entry>* + tile_group_entry_vectors, + const base::span<const uint8_t> frame_obu_data, + const libgav1::TileInfo& tile_info, + const libgav1::Vector<libgav1::TileBuffer>& tile_buffers) { + // TODO(stevecho): This could happen in rare cases (for example, if there is a + // Metadata OBU after the TileGroup OBU). We currently do not have a reason to + // handle those cases. This is also the case in libgav1 at the moment. + CHECK(!tile_buffers.empty()); + const size_t tile_columns = tile_info.tile_columns; + + CHECK_GT(tile_columns, 0u); + const uint16_t num_tiles = base::checked_cast<uint16_t>(tile_buffers.size()); + + conditionally_set_flags(&tile_group_params->flags, num_tiles > 1, + V4L2_AV1_TILE_GROUP_FLAG_START_AND_END_PRESENT); + + if (num_tiles >= 1) { + tile_group_params->tg_start = 0; + tile_group_params->tg_end = num_tiles - 1; + } + + for (uint16_t tile_index = 0; tile_index < num_tiles; ++tile_index) { + struct v4l2_ctrl_av1_tile_group_entry tile_group_entry_params = {}; + + CHECK(tile_buffers[tile_index].data >= frame_obu_data.data()); + tile_group_entry_params.tile_offset = base::checked_cast<uint32_t>( + tile_buffers[tile_index].data - frame_obu_data.data()); + + tile_group_entry_params.tile_size = tile_buffers[tile_index].size; + + // The tiles are row-major. We use the number of columns |tile_columns| + // to compute computation of the row and column for a given tile. + tile_group_entry_params.tile_row = + tile_index / base::checked_cast<uint16_t>(tile_columns); + tile_group_entry_params.tile_col = + tile_index % base::checked_cast<uint16_t>(tile_columns); + + tile_group_entry_vectors->push_back(tile_group_entry_params); + } +} + } // namespace Av1Decoder::Av1Decoder(std::unique_ptr<IvfParser> ivf_parser, @@ -911,6 +956,30 @@ .size = sizeof(v4l2_frame_params), .ptr = &v4l2_frame_params}); + struct v4l2_ctrl_av1_tile_group tile_group_params = {}; + std::vector<struct v4l2_ctrl_av1_tile_group_entry> tile_group_entry_vectors; + + FillTileGroupParams( + &tile_group_params, &tile_group_entry_vectors, + base::make_span(ivf_frame_data_, ivf_frame_header_.frame_size), + current_frame_header.tile_info, obu_parser_->tile_buffers()); + + // TODO(b/240736764): We are discussing to remove tile group control. + // But current MTK driver expects this control with error check, so we need + // this setup for the time being. Also, current libgav1 parser doesn't have + // information about start & end index of each tile group. Thus, we are + // setting up this control only for the 1st tile group. In fact, current tests + // don't have cases when 2+ tile groups exist within a frame. + ext_ctrl_vectors.push_back({.id = V4L2_CID_STATELESS_AV1_TILE_GROUP, + .size = sizeof(tile_group_params), + .ptr = &tile_group_params}); + + ext_ctrl_vectors.push_back({.id = V4L2_CID_STATELESS_AV1_TILE_GROUP_ENTRY, + .size = base::checked_cast<__u32>( + tile_group_entry_vectors.size() * + sizeof(v4l2_ctrl_av1_tile_group_entry)), + .ptr = &tile_group_entry_vectors[0]}); + struct v4l2_ext_controls ext_ctrls = {.count = base::checked_cast<__u32>(ext_ctrl_vectors.size()), .controls = &ext_ctrl_vectors[0]}; @@ -926,6 +995,15 @@ LOG(FATAL) << "VIDIOC_DQBUF failed for CAPTURE queue."; scoped_refptr<MmapedBuffer> buffer = CAPTURE_queue_->GetBuffer(index); + CHECK_EQ(buffer->mmaped_planes().size(), 2u) + << "MM21 should have exactly 2 planes but CAPTURE queue does not."; + + CHECK_EQ(CAPTURE_queue_->fourcc(), v4l2_fourcc('M', 'M', '2', '1')); + size = CAPTURE_queue_->display_size(); + ConvertMM21ToYUV(y_plane, u_plane, v_plane, size, + static_cast<char*>(buffer->mmaped_planes()[0].start_addr), + static_cast<char*>(buffer->mmaped_planes()[1].start_addr), + CAPTURE_queue_->coded_size()); if (!v4l2_ioctl_->DQBuf(OUTPUT_queue_, &index)) LOG(FATAL) << "VIDIOC_DQBUF failed for OUTPUT queue.";
diff --git a/media/gpu/vaapi/vaapi_video_decoder.cc b/media/gpu/vaapi/vaapi_video_decoder.cc index 0ef047f7..0dbf3b9 100644 --- a/media/gpu/vaapi/vaapi_video_decoder.cc +++ b/media/gpu/vaapi/vaapi_video_decoder.cc
@@ -619,9 +619,11 @@ // NOTE: Only use this for protected content as other requirements for using // it are tied to protected content. #if BUILDFLAG(IS_CHROMEOS_ASH) - chromeos::ChromeOsCdmFactory::GetScreenResolutions(BindToCurrentLoop( - base::BindOnce(&VaapiVideoDecoder::ApplyResolutionChangeWithScreenSizes, - weak_this_))); + cdm_context_ref_->GetCdmContext() + ->GetChromeOsCdmContext() + ->GetScreenResolutions(BindToCurrentLoop(base::BindOnce( + &VaapiVideoDecoder::ApplyResolutionChangeWithScreenSizes, + weak_this_))); return; #endif }
diff --git a/media/gpu/vaapi/vaapi_video_decoder_delegate.cc b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc index c75ec30..4e2dc91c 100644 --- a/media/gpu/vaapi/vaapi_video_decoder_delegate.cc +++ b/media/gpu/vaapi/vaapi_video_decoder_delegate.cc
@@ -128,7 +128,7 @@ } // We need to start the creation of this, first part requires getting the // hw config data from the daemon. - chromeos::ChromeOsCdmFactory::GetHwConfigData(BindToCurrentLoop( + chromeos_cdm_context_->GetHwConfigData(BindToCurrentLoop( base::BindOnce(&VaapiVideoDecoderDelegate::OnGetHwConfigData, weak_factory_.GetWeakPtr()))); protected_session_state_ = ProtectedSessionState::kInProcess;
diff --git a/media/media_options.gni b/media/media_options.gni index c94ea571..de27a55 100644 --- a/media/media_options.gni +++ b/media/media_options.gni
@@ -334,7 +334,6 @@ if (is_fuchsia) { media_subcomponent_deps += [ - "//media/fuchsia/audio", "//media/fuchsia/cdm", "//media/fuchsia/common", ]
diff --git a/media/renderers/video_frame_yuv_converter.cc b/media/renderers/video_frame_yuv_converter.cc index 7cd02f50..273f5442 100644 --- a/media/renderers/video_frame_yuv_converter.cc +++ b/media/renderers/video_frame_yuv_converter.cc
@@ -146,10 +146,10 @@ gpu::Mailbox mailboxes[SkYUVAInfo::kMaxPlanes]{}; holder_->VideoFrameToMailboxes(video_frame, raster_context_provider, mailboxes); - ri->ConvertYUVAMailboxesToRGB(dest_mailbox_holder.mailbox, - holder_->yuva_info().yuvColorSpace(), - holder_->yuva_info().planeConfig(), - holder_->yuva_info().subsampling(), mailboxes); + ri->ConvertYUVAMailboxesToRGB( + dest_mailbox_holder.mailbox, holder_->yuva_info().yuvColorSpace(), + SkColorSpace::MakeSRGB().get(), holder_->yuva_info().planeConfig(), + holder_->yuva_info().subsampling(), mailboxes); return true; }
diff --git a/net/BUILD.gn b/net/BUILD.gn index 3842576..51843f21 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -1469,11 +1469,6 @@ "Security.framework", "SystemConfiguration.framework", ] - - # TODO(crbug.com/1348251) Disable SecKeychain is deprecated errors. - if (target_os == "ios") { - cflags += [ "-Wno-deprecated-declarations" ] - } } if (is_ios) {
diff --git a/net/base/features.cc b/net/base/features.cc index 91e9cff..06398a57 100644 --- a/net/base/features.cc +++ b/net/base/features.cc
@@ -11,9 +11,6 @@ namespace net::features { -const base::Feature kAcceptLanguageHeader{"AcceptLanguageHeader", - base::FEATURE_ENABLED_BY_DEFAULT}; - const base::Feature kAlpsForHttp2{"AlpsForHttp2", base::FEATURE_ENABLED_BY_DEFAULT};
diff --git a/net/base/features.h b/net/base/features.h index 84cc551a..b421d812 100644 --- a/net/base/features.h +++ b/net/base/features.h
@@ -17,10 +17,6 @@ namespace net::features { -// Toggles the `Accept-Language` HTTP request header, which -// https://github.com/WICG/lang-client-hint proposes that we deprecate. -NET_EXPORT extern const base::Feature kAcceptLanguageHeader; - // Enables ALPS extension of TLS 1.3 for HTTP/2, see // https://vasilvv.github.io/tls-alps/draft-vvv-tls-alps.html and // https://vasilvv.github.io/httpbis-alps/draft-vvv-httpbis-alps.html.
diff --git a/net/cert/cert_database_mac.cc b/net/cert/cert_database_mac.cc index a4084ccd..f561550 100644 --- a/net/cert/cert_database_mac.cc +++ b/net/cert/cert_database_mac.cc
@@ -40,6 +40,12 @@ FROM_HERE, base::BindOnce(&Notifier::Init, base::Unretained(this))); } +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Should be called from the |task_runner_|'s sequence. Use Shutdown() // to shutdown on arbitrary sequence. ~Notifier() { @@ -49,6 +55,8 @@ SecKeychainRemoveCallback(&Notifier::KeychainCallback); } +#pragma clang diagnostic pop + void Shutdown() { called_shutdown_ = true; if (!task_runner_->DeleteSoon(FROM_HERE, this)) { @@ -59,6 +67,12 @@ } } +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + private: void Init() { SecKeychainEventMask event_mask = @@ -69,6 +83,8 @@ registered_ = true; } +#pragma clang diagnostic pop + // SecKeychainCallback function that receives notifications from securityd // and forwards them to the |cert_db_|. static OSStatus KeychainCallback(SecKeychainEvent keychain_event,
diff --git a/net/cert/cert_verify_proc_mac_unittest.cc b/net/cert/cert_verify_proc_mac_unittest.cc index b3dfd6b3..908d5fc 100644 --- a/net/cert/cert_verify_proc_mac_unittest.cc +++ b/net/cert/cert_verify_proc_mac_unittest.cc
@@ -84,6 +84,12 @@ TestKeychainSearchList::Create()); ASSERT_TRUE(test_keychain_search_list); +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + base::FilePath keychain_path( GetTestCertsDirectory().AppendASCII("multi-root-BFE.keychain")); // SecKeychainOpen does not fail if the file doesn't exist, so assert it here @@ -97,6 +103,8 @@ base::ScopedCFTypeRef<SecKeychainRef> scoped_keychain(keychain); test_keychain_search_list->AddKeychain(keychain); +#pragma clang diagnostic pop + scoped_refptr<CRLSet> crl_set; std::string crl_set_bytes; // CRL which blocks C by SPKI. @@ -147,6 +155,12 @@ X509Certificate::FORMAT_AUTO); ASSERT_TRUE(cert); +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Create a test keychain search list that will Always Trust the SHA1 // cross-signed VeriSign Class 3 Public Primary Certification Authority - G5 std::unique_ptr<TestKeychainSearchList> test_keychain_search_list( @@ -166,6 +180,8 @@ base::ScopedCFTypeRef<SecKeychainRef> scoped_keychain(keychain); test_keychain_search_list->AddKeychain(keychain); +#pragma clang diagnostic pop + int flags = 0; CertVerifyResult verify_result; scoped_refptr<CertVerifyProc> verify_proc = @@ -184,6 +200,12 @@ ASSERT_EQ(2U, verified_intermediates.size()); } +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Test that the system root certificate keychain is in the expected location // and can be opened. Other tests would fail if this was not true, but this // test makes the reason for the failure obvious. @@ -198,6 +220,8 @@ CFRelease(keychain); } +#pragma clang diagnostic pop + // Test that CertVerifyProcMac reacts appropriately when Apple's certificate // verifier rejects a certificate with a fatal error. This is a regression // test for https://crbug.com/472291.
diff --git a/net/cert/internal/trust_store_mac.cc b/net/cert/internal/trust_store_mac.cc index 589817b..f3b6e2a 100644 --- a/net/cert/internal/trust_store_mac.cc +++ b/net/cert/internal/trust_store_mac.cc
@@ -614,6 +614,12 @@ private: friend base::NoDestructor<KeychainTrustSettingsChangedNotifier>; +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + KeychainTrustSettingsChangedNotifier() { DCHECK(GetNetworkNotificationThreadMac()->RunsTasksInCurrentSequence()); OSStatus status = SecKeychainAddCallback( @@ -623,6 +629,8 @@ OSSTATUS_LOG(ERROR, status) << "SecKeychainAddCallback failed"; } +#pragma clang diagnostic pop + ~KeychainTrustSettingsChangedNotifier() = delete; static OSStatus KeychainCallback(SecKeychainEvent keychain_event, @@ -1265,6 +1273,12 @@ } } +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + if (domains == TrustDomains::kAll) { // If a TestKeychainSearchList is present, it will have already set // |scoped_alternate_keychain_search_list|, which will be used as the @@ -1303,6 +1317,8 @@ CFArrayAppendValue(mutable_keychain_search_list, roots_keychain); } +#pragma clang diagnostic pop + if (scoped_alternate_keychain_search_list) { CFDictionarySetValue(query, kSecMatchSearchList, scoped_alternate_keychain_search_list.get());
diff --git a/net/cert/internal/trust_store_mac_unittest.cc b/net/cert/internal/trust_store_mac_unittest.cc index a465871..9238341 100644 --- a/net/cert/internal/trust_store_mac_unittest.cc +++ b/net/cert/internal/trust_store_mac_unittest.cc
@@ -128,6 +128,12 @@ IsKnownRootTestOrder, TrustStoreMac::TrustDomains>> {}; +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + // Test the trust store using known test certificates in a keychain. Tests // that issuer searching returns the expected certificates, and that none of // the certificates are trusted. @@ -147,6 +153,8 @@ ASSERT_TRUE(keychain); test_keychain_search_list->AddKeychain(keychain); +#pragma clang diagnostic pop + const TrustStoreMac::TrustImplType trust_impl = std::get<0>(GetParam()); const IsKnownRootTestOrder is_known_root_test_order = std::get<1>(GetParam()); const TrustStoreMac::TrustDomains trust_domains = std::get<2>(GetParam());
diff --git a/net/cookies/canonical_cookie.cc b/net/cookies/canonical_cookie.cc index 8b5bfd0..38d683a 100644 --- a/net/cookies/canonical_cookie.cc +++ b/net/cookies/canonical_cookie.cc
@@ -342,9 +342,8 @@ // TODO(crbug.com/1296161): Determine if we need to delete this function. bool HasValidAttributesForPartitioned(const GURL& url, bool secure, - const std::string& path, bool is_same_party) { - return url.SchemeIsCryptographic() && secure && path == "/" && !is_same_party; + return url.SchemeIsCryptographic() && secure && !is_same_party; } } // namespace @@ -815,7 +814,7 @@ status->AddExclusionReason( net::CookieInclusionStatus::EXCLUDE_INVALID_SAMEPARTY); } - if (!IsCookiePartitionedValid(url, secure, cookie_path, + if (!IsCookiePartitionedValid(url, secure, /*is_partitioned=*/partition_key.has_value(), /*is_same_party=*/same_party, /*partition_has_nonce=*/ @@ -1461,7 +1460,7 @@ if (IsPartitioned()) { if (CookiePartitionKey::HasNonce(partition_key_)) return true; - if (!secure_ || path_ != "/" || same_party_) { + if (!secure_ || same_party_) { return false; } } @@ -1640,7 +1639,6 @@ bool partition_has_nonce) { return IsCookiePartitionedValid( url, /*secure=*/parsed_cookie.IsSecure(), - parsed_cookie.HasPath() ? parsed_cookie.Path() : "", /*is_partitioned=*/parsed_cookie.IsPartitioned(), /*is_same_party=*/parsed_cookie.IsSameParty(), partition_has_nonce); } @@ -1648,7 +1646,6 @@ // static bool CanonicalCookie::IsCookiePartitionedValid(const GURL& url, bool secure, - const std::string& path, bool is_partitioned, bool is_same_party, bool partition_has_nonce) { @@ -1656,8 +1653,7 @@ return true; if (partition_has_nonce) return true; - bool result = - HasValidAttributesForPartitioned(url, secure, path, is_same_party); + bool result = HasValidAttributesForPartitioned(url, secure, is_same_party); DLOG_IF(WARNING, !result) << "CanonicalCookie has invalid Partitioned attribute"; return result;
diff --git a/net/cookies/canonical_cookie.h b/net/cookies/canonical_cookie.h index 1ddf1b15..d9610a9 100644 --- a/net/cookies/canonical_cookie.h +++ b/net/cookies/canonical_cookie.h
@@ -512,14 +512,13 @@ // Returns true iff the cookie is a partitioned cookie with a nonce or that // does not violate the semantics of the Partitioned attribute: - // - Must have the Secure and Path=/ attributes - // - Must not have the Domain or SameParty attributes + // - Must have the Secure attribute + // - Must not have the SameParty attribute static bool IsCookiePartitionedValid(const GURL& url, const ParsedCookie& parsed_cookie, bool partition_has_nonce); static bool IsCookiePartitionedValid(const GURL& url, bool secure, - const std::string& path, bool is_partitioned, bool is_same_party, bool partition_has_nonce);
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc index 8b4928e..8fa5599 100644 --- a/net/cookies/canonical_cookie_unittest.cc +++ b/net/cookies/canonical_cookie_unittest.cc
@@ -648,23 +648,25 @@ EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED})); - // Invalid Partitioned attribute: No Path attribute. + // Partitioned attribute: No Path attribute. status = CookieInclusionStatus(); cookie = CanonicalCookie::Create(url, "A=2; Partitioned; Secure", creation_time, server_time, partition_key, &status); - EXPECT_FALSE(cookie.get()); - EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( - {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED})); + EXPECT_TRUE(cookie.get()); + EXPECT_TRUE(status.IsInclude()); + EXPECT_TRUE(cookie->IsPartitioned()); + EXPECT_EQ(partition_key, cookie->PartitionKey()); - // Invalid Partitioned attribute: invalid Path attribute. + // Partitioned attribute: Path attribute not equal to "/". status = CookieInclusionStatus(); cookie = CanonicalCookie::Create( url, "A=2; Partitioned; Path=/foobar; Secure", creation_time, server_time, partition_key, &status); - EXPECT_FALSE(cookie.get()); - EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( - {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED})); + EXPECT_TRUE(cookie.get()); + EXPECT_TRUE(status.IsInclude()); + EXPECT_TRUE(cookie->IsPartitioned()); + EXPECT_EQ(partition_key, cookie->PartitionKey()); // Partitioned attribute: Domain cookie. status = CookieInclusionStatus(); @@ -2983,27 +2985,16 @@ GURL("https://toplevelsite.com"))) ->IsCanonical()); - // Partitioned attribute invalid, no Path. - EXPECT_FALSE(CanonicalCookie::CreateUnsafeCookieForTesting( - "A", "B", "x.y", "", base::Time(), base::Time(), - base::Time(), base::Time(), /*secure=*/true, - /*httponly=*/false, CookieSameSite::UNSPECIFIED, - COOKIE_PRIORITY_LOW, - /*same_party=*/false, - CookiePartitionKey::FromURLForTesting( - GURL("https://toplevelsite.com"))) - ->IsCanonical()); - - // Partitioned attribute invalid, invalid Path. - EXPECT_FALSE(CanonicalCookie::CreateUnsafeCookieForTesting( - "A", "B", "x.y", "/foobar", base::Time(), base::Time(), - base::Time(), base::Time(), /*secure=*/true, - /*httponly=*/false, CookieSameSite::UNSPECIFIED, - COOKIE_PRIORITY_LOW, - /*same_party=*/false, - CookiePartitionKey::FromURLForTesting( - GURL("https://toplevelsite.com"))) - ->IsCanonical()); + // Partitioned attribute is valid when Path != "/". + EXPECT_TRUE(CanonicalCookie::CreateUnsafeCookieForTesting( + "A", "B", "x.y", "/foo/bar", base::Time(), base::Time(), + base::Time(), base::Time(), /*secure=*/true, + /*httponly=*/false, CookieSameSite::UNSPECIFIED, + COOKIE_PRIORITY_LOW, + /*same_party=*/false, + CookiePartitionKey::FromURLForTesting( + GURL("https://toplevelsite.com"))) + ->IsCanonical()); // Partitioned attribute is valid when Domain attribute also included. EXPECT_TRUE(CanonicalCookie::CreateUnsafeCookieForTesting( @@ -3802,7 +3793,7 @@ {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED})); // Invalid: invalid Path. status = CookieInclusionStatus(); - EXPECT_FALSE(CanonicalCookie::CreateSanitizedCookie( + EXPECT_TRUE(CanonicalCookie::CreateSanitizedCookie( GURL("https://www.foo.com"), "A", "B", std::string(), "/foobar", two_hours_ago, one_hour_from_now, one_hour_ago, /*secure=*/true, /*http_only=*/false, CookieSameSite::NO_RESTRICTION, @@ -3811,8 +3802,7 @@ absl::optional<CookiePartitionKey>(CookiePartitionKey::FromURLForTesting( GURL("https://toplevelsite.com"))), &status)); - EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( - {CookieInclusionStatus::EXCLUDE_INVALID_PARTITIONED})); + EXPECT_TRUE(status.IsInclude()); // Domain attribute present is still valid. status = CookieInclusionStatus(); EXPECT_TRUE(CanonicalCookie::CreateSanitizedCookie(
diff --git a/net/dns/dns_client.cc b/net/dns/dns_client.cc index 972ebdfd..fd48d43f4 100644 --- a/net/dns/dns_client.cc +++ b/net/dns/dns_client.cc
@@ -14,7 +14,6 @@ #include "base/rand_util.h" #include "base/ranges/algorithm.h" #include "base/values.h" -#include "net/base/address_list.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" #include "net/dns/address_sorter.h" @@ -177,7 +176,7 @@ return &config->hosts; } - absl::optional<AddressList> GetPresetAddrs( + absl::optional<std::vector<IPEndPoint>> GetPresetAddrs( const url::SchemeHostPort& endpoint) const override { DCHECK(endpoint.IsValid()); if (!session_) @@ -199,7 +198,7 @@ combined.emplace_back(ip, endpoint.port()); } } - return AddressList(std::move(combined)); + return combined; } DnsTransactionFactory* GetTransactionFactory() override {
diff --git a/net/dns/dns_client.h b/net/dns/dns_client.h index 208a1b1..4a0931f 100644 --- a/net/dns/dns_client.h +++ b/net/dns/dns_client.h
@@ -7,7 +7,7 @@ #include <memory> -#include "net/base/address_list.h" +#include "net/base/ip_endpoint.h" #include "net/base/net_export.h" #include "net/base/rand_callback.h" #include "net/dns/dns_config.h" @@ -89,7 +89,7 @@ // Returns all preset addresses for the specified endpoint, if any are // present in the current effective DnsConfig. - virtual absl::optional<AddressList> GetPresetAddrs( + virtual absl::optional<std::vector<IPEndPoint>> GetPresetAddrs( const url::SchemeHostPort& endpoint) const = 0; // Returns null if the current config is not valid.
diff --git a/net/dns/dns_client_unittest.cc b/net/dns/dns_client_unittest.cc index 17bce032..7ce5be7 100644 --- a/net/dns/dns_client_unittest.cc +++ b/net/dns/dns_client_unittest.cc
@@ -306,7 +306,8 @@ EXPECT_FALSE(client_->GetPresetAddrs( url::SchemeHostPort("https", "www.doh.com", 9999))); - AddressList expected({{{4, 3, 2, 1}, 443}, {{4, 3, 2, 2}, 443}}); + std::vector<IPEndPoint> expected({{{4, 3, 2, 1}, 443}, {{4, 3, 2, 2}, 443}}); + EXPECT_THAT( client_->GetPresetAddrs(url::SchemeHostPort("https", "www.doh.com", 443)), testing::Optional(expected));
diff --git a/net/dns/dns_response_result_extractor.cc b/net/dns/dns_response_result_extractor.cc index 63bf01f..90af6162 100644 --- a/net/dns/dns_response_result_extractor.cc +++ b/net/dns/dns_response_result_extractor.cc
@@ -323,11 +323,11 @@ } ip_endpoints.emplace_back(address, /*port=*/0); } + int error_result = ip_endpoints.empty() ? ERR_NAME_NOT_RESOLVED : OK; - HostCache::Entry results(ip_endpoints.empty() ? ERR_NAME_NOT_RESOLVED : OK, - std::move(ip_endpoints), - HostCache::Entry::SOURCE_DNS, response_ttl); - results.set_aliases(std::move(aliases)); + HostCache::Entry results(error_result, std::move(ip_endpoints), + std::move(aliases), HostCache::Entry::SOURCE_DNS, + response_ttl); if (!canonical_name.empty()) { results.set_canonical_names(std::set<std::string>({canonical_name}));
diff --git a/net/dns/dns_test_util.cc b/net/dns/dns_test_util.cc index 0088d6d3..412b237e 100644 --- a/net/dns/dns_test_util.cc +++ b/net/dns/dns_test_util.cc
@@ -20,7 +20,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/threading/thread_task_runner_handle.h" #include "base/time/time.h" -#include "net/base/address_list.h" #include "net/base/io_buffer.h" #include "net/base/ip_address.h" #include "net/base/ip_endpoint.h" @@ -785,7 +784,7 @@ NOTREACHED(); } -absl::optional<AddressList> MockDnsClient::GetPresetAddrs( +absl::optional<std::vector<IPEndPoint>> MockDnsClient::GetPresetAddrs( const url::SchemeHostPort& endpoint) const { EXPECT_THAT(preset_endpoint_, testing::Optional(endpoint)); return preset_addrs_;
diff --git a/net/dns/dns_test_util.h b/net/dns/dns_test_util.h index 299e808..904ed1a 100644 --- a/net/dns/dns_test_util.h +++ b/net/dns/dns_test_util.h
@@ -18,8 +18,8 @@ #include "base/memory/scoped_refptr.h" #include "base/memory/weak_ptr.h" #include "base/time/time.h" -#include "net/base/address_list.h" #include "net/base/connection_endpoint_metadata.h" +#include "net/base/ip_endpoint.h" #include "net/dns/dns_client.h" #include "net/dns/dns_config.h" #include "net/dns/dns_response.h" @@ -417,7 +417,7 @@ DnsConfigOverrides GetConfigOverridesForTesting() const override; void SetTransactionFactoryForTesting( std::unique_ptr<DnsTransactionFactory> factory) override; - absl::optional<AddressList> GetPresetAddrs( + absl::optional<std::vector<IPEndPoint>> GetPresetAddrs( const url::SchemeHostPort& endpoint) const override; // Completes all DnsTransactions that were delayed by a rule. @@ -438,7 +438,7 @@ preset_endpoint_ = std::move(endpoint); } - void set_preset_addrs(AddressList preset_addrs) { + void set_preset_addrs(std::vector<IPEndPoint> preset_addrs) { preset_addrs_ = std::move(preset_addrs); } @@ -470,7 +470,7 @@ std::unique_ptr<MockDnsTransactionFactory> factory_; std::unique_ptr<AddressSorter> address_sorter_; absl::optional<url::SchemeHostPort> preset_endpoint_; - absl::optional<AddressList> preset_addrs_; + absl::optional<std::vector<IPEndPoint>> preset_addrs_; }; } // namespace net
diff --git a/net/dns/host_cache.cc b/net/dns/host_cache.cc index 30b74c3..35247d6 100644 --- a/net/dns/host_cache.cc +++ b/net/dns/host_cache.cc
@@ -413,6 +413,19 @@ HostCache::Entry& HostCache::Entry::operator=(Entry&& entry) = default; +HostCache::Entry::Entry(int error, + std::vector<IPEndPoint> ip_endpoints, + std::set<std::string> aliases, + Source source, + absl::optional<base::TimeDelta> ttl) + : error_(error), + ip_endpoints_(std::move(ip_endpoints)), + aliases_(std::move(aliases)), + source_(source), + ttl_(ttl ? ttl.value() : base::Seconds(-1)) { + DCHECK(!ttl || ttl.value() >= base::TimeDelta()); +} + HostCache::Entry::Entry(const HostCache::Entry& entry, base::TimeTicks now, base::TimeDelta ttl,
diff --git a/net/dns/host_cache.h b/net/dns/host_cache.h index e382c3d9..60ae8ae 100644 --- a/net/dns/host_cache.h +++ b/net/dns/host_cache.h
@@ -142,6 +142,13 @@ Entry(int error, T&& results, Source source) : Entry(error, std::forward<T>(results), source, absl::nullopt) {} + // Use for address entries. + Entry(int error, + std::vector<IPEndPoint> ip_endpoints, + std::set<std::string> aliases, + Source source, + absl::optional<base::TimeDelta> ttl = absl::nullopt); + // For errors with no |results|. Entry(int error, Source source, @@ -289,9 +296,6 @@ void PrepareForCacheInsertion(); - void SetResult(std::vector<IPEndPoint> ip_endpoints) { - ip_endpoints_ = std::move(ip_endpoints); - } void SetResult( std::multimap<HttpsRecordPriority, ConnectionEndpointMetadata> endpoint_metadatas) {
diff --git a/net/dns/host_cache_unittest.cc b/net/dns/host_cache_unittest.cc index 5cf743d..2b36b8b7 100644 --- a/net/dns/host_cache_unittest.cc +++ b/net/dns/host_cache_unittest.cc
@@ -144,21 +144,22 @@ TEST(HostCacheTest, GetEndpoints) { std::vector<IPEndPoint> ip_endpoints = {IPEndPoint(IPAddress(1, 1, 1, 1), 0), IPEndPoint(IPAddress(2, 2, 2, 2), 0)}; - HostCache::Entry entry(OK, ip_endpoints, HostCache::Entry::SOURCE_DNS); + HostCache::Entry entry(OK, ip_endpoints, /*aliases=*/{}, + HostCache::Entry::SOURCE_DNS); EXPECT_THAT(entry.GetEndpoints(), Optional(ElementsAre(ExpectEndpointResult(ip_endpoints)))); } TEST(HostCacheTest, GetEmptyEndpoints) { - HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, std::vector<IPEndPoint>(), - HostCache::Entry::SOURCE_DNS); + HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{}, + /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); EXPECT_THAT(entry.GetEndpoints(), Optional(IsEmpty())); } TEST(HostCacheTest, GetEmptyEndpointsWithMetadata) { - HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, std::vector<IPEndPoint>(), - HostCache::Entry::SOURCE_DNS); + HostCache::Entry entry(ERR_NAME_NOT_RESOLVED, /*ip_endpoints=*/{}, + /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); // Merge in non-empty metadata. ConnectionEndpointMetadata metadata; @@ -954,10 +955,10 @@ // Make entry1 and entry2, identical except for IP and pinned flag. IPEndPoint endpoint1(IPAddress(192, 0, 2, 1), 0); IPEndPoint endpoint2(IPAddress(192, 0, 2, 2), 0); - HostCache::Entry entry1 = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint1}, HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry entry2 = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint2}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry1 = HostCache::Entry(OK, {endpoint1}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry2 = HostCache::Entry(OK, {endpoint2}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); entry1.set_pinning(true); HostCache::Key key = Key("foobar.com"); @@ -994,10 +995,10 @@ // Make entry1 and entry2, identical except for IP and "pinned" flag. IPEndPoint endpoint1(IPAddress(192, 0, 2, 1), 0); IPEndPoint endpoint2(IPAddress(192, 0, 2, 2), 0); - HostCache::Entry entry1 = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint1}, HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry entry2 = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint2}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry1 = HostCache::Entry(OK, {endpoint1}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry2 = HostCache::Entry(OK, {endpoint2}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); entry1.set_pinning(true); HostCache::Key key = Key("foobar.com"); @@ -1038,10 +1039,10 @@ // Make entry1 and entry2, identical except for IP and pinned flag. IPEndPoint endpoint1(IPAddress(192, 0, 2, 1), 0); IPEndPoint endpoint2(IPAddress(192, 0, 2, 2), 0); - HostCache::Entry entry1 = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint1}, HostCache::Entry::SOURCE_UNKNOWN); - HostCache::Entry entry2 = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint2}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry1 = HostCache::Entry(OK, {endpoint1}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry2 = HostCache::Entry(OK, {endpoint2}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); entry1.set_pinning(true); entry2.set_pinning(false); @@ -1236,8 +1237,8 @@ HostCache::Key expire_by_changes_key = Key("expire.by.changes.test"); IPEndPoint endpoint(IPAddress(1, 2, 3, 4), 0); - HostCache::Entry entry = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry = HostCache::Entry(OK, {endpoint}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); @@ -1310,17 +1311,16 @@ IPEndPoint endpoint(IPAddress(1, 1, 1, 1), 0); HostCache::Entry serialized_entry = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN); + OK, {endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); IPEndPoint replacement_endpoint(IPAddress(2, 2, 2, 2), 0); HostCache::Entry replacement_entry = - HostCache::Entry(OK, std::vector<IPEndPoint>{replacement_endpoint}, + HostCache::Entry(OK, {replacement_endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); IPEndPoint other_endpoint(IPAddress(3, 3, 3, 3), 0); - HostCache::Entry other_entry = - HostCache::Entry(OK, std::vector<IPEndPoint>{other_endpoint}, - HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry other_entry = HostCache::Entry( + OK, {other_endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); EXPECT_EQ(0u, cache.size()); @@ -1524,8 +1524,9 @@ HostCache::Key key("host.test", DnsQueryType::UNSPECIFIED, 0, HostResolverSource::ANY, NetworkIsolationKey()); - HostCache::Entry entry = HostCache::Entry(OK, std::vector<IPEndPoint>(), - HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry = + HostCache::Entry(OK, /*ip_endpoints=*/{}, + /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); base::TimeTicks now; HostCache cache(kMaxCacheEntries); @@ -1562,8 +1563,8 @@ HostResolverSource::ANY, kOpaqueNetworkIsolationKey); IPEndPoint endpoint(IPAddress(1, 2, 3, 4), 0); - HostCache::Entry entry = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry = HostCache::Entry(OK, {endpoint}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); base::TimeTicks now; HostCache cache(kMaxCacheEntries); @@ -1602,8 +1603,8 @@ HostResolverSource::ANY, kNetworkIsolationKey); IPEndPoint endpoint(IPAddress(1, 2, 3, 4), 0); - HostCache::Entry entry = HostCache::Entry( - OK, std::vector<IPEndPoint>{endpoint}, HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry entry = HostCache::Entry(OK, {endpoint}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); base::TimeTicks now; HostCache cache(kMaxCacheEntries); @@ -1707,12 +1708,13 @@ std::string other_alias = "other_alias.test"; std::vector<IPEndPoint> ip_endpoints = {ipv6_endpoint, ipv4_endpoint1, ipv4_endpoint2, other_ipv4_endpoint}; - HostCache::Entry entry(OK, ip_endpoints, HostCache::Entry::SOURCE_DNS, ttl); std::set<std::string> aliases = {ipv6_alias, ipv4_alias, other_alias}; - entry.set_aliases(aliases); + HostCache::Entry entry(OK, ip_endpoints, aliases, + HostCache::Entry::SOURCE_DNS, ttl); std::set<std::string> canonical_names = {ipv6_alias, ipv4_alias}; entry.set_canonical_names(canonical_names); + EXPECT_TRUE(entry.GetEndpoints()); ConnectionEndpointMetadata metadata1; @@ -1790,11 +1792,12 @@ HostCache::Key key1 = Key("foobar.com"); HostCache::Key key2 = Key("foobar2.com"); - HostCache::Entry ok_entry = HostCache::Entry( - OK, std::vector<IPEndPoint>(), HostCache::Entry::SOURCE_UNKNOWN); + HostCache::Entry ok_entry = + HostCache::Entry(OK, /*ip_endpoints=*/{}, /*aliases=*/{}, + HostCache::Entry::SOURCE_UNKNOWN); std::vector<IPEndPoint> other_endpoints = { IPEndPoint(IPAddress(1, 1, 1, 1), 300)}; - HostCache::Entry other_entry(OK, std::move(other_endpoints), + HostCache::Entry other_entry(OK, std::move(other_endpoints), /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); HostCache::Entry error_entry = HostCache::Entry( ERR_NAME_NOT_RESOLVED, AddressList(), HostCache::Entry::SOURCE_UNKNOWN); @@ -1978,18 +1981,20 @@ std::vector<IPEndPoint> front_endpoints = { IPEndPoint(IPAddress(1, 1, 1, 1), 800), IPEndPoint(IPAddress(2, 2, 2, 2), 900)}; - HostCache::Entry front(OK, front_endpoints, HostCache::Entry::SOURCE_DNS); + HostCache::Entry front(OK, front_endpoints, /*aliases=*/{}, + HostCache::Entry::SOURCE_DNS); std::vector<IPEndPoint> back_endpoints = {IPEndPoint( IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 100)}; - HostCache::Entry back(OK, back_endpoints, HostCache::Entry::SOURCE_DNS); + HostCache::Entry back(OK, back_endpoints, /*aliases=*/{}, + HostCache::Entry::SOURCE_DNS); std::vector<IPEndPoint> expected_endpoints = { IPEndPoint(IPAddress(1, 1, 1, 1), 800), IPEndPoint(IPAddress(2, 2, 2, 2), 900), IPEndPoint(IPAddress(1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4), 100)}; - HostCache::Entry expected(OK, expected_endpoints, + HostCache::Entry expected(OK, expected_endpoints, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); HostCache::Entry result = HostCache::Entry::MergeEntries(front, back); @@ -2038,7 +2043,7 @@ // Merge in an `IPEndPoint` with different canonical name. IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0); - HostCache::Entry with_ip_endpoint(OK, std::vector<IPEndPoint>{ip_endpoint}, + HostCache::Entry with_ip_endpoint(OK, {ip_endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); with_ip_endpoint.set_canonical_names( std::set<std::string>{other_target_name}); @@ -2072,7 +2077,7 @@ // Merge in an `IPEndPoint` with different canonical name. IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0); - HostCache::Entry with_ip_endpoint(OK, std::vector<IPEndPoint>{ip_endpoint}, + HostCache::Entry with_ip_endpoint(OK, {ip_endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); with_ip_endpoint.set_canonical_names(std::set<std::string>{target_name}); HostCache::Entry result = @@ -2118,7 +2123,7 @@ // Merge in an `IPEndPoint`. IPEndPoint ip_endpoint(IPAddress(1, 1, 1, 1), 0); - HostCache::Entry with_ip_endpoint(OK, std::vector<IPEndPoint>{ip_endpoint}, + HostCache::Entry with_ip_endpoint(OK, {ip_endpoint}, /*aliases=*/{}, HostCache::Entry::SOURCE_DNS); with_ip_endpoint.set_canonical_names(std::set<std::string>{target_name}); @@ -2144,17 +2149,18 @@ } TEST(HostCacheTest, MergeAliases) { - HostCache::Entry front(OK, std::vector<IPEndPoint>(), + HostCache::Entry front(OK, /*ip_endpoints=*/{}, + /*aliases=*/{"foo1.test", "foo2.test", "foo3.test"}, HostCache::Entry::SOURCE_DNS); - front.set_aliases({"foo1.test", "foo2.test", "foo3.test"}); - HostCache::Entry back(OK, std::vector<IPEndPoint>(), + HostCache::Entry back(OK, /*ip_endpoints=*/{}, + /*aliases=*/{"foo2.test", "foo4.test"}, HostCache::Entry::SOURCE_DNS); - back.set_aliases({"foo2.test", "foo4.test"}); - HostCache::Entry expected(OK, std::vector<IPEndPoint>(), - HostCache::Entry::SOURCE_DNS); - expected.set_aliases({"foo1.test", "foo2.test", "foo3.test", "foo4.test"}); + HostCache::Entry expected( + OK, /*ip_endpoints=*/{}, + /*aliases=*/{"foo1.test", "foo2.test", "foo3.test", "foo4.test"}, + HostCache::Entry::SOURCE_DNS); HostCache::Entry result = HostCache::Entry::MergeEntries(front, back); EXPECT_EQ(result, expected);
diff --git a/net/dns/host_resolver_manager.cc b/net/dns/host_resolver_manager.cc index 6f90ba5..cb31b7d 100644 --- a/net/dns/host_resolver_manager.cc +++ b/net/dns/host_resolver_manager.cc
@@ -552,8 +552,8 @@ DnsQueryTypeToQtype(query_type)); } -AddressList FilterAddresses(AddressList addresses, - DnsQueryTypeSet query_types) { +std::vector<IPEndPoint> FilterAddresses(std::vector<IPEndPoint> addresses, + DnsQueryTypeSet query_types) { DCHECK(!query_types.Has(DnsQueryType::UNSPECIFIED)); DCHECK(!query_types.Empty()); @@ -564,7 +564,7 @@ return addresses; // Keep only the endpoints that match `want_family`. - addresses.endpoints().erase( + addresses.erase( base::ranges::remove_if( addresses, [want_family](AddressFamily family) { return family != want_family; }, @@ -580,11 +580,17 @@ bool ResolveLocalHostname(base::StringPiece host, AddressList* address_list) { address_list->clear(); + return ResolveLocalHostname(host, &address_list->endpoints()); +} + +bool ResolveLocalHostname(base::StringPiece host, + std::vector<IPEndPoint>* address_list) { + address_list->clear(); if (!IsLocalHostname(host)) return false; - address_list->push_back(IPEndPoint(IPAddress::IPv6Localhost(), 0)); - address_list->push_back(IPEndPoint(IPAddress::IPv4Localhost(), 0)); + address_list->emplace_back(IPAddress::IPv6Localhost(), 0); + address_list->emplace_back(IPAddress::IPv4Localhost(), 0); return true; } @@ -829,10 +835,14 @@ DCHECK(results_.value().aliases()); fixed_up_dns_alias_results_ = *results_.value().aliases(); - // Expect `aliases()` results to already be fixed up. - DCHECK(dns_alias_utility::FixUpDnsAliases( - fixed_up_dns_alias_results_.value()) == - fixed_up_dns_alias_results_.value()); + if (parameters().include_canonical_name) { + DCHECK_LE(fixed_up_dns_alias_results_.value().size(), 1u); + } else { + // Expect `aliases()` results to already be fixed up. + DCHECK(dns_alias_utility::FixUpDnsAliases( + fixed_up_dns_alias_results_.value()) == + fixed_up_dns_alias_results_.value()); + } legacy_address_results_ = HostResolver::EndpointResultToAddressList( endpoint_results_.value(), fixed_up_dns_alias_results_.value()); @@ -2635,16 +2645,22 @@ if (net_error == OK) ttl = base::Seconds(kCacheEntryTTLSeconds); + auto aliases = std::set<std::string>(addr_list.dns_aliases().begin(), + addr_list.dns_aliases().end()); + + if (!(key_.flags & HOST_RESOLVER_CANONNAME)) { + aliases = dns_alias_utility::FixUpDnsAliases(aliases); + } + // Source unknown because the system resolver could have gotten it from a // hosts file, its own cache, a DNS lookup or somewhere else. // Don't store the |ttl| in cache since it's not obtained from the server. CompleteRequests( - HostCache::Entry(net_error, - net_error == OK - ? AddressList::CopyWithPort(addr_list, 0) - : AddressList(), - HostCache::Entry::SOURCE_UNKNOWN), - ttl, true /* allow_cache */, false /* secure */); + HostCache::Entry( + net_error, + net_error == OK ? addr_list.endpoints() : std::vector<IPEndPoint>(), + std::move(aliases), HostCache::Entry::SOURCE_UNKNOWN), + ttl, /*allow_cache=*/true, /*secure=*/false); } void InsecureCacheLookup() { @@ -3619,10 +3635,11 @@ HostCache::Entry::SOURCE_UNKNOWN); } - AddressList addresses = AddressList::CreateFromIPAddress(ip_address, 0); - if (resolve_canonname) - addresses.SetDefaultCanonicalName(); - return HostCache::Entry(OK, std::move(addresses), + std::set<std::string> aliases; + if (resolve_canonname) { + aliases = {ip_address.ToString()}; + } + return HostCache::Entry(OK, {IPEndPoint(ip_address, 0)}, std::move(aliases), HostCache::Entry::SOURCE_UNKNOWN); } @@ -3673,17 +3690,17 @@ DCHECK(HasAddressType(key.query_types)); if (!absl::holds_alternative<url::SchemeHostPort>(key.host)) return absl::nullopt; - absl::optional<AddressList> preset_addrs = + absl::optional<std::vector<IPEndPoint>> preset_addrs = dns_client_->GetPresetAddrs(absl::get<url::SchemeHostPort>(key.host)); if (!preset_addrs) return absl::nullopt; - AddressList filtered_addresses = + std::vector<IPEndPoint> filtered_addresses = FilterAddresses(std::move(*preset_addrs), key.query_types); if (filtered_addresses.empty()) return absl::nullopt; - return HostCache::Entry(OK, std::move(filtered_addresses), + return HostCache::Entry(OK, std::move(filtered_addresses), /*aliases=*/{}, HostCache::Entry::SOURCE_CONFIG); } @@ -3728,7 +3745,7 @@ // flexibility, but lose implicit ordering. // We prefer IPv6 because "happy eyeballs" will fall back to IPv4 if // necessary. - AddressList addresses; + std::vector<IPEndPoint> addresses; if (query_types.Has(DnsQueryType::AAAA)) { auto it = hosts->find(DnsHostsKey(effective_hostname, ADDRESS_FAMILY_IPV6)); if (it != hosts->end()) @@ -3752,12 +3769,11 @@ return ServeFromHosts(hostname, query_types, false, tasks); } - if (!addresses.empty()) { - return HostCache::Entry(OK, std::move(addresses), - HostCache::Entry::SOURCE_HOSTS); - } + if (addresses.empty()) + return absl::nullopt; - return absl::nullopt; + return HostCache::Entry(OK, std::move(addresses), + /*aliases=*/{}, HostCache::Entry::SOURCE_HOSTS); } absl::optional<HostCache::Entry> HostResolverManager::ServeLocalhost( @@ -3766,7 +3782,7 @@ bool default_family_due_to_no_ipv6) { DCHECK(!query_types.Has(DnsQueryType::UNSPECIFIED)); - AddressList resolved_addresses; + std::vector<IPEndPoint> resolved_addresses; if (!HasAddressType(query_types) || !ResolveLocalHostname(hostname, &resolved_addresses)) { return absl::nullopt; @@ -3778,9 +3794,9 @@ // (See SystemHostResolverCall for rationale). query_types.Put(DnsQueryType::AAAA); } - AddressList filtered_addresses = + std::vector<IPEndPoint> filtered_addresses = FilterAddresses(std::move(resolved_addresses), query_types); - return HostCache::Entry(OK, std::move(filtered_addresses), + return HostCache::Entry(OK, std::move(filtered_addresses), /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); }
diff --git a/net/dns/host_resolver_manager.h b/net/dns/host_resolver_manager.h index 4650485..30be8ce 100644 --- a/net/dns/host_resolver_manager.h +++ b/net/dns/host_resolver_manager.h
@@ -568,6 +568,9 @@ // gets exercised indirectly through HostResolverManager. NET_EXPORT_PRIVATE bool ResolveLocalHostname(base::StringPiece host, AddressList* address_list); +NET_EXPORT_PRIVATE bool ResolveLocalHostname( + base::StringPiece host, + std::vector<IPEndPoint>* address_list); } // namespace net
diff --git a/net/dns/host_resolver_manager_unittest.cc b/net/dns/host_resolver_manager_unittest.cc index c082335..dd390a8 100644 --- a/net/dns/host_resolver_manager_unittest.cc +++ b/net/dns/host_resolver_manager_unittest.cc
@@ -2651,6 +2651,27 @@ EXPECT_THAT(response_no_flag.result_error(), IsError(ERR_NAME_NOT_RESOLVED)); } +TEST_F(HostResolverManagerTest, FixupCanonicalName) { + proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42", /*flags=*/0, + "CANON.name"); + proc_->SignalMultiple(1u); + + ResolveHostResponseHelper response(resolver_->CreateRequest( + HostPortPair("just.testing", 80), NetworkIsolationKey(), + NetLogWithSource(), absl::nullopt, resolve_context_.get(), + resolve_context_->host_cache())); + + EXPECT_THAT(response.result_error(), IsOk()); + EXPECT_THAT(response.request()->GetAddressResults()->endpoints(), + testing::ElementsAre(CreateExpected("192.168.1.42", 80))); + EXPECT_THAT( + response.request()->GetEndpointResults(), + testing::Pointee(testing::UnorderedElementsAre(ExpectEndpointResult( + testing::ElementsAre(CreateExpected("192.168.1.42", 80)))))); + EXPECT_THAT(response.request()->GetDnsAliasResults(), + testing::Pointee(testing::UnorderedElementsAre("canon.name"))); +} + TEST_F(HostResolverManagerTest, IncludeCanonicalNameButNotReceived) { proc_->AddRuleForAllFamilies("just.testing", "192.168.1.42", HOST_RESOLVER_CANONNAME); @@ -15057,10 +15078,9 @@ {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, {192, 0, 2, 1}}, {}); - const AddressList kBootstrapAddrs = AddressList::CreateFromIPAddressList( - {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, - {192, 0, 2, 2}}, - {}); + const std::vector<IPEndPoint> kBootstrapAddrs = { + {{0x20, 0x01, 0x0d, 0xb1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2}, 0}, + {{192, 0, 2, 2}, 0}}; // The mock DNS client always returns localhost. const AddressList kRemoteAddrs = AddressList::CreateFromIPAddressList( {IPAddress::IPv6Localhost(), IPAddress::IPv4Localhost()},
diff --git a/net/dns/host_resolver_mdns_listener_impl.cc b/net/dns/host_resolver_mdns_listener_impl.cc index fd9e34e..a3b9e43 100644 --- a/net/dns/host_resolver_mdns_listener_impl.cc +++ b/net/dns/host_resolver_mdns_listener_impl.cc
@@ -80,11 +80,10 @@ break; case DnsQueryType::A: case DnsQueryType::AAAA: - DCHECK(parsed_entry.legacy_addresses()); - DCHECK_EQ(1u, parsed_entry.legacy_addresses().value().size()); - delegate_->OnAddressResult( - ConvertUpdateType(update), query_type_, - parsed_entry.legacy_addresses().value().front()); + DCHECK(parsed_entry.ip_endpoints()); + DCHECK_EQ(1u, parsed_entry.ip_endpoints()->size()); + delegate_->OnAddressResult(ConvertUpdateType(update), query_type_, + parsed_entry.ip_endpoints()->front()); break; case DnsQueryType::TXT: DCHECK(parsed_entry.text_records());
diff --git a/net/dns/host_resolver_mdns_task.cc b/net/dns/host_resolver_mdns_task.cc index 28466b4..79333b9 100644 --- a/net/dns/host_resolver_mdns_task.cc +++ b/net/dns/host_resolver_mdns_task.cc
@@ -219,16 +219,12 @@ return HostCache::Entry(ERR_FAILED, HostCache::Entry::SOURCE_UNKNOWN); case DnsQueryType::A: return HostCache::Entry( - OK, - AddressList( - IPEndPoint(parsed->rdata<net::ARecordRdata>()->address(), 0)), - HostCache::Entry::SOURCE_UNKNOWN); + OK, {IPEndPoint(parsed->rdata<net::ARecordRdata>()->address(), 0)}, + /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); case DnsQueryType::AAAA: return HostCache::Entry( - OK, - AddressList( - IPEndPoint(parsed->rdata<net::AAAARecordRdata>()->address(), 0)), - HostCache::Entry::SOURCE_UNKNOWN); + OK, {IPEndPoint(parsed->rdata<net::AAAARecordRdata>()->address(), 0)}, + /*aliases=*/{}, HostCache::Entry::SOURCE_UNKNOWN); case DnsQueryType::TXT: return HostCache::Entry(OK, parsed->rdata<net::TxtRecordRdata>()->texts(), HostCache::Entry::SOURCE_UNKNOWN);
diff --git a/net/ssl/client_cert_store_mac.cc b/net/ssl/client_cert_store_mac.cc index d9019bc..1aff6ca 100644 --- a/net/ssl/client_cert_store_mac.cc +++ b/net/ssl/client_cert_store_mac.cc
@@ -316,17 +316,15 @@ // See if there's an identity preference for this domain: ScopedCFTypeRef<CFStringRef> domain_str( base::SysUTF8ToCFStringRef("https://" + server_domain)); - SecIdentityRef sec_identity = nullptr; - // While SecIdentityCopyPreferences appears to take a list of CA issuers + // While SecIdentityCopyPreferred appears to take a list of CA issuers // to restrict the identity search to, within Security.framework the - // argument is ignored and filtering unimplemented. See - // SecIdentity.cpp in libsecurity_keychain, specifically + // argument is ignored and filtering unimplemented. See SecIdentity.cpp in + // libsecurity_keychain, specifically // _SecIdentityCopyPreferenceMatchingName(). { base::AutoLock lock(crypto::GetMacSecurityServicesLock()); - if (SecIdentityCopyPreference(domain_str, 0, nullptr, &sec_identity) == - noErr) - preferred_sec_identity.reset(sec_identity); + preferred_sec_identity.reset( + SecIdentityCopyPreferred(domain_str, nullptr, nullptr)); } }
diff --git a/net/test/keychain_test_util_mac.cc b/net/test/keychain_test_util_mac.cc index 4a29700..c43d6461 100644 --- a/net/test/keychain_test_util_mac.cc +++ b/net/test/keychain_test_util_mac.cc
@@ -38,6 +38,12 @@ ScopedTestKeychain::ScopedTestKeychain() = default; ScopedTestKeychain::~ScopedTestKeychain() = default; +// Much of the Keychain API was marked deprecated as of the macOS 13 SDK. +// Removal of its use is tracked in https://crbug.com/1348251 but deprecation +// warnings are disabled in the meanwhile. +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + bool ScopedTestKeychain::Initialize() { if (!keychain_dir_.CreateUniqueTempDir()) return false; @@ -47,6 +53,8 @@ keychain_.InitializeInto()) == noErr; } +#pragma clang diagnostic pop + base::ScopedCFTypeRef<SecIdentityRef> ImportCertAndKeyToKeychain( const X509Certificate* cert, const std::string pkcs8,
diff --git a/net/url_request/http_with_dns_over_https_unittest.cc b/net/url_request/http_with_dns_over_https_unittest.cc index 3cfa06d..3707c5a 100644 --- a/net/url_request/http_with_dns_over_https_unittest.cc +++ b/net/url_request/http_with_dns_over_https_unittest.cc
@@ -74,7 +74,7 @@ AddressList* addrlist, int* os_error) override { insecure_queries_served_++; - *addrlist = AddressList::CreateFromIPAddress(IPAddress(127, 0, 0, 1), 443); + *addrlist = AddressList::CreateFromIPAddress(IPAddress(127, 0, 0, 1), 0); return OK; }
diff --git a/net/url_request/url_request_http_job.cc b/net/url_request/url_request_http_job.cc index 4c9c7a0..5769c95 100644 --- a/net/url_request/url_request_http_job.cc +++ b/net/url_request/url_request_http_job.cc
@@ -588,8 +588,7 @@ // specified. std::string accept_language = http_user_agent_settings_->GetAcceptLanguage(); - if (base::FeatureList::IsEnabled(features::kAcceptLanguageHeader) && - !accept_language.empty()) { + if (!accept_language.empty()) { request_info_.extra_headers.SetHeaderIfMissing( HttpRequestHeaders::kAcceptLanguage, accept_language);
diff --git a/ppapi/proxy/plugin_dispatcher.cc b/ppapi/proxy/plugin_dispatcher.cc index fa74e87..63806d90 100644 --- a/ppapi/proxy/plugin_dispatcher.cc +++ b/ppapi/proxy/plugin_dispatcher.cc
@@ -359,7 +359,7 @@ // the default fonts and such in the middle of a running plugin could be // confusing to it. As a result, we never allow the preferences to be changed // once they're set. The user will have to restart to get new font prefs - // propogated to plugins. + // propagated to plugins. if (!received_preferences_) { received_preferences_ = true; preferences_ = prefs;
diff --git a/services/device/geolocation/public_ip_address_location_notifier_unittest.cc b/services/device/geolocation/public_ip_address_location_notifier_unittest.cc index ddf51d5c..988bc0f7 100644 --- a/services/device/geolocation/public_ip_address_location_notifier_unittest.cc +++ b/services/device/geolocation/public_ip_address_location_notifier_unittest.cc
@@ -282,7 +282,7 @@ ExpectValidPosition(query_3.position(), 2.0f); } -// Tests that server error is propogated to the client. +// Tests that server error is propagated to the client. TEST_F(PublicIpAddressLocationNotifierTest, ServerError) { // Make query. TestPositionQuery query;
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate.cc b/services/network/first_party_sets/first_party_sets_access_delegate.cc index 60ba90f..1d0e307 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate.cc +++ b/services/network/first_party_sets/first_party_sets_access_delegate.cc
@@ -6,7 +6,9 @@ #include <utility> +#include "base/metrics/histogram_functions.h" #include "base/stl_util.h" +#include "base/time/time.h" #include "net/base/schemeful_site.h" #include "net/cookies/first_party_set_metadata.h" @@ -176,6 +178,20 @@ void FirstPartySetsAccessDelegate::InvokePendingQueries() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + UmaHistogramTimes( + "Cookie.FirstPartySets.InitializationDuration." + "ContextReadyToServeQueries2", + construction_timer_.Elapsed()); + + base::UmaHistogramCounts10000( + "Cookie.FirstPartySets.ContextDelayedQueriesCount", + pending_queries_ ? pending_queries_->size() : 0); + + base::UmaHistogramTimes("Cookie.FirstPartySets.ContextMostDelayedQueryDelta", + first_async_query_timer_.has_value() + ? first_async_query_timer_->Elapsed() + : base::TimeDelta()); if (!pending_queries_) return; @@ -193,6 +209,9 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(pending_queries_); + if (!first_async_query_timer_.has_value()) + first_async_query_timer_ = {base::ElapsedTimer()}; + pending_queries_->push_back(std::move(run_query)); }
diff --git a/services/network/first_party_sets/first_party_sets_access_delegate.h b/services/network/first_party_sets/first_party_sets_access_delegate.h index 392c4ccd..922973e 100644 --- a/services/network/first_party_sets/first_party_sets_access_delegate.h +++ b/services/network/first_party_sets/first_party_sets_access_delegate.h
@@ -12,6 +12,7 @@ #include "base/containers/flat_set.h" #include "base/memory/raw_ptr.h" #include "base/sequence_checker.h" +#include "base/timer/elapsed_timer.h" #include "mojo/public/cpp/bindings/pending_receiver.h" #include "mojo/public/cpp/bindings/receiver.h" #include "services/network/first_party_sets/first_party_sets_context_config.h" @@ -144,6 +145,14 @@ mojo::Receiver<mojom::FirstPartySetsAccessDelegate> receiver_ GUARDED_BY_CONTEXT(sequence_checker_){this}; + // Timer starting when the first async query was enqueued, if any. Used for + // metrics. + absl::optional<base::ElapsedTimer> first_async_query_timer_ + GUARDED_BY_CONTEXT(sequence_checker_); + + // Timer starting when the instance is constructed. Used for metrics. + base::ElapsedTimer construction_timer_ GUARDED_BY_CONTEXT(sequence_checker_); + SEQUENCE_CHECKER(sequence_checker_); };
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 8fe4519..289671a1 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -218,8 +218,6 @@ #define SK_LEGACY_INNER_JOINS -#define SK_LEGACY_SET_ROTATE_SNAP - ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index aeab194b..09a2c60 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -1404,38 +1404,6 @@ }, { "args": [ - "--board=eve", - "--flash" - ], - "merge": { - "args": [], - "script": "//testing/merge_scripts/standard_gtest_merge.py" - }, - "name": "lacros_all_tast_tests eve", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "can_use_on_swarming_builders": true, - "dimension_sets": [ - { - "device_type": "eve", - "os": "ChromeOS" - } - ], - "idempotent": false, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "lacros_all_tast_tests", - "test_id_prefix": "ninja://chromeos/lacros:lacros_all_tast_tests/", - "trigger_script": { - "script": "//testing/trigger_scripts/chromeos_device_trigger.py" - }, - "variant_id": "eve" - }, - { - "args": [ "--board=amd64-generic", "--use-vm" ], @@ -5750,21 +5718,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5220.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -5777,7 +5745,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "isolate_profile_data": true, @@ -5915,21 +5883,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -5941,7 +5909,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "args": [ @@ -6061,21 +6029,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -6087,7 +6055,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index a8f21b8..a9ade67 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -99293,21 +99293,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5220.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -99315,7 +99315,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "isolate_profile_data": true, @@ -99428,28 +99428,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "args": [ @@ -99549,28 +99549,28 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "isolate_profile_data": true, @@ -100908,20 +100908,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5220.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -100935,7 +100935,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "merge": { @@ -101073,20 +101073,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -101099,7 +101099,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "args": [ @@ -101219,20 +101219,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -101245,7 +101245,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "merge": { @@ -102741,20 +102741,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5220.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -102768,7 +102768,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "merge": { @@ -102906,20 +102906,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -102932,7 +102932,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "args": [ @@ -103052,20 +103052,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -103078,7 +103078,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "merge": { @@ -103813,20 +103813,20 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5220.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -103839,7 +103839,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" } ] },
diff --git a/testing/buildbot/chromium.mac.json b/testing/buildbot/chromium.mac.json index 0657eea..9777ddf 100644 --- a/testing/buildbot/chromium.mac.json +++ b/testing/buildbot/chromium.mac.json
@@ -11026,6 +11026,112 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "absl_hardening_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "absl_hardening_tests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -11185,6 +11291,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -11238,6 +11397,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "base_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://base:base_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -11291,6 +11556,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "boringssl_crypto_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "boringssl_crypto_tests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -11344,6 +11662,112 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "boringssl_ssl_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "boringssl_ssl_tests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -11503,6 +11927,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -11556,6 +12033,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "components_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://components:components_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -11609,6 +12192,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "crashpad_tests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "crashpad_tests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -11662,6 +12298,112 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "crypto_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "crypto_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://crypto:crypto_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -11821,6 +12563,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -11874,6 +12669,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "gfx_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "gfx_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -11927,6 +12828,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "google_apis_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "google_apis_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://google_apis:google_apis_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -11982,6 +12936,61 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_integration_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_integration_eg2tests_module iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 8 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_integration_eg2tests_module/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12037,6 +13046,61 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_signin_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_signin_eg2tests_module iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 10 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_signin_eg2tests_module/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12092,6 +13156,114 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_chrome_ui_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_ui_eg2tests_module iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test_id_prefix": "ninja://ios/chrome/test/earl_grey2:ios_chrome_ui_eg2tests_module/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -12251,6 +13423,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -12304,6 +13529,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_chrome_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_chrome_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/chrome/test:ios_chrome_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12357,6 +13688,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_components_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_components_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/components:ios_components_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12411,6 +13795,60 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_net_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_net_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test_id_prefix": "ninja://ios/net:ios_net_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12464,6 +13902,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_remoting_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_remoting_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://remoting/ios:ios_remoting_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12517,6 +14008,112 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_testing_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_testing_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/testing:ios_testing_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -12676,6 +14273,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -12729,6 +14379,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_inttests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_inttests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -12783,6 +14539,113 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest", + "--xcode-parallelization" + ], + "isolate_name": "ios_web_shell_eg2tests_module", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_shell_eg2tests_module iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web/shell/test:ios_web_shell_eg2tests_module/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -12942,6 +14805,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -12995,6 +14911,165 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web:ios_web_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -13154,6 +15229,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -13207,6 +15335,165 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_inttests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_inttests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_inttests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -13366,6 +15653,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -13419,6 +15759,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ios_web_view_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ios_web_view_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ios/web_view:ios_web_view_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -13472,6 +15918,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "net_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "net_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://net:net_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -13525,6 +16024,112 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "services_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "services_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://services:services_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -13684,6 +16289,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -13737,6 +16395,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "skia_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "skia_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://skia:skia_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -13790,6 +16554,112 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "sql_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "sql_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://sql:sql_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", + "iPad Air (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPad Air (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPad Air (3rd generation) 16.0" + }, + { + "args": [ + "--platform", "iPad Air 2", "--version", "15.2", @@ -13949,6 +16819,59 @@ { "args": [ "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone 8 16.0" + }, + { + "args": [ + "--platform", "iPhone SE (1st generation)", "--version", "15.2", @@ -14002,6 +16925,112 @@ { "args": [ "--platform", + "iPhone SE (3rd generation)", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPhone SE (3rd generation) 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone SE (3rd generation) 16.0" + }, + { + "args": [ + "--platform", + "iPhone X", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "ui_base_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "ui_base_unittests iPhone X 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://ui/base:ui_base_unittests/", + "variant_id": "iPhone X 16.0" + }, + { + "args": [ + "--platform", "iPhone 6s", "--version", "15.2", @@ -14051,6 +17080,59 @@ }, "test_id_prefix": "ninja://url:url_unittests/", "variant_id": "iPhone 6s 15.2" + }, + { + "args": [ + "--platform", + "iPhone 8", + "--version", + "16.0", + "--out-dir", + "${ISOLATED_OUTDIR}", + "--xcode-build-version", + "14a5284g", + "--xctest" + ], + "isolate_name": "url_unittests", + "isolate_profile_data": true, + "merge": { + "args": [], + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "url_unittests iPhone 8 16.0", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "can_use_on_swarming_builders": true, + "cipd_packages": [ + { + "cipd_package": "infra/tools/mac_toolchain/${platform}", + "location": ".", + "revision": "git_revision:723fc1a6c8cdf2631a57851f5610e598db0c1de1" + } + ], + "dimension_sets": [ + { + "cpu": "x86-64", + "os": "Mac-12" + } + ], + "named_caches": [ + { + "name": "xcode_ios_14a5284g", + "path": "Xcode.app" + }, + { + "name": "runtime_ios_16_0", + "path": "Runtime-ios-16.0" + } + ], + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test_id_prefix": "ninja://url:url_unittests/", + "variant_id": "iPhone 8 16.0" } ] },
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index 40eac77..5f8626a 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -20871,21 +20871,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.filter;../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5220.0", + "name": "interactive_ui_tests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -20898,7 +20898,7 @@ }, "test": "interactive_ui_tests", "test_id_prefix": "ninja://chrome/test:interactive_ui_tests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "isolate_profile_data": true, @@ -21036,21 +21036,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -21062,7 +21062,7 @@ }, "test": "lacros_chrome_browsertests", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "args": [ @@ -21182,21 +21182,21 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome" ], "isolate_profile_data": true, "merge": { "args": [], "script": "//testing/merge_scripts/standard_gtest_merge.py" }, - "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5220.0", + "name": "lacros_chrome_browsertests_run_in_series Lacros version skew testing ash 106.0.5221.0", "swarming": { "can_use_on_swarming_builders": true, "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v106.0.5220.0", - "revision": "version:106.0.5220.0" + "location": "lacros_version_skew_tests_v106.0.5221.0", + "revision": "version:106.0.5221.0" } ], "dimension_sets": [ @@ -21208,7 +21208,7 @@ }, "test": "lacros_chrome_browsertests_run_in_series", "test_id_prefix": "ninja://chrome/test:lacros_chrome_browsertests_run_in_series/", - "variant_id": "Lacros version skew testing ash 106.0.5220.0" + "variant_id": "Lacros version skew testing ash 106.0.5221.0" }, { "isolate_profile_data": true,
diff --git a/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter b/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter index 1a24d19..26c6dd6 100644 --- a/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter +++ b/testing/buildbot/filters/android.emulator_n.chrome_public_test_apk.filter
@@ -21,3 +21,9 @@ # TODO(crbug/1349083) -org.chromium.chrome.browser.sync.SyncErrorCardPreferenceTest.testSyncErrorCardForPassphraseRequiredWithTitleFeatureDisabled__NightModeEnabled + +# TODO(crbug/1349958) +-org.chromium.chrome.browser.autofill_assistant.AutofillAssistantOverlayIntegrationTest.testShowCastOnIFrameElementInScrollIFrame + +# TODO(crbug/1349966) +-org.chromium.chrome.browser.signin.SyncConsentFragmentTest.testFRESyncConsentScreenWhenSelectedAccountIsRemoved
diff --git a/testing/buildbot/filters/android.emulator_n.content_browsertests.filter b/testing/buildbot/filters/android.emulator_n.content_browsertests.filter index ca69f44e..b15a9b7 100644 --- a/testing/buildbot/filters/android.emulator_n.content_browsertests.filter +++ b/testing/buildbot/filters/android.emulator_n.content_browsertests.filter
@@ -9,3 +9,9 @@ # TODO(crbug.com/1347608) -SecurityExploitBrowserTest.PostMessageSourceOrigin + +# TODO(crbug.com/1349961) +-PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginWithPreloadCredentialled/7 + +# TODO(crbug.com/1349978) +-PrefetchBrowserTest/PrefetchBrowserTest.CrossOriginWithPreloadHasNoSameSiteCookies/7
diff --git a/testing/buildbot/filters/fuchsia.browser_tests.filter b/testing/buildbot/filters/fuchsia.browser_tests.filter index 5255e6dd..7b2a2bb 100644 --- a/testing/buildbot/filters/fuchsia.browser_tests.filter +++ b/testing/buildbot/filters/fuchsia.browser_tests.filter
@@ -44,6 +44,7 @@ -LoadingPredictorBrowserTestWithProxy.PrepareForPageLoadWithPrediction -LoadingPredictorBrowserTestWithProxy.PrepareForPageLoadWithoutPrediction -MyIpAddressProxyScriptBrowserTest.Verify +-SCTReportingServiceWithPersistenceBrowserTest.PersistedReportClearedOnClearBrowsingHistory # TODO(crbug.com/1326652): # ../../chrome/browser/safe_browsing/cloud_content_scanning/deep_scanning_test_utils.cc:518: Failure @@ -145,6 +146,7 @@ -CrSettingsPeoplePageTest.All -ProfileCustomizationBubbleBrowserTest.InvokeUi_default -ProfileCustomizationBubbleBrowserTest.IPH +-ProfileCustomizationDialogBrowserTest.IPH -ProfileHelperTest.OpenNewWindowForProfile -ProfileMenuViewExtensionsTest.CloseIPH -ProfileWindowBrowserTest.OpenBrowserWindowForProfileWithSigninRequired @@ -176,6 +178,7 @@ # gaia_id_for_test_example.com, network error -SigninInterceptFirstRunExperienceDialogBrowserTest.AcceptSync -SigninInterceptFirstRunExperienceDialogBrowserTest.AcceptSync_ExtensionTheme +-SigninInterceptFirstRunExperienceDialogBrowserTest.AcceptSync_SkipCustomization -SigninInterceptFirstRunExperienceDialogBrowserTest.AcceptSync_SyncPassphrase -SigninInterceptFirstRunExperienceDialogBrowserTest.DeclineSync -SigninInterceptFirstRunExperienceDialogBrowserTest.ForcedIntercept @@ -198,6 +201,14 @@ # TODO(crbug.com/1306610): crbug.com/1306610: Enable once PDF rendering can be # enabled without PPAPI. +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesCachePageWithEmbeddedPdfMutatedIntoHtml/0 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesCachePageWithEmbeddedPdfMutatedIntoHtml/1 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesNotCachePageWithEmbeddedHtmlMutatedIntoPdf/0 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesNotCachePageWithEmbeddedHtmlMutatedIntoPdf/1 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesNotCachePageWithEmbeddedPdf/0 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesNotCachePageWithEmbeddedPdf/1 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesNotCachePageWithEmbeddedPdfAppendedOnPageLoaded/0 +-All/ChromeBackForwardCacheBrowserWithEmbedTest.DoesNotCachePageWithEmbeddedPdfAppendedOnPageLoaded/1 -All/PrintBackendPrintBrowserTest.UpdatePrintSettings/0 -All/PrintBackendPrintBrowserTest.UpdatePrintSettings/1 -All/PrintBackendPrintBrowserTest.UpdatePrintSettings/2 @@ -205,6 +216,13 @@ -All/PrintBackendPrintBrowserTestService.StartPrinting/1 -All/PrintBackendPrintBrowserTestService.StartPrintingSpoolingSharedMemoryError/0 -All/PrintBackendPrintBrowserTestService.StartPrintingSpoolingSharedMemoryError/1 +-All/SystemAccessProcessPrintBrowserTest.UpdatePrintSettings/0 +-All/SystemAccessProcessPrintBrowserTest.UpdatePrintSettings/1 +-All/SystemAccessProcessPrintBrowserTest.UpdatePrintSettings/2 +-All/SystemAccessProcessServicePrintBrowserTest.StartPrinting/0 +-All/SystemAccessProcessServicePrintBrowserTest.StartPrinting/1 +-All/SystemAccessProcessServicePrintBrowserTest.StartPrintingSpoolingSharedMemoryError/0 +-All/SystemAccessProcessServicePrintBrowserTest.StartPrintingSpoolingSharedMemoryError/1 -BackForwardCachePrintBrowserTest.DisableCaching -ChromeAcceptHeaderTest.Check -ChromeNavigationBrowserTest.CrossSiteRedirectionToPDF @@ -218,6 +236,9 @@ -ExtensionApiTest.TemporaryAddressSpoof -HistoryManipulationInterventionBrowserTest.PDFDoNotSkipOnBackForwardDueToUserGesture -HistoryManipulationInterventionBrowserTest.PDFSkipOnBackForwardNoUserGesture +-PdfPluginContextMenuBrowserTest.CopyText +-PdfPluginContextMenuBrowserTest.CopyTextWithRestriction +-PdfPluginContextMenuBrowserTest.CopyWithoutText -PdfPluginContextMenuBrowserTest.FullPagePdfFullscreenItems -PdfPluginContextMenuBrowserTest.FullPagePdfHasPageItems -PdfPluginContextMenuBrowserTest.IframedPdfHasNoPageItems @@ -252,6 +273,10 @@ -SitePerProcessPrintBrowserTest.SubframeUnavailableBeforePrint -SitePerProcessPrintBrowserTest.SubframeUnavailableDuringPrint -SitePerProcessPrintExtensionBrowserTest.PrintOptionPage +-SystemAccessProcessSandboxedServicePrintBrowserTest.StartPrintingAccessDenied +-SystemAccessProcessSandboxedServicePrintBrowserTest.StartPrintingDocumentDoneAccessDenied +-SystemAccessProcessSandboxedServicePrintBrowserTest.StartPrintingRenderDocumentAccessDenied +-SystemAccessProcessSandboxedServicePrintBrowserTest.StartPrintingRepeatedAccessDenied -WebViewTests/WebViewPdfTest.ContextMenuNavigationInMimeHandlerView/SiteIsolationForGuestsDisabled -WebViewTests/WebViewPdfTest.ContextMenuNavigationInMimeHandlerView/SiteIsolationForGuestsEnabled -WebViewTests/WebViewPdfTest.NestedGuestContainerBounds/SiteIsolationForGuestsDisabled @@ -382,6 +407,7 @@ -CommerceHintAgentTest.VisitCart_GeneralPattern_FromComponent -CommerceHintAgentTest.VisitCart_PerDomain_FromComponent -CommerceHintAgentTest.VisitCheckout +-CommerceHintCacaoTest.Passed -CommerceHintCheckoutPatternTest.VisitCheckout -CommerceHintMaxCountTest.ExtractCart -CommerceHintOptimizeRendererDisabledTest.Rejected @@ -572,6 +598,9 @@ -IntentChipButtonBrowserTest.ShowsIntentChipCollapsed -IntentChipButtonBrowserTest.ShowsIntentPickerWhenMultipleApps -IntentChipButtonIPHBubbleBrowserTest.ShowAndCloseIPH +-IntentChipButtonSkipIntentPickerBrowserTest.ClickingChipOpensApp +-IntentChipButtonSkipIntentPickerBrowserTest.ShowsIntentChipCollapsed +-IntentChipButtonSkipIntentPickerBrowserTest.ShowsIntentPickerWhenMultipleApps # TODO(crbug.com/1326984): These tests pass when run locally -AdsPageLoadMetricsObserverResourceBrowserTest.HeavyAdInterventionFired_ReportsToAllChildren @@ -697,3 +726,10 @@ -InProcess/ChromeNetworkServiceBrowserTest.EncryptedCookies/0 -OutOfProcess/ChromeNetworkServiceBrowserTest.EncryptedCookies/0 -VariationsSafeModeEndToEndBrowserTest.ExtendedSafeModeEndToEnd + +# TODO(crbug.com/1349540): Missing various services, see bug for more info. +-ProfileKeyedServiceBrowserTest.SystemProfileParent_NeededServices + +# TODO(crbug.com/1349546) Pref is missing for PrivacyPage JS test. The exact missing pref is not +# yet identified. +-CrSettingsPrivacyPageTest.PrivacyPageTests \ No newline at end of file
diff --git a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter index 4b46e2f4..b193ab92 100644 --- a/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter +++ b/testing/buildbot/filters/linux-chromeos.browser_tests.require_lacros.filter
@@ -7,6 +7,7 @@ BrowserAppShelfControllerBrowserTest* ChromeVox* DemoAshRequiresLacrosTest* +DesksTemplatesClientLacrosTest* Dictation* SelectToSpeak* SwitchAccess*
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 236fd80..56e6270 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2485,6 +2485,11 @@ }, }, }, + 'lacros_all_tast_tests eve': { + 'remove_from': [ + 'lacros-amd64-generic-rel', + ] + }, 'maps_pixel_passthrough_test': { 'modifications': { 'Android FYI Release (Pixel 4)': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 413f60bd..f133e46 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -6784,12 +6784,14 @@ 'ios_common_tests': { 'variants': [ 'SIM_IPHONE_6S_15_2', + 'SIM_IPHONE_8_16_0', ] }, 'ios_eg2_cq_tests': { 'mixins': ['xcode_parallelization'], 'variants': [ 'SIM_IPHONE_6S_15_2', + 'SIM_IPHONE_8_16_0', ] }, 'ios_screen_size_dependent_tests': { @@ -6798,6 +6800,10 @@ 'SIM_IPHONE_6S_15_2', 'SIM_IPHONE_SE_1ST_GEN_15_2', 'SIM_IPAD_AIR_2_15_2', + 'SIM_IPHONE_8_16_0', + 'SIM_IPHONE_X_16_0', + 'SIM_IPAD_AIR_3RD_GEN_16_0', + 'SIM_IPHONE_SE_3RD_GEN_16_0', ] } },
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index d4d493d5..aa67584 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -22,15 +22,15 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5220.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v106.0.5221.0/test_ash_chrome', ], - 'identifier': 'Lacros version skew testing ash 106.0.5220.0', + 'identifier': 'Lacros version skew testing ash 106.0.5221.0', 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v106.0.5220.0', - 'revision': 'version:106.0.5220.0', + 'location': 'lacros_version_skew_tests_v106.0.5221.0', + 'revision': 'version:106.0.5221.0', }, ], },
diff --git a/testing/gmock/include/gmock/gmock.h b/testing/gmock/include/gmock/gmock.h index f3ba2ef5..150140bf 100644 --- a/testing/gmock/include/gmock/gmock.h +++ b/testing/gmock/include/gmock/gmock.h
@@ -10,6 +10,6 @@ // and testing/gmock, instead of directly including files in // third_party/googletest. -#include "third_party/googletest/src/googlemock/include/gmock/gmock.h" +#include "third_party/googletest/src/googlemock/include/gmock/gmock.h" // IWYU pragma: export -#endif // TESTING_GMOCK_INCLUDE_GMOCK_GMOCK_H_ \ No newline at end of file +#endif // TESTING_GMOCK_INCLUDE_GMOCK_GMOCK_H_
diff --git a/testing/scripts/run_wpt_tests.py b/testing/scripts/run_wpt_tests.py index f1ab0ad..92148ca 100755 --- a/testing/scripts/run_wpt_tests.py +++ b/testing/scripts/run_wpt_tests.py
@@ -47,6 +47,7 @@ # This import adds `devil` to `sys.path`. import devil_chromium from devil import devil_env + from devil.utils.parallelizer import SyncParallelizer from devil.android import apk_helper from devil.android import device_utils from devil.android.device_errors import CommandFailedError @@ -549,8 +550,8 @@ 'No devices attached to this host. ' "Make sure to provide '--avd-config' " 'if using only emulators.') - for device in devices: - self.provision_device(device) + + self.provision_devices(devices) yield @property @@ -642,19 +643,32 @@ # Assume the product is a single APK. return self.get_browser_package_name() - def provision_device(self, device): - """Provision an Android device for a test.""" - if self._options.browser_apk: - self._tasks.enter_context( - _install_apk(device, self._options.browser_apk)) - for apk in self._options.additional_apk: - self._tasks.enter_context(_install_apk(device, apk)) - logger.info('Provisioned device (serial: %s)', device.serial) + def provision_devices(self, devices): + """Provisions a set of Android devices in parallel.""" + contexts = [self._provision_device(device) for device in devices] + self._tasks.enter_context(SyncParallelizer(contexts)) - if device.serial in self.devices: - raise Exception('duplicate device serial: %s' % device.serial) - self.devices[device.serial] = device - self._tasks.callback(self.devices.pop, device.serial, None) + for device in devices: + if device.serial in self.devices: + raise Exception('duplicate device serial: %s' % device.serial) + self.devices[device.serial] = device + self._tasks.callback(self.devices.pop, device.serial, None) + + @contextlib.contextmanager + def _provision_device(self, device): + """Provision a single Android device for a test. + + This method will be executed in parallel on all devices, so + it is crucial that it is thread safe. + """ + with contextlib.ExitStack() as exit_stack: + if self._options.browser_apk: + exit_stack.enter_context( + _install_apk(device, self._options.browser_apk)) + for apk in self._options.additional_apk: + exit_stack.enter_context(_install_apk(device, apk)) + logger.info('Provisioned device (serial: %s)', device.serial) + yield @contextlib.contextmanager @@ -730,9 +744,10 @@ return apk_helper.GetPackageName(self._options.webview_provider) return super().get_version_provider_package_name() - def provision_device(self, device): - self._tasks.enter_context(self._install_webview(device)) - super().provision_device(device) + @contextlib.contextmanager + def _provision_device(self, device): + with self._install_webview(device), super()._provision_device(device): + yield class ChromeAndroid(ChromeAndroidBase): @@ -791,19 +806,21 @@ instances = [] try: if args.avd_config: - avd_config = avd.AvdConfig(args.avd_config) - logger.warning('Installing emulator from %s', args.avd_config) - avd_config.Install() - for _ in range(max(args.processes, 1)): - instance = avd_config.CreateInstance() - instance.Start(writable_system=True, window=args.emulator_window) - instances.append(instance) + avd_config = avd.AvdConfig(args.avd_config) + logger.warning('Installing emulator from %s', args.avd_config) + avd_config.Install() + + for _ in range(max(args.processes, 1)): + instance = avd_config.CreateInstance() + instances.append(instance) + + SyncParallelizer(instances).Start( + writable_system=True, window=args.emulator_window) #TODO(weizhong): when choose device, make sure abi matches with target yield device_utils.DeviceUtils.HealthyDevices() finally: - for instance in instances: - instance.Stop() + SyncParallelizer(instances).Stop() def main():
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 1f1af892..9401342 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -6604,6 +6604,21 @@ ] } ], + "OptimizeLayoutsForPullRefresh": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "OptimizeLayoutsForPullRefresh" + ] + } + ] + } + ], "OptimizeNetworkBuffers2": [ { "platforms": [ @@ -10027,27 +10042,6 @@ ] } ], - "ViewportHeightClientHintHeader": [ - { - "platforms": [ - "windows", - "mac", - "chromeos", - "chromeos_lacros", - "linux", - "android", - "android_webview" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "ViewportHeightClientHintHeader" - ] - } - ] - } - ], "VirtualKeyboardMultitouch": [ { "platforms": [
diff --git a/third_party/abseil-cpp/symbols_arm64_dbg.def b/third_party/abseil-cpp/symbols_arm64_dbg.def index eb2b817..7c77bd3d 100644 --- a/third_party/abseil-cpp/symbols_arm64_dbg.def +++ b/third_party/abseil-cpp/symbols_arm64_dbg.def
@@ -532,31 +532,34 @@ ??$__launder@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEBU201@@Z ??$__launder@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@@Z ??$__lower_bound_impl@U_ClassicAlgPolicy@Cr@std@@PEBUTransition@cctz@time_internal@absl@@PEBU4567@U4567@U__identity@23@UByUnixTime@4567@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@AEAU__identity@01@@Z - ??$__move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@PEAPEAPEBV12345@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z - ??$__move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z - ??$__move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__move@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z - ??$__move_backward@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z - ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z - ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z - ??$__move_impl@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move_impl@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@X@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z - ??$__move_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z - ??$__move_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z - ??$__move_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z - ??$__move_impl@PEAUViableSubstitution@strings_internal@absl@@PEAU123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z - ??$__move_impl@PEAVCordzHandle@cord_internal@absl@@PEAV123@X@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@PEAPEAVCordzHandle@cord_internal@absl@@00@Z - ??$__move_impl@PEBVCordzHandle@cord_internal@absl@@PEBV123@X@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@PEAPEBVCordzHandle@cord_internal@absl@@00@Z - ??$__move_impl@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z - ??$__move_impl@UTransition@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z - ??$__move_impl@UTransitionType@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__move_impl@UViableSubstitution@strings_internal@absl@@U123@X@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@PEAUViableSubstitution@strings_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV45678@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@UTransition@cctz@time_internal@absl@@U4567@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@UTransitionType@cctz@time_internal@absl@@U4567@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV45678@X@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUViableSubstitution@strings_internal@absl@@PEAU456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAVCordzHandle@cord_internal@absl@@PEAV456@X@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@PEAPEAVCordzHandle@cord_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEBVCordzHandle@cord_internal@absl@@PEBV456@X@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@PEAPEBVCordzHandle@cord_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UTransition@cctz@time_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UTransitionType@cctz@time_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UViableSubstitution@strings_internal@absl@@U456@X@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@PEAUViableSubstitution@strings_internal@absl@@00@Z ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
diff --git a/third_party/abseil-cpp/symbols_x64_dbg.def b/third_party/abseil-cpp/symbols_x64_dbg.def index 3619911..0a05d07 100644 --- a/third_party/abseil-cpp/symbols_x64_dbg.def +++ b/third_party/abseil-cpp/symbols_x64_dbg.def
@@ -532,31 +532,34 @@ ??$__launder@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEBU201@@Z ??$__launder@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPEAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PEBVImpl@time_zone@cctz@time_internal@absl@@@01@PEAU201@@Z ??$__lower_bound_impl@U_ClassicAlgPolicy@Cr@std@@PEBUTransition@cctz@time_internal@absl@@PEBU4567@U4567@U__identity@23@UByUnixTime@4567@@Cr@std@@YAPEBUTransition@cctz@time_internal@absl@@PEBU2345@0AEBU2345@AEAUByUnixTime@2345@AEAU__identity@01@@Z - ??$__move@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@PEAPEAPEBV12345@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z - ??$__move@PEAUTransition@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z - ??$__move@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@PEAU1234@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__move@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z - ??$__move_backward@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z - ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z - ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z - ??$__move_impl@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move_impl@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move_impl@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV12345@X@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z - ??$__move_impl@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z - ??$__move_impl@PEAUTransition@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z - ??$__move_impl@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z - ??$__move_impl@PEAUViableSubstitution@strings_internal@absl@@PEAU123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z - ??$__move_impl@PEAVCordzHandle@cord_internal@absl@@PEAV123@X@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@PEAPEAVCordzHandle@cord_internal@absl@@00@Z - ??$__move_impl@PEBVCordzHandle@cord_internal@absl@@PEBV123@X@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@PEAPEBVCordzHandle@cord_internal@absl@@00@Z - ??$__move_impl@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z - ??$__move_impl@UTransition@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z - ??$__move_impl@UTransitionType@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__move_impl@UViableSubstitution@strings_internal@absl@@U123@X@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@PEAUViableSubstitution@strings_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@PEAPEAPEBV45678@@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@PEAU4567@@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@PEAU4567@@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV45678@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV45678@@Cr@std@@YAPEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV23456@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@UTransition@cctz@time_internal@absl@@U4567@@Cr@std@@YAPEAUTransition@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@UTransitionType@cctz@time_internal@absl@@U4567@@Cr@std@@YAPEAUTransitionType@cctz@time_internal@absl@@PEAU2345@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEAVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAPEBVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEBV45678@X@Cr@std@@YA?AU?$pair@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@PEAPEAPEBV12345@@01@PEAPEAPEBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUTransition@cctz@time_internal@absl@@PEAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransition@cctz@time_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUTransitionType@cctz@time_internal@absl@@PEAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUTransitionType@cctz@time_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAUViableSubstitution@strings_internal@absl@@PEAU456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PEAUViableSubstitution@strings_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEAVCordzHandle@cord_internal@absl@@PEAV456@X@Cr@std@@YA?AU?$pair@PEAPEAVCordzHandle@cord_internal@absl@@PEAPEAV123@@01@PEAPEAVCordzHandle@cord_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PEBVCordzHandle@cord_internal@absl@@PEBV456@X@Cr@std@@YA?AU?$pair@PEAPEBVCordzHandle@cord_internal@absl@@PEAPEBV123@@01@PEAPEBVCordzHandle@cord_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PEAU1234@@01@PEAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UTransition@cctz@time_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PEAUTransition@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransition@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UTransitionType@cctz@time_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PEAUTransitionType@cctz@time_internal@absl@@PEAU1234@@01@PEAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UViableSubstitution@strings_internal@absl@@U456@X@Cr@std@@YA?AU?$pair@PEAUViableSubstitution@strings_internal@absl@@PEAU123@@01@PEAUViableSubstitution@strings_internal@absl@@00@Z ??$__push_back_slow_path@AEBQEAVCordzHandle@cord_internal@absl@@@?$vector@PEAVCordzHandle@cord_internal@absl@@V?$allocator@PEAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEAVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@AEBQEBVCordzHandle@cord_internal@absl@@@?$vector@PEBVCordzHandle@cord_internal@absl@@V?$allocator@PEBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBQEBVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@AEBUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AEAAXAEBUTransition@cctz@time_internal@absl@@@Z
diff --git a/third_party/abseil-cpp/symbols_x86_dbg.def b/third_party/abseil-cpp/symbols_x86_dbg.def index 53807a66..aeb52cf7 100644 --- a/third_party/abseil-cpp/symbols_x86_dbg.def +++ b/third_party/abseil-cpp/symbols_x86_dbg.def
@@ -530,31 +530,34 @@ ??$__launder@$$CBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPBU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PBU201@@Z ??$__launder@U?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@YAPAU?$pair@$$CBV?$basic_string@DU?$char_traits@D@Cr@std@@V?$allocator@D@23@@Cr@std@@PBVImpl@time_zone@cctz@time_internal@absl@@@01@PAU201@@Z ??$__lower_bound_impl@U_ClassicAlgPolicy@Cr@std@@PBUTransition@cctz@time_internal@absl@@PBU4567@U4567@U__identity@23@UByUnixTime@4567@@Cr@std@@YAPBUTransition@cctz@time_internal@absl@@PBU2345@0ABU2345@AAUByUnixTime@2345@AAU__identity@01@@Z - ??$__move@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@PAPAPBV12345@@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z - ??$__move@PAUTransition@cctz@time_internal@absl@@PAU1234@PAU1234@@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z - ??$__move@PAUTransitionType@cctz@time_internal@absl@@PAU1234@PAU1234@@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__move@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@00@Z - ??$__move@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@V123@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@00@Z - ??$__move_backward@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z - ??$__move_backward@UTransition@cctz@time_internal@absl@@U1234@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z - ??$__move_backward@UTransitionType@cctz@time_internal@absl@@U1234@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z - ??$__move_impl@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move_impl@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@00@Z - ??$__move_impl@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV12345@X@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z - ??$__move_impl@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z - ??$__move_impl@PAUTransition@cctz@time_internal@absl@@PAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@00@Z - ??$__move_impl@PAUTransitionType@cctz@time_internal@absl@@PAU1234@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@00@Z - ??$__move_impl@PAUViableSubstitution@strings_internal@absl@@PAU123@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@00@Z - ??$__move_impl@PAVCordzHandle@cord_internal@absl@@PAV123@X@Cr@std@@YA?AU?$pair@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@@01@PAPAVCordzHandle@cord_internal@absl@@00@Z - ??$__move_impl@PBVCordzHandle@cord_internal@absl@@PBV123@X@Cr@std@@YA?AU?$pair@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@@01@PAPBVCordzHandle@cord_internal@absl@@00@Z - ??$__move_impl@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@@01@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z - ??$__move_impl@UTransition@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z - ??$__move_impl@UTransitionType@cctz@time_internal@absl@@U1234@X@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z - ??$__move_impl@UViableSubstitution@strings_internal@absl@@U123@X@Cr@std@@YA?AU?$pair@PAUViableSubstitution@strings_internal@absl@@PAU123@@01@PAUViableSubstitution@strings_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@PAPAPBV45678@@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@PAU4567@@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@PAU4567@@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@00@Z + ??$__move@U_ClassicAlgPolicy@Cr@std@@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@23@V423@V423@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV45678@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z + ??$__move_backward@U_ClassicAlgPolicy@Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV45678@@Cr@std@@YAPAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV23456@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@UTransition@cctz@time_internal@absl@@U4567@@Cr@std@@YAPAUTransition@cctz@time_internal@absl@@PAU2345@00@Z + ??$__move_backward_impl@U_ClassicAlgPolicy@Cr@std@@UTransitionType@cctz@time_internal@absl@@U4567@@Cr@std@@YAPAUTransitionType@cctz@time_internal@absl@@PAU2345@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAPAVCordzHandle@cord_internal@absl@@PAPAV456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPAVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAPBVCordzHandle@cord_internal@absl@@PAPBV456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAPBVCordzHandle@cord_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAPBVImpl@time_zone@cctz@time_internal@absl@@PAPBV45678@X@Cr@std@@YA?AU?$pair@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@PAPAPBV12345@@01@PAPAPBVImpl@time_zone@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAUTransition@cctz@time_internal@absl@@PAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransition@cctz@time_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAUTransitionType@cctz@time_internal@absl@@PAU4567@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUTransitionType@cctz@time_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAUViableSubstitution@strings_internal@absl@@PAU456@$0A@@Cr@std@@YA?AU?$pair@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@Cr@std@@V123@@01@V?$reverse_iterator@PAUViableSubstitution@strings_internal@absl@@@01@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PAVCordzHandle@cord_internal@absl@@PAV456@X@Cr@std@@YA?AU?$pair@PAPAVCordzHandle@cord_internal@absl@@PAPAV123@@01@PAPAVCordzHandle@cord_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@PBVCordzHandle@cord_internal@absl@@PBV456@X@Cr@std@@YA?AU?$pair@PAPBVCordzHandle@cord_internal@absl@@PAPBV123@@01@PAPBVCordzHandle@cord_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UConversionItem@ParsedFormatBase@str_format_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@PAU1234@@01@PAUConversionItem@ParsedFormatBase@str_format_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UTransition@cctz@time_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PAUTransition@cctz@time_internal@absl@@PAU1234@@01@PAUTransition@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UTransitionType@cctz@time_internal@absl@@U4567@X@Cr@std@@YA?AU?$pair@PAUTransitionType@cctz@time_internal@absl@@PAU1234@@01@PAUTransitionType@cctz@time_internal@absl@@00@Z + ??$__move_impl@U_ClassicAlgPolicy@Cr@std@@UViableSubstitution@strings_internal@absl@@U456@X@Cr@std@@YA?AU?$pair@PAUViableSubstitution@strings_internal@absl@@PAU123@@01@PAUViableSubstitution@strings_internal@absl@@00@Z ??$__push_back_slow_path@ABQAVCordzHandle@cord_internal@absl@@@?$vector@PAVCordzHandle@cord_internal@absl@@V?$allocator@PAVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXABQAVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@ABQBVCordzHandle@cord_internal@absl@@@?$vector@PBVCordzHandle@cord_internal@absl@@V?$allocator@PBVCordzHandle@cord_internal@absl@@@Cr@std@@@Cr@std@@AAEXABQBVCordzHandle@cord_internal@absl@@@Z ??$__push_back_slow_path@ABUTransition@cctz@time_internal@absl@@@?$vector@UTransition@cctz@time_internal@absl@@V?$allocator@UTransition@cctz@time_internal@absl@@@Cr@std@@@Cr@std@@AAEXABUTransition@cctz@time_internal@absl@@@Z
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn index e1234db..a8515f39 100644 --- a/third_party/android_deps/BUILD.gn +++ b/third_party/android_deps/BUILD.gn
@@ -322,7 +322,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_jetbrains_kotlin_kotlin_stdlib_java") { - jar_path = "libs/org_jetbrains_kotlin_kotlin_stdlib/kotlin-stdlib-1.7.0.jar" + jar_path = "libs/org_jetbrains_kotlin_kotlin_stdlib/kotlin-stdlib-1.7.10.jar" output_name = "org_jetbrains_kotlin_kotlin_stdlib" supports_android = true deps = [ @@ -627,7 +627,7 @@ # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("org_jetbrains_kotlin_kotlin_stdlib_common_java") { - jar_path = "libs/org_jetbrains_kotlin_kotlin_stdlib_common/kotlin-stdlib-common-1.7.0.jar" + jar_path = "libs/org_jetbrains_kotlin_kotlin_stdlib_common/kotlin-stdlib-common-1.7.10.jar" output_name = "org_jetbrains_kotlin_kotlin_stdlib_common" supports_android = true @@ -1201,6 +1201,9 @@ "//third_party/androidx:androidx_viewpager2_viewpager2_java", ] + # Needed until next material update, see crbug.com/1349521. + enable_bytecode_checks = false + # Reduce binary size. https:crbug.com/954584 ignore_proguard_configs = true proguard_configs = [ "material_design.flags" ]
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy index cd4a000..467a69ea 100644 --- a/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy +++ b/third_party/android_deps/buildSrc/src/main/groovy/BuildConfigGenerator.groovy
@@ -689,6 +689,9 @@ case 'com_google_android_material_material': sb.with { append('\n') + append(' # Needed until next material update, see crbug.com/1349521.\n') + append(' enable_bytecode_checks = false\n') + append('\n') append(' # Reduce binary size. https:crbug.com/954584\n') append(' ignore_proguard_configs = true\n') append(' proguard_configs = ["material_design.flags"]\n')
diff --git a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy index 3fc71bf6..9454dec 100644 --- a/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy +++ b/third_party/android_deps/buildSrc/src/main/groovy/ChromiumDepGraph.groovy
@@ -702,14 +702,16 @@ // Use a background thread to avoid slowing down main thread. // Saves about 80 seconds currently. new Thread().start(() -> { - HttpURLConnection http = new URL(url).openConnection(); - http.setRequestMethod("HEAD"); - if (http.getResponseCode() != 200) { - new RuntimeException("Resolved POM but could not resolve $url").printStackTrace(); + HttpURLConnection http = new URL(url).openConnection() + http.requestMethod = 'HEAD' + if (http.responseCode != 200) { + /* groovylint-disable-next-line PrintStackTrace */ + new RuntimeException("Resolved POM but could not resolve $url").printStackTrace() // Exception is logged and ignored if thrown, so explicitly exit. - System.exit(1); - } - http.disconnect(); + /* groovylint-disable-next-line SystemExit */ + System.exit(1) + } + http.disconnect() }); }
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/README.chromium b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/README.chromium index 792da96..e62d0ad 100644 --- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/README.chromium +++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/README.chromium
@@ -1,7 +1,7 @@ Name: Kotlin Stdlib Short Name: kotlin-stdlib URL: https://kotlinlang.org/ -Version: 1.7.0 +Version: 1.7.10 License: Apache Version 2.0 License File: LICENSE CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/cipd.yaml b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/cipd.yaml index 7c6ba8b3..571770e4 100644 --- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/cipd.yaml +++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib/cipd.yaml
@@ -3,8 +3,8 @@ # found in the LICENSE file. # To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@1.7.0.cr1 +# cipd create --pkg-def cipd.yaml -tag version:2@1.7.10.cr1 package: chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib description: "Kotlin Stdlib" data: -- file: kotlin-stdlib-1.7.0.jar +- file: kotlin-stdlib-1.7.10.jar
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/README.chromium b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/README.chromium index 8bda8d4..6b29296c 100644 --- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/README.chromium +++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/README.chromium
@@ -1,7 +1,7 @@ Name: Kotlin Stdlib Common Short Name: kotlin-stdlib-common URL: https://kotlinlang.org/ -Version: 1.7.0 +Version: 1.7.10 License: Apache Version 2.0 License File: LICENSE CPEPrefix: unknown
diff --git a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/cipd.yaml b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/cipd.yaml index 217e0be5..ac21696 100644 --- a/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/cipd.yaml +++ b/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common/cipd.yaml
@@ -3,8 +3,8 @@ # found in the LICENSE file. # To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@1.7.0.cr1 +# cipd create --pkg-def cipd.yaml -tag version:2@1.7.10.cr1 package: chromium/third_party/android_deps/libs/org_jetbrains_kotlin_kotlin_stdlib_common description: "Kotlin Stdlib Common" data: -- file: kotlin-stdlib-common-1.7.0.jar +- file: kotlin-stdlib-common-1.7.10.jar
diff --git a/third_party/android_platform/development/scripts/stack.py b/third_party/android_platform/development/scripts/stack.py index 53664b1a..276bf1ba0 100755 --- a/third_party/android_platform/development/scripts/stack.py +++ b/third_party/android_platform/development/scripts/stack.py
@@ -28,6 +28,7 @@ import subprocess import symbol import sys +import zipfile sys.path.insert(0, os.path.join(os.path.dirname(__file__), os.pardir, os.pardir, os.pardir, os.pardir, @@ -102,6 +103,7 @@ print(" symbolization") sys.exit(1) + def UnzipSymbols(symbolfile, symdir=None): """Unzips a file to DEFAULT_SYMROOT and returns the unzipped location. @@ -123,33 +125,28 @@ os.makedirs(symdir) logging.info('extracting %s...', symbolfile) - saveddir = os.getcwd() - os.chdir(symdir) - try: - unzipcode = subprocess.call(["unzip", "-qq", "-o", symbolfile]) - if unzipcode > 0: - os.remove(symbolfile) - raise SymbolDownloadException("failed to extract symbol files (%s)." - % symbolfile) - finally: - os.chdir(saveddir) + with zipfile.ZipFile(symbolfile, 'r') as zip_ref: + zip_ref.extractall(symdir) - android_symbols = glob.glob("%s/out/target/product/*/symbols" % symdir) - if android_symbols: - return (symdir, android_symbols[0]) - - # This is a zip of Chrome symbols, so symbol.CHROME_SYMBOLS_DIR needs to be - # updated to point here. - symbol.CHROME_SYMBOLS_DIR = symdir - return (symdir, symdir) + return symdir def main(argv, test_symbolizer=None): try: options, arguments = getopt.getopt(argv, "p", [ - "pass-through", "more-info", "less-info", "chrome-symbols-dir=", - "output-directory=", "apks-directory=", "symbols-dir=", "symbols-zip=", - "arch=", "fallback-so-file=", "verbose", "quiet", "help", + "pass-through", + "more-info", + "less-info", + "chrome-symbols-dir=", + "output-directory=", + "apks-directory=", + "symbols-dir=", + "symbols-zip=", + "arch=", + "fallback-so-file=", + "verbose", + "quiet", + "help", ]) except getopt.GetoptError: PrintUsage() @@ -195,6 +192,15 @@ if len(arguments) > 1: PrintUsage() + rootdir = None + if zip_arg: + rootdir = UnzipSymbols(zip_arg) + for subdir, dirs, _ in os.walk(rootdir): + if 'lib.unstripped' in dirs: + unzipped_output_dir = subdir + break + constants.SetOutputDirectory(unzipped_output_dir) + logging.basicConfig(level=log_level) # Do an up-front test that the output directory is known. if not symbol.CHROME_SYMBOLS_DIR: @@ -203,12 +209,8 @@ logging.info('Reading Android symbols from: %s', os.path.normpath(symbol.SYMBOLS_DIR)) chrome_search_path = symbol.GetLibrarySearchPaths() - logging.info('Searching for Chrome symbols from within: %s', - ':'.join((os.path.normpath(d) for d in chrome_search_path))) - - rootdir = None - if zip_arg: - rootdir, symbol.SYMBOLS_DIR = UnzipSymbols(zip_arg) + logging.info('Searching for Chrome symbols from within: %s', ':'.join( + (os.path.normpath(d) for d in chrome_search_path))) if not arguments or arguments[0] == '-': logging.info('Reading native crash info from stdin (symbolization starts ' @@ -235,11 +237,11 @@ load_vaddrs = {} with llvm_symbolizer.LLVMSymbolizer() as symbolizer: - logging.info('Searching for Chrome symbols from within: %s', - ':'.join((os.path.normpath(d) for d in chrome_search_path))) - stack_core.ConvertTrace(lines, load_vaddrs, more_info, - fallback_so_file, arch_defined, - test_symbolizer or symbolizer, apks_directory) + logging.info('Searching for Chrome symbols from within: %s', ':'.join( + (os.path.normpath(d) for d in chrome_search_path))) + stack_core.ConvertTrace(lines, load_vaddrs, more_info, fallback_so_file, + arch_defined, test_symbolizer or symbolizer, + apks_directory) if rootdir: # be a good citizen and clean up...os.rmdir and os.removedirs() don't work @@ -249,6 +251,7 @@ return 0 + if __name__ == "__main__": sys.exit(main(sys.argv[1:]))
diff --git a/third_party/androidx/fetch_all_androidx.py b/third_party/androidx/fetch_all_androidx.py index 09145619..04ba3d01 100755 --- a/third_party/androidx/fetch_all_androidx.py +++ b/third_party/androidx/fetch_all_androidx.py
@@ -50,6 +50,17 @@ #('androidx_core_core/core-1.9.0-SNAPSHOT.aar', # 'https://androidx.dev/snapshots/builds/8545498/artifacts/repository/' # 'androidx/core/core/1.8.0-SNAPSHOT/core-1.8.0-20220505.122105-1.aar'), + + # Context: https://crbug.com/1349920 and https://crbug.com/1349521 + ('androidx_appcompat_appcompat/appcompat-1.6.0-SNAPSHOT.aar', + 'https://androidx.dev/snapshots/builds/8811104/artifacts/repository/' + 'androidx/appcompat/appcompat/1.5.0-SNAPSHOT/' + 'appcompat-1.5.0-20220708.124951-1.aar'), + ('androidx_appcompat_appcompat_resources/' + 'appcompat-resources-1.6.0-SNAPSHOT.aar', + 'https://androidx.dev/snapshots/builds/8811104/artifacts/repository/' + 'androidx/appcompat/appcompat-resources/1.5.0-SNAPSHOT/' + 'appcompat-resources-1.5.0-20220708.124951-1.aar'), ]
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index cd8bacb8..b97aa05 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -210,7 +210,7 @@ // Controls whether the Viewport Height client hint can be added to request // headers. const base::Feature kViewportHeightClientHintHeader{ - "ViewportHeightClientHintHeader", base::FEATURE_DISABLED_BY_DEFAULT}; + "ViewportHeightClientHintHeader", base::FEATURE_ENABLED_BY_DEFAULT}; // Used to control the collection of anchor element metrics (crbug.com/856683). // If kNavigationPredictor is enabled, then metrics of anchor elements
diff --git a/third_party/blink/public/common/storage_key/proto/storage_key.proto b/third_party/blink/public/common/storage_key/proto/storage_key.proto index cfb0a00..549de60 100644 --- a/third_party/blink/public/common/storage_key/proto/storage_key.proto +++ b/third_party/blink/public/common/storage_key/proto/storage_key.proto
@@ -37,10 +37,24 @@ // this will simply signify that one should be created. enum UnguessableToken { CREATE = 0; } + message AncestorChainBit { + // The AncestorChainBit can either be same-site or cross-site. + enum BitType { + SAME_SITE = 0; + CROSS_SITE = 1; + } + + optional BitType bit = 1 [default = SAME_SITE]; + } + required Origin origin = 1; oneof OneOf { TopLevelSite top_level_site = 2; UnguessableToken unguessable_token = 3; } + + // The AncestorChainBit was added after the StorageKey proto was in use, so + // for backwards compatibility, it must be optional. + optional AncestorChainBit ancestor_chain_bit = 4; } \ No newline at end of file
diff --git a/third_party/blink/public/common/storage_key/storage_key_proto_converter.cc b/third_party/blink/public/common/storage_key/storage_key_proto_converter.cc index ceaaf569..b7d60cd1 100644 --- a/third_party/blink/public/common/storage_key/storage_key_proto_converter.cc +++ b/third_party/blink/public/common/storage_key/storage_key_proto_converter.cc
@@ -45,6 +45,22 @@ origin_proto.port()); } +blink::mojom::AncestorChainBit MakeAncestorChainBit( + const storage_key_proto::StorageKey::AncestorChainBit& bit_proto) { + using BitType = storage_key_proto::StorageKey::AncestorChainBit::BitType; + + blink::mojom::AncestorChainBit final_bit; + switch (bit_proto.bit()) { + case BitType::StorageKey_AncestorChainBit_BitType_SAME_SITE: + final_bit = blink::mojom::AncestorChainBit::kSameSite; + break; + case BitType::StorageKey_AncestorChainBit_BitType_CROSS_SITE: + final_bit = blink::mojom::AncestorChainBit::kCrossSite; + break; + } + return final_bit; +} + blink::StorageKey Convert(const storage_key_proto::StorageKey& storage_key) { url::Origin origin = MakeOrigin(storage_key.origin()); @@ -62,13 +78,11 @@ StorageKey::TopLevelSite top_level_site_proto = storage_key.top_level_site(); url::Origin top_level_site = MakeOrigin(top_level_site_proto.origin()); - - switch (top_level_site_proto.url_type()) { - case UrlType::StorageKey_TopLevelSite_UrlType_ORIGIN: - return blink::StorageKey(origin, top_level_site); - case UrlType::StorageKey_TopLevelSite_UrlType_SCHEMEFUL_SITE: - return blink::StorageKey(origin, net::SchemefulSite(top_level_site)); - } + blink::mojom::AncestorChainBit ancestor_chain_bit = + MakeAncestorChainBit(storage_key.ancestor_chain_bit()); + return blink::StorageKey::CreateWithOptionalNonce( + origin, net::SchemefulSite(top_level_site), nullptr, + ancestor_chain_bit); } return blink::StorageKey();
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index d80c670..050ae2c 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -1008,6 +1008,7 @@ "frame/media_player_action.mojom", "frame/pending_beacon.mojom", "frame/policy_container.mojom", + "frame/remote_frame.mojom", "frame/reporting_observer.mojom", "frame/sudden_termination_disabler_type.mojom", "frame/text_autosizer_page_info.mojom",
diff --git a/third_party/blink/public/mojom/conversions/attribution_data_host.mojom b/third_party/blink/public/mojom/conversions/attribution_data_host.mojom index c68b889..7e9e9898 100644 --- a/third_party/blink/public/mojom/conversions/attribution_data_host.mojom +++ b/third_party/blink/public/mojom/conversions/attribution_data_host.mojom
@@ -40,7 +40,7 @@ url.mojom.Origin reporting_origin; // Data that will be sent in attribution reports to identify this source. - uint64 source_event_id; + uint64 source_event_id = 0; // Specifies how long this source is eligible for attribution mojo_base.mojom.TimeDelta? expiry;
diff --git a/third_party/blink/public/mojom/frame/frame.mojom b/third_party/blink/public/mojom/frame/frame.mojom index 45e43e6c..857b487 100644 --- a/third_party/blink/public/mojom/frame/frame.mojom +++ b/third_party/blink/public/mojom/frame/frame.mojom
@@ -5,34 +5,26 @@ module blink.mojom; import "cc/mojom/browser_controls_state.mojom"; -import "cc/mojom/render_frame_metadata.mojom"; -import "cc/mojom/touch_action.mojom"; import "mojo/public/mojom/base/string16.mojom"; -import "mojo/public/mojom/base/unguessable_token.mojom"; import "mojo/public/mojom/base/text_direction.mojom"; import "mojo/public/mojom/base/time.mojom"; +import "mojo/public/mojom/base/unguessable_token.mojom"; import "mojo/public/mojom/base/values.mojom"; import "services/data_decoder/public/mojom/resource_snapshot_for_web_bundle.mojom"; import "services/network/public/mojom/content_security_policy.mojom"; import "services/network/public/mojom/cross_origin_opener_policy.mojom"; import "services/network/public/mojom/fetch_api.mojom"; import "services/network/public/mojom/source_location.mojom"; -import "services/network/public/mojom/url_request.mojom"; -import "services/network/public/mojom/web_sandbox_flags.mojom"; -import "services/viz/public/mojom/compositing/frame_sink_id.mojom"; import "skia/public/mojom/skcolor.mojom"; import "third_party/blink/public/mojom/blob/blob.mojom"; import "third_party/blink/public/mojom/blob/blob_url_store.mojom"; -import "third_party/blink/public/mojom/messaging/transferable_message.mojom"; -import "third_party/blink/public/mojom/close_watcher/close_listener.mojom"; import "third_party/blink/public/mojom/choosers/popup_menu.mojom"; +import "third_party/blink/public/mojom/close_watcher/close_listener.mojom"; import "third_party/blink/public/mojom/context_menu/context_menu.mojom"; -import "third_party/blink/public/mojom/conversions/conversions.mojom"; import "third_party/blink/public/mojom/css/preferred_color_scheme.mojom"; import "third_party/blink/public/mojom/devtools/console_message.mojom"; import "third_party/blink/public/mojom/devtools/devtools_agent.mojom"; import "third_party/blink/public/mojom/devtools/inspector_issue.mojom"; -import "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom"; import "third_party/blink/public/mojom/favicon/favicon_url.mojom"; import "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom"; import "third_party/blink/public/mojom/fetch/fetch_api_request.mojom"; @@ -40,28 +32,22 @@ import "third_party/blink/public/mojom/frame/frame_owner_properties.mojom"; import "third_party/blink/public/mojom/frame/frame_policy.mojom"; import "third_party/blink/public/mojom/frame/frame_replication_state.mojom"; -import "third_party/blink/public/mojom/frame/frame_visual_properties.mojom"; import "third_party/blink/public/mojom/frame/fullscreen.mojom"; -import "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom"; import "third_party/blink/public/mojom/frame/lifecycle.mojom"; import "third_party/blink/public/mojom/frame/media_player_action.mojom"; -import "third_party/blink/public/mojom/frame/policy_container.mojom"; +import "third_party/blink/public/mojom/frame/remote_frame.mojom"; import "third_party/blink/public/mojom/frame/reporting_observer.mojom"; import "third_party/blink/public/mojom/frame/sudden_termination_disabler_type.mojom"; import "third_party/blink/public/mojom/frame/text_autosizer_page_info.mojom"; -import "third_party/blink/public/mojom/frame/tree_scope_type.mojom"; -import "third_party/blink/public/mojom/frame/triggering_event_info.mojom"; import "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom"; import "third_party/blink/public/mojom/frame/user_activation_update_types.mojom"; -import "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom"; import "third_party/blink/public/mojom/input/focus_type.mojom"; import "third_party/blink/public/mojom/input/scroll_direction.mojom"; -import "third_party/blink/public/mojom/messaging/delegated_capability.mojom"; -import "third_party/blink/public/mojom/navigation/navigation_api_history_entry_arrays.mojom"; -import "third_party/blink/public/mojom/navigation/navigation_policy.mojom"; import "third_party/blink/public/mojom/loader/referrer.mojom"; +import "third_party/blink/public/mojom/messaging/delegated_capability.mojom"; +import "third_party/blink/public/mojom/messaging/transferable_message.mojom"; +import "third_party/blink/public/mojom/navigation/navigation_api_history_entry_arrays.mojom"; import "third_party/blink/public/mojom/opengraph/metadata.mojom"; -import "third_party/blink/public/mojom/widget/platform_widget.mojom"; import "third_party/blink/public/mojom/page/widget.mojom"; import "third_party/blink/public/mojom/portal/portal.mojom"; import "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom"; @@ -69,6 +55,7 @@ import "third_party/blink/public/mojom/timing/resource_timing.mojom"; import "third_party/blink/public/mojom/tokens/tokens.mojom"; import "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom"; +import "third_party/blink/public/mojom/widget/platform_widget.mojom"; import "ui/base/mojom/window_open_disposition.mojom"; import "ui/events/mojom/scroll_granularity.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom"; @@ -77,9 +64,6 @@ import "url/mojom/url.mojom"; [EnableIf=is_mac] -import "ui/gfx/range/mojom/range.mojom"; - -[EnableIf=is_mac] import "ui/base/mojom/attributed_string.mojom"; // Information about a subframe being saved as "complete html". @@ -156,78 +140,6 @@ // to accept in the browser process. const uint16 kMaxTitleChars = 4096; // 4 * 1024; -// Struct for communication channels of the RemoteMainFrame in blink. -struct RemoteMainFrameInterfaces { - pending_associated_remote<blink.mojom.RemoteMainFrameHost> main_frame_host; - pending_associated_receiver<blink.mojom.RemoteMainFrame> main_frame; -}; - -// Struct for passing RemoteFrame interfaces from renderer. -struct RemoteFrameInterfacesFromRenderer { - pending_associated_remote<blink.mojom.RemoteFrame> frame; - pending_associated_receiver<blink.mojom.RemoteFrameHost> frame_host_receiver; -}; - -// Struct for passing RemoteFrame interfaces from browser. -struct RemoteFrameInterfacesFromBrowser { - pending_associated_receiver<blink.mojom.RemoteFrame> frame_receiver; - pending_associated_remote<blink.mojom.RemoteFrameHost> frame_host; -}; - -// This struct holds parameters included in the OpenURL method sent by the -// renderer to the browser, |is_history_navigation_in_new_child_frame| is true -// in the case that the browser process should look for an existing history item -// for the frame. -struct OpenURLParams { - // The main URL to open. - url.mojom.Url url; - url.mojom.Origin initiator_origin; - - // The token of the RenderFrameHost that initiated the navigation. It might - // refer to a RenderFrameHost that doesn't exist anymore when the IPC reaches - // the browser process. - blink.mojom.LocalFrameToken? initiator_frame_token; - - network.mojom.URLRequestBody? post_body; - string extra_headers; - blink.mojom.Referrer referrer; - bool is_form_submission; - - // The window position to open the URL. - ui.mojom.WindowOpenDisposition disposition; - bool should_replace_current_entry; - bool user_gesture; - - // Whether this should be interpreted as a navigation to _unfencedTop, - // i.e. to the outermost frame from a fenced frame in a renderer process that - // doesn't get a handle to that frame. - // The disposition should always be CURRENT_TAB when this flag is set; - // the browser will target the outermost frame instead of the current frame. - // TODO(crbug.com/1315802): Refactor _unfencedTop handling. - bool is_unfenced_top_navigation = false; - - // Extra information about the triggering of the OpenURL. - blink.mojom.TriggeringEventInfo triggering_event_info; - pending_remote<blink.mojom.BlobURLToken>? blob_url_token; - string href_translate; - Impression? impression; - NavigationDownloadPolicy download_policy; - - // Information about the Javascript source for this navigation. Used for - // providing information in console error messages triggered by the - // navigation. If the navigation is not caused by Javascript, the - // SourceLocation's URL is empty. - network.mojom.SourceLocation source_location; - - // Passing the |initiator_policy_container_keep_alive_handle| is just a mean - // to ensure that the PolicyContainerHost of the initiator RenderFrameHost is - // kept alive, even if the RenderFrameHost itself has already been deleted in - // the meantime. If this can be ensured in other ways, it is safe to pass a - // mojo::NullRemote here. - pending_remote<blink.mojom.PolicyContainerHostKeepAliveHandle>? - initiator_policy_container_keep_alive_handle; -}; - // This struct holds iframe's HTML attributes that are needed in the browser. // id, name and src are used to report back/forward cache NotRestoredReasons. // If 'id', 'name' or 'src' are too long, it is cut down to a certain character @@ -983,303 +895,6 @@ mojo_base.mojom.TimeTicks before_unload_end_time); }; -// Implemented in Browser, this interface defines frame-specific methods that -// will be invoked from the render process (e.g. blink::RemoteFrame). -// -// Note that this is different than content/common/frame.mojom in that the -// methods defined here are called directly in Blink without passing through -// content. In the future this interface will likely host more methods as the -// Onion Soup project advances, which can potentially lead to the removal of -// content/common/frame.mojom if enough code is moved to Blink. -interface RemoteFrameHost { - // Notifies that an effective touch action has been calculated from an - // ancestor of the associated RemoteFrame and should be propogated to - // the associated LocalFrame in the other render process. - SetInheritedEffectiveTouchAction(cc.mojom.TouchAction touch_action); - - // Toggles render throttling on a remote frame. |is_throttled| indicates - // whether the current frame should be throttled based on its viewport - // visibility; |subtree_throttled| indicates that an ancestor frame has - // been throttled, so all descendant frames also should be throttled; and - // |display_locked| indicates that an iframe is display locked by an ancestor - // of its <iframe> element in the parent process. - UpdateRenderThrottlingStatus( - bool is_throttled, bool subtree_throttled, bool display_locked); - - // Notifies the browser that the associated frame has changed its visibility - // status. Visibility status changes occur when the frame moves in/out - // of the viewport, or the need for a layout object changes, e.g. if the - // frame owner assigns a display: none style. - VisibilityChanged(blink.mojom.FrameVisibility visibility); - - // Sent by the renderer when the frame becomes focused. - DidFocusFrame(); - - // Use to notify a parent remote frame that a local child frame has finished - // loading. This will be forwarded to the renderer hosting the parent's local - // frame to see if the parent can be marked as completed loading. - CheckCompleted(); - - // Sent by the renderer to request a paint preview of a subframe. |clip_rect| - // is the size of the frame in it's parent. |guid| is an an identifier for - // all the capture work (regardless of the process captures are happening in) - // that allows the results to be grouped together, even if there are multiple - // requests in-flight. - CapturePaintPreviewOfCrossProcessSubframe( - gfx.mojom.Rect clip_rect, mojo_base.mojom.UnguessableToken guid); - - // Sent by a parent frame to notify its child that the renderer has determined - // the DOM subtree it represents is inert and should no longer process input - // events. - // - // https://html.spec.whatwg.org/multipage/interaction.html#inert - SetIsInert(bool inert); - - // Sent when a renderer remote frame either updates its opener to another - // frame identified by |opener_frame|, or, if |opener_frame| is "empty", - // the frame disowns its opener for the lifetime of the window. - DidChangeOpener(blink.mojom.LocalFrameToken? opener_frame); - - // This message is sent from a RemoteFrame when sequential focus navigation - // needs to advance into its actual frame. |source_frame_token| identifies the - // frame that issued this request. This is used when pressing <tab> or - // <shift-tab> hits an out-of-process iframe when searching for the next - // focusable element. - AdvanceFocus(blink.mojom.FocusType focus_type, - blink.mojom.LocalFrameToken source_frame_token); - - // Sent to the browser to post a message to the frame's active renderer, which - // will receive the re-routed message from the browser process via the method - // PostMessageEvent(), from the blink.mojom.LocalFrame interface. - // |source_frame_token| is the frame token of the LocalFrame in the renderer - // process originating the request, which will be translated by the browser - // process to the frame token of the equivalent RemoteFrame in the target - // renderer process. - // |source_origin| is the origin of the source frame when the message was - // sent, |target_origin| specifies what the origin of the target frame must be - // for the message to be dispatched and |message| is the encoded data, plus - // any extra properties such as transferred ports or blobs. - RouteMessageEvent(blink.mojom.LocalFrameToken? source_frame_token, - mojo_base.mojom.String16 source_origin, - mojo_base.mojom.String16 target_origin, - blink.mojom.TransferableMessage message); - - // Ask the frame host to print a cross-process subframe. - // The printed content of this subframe belongs to the document specified by - // its document cookie. Document cookie is a unique id for a printed document - // associated with a print job. - // The content will be rendered in the specified rectangular area in its - // parent frame. - PrintCrossProcessSubframe( - gfx.mojom.Rect frame_content_rect, int32 document_cookie); - - // Notifies the browser that a child frame is detached from the DOM. - Detach(); - - // Sent by a parent frame to notify its child about the state of the child's - // intersection with the parent's viewport, primarily for use by the - // IntersectionObserver API. - UpdateViewportIntersection( - ViewportIntersectionState intersection_state, - FrameVisualProperties? visual_properties); - - // Tells the browser that a child's visual properties have changed. - SynchronizeVisualProperties( - FrameVisualProperties properties); - - // Requests that the given URL be opened in the specified manner. - OpenURL(blink.mojom.OpenURLParams params); -}; - -// Implemented in Blink, this interface defines frame-specific methods that will -// be invoked from the browser process (e.g. content::RenderFrameProxyHost). -// -// Note that this is different than content/common/frame.mojom in that the -// methods defined here are handled directly in Blink without passing through -// content. In the future this interface will likely host more methods as the -// Onion Soup project advances, which can potentially lead to the removal of -// content/common/frame.mojom if enough code is moved to Blink. -interface RemoteFrame { - // Sent to a frame proxy when its real frame is preparing to enter fullscreen - // in another process. Actually entering fullscreen will be done separately - // as part of ViewMsg_Resize, once the browser process has resized the tab for - // fullscreen. - WillEnterFullscreen(FullscreenOptions options); - - // Update replicated set for enforcement of insecure navigations. |set| - // is a hashed set of host/port pairs. See - // SecurityContext::SetInsecureNavigationsSet. - EnforceInsecureNavigationsSet(array<uint32> set); - - // Updates this frame's FrameOwner properties, such as scrolling, margin, - // or allowfullscreen. This is used when this frame's parent is in - // another process and it dynamically updates these properties. - // TODO(dcheng): Currently, the update only takes effect on next frame - // navigation. This matches the in-process frame behavior. - SetFrameOwnerProperties(FrameOwnerProperties properties); - - // Updates the remote frame's replicated enforcement of insecure request - // policy. Used when the frame's policy is changed in another renderer - // process. Argument |policy| is a bitfield for InsecureRequestPolicy. - EnforceInsecureRequestPolicy(blink.mojom.InsecureRequestPolicy policy); - - // Update the replicated origin. Used when the frame is navigated to a - // new origin. - SetReplicatedOrigin(url.mojom.Origin origin, - bool is_potentially_trustworthy_unique_origin); - - // Update the replicated ad status. Used when the frame is tagged or untagged - // as an ad frame by Ad Tagging. - SetReplicatedIsAdFrame(bool is_ad_frame); - - // Sets the replicated name and unique name for the frame. Used when the - // name of a frame changes. - SetReplicatedName(string name, string unique_name); - - // Sent to dispatch a load event in the frame's owner element. - // (eg. the iframe, portal, or object element). - DispatchLoadEventForFrameOwner(); - - // Sent to the remote frame placeholder in the parent process to indicate the - // associated frame in the child process requires information about - // whether it is occluded or has visual effects applied. - SetNeedsOcclusionTracking(bool needs_tracking); - - // Sent to the process that owns this frame's HTMLFrameOwnerElement to - // control whether the element is collapsed or not. If the element is - // collapsed, it will be removed from the layout tree of its parent - // frame's document. - Collapse(bool collapsed); - - // Notifies this remote frame that it is now focused. This is used to - // support cross-process focused frame changes. - Focus(); - - // Notifies this remote frame to mark that the previous document on that - // frame had received a user gesture on the same eTLD+1. - SetHadStickyUserActivationBeforeNavigation(bool has_gesture); - - // Sent to the remote frame placeholder in the parent process to continue - // bubbling a logical scroll from a cross-process frame. - BubbleLogicalScroll(ScrollDirection direction, - ui.mojom.ScrollGranularity granularity); - - // Sent to the remote frame placeholder in the parent process to update the - // user activation state in appropriate part of the frame tree (ancestors for - // activation notification and all nodes for consumption). - // - // The |notification_type| parameter is used for histograms, only for the case - // |update_state == kNotifyActivation|. - UpdateUserActivationState(blink.mojom.UserActivationUpdateType state_update_type, - UserActivationNotificationType notification_type); - - // Sent to the process that owns this frame's HTMLFrameOwnerElement to - // set the embedding token. This token uniquely specifies the relationship - // between a frame and its parent. - SetEmbeddingToken(mojo_base.mojom.UnguessableToken embedding_token); - - // Sets page-level focus and notifies FocusController. - SetPageFocus(bool is_focused); - - // Sent to this frame in parent frame's process to render fallback contents. - // This is only used for <object> elements that failed a navigation (HTTP or - // network error). - RenderFallbackContent(); - - // Sent to this frame in parent frame's process to render fallback contents. - // This is only used for <object> elements that failed a navigation with an - // HTTP error. - RenderFallbackContentWithResourceTiming( - ResourceTimingInfo timing, - string server_timing_value); - - // Sent to the remote frame placeholder in the parent process so that - // resource timing information can be added to the parent frame. - AddResourceTimingFromChild(ResourceTimingInfo timing); - - // Sent to the remote frame placeholder in the parent process to request - // scrolling. - ScrollRectToVisible(gfx.mojom.RectF rect, ScrollIntoViewParams params); - - // Notifies this remote frame that its corresponding document has started - // loading. - DidStartLoading(); - - // Notifies this remote frame that its corresponding document has completed - // loading. - DidStopLoading(); - - // Sent to the remote frame placeholder in the parent process indicating the - // intrinsic sizing parameters of the content frame have changed. Generated - // when the browser receives a IntrinsicSizingInfoChanged message of - // FrameWidgetHost interface. - IntrinsicSizingInfoOfChildChanged(IntrinsicSizingInfo sizing_info); - - // Used to replicate the updated sandbox flags and permissions policy headers to - // all corresponding remote frames of a local frame when a navigation commits. - DidSetFramePolicyHeaders(network.mojom.WebSandboxFlags sandbox_flags, - array<blink.mojom.ParsedPermissionsPolicyDeclaration> parsed_permissions_policy); - - // Notifies the frame that its parent has changed the frame's sandbox flags or - // container policy. - DidUpdateFramePolicy(blink.mojom.FramePolicy frame_policy); - - // Requests that the blink::RemoteFrame updates its opener to the specified - // frame. The frame token may be "empty" if the opener was disowned. - UpdateOpener(blink.mojom.FrameToken? opener_frame_token); - - // Requests the corresponding RemoteFrame to be deleted and removed from - // the frame tree. This should not be called on the main frame as that frame - // is owned by the associated WebView. - DetachAndDispose(); - - // Enables autoresize mode as requested by the parent frame's renderer - // process. - EnableAutoResize(gfx.mojom.Size min_size, gfx.mojom.Size max_size); - - // Disables autoresize mode as requested by the parent frame's renderer - // process. - DisableAutoResize(); - - // Informs the completion of an autoresize transaction from the parent - // renderer and updates with the provided viz::LocalSurfaceId. - DidUpdateVisualProperties(cc.mojom.RenderFrameMetadata metadata); - - // Notifies this remote frame that its associated compositing - // destination (RenderWidgetHostView) has changed. - SetFrameSinkId(viz.mojom.FrameSinkId frame_sink_id); - - // Notifies the remote frame that the process rendering the child frame's - // contents has terminated. - ChildProcessGone(); - - // Tells the RemoteFrame to create a new RemoteFrame child. See - // blink.mojom.PageBroadcast.CreateRemoteMainFrame for creation - // of main frames. - // - // `token`: The frame token. Used to map between RemoteFrame and - // RenderFrameProxyHost. - // `opener_frame_token`: Frame token that identifies the opener frame if one - // exists, or absl::nullopt otherwise. - // `tree_scope_type`: Whether the owner element (e.g. <iframe>, <object>, et - // cetera) for this frame is in the document tree or the shadow tree. - // `devtools_frame_token`: Used for devtools instrumentation and - // trace-ability. The token is shared across all frames (local or remotes) - // representing the same logical frame tree node, and is used by Blink and - // content to tag calls and requests for instrumentation purposes, - // allowing them to be attributed to a context frame. - // - // Must not be used to look up a RenderFrameHostImpl or - // RenderFrameProxyHost in the browser process, as the token is shared, - // making the mapping ambiguous and non-authoritative. - CreateRemoteChild(blink.mojom.RemoteFrameToken token, - blink.mojom.FrameToken? opener_frame_token, - blink.mojom.TreeScopeType tree_scope_type, - blink.mojom.FrameReplicationState replication_state, - mojo_base.mojom.UnguessableToken devtools_frame_token, - RemoteFrameInterfacesFromBrowser remote_frame_interfaces); -}; - // Implemented in Blink, this interface defines main-frame-specific methods that // will be invoked from the browser process (e.g. content::WebContentsImpl). // @@ -1347,20 +962,6 @@ bool animate); }; -// Implemented in Blink, this interface defines remote main-frame-specific -// methods that will be invoked from the browser process (e.g. -// content::RenderFrameProxyHost). -// -// There is only ever one remote main frame for a given tab in all renderer -// processes. -// -// This interface will only be provided when the RemoteFrame is a main frame. -interface RemoteMainFrame { - // Makes the TextAutosizerPageInfo received from a local main frame available - // to remote main frame renderers. - UpdateTextAutosizerPageInfo(blink.mojom.TextAutosizerPageInfo page_info); -}; - // Implemented in Browser, this interface defines local-main-frame-specific // methods that will be invoked from the renderer process (e.g. WebViewImpl). interface LocalMainFrameHost { @@ -1415,25 +1016,3 @@ // pending navigation's URL, because a URL spoof is possible. DidAccessInitialMainDocument(); }; - -// Implemented in Browser, this interface defines remote-main-frame-specific -// methods that will be invoked from the renderer process (e.g. WebViewImpl). -interface RemoteMainFrameHost { - // Asks the browser process to activate the page associated to the main frame. - FocusPage(); - - // Asks the browser to transfer focus cross-process on behalf of the renderer - // in the focus hierarchy. This may focus an element in the browser ui or a - // cross-process frame, as appropriate. - TakeFocus(bool reverse); - - // Notifies the browser that we want to show a destination url for a potential - // action (e.g. when the user is hovering over a link). Implementation of this - // method will reply back to the renderer once the target URL gets received, - // in order to prevent target URLs spamming the browser. - UpdateTargetURL(url.mojom.Url url) => (); - - // Sent from an inactive renderer for the browser to route to the active - // renderer, instructing it to close. - RouteCloseEvent(); -};
diff --git a/third_party/blink/public/mojom/frame/remote_frame.mojom b/third_party/blink/public/mojom/frame/remote_frame.mojom new file mode 100644 index 0000000..0b909fc --- /dev/null +++ b/third_party/blink/public/mojom/frame/remote_frame.mojom
@@ -0,0 +1,450 @@ +// 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. + +module blink.mojom; + +import "cc/mojom/render_frame_metadata.mojom"; +import "cc/mojom/touch_action.mojom"; +import "mojo/public/mojom/base/string16.mojom"; +import "mojo/public/mojom/base/unguessable_token.mojom"; +import "services/network/public/mojom/source_location.mojom"; +import "services/network/public/mojom/url_request.mojom"; +import "services/network/public/mojom/web_sandbox_flags.mojom"; +import "services/viz/public/mojom/compositing/frame_sink_id.mojom"; +import "third_party/blink/public/mojom/blob/blob_url_store.mojom"; +import "third_party/blink/public/mojom/conversions/conversions.mojom"; +import "third_party/blink/public/mojom/frame/frame_owner_properties.mojom"; +import "third_party/blink/public/mojom/frame/frame_policy.mojom"; +import "third_party/blink/public/mojom/frame/frame_replication_state.mojom"; +import "third_party/blink/public/mojom/frame/frame_visual_properties.mojom"; +import "third_party/blink/public/mojom/frame/fullscreen.mojom"; +import "third_party/blink/public/mojom/frame/intrinsic_sizing_info.mojom"; +import "third_party/blink/public/mojom/frame/lifecycle.mojom"; +import "third_party/blink/public/mojom/frame/policy_container.mojom"; +import "third_party/blink/public/mojom/frame/text_autosizer_page_info.mojom"; +import "third_party/blink/public/mojom/frame/tree_scope_type.mojom"; +import "third_party/blink/public/mojom/frame/triggering_event_info.mojom"; +import "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom"; +import "third_party/blink/public/mojom/frame/user_activation_update_types.mojom"; +import "third_party/blink/public/mojom/frame/viewport_intersection_state.mojom"; +import "third_party/blink/public/mojom/input/focus_type.mojom"; +import "third_party/blink/public/mojom/input/scroll_direction.mojom"; +import "third_party/blink/public/mojom/loader/referrer.mojom"; +import "third_party/blink/public/mojom/messaging/transferable_message.mojom"; +import "third_party/blink/public/mojom/navigation/navigation_policy.mojom"; +import "third_party/blink/public/mojom/permissions_policy/permissions_policy.mojom"; +import "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom"; +import "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom"; +import "third_party/blink/public/mojom/timing/resource_timing.mojom"; +import "third_party/blink/public/mojom/tokens/tokens.mojom"; +import "ui/base/mojom/window_open_disposition.mojom"; +import "ui/events/mojom/scroll_granularity.mojom"; +import "ui/gfx/geometry/mojom/geometry.mojom"; +import "url/mojom/origin.mojom"; +import "url/mojom/url.mojom"; + +// Struct for communication channels of the RemoteMainFrame in blink. +struct RemoteMainFrameInterfaces { + pending_associated_remote<blink.mojom.RemoteMainFrameHost> main_frame_host; + pending_associated_receiver<blink.mojom.RemoteMainFrame> main_frame; +}; + +// Struct for passing RemoteFrame interfaces from renderer. +struct RemoteFrameInterfacesFromRenderer { + pending_associated_remote<blink.mojom.RemoteFrame> frame; + pending_associated_receiver<blink.mojom.RemoteFrameHost> frame_host_receiver; +}; + +// Struct for passing RemoteFrame interfaces from browser. +struct RemoteFrameInterfacesFromBrowser { + pending_associated_receiver<blink.mojom.RemoteFrame> frame_receiver; + pending_associated_remote<blink.mojom.RemoteFrameHost> frame_host; +}; + +// This struct holds parameters included in the OpenURL method sent by the +// renderer to the browser, |is_history_navigation_in_new_child_frame| is true +// in the case that the browser process should look for an existing history item +// for the frame. +struct OpenURLParams { + // The main URL to open. + url.mojom.Url url; + url.mojom.Origin initiator_origin; + + // The token of the RenderFrameHost that initiated the navigation. It might + // refer to a RenderFrameHost that doesn't exist anymore when the IPC reaches + // the browser process. + blink.mojom.LocalFrameToken? initiator_frame_token; + + network.mojom.URLRequestBody? post_body; + string extra_headers; + blink.mojom.Referrer referrer; + bool is_form_submission; + + // The window position to open the URL. + ui.mojom.WindowOpenDisposition disposition; + bool should_replace_current_entry; + bool user_gesture; + + // Whether this should be interpreted as a navigation to _unfencedTop, + // i.e. to the outermost frame from a fenced frame in a renderer process that + // doesn't get a handle to that frame. + // The disposition should always be CURRENT_TAB when this flag is set; + // the browser will target the outermost frame instead of the current frame. + // TODO(crbug.com/1315802): Refactor _unfencedTop handling. + bool is_unfenced_top_navigation = false; + + // Extra information about the triggering of the OpenURL. + blink.mojom.TriggeringEventInfo triggering_event_info; + pending_remote<blink.mojom.BlobURLToken>? blob_url_token; + string href_translate; + Impression? impression; + NavigationDownloadPolicy download_policy; + + // Information about the Javascript source for this navigation. Used for + // providing information in console error messages triggered by the + // navigation. If the navigation is not caused by Javascript, the + // SourceLocation's URL is empty. + network.mojom.SourceLocation source_location; + + // Passing the |initiator_policy_container_keep_alive_handle| is just a mean + // to ensure that the PolicyContainerHost of the initiator RenderFrameHost is + // kept alive, even if the RenderFrameHost itself has already been deleted in + // the meantime. If this can be ensured in other ways, it is safe to pass a + // mojo::NullRemote here. + pending_remote<blink.mojom.PolicyContainerHostKeepAliveHandle>? + initiator_policy_container_keep_alive_handle; +}; + +// Implemented in Browser, this interface defines frame-specific methods that +// will be invoked from the render process (e.g. blink::RemoteFrame). +// +// Note that this is different than content/common/frame.mojom in that the +// methods defined here are called directly in Blink without passing through +// content. In the future this interface will likely host more methods as the +// Onion Soup project advances, which can potentially lead to the removal of +// content/common/frame.mojom if enough code is moved to Blink. +interface RemoteFrameHost { + // Notifies that an effective touch action has been calculated from an + // ancestor of the associated RemoteFrame and should be propagated to + // the associated LocalFrame in the other render process. + SetInheritedEffectiveTouchAction(cc.mojom.TouchAction touch_action); + + // Toggles render throttling on a remote frame. |is_throttled| indicates + // whether the current frame should be throttled based on its viewport + // visibility; |subtree_throttled| indicates that an ancestor frame has + // been throttled, so all descendant frames also should be throttled; and + // |display_locked| indicates that an iframe is display locked by an ancestor + // of its <iframe> element in the parent process. + UpdateRenderThrottlingStatus( + bool is_throttled, bool subtree_throttled, bool display_locked); + + // Notifies the browser that the associated frame has changed its visibility + // status. Visibility status changes occur when the frame moves in/out + // of the viewport, or the need for a layout object changes, e.g. if the + // frame owner assigns a display: none style. + VisibilityChanged(blink.mojom.FrameVisibility visibility); + + // Sent by the renderer when the frame becomes focused. + DidFocusFrame(); + + // Use to notify a parent remote frame that a local child frame has finished + // loading. This will be forwarded to the renderer hosting the parent's local + // frame to see if the parent can be marked as completed loading. + CheckCompleted(); + + // Sent by the renderer to request a paint preview of a subframe. |clip_rect| + // is the size of the frame in it's parent. |guid| is an an identifier for + // all the capture work (regardless of the process captures are happening in) + // that allows the results to be grouped together, even if there are multiple + // requests in-flight. + CapturePaintPreviewOfCrossProcessSubframe( + gfx.mojom.Rect clip_rect, mojo_base.mojom.UnguessableToken guid); + + // Sent by a parent frame to notify its child that the renderer has determined + // the DOM subtree it represents is inert and should no longer process input + // events. + // + // https://html.spec.whatwg.org/multipage/interaction.html#inert + SetIsInert(bool inert); + + // Sent when a renderer remote frame either updates its opener to another + // frame identified by |opener_frame|, or, if |opener_frame| is "empty", + // the frame disowns its opener for the lifetime of the window. + DidChangeOpener(blink.mojom.LocalFrameToken? opener_frame); + + // This message is sent from a RemoteFrame when sequential focus navigation + // needs to advance into its actual frame. |source_frame_token| identifies the + // frame that issued this request. This is used when pressing <tab> or + // <shift-tab> hits an out-of-process iframe when searching for the next + // focusable element. + AdvanceFocus(blink.mojom.FocusType focus_type, + blink.mojom.LocalFrameToken source_frame_token); + + // Sent to the browser to post a message to the frame's active renderer, which + // will receive the re-routed message from the browser process via the method + // PostMessageEvent(), from the blink.mojom.LocalFrame interface. + // |source_frame_token| is the frame token of the LocalFrame in the renderer + // process originating the request, which will be translated by the browser + // process to the frame token of the equivalent RemoteFrame in the target + // renderer process. + // |source_origin| is the origin of the source frame when the message was + // sent, |target_origin| specifies what the origin of the target frame must be + // for the message to be dispatched and |message| is the encoded data, plus + // any extra properties such as transferred ports or blobs. + RouteMessageEvent(blink.mojom.LocalFrameToken? source_frame_token, + mojo_base.mojom.String16 source_origin, + mojo_base.mojom.String16 target_origin, + blink.mojom.TransferableMessage message); + + // Ask the frame host to print a cross-process subframe. + // The printed content of this subframe belongs to the document specified by + // its document cookie. Document cookie is a unique id for a printed document + // associated with a print job. + // The content will be rendered in the specified rectangular area in its + // parent frame. + PrintCrossProcessSubframe( + gfx.mojom.Rect frame_content_rect, int32 document_cookie); + + // Notifies the browser that a child frame is detached from the DOM. + Detach(); + + // Sent by a parent frame to notify its child about the state of the child's + // intersection with the parent's viewport, primarily for use by the + // IntersectionObserver API. + UpdateViewportIntersection( + ViewportIntersectionState intersection_state, + FrameVisualProperties? visual_properties); + + // Tells the browser that a child's visual properties have changed. + SynchronizeVisualProperties( + FrameVisualProperties properties); + + // Requests that the given URL be opened in the specified manner. + OpenURL(blink.mojom.OpenURLParams params); +}; + +// Implemented in Blink, this interface defines frame-specific methods that will +// be invoked from the browser process (e.g. content::RenderFrameProxyHost). +// +// Note that this is different than content/common/frame.mojom in that the +// methods defined here are handled directly in Blink without passing through +// content. In the future this interface will likely host more methods as the +// Onion Soup project advances, which can potentially lead to the removal of +// content/common/frame.mojom if enough code is moved to Blink. +interface RemoteFrame { + // Sent to a frame proxy when its real frame is preparing to enter fullscreen + // in another process. Actually entering fullscreen will be done separately + // as part of ViewMsg_Resize, once the browser process has resized the tab for + // fullscreen. + WillEnterFullscreen(FullscreenOptions options); + + // Update replicated set for enforcement of insecure navigations. |set| + // is a hashed set of host/port pairs. See + // SecurityContext::SetInsecureNavigationsSet. + EnforceInsecureNavigationsSet(array<uint32> set); + + // Updates this frame's FrameOwner properties, such as scrolling, margin, + // or allowfullscreen. This is used when this frame's parent is in + // another process and it dynamically updates these properties. + // TODO(dcheng): Currently, the update only takes effect on next frame + // navigation. This matches the in-process frame behavior. + SetFrameOwnerProperties(FrameOwnerProperties properties); + + // Updates the remote frame's replicated enforcement of insecure request + // policy. Used when the frame's policy is changed in another renderer + // process. Argument |policy| is a bitfield for InsecureRequestPolicy. + EnforceInsecureRequestPolicy(blink.mojom.InsecureRequestPolicy policy); + + // Update the replicated origin. Used when the frame is navigated to a + // new origin. + SetReplicatedOrigin(url.mojom.Origin origin, + bool is_potentially_trustworthy_unique_origin); + + // Update the replicated ad status. Used when the frame is tagged or untagged + // as an ad frame by Ad Tagging. + SetReplicatedIsAdFrame(bool is_ad_frame); + + // Sets the replicated name and unique name for the frame. Used when the + // name of a frame changes. + SetReplicatedName(string name, string unique_name); + + // Sent to dispatch a load event in the frame's owner element. + // (eg. the iframe, portal, or object element). + DispatchLoadEventForFrameOwner(); + + // Sent to the remote frame placeholder in the parent process to indicate the + // associated frame in the child process requires information about + // whether it is occluded or has visual effects applied. + SetNeedsOcclusionTracking(bool needs_tracking); + + // Sent to the process that owns this frame's HTMLFrameOwnerElement to + // control whether the element is collapsed or not. If the element is + // collapsed, it will be removed from the layout tree of its parent + // frame's document. + Collapse(bool collapsed); + + // Notifies this remote frame that it is now focused. This is used to + // support cross-process focused frame changes. + Focus(); + + // Notifies this remote frame to mark that the previous document on that + // frame had received a user gesture on the same eTLD+1. + SetHadStickyUserActivationBeforeNavigation(bool has_gesture); + + // Sent to the remote frame placeholder in the parent process to continue + // bubbling a logical scroll from a cross-process frame. + BubbleLogicalScroll(ScrollDirection direction, + ui.mojom.ScrollGranularity granularity); + + // Sent to the remote frame placeholder in the parent process to update the + // user activation state in appropriate part of the frame tree (ancestors for + // activation notification and all nodes for consumption). + // + // The |notification_type| parameter is used for histograms, only for the case + // |update_state == kNotifyActivation|. + UpdateUserActivationState(blink.mojom.UserActivationUpdateType state_update_type, + UserActivationNotificationType notification_type); + + // Sent to the process that owns this frame's HTMLFrameOwnerElement to + // set the embedding token. This token uniquely specifies the relationship + // between a frame and its parent. + SetEmbeddingToken(mojo_base.mojom.UnguessableToken embedding_token); + + // Sets page-level focus and notifies FocusController. + SetPageFocus(bool is_focused); + + // Sent to this frame in parent frame's process to render fallback contents. + // This is only used for <object> elements that failed a navigation (HTTP or + // network error). + RenderFallbackContent(); + + // Sent to this frame in parent frame's process to render fallback contents. + // This is only used for <object> elements that failed a navigation with an + // HTTP error. + RenderFallbackContentWithResourceTiming( + ResourceTimingInfo timing, + string server_timing_value); + + // Sent to the remote frame placeholder in the parent process so that + // resource timing information can be added to the parent frame. + AddResourceTimingFromChild(ResourceTimingInfo timing); + + // Sent to the remote frame placeholder in the parent process to request + // scrolling. + ScrollRectToVisible(gfx.mojom.RectF rect, ScrollIntoViewParams params); + + // Notifies this remote frame that its corresponding document has started + // loading. + DidStartLoading(); + + // Notifies this remote frame that its corresponding document has completed + // loading. + DidStopLoading(); + + // Sent to the remote frame placeholder in the parent process indicating the + // intrinsic sizing parameters of the content frame have changed. Generated + // when the browser receives a IntrinsicSizingInfoChanged message of + // FrameWidgetHost interface. + IntrinsicSizingInfoOfChildChanged(IntrinsicSizingInfo sizing_info); + + // Used to replicate the updated sandbox flags and permissions policy headers to + // all corresponding remote frames of a local frame when a navigation commits. + DidSetFramePolicyHeaders(network.mojom.WebSandboxFlags sandbox_flags, + array<blink.mojom.ParsedPermissionsPolicyDeclaration> parsed_permissions_policy); + + // Notifies the frame that its parent has changed the frame's sandbox flags or + // container policy. + DidUpdateFramePolicy(blink.mojom.FramePolicy frame_policy); + + // Requests that the blink::RemoteFrame updates its opener to the specified + // frame. The frame token may be "empty" if the opener was disowned. + UpdateOpener(blink.mojom.FrameToken? opener_frame_token); + + // Requests the corresponding RemoteFrame to be deleted and removed from + // the frame tree. This should not be called on the main frame as that frame + // is owned by the associated WebView. + DetachAndDispose(); + + // Enables autoresize mode as requested by the parent frame's renderer + // process. + EnableAutoResize(gfx.mojom.Size min_size, gfx.mojom.Size max_size); + + // Disables autoresize mode as requested by the parent frame's renderer + // process. + DisableAutoResize(); + + // Informs the completion of an autoresize transaction from the parent + // renderer and updates with the provided viz::LocalSurfaceId. + DidUpdateVisualProperties(cc.mojom.RenderFrameMetadata metadata); + + // Notifies this remote frame that its associated compositing + // destination (RenderWidgetHostView) has changed. + SetFrameSinkId(viz.mojom.FrameSinkId frame_sink_id); + + // Notifies the remote frame that the process rendering the child frame's + // contents has terminated. + ChildProcessGone(); + + // Tells the RemoteFrame to create a new RemoteFrame child. See + // blink.mojom.PageBroadcast.CreateRemoteMainFrame for creation + // of main frames. + // + // `token`: The frame token. Used to map between RemoteFrame and + // RenderFrameProxyHost. + // `opener_frame_token`: Frame token that identifies the opener frame if one + // exists, or absl::nullopt otherwise. + // `tree_scope_type`: Whether the owner element (e.g. <iframe>, <object>, et + // cetera) for this frame is in the document tree or the shadow tree. + // `devtools_frame_token`: Used for devtools instrumentation and + // trace-ability. The token is shared across all frames (local or remotes) + // representing the same logical frame tree node, and is used by Blink and + // content to tag calls and requests for instrumentation purposes, + // allowing them to be attributed to a context frame. + // + // Must not be used to look up a RenderFrameHostImpl or + // RenderFrameProxyHost in the browser process, as the token is shared, + // making the mapping ambiguous and non-authoritative. + CreateRemoteChild(blink.mojom.RemoteFrameToken token, + blink.mojom.FrameToken? opener_frame_token, + blink.mojom.TreeScopeType tree_scope_type, + blink.mojom.FrameReplicationState replication_state, + mojo_base.mojom.UnguessableToken devtools_frame_token, + RemoteFrameInterfacesFromBrowser remote_frame_interfaces); +}; + +// Implemented in Blink, this interface defines remote main-frame-specific +// methods that will be invoked from the browser process (e.g. +// content::RenderFrameProxyHost). +// +// There is only ever one remote main frame for a given tab in all renderer +// processes. +// +// This interface will only be provided when the RemoteFrame is a main frame. +interface RemoteMainFrame { + // Makes the TextAutosizerPageInfo received from a local main frame available + // to remote main frame renderers. + UpdateTextAutosizerPageInfo(blink.mojom.TextAutosizerPageInfo page_info); +}; + +// Implemented in Browser, this interface defines remote-main-frame-specific +// methods that will be invoked from the renderer process (e.g. WebViewImpl). +interface RemoteMainFrameHost { + // Asks the browser process to activate the page associated to the main frame. + FocusPage(); + + // Asks the browser to transfer focus cross-process on behalf of the renderer + // in the focus hierarchy. This may focus an element in the browser ui or a + // cross-process frame, as appropriate. + TakeFocus(bool reverse); + + // Notifies the browser that we want to show a destination url for a potential + // action (e.g. when the user is hovering over a link). Implementation of this + // method will reply back to the renderer once the target URL gets received, + // in order to prevent target URLs spamming the browser. + UpdateTargetURL(url.mojom.Url url) => (); + + // Sent from an inactive renderer for the browser to route to the active + // renderer, instructing it to close. + RouteCloseEvent(); +};
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index cfce94f..6ff7c34 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom
@@ -6,8 +6,8 @@ import "mojo/public/mojom/base/time.mojom"; import "mojo/public/mojom/base/unguessable_token.mojom"; import "skia/public/mojom/skcolor.mojom"; -import "third_party/blink/public/mojom/frame/frame.mojom"; import "third_party/blink/public/mojom/frame/frame_replication_state.mojom"; +import "third_party/blink/public/mojom/frame/remote_frame.mojom"; import "third_party/blink/public/mojom/navigation/was_activated_option.mojom"; import "third_party/blink/public/mojom/page/page_visibility_state.mojom"; import "third_party/blink/public/mojom/tokens/tokens.mojom";
diff --git a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom index c4e19ed..8d8e05c 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/css_property_id.mojom
@@ -772,8 +772,8 @@ kAnchorName = 719, kPositionFallback = 720, kAnchorScroll = 721, - kHoverPopUpDelay = 722, - kHoverPopUpHideDelay = 723, + kPopUpShowDelay = 722, + kPopUpHideDelay = 723, // 1. Add new features above this line (don't change the assigned numbers of // the existing items). // 2. Run the src/tools/metrics/histograms/update_use_counter_css.py script
diff --git a/third_party/blink/public/platform/media/key_system_config_selector.h b/third_party/blink/public/platform/media/key_system_config_selector.h index d5be2c4..3688828 100644 --- a/third_party/blink/public/platform/media/key_system_config_selector.h +++ b/third_party/blink/public/platform/media/key_system_config_selector.h
@@ -130,7 +130,7 @@ const std::string& codecs, ConfigState* config_state); - absl::optional<media::EmeConfigRule> GetEncryptionSchemeConfigRule( + media::EmeConfig::Rule GetEncryptionSchemeConfigRule( const std::string& key_system, const WebMediaKeySystemMediaCapability::EncryptionScheme encryption_scheme);
diff --git a/third_party/blink/public/web/web_local_frame_client.h b/third_party/blink/public/web/web_local_frame_client.h index 8b2a4fcb..4ef7353 100644 --- a/third_party/blink/public/web/web_local_frame_client.h +++ b/third_party/blink/public/web/web_local_frame_client.h
@@ -42,6 +42,7 @@ #include "media/mojo/mojom/audio_processing.mojom-shared.h" #include "services/network/public/mojom/web_sandbox_flags.mojom-shared.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h" #include "third_party/blink/public/common/frame/frame_owner_element_type.h" #include "third_party/blink/public/common/loader/loading_behavior_flag.h" #include "third_party/blink/public/common/loader/url_loader_factory_bundle.h" @@ -126,12 +127,17 @@ class WebSocketHandshakeThrottle; class WebString; class WebURL; +class WebURLRequest; class WebURLResponse; +class WebView; struct FramePolicy; +struct Impression; struct MobileFriendliness; struct WebConsoleMessage; struct ContextMenuData; +struct WebPictureInPictureWindowOptions; struct WebPluginParams; +struct WebWindowFeatures; enum class SyncCondition { kNotForced, // Sync only if the value has changed since the last call. @@ -760,6 +766,26 @@ // Called when script in the frame (and it subframes) wishes to be printed via // a window.print() call. virtual void ScriptedPrint() {} + + // Create a new related WebView. This method must clone its session storage + // so any subsequent calls to createSessionStorageNamespace conform to the + // WebStorage specification. + // The request parameter is only for the client to check if the request + // could be fulfilled. The client should not load the request. + // The policy parameter indicates how the new view will be displayed in + // LocalMainFrameHost::ShowCreatedWidget. + virtual WebView* CreateNewWindow( + const WebURLRequest& request, + const WebWindowFeatures& features, + const WebString& name, + WebNavigationPolicy policy, + network::mojom::WebSandboxFlags, + const SessionStorageNamespaceId& session_storage_namespace_id, + bool& consumed_user_gesture, + const absl::optional<Impression>&, + const absl::optional<WebPictureInPictureWindowOptions>& pip_options) { + return nullptr; + } }; } // namespace blink
diff --git a/third_party/blink/public/web/web_view.h b/third_party/blink/public/web/web_view.h index ead76f1f..3af33a4d 100644 --- a/third_party/blink/public/web/web_view.h +++ b/third_party/blink/public/web/web_view.h
@@ -467,9 +467,6 @@ // Returns whether this WebView represents a fenced frame root or not. virtual bool IsFencedFrameRoot() const = 0; - // Return the Client associated with this WebView. - virtual WebViewClient* Client() = 0; - // Misc ------------------------------------------------------------- // Returns the number of live WebView instances in this process.
diff --git a/third_party/blink/public/web/web_view_client.h b/third_party/blink/public/web/web_view_client.h index 3e36195..d551e78b7 100644 --- a/third_party/blink/public/web/web_view_client.h +++ b/third_party/blink/public/web/web_view_client.h
@@ -31,53 +31,15 @@ #ifndef THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_VIEW_CLIENT_H_ #define THIRD_PARTY_BLINK_PUBLIC_WEB_WEB_VIEW_CLIENT_H_ -#include "base/strings/string_piece.h" -#include "services/network/public/mojom/web_sandbox_flags.mojom-shared.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/blink/public/common/dom_storage/session_storage_namespace_id.h" -#include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h" -#include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" -#include "third_party/blink/public/mojom/page/page_visibility_state.mojom-forward.h" -#include "third_party/blink/public/platform/web_string.h" -#include "third_party/blink/public/web/web_ax_enums.h" -#include "third_party/blink/public/web/web_frame.h" -#include "third_party/blink/public/web/web_navigation_policy.h" -#include "third_party/blink/public/web/web_picture_in_picture_window_options.h" -#include "ui/gfx/geometry/rect.h" +#include "ui/gfx/geometry/size.h" namespace blink { -struct Impression; -class WebURLRequest; -class WebView; -struct WebWindowFeatures; - class WebViewClient { public: virtual ~WebViewClient() = default; // Factory methods ----------------------------------------------------- - // Create a new related WebView. This method must clone its session storage - // so any subsequent calls to createSessionStorageNamespace conform to the - // WebStorage specification. - // The request parameter is only for the client to check if the request - // could be fulfilled. The client should not load the request. - // The policy parameter indicates how the new view will be displayed in - // LocalMainFrameHost::ShowCreatedWidget. - virtual WebView* CreateView( - WebLocalFrame* creator, - const WebURLRequest& request, - const WebWindowFeatures& features, - const WebString& name, - WebNavigationPolicy policy, - network::mojom::WebSandboxFlags, - const SessionStorageNamespaceId& session_storage_namespace_id, - bool& consumed_user_gesture, - const absl::optional<Impression>&, - const absl::optional<WebPictureInPictureWindowOptions>& pip_options) { - return nullptr; - } - // Misc ---------------------------------------------------------------- // Called when a region of the WebView needs to be re-painted. This is only
diff --git a/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc b/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc index 8c778e6..84cbdbd7 100644 --- a/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc +++ b/third_party/blink/renderer/core/animation/css_interpolation_types_map.cc
@@ -232,8 +232,8 @@ applicable_types->push_back( std::make_unique<CSSNumberInterpolationType>(used_property)); break; - case CSSPropertyID::kHoverPopUpDelay: - case CSSPropertyID::kHoverPopUpHideDelay: + case CSSPropertyID::kPopUpShowDelay: + case CSSPropertyID::kPopUpHideDelay: applicable_types->push_back( std::make_unique<CSSTimeInterpolationType>(used_property)); break;
diff --git a/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc b/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc index d866eb9..f37396ea 100644 --- a/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc +++ b/third_party/blink/renderer/core/animation/css_time_interpolation_type.cc
@@ -48,10 +48,10 @@ const CSSPropertyID& property, const ComputedStyle& style) { switch (property) { - case CSSPropertyID::kHoverPopUpDelay: - return style.HoverPopUpDelay(); - case CSSPropertyID::kHoverPopUpHideDelay: - return style.HoverPopUpHideDelay(); + case CSSPropertyID::kPopUpShowDelay: + return style.PopUpShowDelay(); + case CSSPropertyID::kPopUpHideDelay: + return style.PopUpHideDelay(); default: NOTREACHED(); return absl::optional<double>(); @@ -70,8 +70,8 @@ double CSSTimeInterpolationType::ClampTime(const CSSPropertyID& property, double value) const { switch (property) { - case CSSPropertyID::kHoverPopUpDelay: - case CSSPropertyID::kHoverPopUpHideDelay: + case CSSPropertyID::kPopUpShowDelay: + case CSSPropertyID::kPopUpHideDelay: return ClampTo<float>(value, 0); default: NOTREACHED(); @@ -96,11 +96,11 @@ ClampTime(property, To<InterpolableNumber>(interpolable_value).Value()); ComputedStyle& style = *state.Style(); switch (property) { - case CSSPropertyID::kHoverPopUpDelay: - style.SetHoverPopUpDelay(clamped_seconds); + case CSSPropertyID::kPopUpShowDelay: + style.SetPopUpShowDelay(clamped_seconds); break; - case CSSPropertyID::kHoverPopUpHideDelay: - style.SetHoverPopUpHideDelay(clamped_seconds); + case CSSPropertyID::kPopUpHideDelay: + style.SetPopUpHideDelay(clamped_seconds); break; default: NOTREACHED();
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index 3dbc54f..4fa0257 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -2815,7 +2815,7 @@ valid_for_position_fallback: true, }, { - name: "hover-pop-up-delay", + name: "pop-up-show-delay", runtime_flag: "HTMLPopupAttribute", property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], field_group: "*", @@ -2828,7 +2828,7 @@ supports_incremental_style: true, }, { - name: "hover-pop-up-hide-delay", + name: "pop-up-hide-delay", runtime_flag: "HTMLPopupAttribute", property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], field_group: "*",
diff --git a/third_party/blink/renderer/core/css/css_property_equality.cc b/third_party/blink/renderer/core/css/css_property_equality.cc index 336329c..701f2f2d 100644 --- a/third_party/blink/renderer/core/css/css_property_equality.cc +++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -179,10 +179,10 @@ return a.GridTemplateRows() == b.GridTemplateRows(); case CSSPropertyID::kHeight: return a.Height() == b.Height(); - case CSSPropertyID::kHoverPopUpDelay: - return a.HoverPopUpDelay() == b.HoverPopUpDelay(); - case CSSPropertyID::kHoverPopUpHideDelay: - return a.HoverPopUpHideDelay() == b.HoverPopUpHideDelay(); + case CSSPropertyID::kPopUpShowDelay: + return a.PopUpShowDelay() == b.PopUpShowDelay(); + case CSSPropertyID::kPopUpHideDelay: + return a.PopUpHideDelay() == b.PopUpHideDelay(); case CSSPropertyID::kLeft: return a.Left() == b.Left(); case CSSPropertyID::kLetterSpacing:
diff --git a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc index 401ec07..6e15db32 100644 --- a/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc +++ b/third_party/blink/renderer/core/css/properties/longhands/longhands_custom.cc
@@ -3635,7 +3635,7 @@ style); } -const CSSValue* HoverPopUpDelay::ParseSingleValue( +const CSSValue* PopUpShowDelay::ParseSingleValue( CSSParserTokenRange& range, const CSSParserContext& context, const CSSParserLocalContext& local_context) const { @@ -3643,15 +3643,15 @@ range, context, CSSPrimitiveValue::ValueRange::kNonNegative); } -const CSSValue* HoverPopUpDelay::CSSValueFromComputedStyleInternal( +const CSSValue* PopUpShowDelay::CSSValueFromComputedStyleInternal( const ComputedStyle& style, const LayoutObject* layout_object, bool allow_visited_style) const { - return CSSNumericLiteralValue::Create(style.HoverPopUpDelay(), + return CSSNumericLiteralValue::Create(style.PopUpShowDelay(), CSSPrimitiveValue::UnitType::kSeconds); } -const CSSValue* HoverPopUpHideDelay::ParseSingleValue( +const CSSValue* PopUpHideDelay::ParseSingleValue( CSSParserTokenRange& range, const CSSParserContext& context, const CSSParserLocalContext& local_context) const { @@ -3659,11 +3659,11 @@ range, context, CSSPrimitiveValue::ValueRange::kNonNegative); } -const CSSValue* HoverPopUpHideDelay::CSSValueFromComputedStyleInternal( +const CSSValue* PopUpHideDelay::CSSValueFromComputedStyleInternal( const ComputedStyle& style, const LayoutObject* layout_object, bool allow_visited_style) const { - return CSSNumericLiteralValue::Create(style.HoverPopUpHideDelay(), + return CSSNumericLiteralValue::Create(style.PopUpHideDelay(), CSSPrimitiveValue::UnitType::kSeconds); }
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index 2a6c9500..02770e7360 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2815,17 +2815,17 @@ GetDocument().UpdateStyleAndLayoutTreeForNode(this); Element* control = nullptr; - if (IsAutofocusable() || hasAttribute(html_names::kDelegatesfocusAttr)) { - // If the popup has autofocus or delegatesfocus, focus it. + if (IsAutofocusable()) { + // If the popup has autofocus, focus it. control = this; } else { // Otherwise, look for a child control that has the autofocus attribute. control = GetPopupFocusableArea(/*autofocus_only=*/true); } - // If the popup does not use autofocus or delegatesfocus, then the focus - // should remain on the currently active element. - // https://open-ui.org/components/popup.research.explainer#autofocus-logic + // If the popup does not use autofocus, then the focus should remain on the + // currently active element. + // https://open-ui.org/components/popup.research.explainer#focus-management if (!control) return; @@ -3100,7 +3100,7 @@ // within another pop-up, and the container pop-up is a descendant of this // pop_up. For the special case of popup=manual pop-ups, which do not have // ancestral relationships, this function checks pure DOM tree descendants of -// popup=manual pop-ups. This is important for the `hover-pop-up-hide-delay` CSS +// popup=manual pop-ups. This is important for the `pop-up-hide-delay` CSS // property, which works for all pop-up types, and needs to keep pop-ups open // when a descendant is hovered. bool Element::IsNodePopUpDescendant(const Node& node) const { @@ -3125,11 +3125,11 @@ void Element::MaybeQueuePopupHideEvent() { DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()); DCHECK(HasValidPopupAttribute()); - // If the pop-up isn't showing, or it has an infinite HoverPopUpHideDelay, do + // If the pop-up isn't showing, or it has an infinite PopUpHideDelay, do // nothing. if (GetPopupData()->visibilityState() == PopupVisibilityState::kHidden) return; - float hide_delay_seconds = GetComputedStyle()->HoverPopUpHideDelay(); + float hide_delay_seconds = GetComputedStyle()->PopUpHideDelay(); // If the value is infinite or NaN, don't hide the pop-up. if (!std::isfinite(hide_delay_seconds)) return; @@ -3194,7 +3194,7 @@ auto& hover_tasks = popup_element->GetPopupData()->hoverShowTasks(); DCHECK(!hover_tasks.Contains(this)); - float hover_delay_seconds = GetComputedStyle()->HoverPopUpDelay(); + float hover_delay_seconds = GetComputedStyle()->PopUpShowDelay(); // If the value is infinite or NaN, don't queue a task at all. DCHECK_GE(hover_delay_seconds, 0); if (std::isfinite(hover_delay_seconds)) { @@ -5694,15 +5694,6 @@ frame_owner_element->contentDocument()->UnloadStarted()) return; - if (HasValidPopupAttribute() && - hasAttribute(html_names::kDelegatesfocusAttr)) { - DCHECK(RuntimeEnabledFeatures::HTMLPopupAttributeEnabled()); - if (auto* node_to_focus = GetPopupFocusableArea(/*autofocus_only=*/false)) { - node_to_focus->Focus(params); - } - return; - } - // Ensure we have clean style (including forced display locks). GetDocument().UpdateStyleAndLayoutTreeForNode(this);
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index 13b6877..08cc814 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -45,6 +45,7 @@ #include "third_party/blink/public/common/renderer_preferences/renderer_preferences.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h" #include "third_party/blink/public/mojom/page/page.mojom-blink.h" #include "third_party/blink/public/mojom/page/page_visibility_state.mojom-blink.h" @@ -219,7 +220,6 @@ int32_t HistoryListLength() const { return history_list_length_; } const SessionStorageNamespaceId& GetSessionStorageNamespaceId() override; bool IsFencedFrameRoot() const override; - WebViewClient* Client() override { return web_view_client_; } // Functions to add and remove observers for this object. void AddObserver(WebViewObserver* observer); @@ -336,6 +336,8 @@ // the page is shutting down, but will be valid at all other times. Page* GetPage() const { return page_.Get(); } + WebViewClient* Client() { return web_view_client_; } + WebDevToolsAgentImpl* MainFrameDevToolsAgentImpl(); DevToolsEmulator* GetDevToolsEmulator() const {
diff --git a/third_party/blink/renderer/core/exported/web_view_test.cc b/third_party/blink/renderer/core/exported/web_view_test.cc index 4b5e88a..9b26cd1 100644 --- a/third_party/blink/renderer/core/exported/web_view_test.cc +++ b/third_party/blink/renderer/core/exported/web_view_test.cc
@@ -203,7 +203,7 @@ WebViewImpl* web_view_; }; -class AutoResizeWebViewClient : public frame_test_helpers::TestWebViewClient { +class AutoResizeWebViewClient : public WebViewClient { public: // WebViewClient methods void DidAutoResize(const gfx::Size& new_size) override { @@ -464,7 +464,7 @@ TEST_F(WebViewTest, SetBaseBackgroundColorBeforeMainFrame) { // Note: this test doesn't use WebViewHelper since it intentionally runs // initialization code between WebView and WebLocalFrame creation. - frame_test_helpers::TestWebViewClient web_view_client; + WebViewClient web_view_client; WebViewImpl* web_view = To<WebViewImpl>( WebView::Create(&web_view_client, /*is_hidden=*/false, @@ -3811,13 +3811,11 @@ frame->SetAutofillClient(nullptr); } -class ViewCreatingWebViewClient : public frame_test_helpers::TestWebViewClient { +class ViewCreatingWebFrameClient + : public frame_test_helpers::TestWebFrameClient { public: - ViewCreatingWebViewClient() : did_focus_called_(false) {} - - // WebViewClient overrides. - WebView* CreateView( - WebLocalFrame* opener, + // WebLocalFrameClient overrides. + WebView* CreateNewWindow( const WebURLRequest&, const WebWindowFeatures&, const WebString& name, @@ -3827,22 +3825,32 @@ bool& consumed_user_gesture, const absl::optional<Impression>&, const absl::optional<WebPictureInPictureWindowOptions>&) override { - return web_view_helper_.InitializeWithOpener(opener); + return web_view_helper_.InitializeWithOpener(Frame()); } - void DidFocus() override { did_focus_called_ = true; } - - bool DidFocusCalled() const { return did_focus_called_; } WebView* CreatedWebView() const { return web_view_helper_.GetWebView(); } private: frame_test_helpers::WebViewHelper web_view_helper_; - bool did_focus_called_; +}; + +class ViewCreatingWebViewClient : public WebViewClient { + public: + ViewCreatingWebViewClient() = default; + + void DidFocus() override { did_focus_called_ = true; } + + bool DidFocusCalled() const { return did_focus_called_; } + + private: + bool did_focus_called_ = false; }; TEST_F(WebViewTest, DoNotFocusCurrentFrameOnNavigateFromLocalFrame) { + ViewCreatingWebFrameClient frame_client; ViewCreatingWebViewClient client; frame_test_helpers::WebViewHelper web_view_helper; - WebViewImpl* web_view_impl = web_view_helper.Initialize(nullptr, &client); + WebViewImpl* web_view_impl = + web_view_helper.Initialize(&frame_client, &client); WebURL base_url = url_test_helpers::ToKURL("http://example.com/"); frame_test_helpers::LoadHTMLString( @@ -3866,9 +3874,11 @@ } TEST_F(WebViewTest, FocusExistingFrameOnNavigate) { + ViewCreatingWebFrameClient frame_client; ViewCreatingWebViewClient client; frame_test_helpers::WebViewHelper web_view_helper; - WebViewImpl* web_view_impl = web_view_helper.Initialize(nullptr, &client); + WebViewImpl* web_view_impl = + web_view_helper.Initialize(&frame_client, &client); WebLocalFrameImpl* frame = web_view_impl->MainFrameImpl(); frame->SetName("_start"); @@ -3878,7 +3888,7 @@ To<LocalFrame>(web_view_impl->GetPage()->MainFrame()) ->Tree() .FindOrCreateFrameForNavigation(request, "_blank"); - ASSERT_TRUE(client.CreatedWebView()); + ASSERT_TRUE(frame_client.CreatedWebView()); EXPECT_FALSE(client.DidFocusCalled()); // Make a request from the new window that will navigate the original window. @@ -3886,7 +3896,7 @@ WebURLRequest web_url_request_with_target_start(KURL("about:blank")); FrameLoadRequest request_with_target_start( nullptr, web_url_request_with_target_start.ToResourceRequest()); - To<LocalFrame>(static_cast<WebViewImpl*>(client.CreatedWebView()) + To<LocalFrame>(static_cast<WebViewImpl*>(frame_client.CreatedWebView()) ->GetPage() ->MainFrame()) ->Tree() @@ -3896,13 +3906,13 @@ web_view_helper.Reset(); // Remove dependency on locally scoped client. } -class ViewReusingWebViewClient : public frame_test_helpers::TestWebViewClient { +class ViewReusingWebFrameClient + : public frame_test_helpers::TestWebFrameClient { public: - ViewReusingWebViewClient() = default; + ViewReusingWebFrameClient() = default; - // WebViewClient methods - WebView* CreateView( - WebLocalFrame*, + // WebLocalFrameClient methods + WebView* CreateNewWindow( const WebURLRequest&, const WebWindowFeatures&, const WebString& name, @@ -3923,11 +3933,10 @@ TEST_F(WebViewTest, ReuseExistingWindowOnCreateViewUsesCorrectNavigationPolicy) { - ViewReusingWebViewClient view_client; + ViewReusingWebFrameClient frame_client; frame_test_helpers::WebViewHelper web_view_helper; - WebViewImpl* web_view_impl = - web_view_helper.Initialize(nullptr, &view_client); - view_client.SetWebView(web_view_impl); + WebViewImpl* web_view_impl = web_view_helper.Initialize(&frame_client); + frame_client.SetWebView(web_view_impl); LocalFrame* frame = To<LocalFrame>(web_view_impl->GetPage()->MainFrame()); // Request a new window, but the WebViewClient will decline to and instead
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc index 89f67f2..ab60832 100644 --- a/third_party/blink/renderer/core/frame/attribution_response_parsing.cc +++ b/third_party/blink/renderer/core/frame/attribution_response_parsing.cc
@@ -208,17 +208,6 @@ if (!object) return false; - String event_id_string; - if (!object->GetString("source_event_id", &event_id_string)) - return false; - bool event_id_is_valid = false; - uint64_t event_id = event_id_string.ToUInt64Strict(&event_id_is_valid); - - // For source registrations where there is no mechanism to raise an error, - // such as on an img element, it is more useful to log the source with - // default data so that a reporting origin can learn the failure mode. - source_data.source_event_id = event_id_is_valid ? event_id : 0; - String destination_string; if (!object->GetString("destination", &destination_string)) return false; @@ -228,7 +217,15 @@ return false; source_data.destination = std::move(destination); - // Treat invalid expiry, priority, and debug key as if they were not set. + // Treat invalid source_event_id, expiry, priority, and debug key as if they + // were not set. + + if (String s; object->GetString("source_event_id", &s)) { + bool valid = false; + uint64_t source_event_id = s.ToUInt64Strict(&valid); + if (valid) + source_data.source_event_id = source_event_id; + } if (String s; object->GetString("priority", &s)) { bool valid = false;
diff --git a/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc b/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc index 560f18f7..a71fa70 100644 --- a/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc +++ b/third_party/blink/renderer/core/frame/attribution_response_parsing_test.cc
@@ -579,14 +579,13 @@ { "required_fields_only", R"json({ - "source_event_id": "1", "destination": "https://d.test" })json", mojom::blink::AttributionSourceData::New( /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr, @@ -594,13 +593,6 @@ /*aggregation_keys=*/WTF::HashMap<String, absl::uint128>()), }, { - "missing_source_event_id", - R"json({ - "destination": "https://d.test" - })json", - nullptr, - }, - { "missing_destination", R"json({ "source_event_id": "1" @@ -613,7 +605,16 @@ "source_event_id": 1, "destination": "https://d.test" })json", - nullptr, + mojom::blink::AttributionSourceData::New( + /*destination=*/SecurityOrigin::CreateFromString( + "https://d.test"), + /*reporting_origin=*/reporting_origin, + /*source_event_id=*/0, + /*expiry=*/absl::nullopt, + /*priority=*/0, + /*debug_key=*/nullptr, + /*filter_data=*/AttributionFilterDataBuilder().Build(), + /*aggregation_keys=*/WTF::HashMap<String, absl::uint128>()), }, { "invalid_source_event_id", @@ -633,9 +634,25 @@ /*aggregation_keys=*/WTF::HashMap<String, absl::uint128>()), }, { - "destination_not_string", + "valid_source_event_id", R"json({ "source_event_id": "1", + "destination": "https://d.test" + })json", + mojom::blink::AttributionSourceData::New( + /*destination=*/SecurityOrigin::CreateFromString( + "https://d.test"), + /*reporting_origin=*/reporting_origin, + /*source_event_id=*/1, + /*expiry=*/absl::nullopt, + /*priority=*/0, + /*debug_key=*/nullptr, + /*filter_data=*/AttributionFilterDataBuilder().Build(), + /*aggregation_keys=*/WTF::HashMap<String, absl::uint128>()), + }, + { + "destination_not_string", + R"json({ "destination": 4 })json", nullptr, @@ -643,7 +660,6 @@ { "destination_not_potentially_trustworthy", R"json({ - "source_event_id": "1", "destination": "http://d.test" })json", nullptr, @@ -651,7 +667,6 @@ { "valid_priority", R"json({ - "source_event_id": "1", "destination": "https://d.test", "priority": "5" })json", @@ -659,7 +674,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/5, /*debug_key=*/nullptr, @@ -669,7 +684,6 @@ { "priority_not_string", R"json({ - "source_event_id": "1", "destination": "https://d.test", "priority": 5 })json", @@ -677,7 +691,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr, @@ -687,7 +701,6 @@ { "invalid_priority", R"json({ - "source_event_id": "1", "destination": "https://d.test", "priority": "abc" })json", @@ -695,7 +708,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr, @@ -705,7 +718,6 @@ { "valid_expiry", R"json({ - "source_event_id": "1", "destination": "https://d.test", "expiry": "5" })json", @@ -713,7 +725,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/base::Seconds(5), /*priority=*/0, /*debug_key=*/nullptr, @@ -723,7 +735,6 @@ { "expiry_not_string", R"json({ - "source_event_id": "1", "destination": "https://d.test", "expiry": 5 })json", @@ -731,7 +742,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr, @@ -741,7 +752,6 @@ { "invalid_expiry", R"json({ - "source_event_id": "1", "destination": "https://d.test", "expiry": "abc" })json", @@ -749,7 +759,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr, @@ -759,7 +769,6 @@ { "valid_debug_key", R"json({ - "source_event_id": "1", "destination": "https://d.test", "debug_key": "5" })json", @@ -767,7 +776,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/mojom::blink::AttributionDebugKey::New(5), @@ -777,7 +786,6 @@ { "valid_filter_data", R"json({ - "source_event_id": "1", "destination": "https://d.test", "filter_data": {"SOURCE_TYPE": []} })json", @@ -785,7 +793,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr, @@ -798,7 +806,6 @@ { "invalid_source_type_key_in_filter_data", R"json({ - "source_event_id": "1", "destination": "https://d.test", "filter_data": {"source_type": []} })json", @@ -807,7 +814,6 @@ { "unknown_field", R"json({ - "source_event_id": "1", "destination": "https://d.test", "a": {"b": {"c": {"d": "e"}}} })json", @@ -815,7 +821,7 @@ /*destination=*/SecurityOrigin::CreateFromString( "https://d.test"), /*reporting_origin=*/reporting_origin, - /*source_event_id=*/1, + /*source_event_id=*/0, /*expiry=*/absl::nullopt, /*priority=*/0, /*debug_key=*/nullptr,
diff --git a/third_party/blink/renderer/core/frame/frame.h b/third_party/blink/renderer/core/frame/frame.h index fb54732..8e9d56f 100644 --- a/third_party/blink/renderer/core/frame/frame.h +++ b/third_party/blink/renderer/core/frame/frame.h
@@ -43,8 +43,8 @@ #include "third_party/blink/public/common/permissions_policy/permissions_policy_features.h" #include "third_party/blink/public/common/tokens/tokens.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame.mojom-blink-forward.h" -#include "third_party/blink/public/mojom/frame/frame.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-blink-forward.h" #include "third_party/blink/public/mojom/input/scroll_direction.mojom-blink-forward.h" #include "third_party/blink/public/mojom/timing/resource_timing.mojom-blink-forward.h"
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.cc b/third_party/blink/renderer/core/frame/frame_test_helpers.cc index 0991df46..c804cc9 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.cc +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.cc
@@ -409,7 +409,7 @@ WebViewImpl* WebViewHelper::InitializeWithOpener( WebFrame* opener, TestWebFrameClient* web_frame_client, - TestWebViewClient* web_view_client, + WebViewClient* web_view_client, void (*update_settings_func)(WebSettings*), absl::optional<mojom::blink::FencedFrameMode> fenced_frame_mode) { Reset(); @@ -448,7 +448,7 @@ WebViewImpl* WebViewHelper::Initialize( TestWebFrameClient* web_frame_client, - TestWebViewClient* web_view_client, + WebViewClient* web_view_client, void (*update_settings_func)(WebSettings*)) { return InitializeWithOpener(nullptr, web_frame_client, web_view_client, update_settings_func); @@ -462,7 +462,7 @@ WebViewImpl* WebViewHelper::InitializeAndLoad( const std::string& url, TestWebFrameClient* web_frame_client, - TestWebViewClient* web_view_client, + WebViewClient* web_view_client, void (*update_settings_func)(WebSettings*)) { DocumentLoader::DisableCodeCacheForTesting(); Initialize(web_frame_client, web_view_client, update_settings_func); @@ -474,14 +474,14 @@ WebViewImpl* WebViewHelper::InitializeRemote( scoped_refptr<SecurityOrigin> security_origin, - TestWebViewClient* web_view_client) { + WebViewClient* web_view_client) { return InitializeRemoteWithOpener(nullptr, security_origin, web_view_client); } WebViewImpl* WebViewHelper::InitializeRemoteWithOpener( WebFrame* opener, scoped_refptr<SecurityOrigin> security_origin, - TestWebViewClient* web_view_client) { + WebViewClient* web_view_client) { Reset(); InitializeWebView(web_view_client, nullptr, absl::nullopt); @@ -620,14 +620,18 @@ << "Platform::Current() should be the same for the life of a test, " "including shutdown."; - if (test_web_view_client_) - test_web_view_client_->DestroyChildViews(); if (web_view_) { + // Prune opened windows before this helper resets. + if (auto* local_main_frame = + DynamicTo<WebLocalFrameImpl>(web_view_->MainFrame())) { + static_cast<TestWebFrameClient*>(local_main_frame->Client()) + ->DestroyChildViews(); + } + DCHECK(!TestWebFrameClient::IsLoading()); web_view_->Close(); web_view_ = nullptr; } - test_web_view_client_ = nullptr; } cc::LayerTreeHost* WebViewHelper::GetLayerTreeHost() const { @@ -655,13 +659,13 @@ } void WebViewHelper::InitializeWebView( - TestWebViewClient* web_view_client, + WebViewClient* web_view_client, class WebView* opener, absl::optional<mojom::blink::FencedFrameMode> fenced_frame_mode) { - test_web_view_client_ = - CreateDefaultClientIfNeeded(web_view_client, owned_test_web_view_client_); + web_view_client = + CreateDefaultClientIfNeeded(web_view_client, owned_web_view_client_); web_view_ = To<WebViewImpl>( - WebView::Create(test_web_view_client_, + WebView::Create(web_view_client, /*is_hidden=*/false, /*is_prerendering=*/false, /*is_inside_portal=*/false, @@ -838,6 +842,26 @@ } } +WebView* TestWebFrameClient::CreateNewWindow( + const WebURLRequest&, + const WebWindowFeatures&, + const WebString& name, + WebNavigationPolicy, + network::mojom::blink::WebSandboxFlags, + const SessionStorageNamespaceId&, + bool& consumed_user_gesture, + const absl::optional<Impression>&, + const absl::optional<WebPictureInPictureWindowOptions>&) { + auto webview_helper = std::make_unique<WebViewHelper>(); + WebView* result = webview_helper->InitializeWithOpener(frame_); + child_web_views_.push_back(std::move(webview_helper)); + return result; +} + +void TestWebFrameClient::DestroyChildViews() { + child_web_views_.clear(); +} + TestWidgetInputHandlerHost* TestWebFrameWidget::GetInputHandlerHost() { if (!widget_input_handler_host_) widget_input_handler_host_ = std::make_unique<TestWidgetInputHandlerHost>(); @@ -990,27 +1014,6 @@ frame_receiver_.Bind(std::move(frame_receiver)); } -void TestWebViewClient::DestroyChildViews() { - child_web_views_.clear(); -} - -WebView* TestWebViewClient::CreateView( - WebLocalFrame* opener, - const WebURLRequest&, - const WebWindowFeatures&, - const WebString& name, - WebNavigationPolicy, - network::mojom::blink::WebSandboxFlags, - const SessionStorageNamespaceId&, - bool& consumed_user_gesture, - const absl::optional<Impression>&, - const absl::optional<WebPictureInPictureWindowOptions>&) { - auto webview_helper = std::make_unique<WebViewHelper>(); - WebView* result = webview_helper->InitializeWithOpener(opener); - child_web_views_.push_back(std::move(webview_helper)); - return result; -} - mojo::PendingRemote<mojom::blink::WidgetInputHandlerHost> TestWidgetInputHandlerHost::BindNewRemote() { receiver_.reset();
diff --git a/third_party/blink/renderer/core/frame/frame_test_helpers.h b/third_party/blink/renderer/core/frame/frame_test_helpers.h index 10de3892..f44e3d89 100644 --- a/third_party/blink/renderer/core/frame/frame_test_helpers.h +++ b/third_party/blink/renderer/core/frame/frame_test_helpers.h
@@ -83,7 +83,6 @@ namespace frame_test_helpers { class TestWebFrameClient; -class TestWebViewClient; class TestWidgetInputHandlerHost; class WebViewHelper; @@ -309,30 +308,6 @@ mojom::blink::DidOverscrollParamsPtr last_overscroll_; }; -class TestWebViewClient : public WebViewClient { - public: - TestWebViewClient() = default; - ~TestWebViewClient() override = default; - - void DestroyChildViews(); - - // WebViewClient overrides. - WebView* CreateView( - WebLocalFrame* opener, - const WebURLRequest&, - const WebWindowFeatures&, - const WebString& name, - WebNavigationPolicy, - network::mojom::blink::WebSandboxFlags, - const SessionStorageNamespaceId&, - bool& consumed_user_gesture, - const absl::optional<Impression>&, - const absl::optional<WebPictureInPictureWindowOptions>&) override; - - private: - WTF::Vector<std::unique_ptr<WebViewHelper>> child_web_views_; -}; - using CreateTestWebFrameWidgetCallback = base::RepeatingCallback<TestWebFrameWidget*( base::PassKey<WebLocalFrame>, @@ -373,14 +348,14 @@ WebViewImpl* InitializeWithOpener( WebFrame* opener, TestWebFrameClient* = nullptr, - TestWebViewClient* = nullptr, + WebViewClient* = nullptr, void (*update_settings_func)(WebSettings*) = nullptr, absl::optional<mojom::blink::FencedFrameMode> fenced_frame_mode = absl::nullopt); // Same as InitializeWithOpener(), but always sets the opener to null. WebViewImpl* Initialize(TestWebFrameClient* = nullptr, - TestWebViewClient* = nullptr, + WebViewClient* = nullptr, void (*update_settings_func)(WebSettings*) = nullptr); // Same as InitializeWithOpener(), but passes null for everything but the @@ -393,12 +368,12 @@ WebViewImpl* InitializeAndLoad( const std::string& url, TestWebFrameClient* = nullptr, - TestWebViewClient* = nullptr, + WebViewClient* = nullptr, void (*update_settings_func)(WebSettings*) = nullptr); // Same as InitializeRemoteWithOpener(), but always sets the opener to null. WebViewImpl* InitializeRemote(scoped_refptr<SecurityOrigin> = nullptr, - TestWebViewClient* = nullptr); + WebViewClient* = nullptr); // Creates and initializes the WebView with a main WebRemoteFrame. Passing // nullptr as the SecurityOrigin results in a frame with a unique security @@ -406,7 +381,7 @@ WebViewImpl* InitializeRemoteWithOpener( WebFrame* opener, scoped_refptr<SecurityOrigin> = nullptr, - TestWebViewClient* = nullptr); + WebViewClient* = nullptr); // Helper for creating a local child frame of a remote parent frame. WebLocalFrameImpl* CreateLocalChild( @@ -483,7 +458,7 @@ private: void InitializeWebView( - TestWebViewClient*, + WebViewClient*, class WebView* opener, absl::optional<mojom::blink::FencedFrameMode> fenced_frame_mode); void CheckFrameIsAssociatedWithWebView(WebFrame* frame); @@ -492,8 +467,7 @@ WebViewImpl* web_view_; - std::unique_ptr<TestWebViewClient> owned_test_web_view_client_; - TestWebViewClient* test_web_view_client_ = nullptr; + std::unique_ptr<WebViewClient> owned_web_view_client_; std::unique_ptr<blink::scheduler::WebAgentGroupScheduler> agent_group_scheduler_; @@ -551,6 +525,16 @@ AssociatedInterfaceProvider* GetRemoteNavigationAssociatedInterfaces() override; void DidMeaningfulLayout(WebMeaningfulLayout) override; + WebView* CreateNewWindow( + const WebURLRequest&, + const WebWindowFeatures&, + const WebString& name, + WebNavigationPolicy, + network::mojom::blink::WebSandboxFlags, + const SessionStorageNamespaceId&, + bool& consumed_user_gesture, + const absl::optional<Impression>&, + const absl::optional<WebPictureInPictureWindowOptions>&) override; int VisuallyNonEmptyLayoutCount() const { return visually_non_empty_layout_count_; @@ -565,6 +549,8 @@ return sandbox_flags_; } + void DestroyChildViews(); + private: void CommitNavigation(std::unique_ptr<WebNavigationInfo>); @@ -590,6 +576,7 @@ network::mojom::WebSandboxFlags sandbox_flags_ = network::mojom::WebSandboxFlags::kNone; + WTF::Vector<std::unique_ptr<WebViewHelper>> child_web_views_; base::WeakPtrFactory<TestWebFrameClient> weak_factory_{this}; };
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.cc b/third_party/blink/renderer/core/frame/local_frame_view.cc index e0d2236..767b6bb 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -50,6 +50,7 @@ #include "components/paint_preview/common/paint_preview_tracker.h" #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h" #include "third_party/blink/public/mojom/scroll/scrollbar_mode.mojom-blink.h" #include "third_party/blink/public/platform/task_type.h"
diff --git a/third_party/blink/renderer/core/frame/navigator_language.cc b/third_party/blink/renderer/core/frame/navigator_language.cc index a7f1954..6e6fbaff 100644 --- a/third_party/blink/renderer/core/frame/navigator_language.cc +++ b/third_party/blink/renderer/core/frame/navigator_language.cc
@@ -6,7 +6,6 @@ #include "third_party/blink/renderer/core/probe/core_probes.h" #include "third_party/blink/renderer/platform/language.h" -#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" namespace blink { @@ -35,21 +34,12 @@ : execution_context_(execution_context) {} AtomicString NavigatorLanguage::language() { - if (RuntimeEnabledFeatures::NavigatorLanguageInInsecureContextEnabled() || - (execution_context_ && execution_context_->IsSecureContext())) { - return AtomicString(languages().front()); - } - return AtomicString(); + return AtomicString(languages().front()); } const Vector<String>& NavigatorLanguage::languages() { - if (RuntimeEnabledFeatures::NavigatorLanguageInInsecureContextEnabled() || - (execution_context_ && execution_context_->IsSecureContext())) { - EnsureUpdatedLanguage(); - return languages_; - } - DEFINE_STATIC_LOCAL(const Vector<String>, empty_vector, {}); - return empty_vector; + EnsureUpdatedLanguage(); + return languages_; } bool NavigatorLanguage::IsLanguagesDirty() const {
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index 712db8a30..23560ddc 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -10,8 +10,8 @@ #include "mojo/public/cpp/bindings/associated_remote.h" #include "services/network/public/mojom/web_sandbox_flags.mojom-blink-forward.h" #include "third_party/blink/public/common/frame/frame_visual_properties.h" -#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink.h" #include "third_party/blink/public/mojom/input/focus_type.mojom-blink-forward.h" #include "third_party/blink/public/mojom/scroll/scroll_into_view_params.mojom-blink.h" #include "third_party/blink/public/mojom/security_context/insecure_request_policy.mojom-blink-forward.h"
diff --git a/third_party/blink/renderer/core/frame/remote_frame_client.h b/third_party/blink/renderer/core/frame/remote_frame_client.h index 8c98daa..01f1c26 100644 --- a/third_party/blink/renderer/core/frame/remote_frame_client.h +++ b/third_party/blink/renderer/core/frame/remote_frame_client.h
@@ -7,8 +7,8 @@ #include "cc/paint/paint_canvas.h" #include "third_party/blink/public/common/tokens/tokens.h" -#include "third_party/blink/public/mojom/frame/frame.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom-blink-forward.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink-forward.h" #include "third_party/blink/public/mojom/frame/tree_scope_type.mojom-blink-forward.h" #include "third_party/blink/public/web/web_frame_load_type.h" #include "third_party/blink/renderer/core/frame/frame_client.h"
diff --git a/third_party/blink/renderer/core/frame/web_frame_test.cc b/third_party/blink/renderer/core/frame/web_frame_test.cc index e68ff1a..902b2db6 100644 --- a/third_party/blink/renderer/core/frame/web_frame_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_test.cc
@@ -7499,29 +7499,6 @@ .IsEquivalent(net::SiteForCookies::FromUrl(GURL(redirect)))); } -class TestNewWindowWebViewClient - : public frame_test_helpers::TestWebViewClient { - public: - TestNewWindowWebViewClient() = default; - ~TestNewWindowWebViewClient() override = default; - - // frame_test_helpers::TestWebFrameClient: - WebView* CreateView( - WebLocalFrame*, - const WebURLRequest&, - const WebWindowFeatures&, - const WebString&, - WebNavigationPolicy, - network::mojom::blink::WebSandboxFlags, - const SessionStorageNamespaceId&, - bool& consumed_user_gesture, - const absl::optional<Impression>&, - const absl::optional<WebPictureInPictureWindowOptions>&) override { - EXPECT_TRUE(false); - return nullptr; - } -}; - class TestNewWindowWebFrameClient : public frame_test_helpers::TestWebFrameClient { public: @@ -7537,6 +7514,20 @@ TestWebFrameClient::BeginNavigation(std::move(info)); } + WebView* CreateNewWindow( + const WebURLRequest&, + const WebWindowFeatures&, + const WebString&, + WebNavigationPolicy, + network::mojom::blink::WebSandboxFlags, + const SessionStorageNamespaceId&, + bool& consumed_user_gesture, + const absl::optional<Impression>&, + const absl::optional<WebPictureInPictureWindowOptions>&) override { + EXPECT_TRUE(false); + return nullptr; + } + int BeginNavigationCallCount() const { return begin_navigation_call_count_; } void IgnoreNavigations() { ignore_navigations_ = true; } @@ -7550,11 +7541,10 @@ // but instead goes to client to decide the navigation policy. RegisterMockedHttpURLLoad("ctrl_click.html"); RegisterMockedHttpURLLoad("hello_world.html"); - TestNewWindowWebViewClient web_view_client; TestNewWindowWebFrameClient web_frame_client; frame_test_helpers::WebViewHelper web_view_helper; web_view_helper.InitializeAndLoad(base_url_ + "ctrl_click.html", - &web_frame_client, &web_view_client); + &web_frame_client); auto* frame = To<LocalFrame>(web_view_helper.GetWebView()->GetPage()->MainFrame());
diff --git a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc index 8b9046f..a1b6f1a 100644 --- a/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc +++ b/third_party/blink/renderer/core/html/canvas/html_canvas_element.cc
@@ -747,13 +747,16 @@ kBackBuffer, gfx::ColorSpace::CreateREC709(), std::move(split_callback.first))) { TRACE_EVENT1("blink", "HTMLCanvasElement::NotifyListenersCanvasChanged", - "OneCopyCanvasCapture", true); + "one_copy_canvas_capture", true); continue; } } // If that fails, then create a StaticBitmapImage for the contents of // the RenderingContext. + TRACE_EVENT1("blink", "HTMLCanvasElement::NotifyListenersCanvasChanged", + "one_copy_canvas_capture", false); + if (!source_image) { SourceImageStatus status; source_image = GetSourceImageForCanvasInternal(&status);
diff --git a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc index ae72027c..fce81815 100644 --- a/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc +++ b/third_party/blink/renderer/core/html/forms/multiple_fields_temporal_input_type_view.cc
@@ -284,7 +284,7 @@ const String& value) { if (will_be_destroyed_) return; - if (GetElement().IsValidValue(value)) { + if (value.IsEmpty() || GetElement().IsValidValue(value)) { GetElement().SetValue(value, TextFieldEventBehavior::kDispatchInputEvent); return; }
diff --git a/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc b/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc index b1a79ed0..3c88616 100644 --- a/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc +++ b/third_party/blink/renderer/core/input/mouse_wheel_event_manager.cc
@@ -78,8 +78,6 @@ if ((event.phase & kWheelEventPhaseNoEventMask) || (event.momentum_phase & kWheelEventPhaseNoEventMask)) { - // Filter wheel events with zero deltas and reset the wheel_target_ node. - DCHECK(!event.delta_x && !event.delta_y); return WebInputEventResult::kNotHandled; }
diff --git a/third_party/blink/renderer/core/layout/build.gni b/third_party/blink/renderer/core/layout/build.gni index 425d05a..aebe220 100644 --- a/third_party/blink/renderer/core/layout/build.gni +++ b/third_party/blink/renderer/core/layout/build.gni
@@ -361,6 +361,10 @@ "ng/grid/ng_grid_item.h", "ng/grid/ng_grid_layout_algorithm.cc", "ng/grid/ng_grid_layout_algorithm.h", + "ng/grid/ng_grid_line_resolver.cc", + "ng/grid/ng_grid_line_resolver.h", + "ng/grid/ng_grid_named_line_collection.cc", + "ng/grid/ng_grid_named_line_collection.h", "ng/grid/ng_grid_node.cc", "ng/grid/ng_grid_node.h", "ng/grid/ng_grid_placement.cc",
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index 254a1e2..12806b4 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2691,16 +2691,19 @@ cache->LocationChanged(this); } + if (visibility_changed || style_->IsInert() != new_style.IsInert()) { + if (AXObjectCache* cache = GetDocument().ExistingAXObjectCache()) { + cache->ChildrenChanged(Parent()); + cache->ChildrenChanged(this); + } + } + // Keep layer hierarchy visibility bits up to date if visibility changes. if (visibility_changed) { // We might not have an enclosing layer yet because we might not be in the // tree. if (PaintLayer* layer = EnclosingLayer()) layer->DirtyVisibleContentStatus(); - if (AXObjectCache* cache = GetDocument().ExistingAXObjectCache()) { - cache->ChildrenChanged(Parent()); - cache->ChildrenChanged(this); - } GetDocument().GetFrame()->GetInputMethodController().DidChangeVisibility( *this); }
diff --git a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc index 0b421c9..fe9c4658 100644 --- a/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc +++ b/third_party/blink/renderer/core/layout/ng/flex/ng_flex_layout_algorithm.cc
@@ -1960,19 +1960,6 @@ item_contributions.sizes.Encompass(preferred_size); } - - // This block implements the "clamped" part of the 9.9.3: - // "the contribution is the larger of [stuff], clamped by its flex base size - // as a maximum (if it is not growable) and/or as a minimum (if it is not - // shrinkable)" - const LayoutUnit flex_base_size_border_box = - item.flex_base_content_size_ + item.main_axis_border_padding_; - const ComputedStyle& parent_style = Style(); - if (child_style.ResolvedFlexGrow(parent_style) == 0.f) - item_contributions.sizes.Constrain(flex_base_size_border_box); - if (child_style.ResolvedFlexShrink(parent_style) == 0.f) - item_contributions.sizes.Encompass(flex_base_size_border_box); - item_contributions.sizes.Constrain(item.min_max_main_sizes_.max_size + item.main_axis_border_padding_); item_contributions.sizes.Encompass(item.min_max_main_sizes_.min_size + @@ -1986,33 +1973,59 @@ : parent_style_(parent_style) {} // After we find the largest flex fraction, this function calculates the // product from https://drafts.csswg.org/css-flexbox/#intrinsic-main-sizes, - // step 3: + // step 4: // "Add each item’s flex base size to the product of its flex grow factor (or // scaled flex shrink factor, if the chosen max-content flex fraction was - // negative) and the chosen max-content flex fraction" + // negative) and the chosen flex fraction" LayoutUnit ApplyLargestFlexFractionToItem(const ComputedStyle& child_style, LayoutUnit flex_base_content_size) { - if (flex_fraction_ > 0.f) { + if (chosen_flex_fraction_ == std::numeric_limits<float>::lowest()) { + // All the items wanted to shrink from their flex basis to get to their + // min-content size, but all had flex-shrink = 0. + DCHECK_EQ(numerator_, LayoutUnit()); + return LayoutUnit(); + } + + if (chosen_flex_fraction_ > 0.f) { DCHECK(!denominator_pixels_part_.has_value()); - return LayoutUnit((child_style.ResolvedFlexGrow(parent_style_) / - denominator_float_part_) * - numerator_); - } - if (flex_fraction_ < 0.f) { + DCHECK_GT(sum_factors_less_than_one_adjustment_, 0.f) + << "If all the flex grow factors were == 0, then " + "chosen_flex_fraction_ can't be positive"; return LayoutUnit( - (child_style.ResolvedFlexShrink(parent_style_) / - denominator_float_part_) * - flex_base_content_size.MulDiv(numerator_, *denominator_pixels_part_)); + numerator_ * + (child_style.ResolvedFlexGrow(parent_style_) / + (sum_factors_less_than_one_adjustment_ * denominator_float_part_))); } - DCHECK_EQ(numerator_, LayoutUnit()); - DCHECK_EQ(denominator_float_part_, 1.f); - DCHECK(!denominator_pixels_part_.has_value()); + if (chosen_flex_fraction_ < 0.f) { + return LayoutUnit( + flex_base_content_size.MulDiv(numerator_, *denominator_pixels_part_) * + (sum_factors_less_than_one_adjustment_ * + child_style.ResolvedFlexShrink(parent_style_) / + denominator_float_part_)); + } + // Control-flow reaches here if the item that contributed the chosen flex + // fraction had (1) a flex base size smaller than max-content contribution + // size and grow factor 0 (it wants to grow but it can't); OR (2) a flex + // base size equal to its max-content contribution size. + DCHECK(!denominator_pixels_part_.has_value()) + << "We're not supposed to get here if the chosen flex " + "fraction was from an item with a negative desired flex fraction, " + "which is the only time |denominator_pixels_part_| has a value."; return LayoutUnit(); } + // This function does 9.9.1 step 1 and 2: calculate the item's desired flex + // fraction (step 1) and save it if it's the largest (step 2). void UpdateLargestFlexFraction(const FlexItem& item, LayoutUnit item_contribution) { const ComputedStyle& child_style = item.style_; + + const float flex_grow_factor = child_style.ResolvedFlexGrow(parent_style_); + sum_flex_grow_factors_ += flex_grow_factor; + const float flex_shrink_factor = + child_style.ResolvedFlexShrink(parent_style_); + sum_flex_shrink_factors_ += flex_shrink_factor; + // |difference| is contribution - flex_basis, which can be negative because // item contributions can be smaller than the item's flex base size. LayoutUnit difference = item_contribution - item.flex_base_content_size_ - @@ -2023,13 +2036,16 @@ // fraction will be positive and the container's max-content size (or // min-content size, whichever this object is associated with) will be // greater than the sum of the items' flex bases. - const float floored_flex_grow_factor = - std::max(1.0f, child_style.ResolvedFlexGrow(parent_style_)); - const float item_flex_fraction = difference / floored_flex_grow_factor; - if (item_flex_fraction > flex_fraction_) { - flex_fraction_ = item_flex_fraction; + float desired_flex_fraction = difference; + if (flex_grow_factor >= 1.f) + desired_flex_fraction /= flex_grow_factor; + else + desired_flex_fraction *= flex_grow_factor; + if (desired_flex_fraction > chosen_flex_fraction_) { + chosen_flex_fraction_ = desired_flex_fraction; numerator_ = difference; - denominator_float_part_ = floored_flex_grow_factor; + denominator_float_part_ = + flex_grow_factor >= 1.f ? flex_grow_factor : 1 / flex_grow_factor; denominator_pixels_part_.reset(); } } else if (difference < LayoutUnit()) { @@ -2037,25 +2053,29 @@ // will be negative and the container's max-content (or min-content) size // will be less than the sum of the items' flex bases, but still most // likely greater than the sum of each item's contribution. - const float floored_flex_shrink_factor = - std::max(1.0f, child_style.ResolvedFlexShrink(parent_style_)); - const float item_flex_fraction = - difference / - (item.flex_base_content_size_ * floored_flex_shrink_factor); - if (item_flex_fraction > flex_fraction_) { - flex_fraction_ = item_flex_fraction; + const float scaled_flex_shrink_factor = + item.flex_base_content_size_ * flex_shrink_factor; + if (scaled_flex_shrink_factor == 0.f) { + // If the desired flex fraction is -infinity, it should never become the + // chosen flex fraction. + return; + } + const float desired_flex_fraction = + difference / scaled_flex_shrink_factor; + if (desired_flex_fraction > chosen_flex_fraction_) { + chosen_flex_fraction_ = desired_flex_fraction; numerator_ = difference; - denominator_float_part_ = floored_flex_shrink_factor; + denominator_float_part_ = flex_shrink_factor; denominator_pixels_part_ = item.flex_base_content_size_; } } else { - // This item's flex basis was exactly equal to its contribution size. If - // we end up in either this block or the previous block for every item, - // then whichever intrinsic size is represented by this object (min or - // max) will be equal to the sum of the items' flex bases. + // This item's flex basis was equal to its contribution size. If + // every item enters either this block or the previous block then + // the intrinsic size represented by this object (either min or max) + // will be equal to the sum of the items' flex bases. DCHECK_EQ(difference, LayoutUnit()); - if (difference > flex_fraction_) { - flex_fraction_ = 0.f; + if (difference > chosen_flex_fraction_) { + chosen_flex_fraction_ = 0.f; numerator_ = difference; denominator_float_part_ = 1.f; denominator_pixels_part_.reset(); @@ -2063,18 +2083,40 @@ } } - private: - float flex_fraction_ = std::numeric_limits<float>::lowest(); + // This function sets up sum_factors_less_than_one_adjustment_ to handle 9.9.1 + // step 3: + // If the chosen flex fraction is positive, and the sum of the line’s + // flex grow factors is less than 1, divide the chosen flex fraction by that + // sum. + // If the chosen flex fraction is negative, and the sum of the line’s + // flex shrink factors is less than 1, multiply the chosen flex fraction by + // that sum. + void SetSumFactorsLessThanOneAdjustment() { + if (chosen_flex_fraction_ > 0.f && sum_flex_grow_factors_ < 1.f) { + DCHECK_GT(sum_flex_grow_factors_, 0.f) + << "If all the flex grow factors were == 0, then " + "chosen_flex_fraction can't be positive"; + sum_factors_less_than_one_adjustment_ = sum_flex_grow_factors_; + } else if (chosen_flex_fraction_ < 0.f && sum_flex_shrink_factors_ < 1.f) { + sum_factors_less_than_one_adjustment_ = sum_flex_shrink_factors_; + } + } - // We have to store the individual components of the flex fraction so that we - // can multiply them in an order that doesn't have precision issues. + private: + float chosen_flex_fraction_ = std::numeric_limits<float>::lowest(); + + // We have to store these individual components of the flex fraction so that + // we can multiply them in an order that minimizes precision issues. LayoutUnit numerator_; float denominator_float_part_; // This optional field is filled when we use scaled flex shrink factor as // dictated in step 1 from // https://drafts.csswg.org/css-flexbox/#intrinsic-main-sizes. absl::optional<LayoutUnit> denominator_pixels_part_; + float sum_factors_less_than_one_adjustment_ = 1.f; + float sum_flex_shrink_factors_ = 0; + float sum_flex_grow_factors_ = 0; const ComputedStyle& parent_style_; }; @@ -2107,6 +2149,8 @@ max_content_largest_fraction.UpdateLargestFlexFraction( item, min_max_content_contributions.sizes.max_size); } + min_content_largest_fraction.SetSumFactorsLessThanOneAdjustment(); + max_content_largest_fraction.SetSumFactorsLessThanOneAdjustment(); return std::tuple(min_content_largest_fraction, max_content_largest_fraction, depends_on_block_constraints);
diff --git a/third_party/blink/renderer/core/layout/ng/grid/layout_ng_grid.cc b/third_party/blink/renderer/core/layout/ng/grid/layout_ng_grid.cc index 58dab9aa..278388e 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/layout_ng_grid.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/layout_ng_grid.cc
@@ -3,6 +3,8 @@ // found in the LICENSE file. #include "third_party/blink/renderer/core/layout/ng/grid/layout_ng_grid.h" + +#include "third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h" #include "third_party/blink/renderer/core/layout/ng/ng_layout_result.h" namespace blink { @@ -170,12 +172,12 @@ : cached_placement_data_.row_subgrid_span_size; const wtf_size_t explicit_grid_track_count = - is_for_columns ? GridPositionsResolver::ExplicitGridColumnCount( + is_for_columns ? NGGridLineResolver::ExplicitGridColumnCount( StyleRef(), AutoRepeatCountForDirection(kForColumns), - /* is_ng_grid */ true, subgrid_span_size) - : GridPositionsResolver::ExplicitGridRowCount( + subgrid_span_size) + : NGGridLineResolver::ExplicitGridRowCount( StyleRef(), AutoRepeatCountForDirection(kForRows), - /* is_ng_grid */ true, subgrid_span_size); + subgrid_span_size); return base::checked_cast<wtf_size_t>( ExplicitGridStartForDirection(track_direction) +
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc new file mode 100644 index 0000000..3a96bfec --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.cc
@@ -0,0 +1,425 @@ +// 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 "third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h" + +#include <algorithm> +#include "third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h" +#include "third_party/blink/renderer/core/style/computed_style.h" +#include "third_party/blink/renderer/core/style/grid_area.h" +#include "third_party/blink/renderer/core/style/grid_position.h" + +namespace blink { + +static inline GridTrackSizingDirection DirectionFromSide( + GridPositionSide side) { + return side == kColumnStartSide || side == kColumnEndSide ? kForColumns + : kForRows; +} + +static inline String ImplicitNamedGridLineForSide(const String& line_name, + GridPositionSide side) { + return line_name + ((side == kColumnStartSide || side == kRowStartSide) + ? "-start" + : "-end"); +} + +static void InitialAndFinalPositionsFromStyle( + const ComputedStyle& grid_item_style, + GridTrackSizingDirection track_direction, + GridPosition& initial_position, + GridPosition& final_position) { + const bool is_for_columns = track_direction == kForColumns; + initial_position = is_for_columns ? grid_item_style.GridColumnStart() + : grid_item_style.GridRowStart(); + final_position = is_for_columns ? grid_item_style.GridColumnEnd() + : grid_item_style.GridRowEnd(); + + // We must handle the placement error handling code here instead of in the + // StyleAdjuster because we don't want to overwrite the specified values. + if (initial_position.IsSpan() && final_position.IsSpan()) + final_position.SetAutoPosition(); + + // If the grid item has an automatic position and a grid span for a named line + // in a given dimension, instead treat the grid span as one. + if (initial_position.IsAuto() && final_position.IsSpan() && + !final_position.NamedGridLine().IsNull()) { + final_position.SetSpanPosition(1, g_null_atom); + } + if (final_position.IsAuto() && initial_position.IsSpan() && + !initial_position.NamedGridLine().IsNull()) { + initial_position.SetSpanPosition(1, g_null_atom); + } +} + +static wtf_size_t LookAheadForNamedGridLine( + int start, + wtf_size_t number_of_lines, + wtf_size_t grid_last_line, + NGGridNamedLineCollection& lines_collection) { + DCHECK(number_of_lines); + + // Only implicit lines on the search direction are assumed to have the given + // name, so we can start to look from first line. + // See: https://drafts.csswg.org/css-grid/#grid-placement-span-int + wtf_size_t end = std::max(start, 0); + + if (!lines_collection.HasNamedLines()) { + end = std::max(end, grid_last_line + 1); + return end + number_of_lines - 1; + } + + for (; number_of_lines; ++end) { + if (end > grid_last_line || lines_collection.Contains(end)) + number_of_lines--; + } + + DCHECK(end); + return end - 1; +} + +static int LookBackForNamedGridLine( + int end, + wtf_size_t number_of_lines, + int grid_last_line, + NGGridNamedLineCollection& lines_collection) { + DCHECK(number_of_lines); + + // Only implicit lines on the search direction are assumed to have the given + // name, so we can start to look from last line. + // See: https://drafts.csswg.org/css-grid/#grid-placement-span-int + int start = std::min(end, grid_last_line); + + if (!lines_collection.HasNamedLines()) { + start = std::min(start, -1); + return start - number_of_lines + 1; + } + + for (; number_of_lines; --start) { + if (start < 0 || lines_collection.Contains(start)) + number_of_lines--; + } + + return start + 1; +} + +static GridSpan DefiniteGridSpanWithNamedSpanAgainstOpposite( + int opposite_line, + const GridPosition& position, + GridPositionSide side, + int last_line, + NGGridNamedLineCollection& lines_collection) { + int start, end; + if (side == kRowStartSide || side == kColumnStartSide) { + start = LookBackForNamedGridLine(opposite_line - 1, position.SpanPosition(), + last_line, lines_collection); + end = opposite_line; + } else { + start = opposite_line; + end = LookAheadForNamedGridLine(opposite_line + 1, position.SpanPosition(), + last_line, lines_collection); + } + + return GridSpan::UntranslatedDefiniteGridSpan(start, end); +} + +wtf_size_t NGGridLineResolver::ExplicitGridColumnCount( + const ComputedStyle& grid_container_style, + wtf_size_t auto_repeat_tracks_count, + wtf_size_t subgrid_span_size) { + if (subgrid_span_size != kNotFound) + return subgrid_span_size; + + const auto& track_list = + grid_container_style.GridTemplateColumns().track_sizes; + const wtf_size_t total_track_count = + track_list.NGTrackList().TrackCountWithoutAutoRepeat(); + + return std::min<wtf_size_t>( + std::max(total_track_count + auto_repeat_tracks_count, + grid_container_style.NamedGridAreaColumnCount()), + kGridMaxTracks); +} + +wtf_size_t NGGridLineResolver::ExplicitGridRowCount( + const ComputedStyle& grid_container_style, + wtf_size_t auto_repeat_tracks_count, + wtf_size_t subgrid_span_size) { + if (subgrid_span_size != kNotFound) + return subgrid_span_size; + + const auto& track_list = grid_container_style.GridTemplateRows().track_sizes; + const wtf_size_t total_track_count = + track_list.NGTrackList().TrackCountWithoutAutoRepeat(); + + return std::min<wtf_size_t>( + std::max(total_track_count + auto_repeat_tracks_count, + grid_container_style.NamedGridAreaRowCount()), + kGridMaxTracks); +} + +static wtf_size_t ExplicitGridSizeForSide( + const ComputedStyle& grid_container_style, + GridPositionSide side, + wtf_size_t auto_repeat_tracks_count, + wtf_size_t subgrid_span_size) { + return (side == kColumnStartSide || side == kColumnEndSide) + ? NGGridLineResolver::ExplicitGridColumnCount( + grid_container_style, auto_repeat_tracks_count, + subgrid_span_size) + : NGGridLineResolver::ExplicitGridRowCount( + grid_container_style, auto_repeat_tracks_count, + subgrid_span_size); +} + +static GridSpan ResolveNamedGridLinePositionAgainstOppositePosition( + const ComputedStyle& grid_container_style, + int opposite_line, + const GridPosition& position, + wtf_size_t auto_repeat_tracks_count, + GridPositionSide side, + wtf_size_t subgrid_span_size) { + DCHECK(position.IsSpan()); + DCHECK(!position.NamedGridLine().IsNull()); + // Negative positions are not allowed per the specification and should have + // been handled during parsing. + DCHECK_GT(position.SpanPosition(), 0); + + wtf_size_t last_line = ExplicitGridSizeForSide( + grid_container_style, side, auto_repeat_tracks_count, subgrid_span_size); + NGGridNamedLineCollection lines_collection( + grid_container_style, position.NamedGridLine(), DirectionFromSide(side), + last_line, auto_repeat_tracks_count); + return DefiniteGridSpanWithNamedSpanAgainstOpposite( + opposite_line, position, side, last_line, lines_collection); +} + +static GridSpan DefiniteGridSpanWithSpanAgainstOpposite( + int opposite_line, + const GridPosition& position, + GridPositionSide side) { + wtf_size_t position_offset = position.SpanPosition(); + if (side == kColumnStartSide || side == kRowStartSide) { + return GridSpan::UntranslatedDefiniteGridSpan( + opposite_line - position_offset, opposite_line); + } + + return GridSpan::UntranslatedDefiniteGridSpan( + opposite_line, opposite_line + position_offset); +} + +static GridSpan ResolveGridPositionAgainstOppositePosition( + const ComputedStyle& grid_container_style, + int opposite_line, + const GridPosition& position, + GridPositionSide side, + wtf_size_t auto_repeat_tracks_count, + wtf_size_t subgrid_span_size) { + if (position.IsAuto()) { + if (side == kColumnStartSide || side == kRowStartSide) { + return GridSpan::UntranslatedDefiniteGridSpan(opposite_line - 1, + opposite_line); + } + return GridSpan::UntranslatedDefiniteGridSpan(opposite_line, + opposite_line + 1); + } + + DCHECK(position.IsSpan()); + DCHECK_GT(position.SpanPosition(), 0); + + if (!position.NamedGridLine().IsNull()) { + // span 2 'c' -> we need to find the appropriate grid line before / after + // our opposite position. + return ResolveNamedGridLinePositionAgainstOppositePosition( + grid_container_style, opposite_line, position, auto_repeat_tracks_count, + side, subgrid_span_size); + } + + return DefiniteGridSpanWithSpanAgainstOpposite(opposite_line, position, side); +} + +static wtf_size_t SpanSizeFromPositions(const GridPosition& initial_position, + const GridPosition& final_position) { + // This method will only be used when both positions need to be resolved + // against the opposite one. + DCHECK(initial_position.ShouldBeResolvedAgainstOppositePosition() && + final_position.ShouldBeResolvedAgainstOppositePosition()); + + if (initial_position.IsAuto() && final_position.IsAuto()) + return 1; + + const GridPosition& span_position = + initial_position.IsSpan() ? initial_position : final_position; + DCHECK(span_position.IsSpan() && span_position.SpanPosition()); + return span_position.SpanPosition(); +} + +wtf_size_t NGGridLineResolver::SpanSizeForAutoPlacedItem( + const ComputedStyle& grid_item_style, + GridTrackSizingDirection track_direction) { + GridPosition initial_position, final_position; + InitialAndFinalPositionsFromStyle(grid_item_style, track_direction, + initial_position, final_position); + return SpanSizeFromPositions(initial_position, final_position); +} + +static int ResolveNamedGridLinePositionFromStyle( + const ComputedStyle& grid_container_style, + const GridPosition& position, + GridPositionSide side, + wtf_size_t auto_repeat_tracks_count, + wtf_size_t subgrid_span_size) { + DCHECK(!position.NamedGridLine().IsNull()); + + wtf_size_t last_line = ExplicitGridSizeForSide( + grid_container_style, side, auto_repeat_tracks_count, subgrid_span_size); + NGGridNamedLineCollection lines_collection( + grid_container_style, position.NamedGridLine(), DirectionFromSide(side), + last_line, auto_repeat_tracks_count); + + if (position.IsPositive()) { + return LookAheadForNamedGridLine(0, abs(position.IntegerPosition()), + last_line, lines_collection); + } + + return LookBackForNamedGridLine(last_line, abs(position.IntegerPosition()), + last_line, lines_collection); +} + +static int ResolveGridPositionFromStyle( + const ComputedStyle& grid_container_style, + const GridPosition& position, + GridPositionSide side, + wtf_size_t auto_repeat_tracks_count, + bool is_parent_grid_container, + wtf_size_t subgrid_span_size) { + switch (position.GetType()) { + case kExplicitPosition: { + DCHECK(position.IntegerPosition()); + + if (!position.NamedGridLine().IsNull()) { + return ResolveNamedGridLinePositionFromStyle( + grid_container_style, position, side, auto_repeat_tracks_count, + subgrid_span_size); + } + + // Handle <integer> explicit position. + if (position.IsPositive()) + return position.IntegerPosition() - 1; + + wtf_size_t resolved_position = abs(position.IntegerPosition()) - 1; + wtf_size_t end_of_track = + ExplicitGridSizeForSide(grid_container_style, side, + auto_repeat_tracks_count, subgrid_span_size); + + return end_of_track - resolved_position; + } + case kNamedGridAreaPosition: { + // First attempt to match the grid area's edge to a named grid area: if + // there is a named line with the name ''<custom-ident>-start (for + // grid-*-start) / <custom-ident>-end'' (for grid-*-end), contributes the + // first such line to the grid item's placement. + String named_grid_line = position.NamedGridLine(); + DCHECK(!position.NamedGridLine().IsNull()); + + wtf_size_t last_line = + ExplicitGridSizeForSide(grid_container_style, side, + auto_repeat_tracks_count, subgrid_span_size); + NGGridNamedLineCollection implicit_lines( + grid_container_style, + ImplicitNamedGridLineForSide(named_grid_line, side), + DirectionFromSide(side), last_line, auto_repeat_tracks_count); + if (implicit_lines.HasNamedLines()) + return implicit_lines.FirstPosition(); + + // Otherwise, if there is a named line with the specified name, + // contributes the first such line to the grid item's placement. + NGGridNamedLineCollection explicit_lines( + grid_container_style, named_grid_line, DirectionFromSide(side), + last_line, auto_repeat_tracks_count, is_parent_grid_container); + if (explicit_lines.HasNamedLines()) + return explicit_lines.FirstPosition(); + + // If none of the above works specs mandate to assume that all the lines + // in the implicit grid have this name. + return last_line + 1; + } + case kAutoPosition: + case kSpanPosition: + // 'auto' and span depend on the opposite position for resolution (e.g. + // grid-row: auto / 1 or grid-column: span 3 / "myHeader"). + NOTREACHED(); + return 0; + } + NOTREACHED(); + return 0; +} + +GridSpan NGGridLineResolver::ResolveGridPositionsFromStyle( + const ComputedStyle& grid_container_style, + const ComputedStyle& grid_item_style, + GridTrackSizingDirection track_direction, + wtf_size_t auto_repeat_tracks_count, + bool is_parent_grid_container, + wtf_size_t subgrid_span_size) { + GridPosition initial_position, final_position; + InitialAndFinalPositionsFromStyle(grid_item_style, track_direction, + initial_position, final_position); + + const bool initial_should_be_resolved_against_opposite_position = + initial_position.ShouldBeResolvedAgainstOppositePosition(); + const bool final_should_be_resolved_against_opposite_position = + final_position.ShouldBeResolvedAgainstOppositePosition(); + + if (initial_should_be_resolved_against_opposite_position && + final_should_be_resolved_against_opposite_position) { + // We can't get our grid positions without running the auto placement + // algorithm. + return GridSpan::IndefiniteGridSpan( + SpanSizeFromPositions(initial_position, final_position)); + } + + const GridPositionSide initial_side = + (track_direction == kForColumns) ? kColumnStartSide : kRowStartSide; + const GridPositionSide final_side = + (track_direction == kForColumns) ? kColumnEndSide : kRowEndSide; + + if (initial_should_be_resolved_against_opposite_position) { + // Infer the position from the final_position position ('auto / 1' or 'span + // 2 / 3' case). + int end_line = ResolveGridPositionFromStyle( + grid_container_style, final_position, final_side, + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); + return ResolveGridPositionAgainstOppositePosition( + grid_container_style, end_line, initial_position, initial_side, + auto_repeat_tracks_count, subgrid_span_size); + } + + if (final_should_be_resolved_against_opposite_position) { + // Infer our position from the initial_position position ('1 / auto' or '3 / + // span 2' case). + int start_line = ResolveGridPositionFromStyle( + grid_container_style, initial_position, initial_side, + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); + return ResolveGridPositionAgainstOppositePosition( + grid_container_style, start_line, final_position, final_side, + auto_repeat_tracks_count, subgrid_span_size); + } + + int start_line = ResolveGridPositionFromStyle( + grid_container_style, initial_position, initial_side, + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); + int end_line = ResolveGridPositionFromStyle( + grid_container_style, final_position, final_side, + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); + + if (end_line < start_line) + std::swap(end_line, start_line); + else if (end_line == start_line) + end_line = start_line + 1; + + return GridSpan::UntranslatedDefiniteGridSpan(start_line, end_line); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h new file mode 100644 index 0000000..0c4dec8f --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h
@@ -0,0 +1,47 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_LINE_RESOLVER_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_LINE_RESOLVER_H_ + +#include "third_party/blink/renderer/core/style/grid_enums.h" +#include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "third_party/blink/renderer/platform/wtf/wtf_size_t.h" + +namespace blink { + +struct GridSpan; +class ComputedStyle; + +// This is a utility class with all the code related to grid items positions +// resolution. +class NGGridLineResolver { + DISALLOW_NEW(); + + public: + static wtf_size_t ExplicitGridColumnCount( + const ComputedStyle&, + wtf_size_t auto_repeat_columns_count, + wtf_size_t subgrid_span_size = kNotFound); + + static wtf_size_t ExplicitGridRowCount( + const ComputedStyle&, + wtf_size_t auto_repeat_rows_count, + wtf_size_t subgrid_span_size = kNotFound); + + static wtf_size_t SpanSizeForAutoPlacedItem(const ComputedStyle&, + GridTrackSizingDirection); + + static GridSpan ResolveGridPositionsFromStyle( + const ComputedStyle&, + const ComputedStyle&, + GridTrackSizingDirection, + wtf_size_t auto_repeat_tracks_count, + bool is_parent_grid_container = false, + wtf_size_t subgrid_span_size = kNotFound); +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_LINE_RESOLVER_H_
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc new file mode 100644 index 0000000..a1b2822c --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.cc
@@ -0,0 +1,154 @@ +// 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 "third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h" + +#include <algorithm> +#include "third_party/blink/renderer/core/style/computed_grid_track_list.h" +#include "third_party/blink/renderer/core/style/computed_style.h" +#include "third_party/blink/renderer/core/style/grid_area.h" +#include "third_party/blink/renderer/core/style/grid_positions_resolver.h" + +namespace blink { + +NGGridNamedLineCollection::NGGridNamedLineCollection( + const ComputedStyle& grid_container_style, + const String& named_line, + GridTrackSizingDirection track_direction, + wtf_size_t last_line, + wtf_size_t auto_repeat_tracks_count, + bool is_parent_grid_container) + : last_line_(last_line), + auto_repeat_total_tracks_(auto_repeat_tracks_count) { + const bool is_for_columns = track_direction == kForColumns; + const ComputedGridTrackList& computed_grid_track_list = + is_for_columns ? grid_container_style.GridTemplateColumns() + : grid_container_style.GridTemplateRows(); + is_standalone_grid_ = + computed_grid_track_list.axis_type == GridAxisType::kStandaloneAxis; + + // Line names from the container style are valid when the grid axis type is a + // standalone grid or the axis is a subgrid and the parent is a grid. See: + // https://www.w3.org/TR/css-grid-2/#subgrid-listing + bool are_named_lines_valid = true; + if (RuntimeEnabledFeatures::LayoutNGSubgridEnabled()) + are_named_lines_valid = is_parent_grid_container || is_standalone_grid_; + + const NamedGridLinesMap& grid_line_names = + computed_grid_track_list.named_grid_lines; + const NamedGridLinesMap& auto_repeat_grid_line_names = + computed_grid_track_list.auto_repeat_named_grid_lines; + const NamedGridLinesMap& implicit_grid_line_names = + is_for_columns ? grid_container_style.ImplicitNamedGridColumnLines() + : grid_container_style.ImplicitNamedGridRowLines(); + + if (!grid_line_names.IsEmpty() && are_named_lines_valid) { + auto it = grid_line_names.find(named_line); + named_lines_indexes_ = it == grid_line_names.end() ? nullptr : &it->value; + } + + if (!auto_repeat_grid_line_names.IsEmpty() && are_named_lines_valid) { + auto it = auto_repeat_grid_line_names.find(named_line); + auto_repeat_named_lines_indexes_ = + it == auto_repeat_grid_line_names.end() ? nullptr : &it->value; + } + + if (!implicit_grid_line_names.IsEmpty()) { + auto it = implicit_grid_line_names.find(named_line); + implicit_named_lines_indexes_ = + it == implicit_grid_line_names.end() ? nullptr : &it->value; + } + + insertion_point_ = computed_grid_track_list.auto_repeat_insertion_point; + auto_repeat_track_list_length_ = + computed_grid_track_list.TrackList().AutoRepeatTrackCount(); +} + +bool NGGridNamedLineCollection::HasExplicitNamedLines() { + return named_lines_indexes_ || auto_repeat_named_lines_indexes_; +} + +bool NGGridNamedLineCollection::HasNamedLines() { + return HasExplicitNamedLines() || implicit_named_lines_indexes_; +} + +bool NGGridNamedLineCollection::Contains(wtf_size_t line) { + CHECK(HasNamedLines()); + + if (line > last_line_) + return false; + + auto find = [](const Vector<wtf_size_t>* indexes, wtf_size_t line) { + return indexes && indexes->Find(line) != kNotFound; + }; + + if (find(implicit_named_lines_indexes_, line)) + return true; + + if (auto_repeat_track_list_length_ == 0 || line < insertion_point_) + return find(named_lines_indexes_, line); + + DCHECK(auto_repeat_total_tracks_); + + if (line > insertion_point_ + auto_repeat_total_tracks_) + return find(named_lines_indexes_, line - (auto_repeat_total_tracks_ - 1)); + + if (line == insertion_point_) { + return find(named_lines_indexes_, line) || + find(auto_repeat_named_lines_indexes_, 0); + } + + if (line == insertion_point_ + auto_repeat_total_tracks_) { + return find(auto_repeat_named_lines_indexes_, + auto_repeat_track_list_length_) || + find(named_lines_indexes_, insertion_point_ + 1); + } + + wtf_size_t auto_repeat_index_in_first_repetition = + (line - insertion_point_) % auto_repeat_track_list_length_; + if (!auto_repeat_index_in_first_repetition && + find(auto_repeat_named_lines_indexes_, auto_repeat_track_list_length_)) { + return true; + } + return find(auto_repeat_named_lines_indexes_, + auto_repeat_index_in_first_repetition); +} + +wtf_size_t NGGridNamedLineCollection::FirstExplicitPosition() { + DCHECK(HasExplicitNamedLines()); + + wtf_size_t first_line = 0; + + // If it is an standalone grid and there is no auto repeat(), there must be + // some named line outside, return the 1st one. Also return it if it precedes + // the auto-repeat(). + if ((is_standalone_grid_ && auto_repeat_track_list_length_ == 0) || + (named_lines_indexes_ && + named_lines_indexes_->at(first_line) <= insertion_point_)) { + return named_lines_indexes_->at(first_line); + } + + // Return the 1st named line inside the auto repeat(), if any. + if (auto_repeat_named_lines_indexes_) + return auto_repeat_named_lines_indexes_->at(first_line) + insertion_point_; + + // The 1st named line must be after the auto repeat(). + return named_lines_indexes_->at(first_line) + auto_repeat_total_tracks_ - 1; +} + +wtf_size_t NGGridNamedLineCollection::FirstPosition() { + CHECK(HasNamedLines()); + + if (!implicit_named_lines_indexes_) + return FirstExplicitPosition(); + + wtf_size_t first_line = 0; + if (!HasExplicitNamedLines()) + return implicit_named_lines_indexes_->at(first_line); + + return std::min(FirstExplicitPosition(), + implicit_named_lines_indexes_->at(first_line)); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h new file mode 100644 index 0000000..dc0c17a --- /dev/null +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_named_line_collection.h
@@ -0,0 +1,48 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_NAMED_LINE_COLLECTION_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_NAMED_LINE_COLLECTION_H_ + +#include "third_party/blink/renderer/core/style/grid_enums.h" +#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" + +namespace blink { + +class ComputedStyle; + +class NGGridNamedLineCollection { + public: + NGGridNamedLineCollection(const ComputedStyle&, + const String& named_line, + GridTrackSizingDirection, + wtf_size_t last_line, + wtf_size_t auto_repeat_tracks_count, + bool is_parent_grid_container = false); + + NGGridNamedLineCollection(const NGGridNamedLineCollection&) = delete; + NGGridNamedLineCollection& operator=(const NGGridNamedLineCollection&) = + delete; + + bool HasNamedLines(); + wtf_size_t FirstPosition(); + + bool Contains(wtf_size_t line); + + private: + bool HasExplicitNamedLines(); + wtf_size_t FirstExplicitPosition(); + const Vector<wtf_size_t>* named_lines_indexes_ = nullptr; + const Vector<wtf_size_t>* auto_repeat_named_lines_indexes_ = nullptr; + const Vector<wtf_size_t>* implicit_named_lines_indexes_ = nullptr; + + bool is_standalone_grid_; + wtf_size_t insertion_point_; + wtf_size_t last_line_; + wtf_size_t auto_repeat_total_tracks_; + wtf_size_t auto_repeat_track_list_length_; +}; +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_LAYOUT_NG_GRID_NG_GRID_NAMED_LINE_COLLECTION_H_
diff --git a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc index 517299e6..30e7516e 100644 --- a/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc +++ b/third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/core/layout/ng/grid/ng_grid_placement.h" +#include "third_party/blink/renderer/core/layout/ng/grid/ng_grid_line_resolver.h" + namespace blink { namespace { @@ -135,15 +137,15 @@ const auto& item_style = grid_item.node.Style(); GridArea position; - position.columns = GridPositionsResolver::ResolveGridPositionsFromStyle( + position.columns = NGGridLineResolver::ResolveGridPositionsFromStyle( grid_style_, item_style, kForColumns, column_auto_repeat_track_count_, - /* is_ng_grid */ true, placement_data_.is_parent_grid_container, + placement_data_.is_parent_grid_container, placement_data_.column_subgrid_span_size); DCHECK(!position.columns.IsTranslatedDefinite()); - position.rows = GridPositionsResolver::ResolveGridPositionsFromStyle( + position.rows = NGGridLineResolver::ResolveGridPositionsFromStyle( grid_style_, item_style, kForRows, row_auto_repeat_track_count_, - /* is_ng_grid */ true, placement_data_.is_parent_grid_container, + placement_data_.is_parent_grid_container, placement_data_.row_subgrid_span_size); DCHECK(!position.rows.IsTranslatedDefinite()); @@ -169,14 +171,12 @@ minor_max_end_line_ = (minor_direction_ == kForColumns) ? placement_data_.column_start_offset + - GridPositionsResolver::ExplicitGridColumnCount( + NGGridLineResolver::ExplicitGridColumnCount( grid_style_, column_auto_repeat_track_count_, - /* is_ng_grid */ true, placement_data_.column_subgrid_span_size) : placement_data_.row_start_offset + - GridPositionsResolver::ExplicitGridRowCount( + NGGridLineResolver::ExplicitGridRowCount( grid_style_, row_auto_repeat_track_count_, - /* is_ng_grid */ true, placement_data_.row_subgrid_span_size); placed_items->needs_to_sort_item_vector = false; @@ -675,9 +675,9 @@ DCHECK(start_line && end_line); const GridTrackSizingDirection track_direction = track_collection.Direction(); - GridSpan span = GridPositionsResolver::ResolveGridPositionsFromStyle( + GridSpan span = NGGridLineResolver::ResolveGridPositionsFromStyle( grid_style_, out_of_flow_item_style, track_direction, - AutoRepeatTrackCount(track_direction), /* is_ng_grid */ true, + AutoRepeatTrackCount(track_direction), placement_data_.is_parent_grid_container, SubgridSpanSize(track_direction));
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h index 5983178..58debbf 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h +++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query.h
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/core_export.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/renderer/core/core_export.h" #include "third_party/blink/renderer/core/layout/geometry/logical_rect.h" #include "third_party/blink/renderer/core/layout/geometry/physical_rect.h" #include "third_party/blink/renderer/platform/geometry/anchor_query_enums.h" @@ -21,7 +22,7 @@ class NGPhysicalFragment; class WritingModeConverter; -struct NGPhysicalAnchorReference +struct CORE_EXPORT NGPhysicalAnchorReference : public GarbageCollected<NGPhysicalAnchorReference> { NGPhysicalAnchorReference(PhysicalRect rect, const NGPhysicalFragment* fragment) @@ -33,7 +34,7 @@ Member<const NGPhysicalFragment> fragment; }; -class NGPhysicalAnchorQuery { +class CORE_EXPORT NGPhysicalAnchorQuery { DISALLOW_NEW(); public: @@ -64,7 +65,7 @@ NGPhysicalAnchorReferenceMap anchor_references_; }; -struct NGLogicalAnchorReference { +struct CORE_EXPORT NGLogicalAnchorReference { STACK_ALLOCATED(); public: @@ -72,7 +73,7 @@ const NGPhysicalFragment* fragment; }; -class NGLogicalAnchorQuery { +class CORE_EXPORT NGLogicalAnchorQuery { STACK_ALLOCATED(); public:
diff --git a/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc b/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc index b7f0c36c..d476942a 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_anchor_query_test.cc
@@ -361,5 +361,66 @@ AnchorTestData{"--inner", PhysicalRect(0, 0, 400, 500)})); } +TEST_F(NGAnchorQueryTest, FragmentedContainingBlock) { + SetBodyInnerHTML(R"HTML( + <style> + html, body { + margin: 0; + width: 800px; + } + #cb { + position: relative; + } + #columns { + column-count: 3; + column-fill: auto; + column-gap: 10px; + column-width: 100px; + width: 320px; + height: 100px; + } + </style> + <div id="container"> + <div style="height: 10px"></div> + <div id="columns"> + <div style="height: 10px"></div> + <div id="cb"> + <div style="height: 140px"></div> + <!-- This anchor box starts at the middle of the 2nd column. --> + <div style="anchor-name: --a1; width: 100px; height: 100px"></div> + </div> + </div> + </div> + )HTML"); + auto* cb = To<LayoutBox>(GetLayoutObjectByElementId("cb")); + ASSERT_EQ(cb->PhysicalFragmentCount(), 3u); + const NGPhysicalBoxFragment* cb_fragment1 = cb->GetPhysicalFragment(1); + const NGPhysicalAnchorQuery* cb_anchor_query1 = cb_fragment1->AnchorQuery(); + ASSERT_NE(cb_anchor_query1, nullptr); + EXPECT_THAT(AnchorTestData::ToList(*cb_anchor_query1), + testing::ElementsAre( + AnchorTestData{"--a1", PhysicalRect(0, 50, 100, 50)})); + const NGPhysicalBoxFragment* cb_fragment2 = cb->GetPhysicalFragment(2); + const NGPhysicalAnchorQuery* cb_anchor_query2 = cb_fragment2->AnchorQuery(); + ASSERT_NE(cb_anchor_query2, nullptr); + EXPECT_THAT(AnchorTestData::ToList(*cb_anchor_query2), + testing::ElementsAre( + AnchorTestData{"--a1", PhysicalRect(0, 0, 100, 50)})); + + const NGPhysicalAnchorQuery* columns_anchor_query = + AnchorQueryByElementId("columns"); + ASSERT_NE(columns_anchor_query, nullptr); + EXPECT_THAT(AnchorTestData::ToList(*columns_anchor_query), + testing::ElementsAre( + AnchorTestData{"--a1", PhysicalRect(110, 0, 210, 100)})); + + const NGPhysicalAnchorQuery* container_anchor_query = + AnchorQueryByElementId("container"); + ASSERT_NE(container_anchor_query, nullptr); + EXPECT_THAT(AnchorTestData::ToList(*container_anchor_query), + testing::ElementsAre( + AnchorTestData{"--a1", PhysicalRect(110, 10, 210, 100)})); +} + } // namespace } // namespace blink
diff --git a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc index 529b1dd..82d930d 100644 --- a/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc +++ b/third_party/blink/renderer/core/layout/ng/ng_out_of_flow_layout_part.cc
@@ -1377,11 +1377,16 @@ if (UNLIKELY(style->PositionFallback())) { DCHECK(RuntimeEnabledFeatures::CSSAnchorPositioningEnabled()); element = DynamicTo<Element>(node_info.node.GetDOMNode()); - if (element) - next_fallback_style = element->StyleForPositionFallback(0); + if (element) { + if (const ComputedStyle* fallback_style = + element->StyleForPositionFallback(0)) { + style = fallback_style; + next_fallback_style = element->StyleForPositionFallback(1); + } + } } - wtf_size_t fallback_index = 0; + wtf_size_t fallback_index = 1; while (true) { const bool test_if_margin_box_fits = next_fallback_style; OffsetInfo offset_info;
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl.cc b/third_party/blink/renderer/core/page/chrome_client_impl.cc index c3efeb47..06aed9b 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl.cc
@@ -286,22 +286,22 @@ network::mojom::blink::WebSandboxFlags sandbox_flags, const SessionStorageNamespaceId& session_storage_namespace_id, bool& consumed_user_gesture) { - DCHECK(web_view_); - if (!web_view_->Client()) + if (!frame->GetPage() || frame->GetPage()->Paused()) return nullptr; - if (!frame->GetPage() || frame->GetPage()->Paused()) + WebLocalFrameImpl* web_frame = WebLocalFrameImpl::FromFrame(frame); + if (!web_frame) return nullptr; NotifyPopupOpeningObservers(); const AtomicString& frame_name = !EqualIgnoringASCIICase(name, "_blank") ? name : g_empty_atom; - WebViewImpl* new_view = To<WebViewImpl>(web_view_->Client()->CreateView( - WebLocalFrameImpl::FromFrame(frame), - WrappedResourceRequest(r.GetResourceRequest()), features, frame_name, - static_cast<WebNavigationPolicy>(r.GetNavigationPolicy()), sandbox_flags, - session_storage_namespace_id, consumed_user_gesture, r.Impression(), - r.GetPictureInPictureWindowOptions())); + WebViewImpl* new_view = + static_cast<WebViewImpl*>(web_frame->Client()->CreateNewWindow( + WrappedResourceRequest(r.GetResourceRequest()), features, frame_name, + static_cast<WebNavigationPolicy>(r.GetNavigationPolicy()), + sandbox_flags, session_storage_namespace_id, consumed_user_gesture, + r.Impression(), r.GetPictureInPictureWindowOptions())); if (!new_view) return nullptr; return new_view->GetPage();
diff --git a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc index 650ec318..3c8300e 100644 --- a/third_party/blink/renderer/core/page/chrome_client_impl_test.cc +++ b/third_party/blink/renderer/core/page/chrome_client_impl_test.cc
@@ -93,10 +93,9 @@ }; } // namespace -class ViewCreatingClient : public frame_test_helpers::TestWebViewClient { +class ViewCreatingClient : public frame_test_helpers::TestWebFrameClient { public: - WebView* CreateView( - WebLocalFrame* opener, + WebView* CreateNewWindow( const WebURLRequest&, const WebWindowFeatures&, const WebString& name, @@ -106,7 +105,7 @@ bool& consumed_user_gesture, const absl::optional<Impression>&, const absl::optional<WebPictureInPictureWindowOptions>&) override { - return web_view_helper_.InitializeWithOpener(opener); + return web_view_helper_.InitializeWithOpener(Frame()); } private: @@ -116,13 +115,13 @@ class CreateWindowTest : public testing::Test { protected: void SetUp() override { - web_view_ = helper_.Initialize(nullptr, &web_view_client_); + web_view_ = helper_.Initialize(&web_frame_client_); main_frame_ = helper_.LocalMainFrame(); chrome_client_impl_ = To<ChromeClientImpl>(&web_view_->GetPage()->GetChromeClient()); } - ViewCreatingClient web_view_client_; + ViewCreatingClient web_frame_client_; frame_test_helpers::WebViewHelper helper_; WebViewImpl* web_view_; WebLocalFrame* main_frame_;
diff --git a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc index c8b779a..cee914c 100644 --- a/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc +++ b/third_party/blink/renderer/core/page/scrolling/root_scroller_test.cc
@@ -190,7 +190,6 @@ String base_url_; frame_test_helpers::CreateTestWebFrameWidgetCallback create_widget_callback_; - std::unique_ptr<frame_test_helpers::TestWebViewClient> view_client_; std::unique_ptr<frame_test_helpers::WebViewHelper> helper_; RuntimeEnabledFeatures::Backup features_backup_; };
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index f92a636e..41862ee 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -2356,6 +2356,7 @@ state.container_rect = ToPixelSnappedRect(clip_rect); state.contents_size = scrollable_area->PixelSnappedContentsSize(clip_rect.offset); + state.overflow_clip_node = properties_->OverflowClip(); state.user_scrollable_horizontal = scrollable_area->UserInputScrollable(kHorizontalScrollbar); @@ -2480,7 +2481,13 @@ // was also updated in LayerTreeHost::ApplyCompositorChanges. if (effective_change_type <= PaintPropertyChangeType::kChangedOnlySimpleValues && - properties_->ScrollTranslation()->HasDirectCompositingReasons()) { + properties_->ScrollTranslation()->HasDirectCompositingReasons() && + // In platform code, only scroll translations with scroll nodes are + // treated as scroll translations with overlap testing treatment. + // A scroll translation for overflow:hidden doesn't have a scroll node + // and needs full PaintArtifactCompositor update on scroll. + (!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled() || + properties_->Scroll())) { if (auto* paint_artifact_compositor = object_.GetFrameView()->GetPaintArtifactCompositor()) { bool updated = @@ -4189,40 +4196,33 @@ } } - if (const auto* properties = object_.FirstFragment().PaintProperties()) { - if (const auto* scroll_translation = properties->ScrollTranslation()) { - if (scroll_translation->Translation2D() != context_.old_scroll_offset) { - // Scrolling can change overlap relationship for elements fixed to an - // overflow: hidden view that programmatically scrolls via script. - // In this case the fixed transform doesn't have enough information to - // perform the expansion - there is no scroll node to describe the - // bounds of the scrollable content. - // TODO(crbug.com/1117658): We may need a similar logic for sticky - // objects when we support maximum overlap for them, or disable - // compositing of sticky objects under an overflow:hidden container. - // TODO(crbug.com/1310586): With the optimization proposed in the bug, - // we can limit the following condition to IsA<LayoutView>(object_), - // i.e. exclude subscrollers. - auto* frame_view = object_.GetFrameView(); - if (frame_view->HasFixedPositionObjects() && - !object_.View()->FirstFragment().PaintProperties()->Scroll()) { - frame_view->SetPaintArtifactCompositorNeedsUpdate( - PaintArtifactCompositorUpdateReason:: - kPaintPropertyTreeBuilderHasFixedPositionObjects); - } else if (!object_.IsStackingContext() && - To<LayoutBoxModelObject>(object_) - .Layer() - ->HasSelfPaintingLayerDescendant()) { - // If the scroller is not a stacking context but contains stacked - // descendants, we need to update compositing because the stacked - // descendants may change overlap relationship with other stacked - // elements that are not contained by this scroller. - // TODO(crbug.com/1310586): We can avoid this if we expand the visual - // rect to the bounds of the scroller when we map a visual rect under - // the scroller to outside of the scroller. - frame_view->SetPaintArtifactCompositorNeedsUpdate( - PaintArtifactCompositorUpdateReason:: - kPaintPropertyTreeBulderNonStackingContextScroll); + if (!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) { + if (const auto* properties = object_.FirstFragment().PaintProperties()) { + if (const auto* scroll_translation = properties->ScrollTranslation()) { + if (scroll_translation->Translation2D() != context_.old_scroll_offset) { + // Scrolling can change overlap relationship for elements fixed to an + // overflow: hidden view that programmatically scrolls via script. + // In this case the fixed transform doesn't have enough information to + // perform the expansion - there is no scroll node to describe the + // bounds of the scrollable content. + auto* frame_view = object_.GetFrameView(); + if (frame_view->HasFixedPositionObjects() && + !object_.View()->FirstFragment().PaintProperties()->Scroll()) { + frame_view->SetPaintArtifactCompositorNeedsUpdate( + PaintArtifactCompositorUpdateReason:: + kPaintPropertyTreeBuilderHasFixedPositionObjects); + } else if (!object_.IsStackingContext() && + To<LayoutBoxModelObject>(object_) + .Layer() + ->HasSelfPaintingLayerDescendant()) { + // If the scroller is not a stacking context but contains stacked + // descendants, we need to update compositing because the stacked + // descendants may change overlap relationship with other stacked + // elements that are not contained by this scroller. + frame_view->SetPaintArtifactCompositorNeedsUpdate( + PaintArtifactCompositorUpdateReason:: + kPaintPropertyTreeBulderNonStackingContextScroll); + } } } }
diff --git a/third_party/blink/renderer/core/script/classic_pending_script.cc b/third_party/blink/renderer/core/script/classic_pending_script.cc index 1e40535c..78b5f53 100644 --- a/third_party/blink/renderer/core/script/classic_pending_script.cc +++ b/third_party/blink/renderer/core/script/classic_pending_script.cc
@@ -274,6 +274,20 @@ options_, cross_origin); } + // <specdef href="https://fetch.spec.whatwg.org/#concept-main-fetch"> + // <spec step="17">If response is not a network error and any of the following + // returns blocked</spec> + // <spec step="17.C">should internalResponse to request be blocked due to its + // MIME type</spec> + // <spec step="17.D">should internalResponse to request be blocked due to + // nosniff</spec> + // <spec step="17">then set response and internalResponse to a network + // error.</spec> + auto* fetcher = GetElement()->GetExecutionContext()->Fetcher(); + const bool mime_type_failure = !AllowedByNosniff::MimeTypeAsScript( + fetcher->GetUseCounter(), &fetcher->GetConsoleLogger(), + resource->GetResponse(), AllowedByNosniff::MimeTypeCheck::kLaxForElement); + TRACE_EVENT_WITH_FLOW1(TRACE_DISABLED_BY_DEFAULT("v8.compile"), "ClassicPendingScript::NotifyFinished", this, TRACE_EVENT_FLAG_FLOW_OUT, "data", @@ -283,7 +297,10 @@ GetResource()->Url().GetString()); }); - bool error_occurred = GetResource()->ErrorOccurred() || integrity_failure_; + // Ordinal ErrorOccurred(), SRI, and MIME check are all considered as network + // errors in the Fetch spec. + bool error_occurred = + GetResource()->ErrorOccurred() || integrity_failure_ || mime_type_failure; if (error_occurred) { AdvanceReadyState(kErrorOccurred); return; @@ -432,15 +449,6 @@ auto* resource = To<ScriptResource>(GetResource()); RecordThirdPartyRequestWithCookieIfNeeded(resource->GetResponse()); - auto* fetcher = GetElement()->GetExecutionContext()->Fetcher(); - // If the MIME check fails, which is considered as load failure. - if (!AllowedByNosniff::MimeTypeAsScript( - fetcher->GetUseCounter(), &fetcher->GetConsoleLogger(), - resource->GetResponse(), - AllowedByNosniff::MimeTypeCheck::kLaxForElement)) { - return nullptr; - } - // Check if we can use the script streamer. ResourceScriptStreamer* streamer; ScriptStreamer::NotStreamingReason not_streamed_reason;
diff --git a/third_party/blink/renderer/core/style/build.gni b/third_party/blink/renderer/core/style/build.gni index 1d22c964..4c7ced1 100644 --- a/third_party/blink/renderer/core/style/build.gni +++ b/third_party/blink/renderer/core/style/build.gni
@@ -33,6 +33,7 @@ "filter_operations.cc", "filter_operations.h", "grid_area.h", + "grid_enums.h", "grid_length.h", "grid_position.h", "grid_positions_resolver.cc",
diff --git a/third_party/blink/renderer/core/style/grid_enums.h b/third_party/blink/renderer/core/style/grid_enums.h new file mode 100644 index 0000000..f90cb53 --- /dev/null +++ b/third_party/blink/renderer/core/style/grid_enums.h
@@ -0,0 +1,21 @@ +// 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 THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_GRID_ENUMS_H_ +#define THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_GRID_ENUMS_H_ + +namespace blink { + +enum GridPositionSide { + kColumnStartSide, + kColumnEndSide, + kRowStartSide, + kRowEndSide +}; + +enum GridTrackSizingDirection { kForColumns, kForRows }; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_GRID_ENUMS_H_
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.cc b/third_party/blink/renderer/core/style/grid_positions_resolver.cc index fd449dc..501f36bc 100644 --- a/third_party/blink/renderer/core/style/grid_positions_resolver.cc +++ b/third_party/blink/renderer/core/style/grid_positions_resolver.cc
@@ -5,7 +5,7 @@ #include "third_party/blink/renderer/core/style/grid_positions_resolver.h" #include <algorithm> -#include "third_party/blink/renderer/core/layout/layout_box.h" +#include "third_party/blink/renderer/core/style/computed_style.h" #include "third_party/blink/renderer/core/style/grid_area.h" namespace blink { @@ -29,7 +29,6 @@ GridTrackSizingDirection track_direction, wtf_size_t last_line, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, bool is_parent_grid_container) : last_line_(last_line), auto_repeat_total_tracks_(auto_repeat_tracks_count) { @@ -74,8 +73,7 @@ insertion_point_ = computed_grid_track_list.auto_repeat_insertion_point; auto_repeat_track_list_length_ = - is_ng_grid ? computed_grid_track_list.TrackList().AutoRepeatTrackCount() - : computed_grid_track_list.auto_repeat_track_sizes.size(); + computed_grid_track_list.auto_repeat_track_sizes.size(); } bool NamedLineCollection::HasExplicitNamedLines() { @@ -265,16 +263,13 @@ wtf_size_t GridPositionsResolver::ExplicitGridColumnCount( const ComputedStyle& grid_container_style, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, wtf_size_t subgrid_span_size) { if (subgrid_span_size != kNotFound) return subgrid_span_size; const auto& track_list = grid_container_style.GridTemplateColumns().track_sizes; - const wtf_size_t total_track_count = - is_ng_grid ? track_list.NGTrackList().TrackCountWithoutAutoRepeat() - : track_list.LegacyTrackList().size(); + const wtf_size_t total_track_count = track_list.LegacyTrackList().size(); return std::min<wtf_size_t>( std::max(total_track_count + auto_repeat_tracks_count, @@ -285,15 +280,12 @@ wtf_size_t GridPositionsResolver::ExplicitGridRowCount( const ComputedStyle& grid_container_style, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, wtf_size_t subgrid_span_size) { if (subgrid_span_size != kNotFound) return subgrid_span_size; const auto& track_list = grid_container_style.GridTemplateRows().track_sizes; - const wtf_size_t total_track_count = - is_ng_grid ? track_list.NGTrackList().TrackCountWithoutAutoRepeat() - : track_list.LegacyTrackList().size(); + const wtf_size_t total_track_count = track_list.LegacyTrackList().size(); return std::min<wtf_size_t>( std::max(total_track_count + auto_repeat_tracks_count, @@ -305,14 +297,13 @@ const ComputedStyle& grid_container_style, GridPositionSide side, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, wtf_size_t subgrid_span_size) { return (side == kColumnStartSide || side == kColumnEndSide) ? GridPositionsResolver::ExplicitGridColumnCount( - grid_container_style, auto_repeat_tracks_count, is_ng_grid, + grid_container_style, auto_repeat_tracks_count, subgrid_span_size) : GridPositionsResolver::ExplicitGridRowCount( - grid_container_style, auto_repeat_tracks_count, is_ng_grid, + grid_container_style, auto_repeat_tracks_count, subgrid_span_size); } @@ -322,7 +313,6 @@ const GridPosition& position, wtf_size_t auto_repeat_tracks_count, GridPositionSide side, - bool is_ng_grid, wtf_size_t subgrid_span_size) { DCHECK(position.IsSpan()); DCHECK(!position.NamedGridLine().IsNull()); @@ -330,12 +320,11 @@ // been handled during parsing. DCHECK_GT(position.SpanPosition(), 0); - wtf_size_t last_line = ExplicitGridSizeForSide(grid_container_style, side, - auto_repeat_tracks_count, - is_ng_grid, subgrid_span_size); + wtf_size_t last_line = ExplicitGridSizeForSide( + grid_container_style, side, auto_repeat_tracks_count, subgrid_span_size); NamedLineCollection lines_collection( grid_container_style, position.NamedGridLine(), DirectionFromSide(side), - last_line, auto_repeat_tracks_count, is_ng_grid); + last_line, auto_repeat_tracks_count); return DefiniteGridSpanWithNamedSpanAgainstOpposite( opposite_line, position, side, last_line, lines_collection); } @@ -359,7 +348,6 @@ const GridPosition& position, GridPositionSide side, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, wtf_size_t subgrid_span_size) { if (position.IsAuto()) { if (side == kColumnStartSide || side == kRowStartSide) { @@ -378,7 +366,7 @@ // our opposite position. return ResolveNamedGridLinePositionAgainstOppositePosition( grid_container_style, opposite_line, position, auto_repeat_tracks_count, - side, is_ng_grid, subgrid_span_size); + side, subgrid_span_size); } return DefiniteGridSpanWithSpanAgainstOpposite(opposite_line, position, side); @@ -414,16 +402,14 @@ const GridPosition& position, GridPositionSide side, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, wtf_size_t subgrid_span_size) { DCHECK(!position.NamedGridLine().IsNull()); - wtf_size_t last_line = ExplicitGridSizeForSide(grid_container_style, side, - auto_repeat_tracks_count, - is_ng_grid, subgrid_span_size); + wtf_size_t last_line = ExplicitGridSizeForSide( + grid_container_style, side, auto_repeat_tracks_count, subgrid_span_size); NamedLineCollection lines_collection( grid_container_style, position.NamedGridLine(), DirectionFromSide(side), - last_line, auto_repeat_tracks_count, is_ng_grid); + last_line, auto_repeat_tracks_count); if (position.IsPositive()) { return LookAheadForNamedGridLine(0, abs(position.IntegerPosition()), @@ -439,7 +425,6 @@ const GridPosition& position, GridPositionSide side, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, bool is_parent_grid_container, wtf_size_t subgrid_span_size) { switch (position.GetType()) { @@ -449,7 +434,7 @@ if (!position.NamedGridLine().IsNull()) { return ResolveNamedGridLinePositionFromStyle( grid_container_style, position, side, auto_repeat_tracks_count, - is_ng_grid, subgrid_span_size); + subgrid_span_size); } // Handle <integer> explicit position. @@ -457,9 +442,9 @@ return position.IntegerPosition() - 1; wtf_size_t resolved_position = abs(position.IntegerPosition()) - 1; - wtf_size_t end_of_track = ExplicitGridSizeForSide( - grid_container_style, side, auto_repeat_tracks_count, is_ng_grid, - subgrid_span_size); + wtf_size_t end_of_track = + ExplicitGridSizeForSide(grid_container_style, side, + auto_repeat_tracks_count, subgrid_span_size); return end_of_track - resolved_position; } @@ -471,23 +456,21 @@ String named_grid_line = position.NamedGridLine(); DCHECK(!position.NamedGridLine().IsNull()); - wtf_size_t last_line = ExplicitGridSizeForSide( - grid_container_style, side, auto_repeat_tracks_count, is_ng_grid, - subgrid_span_size); + wtf_size_t last_line = + ExplicitGridSizeForSide(grid_container_style, side, + auto_repeat_tracks_count, subgrid_span_size); NamedLineCollection implicit_lines( grid_container_style, ImplicitNamedGridLineForSide(named_grid_line, side), - DirectionFromSide(side), last_line, auto_repeat_tracks_count, - is_ng_grid); + DirectionFromSide(side), last_line, auto_repeat_tracks_count); if (implicit_lines.HasNamedLines()) return implicit_lines.FirstPosition(); // Otherwise, if there is a named line with the specified name, // contributes the first such line to the grid item's placement. - NamedLineCollection explicit_lines(grid_container_style, named_grid_line, - DirectionFromSide(side), last_line, - auto_repeat_tracks_count, - is_parent_grid_container, is_ng_grid); + NamedLineCollection explicit_lines( + grid_container_style, named_grid_line, DirectionFromSide(side), + last_line, auto_repeat_tracks_count, is_parent_grid_container); if (explicit_lines.HasNamedLines()) return explicit_lines.FirstPosition(); @@ -511,7 +494,6 @@ const ComputedStyle& grid_item_style, GridTrackSizingDirection track_direction, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, bool is_parent_grid_container, wtf_size_t subgrid_span_size) { GridPosition initial_position, final_position; @@ -541,11 +523,10 @@ // 2 / 3' case). int end_line = ResolveGridPositionFromStyle( grid_container_style, final_position, final_side, - auto_repeat_tracks_count, is_ng_grid, is_parent_grid_container, - subgrid_span_size); + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); return ResolveGridPositionAgainstOppositePosition( grid_container_style, end_line, initial_position, initial_side, - auto_repeat_tracks_count, is_ng_grid, subgrid_span_size); + auto_repeat_tracks_count, subgrid_span_size); } if (final_should_be_resolved_against_opposite_position) { @@ -553,21 +534,18 @@ // span 2' case). int start_line = ResolveGridPositionFromStyle( grid_container_style, initial_position, initial_side, - auto_repeat_tracks_count, is_ng_grid, is_parent_grid_container, - subgrid_span_size); + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); return ResolveGridPositionAgainstOppositePosition( grid_container_style, start_line, final_position, final_side, - auto_repeat_tracks_count, is_ng_grid, subgrid_span_size); + auto_repeat_tracks_count, subgrid_span_size); } int start_line = ResolveGridPositionFromStyle( grid_container_style, initial_position, initial_side, - auto_repeat_tracks_count, is_ng_grid, is_parent_grid_container, - subgrid_span_size); + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); int end_line = ResolveGridPositionFromStyle( grid_container_style, final_position, final_side, - auto_repeat_tracks_count, is_ng_grid, is_parent_grid_container, - subgrid_span_size); + auto_repeat_tracks_count, is_parent_grid_container, subgrid_span_size); if (end_line < start_line) std::swap(end_line, start_line);
diff --git a/third_party/blink/renderer/core/style/grid_positions_resolver.h b/third_party/blink/renderer/core/style/grid_positions_resolver.h index b362647..9c192b8 100644 --- a/third_party/blink/renderer/core/style/grid_positions_resolver.h +++ b/third_party/blink/renderer/core/style/grid_positions_resolver.h
@@ -5,6 +5,7 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_GRID_POSITIONS_RESOLVER_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_STYLE_GRID_POSITIONS_RESOLVER_H_ +#include "third_party/blink/renderer/core/style/grid_enums.h" #include "third_party/blink/renderer/core/style/grid_position.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" @@ -14,15 +15,6 @@ class LayoutBox; class ComputedStyle; -enum GridPositionSide { - kColumnStartSide, - kColumnEndSide, - kRowStartSide, - kRowEndSide -}; - -enum GridTrackSizingDirection { kForColumns, kForRows }; - class NamedLineCollection { public: NamedLineCollection(const ComputedStyle&, @@ -30,7 +22,6 @@ GridTrackSizingDirection, wtf_size_t last_line, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid, bool is_parent_grid_container = false); bool HasNamedLines(); @@ -64,13 +55,11 @@ static wtf_size_t ExplicitGridColumnCount( const ComputedStyle&, wtf_size_t auto_repeat_columns_count, - bool is_ng_grid = false, wtf_size_t subgrid_span_size = kNotFound); static wtf_size_t ExplicitGridRowCount( const ComputedStyle&, wtf_size_t auto_repeat_rows_count, - bool is_ng_grid = false, wtf_size_t subgrid_span_size = kNotFound); static wtf_size_t SpanSizeForAutoPlacedItem(const ComputedStyle&, @@ -81,7 +70,6 @@ const ComputedStyle&, GridTrackSizingDirection, wtf_size_t auto_repeat_tracks_count, - bool is_ng_grid = false, bool is_parent_grid_container = false, wtf_size_t subgrid_span_size = kNotFound); };
diff --git a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc index 30347ca..4a4a6b8 100644 --- a/third_party/blink/renderer/core/testing/fake_local_frame_host.cc +++ b/third_party/blink/renderer/core/testing/fake_local_frame_host.cc
@@ -9,6 +9,7 @@ #include "third_party/blink/public/mojom/frame/frame_owner_properties.mojom-blink.h" #include "third_party/blink/public/mojom/frame/frame_replication_state.mojom-blink.h" #include "third_party/blink/public/mojom/frame/fullscreen.mojom-blink.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink.h" #include "third_party/blink/public/mojom/timing/resource_timing.mojom-blink.h" namespace blink {
diff --git a/third_party/blink/renderer/core/testing/fake_remote_frame_host.h b/third_party/blink/renderer/core/testing/fake_remote_frame_host.h index 29d546e..5b49c10 100644 --- a/third_party/blink/renderer/core/testing/fake_remote_frame_host.h +++ b/third_party/blink/renderer/core/testing/fake_remote_frame_host.h
@@ -11,7 +11,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/frame/frame_visual_properties.h" -#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink.h" #include "third_party/blink/renderer/core/messaging/blink_transferable_message.h" namespace blink {
diff --git a/third_party/blink/renderer/core/testing/fake_remote_main_frame_host.h b/third_party/blink/renderer/core/testing/fake_remote_main_frame_host.h index 75ca67b9..3e8859d 100644 --- a/third_party/blink/renderer/core/testing/fake_remote_main_frame_host.h +++ b/third_party/blink/renderer/core/testing/fake_remote_main_frame_host.h
@@ -6,7 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_TESTING_FAKE_REMOTE_MAIN_FRAME_HOST_H_ #include "mojo/public/cpp/bindings/associated_receiver_set.h" -#include "third_party/blink/public/mojom/frame/frame.mojom-blink.h" +#include "third_party/blink/public/mojom/frame/remote_frame.mojom-blink.h" #include "third_party/blink/renderer/platform/weborigin/kurl.h" namespace blink {
diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc index bbc96040..eb150c7 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_compositor.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.cc
@@ -25,11 +25,8 @@ SimCompositor::~SimCompositor() = default; -void SimCompositor::SetWebView( - WebViewImpl& web_view, - frame_test_helpers::TestWebViewClient& view_client) { +void SimCompositor::SetWebView(WebViewImpl& web_view) { web_view_ = &web_view; - test_web_view_client_ = &view_client; } SimCanvas::Commands SimCompositor::BeginFrame(double time_delta_in_seconds,
diff --git a/third_party/blink/renderer/core/testing/sim/sim_compositor.h b/third_party/blink/renderer/core/testing/sim/sim_compositor.h index 7cf95ec..c23550c 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_compositor.h +++ b/third_party/blink/renderer/core/testing/sim/sim_compositor.h
@@ -31,13 +31,7 @@ // When the compositor asks for a main frame, this WebViewImpl will have its // lifecycle updated and be painted. - // The WebWidget client is overridden (via the WebViewClient) to control - // BeginMainFrame scheduling since this test suite does not use the - // compositor's scheduler. The SimCompositor wants to monitor and verify - // expectations around this scheduling, so receives the WebViewClient. We - // pass it here explicitly to provide type safety, though it is the client - // available on the WebViewImpl as well. - void SetWebView(WebViewImpl&, frame_test_helpers::TestWebViewClient&); + void SetWebView(WebViewImpl&); // Set the LayerTreeHost that the compositor is associated with. void SetLayerTreeHost(cc::LayerTreeHost*); @@ -89,7 +83,6 @@ SimCanvas::Commands PaintFrame(); WebViewImpl* web_view_ = nullptr; - frame_test_helpers::TestWebViewClient* test_web_view_client_ = nullptr; cc::LayerTreeHost* layer_tree_host_ = nullptr; base::TimeTicks last_frame_time_;
diff --git a/third_party/blink/renderer/core/testing/sim/sim_test.cc b/third_party/blink/renderer/core/testing/sim/sim_test.cc index 3e620bc..c7fcb55a 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_test.cc +++ b/third_party/blink/renderer/core/testing/sim/sim_test.cc
@@ -8,6 +8,7 @@ #include "content/test/test_blink_web_unit_test_support.h" #include "third_party/blink/public/platform/web_cache.h" #include "third_party/blink/public/web/web_navigation_params.h" +#include "third_party/blink/public/web/web_view_client.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/exported/web_view_impl.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" @@ -45,7 +46,6 @@ compositor_ = std::make_unique<SimCompositor>(); web_frame_client_ = std::make_unique<frame_test_helpers::TestWebFrameClient>(); - web_view_client_ = std::make_unique<frame_test_helpers::TestWebViewClient>(); page_ = std::make_unique<SimPage>(); web_view_helper_ = std::make_unique<frame_test_helpers::WebViewHelper>(base::BindRepeating( @@ -55,8 +55,8 @@ // set up don't test / need code caches. Disable code caches for these tests. DocumentLoader::DisableCodeCacheForTesting(); - web_view_helper_->Initialize(web_frame_client_.get(), web_view_client_.get()); - compositor_->SetWebView(WebView(), *web_view_client_); + web_view_helper_->Initialize(web_frame_client_.get()); + compositor_->SetWebView(WebView()); page_->SetPage(WebView().GetPage()); local_frame_root_ = WebView().MainFrameImpl(); compositor_->SetLayerTreeHost( @@ -78,7 +78,6 @@ // consistent, and before the subclass tears down. web_view_helper_.reset(); page_.reset(); - web_view_client_.reset(); web_frame_client_.reset(); compositor_.reset(); network_.reset(); @@ -88,7 +87,7 @@ void SimTest::InitializeRemote() { web_view_helper_->InitializeRemote(); - compositor_->SetWebView(WebView(), *web_view_client_); + compositor_->SetWebView(WebView()); page_->SetPage(WebView().GetPage()); web_frame_client_ = std::make_unique<frame_test_helpers::TestWebFrameClient>(); @@ -105,7 +104,7 @@ /*view_client=*/nullptr, /*update_settings_func=*/nullptr, mode); - compositor_->SetWebView(WebView(), *web_view_client_); + compositor_->SetWebView(WebView()); page_->SetPage(WebView().GetPage()); web_frame_client_ = std::make_unique<frame_test_helpers::TestWebFrameClient>(); @@ -149,10 +148,6 @@ return *local_frame_root_; } -frame_test_helpers::TestWebViewClient& SimTest::WebViewClient() { - return *web_view_client_; -} - frame_test_helpers::TestWebFrameClient& SimTest::WebFrameClient() { return *web_frame_client_; }
diff --git a/third_party/blink/renderer/core/testing/sim/sim_test.h b/third_party/blink/renderer/core/testing/sim/sim_test.h index 814c0e1..02a5921c 100644 --- a/third_party/blink/renderer/core/testing/sim/sim_test.h +++ b/third_party/blink/renderer/core/testing/sim/sim_test.h
@@ -46,7 +46,6 @@ WebViewImpl& WebView(); WebLocalFrameImpl& MainFrame(); WebLocalFrameImpl& LocalFrameRoot(); - frame_test_helpers::TestWebViewClient& WebViewClient(); frame_test_helpers::TestWebFrameClient& WebFrameClient(); SimWebFrameWidget& GetWebFrameWidget(); SimCompositor& Compositor(); @@ -100,7 +99,6 @@ std::unique_ptr<SimNetwork> network_; std::unique_ptr<SimCompositor> compositor_; std::unique_ptr<frame_test_helpers::TestWebFrameClient> web_frame_client_; - std::unique_ptr<frame_test_helpers::TestWebViewClient> web_view_client_; std::unique_ptr<SimPage> page_; std::unique_ptr<frame_test_helpers::WebViewHelper> web_view_helper_; UntracedMember<WebLocalFrameImpl> local_frame_root_;
diff --git a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc index a20818f..7a3585c 100644 --- a/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc +++ b/third_party/blink/renderer/modules/accessibility/ax_object_cache_impl.cc
@@ -3468,10 +3468,14 @@ if (!DoesEventListenerImpactIgnoredState(event_type)) return; - // If the |event_type| may affect the ignored state of |node|, which means - // that the parent's children may have changed. + // Adding/removing a listener may affect the ignored state of node's AXObject. modification_count_++; MarkElementDirty(&node); + // If the ignored state changes, the parent's children may have changed. + if (AXObject* obj = SafeGet(&node)) { + if (obj->CachedParentObject()) + ChildrenChanged(obj->CachedParentObject()); + } } void AXObjectCacheImpl::LabelChangedWithCleanLayout(Element* element) {
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc index 94d2dfc..66451a1d 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.cc
@@ -5651,13 +5651,17 @@ if (!texture) return; + // source in Y-down coordinate space -> is_source_origin_top_left = true + // source in Y-up coordinate space -> is_source_origin_top_left = false + bool is_source_origin_top_left = false; + gfx::Size source_size; // Only one of `source_image` and `source_canvas_webgl_context` may be // specified. - gfx::Size source_size; if (source_image) { DCHECK(source_image->IsTextureBacked()); DCHECK(!source_canvas_webgl_context); source_size = source_image->Size(); + is_source_origin_top_left = source_image->IsOriginTopLeft(); } if (source_canvas_webgl_context) { DCHECK(!source_image); @@ -5668,6 +5672,7 @@ return; } source_size = source_canvas_webgl_context->GetDrawingBuffer()->Size(); + is_source_origin_top_left = source_canvas_webgl_context->IsOriginTopLeft(); } if (!params.width) params.width = source_size.width(); @@ -5710,31 +5715,40 @@ gfx::Rect source_sub_rectangle(params.unpack_skip_pixels, params.unpack_skip_rows, *params.width, *params.height); - bool should_adjust_source_sub_rectangle = !params.unpack_flip_y; - if (is_origin_top_left_ && source_canvas_webgl_context) - should_adjust_source_sub_rectangle = !should_adjust_source_sub_rectangle; - if (should_adjust_source_sub_rectangle) { + + // source_sub_rectangle is always specified in Y-down coordinate space. + // Adjust if source is in Y-up coordinate space. + // If unpack_flip_y is true specified by the caller, adjust it back again. + // This is equivalent of is_source_origin_top_left == params.unpack_flip_y. + bool adjust_source_sub_rectangle = + is_source_origin_top_left == params.unpack_flip_y; + if (adjust_source_sub_rectangle) { source_sub_rectangle.set_y(source_size.height() - source_sub_rectangle.bottom()); } + // The various underlying copy functions require a Y-up rectangle. + // We need to set flip_y according to source_coordinate system and the + // unpack_flip_y value specified by the caller. + // The first transferred pixel should be the upper left corner of the source + // when params.unpack_flip_y is false. And bottom left corner of the source + // when params.unpack_flip_y is true. + bool flip_y = is_source_origin_top_left == params.unpack_flip_y; + // glCopyTextureCHROMIUM has a DRAW_AND_READBACK path which will call // texImage2D. So, reset unpack buffer parameters before that. ScopedUnpackParametersResetRestore temporaryResetUnpack(this); if (source_image) { source_image->CopyToTexture( ContextGL(), params.target, target_texture, params.level, - params.unpack_premultiply_alpha, params.unpack_flip_y, + params.unpack_premultiply_alpha, flip_y, gfx::Point(params.xoffset, params.yoffset), source_sub_rectangle); } else { WebGLRenderingContextBase* gl = source_canvas_webgl_context; - bool flip_y = params.unpack_flip_y; - if (gl->is_origin_top_left_ && !canvas()->LowLatencyEnabled()) - flip_y = !flip_y; ScopedTexture2DRestorer inner_restorer(gl); if (!gl->GetDrawingBuffer()->CopyToPlatformTexture( ContextGL(), params.target, target_texture, params.level, - params.unpack_premultiply_alpha, !flip_y, + params.unpack_premultiply_alpha, flip_y, gfx::Point(params.xoffset, params.yoffset), source_sub_rectangle, kBackBuffer)) { NOTREACHED();
diff --git a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc index 83d41fa5..f772ebb 100644 --- a/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc +++ b/third_party/blink/renderer/modules/webgpu/gpu_canvas_context.cc
@@ -680,10 +680,11 @@ gpu::SyncToken sync_token; ri->GenUnverifiedSyncTokenCHROMIUM(sync_token.GetData()); webgpu->WaitSyncTokenCHROMIUM(sync_token.GetConstData()); - webgpu->AssociateMailbox(reservation.deviceId, reservation.deviceGeneration, - reservation.id, reservation.generation, - WGPUTextureUsage_CopyDst, - reinterpret_cast<const GLbyte*>(&dst_mailbox)); + webgpu->AssociateMailbox( + reservation.deviceId, reservation.deviceGeneration, reservation.id, + reservation.generation, + WGPUTextureUsage_CopyDst | WGPUTextureUsage_RenderAttachment, + reinterpret_cast<const GLbyte*>(&dst_mailbox)); WGPUImageCopyTexture source = { .nextInChain = nullptr, .texture = texture, @@ -770,11 +771,10 @@ scoped_refptr<StaticBitmapImage> GPUCanvasContext::SnapshotInternal( const WGPUTexture& texture, const gfx::Size& size) const { - const auto info = - SkImageInfo::Make(size.width(), size.height(), - viz::ResourceFormatToClosestSkColorType( - /*gpu_compositing=*/true, swap_buffers_->Format()), - kPremul_SkAlphaType); + const auto canvas_context_color = CanvasRenderingContextSkColorInfo(); + const auto info = SkImageInfo::Make(size.width(), size.height(), + canvas_context_color.colorType(), + canvas_context_color.alphaType()); // We tag the SharedImage inside the WebGPUImageProvider with display usage // since there are uncommon paths which may use this snapshot for compositing. // These paths are usually related to either printing or either video and
diff --git a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc index 53ea5f8..9b1a929 100644 --- a/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc +++ b/third_party/blink/renderer/platform/graphics/accelerated_static_bitmap_image.cc
@@ -146,8 +146,10 @@ source_texture_id, 0, dest_target, dest_texture_id, dest_level, dest_point.x(), dest_point.y(), source_sub_rectangle.x(), source_sub_rectangle.y(), source_sub_rectangle.width(), - source_sub_rectangle.height(), unpack_flip_y ? GL_FALSE : GL_TRUE, - GL_FALSE, unpack_premultiply_alpha ? GL_FALSE : GL_TRUE); + source_sub_rectangle.height(), unpack_flip_y, + /*unpack_premultiply_alpha=*/GL_FALSE, + /*unpack_unmultiply_alpha=*/ + unpack_premultiply_alpha ? GL_FALSE : GL_TRUE); dest_gl->EndSharedImageAccessDirectCHROMIUM(source_texture_id); dest_gl->DeleteTextures(1, &source_texture_id);
diff --git a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc index d239989..7659da11 100644 --- a/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc +++ b/third_party/blink/renderer/platform/graphics/compositing/paint_artifact_compositor_test.cc
@@ -166,14 +166,13 @@ cc::Layer* RootLayer() { return paint_artifact_compositor_->RootLayer(); } - void CreateScrollableChunk( - TestPaintArtifact& artifact, - const TransformPaintPropertyNode& scroll_translation, - const ClipPaintPropertyNodeOrAlias& clip, - const EffectPaintPropertyNodeOrAlias& effect) { - artifact.Chunk(*scroll_translation.Parent(), clip, effect) - .ScrollHitTest(scroll_translation.ScrollNode()->ContainerRect(), - &scroll_translation); + void CreateScrollableChunk(TestPaintArtifact& artifact, + const RefCountedPropertyTreeState& scroll_state) { + artifact + .Chunk(*scroll_state.Transform().Parent(), + *scroll_state.Clip().Parent(), scroll_state.Effect()) + .ScrollHitTest(scroll_state.Transform().ScrollNode()->ContainerRect(), + &scroll_state.Transform()); } // Returns the |num|th scroll hit test layer. @@ -208,11 +207,6 @@ return RootLayer()->children()[index].get(); } - CompositorElementId ScrollElementId(unsigned id) { - return CompositorElementIdFromUniqueObjectId( - id, CompositorElementIdNamespace::kScroll); - } - size_t SynthesizedClipLayerCount() { return paint_artifact_compositor_->SynthesizedClipLayersForTesting().size(); } @@ -1020,34 +1014,28 @@ EXPECT_EQ(converted_effect3.id, LayerAt(2)->effect_tree_index()); } -// Returns a ScrollPaintPropertyNode::State with some arbitrary values. -static ScrollPaintPropertyNode::State ScrollState1() { - ScrollPaintPropertyNode::State state; - state.container_rect = gfx::Rect(3, 5, 11, 13); - state.contents_size = gfx::Size(27, 31); - state.user_scrollable_horizontal = true; - return state; +// Returns a RefCountedPropertyTreeState for composited scrolling paint +// properties with some arbitrary values. +static RefCountedPropertyTreeState ScrollState1( + const PropertyTreeState& parent_state = PropertyTreeState::Root(), + CompositingReasons compositing_reasons = + CompositingReason::kOverflowScrolling, + MainThreadScrollingReasons main_thread_reasons = kNotScrollingOnMain) { + return CreateScrollTranslationState( + parent_state, 7, 9, gfx::Rect(3, 5, 11, 13), gfx::Size(27, 31), + compositing_reasons, main_thread_reasons); } -// Returns a ScrollPaintPropertyNode::State with another set arbitrary values. -static ScrollPaintPropertyNode::State ScrollState2() { - ScrollPaintPropertyNode::State state; - state.container_rect = gfx::Rect(0, 0, 19, 23); - state.contents_size = gfx::Size(29, 31); - state.user_scrollable_horizontal = true; - return state; -} - -static scoped_refptr<ScrollPaintPropertyNode> CreateScroll( - const ScrollPaintPropertyNode& parent, - const ScrollPaintPropertyNode::State& state_arg, - MainThreadScrollingReasons main_thread_scrolling_reasons = - cc::MainThreadScrollingReason::kNotScrollingOnMain, - CompositorElementId scroll_element_id = CompositorElementId()) { - ScrollPaintPropertyNode::State state = state_arg; - state.main_thread_scrolling_reasons = main_thread_scrolling_reasons; - state.compositor_element_id = scroll_element_id; - return ScrollPaintPropertyNode::Create(parent, std::move(state)); +// Returns a RefCountedPropertyTreeState for composited scrolling paint +// properties with another set of arbitrary values. +static RefCountedPropertyTreeState ScrollState2( + const PropertyTreeState& parent_state = PropertyTreeState::Root(), + CompositingReasons compositing_reasons = + CompositingReason::kOverflowScrolling, + MainThreadScrollingReasons main_thread_reasons = kNotScrollingOnMain) { + return CreateScrollTranslationState( + parent_state, 39, 31, gfx::Rect(0, 0, 19, 23), gfx::Size(27, 31), + compositing_reasons, main_thread_reasons); } static void CheckCcScrollNode(const ScrollPaintPropertyNode& blink_scroll, @@ -1065,15 +1053,12 @@ } TEST_P(PaintArtifactCompositorTest, OneScrollNodeComposited) { - CompositorElementId scroll_element_id = ScrollElementId(2); - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_element_id); - auto scroll_translation = - CreateCompositedScrollTranslation(t0(), 7, 9, *scroll); + auto scroll_state = ScrollState1(); + auto& scroll = *scroll_state.Transform().ScrollNode(); TestPaintArtifact artifact; - CreateScrollableChunk(artifact, *scroll_translation, c0(), e0()); - artifact.Chunk(*scroll_translation, c0(), e0()) + CreateScrollableChunk(artifact, scroll_state); + artifact.Chunk(scroll_state) .RectDrawing(gfx::Rect(-110, 12, 170, 19), Color::kWhite); // Scroll node ElementIds are referenced by scroll animations. @@ -1083,10 +1068,10 @@ // Node #0 reserved for null; #1 for root render surface. ASSERT_EQ(3u, scroll_tree.size()); const cc::ScrollNode& scroll_node = *scroll_tree.Node(2); - CheckCcScrollNode(*scroll, scroll_node); + CheckCcScrollNode(scroll, scroll_node); EXPECT_EQ(1, scroll_node.parent_id); - EXPECT_EQ(scroll_element_id, ScrollableLayerAt(0)->element_id()); - EXPECT_EQ(scroll_node.id, ElementIdToScrollNodeIndex(scroll_element_id)); + EXPECT_EQ(scroll_node.element_id, ScrollableLayerAt(0)->element_id()); + EXPECT_EQ(scroll_node.id, ElementIdToScrollNodeIndex(scroll_node.element_id)); const cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree(); const cc::TransformNode& transform_node = @@ -1129,14 +1114,11 @@ } TEST_P(PaintArtifactCompositorTest, OneScrollNodeNonComposited) { - CompositorElementId scroll_element_id = ScrollElementId(2); - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_element_id); - auto scroll_translation = CreateScrollTranslation(t0(), 7, 9, *scroll); - + auto scroll_state = + ScrollState1(PropertyTreeState::Root(), CompositingReason::kNone); TestPaintArtifact artifact; - CreateScrollableChunk(artifact, *scroll_translation, c0(), e0()); - artifact.Chunk(*scroll_translation, c0(), e0()) + CreateScrollableChunk(artifact, scroll_state); + artifact.Chunk(scroll_state) .RectDrawing(gfx::Rect(-110, 12, 170, 19), Color::kWhite); Update(artifact.Build()); @@ -1148,15 +1130,13 @@ } TEST_P(PaintArtifactCompositorTest, TransformUnderScrollNode) { - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1()); - auto scroll_translation = CreateScrollTranslation(t0(), 7, 9, *scroll); - + auto scroll_state = ScrollState1(); auto transform = - CreateTransform(*scroll_translation, TransformationMatrix(), + CreateTransform(scroll_state.Transform(), TransformationMatrix(), gfx::Point3F(), CompositingReason::kWillChangeTransform); TestPaintArtifact artifact; - artifact.Chunk(*scroll_translation, c0(), e0()) + artifact.Chunk(scroll_state) .RectDrawing(gfx::Rect(-20, 4, 60, 8), Color::kBlack) .Chunk(*transform, c0(), e0()) .RectDrawing(gfx::Rect(1, -30, 5, 70), Color::kWhite); @@ -1196,73 +1176,64 @@ TEST_P(PaintArtifactCompositorTest, NestedScrollNodes) { auto effect = CreateOpacityEffect(e0(), 0.5); - CompositorElementId scroll_element_id_a = ScrollElementId(2); - auto scroll_a = CreateScroll( - ScrollPaintPropertyNode::Root(), ScrollState1(), - cc::MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects, - scroll_element_id_a); - auto scroll_translation_a = - CreateCompositedScrollTranslation(t0(), 11, 13, *scroll_a); + auto scroll_state_a = ScrollState1( + PropertyTreeState(t0(), c0(), *effect), + cc::MainThreadScrollingReason::kHasBackgroundAttachmentFixedObjects); + auto& scroll_a = *scroll_state_a.Transform().ScrollNode(); + auto scroll_state_b = ScrollState2(scroll_state_a.GetPropertyTreeState()); + auto& scroll_b = *scroll_state_b.Transform().ScrollNode(); - CompositorElementId scroll_element_id_b = ScrollElementId(3); - auto scroll_b = CreateScroll(*scroll_a, ScrollState2(), kNotScrollingOnMain, - scroll_element_id_b); - auto scroll_translation_b = CreateCompositedScrollTranslation( - *scroll_translation_a, 37, 41, *scroll_b); TestPaintArtifact artifact; - artifact.Chunk(*scroll_translation_a, c0(), *effect) + CreateScrollableChunk(artifact, scroll_state_a); + artifact.Chunk(scroll_state_a) .RectDrawing(gfx::Rect(7, 11, 13, 17), Color::kWhite); - CreateScrollableChunk(artifact, *scroll_translation_a, c0(), *effect); - artifact.Chunk(*scroll_translation_b, c0(), *effect) + CreateScrollableChunk(artifact, scroll_state_b); + artifact.Chunk(scroll_state_b) .RectDrawing(gfx::Rect(1, 2, 3, 5), Color::kWhite); - CreateScrollableChunk(artifact, *scroll_translation_b, c0(), *effect); Update(artifact.Build()); const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree(); // Node #0 reserved for null; #1 for root render surface. ASSERT_EQ(4u, scroll_tree.size()); const cc::ScrollNode& scroll_node_a = *scroll_tree.Node(2); - CheckCcScrollNode(*scroll_a, scroll_node_a); + CheckCcScrollNode(scroll_a, scroll_node_a); EXPECT_EQ(1, scroll_node_a.parent_id); - EXPECT_EQ(scroll_element_id_a, ScrollableLayerAt(0)->element_id()); - EXPECT_EQ(scroll_node_a.id, ElementIdToScrollNodeIndex(scroll_element_id_a)); + EXPECT_EQ(scroll_node_a.element_id, ScrollableLayerAt(0)->element_id()); + EXPECT_EQ(scroll_node_a.id, + ElementIdToScrollNodeIndex(scroll_node_a.element_id)); const cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree(); const cc::TransformNode& transform_node_a = *transform_tree.Node(scroll_node_a.transform_id); EXPECT_TRUE(transform_node_a.local.IsIdentity()); - EXPECT_EQ(gfx::PointF(-11, -13), transform_node_a.scroll_offset); + EXPECT_EQ(gfx::PointF(-7, -9), transform_node_a.scroll_offset); const cc::ScrollNode& scroll_node_b = *scroll_tree.Node(3); - CheckCcScrollNode(*scroll_b, scroll_node_b); + CheckCcScrollNode(scroll_b, scroll_node_b); EXPECT_EQ(scroll_node_a.id, scroll_node_b.parent_id); - EXPECT_EQ(scroll_element_id_b, ScrollableLayerAt(1)->element_id()); - EXPECT_EQ(scroll_node_b.id, ElementIdToScrollNodeIndex(scroll_element_id_b)); + EXPECT_EQ(scroll_node_b.element_id, ScrollableLayerAt(1)->element_id()); + EXPECT_EQ(scroll_node_b.id, + ElementIdToScrollNodeIndex(scroll_node_b.element_id)); const cc::TransformNode& transform_node_b = *transform_tree.Node(scroll_node_b.transform_id); EXPECT_TRUE(transform_node_b.local.IsIdentity()); - EXPECT_EQ(gfx::PointF(-37, -41), transform_node_b.scroll_offset); + EXPECT_EQ(gfx::PointF(-39, -31), transform_node_b.scroll_offset); } TEST_P(PaintArtifactCompositorTest, ScrollHitTestLayerOrder) { - auto clip = CreateClip(c0(), t0(), FloatRoundedRect(0, 0, 100, 100)); - - CompositorElementId scroll_element_id = ScrollElementId(2); - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_element_id); - auto scroll_translation = CreateScrollTranslation( - t0(), 7, 9, *scroll, CompositingReason::kWillChangeTransform); + auto scroll_state = ScrollState1(); + auto& scroll = *scroll_state.Transform().ScrollNode(); auto transform = CreateTransform( - *scroll_translation, TransformationMatrix().Translate(5, 5), + scroll_state.Transform(), TransformationMatrix().Translate(5, 5), gfx::Point3F(), CompositingReason::k3DTransform); TestPaintArtifact artifact; - artifact.Chunk(*scroll_translation, *clip, e0()) + artifact.Chunk(scroll_state) .RectDrawing(gfx::Rect(0, 0, 100, 100), Color::kWhite); - CreateScrollableChunk(artifact, *scroll_translation, *clip, e0()); - artifact.Chunk(*transform, *clip, e0()) + CreateScrollableChunk(artifact, scroll_state); + artifact.Chunk(*transform, scroll_state.Clip(), scroll_state.Effect()) .RectDrawing(gfx::Rect(0, 0, 50, 50), Color::kBlack); Update(artifact.Build()); @@ -1276,8 +1247,9 @@ const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree(); auto* scroll_node = scroll_tree.Node(ScrollableLayerAt(0)->scroll_tree_index()); - ASSERT_EQ(scroll_element_id, scroll_node->element_id); - EXPECT_EQ(scroll_element_id, ScrollableLayerAt(0)->element_id()); + ASSERT_EQ(scroll.GetCompositorElementId(), scroll_node->element_id); + EXPECT_EQ(scroll.GetCompositorElementId(), + ScrollableLayerAt(0)->element_id()); EXPECT_TRUE(ScrollableLayerAt(0)->HitTestable()); // The second content layer should appear after the first. @@ -1287,27 +1259,15 @@ } TEST_P(PaintArtifactCompositorTest, NestedScrollableLayerOrder) { - auto clip_1 = CreateClip(c0(), t0(), FloatRoundedRect(0, 0, 100, 100)); - CompositorElementId scroll_1_element_id = ScrollElementId(1); - auto scroll_1 = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_1_element_id); - auto scroll_translation_1 = CreateScrollTranslation( - t0(), 7, 9, *scroll_1, CompositingReason::kWillChangeTransform); - - auto clip_2 = CreateClip(*clip_1, *scroll_translation_1, - FloatRoundedRect(0, 0, 50, 50)); - CompositorElementId scroll_2_element_id = ScrollElementId(2); - auto scroll_2 = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState2(), - kNotScrollingOnMain, scroll_2_element_id); - auto scroll_translation_2 = CreateScrollTranslation( - t0(), 0, 0, *scroll_2, CompositingReason::kWillChangeTransform); + auto scroll_state_1 = ScrollState1(); + auto& scroll_1 = *scroll_state_1.Transform().ScrollNode(); + auto scroll_state_2 = ScrollState2(scroll_state_1.GetPropertyTreeState()); + auto& scroll_2 = *scroll_state_2.Transform().ScrollNode(); TestPaintArtifact artifact; - CreateScrollableChunk(artifact, *scroll_translation_1, *clip_1->Parent(), - e0()); - CreateScrollableChunk(artifact, *scroll_translation_2, *clip_2->Parent(), - e0()); - artifact.Chunk(*scroll_translation_2, *clip_2, e0()) + CreateScrollableChunk(artifact, scroll_state_1); + CreateScrollableChunk(artifact, scroll_state_2); + artifact.Chunk(scroll_state_2) .RectDrawing(gfx::Rect(0, 0, 50, 50), Color::kWhite); Update(artifact.Build()); @@ -1316,7 +1276,7 @@ const cc::ClipTree& clip_tree = GetPropertyTrees().clip_tree(); auto* scroll_1_node = scroll_tree.Node(ScrollableLayerAt(0)->scroll_tree_index()); - ASSERT_EQ(scroll_1_element_id, scroll_1_node->element_id); + ASSERT_EQ(scroll_1.GetCompositorElementId(), scroll_1_node->element_id); auto* scroll_1_clip_node = clip_tree.Node(ScrollableLayerAt(0)->clip_tree_index()); // The scroll is not under clip_1. @@ -1324,11 +1284,11 @@ auto* scroll_2_node = scroll_tree.Node(ScrollableLayerAt(1)->scroll_tree_index()); - ASSERT_EQ(scroll_2_element_id, scroll_2_node->element_id); + ASSERT_EQ(scroll_2.GetCompositorElementId(), scroll_2_node->element_id); auto* scroll_2_clip_node = clip_tree.Node(ScrollableLayerAt(1)->clip_tree_index()); // The scroll is not under clip_2 but is under the parent clip, clip_1. - EXPECT_EQ(gfx::RectF(0, 0, 100, 100), scroll_2_clip_node->clip); + EXPECT_EQ(gfx::RectF(3, 5, 11, 13), scroll_2_clip_node->clip); // The first layer should be before the second scroll layer. EXPECT_LT(LayerIndex(ScrollableLayerAt(0)), LayerIndex(ScrollableLayerAt(1))); @@ -1344,23 +1304,15 @@ // If a scroll node is encountered before its parent, ensure the parent scroll // node is correctly created. TEST_P(PaintArtifactCompositorTest, AncestorScrollNodes) { - CompositorElementId scroll_element_id_a = ScrollElementId(2); - auto scroll_a = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_element_id_a); - auto scroll_translation_a = CreateScrollTranslation( - t0(), 11, 13, *scroll_a, CompositingReason::kOverflowScrolling); - - CompositorElementId scroll_element_id_b = ScrollElementId(3); - auto scroll_b = - CreateScroll(*scroll_a, ScrollState2(), - cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText, - scroll_element_id_b); - auto scroll_translation_b = - CreateScrollTranslation(*scroll_translation_a, 37, 41, *scroll_b); + auto scroll_state_a = ScrollState1(); + auto& scroll_a = *scroll_state_a.Transform().ScrollNode(); + auto scroll_state_b = ScrollState2( + scroll_state_a.GetPropertyTreeState(), CompositingReason::kNone, + cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText); TestPaintArtifact artifact; - CreateScrollableChunk(artifact, *scroll_translation_b, c0(), e0()); - CreateScrollableChunk(artifact, *scroll_translation_a, c0(), e0()); + CreateScrollableChunk(artifact, scroll_state_a); + CreateScrollableChunk(artifact, scroll_state_b); Update(artifact.Build()); const cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree(); @@ -1371,16 +1323,17 @@ const cc::ScrollNode& scroll_node_a = *scroll_tree.Node(2); EXPECT_EQ(1, scroll_node_a.parent_id); - EXPECT_EQ(scroll_element_id_a, scroll_node_a.element_id); - EXPECT_EQ(scroll_node_a.id, ElementIdToScrollNodeIndex(scroll_element_id_a)); + EXPECT_EQ(scroll_a.GetCompositorElementId(), scroll_node_a.element_id); + EXPECT_EQ(scroll_node_a.id, + ElementIdToScrollNodeIndex(scroll_node_a.element_id)); // The first scrollable layer should be associated with scroll_a. - EXPECT_EQ(scroll_element_id_a, ScrollableLayerAt(0)->element_id()); + EXPECT_EQ(scroll_node_a.element_id, ScrollableLayerAt(0)->element_id()); const cc::TransformTree& transform_tree = GetPropertyTrees().transform_tree(); const cc::TransformNode& transform_node_a = *transform_tree.Node(scroll_node_a.transform_id); EXPECT_TRUE(transform_node_a.local.IsIdentity()); - EXPECT_EQ(gfx::PointF(-11, -13), transform_node_a.scroll_offset); + EXPECT_EQ(gfx::PointF(-7, -9), transform_node_a.scroll_offset); } TEST_P(PaintArtifactCompositorTest, MergeSimpleChunks) { @@ -3918,11 +3871,12 @@ scroll_state.contents_size = gfx::Size(27, 32); scroll_state.user_scrollable_vertical = true; scroll_state.max_scroll_offset_affected_by_page_scale = true; - scroll_state.compositor_element_id = ScrollElementId(2); + auto scroll_element_id = CompositorElementIdFromUniqueObjectId( + NewUniqueObjectId(), CompositorElementIdNamespace::kScroll); + scroll_state.compositor_element_id = scroll_element_id; - auto scroll = - CreateScroll(ScrollPaintPropertyNode::Root(), scroll_state, - kNotScrollingOnMain, scroll_state.compositor_element_id); + auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), + std::move(scroll_state)); auto scroll_translation = CreateScrollTranslation(*scale_transform_node, 0, 0, *scroll); @@ -3935,7 +3889,7 @@ cc::ScrollTree& scroll_tree = GetPropertyTrees().scroll_tree_mutable(); cc::ScrollNode* cc_scroll_node = - scroll_tree.FindNodeFromElementId(scroll_state.compositor_element_id); + scroll_tree.FindNodeFromElementId(scroll_element_id); auto max_scroll_offset = scroll_tree.MaxScrollOffset(cc_scroll_node->id); // The max scroll offset should be scaled by the page scale factor (see: // |ScrollTree::MaxScrollOffset|). This adjustment scales the contents from @@ -4629,14 +4583,12 @@ } TEST_P(PaintArtifactCompositorTest, DirectlySetScrollOffset) { - CompositorElementId scroll_element_id = ScrollElementId(123); - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_element_id); - auto scroll_translation = CreateScrollTranslation( - t0(), 7, 9, *scroll, CompositingReason::kWillChangeTransform); + auto scroll_state = ScrollState1(); + auto& scroll = *scroll_state.Transform().ScrollNode(); + auto scroll_element_id = scroll.GetCompositorElementId(); TestPaintArtifact artifact; - CreateScrollableChunk(artifact, *scroll_translation, c0(), e0()); + CreateScrollableChunk(artifact, scroll_state); Update(artifact.Build()); const auto& scroll_tree = GetPropertyTrees().scroll_tree(); @@ -4682,31 +4634,26 @@ cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText; ASSERT_TRUE(cc::MainThreadScrollingReason::HasNonCompositedScrollReasons( main_thread_scrolling_reason)); - CompositorElementId scroll_element_id = ScrollElementId(123); - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - main_thread_scrolling_reason, scroll_element_id); - auto scroll_translation = CreateScrollTranslation(t0(), 7, 9, *scroll); + auto scroll_state = + ScrollState1(PropertyTreeState::Root(), main_thread_scrolling_reason); WTF::Vector<const TransformPaintPropertyNode*> scroll_translation_nodes; - scroll_translation_nodes.push_back(scroll_translation.get()); + scroll_translation_nodes.push_back(&scroll_state.Transform()); TestPaintArtifact artifact; Update(artifact.Build(), ViewportProperties(), scroll_translation_nodes); const auto& scroll_tree = GetPropertyTrees().scroll_tree(); - auto* scroll_node = scroll_tree.FindNodeFromElementId(scroll_element_id); + auto* scroll_node = scroll_tree.FindNodeFromElementId( + scroll_state.Transform().ScrollNode()->GetCompositorElementId()); EXPECT_TRUE(scroll_node); EXPECT_FALSE(scroll_node->is_composited); } TEST_P(PaintArtifactCompositorTest, RepaintIndirectScrollHitTest) { - CompositorElementId scroll_element_id = ScrollElementId(2); - auto scroll = CreateScroll(ScrollPaintPropertyNode::Root(), ScrollState1(), - kNotScrollingOnMain, scroll_element_id); - auto scroll_translation = CreateScrollTranslation(t0(), 7, 9, *scroll); - + auto scroll_state = ScrollState1(); TestPaintArtifact test_artifact; - CreateScrollableChunk(test_artifact, *scroll_translation, c0(), e0()); + CreateScrollableChunk(test_artifact, scroll_state); auto artifact = test_artifact.Build(); Update(artifact); ClearPropertyTreeChangedState();
diff --git a/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc b/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc index faa3ff0..fe6c4207 100644 --- a/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/cull_rect_test.cc
@@ -105,16 +105,13 @@ } TEST_F(CullRectTest, ApplyScrollTranslationPartialScrollingContents) { - ScrollPaintPropertyNode::State scroll_state; - scroll_state.container_rect = gfx::Rect(20, 10, 40, 50); - scroll_state.contents_size = gfx::Size(8000, 8000); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(scroll_state)); - auto scroll_translation = - CreateCompositedScrollTranslation(t0(), -3000, -5000, *scroll); + auto state = CreateCompositedScrollTranslationState( + PropertyTreeState::Root(), -3000, -5000, gfx::Rect(20, 10, 40, 50), + gfx::Size(8000, 8000)); + auto& scroll_translation = state.Transform(); CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); - EXPECT_TRUE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_TRUE(ApplyScrollTranslation(cull_rect, scroll_translation)); // Clipped: (20, 10, 30, 50) // Inverse transformed: (3020, 5010, 30, 50) @@ -123,7 +120,7 @@ EXPECT_EQ(gfx::Rect(20, 1010, 7030, 7000), cull_rect.Rect()); cull_rect = CullRect::Infinite(); - EXPECT_TRUE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_TRUE(ApplyScrollTranslation(cull_rect, scroll_translation)); // This result differs from the above result in width (7030 vs 7040) // because it's not clipped by the infinite input cull rect. EXPECT_EQ(gfx::Rect(20, 1010, 7040, 7000), cull_rect.Rect()); @@ -131,67 +128,56 @@ TEST_F(CullRectTest, ApplyNonCompositedScrollTranslationPartialScrollingContents) { - ScrollPaintPropertyNode::State scroll_state; - scroll_state.container_rect = gfx::Rect(20, 10, 40, 50); - scroll_state.contents_size = gfx::Size(8000, 8000); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(scroll_state)); - auto scroll_translation = - CreateScrollTranslation(t0(), -3000, -5000, *scroll); + auto state = CreateScrollTranslationState(PropertyTreeState::Root(), -3000, + -5000, gfx::Rect(20, 10, 40, 50), + gfx::Size(8000, 8000)); + auto& scroll_translation = state.Transform(); CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); - EXPECT_FALSE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_FALSE(ApplyScrollTranslation(cull_rect, scroll_translation)); // Clipped: (20, 10, 30, 50) // Inverse transformed: (3020, 5010, 30, 50) EXPECT_EQ(gfx::Rect(3020, 5010, 30, 50), cull_rect.Rect()); cull_rect = CullRect::Infinite(); - EXPECT_FALSE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_FALSE(ApplyScrollTranslation(cull_rect, scroll_translation)); // This result differs from the above result in width (40 vs 30) // because it's not clipped by the infinite input cull rect. EXPECT_EQ(gfx::Rect(3020, 5010, 40, 50), cull_rect.Rect()); } TEST_F(CullRectTest, ApplyScrollTranslationNoIntersectionWithContainerRect) { - ScrollPaintPropertyNode::State scroll_state; - scroll_state.container_rect = gfx::Rect(200, 100, 40, 50); - scroll_state.contents_size = gfx::Size(2000, 2000); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(scroll_state)); - auto scroll_translation = - CreateCompositedScrollTranslation(t0(), -10, -15, *scroll); + auto state = CreateCompositedScrollTranslationState( + PropertyTreeState::Root(), -10, -15, gfx::Rect(200, 100, 40, 50), + gfx::Size(2000, 2000)); + auto& scroll_translation = state.Transform(); CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); - EXPECT_FALSE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_FALSE(ApplyScrollTranslation(cull_rect, scroll_translation)); EXPECT_TRUE(cull_rect.Rect().IsEmpty()); } TEST_F(CullRectTest, ApplyNonCompositedScrollTranslationNoIntersectionWithContainerRect) { - ScrollPaintPropertyNode::State scroll_state; - scroll_state.container_rect = gfx::Rect(200, 100, 40, 50); - scroll_state.contents_size = gfx::Size(2000, 2000); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(scroll_state)); - auto scroll_translation = CreateScrollTranslation(t0(), -10, -15, *scroll); + auto state = CreateCompositedScrollTranslationState( + PropertyTreeState::Root(), -10, -15, gfx::Rect(200, 100, 40, 50), + gfx::Size(2000, 2000)); + auto& scroll_translation = state.Transform(); CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); - EXPECT_FALSE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_FALSE(ApplyScrollTranslation(cull_rect, scroll_translation)); EXPECT_TRUE(cull_rect.Rect().IsEmpty()); } TEST_F(CullRectTest, ApplyScrollTranslationWholeScrollingContents) { - ScrollPaintPropertyNode::State scroll_state; - scroll_state.container_rect = gfx::Rect(20, 10, 40, 50); - scroll_state.contents_size = gfx::Size(2000, 2000); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(scroll_state)); - auto scroll_translation = - CreateCompositedScrollTranslation(t0(), -10, -15, *scroll); + auto state = CreateCompositedScrollTranslationState( + PropertyTreeState::Root(), -10, -15, gfx::Rect(20, 10, 40, 50), + gfx::Size(2000, 2000)); + auto& scroll_translation = state.Transform(); CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); - EXPECT_TRUE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_TRUE(ApplyScrollTranslation(cull_rect, scroll_translation)); // Clipped: (20, 10, 30, 50) // Inverse transformed: (30, 25, 30, 50) @@ -200,28 +186,26 @@ EXPECT_EQ(gfx::Rect(20, 10, 2000, 2000), cull_rect.Rect()); cull_rect = CullRect::Infinite(); - EXPECT_TRUE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_TRUE(ApplyScrollTranslation(cull_rect, scroll_translation)); EXPECT_EQ(gfx::Rect(20, 10, 2000, 2000), cull_rect.Rect()); } TEST_F(CullRectTest, ApplyNonCompositedScrollTranslationWholeScrollingContents) { - ScrollPaintPropertyNode::State scroll_state; - scroll_state.container_rect = gfx::Rect(20, 10, 40, 50); - scroll_state.contents_size = gfx::Size(2000, 2000); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(scroll_state)); - auto scroll_translation = CreateScrollTranslation(t0(), -10, -15, *scroll); + auto state = CreateScrollTranslationState(PropertyTreeState::Root(), -10, -15, + gfx::Rect(20, 10, 40, 50), + gfx::Size(2000, 2000)); + auto& scroll_translation = state.Transform(); CullRect cull_rect(gfx::Rect(0, 0, 50, 100)); - EXPECT_FALSE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_FALSE(ApplyScrollTranslation(cull_rect, scroll_translation)); // Clipped: (20, 10, 30, 50) // Inverse transformed: (30, 25, 30, 50) EXPECT_EQ(gfx::Rect(30, 25, 30, 50), cull_rect.Rect()); cull_rect = CullRect::Infinite(); - EXPECT_FALSE(ApplyScrollTranslation(cull_rect, *scroll_translation)); + EXPECT_FALSE(ApplyScrollTranslation(cull_rect, scroll_translation)); // This result differs from the above result in height (40 vs 30) // because it's not clipped by the infinite input cull rect. EXPECT_EQ(gfx::Rect(30, 25, 40, 50), cull_rect.Rect()); @@ -657,21 +641,23 @@ auto root = PropertyTreeState::Root(); auto c1 = CreateClip(c0(), t0(), FloatRoundedRect(0, 10000, 100, 100)); auto t1 = Create2DTranslation(t0(), 0, 10000); - auto scroll_clip = CreateClip(*c1, *t1, FloatRoundedRect(0, 0, 120, 120)); - auto scroll_translation = CreateCompositedScrollTranslation( - *t1, 0, 0, gfx::Rect(0, 0, 120, 120), gfx::Size(10000, 5000)); - auto c2a = CreateClip(*scroll_clip, *scroll_translation, + auto scroll_state = CreateCompositedScrollTranslationState( + PropertyTreeState(*t1, *c1, e0()), 0, 0, gfx::Rect(0, 0, 120, 120), + gfx::Size(10000, 5000)); + auto& scroll_clip = scroll_state.Clip(); + auto& scroll_translation = scroll_state.Transform(); + auto c2a = CreateClip(scroll_clip, scroll_translation, FloatRoundedRect(0, 300, 100, 100)); - auto c2b = CreateClip(*scroll_clip, *scroll_translation, + auto c2b = CreateClip(scroll_clip, scroll_translation, FloatRoundedRect(0, 8000, 100, 100)); auto t2 = - CreateTransform(*scroll_translation, TransformationMatrix(), + CreateTransform(scroll_translation, TransformationMatrix(), gfx::Point3F(), CompositingReason::kWillChangeTransform); // c2a is out of view, but in the expansion area of the composited scroll. CullRect cull_rect = CullRect::Infinite(); cull_rect.ApplyPaintProperties( - root, root, PropertyTreeState(*scroll_translation, *c2a, e0()), + root, root, PropertyTreeState(scroll_translation, *c2a, e0()), absl::nullopt); EXPECT_EQ(gfx::Rect(0, 300, 100, 100), cull_rect.Rect()); // Composited case. The cull rect should be expanded. @@ -683,7 +669,7 @@ // Using c2a with old cull rect. cull_rect = CullRect::Infinite(); cull_rect.ApplyPaintProperties( - root, root, PropertyTreeState(*scroll_translation, *c2a, e0()), + root, root, PropertyTreeState(scroll_translation, *c2a, e0()), CullRect(gfx::Rect(0, 310, 100, 100))); // The new cull rect touches the left edge of the clipped expanded scrolling // contents bounds, so the old cull rect is not used. @@ -699,7 +685,7 @@ // c2b is out of the expansion area of the composited scroll. cull_rect = CullRect::Infinite(); cull_rect.ApplyPaintProperties( - root, root, PropertyTreeState(*scroll_translation, *c2b, e0()), + root, root, PropertyTreeState(scroll_translation, *c2b, e0()), absl::nullopt); EXPECT_EQ(gfx::Rect(), cull_rect.Rect()); // Composited case. The cull rect should be still empty. @@ -713,8 +699,9 @@ // associated with the same scroll translation. TEST_F(CullRectTest, MultipleClips) { auto t1 = Create2DTranslation(t0(), 0, 0); - auto scroll_translation = CreateCompositedScrollTranslation( - *t1, 0, 0, gfx::Rect(0, 0, 100, 100), gfx::Size(100, 2000)); + auto scroll_state = CreateCompositedScrollTranslationState( + PropertyTreeState(*t1, c0(), e0()), 0, 0, gfx::Rect(0, 0, 100, 100), + gfx::Size(100, 2000)); auto border_radius_clip = CreateClip(c0(), *t1, FloatRoundedRect(0, 0, 100, 100)); auto scroll_clip = @@ -722,7 +709,7 @@ PropertyTreeState root = PropertyTreeState::Root(); PropertyTreeState source(*t1, c0(), e0()); - PropertyTreeState destination(*scroll_translation, *scroll_clip, e0()); + PropertyTreeState destination = scroll_state.GetPropertyTreeState(); CullRect cull_rect(gfx::Rect(0, 0, 800, 600)); cull_rect.ApplyPaintProperties(root, source, destination, absl::nullopt); EXPECT_EQ(gfx::Rect(0, 0, 100, 2000), cull_rect.Rect());
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc index 2c134ef8..ad9d69b 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.cc
@@ -12,12 +12,33 @@ namespace { +// Expands a visual rect under a fixed-position transform so that the result +// covers all area that could overlap with anything under the scroller during +// scrolling. +void ExpandFixedVisualRectInScroller( + const TransformPaintPropertyNode& scroll_translation, + gfx::RectF& rect) { + DCHECK(scroll_translation.ScrollNode()); + + // First move the rect back to the min scroll offset, by accounting for the + // current scroll offset. + rect.Offset(scroll_translation.Translation2D()); + + // Calculate the max scroll offset and expand by that amount. The max scroll + // offset is the contents size minus one viewport's worth of space (i.e. the + // container rect size). + gfx::SizeF expansion(scroll_translation.ScrollNode()->ContentsRect().size() - + scroll_translation.ScrollNode()->ContainerRect().size()); + rect.set_size(rect.size() + expansion); +} + // Walk up from the local transform to the ancestor. If the last transform // before hitting the ancestor is a fixed node, expand based on the min and // max scroll offsets. void ExpandFixedBoundsInScroller(const TransformPaintPropertyNode* local, const TransformPaintPropertyNode* ancestor, FloatClipRect& rect_to_map) { + DCHECK(!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()); const TransformPaintPropertyNode* current = local->UnaliasedParent(); const TransformPaintPropertyNode* previous = local; while (current != nullptr && current != ancestor) { @@ -29,18 +50,7 @@ if (!node) return; - DCHECK(node->ScrollNode()); - - // First move the rect back to the min scroll offset, by accounting for the - // current scroll offset. - rect_to_map.Rect().Offset(node->Translation2D()); - - // Calculate the max scroll offset and expand by that amount. The max scroll - // offset is the contents size minus one viewport's worth of space (i.e. the - // container rect size). - gfx::SizeF expansion(node->ScrollNode()->ContentsRect().size() - - node->ScrollNode()->ContainerRect().size()); - rect_to_map.Rect().set_size(rect_to_map.Rect().size() + expansion); + ExpandFixedVisualRectInScroller(*node, rect_to_map.Rect()); } } // namespace @@ -309,6 +319,7 @@ } else { translation_2d_or_matrix.MapFloatClipRect(rect_to_map); if (for_compositing_overlap == ForCompositingOverlap::kYes && + !RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled() && extra_result.has_fixed) { ExpandFixedBoundsInScroller(&local_state.Transform(), &ancestor_state.Transform(), rect_to_map); @@ -455,11 +466,13 @@ return clip; } -bool GeometryMapper::MightOverlapForCompositing( +bool GeometryMapper::MightOverlapForCompositingLegacy( const gfx::RectF& rect1, const PropertyTreeState& state1, const gfx::RectF& rect2, const PropertyTreeState& state2) { + DCHECK(!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()); + PropertyTreeState common_ancestor( state1.Transform().LowestCommonAncestor(state2.Transform()).Unalias(), state1.Clip().LowestCommonAncestor(state2.Clip()).Unalias(), @@ -476,9 +489,118 @@ common_ancestor.SetClip( clip_b->LowestCommonAncestor(common_ancestor.Clip()).Unalias()); } - return VisualRectForCompositingOverlap(rect1, state1, common_ancestor) - .Intersects( - VisualRectForCompositingOverlap(rect2, state2, common_ancestor)); + auto v1 = VisualRectForCompositingOverlap(rect1, state1, common_ancestor); + auto v2 = VisualRectForCompositingOverlap(rect2, state2, common_ancestor); + return v1.Intersects(v2); +} + +bool GeometryMapper::MightOverlapForCompositing( + const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2) { + if (!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) + return MightOverlapForCompositingLegacy(rect1, state1, rect2, state2); + + const auto* scroll_translation1 = + &state1.Transform().NearestScrollTranslationNode(); + const auto* scroll_translation2 = + &state2.Transform().NearestScrollTranslationNode(); + if (LIKELY(scroll_translation1 == scroll_translation2)) + return MightOverlapForCompositingInternal(rect1, state1, rect2, state2); + + auto new_rect1 = rect1; + auto new_state1 = state1; + auto new_rect2 = rect2; + auto new_state2 = state2; + + // The first two blocks below handle simple cases of overlap testing between + // 1. a visual rect (can be rect1 or rect2) directly under a fixed-position + // transform, and + // 2. the other visual rect directly under the scroll translation associated + // with the fixed-position transform. + // Complex cases where #2 is under multiple level scrollers will be handled + // in the third block which also handles generic cases of overlap testing + // across scrollers. More complex (but rare) cases where #1 is indirectly + // under a fixed-position transform will be treated like a generic case. + const auto* fixed_scroll_translation1 = + state1.Transform().ScrollTranslationForFixed(); + const auto* fixed_scroll_translation2 = + state2.Transform().ScrollTranslationForFixed(); + if (fixed_scroll_translation1 == scroll_translation2) { + ExpandFixedVisualRectInScroller(*fixed_scroll_translation1, new_rect1); + } else if (scroll_translation1 == fixed_scroll_translation2) { + ExpandFixedVisualRectInScroller(*fixed_scroll_translation2, new_rect2); + } else { + const auto& transform_lca = + state1.Transform().LowestCommonAncestor(state2.Transform()).Unalias(); + const auto& scroll_translation_lca = + transform_lca.NearestScrollTranslationNode(); + bool between_fixed_and_non_fixed = false; + + // If we will test overlap across scroll translations, adjust each property + // tree state to be the parent of the highest scroll translation under + // |transform_lca| along the ancestor path, and the visual rect to be the + // scroll container rect, assuming the visual rect under the scroll + // translation can be anywhere in the scroll container rect, thus we can + // avoid re-testing overlap on change of scroll offset. + auto adjust_rect_and_state = + [&scroll_translation_lca, &between_fixed_and_non_fixed]( + const TransformPaintPropertyNode* scroll_translation, + const TransformPaintPropertyNode* other_fixed_scroll_translation, + gfx::RectF& rect, PropertyTreeState& state) { + if (scroll_translation == &scroll_translation_lca) + return; + + auto* parent = scroll_translation->UnaliasedParent(); + DCHECK(parent); + for (auto* next = &parent->NearestScrollTranslationNode(); + next != &scroll_translation_lca; + next = &parent->NearestScrollTranslationNode()) { + if (next == other_fixed_scroll_translation) { + between_fixed_and_non_fixed = true; + break; + } + scroll_translation = next; + parent = scroll_translation->UnaliasedParent(); + DCHECK(parent); + } + rect = gfx::RectF(scroll_translation->ScrollNode()->ContainerRect()); + state.SetTransform(*parent); + if (auto* clip = scroll_translation->ScrollNode()->OverflowClipNode()) + state.SetClip(*clip->UnaliasedParent()); + else + state.SetClip(ClipPaintPropertyNode::Root()); + }; + + adjust_rect_and_state(scroll_translation1, fixed_scroll_translation2, + new_rect1, new_state1); + if (between_fixed_and_non_fixed) { + ExpandFixedVisualRectInScroller(*fixed_scroll_translation2, new_rect2); + } else { + adjust_rect_and_state(scroll_translation2, fixed_scroll_translation1, + new_rect2, new_state2); + if (between_fixed_and_non_fixed) + ExpandFixedVisualRectInScroller(*fixed_scroll_translation1, new_rect1); + } + } + + return MightOverlapForCompositingInternal(new_rect1, new_state1, new_rect2, + new_state2); +} + +bool GeometryMapper::MightOverlapForCompositingInternal( + const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2) { + PropertyTreeState common_ancestor( + state1.Transform().LowestCommonAncestor(state2.Transform()).Unalias(), + state1.Clip().LowestCommonAncestor(state2.Clip()).Unalias(), + EffectPaintPropertyNode::Root()); + auto v1 = VisualRectForCompositingOverlap(rect1, state1, common_ancestor); + auto v2 = VisualRectForCompositingOverlap(rect2, state2, common_ancestor); + return v1.Intersects(v2); } const ClipPaintPropertyNode* GeometryMapper::HighestOutputClipBetween(
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h index 4250c1fb..5284d34 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper.h
@@ -288,6 +288,16 @@ OverlayScrollbarClipBehavior, InclusiveIntersectOrNot); + static bool MightOverlapForCompositingLegacy(const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2); + static bool MightOverlapForCompositingInternal( + const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2); + static const ClipPaintPropertyNode* HighestOutputClipBetween( const EffectPaintPropertyNode& ancestor, const EffectPaintPropertyNode& descendant);
diff --git a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc index f80a286..6d7b7cb4 100644 --- a/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/geometry_mapper_test.cc
@@ -45,6 +45,24 @@ local_state.Unalias(), ancestor_state.Unalias(), mapping_rect); } + bool MightOverlapForCompositing(const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2) { + bool result = GeometryMapper::MightOverlapForCompositing(rect1, state1, + rect2, state2); + EXPECT_EQ(result, GeometryMapper::MightOverlapForCompositing( + rect2, state2, rect1, state1)); + return result; + } + + // For any rect |r|, MightOverlapForCompositing(rect1, state1, r, state2) is + // expected to be true iff |r| intersects |rect2| in |state2|. + void CheckOverlap(const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2); + void CheckMappings(); void CheckLocalToAncestorVisualRect(); void CheckLocalToAncestorClipRect(); @@ -158,6 +176,53 @@ CheckCachedClip(); } +void GeometryMapperTest::CheckOverlap(const gfx::RectF& rect1, + const PropertyTreeState& state1, + const gfx::RectF& rect2, + const PropertyTreeState& state2) { + // How to debug: If anything fail, keep only the following line, and examine + // whether the two visual rects from VisualRectForCompositingOverlap() are + // equal. If not, examine the test data and GeometryMapper code. + EXPECT_TRUE(MightOverlapForCompositing(rect1, state1, rect2, state2)); + + // Test four 1x1 rects around each corner. + gfx::RectF top_left(rect2.origin(), gfx::SizeF(1, 1)); + EXPECT_TRUE(MightOverlapForCompositing(rect1, state1, top_left, state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, top_left - gfx::Vector2dF(1, 0), state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, top_left - gfx::Vector2dF(1, 1), state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, top_left - gfx::Vector2dF(0, 1), state2)); + + gfx::RectF top_right(rect2.top_right(), gfx::SizeF(1, 1)); + EXPECT_FALSE(MightOverlapForCompositing(rect1, state1, top_right, state2)); + EXPECT_TRUE(MightOverlapForCompositing( + rect1, state1, top_right - gfx::Vector2dF(1, 0), state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, top_right - gfx::Vector2dF(1, 1), state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, top_right - gfx::Vector2dF(0, 1), state2)); + + gfx::RectF bottom_right(rect2.bottom_right(), gfx::SizeF(1, 1)); + EXPECT_FALSE(MightOverlapForCompositing(rect1, state1, bottom_right, state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, bottom_right - gfx::Vector2dF(1, 0), state2)); + EXPECT_TRUE(MightOverlapForCompositing( + rect1, state1, bottom_right - gfx::Vector2dF(1, 1), state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, bottom_right - gfx::Vector2dF(0, 1), state2)); + + gfx::RectF bottom_left(rect2.bottom_left(), gfx::SizeF(1, 1)); + EXPECT_FALSE(MightOverlapForCompositing(rect1, state1, bottom_left, state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, bottom_left - gfx::Vector2dF(1, 0), state2)); + EXPECT_FALSE(MightOverlapForCompositing( + rect1, state1, bottom_left - gfx::Vector2dF(1, 1), state2)); + EXPECT_TRUE(MightOverlapForCompositing( + rect1, state1, bottom_left - gfx::Vector2dF(0, 1), state2)); +} + TEST_P(GeometryMapperTest, Root) { input_rect = gfx::RectF(0, 0, 100, 100); expected_visual_rect = FloatClipRect(input_rect); @@ -749,25 +814,20 @@ } TEST_P(GeometryMapperTest, ExpandVisualRectForFixed) { + // With ScrollUpdateOptimizations, we don't expand visual rect for fixed in + // LocalToAncestorVisualRectInternal(), but check overlap before it. + if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) + return; + auto above_viewport = CreateTransform(t0(), TransformationMatrix()); auto viewport = CreateTransform(*above_viewport, TransformationMatrix()); - auto scroll_translation = CreateScrollTranslation( - *viewport, -100, -200, gfx::Rect(0, 0, 800, 600), gfx::Size(2400, 1800), - CompositingReason::kOverflowScrolling); + auto scroll_state = CreateCompositedScrollTranslationState( + PropertyTreeState(*viewport, c0(), e0()), -100, -200, + gfx::Rect(0, 0, 800, 600), gfx::Size(2400, 1800)); - auto fixed_translate = TransformationMatrix().Translate(100, 0); - - const gfx::Vector2dF fixed_offset(200, 200); - TransformPaintPropertyNode::State fixed_state{fixed_offset, nullptr, - scroll_translation}; - fixed_state.direct_compositing_reasons = CompositingReason::kFixedPosition; - auto fixed_transform = - TransformPaintPropertyNode::Create(*viewport, std::move(fixed_state)); - - const gfx::Vector2dF child_of_fixed_offset(50, 50); - TransformPaintPropertyNode::State child_of_fixed_state{child_of_fixed_offset}; - auto child_of_fixed = TransformPaintPropertyNode::Create( - *fixed_transform, std::move(child_of_fixed_state)); + auto fixed_transform = CreateFixedPositionTranslation( + *viewport, 200, 200, scroll_state.Transform()); + auto child_of_fixed = Create2DTranslation(*fixed_transform, 50, 50); local_state.SetTransform(*child_of_fixed); ancestor_state.SetTransform(*viewport); @@ -775,7 +835,7 @@ const gfx::SizeF child_of_fixed_size(100, 100); input_rect = gfx::RectF(child_of_fixed_size); - const gfx::Vector2dF descendant_offset = fixed_offset + child_of_fixed_offset; + const gfx::Vector2dF descendant_offset(250, 250); expected_translation_2d = descendant_offset; expected_transformed_rect = gfx::RectF( gfx::PointAtOffsetFromOrigin(descendant_offset), child_of_fixed_size); @@ -1047,7 +1107,7 @@ GeometryMapper::SourceToDestinationProjection(*t2, *t3).IsIdentity()); } -TEST(GeometryMapperTest, VisualRectsMightOverlap) { +TEST_P(GeometryMapperTest, MightOverlap) { auto t2 = Create2DTranslation(t0(), 99, 0); auto t3 = Create2DTranslation(t0(), 100, 0); auto t4 = @@ -1059,17 +1119,13 @@ PropertyTreeState s3(*t3, c0(), e0()); PropertyTreeState s4(*t4, c0(), e0()); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s1, r, s1)); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s1, r, s2)); - EXPECT_FALSE(GeometryMapper::MightOverlapForCompositing(r, s1, r, s3)); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s1, r, s4)); - - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s2, r, s1)); - EXPECT_FALSE(GeometryMapper::MightOverlapForCompositing(r, s3, r, s1)); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s4, r, s1)); + EXPECT_TRUE(MightOverlapForCompositing(r, s1, r, s1)); + EXPECT_TRUE(MightOverlapForCompositing(r, s1, r, s2)); + EXPECT_FALSE(MightOverlapForCompositing(r, s1, r, s3)); + EXPECT_TRUE(MightOverlapForCompositing(r, s1, r, s4)); } -TEST(GeometryMapperTest, VisualRectsMightOverlapCommonClipAncestor) { +TEST_P(GeometryMapperTest, MightOverlapCommonClipAncestor) { auto common_clip = CreateClip(c0(), t0(), FloatRoundedRect(0, 0, 1, 1)); auto c1 = CreateClip(*common_clip, t0(), FloatRoundedRect(0, 100, 100, 100)); auto c2 = CreateClip(*common_clip, t0(), FloatRoundedRect(50, 100, 100, 100)); @@ -1081,13 +1137,120 @@ PropertyTreeState s2(t0(), *c2, e0()); PropertyTreeState s3(t0(), *c3, e0()); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s1, r, s2)); - EXPECT_FALSE(GeometryMapper::MightOverlapForCompositing(r, s1, r, s3)); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s2, r, s3)); + EXPECT_TRUE(MightOverlapForCompositing(r, s1, r, s2)); + EXPECT_FALSE(MightOverlapForCompositing(r, s1, r, s3)); + EXPECT_TRUE(MightOverlapForCompositing(r, s2, r, s3)); +} - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s2, r, s1)); - EXPECT_FALSE(GeometryMapper::MightOverlapForCompositing(r, s3, r, s1)); - EXPECT_TRUE(GeometryMapper::MightOverlapForCompositing(r, s3, r, s2)); +TEST_P(GeometryMapperTest, MightOverlapFixed) { + auto viewport = CreateTransform(t0(), TransformationMatrix()); + auto scroll_state1 = CreateScrollTranslationState( + PropertyTreeState(*viewport, c0(), e0()), -1234, -567, + gfx::Rect(0, 0, 800, 600), gfx::Size(2400, 1800)); + auto fixed_transform = CreateFixedPositionTranslation( + *viewport, 100, 200, scroll_state1.Transform()); + PropertyTreeState fixed_state(*fixed_transform, scroll_state1.Clip(), e0()); + + // A visual rect (0, 0, 100, 100) under fixed_transform (with a (100, 200) + // 2d translation) is expanded to (100, 200, 100 + 2400 -800, 100 + 1800 -600) + // which is (100, 200, 1700, 1300) in the scrolling space. + { + SCOPED_TRACE("fixed_state and scroll_state1"); + CheckOverlap(gfx::RectF(0, 0, 100, 100), fixed_state, + gfx::RectF(100, 200, 1700, 1300), + scroll_state1.GetPropertyTreeState()); + } + + if (RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) { + auto scroll_state2 = CreateScrollTranslationState( + scroll_state1.GetPropertyTreeState(), -2345, -678, + gfx::Rect(20, 10, 200, 100), gfx::Size(3000, 2000)); + // The result is false because the container rect of scroll_state2 doesn't + // intersect with the expanded fixed-position rect in scroll_state1. + EXPECT_FALSE(MightOverlapForCompositing( + gfx::RectF(0, 0, 100, 100), fixed_state, gfx::RectF(1, 2, 3, 4), + scroll_state2.GetPropertyTreeState())); + + auto scroll_state3 = CreateScrollTranslationState( + scroll_state1.GetPropertyTreeState(), -234, -567, + gfx::Rect(0, 300, 500, 500), gfx::Size(1000, 2000)); + EXPECT_TRUE(MightOverlapForCompositing( + gfx::RectF(0, 0, 100, 100), fixed_state, gfx::RectF(1, 2, 3, 4), + scroll_state3.GetPropertyTreeState())); + } +} + +TEST_P(GeometryMapperTest, MightOverlapScroll) { + // This test applies only if ScrollUpdateOptimizationsEnabled. + if (!RuntimeEnabledFeatures::ScrollUpdateOptimizationsEnabled()) + return; + + auto viewport = CreateTransform(t0(), TransformationMatrix()); + auto scroll_state1 = CreateScrollTranslationState( + PropertyTreeState(*viewport, c0(), e0()), -1234, -567, + gfx::Rect(10, 20, 100, 200), gfx::Size(2400, 1800)); + auto scroll_state2 = CreateScrollTranslationState( + scroll_state1.GetPropertyTreeState(), -2345, -678, + gfx::Rect(20, 10, 200, 100), gfx::Size(3000, 2000)); + + auto transform_outside = Create2DTranslation(*viewport, 100, 200); + PropertyTreeState state_outside(*transform_outside, c0(), e0()); + + auto transform_under_scroll1 = + Create2DTranslation(scroll_state1.Transform(), 34, 56); + PropertyTreeState state_under_scroll1( + *transform_under_scroll1, scroll_state1.Clip(), scroll_state1.Effect()); + + auto transform_under_scroll2 = + Create2DTranslation(scroll_state2.Transform(), 45, 67); + PropertyTreeState state_under_scroll2( + *transform_under_scroll2, scroll_state2.Clip(), scroll_state2.Effect()); + + // For any rect directly or indirectly under scroll_state1, we should use + // the outer scroller's container rect to check overlap with any rect outside + // of the scroll_state1. + gfx::RectF outer_container_rect1_in_state_outside(-90, -180, 100, 200); + { + SCOPED_TRACE("scroll_state1 and state_outside"); + CheckOverlap(gfx::RectF(1, 2, 3, 4), scroll_state1.GetPropertyTreeState(), + outer_container_rect1_in_state_outside, state_outside); + } + { + SCOPED_TRACE("state_under_scroll1 and state_outside"); + CheckOverlap(gfx::RectF(1, 2, 3, 4), state_under_scroll1, + outer_container_rect1_in_state_outside, state_outside); + } + { + SCOPED_TRACE("scroll_state2 and state_outside"); + CheckOverlap(gfx::RectF(3, 4, 5, 6), scroll_state2.GetPropertyTreeState(), + outer_container_rect1_in_state_outside, state_outside); + } + { + SCOPED_TRACE("state_under_scroll2 and state_outside"); + CheckOverlap(gfx::RectF(3, 4, 5, 6), state_under_scroll2, + outer_container_rect1_in_state_outside, state_outside); + } + + // For any rect under scroll_state2, we should use the inner scroller's + // container rect to check overlap with any rect between scroll_state1 and + // scroll_state2. + { + SCOPED_TRACE("scroll_state2 and scroll_state1"); + CheckOverlap(gfx::RectF(5, 6, 7, 8), scroll_state2.GetPropertyTreeState(), + gfx::RectF(20, 10, 200, 100), + scroll_state1.GetPropertyTreeState()); + } + { + SCOPED_TRACE("state_under_scroll2 and scroll_state1"); + CheckOverlap(gfx::RectF(5, 6, 7, 8), state_under_scroll2, + gfx::RectF(20, 10, 200, 100), + scroll_state1.GetPropertyTreeState()); + } + { + SCOPED_TRACE("state_under_scroll2 and state_under_scroll1"); + CheckOverlap(gfx::RectF(7, 8, 9, 10), state_under_scroll2, + gfx::RectF(-14, -46, 200, 100), state_under_scroll1); + } } } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.cc b/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.cc index 417d421..70b01a5 100644 --- a/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.cc +++ b/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.cc
@@ -29,6 +29,7 @@ const State& other) const { if (container_rect != other.container_rect || contents_size != other.contents_size || + overflow_clip_node != other.overflow_clip_node || user_scrollable_horizontal != other.user_scrollable_horizontal || user_scrollable_vertical != other.user_scrollable_vertical || prevent_viewport_scrolling_from_inner != @@ -58,6 +59,10 @@ json->SetString("containerRect", String(state_.container_rect.ToString())); if (!state_.contents_size.IsEmpty()) json->SetString("contentsSize", String(state_.contents_size.ToString())); + if (state_.overflow_clip_node) { + json->SetString("overflowClipNode", + String::Format("%p", state_.overflow_clip_node)); + } if (state_.user_scrollable_horizontal || state_.user_scrollable_vertical) { json->SetString( "userScrollable",
diff --git a/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.h b/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.h index e054bd3..c338bb2 100644 --- a/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.h +++ b/third_party/blink/renderer/platform/graphics/paint/scroll_paint_property_node.h
@@ -21,6 +21,8 @@ namespace blink { +class ClipPaintPropertyNode; + using MainThreadScrollingReasons = uint32_t; // A scroll node contains auxiliary scrolling information which includes how far @@ -44,6 +46,7 @@ struct PLATFORM_EXPORT State { gfx::Rect container_rect; gfx::Size contents_size; + const ClipPaintPropertyNode* overflow_clip_node = nullptr; bool user_scrollable_horizontal = false; bool user_scrollable_vertical = false; @@ -127,6 +130,10 @@ return gfx::Rect(state_.container_rect.origin(), state_.contents_size); } + const ClipPaintPropertyNode* OverflowClipNode() const { + return state_.overflow_clip_node; + } + bool UserScrollableHorizontal() const { return state_.user_scrollable_horizontal; }
diff --git a/third_party/blink/renderer/platform/graphics/paint/scrollbar_display_item_test.cc b/third_party/blink/renderer/platform/graphics/paint/scrollbar_display_item_test.cc index 4b9930d..1849d22 100644 --- a/third_party/blink/renderer/platform/graphics/paint/scrollbar_display_item_test.cc +++ b/third_party/blink/renderer/platform/graphics/paint/scrollbar_display_item_test.cc
@@ -15,28 +15,30 @@ namespace blink { -CompositorElementId ScrollbarElementId(const cc::Scrollbar& scrollbar) { - return CompositorElementIdFromUniqueObjectId( - 13579, scrollbar.Orientation() == cc::ScrollbarOrientation::HORIZONTAL - ? CompositorElementIdNamespace::kHorizontalScrollbar - : CompositorElementIdNamespace::kVerticalScrollbar); -} +class ScrollbarDisplayItemTest : public testing::Test { + protected: + ScrollbarDisplayItemTest() + : scroll_state_(CreateScrollTranslationState(PropertyTreeState::Root(), + 0, + 0, + gfx::Rect(0, 0, 100, 100), + gfx::Size(1000, 1000))) {} -CompositorElementId ScrollElementId() { - return CompositorElementIdFromUniqueObjectId( - 24680, CompositorElementIdNamespace::kScroll); -} + CompositorElementId ScrollbarElementId(const cc::Scrollbar& scrollbar) { + return CompositorElementIdFromUniqueObjectId( + 13579, scrollbar.Orientation() == cc::ScrollbarOrientation::HORIZONTAL + ? CompositorElementIdNamespace::kHorizontalScrollbar + : CompositorElementIdNamespace::kVerticalScrollbar); + } -scoped_refptr<TransformPaintPropertyNode> CreateScrollTranslation() { - ScrollPaintPropertyNode::State state{gfx::Rect(0, 0, 100, 100), - gfx::Size(1000, 1000)}; - state.compositor_element_id = ScrollElementId(); - auto scroll = ScrollPaintPropertyNode::Create(ScrollPaintPropertyNode::Root(), - std::move(state)); - return CreateScrollTranslation(t0(), 0, 0, *scroll); -} + CompositorElementId ScrollElementId() { + return scroll_state_.Transform().ScrollNode()->GetCompositorElementId(); + } -TEST(ScrollbarDisplayItemTest, HorizontalSolidColorScrollbar) { + RefCountedPropertyTreeState scroll_state_; +}; + +TEST_F(ScrollbarDisplayItemTest, HorizontalSolidColorScrollbar) { auto scrollbar = base::MakeRefCounted<cc::FakeScrollbar>(); scrollbar->set_orientation(cc::ScrollbarOrientation::HORIZONTAL); scrollbar->set_is_solid_color(true); @@ -47,11 +49,10 @@ FakeDisplayItemClient& client = *MakeGarbageCollected<FakeDisplayItemClient>(); gfx::Rect scrollbar_rect(0, 90, 100, 10); - auto scroll_translation = CreateScrollTranslation(); auto element_id = ScrollbarElementId(*scrollbar); ScrollbarDisplayItem display_item( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar, scrollbar_rect, - scroll_translation.get(), element_id, + &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); auto layer = display_item.CreateOrReuseLayer(nullptr); ASSERT_EQ(cc::ScrollbarLayerBase::kSolidColor, @@ -70,7 +71,7 @@ EXPECT_EQ(layer.get(), display_item.CreateOrReuseLayer(layer.get()).get()); } -TEST(ScrollbarDisplayItemTest, VerticalSolidColorScrollbar) { +TEST_F(ScrollbarDisplayItemTest, VerticalSolidColorScrollbar) { auto scrollbar = base::MakeRefCounted<cc::FakeScrollbar>(); scrollbar->set_orientation(cc::ScrollbarOrientation::VERTICAL); scrollbar->set_is_solid_color(true); @@ -81,11 +82,10 @@ FakeDisplayItemClient& client = *MakeGarbageCollected<FakeDisplayItemClient>(); gfx::Rect scrollbar_rect(90, 0, 10, 100); - auto scroll_translation = CreateScrollTranslation(); auto element_id = ScrollbarElementId(*scrollbar); ScrollbarDisplayItem display_item( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar, scrollbar_rect, - scroll_translation.get(), element_id, + &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); auto layer = display_item.CreateOrReuseLayer(nullptr); ASSERT_EQ(cc::ScrollbarLayerBase::kSolidColor, @@ -103,17 +103,16 @@ EXPECT_EQ(layer.get(), display_item.CreateOrReuseLayer(layer.get()).get()); } -TEST(ScrollbarDisplayItemTest, PaintedScrollbar) { +TEST_F(ScrollbarDisplayItemTest, PaintedScrollbar) { auto scrollbar = base::MakeRefCounted<cc::FakeScrollbar>(); FakeDisplayItemClient& client = *MakeGarbageCollected<FakeDisplayItemClient>(); gfx::Rect scrollbar_rect(0, 90, 100, 10); - auto scroll_translation = CreateScrollTranslation(); auto element_id = ScrollbarElementId(*scrollbar); ScrollbarDisplayItem display_item( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar, scrollbar_rect, - scroll_translation.get(), element_id, + &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); auto layer = display_item.CreateOrReuseLayer(nullptr); ASSERT_EQ(cc::ScrollbarLayerBase::kPainted, layer->GetScrollbarLayerType()); @@ -122,7 +121,7 @@ EXPECT_EQ(layer.get(), display_item.CreateOrReuseLayer(layer.get()).get()); } -TEST(ScrollbarDisplayItemTest, PaintedScrollbarOverlayNonNinePatch) { +TEST_F(ScrollbarDisplayItemTest, PaintedScrollbarOverlayNonNinePatch) { auto scrollbar = base::MakeRefCounted<cc::FakeScrollbar>(); scrollbar->set_has_thumb(true); scrollbar->set_is_overlay(true); @@ -130,11 +129,10 @@ FakeDisplayItemClient& client = *MakeGarbageCollected<FakeDisplayItemClient>(); gfx::Rect scrollbar_rect(0, 90, 100, 10); - auto scroll_translation = CreateScrollTranslation(); auto element_id = ScrollbarElementId(*scrollbar); ScrollbarDisplayItem display_item( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar, scrollbar_rect, - scroll_translation.get(), element_id, + &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); auto layer = display_item.CreateOrReuseLayer(nullptr); // We should create PaintedScrollbarLayer instead of @@ -145,7 +143,7 @@ EXPECT_EQ(layer.get(), display_item.CreateOrReuseLayer(layer.get()).get()); } -TEST(ScrollbarDisplayItemTest, PaintedScrollbarOverlayNinePatch) { +TEST_F(ScrollbarDisplayItemTest, PaintedScrollbarOverlayNinePatch) { auto scrollbar = base::MakeRefCounted<cc::FakeScrollbar>(); scrollbar->set_has_thumb(true); scrollbar->set_is_overlay(true); @@ -154,11 +152,10 @@ FakeDisplayItemClient& client = *MakeGarbageCollected<FakeDisplayItemClient>(); gfx::Rect scrollbar_rect(0, 90, 100, 10); - auto scroll_translation = CreateScrollTranslation(); auto element_id = ScrollbarElementId(*scrollbar); ScrollbarDisplayItem display_item( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar, scrollbar_rect, - scroll_translation.get(), element_id, + &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); auto layer = display_item.CreateOrReuseLayer(nullptr); ASSERT_EQ(cc::ScrollbarLayerBase::kPaintedOverlay, @@ -168,23 +165,22 @@ EXPECT_EQ(layer.get(), display_item.CreateOrReuseLayer(layer.get()).get()); } -TEST(ScrollbarDisplayItemTest, CreateOrReuseLayer) { +TEST_F(ScrollbarDisplayItemTest, CreateOrReuseLayer) { auto scrollbar1 = base::MakeRefCounted<cc::FakeScrollbar>(); FakeDisplayItemClient& client = *MakeGarbageCollected<FakeDisplayItemClient>(); gfx::Rect scrollbar_rect(0, 90, 100, 10); - auto scroll_translation = CreateScrollTranslation(); auto element_id = ScrollbarElementId(*scrollbar1); ScrollbarDisplayItem display_item1a( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar1, - scrollbar_rect, scroll_translation.get(), element_id, + scrollbar_rect, &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); auto layer1 = display_item1a.CreateOrReuseLayer(nullptr); ScrollbarDisplayItem display_item1b( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar1, - scrollbar_rect, scroll_translation.get(), element_id, + scrollbar_rect, &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); // Should reuse layer for a different display item and the same scrollbar. EXPECT_EQ(layer1.get(), display_item1b.CreateOrReuseLayer(layer1.get())); @@ -192,7 +188,7 @@ auto scrollbar2 = base::MakeRefCounted<cc::FakeScrollbar>(); ScrollbarDisplayItem display_item2( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar2, - scrollbar_rect, scroll_translation.get(), element_id, + scrollbar_rect, &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); // Should create new layer for a different scrollbar. EXPECT_NE(layer1.get(), display_item2.CreateOrReuseLayer(layer1.get())); @@ -205,7 +201,7 @@ ScrollbarDisplayItem display_item1c( client.Id(), DisplayItem::kScrollbarHorizontal, scrollbar1, - scrollbar_rect, scroll_translation.get(), element_id, + scrollbar_rect, &scroll_state_.Transform(), element_id, client.VisualRectOutsetForRasterEffects()); // Should reuse layer for a different display item and the same scrollbar. EXPECT_NE(layer1.get(), display_item1b.CreateOrReuseLayer(layer1.get()));
diff --git a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc index ed049c12..42865912 100644 --- a/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc +++ b/third_party/blink/renderer/platform/graphics/static_bitmap_image_to_video_frame_copier.cc
@@ -105,6 +105,8 @@ : kBottomLeft_GrSurfaceOrigin, image->GetMailboxHolder(), gfx::ColorSpace::CreateREC709(), std::move(split_callback.first))) { + TRACE_EVENT1("blink", "StaticBitmapImageToVideoFrameCopier::Convert", + "accelerated_frame_pool_copy", true); // Early out on success, otherwise fallback to ReadYUVPixelsAsync path. return; } @@ -115,6 +117,9 @@ ReadARGBPixelsAsync(image, context_provider->ContextProvider(), std::move(callback)); } + + TRACE_EVENT1("blink", "StaticBitmapImageToVideoFrameCopier::Convert", + "accelerated_frame_pool_copy", false); } void StaticBitmapImageToVideoFrameCopier::ReadARGBPixelsSync(
diff --git a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc index e93e57b..3e502de 100644 --- a/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc +++ b/third_party/blink/renderer/platform/loader/fetch/resource_fetcher.cc
@@ -637,6 +637,7 @@ : resource->GetResourceRequest().Url()); ResourceResponse final_response = resource->GetResponse(); final_response.SetResourceLoadTiming(nullptr); + final_response.SetEncodedDataLength(0); info->SetFinalResponse(final_response); info->SetLoadResponseEnd(info->InitialTime()); if (render_blocking_behavior == RenderBlockingBehavior::kBlocking)
diff --git a/third_party/blink/renderer/platform/media/key_system_config_selector.cc b/third_party/blink/renderer/platform/media/key_system_config_selector.cc index fe8070f..2d69b40 100644 --- a/third_party/blink/renderer/platform/media/key_system_config_selector.cc +++ b/third_party/blink/renderer/platform/media/key_system_config_selector.cc
@@ -33,7 +33,7 @@ namespace blink { namespace { -using ::media::EmeConfigRule; +using ::media::EmeConfig; using ::media::EmeConfigRuleState; using ::media::EmeFeatureSupport; using ::media::EmeMediaType; @@ -41,12 +41,12 @@ using EmeFeatureRequirement = WebMediaKeySystemConfiguration::Requirement; using EmeEncryptionScheme = WebMediaKeySystemMediaCapability::EncryptionScheme; -absl::optional<EmeConfigRule> GetDistinctiveIdentifierConfigRule( +EmeConfig::Rule GetDistinctiveIdentifierConfigRule( EmeFeatureSupport support, EmeFeatureRequirement requirement) { if (support == EmeFeatureSupport::INVALID) { NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // For kNotAllowed and kRequired, the result is as expected. For kRecommended, @@ -69,25 +69,25 @@ requirement == EmeFeatureRequirement::kRequired) || (support == EmeFeatureSupport::ALWAYS_ENABLED && requirement == EmeFeatureRequirement::kNotAllowed)) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } if (support == EmeFeatureSupport::REQUESTABLE && requirement == EmeFeatureRequirement::kOptional) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } if (support == EmeFeatureSupport::NOT_SUPPORTED || requirement == EmeFeatureRequirement::kNotAllowed) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.identifier = EmeConfigRuleState::kNotAllowed}; } - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired}; } -absl::optional<EmeConfigRule> GetPersistentStateConfigRule( +EmeConfig::Rule GetPersistentStateConfigRule( EmeFeatureSupport support, EmeFeatureRequirement requirement) { if (support == EmeFeatureSupport::INVALID) { NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } // For kNotAllowed and kRequired, the result is as expected. For kRecommended, @@ -113,17 +113,17 @@ requirement == EmeFeatureRequirement::kRequired) || (support == EmeFeatureSupport::ALWAYS_ENABLED && requirement == EmeFeatureRequirement::kNotAllowed)) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } if (support == EmeFeatureSupport::REQUESTABLE && requirement == EmeFeatureRequirement::kOptional) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } if (support == EmeFeatureSupport::NOT_SUPPORTED || requirement == EmeFeatureRequirement::kNotAllowed) { - return EmeConfigRule{.persistence = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.persistence = EmeConfigRuleState::kNotAllowed}; } - return EmeConfigRule{.persistence = EmeConfigRuleState::kRequired}; + return EmeConfig{.persistence = EmeConfigRuleState::kRequired}; } bool IsPersistentSessionType(WebEncryptedMediaSessionType sessionType) { @@ -243,7 +243,7 @@ } // Checks whether a rule is compatible with all previously added rules. - bool IsRuleSupported(absl::optional<EmeConfigRule> rule) const { + bool IsRuleSupported(EmeConfig::Rule rule) const { bool result = true; // NOT_SUPPORTED @@ -310,7 +310,7 @@ } // Add a rule to the accumulated configuration state. - void AddRule(absl::optional<EmeConfigRule> rule) { + void AddRule(EmeConfig::Rule rule) { DCHECK(IsRuleSupported(rule)); // No rule specified, this should not happen @@ -362,7 +362,7 @@ // (Not changed by adding rules.) bool is_permission_granted_; - EmeConfigRule rules = EmeConfigRule(); + EmeConfig rules = EmeConfig(); }; KeySystemConfigSelector::KeySystemConfigSelector( @@ -420,9 +420,8 @@ media::SplitCodecs(codecs, &codec_vector); // Check that |container_lower| and |codec_vector| are supported by the CDM. - absl::optional<EmeConfigRule> codecs_rule = - key_systems_->GetContentTypeConfigRule(key_system, media_type, - container_lower, codec_vector); + EmeConfig::Rule codecs_rule = key_systems_->GetContentTypeConfigRule( + key_system, media_type, container_lower, codec_vector); if (!config_state->IsRuleSupported(codecs_rule)) { DVLOG(3) << "Container mime type and codecs are not supported by CDM"; return false; @@ -432,8 +431,7 @@ return true; } -absl::optional<EmeConfigRule> -KeySystemConfigSelector::GetEncryptionSchemeConfigRule( +EmeConfig::Rule KeySystemConfigSelector::GetEncryptionSchemeConfigRule( const std::string& key_system, const EmeEncryptionScheme encryption_scheme) { switch (encryption_scheme) { @@ -460,11 +458,11 @@ // supported by implementation, continue to the next iteration." // The value provided was an empty string or some other value that is // not recognized, so treat it as a scheme that is not supported. - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } bool KeySystemConfigSelector::GetSupportedCapabilities( @@ -533,10 +531,9 @@ hw_secure_requirement = false; else hw_secure_requirement_ptr = nullptr; - absl::optional<EmeConfigRule> robustness_rule = - key_systems_->GetRobustnessConfigRule(key_system, media_type, - requested_robustness_ascii, - hw_secure_requirement_ptr); + EmeConfig::Rule robustness_rule = key_systems_->GetRobustnessConfigRule( + key_system, media_type, requested_robustness_ascii, + hw_secure_requirement_ptr); // 3.13. If the user agent and implementation definitely support playback of // encrypted media data for the combination of container, media types, @@ -550,7 +547,7 @@ // Check for encryption scheme support. // https://github.com/WICG/encrypted-media-encryption-scheme/blob/master/explainer.md. - absl::optional<EmeConfigRule> encryption_scheme_rule = + EmeConfig::Rule encryption_scheme_rule = GetEncryptionSchemeConfigRule(key_system, capability.encryption_scheme); if (!proposed_config_state.IsRuleSupported(encryption_scheme_rule)) { DVLOG(3) << "The current encryption scheme rule is not supported."; @@ -646,8 +643,8 @@ // Identifiers are not allowed according to restrictions, set distinctive // identifier requirement to "not-allowed". - absl::optional<EmeConfigRule> identifier_required = - EmeConfigRule{.identifier = EmeConfigRuleState::kRequired}; + EmeConfig::Rule identifier_required = + EmeConfig{.identifier = EmeConfigRuleState::kRequired}; if (distinctive_identifier == EmeFeatureRequirement::kOptional && !config_state->IsRuleSupported(identifier_required)) { distinctive_identifier = EmeFeatureRequirement::kNotAllowed; @@ -679,7 +676,7 @@ distinctive_identifier_support = EmeFeatureSupport::NOT_SUPPORTED; } #endif // !BUILDFLAG(IS_ANDROID) - absl::optional<EmeConfigRule> di_rule = GetDistinctiveIdentifierConfigRule( + EmeConfig::Rule di_rule = GetDistinctiveIdentifierConfigRule( distinctive_identifier_support, distinctive_identifier); if (!config_state->IsRuleSupported(di_rule)) { DVLOG(2) << "Rejecting requested configuration because " @@ -699,8 +696,8 @@ // 9. If persistent state requirement is "optional" and persisting state is // not allowed according to restrictions, set persistent state requirement // to "not-allowed". - absl::optional<EmeConfigRule> persistence_required = - EmeConfigRule{.persistence = EmeConfigRuleState::kRequired}; + EmeConfig::Rule persistence_required = + EmeConfig{.persistence = EmeConfigRuleState::kRequired}; if (persistent_state == EmeFeatureRequirement::kOptional && !config_state->IsRuleSupported(persistence_required)) { persistent_state = EmeFeatureRequirement::kNotAllowed; @@ -725,7 +722,7 @@ return CONFIGURATION_NOT_SUPPORTED; persistent_state_support = EmeFeatureSupport::NOT_SUPPORTED; } - absl::optional<EmeConfigRule> ps_rule = + EmeConfig::Rule ps_rule = GetPersistentStateConfigRule(persistent_state_support, persistent_state); if (!config_state->IsRuleSupported(ps_rule)) { DVLOG(2) << "Rejecting requested configuration because " @@ -771,13 +768,13 @@ // 13.3. If the implementation does not support session type in combination // with accumulated configuration and restrictions for other reasons, // return NotSupported. - absl::optional<EmeConfigRule> session_type_rule = absl::nullopt; + EmeConfig::Rule session_type_rule = EmeConfig::UnsupportedRule(); switch (session_type) { case WebEncryptedMediaSessionType::kUnknown: NOTREACHED(); return CONFIGURATION_NOT_SUPPORTED; case WebEncryptedMediaSessionType::kTemporary: - session_type_rule = EmeConfigRule(); + session_type_rule = EmeConfig::SupportedRule(); break; case WebEncryptedMediaSessionType::kPersistentLicense: session_type_rule = @@ -880,14 +877,12 @@ // distinctiveIdentifier value to "not-allowed". if (accumulated_configuration->distinctive_identifier == EmeFeatureRequirement::kOptional) { - absl::optional<EmeConfigRule> not_allowed_rule = - GetDistinctiveIdentifierConfigRule( - key_systems_->GetDistinctiveIdentifierSupport(key_system), - EmeFeatureRequirement::kNotAllowed); - absl::optional<EmeConfigRule> required_rule = - GetDistinctiveIdentifierConfigRule( - key_systems_->GetDistinctiveIdentifierSupport(key_system), - EmeFeatureRequirement::kRequired); + EmeConfig::Rule not_allowed_rule = GetDistinctiveIdentifierConfigRule( + key_systems_->GetDistinctiveIdentifierSupport(key_system), + EmeFeatureRequirement::kNotAllowed); + EmeConfig::Rule required_rule = GetDistinctiveIdentifierConfigRule( + key_systems_->GetDistinctiveIdentifierSupport(key_system), + EmeFeatureRequirement::kRequired); bool not_allowed_supported = config_state->IsRuleSupported(not_allowed_rule); bool required_supported = config_state->IsRuleSupported(required_rule); @@ -922,11 +917,10 @@ // value to "not-allowed". if (accumulated_configuration->persistent_state == EmeFeatureRequirement::kOptional) { - absl::optional<EmeConfigRule> not_allowed_rule = - GetPersistentStateConfigRule( - key_systems_->GetPersistentStateSupport(key_system), - EmeFeatureRequirement::kNotAllowed); - absl::optional<EmeConfigRule> required_rule = GetPersistentStateConfigRule( + EmeConfig::Rule not_allowed_rule = GetPersistentStateConfigRule( + key_systems_->GetPersistentStateSupport(key_system), + EmeFeatureRequirement::kNotAllowed); + EmeConfig::Rule required_rule = GetPersistentStateConfigRule( key_systems_->GetPersistentStateSupport(key_system), EmeFeatureRequirement::kRequired); // |persistent_state| should not be affected after it is decided.
diff --git a/third_party/blink/renderer/platform/media/key_system_config_selector_unittest.cc b/third_party/blink/renderer/platform/media/key_system_config_selector_unittest.cc index 27886dab..944cd7e85 100644 --- a/third_party/blink/renderer/platform/media/key_system_config_selector_unittest.cc +++ b/third_party/blink/renderer/platform/media/key_system_config_selector_unittest.cc
@@ -25,7 +25,7 @@ namespace blink { namespace { -using ::media::EmeConfigRule; +using ::media::EmeConfig; using ::media::EmeConfigRuleState; using ::media::EmeFeatureSupport; using ::media::EmeInitDataType; @@ -244,23 +244,23 @@ return false; } - absl::optional<EmeConfigRule> GetEncryptionSchemeConfigRule( + EmeConfig::Rule GetEncryptionSchemeConfigRule( const std::string& key_system, media::EncryptionScheme encryption_scheme) const override { if (encryption_scheme == ConvertEncryptionScheme(kSupportedEncryptionScheme)) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } if (encryption_scheme == ConvertEncryptionScheme(kDisallowHwSecureCodecEncryptionScheme)) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } - absl::optional<EmeConfigRule> GetContentTypeConfigRule( + EmeConfig::Rule GetContentTypeConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& container_mime_type, @@ -270,7 +270,7 @@ if (container_mime_type == kUnsupportedContainer || !IsCompatibleWithEmeMediaType(media_type, container_mime_type)) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } bool hw_secure_codec_required_ = false; @@ -281,7 +281,7 @@ if (codec == kUnsupportedCodec || !IsCompatibleWithEmeMediaType(media_type, codec)) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } else if (codec == kRequireHwSecureCodec) { hw_secure_codec_required_ = true; } else if (codec == kDisallowHwSecureCodec) { @@ -291,20 +291,20 @@ if (hw_secure_codec_required_) { if (hw_secure_codec_not_allowed_) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } else { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } } if (hw_secure_codec_not_allowed_) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } - absl::optional<EmeConfigRule> GetRobustnessConfigRule( + EmeConfig::Rule GetRobustnessConfigRule( const std::string& key_system, EmeMediaType media_type, const std::string& requested_robustness, @@ -314,43 +314,43 @@ // done. We are only testing the explicit thing it is fixing here. if (hw_secure_requirement && *hw_secure_requirement && distinctive_identifier == EmeFeatureSupport::NOT_SUPPORTED) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } if (requested_robustness.empty() || requested_robustness == kSupportedRobustness) { - return EmeConfigRule(); + return EmeConfig::SupportedRule(); } if (requested_robustness == kRequireIdentifierRobustness) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired}; } if (requested_robustness == kRecommendIdentifierRobustness) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRecommended}; + return EmeConfig{.identifier = EmeConfigRuleState::kRecommended}; } if (requested_robustness == kDisallowHwSecureCodecRobustness) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kNotAllowed}; } if (requested_robustness == kRequireHwSecureCodecRobustness) { - return EmeConfigRule{.hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.hw_secure_codecs = EmeConfigRuleState::kRequired}; } if (requested_robustness == kRequireIdentifierAndHwSecureCodecRobustness) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired, - .hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired, + .hw_secure_codecs = EmeConfigRuleState::kRequired}; } if (requested_robustness == kRequireIdentifierPersistenceAndHwSecureCodecRobustness) { - return EmeConfigRule{.identifier = EmeConfigRuleState::kRequired, - .persistence = EmeConfigRuleState::kRequired, - .hw_secure_codecs = EmeConfigRuleState::kRequired}; + return EmeConfig{.identifier = EmeConfigRuleState::kRequired, + .persistence = EmeConfigRuleState::kRequired, + .hw_secure_codecs = EmeConfigRuleState::kRequired}; } if (requested_robustness == kUnsupportedRobustness) { - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } NOTREACHED(); - return absl::nullopt; + return EmeConfig::UnsupportedRule(); } - absl::optional<EmeConfigRule> GetPersistentLicenseSessionSupport( + EmeConfig::Rule GetPersistentLicenseSessionSupport( const std::string& key_system) const override { return persistent_license; } @@ -369,7 +369,7 @@ bool init_data_type_cenc_supported_ = false; bool init_data_type_keyids_supported_ = false; - absl::optional<EmeConfigRule> persistent_license = absl::nullopt; + EmeConfig::Rule persistent_license = EmeConfig::UnsupportedRule(); // Every test implicitly requires these, so they must be set. They are set to // values that are likely to cause tests to fail if they are accidentally @@ -888,7 +888,7 @@ TEST_F(KeySystemConfigSelectorTest, SessionTypes_SubsetSupported) { // Allow persistent state, as it would be required to be successful. key_systems_->persistent_state = EmeFeatureSupport::REQUESTABLE; - key_systems_->persistent_license = absl::nullopt; + key_systems_->persistent_license = EmeConfig::UnsupportedRule(); std::vector<WebEncryptedMediaSessionType> session_types; session_types.push_back(WebEncryptedMediaSessionType::kTemporary); @@ -904,7 +904,7 @@ TEST_F(KeySystemConfigSelectorTest, SessionTypes_AllSupported) { // Allow persistent state, and expect it to be required. key_systems_->persistent_state = EmeFeatureSupport::REQUESTABLE; - key_systems_->persistent_license = EmeConfigRule(); + key_systems_->persistent_license = EmeConfig::SupportedRule(); std::vector<WebEncryptedMediaSessionType> session_types; session_types.push_back(WebEncryptedMediaSessionType::kTemporary); @@ -928,8 +928,8 @@ key_systems_->distinctive_identifier = EmeFeatureSupport::REQUESTABLE; key_systems_->persistent_state = EmeFeatureSupport::REQUESTABLE; key_systems_->persistent_license = - EmeConfigRule{.identifier = EmeConfigRuleState::kRequired, - .persistence = EmeConfigRuleState::kRequired}; + EmeConfig{.identifier = EmeConfigRuleState::kRequired, + .persistence = EmeConfigRuleState::kRequired}; std::vector<WebEncryptedMediaSessionType> session_types; session_types.push_back(WebEncryptedMediaSessionType::kPersistentLicense);
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 4ef18113..30fe02fae 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -1513,14 +1513,6 @@ status: {"Android": "", "default": "stable"}, }, { - // Allows the navigator.language and navigator.languages APIs in insecure - // contexts, which https://github.com/WICG/lang-client-hint proposes that - // we deprecate. - name: "NavigatorLanguageInInsecureContext", - settable_from_internals: true, - status: "stable", - }, - { name: "NetInfoDownlinkMax", // Only Android, ChromeOS support NetInfo downlinkMax, type and ontypechange now status: { @@ -2428,8 +2420,7 @@ }, { name: "ViewportHeightClientHintHeader", - origin_trial_feature_name: "ViewportHeightClientHintHeader", - status: "experimental", + status: "stable", }, { name: "ViewportSegments",
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc index abd8b0d2..d7e7df9 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.cc
@@ -642,20 +642,22 @@ virtual_time_control_task_queue_->ShutdownTaskQueue(); } -bool MainThreadSchedulerImpl::IsAnyMainFrameWaitingForFirstMeaningfulPaint() - const { - return std::any_of( - main_thread_only().page_schedulers.begin(), - main_thread_only().page_schedulers.end(), - std::mem_fn(&PageSchedulerImpl::IsWaitingForMainFrameMeaningfulPaint)); +bool MainThreadSchedulerImpl:: + IsAnyOrdinaryMainFrameWaitingForFirstMeaningfulPaint() const { + for (const PageSchedulerImpl* ps : main_thread_only().page_schedulers) { + if (ps->IsOrdinary() && ps->IsWaitingForMainFrameMeaningfulPaint()) + return true; + } + return false; } -bool MainThreadSchedulerImpl::IsAnyMainFrameWaitingForFirstContentfulPaint() - const { - return std::any_of( - main_thread_only().page_schedulers.begin(), - main_thread_only().page_schedulers.end(), - std::mem_fn(&PageSchedulerImpl::IsWaitingForMainFrameContentfulPaint)); +bool MainThreadSchedulerImpl:: + IsAnyOrdinaryMainFrameWaitingForFirstContentfulPaint() const { + for (const PageSchedulerImpl* ps : main_thread_only().page_schedulers) { + if (ps->IsOrdinary() && ps->IsWaitingForMainFrameContentfulPaint()) + return true; + } + return false; } void MainThreadSchedulerImpl::Shutdown() { @@ -2039,10 +2041,14 @@ TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("renderer.scheduler"), "MainThreadSchedulerImpl::OnMainFramePaint"); base::AutoLock lock(any_thread_lock_); + + // The state of a non-ordinary page (e.g. SVG image) shouldn't affect the + // scheduler's global UseCase. any_thread().waiting_for_any_main_frame_contentful_paint = - IsAnyMainFrameWaitingForFirstContentfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstContentfulPaint(); any_thread().waiting_for_any_main_frame_meaningful_paint = - IsAnyMainFrameWaitingForFirstMeaningfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstMeaningfulPaint(); + UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } @@ -2054,9 +2060,9 @@ any_thread().user_model.Reset(helper_.NowTicks()); any_thread().have_seen_a_blocking_gesture = false; any_thread().waiting_for_any_main_frame_contentful_paint = - IsAnyMainFrameWaitingForFirstContentfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstContentfulPaint(); any_thread().waiting_for_any_main_frame_meaningful_paint = - IsAnyMainFrameWaitingForFirstMeaningfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstMeaningfulPaint(); any_thread().have_seen_input_since_navigation = false; main_thread_only().idle_time_estimator.Clear(); main_thread_only().have_reported_blocking_intervention_since_navigation = @@ -2279,9 +2285,9 @@ base::AutoLock lock(any_thread_lock_); any_thread().waiting_for_any_main_frame_contentful_paint = - IsAnyMainFrameWaitingForFirstContentfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstContentfulPaint(); any_thread().waiting_for_any_main_frame_meaningful_paint = - IsAnyMainFrameWaitingForFirstMeaningfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstMeaningfulPaint(); UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); } @@ -2306,9 +2312,9 @@ base::AutoLock lock(any_thread_lock_); any_thread().waiting_for_any_main_frame_contentful_paint = - IsAnyMainFrameWaitingForFirstContentfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstContentfulPaint(); any_thread().waiting_for_any_main_frame_meaningful_paint = - IsAnyMainFrameWaitingForFirstMeaningfulPaint(); + IsAnyOrdinaryMainFrameWaitingForFirstMeaningfulPaint(); UpdatePolicyLocked(UpdateType::kMayEarlyOutIfPolicyUnchanged); }
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h index 978e63d..200906bc 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl.h
@@ -470,8 +470,8 @@ WebAgentGroupScheduler* next_agent_group_scheduler); void EndAgentGroupSchedulerScope(); - bool IsAnyMainFrameWaitingForFirstContentfulPaint() const; - bool IsAnyMainFrameWaitingForFirstMeaningfulPaint() const; + bool IsAnyOrdinaryMainFrameWaitingForFirstContentfulPaint() const; + bool IsAnyOrdinaryMainFrameWaitingForFirstMeaningfulPaint() const; class Policy { DISALLOW_NEW();
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc index 568bdb6..715023370 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc +++ b/third_party/blink/renderer/platform/scheduler/main_thread/main_thread_scheduler_impl_unittest.cc
@@ -312,15 +312,16 @@ explicit MockPageSchedulerImpl(MainThreadSchedulerImpl* main_thread_scheduler, AgentGroupSchedulerImpl& agent_group_scheduler) : PageSchedulerImpl(nullptr, agent_group_scheduler) { + ON_CALL(*this, IsWaitingForMainFrameContentfulPaint) + .WillByDefault(Return(false)); + ON_CALL(*this, IsWaitingForMainFrameMeaningfulPaint) + .WillByDefault(Return(false)); + ON_CALL(*this, IsMainFrameLocal).WillByDefault(Return(true)); + ON_CALL(*this, IsOrdinary).WillByDefault(Return(true)); + // This would normally be called by // MainThreadSchedulerImpl::CreatePageScheduler. main_thread_scheduler->AddPageScheduler(this); - - ON_CALL(*this, IsWaitingForMainFrameContentfulPaint) - .WillByDefault(Return(true)); - ON_CALL(*this, IsWaitingForMainFrameMeaningfulPaint) - .WillByDefault(Return(true)); - ON_CALL(*this, IsMainFrameLocal).WillByDefault(Return(true)); } MockPageSchedulerImpl(const MockPageSchedulerImpl&) = delete; MockPageSchedulerImpl& operator=(const MockPageSchedulerImpl&) = delete; @@ -330,6 +331,7 @@ MOCK_METHOD(bool, IsWaitingForMainFrameContentfulPaint, (), (const)); MOCK_METHOD(bool, IsWaitingForMainFrameMeaningfulPaint, (), (const)); MOCK_METHOD(bool, IsMainFrameLocal, (), (const)); + MOCK_METHOD(bool, IsOrdinary, (), (const)); }; class MainThreadSchedulerImplForTest : public MainThreadSchedulerImpl { @@ -419,8 +421,11 @@ base::sequence_manager::SequenceManager::Settings::Builder() .SetRandomisedSamplingEnabled(true) .Build()))); - if (initially_ensure_usecase_none_) - EnsureUseCaseNone(); + + EXPECT_EQ(ForceUpdatePolicyAndGetCurrentUseCase(), UseCase::kNone); + // Don't count the above policy change. + scheduler_->update_policy_count_ = 0; + scheduler_->use_cases_.clear(); } void CreateTestTaskRunner() { @@ -946,20 +951,6 @@ } } - void EnsureUseCaseNone() { - // Make sure we're not in UseCase::kLoading. - ON_CALL(*page_scheduler_, IsWaitingForMainFrameContentfulPaint) - .WillByDefault(Return(false)); - ON_CALL(*page_scheduler_, IsWaitingForMainFrameMeaningfulPaint) - .WillByDefault(Return(false)); - - EXPECT_EQ(ForceUpdatePolicyAndGetCurrentUseCase(), UseCase::kNone); - - // Don't count the above policy change. - scheduler_->update_policy_count_ = 0; - scheduler_->use_cases_.clear(); - } - protected: static base::TimeDelta priority_escalation_after_input_duration() { return base::Milliseconds(UserModel::kGestureEstimationLimitMillis); @@ -1033,7 +1024,6 @@ scoped_refptr<base::SingleThreadTaskRunner> prioritised_local_frame_task_runner_; bool simulate_throttleable_task_ran_; - bool initially_ensure_usecase_none_ = true; uint64_t next_begin_frame_number_ = viz::BeginFrameArgs::kStartingFrameNumber; }; @@ -1183,8 +1173,6 @@ } TEST_F(MainThreadSchedulerImplTest, TestDefaultPolicy) { - EnsureUseCaseNone(); - Vector<String> run_order; PostTestTasks(&run_order, "L1 I1 D1 P1 C1 D2 P2 C2 U1"); @@ -1495,12 +1483,14 @@ EXPECT_THAT(run_order, testing::ElementsAre("L1", "T1", "T2")); } -class DefaultUseCaseTest : public MainThreadSchedulerImplTest { - public: - DefaultUseCaseTest() { initially_ensure_usecase_none_ = false; } -}; +TEST_F(MainThreadSchedulerImplTest, InitiallyInEarlyLoadingUseCase) { + // `IsWaitingForMainFrame(Contentful|Meaningful)Paint return true for a new + // page scheduler in production. + ON_CALL(*page_scheduler_, IsWaitingForMainFrameContentfulPaint) + .WillByDefault(Return(true)); + ON_CALL(*page_scheduler_, IsWaitingForMainFrameMeaningfulPaint) + .WillByDefault(Return(true)); -TEST_F(DefaultUseCaseTest, InitiallyInEarlyLoadingUseCase) { scheduler_->OnMainFramePaint(); // Should be early loading by default. @@ -1517,6 +1507,24 @@ EXPECT_EQ(UseCase::kNone, CurrentUseCase()); } +TEST_F(MainThreadSchedulerImplTest, + NonOrdinaryPageDoesNotTriggerLoadingUseCase) { + // `IsWaitingForMainFrame(Contentful|Meaningful)Paint return true for a new + // page scheduler in production. + ON_CALL(*page_scheduler_, IsWaitingForMainFrameContentfulPaint) + .WillByDefault(Return(true)); + ON_CALL(*page_scheduler_, IsWaitingForMainFrameMeaningfulPaint) + .WillByDefault(Return(true)); + + // Make the page non-ordinary. + ON_CALL(*page_scheduler_, IsOrdinary).WillByDefault(Return(false)); + + // The UseCase should be `kNone` event if the page is waiting for a first + // contentful/meaningful paint. + scheduler_->OnMainFramePaint(); + EXPECT_EQ(UseCase::kNone, CurrentUseCase()); +} + class PrioritizeCompositingAndLoadingInUseCaseLoadingTest : public MainThreadSchedulerImplTest { public: @@ -2627,7 +2635,6 @@ TEST_F(MainThreadSchedulerImplTest, EstimateLongestJankFreeTaskDuration_UseCase_NONE) { - EnsureUseCaseNone(); EXPECT_EQ(UseCase::kNone, CurrentUseCase()); EXPECT_EQ(rails_response_time(), scheduler_->EstimateLongestJankFreeTaskDuration());
diff --git a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h index 10cd56d..66671aa 100644 --- a/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h +++ b/third_party/blink/renderer/platform/scheduler/main_thread/page_scheduler_impl.h
@@ -98,7 +98,7 @@ // An "ordinary" PageScheduler is responsible for a fully-featured page // owned by a web view. - bool IsOrdinary() const; + virtual bool IsOrdinary() const; MainThreadSchedulerImpl* GetMainThreadScheduler() const; AgentGroupSchedulerImpl& GetAgentGroupScheduler() override;
diff --git a/third_party/blink/renderer/platform/storage/blink_storage_key_hash.h b/third_party/blink/renderer/platform/storage/blink_storage_key_hash.h index 5c187b8..42bc44e9 100644 --- a/third_party/blink/renderer/platform/storage/blink_storage_key_hash.h +++ b/third_party/blink/renderer/platform/storage/blink_storage_key_hash.h
@@ -12,14 +12,27 @@ namespace blink { -// TODO(https://crbug.com/1199077): This needs to be re-implemented for the -// actual StorageKey content once it's stable. Right now it's just (almost) a -// shim for `SecurityOriginHash`. struct BlinkStorageKeyHash { STATIC_ONLY(BlinkStorageKeyHash); static unsigned GetHash(const BlinkStorageKey* storage_key) { - return SecurityOriginHash::GetHash(storage_key->GetSecurityOrigin()); + absl::optional<base::UnguessableToken> nonce = storage_key->GetNonce(); + size_t nonce_hash = nonce ? base::UnguessableTokenHash()(*nonce) : 0; + unsigned hash_codes[] = { + SecurityOriginHash::GetHash(storage_key->GetSecurityOrigin()), + DefaultHash<BlinkSchemefulSite>::Hash::GetHash( + storage_key->GetTopLevelSite()), + static_cast<unsigned>(storage_key->GetAncestorChainBit()), +#if ARCH_CPU_32_BITS + nonce_hash, +#elif ARCH_CPU_64_BITS + static_cast<unsigned>(nonce_hash), + static_cast<unsigned>(nonce_hash >> 32), +#else +#error "Unknown bits" +#endif + }; + return StringHasher::HashMemory<sizeof(hash_codes)>(hash_codes); } static unsigned GetHash(
diff --git a/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h b/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h index c3a68431..7495c7e 100644 --- a/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h +++ b/third_party/blink/renderer/platform/testing/paint_property_test_helpers.h
@@ -219,6 +219,17 @@ parent, TransformPaintPropertyNode::State{gfx::Vector2dF(x, y)}); } +inline scoped_refptr<TransformPaintPropertyNode> CreateFixedPositionTranslation( + const TransformPaintPropertyNodeOrAlias& parent, + float offset_x, + float offset_y, + const TransformPaintPropertyNode& scroll_translation_for_fixed) { + TransformPaintPropertyNode::State state{gfx::Vector2dF(offset_x, offset_y)}; + state.scroll_translation_for_fixed = &scroll_translation_for_fixed; + state.direct_compositing_reasons = CompositingReason::kFixedPosition; + return TransformPaintPropertyNode::Create(parent, std::move(state)); +} + inline scoped_refptr<TransformPaintPropertyNode> CreateTransform( const TransformPaintPropertyNodeOrAlias& parent, const TransformationMatrix& matrix, @@ -259,13 +270,20 @@ float offset_y, const gfx::Rect& container_rect, const gfx::Size& contents_size, - CompositingReasons compositing_reasons = CompositingReason::kNone) { + const ClipPaintPropertyNode* overflow_clip, + CompositingReasons compositing_reasons = CompositingReason::kNone, + MainThreadScrollingReasons main_thread_reasons = + cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText) { const auto* parent_scroll_translation = &parent.Unalias(); while (!parent_scroll_translation->ScrollNode()) parent_scroll_translation = parent_scroll_translation->UnaliasedParent(); ScrollPaintPropertyNode::State scroll_state; scroll_state.container_rect = container_rect; scroll_state.contents_size = contents_size; + scroll_state.overflow_clip_node = overflow_clip; + scroll_state.compositor_element_id = CompositorElementIdFromUniqueObjectId( + NewUniqueObjectId(), CompositorElementIdNamespace::kScroll); + scroll_state.main_thread_scrolling_reasons = main_thread_reasons; TransformPaintPropertyNode::State translation_state{ gfx::Vector2dF(offset_x, offset_y)}; translation_state.direct_compositing_reasons = compositing_reasons; @@ -291,10 +309,13 @@ float offset_x, float offset_y, const gfx::Rect& container_rect, - const gfx::Size& contents_size) { - return CreateScrollTranslation(parent, offset_x, offset_y, container_rect, - contents_size, - CompositingReason::kOverflowScrolling); + const gfx::Size& contents_size, + const ClipPaintPropertyNode* overflow_clip, + MainThreadScrollingReasons main_thread_reasons = + cc::MainThreadScrollingReason::kNotScrollingOnMain) { + return CreateScrollTranslation( + parent, offset_x, offset_y, container_rect, contents_size, overflow_clip, + CompositingReason::kOverflowScrolling, main_thread_reasons); } inline RefCountedPropertyTreeState CreateScrollTranslationState( @@ -303,14 +324,16 @@ float offset_y, const gfx::Rect& container_rect, const gfx::Size& contents_size, - CompositingReasons compositing_reasons = CompositingReason::kNone) { - return RefCountedPropertyTreeState(PropertyTreeState( - *CreateScrollTranslation(parent_state.Transform(), offset_x, offset_y, - container_rect, contents_size, - compositing_reasons), - *CreateClip(parent_state.Clip(), parent_state.Transform(), - FloatRoundedRect(container_rect)), - e0())); + CompositingReasons compositing_reasons = CompositingReason::kNone, + MainThreadScrollingReasons main_thread_reasons = + cc::MainThreadScrollingReason::kNotOpaqueForTextAndLCDText) { + RefCountedPropertyTreeState state(PropertyTreeState::Root()); + state.SetClip(*CreateClip(parent_state.Clip(), parent_state.Transform(), + FloatRoundedRect(container_rect))); + state.SetTransform(*CreateScrollTranslation( + parent_state.Transform(), offset_x, offset_y, container_rect, + contents_size, &state.Clip(), compositing_reasons, main_thread_reasons)); + return state; } inline RefCountedPropertyTreeState CreateCompositedScrollTranslationState( @@ -319,10 +342,11 @@ float offset_y, const gfx::Rect& container_rect, const gfx::Size& contents_size, - CompositingReasons compositing_reasons = CompositingReason::kNone) { - return CreateScrollTranslationState(parent_state, offset_x, offset_y, - container_rect, contents_size, - CompositingReason::kOverflowScrolling); + MainThreadScrollingReasons main_thread_reasons = + cc::MainThreadScrollingReason::kNotScrollingOnMain) { + return CreateScrollTranslationState( + parent_state, offset_x, offset_y, container_rect, contents_size, + CompositingReason::kOverflowScrolling, main_thread_reasons); } inline PropertyTreeState DefaultPaintChunkProperties() {
diff --git a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py index 0a4c58c..518aa56 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py +++ b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines.py
@@ -3,6 +3,7 @@ # found in the LICENSE file. import logging +import optparse from blinkpy.common.checkout.baseline_optimizer import BaselineOptimizer from blinkpy.tool.commands.rebaseline import AbstractRebaseliningCommand @@ -15,13 +16,21 @@ help_text = ('Reshuffles the baselines for the given tests to use ' 'as little space on disk as possible.') show_in_main_help = True - argument_names = 'TEST_NAMES' + argument_names = '[TEST_NAMES]' + + all_option = optparse.make_option( + '--all', + dest='all_tests', + action='store_true', + default=False, + help=('Optimize all tests (instead of using TEST_NAMES)')) def __init__(self): super(OptimizeBaselines, self).__init__(options=[ self.suffixes_option, self.port_name_option, self.flag_specific_option, + self.all_option, ] + self.platform_options + self.wpt_options) def _optimize_baseline(self, optimizer, test_name): @@ -29,6 +38,10 @@ optimizer.optimize(test_name, suffix) def execute(self, options, args, tool): + if not args != options.all_tests: + _log.error('Must provide one of --all or TEST_NAMES') + return + self._tool = tool self._baseline_suffix_list = options.suffixes.split(',') port_names = tool.port_factory.all_port_names(options.platform) @@ -37,6 +50,6 @@ return port = tool.port_factory.get(port_names[0], options) optimizer = BaselineOptimizer(tool, port, port_names) - tests = port.tests(args) + tests = port.tests() if options.all_tests else port.tests(args) for test_name in tests: self._optimize_baseline(optimizer, test_name)
diff --git a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py index 772aefe..204305f9 100644 --- a/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py +++ b/third_party/blink/tools/blinkpy/tool/commands/optimize_baselines_unittest.py
@@ -36,6 +36,7 @@ self.command.execute( optparse.Values({ 'suffixes': 'txt,wav,png', + 'all_tests': False, 'no_modify_git': True, 'platform': 'test-mac-mac10.10' }), ['another/test.html'], self.tool)
diff --git a/third_party/blink/web_tests/.clang-format b/third_party/blink/web_tests/.clang-format index 30204ef..2009a81 100644 --- a/third_party/blink/web_tests/.clang-format +++ b/third_party/blink/web_tests/.clang-format
@@ -1,4 +1,4 @@ BasedOnStyle: InheritParentConfig Language: JavaScript -// Don't reformat the '// META: ...' lines +# Don't reformat the '// META: ...' lines CommentPragmas: '^ META:'
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng index d5d36ad..af6f942 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-layout-ng +++ b/third_party/blink/web_tests/FlagExpectations/disable-layout-ng
@@ -11,6 +11,8 @@ # Tests that fail in legacy but pass in NG # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml [ Crash ] +crbug.com/626703 external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-root-explicit-default-002.html [ Failure ] crbug.com/626703 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/highlight-currentcolor-root-explicit-default-002.html [ Failure ] crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/block-aspect-ratio-050.html [ Failure ]
diff --git a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials index f385e117..b02211c 100644 --- a/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials +++ b/third_party/blink/web_tests/FlagExpectations/disable-site-isolation-trials
@@ -46,6 +46,8 @@ crbug.com/1209223 external/wpt/html/browsers/browsing-the-web/navigating-across-documents/javascript-url-security-check-same-origin-domain.sub.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml [ Crash ] +crbug.com/626703 external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] crbug.com/626703 external/wpt/css/css-sizing/aspect-ratio/grid-aspect-ratio-040.html [ Crash ] crbug.com/626703 external/wpt/css/cssom/caretPositionFromPoint-with-transformation.html [ Timeout ] crbug.com/626703 external/wpt/service-workers/cache-storage/crashtests/cache-response-clone.https.html [ Timeout ]
diff --git a/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility b/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility index d883fdbe..dde4a24 100644 --- a/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility +++ b/third_party/blink/web_tests/FlagExpectations/force-renderer-accessibility
@@ -3,8 +3,11 @@ # Expectations for --force-renderer-accessibility # crbug.com/1138028 tracks the removal of these failure expectations +# To save time in linux-blink-web-tests-force-accessibility-rel builder, do not +# run virtual test suites. +virtual/* [ Skip ] + # Unintentional failure -external/wpt/accessibility/crashtests/svg-mouse-listener.html [ Skip ] external/wpt/css/css-backgrounds/background-repeat-space-5.html [ Skip ] external/wpt/css/css-contain/content-visibility/detach-locked-slot-children-crash.html [ Skip ] external/wpt/css/css-display/display-contents-shadow-dom-1.html [ Skip ] @@ -33,8 +36,6 @@ external/wpt/html/browsers/browsing-the-web/back-forward-cache/service-worker-unregister.https.html [ Skip ] external/wpt/html/browsers/browsing-the-web/back-forward-cache/storage-events.html [ Skip ] external/wpt/html/browsers/browsing-the-web/back-forward-cache/timers.html [ Skip ] -external/wpt/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html [ Skip ] -external/wpt/inert/dynamic-inert-on-focused-element.html [ Skip ] external/wpt/inert/inert-iframe-hittest.html [ Skip ] external/wpt/infrastructure/assumptions/non-local-ports.sub.window.html [ Skip ] external/wpt/mimesniff/media/media-sniff.window.html [ Skip ] @@ -74,7 +75,6 @@ virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-descendant-selector.html [ Skip ] virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/backdrop-in-flow.html [ Skip ] virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/dont-share-style-to-top-layer.html [ Skip ] -virtual/dialogfocus-old-behavior/external/wpt/html/semantics/interactive-elements/the-dialog-element/inert-svg-hittest.html [ Skip ] virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-ad-fixed-position.html [ Skip ] virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-image-ad-fixed-position.html [ Skip ] virtual/disable-frequency-capping-for-overlay-popup-detection/http/tests/subresource_filter/overlay_popup_ad/overlay-popup-non-ad-followed-by-ad.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 665a2746..02c4849 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1473,6 +1473,7 @@ crbug.com/240765 external/wpt/css/css-flexbox/intrinsic-size/row-004.html [ Failure ] crbug.com/240765 external/wpt/css/css-flexbox/intrinsic-size/row-005.html [ Failure ] crbug.com/240765 external/wpt/css/css-flexbox/intrinsic-size/row-007.html [ Failure ] +crbug.com/240765 external/wpt/css/css-flexbox/intrinsic-size/row-008.html [ Failure ] # These require css-align-3 positional keywords that Blink doesn't yet support for flexbox. crbug.com/1011718 external/wpt/css/css-flexbox/flexbox-safe-overflow-position-001.html [ Failure ] @@ -3367,6 +3368,22 @@ crbug.com/626703 [ Win ] virtual/partitioned-cookies/http/tests/inspector-protocol/network/disabled-cache-navigation.js [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/626703 external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html [ Failure ] +crbug.com/626703 external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Linux ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Mac10.15 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Mac11 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Mac11-arm64 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Mac12 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Mac12-arm64 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Win11 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash ] +crbug.com/626703 [ Win10.20h2 ] external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml [ Crash Timeout ] +crbug.com/626703 external/wpt/html/dom/directionality/bdi-element-invalid-dir.html [ Failure ] +crbug.com/626703 virtual/css-highlight-inheritance/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html [ Failure ] +crbug.com/626703 virtual/css-highlight-overlay-painting/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html [ Failure ] +crbug.com/626703 [ Linux ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/background-sync.https.html [ Timeout ] +crbug.com/626703 [ Mac12 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/paint2d-roundRect.https.html [ Failure ] +crbug.com/626703 [ Mac10.15 ] virtual/off-main-thread-css-paint/external/wpt/css/css-paint-api/registered-property-value-010.https.html [ Failure ] crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-001.html [ Failure ] crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-painting-properties-002.html [ Failure ] crbug.com/626703 external/wpt/css/css-pseudo/highlight-currentcolor-root-implicit-default-001.html [ Failure ] @@ -7084,4 +7101,4 @@ # Sheriff 2022-08-06 crbug.com/1350336 [ Mac ] virtual/fenced-frame-mparch/wpt_internal/fenced_frame/visual-viewport.https.html [ Failure Pass ] crbug.com/1350337 [ Linux ] external/wpt/web-locks/query-ordering.tentative.https.html [ Failure Pass ] -crbug.com/1350341 [ Linux ] virtual/threaded-no-composited-antialiasing/animations/direction-and-fill/fill-mode-missing-from-to-keyframes.html [ Failure Pass ] \ No newline at end of file +crbug.com/1350341 [ Linux ] virtual/threaded-no-composited-antialiasing/animations/direction-and-fill/fill-mode-missing-from-to-keyframes.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 0a14c69..c37d37d 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -14,12 +14,6 @@ "args": ["--enable-features=PrivateNetworkAccessPermissionPrompt"] }, { - "prefix": "disable-accept-language-header", - "platforms": ["Linux", "Mac", "Win"], - "bases": ["http/tests/navigation/language"], - "args": ["--disable-features=AcceptLanguageHeader"] - }, - { "prefix": "gpu", "platforms": ["Linux", "Mac", "Win", "Fuchsia"], "bases": ["fast/canvas"],
diff --git a/third_party/blink/web_tests/android/WebviewWPTExpectations b/third_party/blink/web_tests/android/WebviewWPTExpectations index cebff9a..ad25162 100644 --- a/third_party/blink/web_tests/android/WebviewWPTExpectations +++ b/third_party/blink/web_tests/android/WebviewWPTExpectations
@@ -2458,14 +2458,7 @@ crbug.com/1050754 external/wpt/html/canvas/element/manual/imagebitmap/canvas-createImageBitmap-video-resize.html [ Timeout ] crbug.com/1050754 external/wpt/html/canvas/element/manual/imagebitmap/createImageBitmap-origin.sub.html [ Pass Timeout ] crbug.com/1050754 external/wpt/html/canvas/element/manual/shadows/canvas_shadows_001.htm [ Failure ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-convertToBlob-roundtrip.html [ Timeout ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorspace-arguments.html [ Failure ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createPutGetImageData-colorManaged.html [ Failure ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-draw-high-bit-depth-images.html [ Failure ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-e_srgb.html [ Failure ] crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-offscreenCanvas.html [ Failure ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-getImageData-e_srgb.html [ Failure ] -crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/imageData-colorManagedBehavior.html [ Failure ] crbug.com/1050754 external/wpt/html/canvas/element/manual/wide-gamut-canvas/transferFromImageBitmap.html [ Failure Pass ] crbug.com/1050754 external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.arc.html [ Failure Pass ] crbug.com/1050754 external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed.html [ Failure Pass ]
diff --git a/third_party/blink/web_tests/external/Version b/third_party/blink/web_tests/external/Version index 900beee2..959063e 100644 --- a/third_party/blink/web_tests/external/Version +++ b/third_party/blink/web_tests/external/Version
@@ -1 +1 @@ -Version: 9cfba6b9061d51e0b212cbcf24a35dc0237db093 +Version: 853d9c3a31016504d1a51aa811c9890495a1d442
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index ff046010..3736da5 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -152505,6 +152505,19 @@ {} ] ], + "lang-pseudo-class-across-shadow-boundaries.html": [ + "f54e8cba6fced83776620ae66d7295aabf410d79", + [ + null, + [ + [ + "/css/css-pseudo/marker-and-other-pseudo-elements-ref.html", + "==" + ] + ], + {} + ] + ], "marker-and-other-pseudo-elements.html": [ "f393db58fe8a9acd9e52494c4cea56b18c636535", [ @@ -233768,6 +233781,21 @@ } }, "dom": { + "directionality": { + "bdi-element-invalid-dir.html": [ + "629cee873883d645b0fe0dbe52cbe12fff07fd80", + [ + null, + [ + [ + "/html/dom/directionality/bdi-element-invalid-dir-ref.html", + "==" + ] + ], + {} + ] + ] + }, "elements": { "global-attributes": { "dir_auto-EN-L.html": [ @@ -284199,6 +284227,10 @@ "652c8d9d924402da341a019af190513db21771fd", [] ], + "lang-pseudo-class-across-shadow-boundaries-ref.html": [ + "eda713a7eda3f0155b02f62acf432ac337de963d", + [] + ], "marker-and-other-pseudo-elements-ref.html": [ "796acbf75980cd62d30ade419359bda8c666b12e", [] @@ -299246,7 +299278,7 @@ }, "resources": { "custom-elements-helpers.js": [ - "6f73fe20d0fbf25eed2fbfec530fb516e83cc214", + "48775af162ac86f429431a84daacc86e3ef0c140", [] ], "empty-html-document.html": [ @@ -299411,7 +299443,7 @@ [] ], "direct-sockets-disabled-by-permissions-policy.js": [ - "fd0b100ca5ccab4db741fc9d3b216758e769a649", + "a27d1ddf497a7fa0ccd8ecd40b94732a831da97c", [] ] }, @@ -309729,6 +309761,12 @@ } }, "dom": { + "directionality": { + "bdi-element-invalid-dir-ref.html": [ + "88ccd4b9b53ee27a8450bd77ec794861fc01a708", + [] + ] + }, "documents": { "dom-tree-accessors": { "cross-domain.js": [ @@ -335833,7 +335871,7 @@ [] ], "idlharness.https.window.js.ini": [ - "0159ec7f7088794b624581769ae9e63906ab58cc", + "757d47fbebb7b57deb3be099c6d06e4b10939f0b", [] ], "remote-desktop-client-override.tentative.https.html.ini": [ @@ -387856,6 +387894,20 @@ {} ] ], + "dir-pseudo-on-bdi-element.html": [ + "434434461ddd1726ddbbad7d7637644648b06bd5", + [ + null, + {} + ] + ], + "dir-pseudo-on-input-element.html": [ + "3bb49790e997a6a777bd84904e3dfd0633559fa2", + [ + null, + {} + ] + ], "file-selector-button-inherit.html": [ "4947e5e353914d856e93995b6e5b40c9460cec05", [ @@ -402652,6 +402704,13 @@ {} ] ], + "media-query-matches-in-iframe.html": [ + "5828936732e7133d4365eb288b99e99cb428fb19", + [ + null, + {} + ] + ], "mq-dynamic-empty-children.html": [ "3edda870efcaa9383c3938fa721a147a98d73eda", [ @@ -404765,6 +404824,13 @@ ] ] }, + "perform-microtask-checkpoint-before-construction-xml-parser.xhtml": [ + "63bb1d143fb98b64f28589331817e57bd695275f", + [ + null, + {} + ] + ], "perform-microtask-checkpoint-before-construction.html": [ "83d823ad9f1b69dad00b7eb8457c0d490bcf2487", [ @@ -405191,6 +405257,13 @@ ] } }, + "throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml": [ + "c0a7f622fbe2e56fba7eab1ea71ffde0fc269fca", + [ + null, + {} + ] + ], "throw-on-dynamic-markup-insertion-counter-construct.html": [ "3e9254e2a50f0ca572b9e9aa1641a4dab5f22e50", [ @@ -405198,6 +405271,13 @@ {} ] ], + "throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml": [ + "13f664550be01d7fab3757732634dd02e56c723e", + [ + null, + {} + ] + ], "throw-on-dynamic-markup-insertion-counter-reactions.html": [ "e798d332e38b2e85703e7752486fe221376212db", [ @@ -486277,6 +486357,13 @@ ] }, "parsing-html-fragments": { + "innerHTML-setter-default-namespace.xhtml": [ + "19f17f1e28ce7dcb19fbe9e374ad412405c28e41", + [ + null, + {} + ] + ], "the-input-byte-stream-001.html": [ "a85682adf933621f3b3eb19f2de17765b99ec11d", [
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-005.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-005.html index 986a657..0f34c6f 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-005.html
@@ -34,90 +34,107 @@ </style> <body onload="checkLayout('.floating-flexbox')"> - <main> - <div class="zero-width"> - <div class="floating-flexbox" data-expected-width="300"> - <div style="flex: 1 1 200px; width:50px;"> - <div></div> - </div> - <div style="flex: 1 1 400px; width:50px;"> - <div></div> - </div> + <div class="zero-width"> + <div class="floating-flexbox" data-expected-width="300"> + <!-- min contribution: 100 --> + <!-- fraction: -0.5 --> + <!-- flex base size + product: 200px + -0.5*200px = 100px --> + <div style="flex: 1 1 200px; width:50px;"> + <div></div> + </div> + <!-- min contribution: 100 --> + <!-- fraction: -0.75 --> + <!-- flex base size + product: 400px + -0.5*400px = 200px --> + <div style="flex: 1 1 400px; width:50px;"> + <div></div> </div> </div> + </div> - <div class="zero-width"> - <div class="floating-flexbox" data-expected-width="225"> - <div style="flex: 1 1 200px; width:50px;"> - <div></div> - </div> - <div style="flex: 1 2 400px; width:50px;"> - <div></div> - </div> + <div class="zero-width"> + <div class="floating-flexbox" data-expected-width="225"> + <div style="flex: 1 1 200px; width:50px;"> + <div></div> + </div> + <div style="flex: 1 2 400px; width:50px;"> + <div></div> </div> </div> + </div> - <!-- This is same as above except for min-width auto is no longer in + <!-- This is same as above except for min-width auto is no longer in effect. EdgeHTML renders it differently than the above. --> - <div class="zero-width"> - <div class="floating-flexbox" data-expected-width="225"> - <div style="flex: 1 1 200px; width:50px; min-width: 0px;"> - <div></div> - </div> - <div style="flex: 1 2 400px; width:50px; min-width: 0px;"> - <div></div> - </div> + <div class="zero-width"> + <div class="floating-flexbox" data-expected-width="225"> + <div style="flex: 1 1 200px; width:50px; min-width: 0px;"> + <div></div> + </div> + <div style="flex: 1 2 400px; width:50px; min-width: 0px;"> + <div></div> </div> </div> + </div> - <div class="zero-width"> - <div class="floating-flexbox" data-expected-width="600"> - <div style="flex: 1 0 200px; width:50px;"> - <div></div> - </div> - <div style="flex: 1 1 400px; width:50px;"> - <div></div> - </div> + <div class="zero-width"> + <div class="floating-flexbox" data-expected-width="300"> + <!-- min contribution: 100 --> + <!-- fraction: -inf --> + <!-- flex base size + product: 200px + -0.75*0px = 200px --> + <div style="flex: 1 0 200px; width:50px;"> + <div></div> + </div> + <!-- min contribution: 100 --> + <!-- fraction: -0.75 --> + <!-- flex base size + product: 400px + -0.75*400px = 100px --> + <div style="flex: 1 1 400px; width:50px;"> + <div></div> </div> </div> + </div> - <div class="zero-width"> - <div class="floating-flexbox" data-expected-width="200"> - <div style="flex: 0 0 50px; width: 200px;"> - <div></div> - </div> - <div style="flex: 0 0 50px; width: 200px;"> - <div></div> - </div> + <div class="zero-width"> + <div class="floating-flexbox" data-expected-width="200"> + <div style="flex: 0 0 50px; width: 200px;"> + <div></div> + </div> + <div style="flex: 0 0 50px; width: 200px;"> + <div></div> </div> </div> + </div> - <div class="zero-width"> - <!-- 200 + 400 = 600 --> - <div class="floating-flexbox" data-expected-width="600"> - <!-- contribution: 200 --> - <!-- fraction: 150 --> - <!-- 50 + 1*150 = 200 --> - <div style="flex: 1 0 50px; width: 200px;"> - <div></div> - </div> - <!-- contribution: 200 --> - <!-- fraction: 100 --> - <!-- 100 + 2*150 = 400 --> - <div style="flex: 2 0 100px; width: 200px;"> - <div></div> - </div> + <div class="zero-width"> + <!-- 200 + 400 = 600 --> + <div class="floating-flexbox" data-expected-width="600"> + <!-- contribution: 200 --> + <!-- fraction: 150 --> + <!-- 50 + 1*150 = 200 --> + <div style="flex: 1 0 50px; width: 200px;"> + <div></div> + </div> + <!-- contribution: 200 --> + <!-- fraction: 100 --> + <!-- 100 + 2*150 = 400 --> + <div style="flex: 2 0 100px; width: 200px;"> + <div></div> </div> </div> + </div> - <div class="zero-width"> - <div class="floating-flexbox" data-expected-width="400"> - <div style="flex: 0 1 200px; width: 50px;"> - <div></div> - </div> - <div style="flex: 2 0 100px; width: 200px;"> - <div></div> - </div> + <div class="zero-width"> + <div class="floating-flexbox" data-expected-width="400"> + <!-- min contribution: 100 --> + <!-- fraction: -0.5 --> + <!-- flex base size + product: = 200px + 50px*0 = 200px --> + <div style="flex: 0 1 200px; width: 50px;"> + <div></div> + </div> + <!-- min contribution: 200 --> + <!-- fraction: (200px - 100px) / 2 = 50px --> + <!-- flex base size + product: = 100px + 50px*2 = 200px --> + <div style="flex: 2 0 100px; width: 200px;"> + <div></div> </div> </div> - </main> + </div> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-008.html b/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-008.html new file mode 100644 index 0000000..b34306b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-flexbox/intrinsic-size/row-008.html
@@ -0,0 +1,75 @@ +<!DOCTYPE html> +<link rel="author" title="David Grogan" href="mailto:dgrogan@chromium.org"> +<link rel="help" href="https://drafts.csswg.org/css-flexbox/#intrinsic-sizes"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/check-layout-th.js"></script> +<meta name="assert" + content="min-content width is calculated correctly in a variety of scenarios with two flex items. These cases were used as examples when deriving the intrinsic size algorithm. " /> + +<style> + .min-width-flexbox { + display: flex; + outline: 5px solid blue; + height: 100px; + width: min-content; + margin-bottom: 20px; + } + + .min-width-flexbox>div:nth-child(1) { + background: yellow; + } + + .min-width-flexbox>div:nth-child(2) { + background: orange; + } + + .min-width-flexbox>div>div { + width: 100px; + } + +</style> + +<body onload="checkLayout('.min-width-flexbox')"> + <div id=log></div> +</body> + +<script> + // These are from the table in https://github.com/w3c/csswg-drafts/issues/7189#issuecomment-1172771501 + var test_cases = [ + [0, 0, 200, 100, 300], + [0, .1, 200, 101, 310], + [.1, .1, 203, 103, 330], + [.4, .4, 248, 148, 420], + [.5, .5, 275, 175, 450], + [.75, .75, 368.75, 268.75, 637.5], + [1, 1, 500, 400, 900], + [0, 2, 200, 200, 400], + [.1, 2, 205, 200, 405], + [.2, 2, 212, 220, 432], + [2, 2, 500, 400, 900], + ]; + test_cases.forEach(test_case => { + var flexbox = document.createElement('div'); + flexbox.className = "min-width-flexbox"; + flexbox.setAttribute("data-expected-width", test_case[4]); + + var child1 = document.createElement('div'); + child1.style.flex = "0 1 200px"; + child1.style.width = "500px"; + child1.style.flexGrow = test_case[0]; + child1.setAttribute("data-expected-width", test_case[2]); + child1.appendChild(document.createElement('div')); + + var child2 = document.createElement('div'); + child2.style.flex = "0 0 100px"; + child2.style.width = "200px"; + child2.style.flexGrow = test_case[1]; + child2.setAttribute("data-expected-width", test_case[3]); + child2.appendChild(document.createElement('div')); + + flexbox.appendChild(child1); + flexbox.appendChild(child2); + document.body.appendChild(flexbox); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/dir-pseudo-on-bdi-element.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/dir-pseudo-on-bdi-element.html new file mode 100644 index 0000000..4344344 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/dir-pseudo-on-bdi-element.html
@@ -0,0 +1,80 @@ +<!DOCTYPE html> +<html> +<head> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> + +test(() => { + const bdi = document.createElement('bdi'); + assert_true(bdi.matches(':dir(ltr)')); + assert_false(bdi.matches(':dir(rtl)')); + + bdi.textContent = '\u05EA'; + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); +}, 'bdi element without dir content attribute'); + +test(() => { + const bdi = document.createElement('bdi'); + bdi.setAttribute('dir', 'foo'); + assert_true(bdi.matches(':dir(ltr)')); + assert_false(bdi.matches(':dir(rtl)')); + + bdi.textContent = '\u05EA'; + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); +}, 'bdi element with invalid dir content attribute'); + +test(() => { + const bdi = document.createElement('bdi'); + bdi.setAttribute('dir', 'auto'); + assert_true(bdi.matches(':dir(ltr)')); + assert_false(bdi.matches(':dir(rtl)')); + + bdi.textContent = '\u05EA'; + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); + + bdi.setAttribute('dir', 'AUTO'); + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); +}, 'bdi element with dir=auto content attribute'); + +test(() => { + const bdi = document.createElement('bdi'); + bdi.setAttribute('dir', 'ltr'); + assert_true(bdi.matches(':dir(ltr)')); + assert_false(bdi.matches(':dir(rtl)')); + + bdi.setAttribute('dir', 'LTR'); + assert_true(bdi.matches(':dir(ltr)')); + assert_false(bdi.matches(':dir(rtl)')); + + bdi.textContent = '\u05EA'; + assert_true(bdi.matches(':dir(ltr)')); + assert_false(bdi.matches(':dir(rtl)')); +}, 'bdi element with dir=ltr content attribute'); + +test(() => { + const bdi = document.createElement('bdi'); + bdi.setAttribute('dir', 'rtl'); + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); + + bdi.setAttribute('dir', 'RTL'); + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); + + bdi.textContent = '\u05EA'; + assert_false(bdi.matches(':dir(ltr)')); + assert_true(bdi.matches(':dir(rtl)')); +}, 'bdi element with dir=rtl content attribute'); + +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/dir-pseudo-on-input-element.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/dir-pseudo-on-input-element.html new file mode 100644 index 0000000..3bb49790 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/dir-pseudo-on-input-element.html
@@ -0,0 +1,160 @@ +<!DOCTYPE html> +<html> +<head> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<script> + +test(() => { + const input = document.createElement('input'); + input.type = 'tel'; + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'foo'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'rtl'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'RTL'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'ltr'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'LTR'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'auto'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.value = '\u05EA'; + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'AUTO'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.removeAttribute('dir'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); +}, 'input element whose type attribute is in the telephone state'); + +test(() => { + const input = document.createElement('input'); + input.type = 'tel'; + + const container = document.createElement('div'); + container.setAttribute('dir', 'rtl'); + container.appendChild(input); + + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); +}, 'input element whose type attribute is in the telephone state in a RTL block'); + +for (let type of ['text', 'search', 'url', 'email']) { + test(() => { + const input = document.createElement('input'); + input.type = type; + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'foo'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'rtl'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'RTL'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'ltr'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'LTR'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'auto'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.value = '\u05EA'; + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'AUTO'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')) + + input.removeAttribute('dir'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + }, `input element whose type attribute is in the ${type} state`); +} + +for (let type of ['password', 'date', 'time', 'number', 'range', 'color', + 'checkbox', 'radio', 'submit', 'image', 'reset', 'button']) { + test(() => { + const input = document.createElement('input'); + input.type = type; + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'foo'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'rtl'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'RTL'); + assert_false(input.matches(':dir(ltr)')); + assert_true(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'ltr'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'LTR'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'auto'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.value = '\u05EA'; + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + + input.setAttribute('dir', 'AUTO'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')) + + input.removeAttribute('dir'); + assert_true(input.matches(':dir(ltr)')); + assert_false(input.matches(':dir(rtl)')); + }, `input element whose type attribute is in the ${type} state`); +} + +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries-ref.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries-ref.html new file mode 100644 index 0000000..eda713a7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries-ref.html
@@ -0,0 +1,7 @@ +<!DOCTYPE html> +<html> + <body> + <p>Test passes if you see a single 100px by 100px green box below.</p> + <div style="width: 100px; height: 100px; background: green;"></div> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html b/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html new file mode 100644 index 0000000..f54e8cb --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-pseudo/lang-pseudo-class-across-shadow-boundaries.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<html> +<head> +<link rel="help" href="https://drafts.csswg.org/selectors/#lang-pseudo"> +<link rel="match" href="marker-and-other-pseudo-elements-ref.html"> +</head> +<body> +<p>Test passes if you see a single 100px by 100px green box below.</p> +<style> +#testCases div { width: 100px; height: 25px; } +#host1:lang(zh) { background: green; } +#host3 > :lang(ja) { background: green; } +#host4 > div { background: red; } +</style> +<div id="testCases"> +<div id="host1" lang="zh"><div></div></div> +<div id="host2" lang="de"><div></div></div> +<div id="host3" lang="ja"><div></div></div> +<div id="host4"><div></div></div> +</div> +<script> +host1.attachShadow({mode: 'closed'}).innerHTML = '<slot></slot>'; +host2.attachShadow({mode: 'closed'}).innerHTML = '<style> div { width: 100px; height: 25px; background: red; } div:lang(de) { background: green; } </style><div></div>'; +host3.attachShadow({mode: 'closed'}).innerHTML = '<slot lang="en"></slot>'; +host4.attachShadow({mode: 'closed'}).innerHTML = '<style> :lang(ja)::slotted(*) { background: green !important; } </style><slot lang="ja"></slot>'; +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/media-query-matches-in-iframe.html b/third_party/blink/web_tests/external/wpt/css/mediaqueries/media-query-matches-in-iframe.html new file mode 100644 index 0000000..5828936 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/media-query-matches-in-iframe.html
@@ -0,0 +1,104 @@ +<!DOCTYPE html> +<html> +<body> +<link rel="help" href="https://drafts.csswg.org/mediaqueries-4/#mf-dimensions"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script> + +async function createFrameAndUpdateLayout(test) { + const iframe = await new Promise((resolve) => { + const iframe = document.createElement('iframe'); + iframe.style.width = '100px'; + iframe.style.height = '100px'; + iframe.onload = () => resolve(iframe); + document.body.appendChild(iframe); + test.add_cleanup(() => iframe.remove()); + }); + iframe.contentDocument.body.innerHTML = '<span>some content</span>'; + window.preventOptimization1 = iframe.getBoundingClientRect(); + window.preventOptimization2 = iframe.contentDocument.querySelector('span').getBoundingClientRect(); + return iframe; +} + +for (const query of ['(max-width: 150px)', '(width: 100px)', '(orientation: portrait)', '(aspect-ratio: 1/1)', '(max-aspect-ratio: 4/3)']) { + promise_test(async function () { + const iframe = await createFrameAndUpdateLayout(this); + const mediaQuery = iframe.contentWindow.matchMedia(query); + assert_true(mediaQuery.matches); + iframe.style.width = '200px'; + assert_false(mediaQuery.matches); + }, `matchMedia('${query}').matches should update immediately`); +} + +for (const query of ['(height: 100px)', '(max-height: 150px)', '(min-aspect-ratio: 3/4)']) { + promise_test(async function () { + const iframe = await createFrameAndUpdateLayout(this); + const mediaQuery = iframe.contentWindow.matchMedia(query); + assert_true(mediaQuery.matches); + iframe.style.height = '200px'; + assert_false(mediaQuery.matches); + }, `matchMedia('${query}').matches should update immediately`); +} + +for (const query of ['(min-height: 150px)', '(aspect-ratio: 1/2)']) { + promise_test(async function () { + const iframe = await createFrameAndUpdateLayout(this); + const mediaQuery = iframe.contentWindow.matchMedia(query); + assert_false(mediaQuery.matches); + iframe.style.height = '200px'; + assert_true(mediaQuery.matches); + }, `matchMedia('${query}').matches should update immediately`); +} + +for (const query of ['(min-width: 150px)', '(min-aspect-ratio: 4/3)']) { + promise_test(async function () { + const iframe = await createFrameAndUpdateLayout(this); + const mediaQuery = iframe.contentWindow.matchMedia(query); + assert_false(mediaQuery.matches); + iframe.style.width = '200px'; + assert_true(mediaQuery.matches); + }, `matchMedia('${query}').matches should update immediately`); +} + +for (const query of ['(max-width: 150px)', '(width: 100px)', '(orientation: portrait)', '(aspect-ratio: 1/1)', '(max-aspect-ratio: 4/3)']) { + promise_test(async function () { + const iframe = await createFrameAndUpdateLayout(this); + const mediaQuery = iframe.contentWindow.matchMedia(query); + let changes = 0; + mediaQuery.addEventListener('change', () => ++changes); + assert_true(mediaQuery.matches); + assert_equals(changes, 0); + iframe.style.width = '200px'; + assert_false(mediaQuery.matches); + assert_equals(changes, 0); + await new Promise(requestAnimationFrame); + assert_false(mediaQuery.matches); + assert_equals(changes, 1); + }, `matchMedia('${query}') should not receive a change event until update the rendering step of HTML5 event loop`); +} + +for (const query of ['(max-width: 150px)', '(width: 100px)', '(orientation: portrait)', '(aspect-ratio: 1/1)', '(max-aspect-ratio: 4/3)']) { + promise_test(async function () { + const iframe = await createFrameAndUpdateLayout(this); + const mediaQuery = iframe.contentWindow.matchMedia(query); + const events = []; + iframe.contentWindow.addEventListener('resize', () => { + assert_array_equals(events, []); + events.push('resize'); + }); + mediaQuery.addEventListener('change', () => events.push('change')); + assert_true(mediaQuery.matches); + assert_array_equals(events, []); + iframe.style.width = '200px'; + assert_false(mediaQuery.matches); + assert_array_equals(events, []); + await new Promise(requestAnimationFrame); + assert_false(mediaQuery.matches); + assert_array_equals(events, ['resize', 'change']); + }, `matchMedia('${query}') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called`); +} + +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/perform-microtask-checkpoint-before-construction-xml-parser.xhtml b/third_party/blink/web_tests/external/wpt/custom-elements/perform-microtask-checkpoint-before-construction-xml-parser.xhtml new file mode 100644 index 0000000..63bb1d14 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/perform-microtask-checkpoint-before-construction-xml-parser.xhtml
@@ -0,0 +1,81 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Custom Elements: create an element for a token must perform a microtask checkpoint</title> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org" /> +<meta name="assert" content="When the HTML parser creates an element for a token, it must perform a microtask checkpoint before invoking the constructor" /> +<meta name="help" content="https://html.spec.whatwg.org/multipage/parsing.html#create-an-element-for-the-token" /> +<meta name="help" content="https://html.spec.whatwg.org/multipage/webappapis.html#perform-a-microtask-checkpoint" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/custom-elements-helpers.js"></script> +</head> +<body> +<div id="log"></div> +<script> +<![CDATA[ + +async function construct_custom_element_in_parser(test, markup) +{ + const window = await create_window_in_test_async(test, 'application/xml', `<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<body><script> +class SomeElement extends HTMLElement { + constructor() { + super(); + window.recordsListInConstructor = recordsList.map((records) => records.slice(0)); + } +} +customElements.define('some-element', SomeElement); + +const recordsList = []; +const observer = new MutationObserver((records) => { + recordsList.push(records); +}); +observer.observe(document.body, {childList: true, subtree: true}); + +window.onload = () => { + window.recordsListInDOMContentLoaded = recordsList.map((records) => records.slice(0)); +} + +</scr` + `ipt>${markup}</body></html>`); + return window; +} + +promise_test(async function () { + const contentWindow = await construct_custom_element_in_parser(this, '<b><some-element></some-element></b>'); + const contentDocument = contentWindow.document; + + let recordsList = contentWindow.recordsListInConstructor; + assert_true(Array.isArray(recordsList)); + assert_equals(recordsList.length, 1); + assert_true(Array.isArray(recordsList[0])); + assert_equals(recordsList[0].length, 1); + let record = recordsList[0][0]; + assert_equals(record.type, 'childList'); + assert_equals(record.target, contentDocument.body); + assert_equals(record.previousSibling, contentDocument.querySelector('script')); + assert_equals(record.nextSibling, null); + assert_equals(record.removedNodes.length, 0); + assert_equals(record.addedNodes.length, 1); + assert_equals(record.addedNodes[0], contentDocument.querySelector('b')); + + recordsList = contentWindow.recordsListInDOMContentLoaded; + assert_true(Array.isArray(recordsList)); + assert_equals(recordsList.length, 2); + assert_true(Array.isArray(recordsList[1])); + assert_equals(recordsList[1].length, 1); + record = recordsList[1][0]; + assert_equals(record.type, 'childList'); + assert_equals(record.target, contentDocument.querySelector('b')); + assert_equals(record.previousSibling, null); + assert_equals(record.nextSibling, null); + assert_equals(record.removedNodes.length, 0); + assert_equals(record.addedNodes.length, 1); + assert_equals(record.addedNodes[0], contentDocument.querySelector('some-element')); +}, 'XML parser must perform a microtask checkpoint before constructing a custom element'); + +]]> +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/resources/custom-elements-helpers.js b/third_party/blink/web_tests/external/wpt/custom-elements/resources/custom-elements-helpers.js index 6f73fe2..48775af1 100644 --- a/third_party/blink/web_tests/external/wpt/custom-elements/resources/custom-elements-helpers.js +++ b/third_party/blink/web_tests/external/wpt/custom-elements/resources/custom-elements-helpers.js
@@ -12,6 +12,20 @@ return p; } +function create_window_in_test_async(test, mime, doc) { + return new Promise((resolve) => { + let iframe = document.createElement('iframe'); + blob = new Blob([doc], {type: mime}); + iframe.src = URL.createObjectURL(blob); + iframe.onload = (event) => { + let contentWindow = iframe.contentWindow; + test.add_cleanup(() => iframe.remove()); + resolve(contentWindow); + }; + document.body.appendChild(iframe); + }); +} + function test_with_window(f, name, srcdoc) { promise_test((t) => { return create_window_in_test(t, srcdoc)
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml b/third_party/blink/web_tests/external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml new file mode 100644 index 0000000..c0a7f62 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-construct-xml-parser.xhtml
@@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Custom Elements: create an element for a token must increment and decrement document's throw-on-dynamic-markup-insertion counter</title> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org" /> +<meta name="assert" content="Invoking document.open, document.write, document.writeln, and document.write must throw an exception when the HTML parser is creating a custom element for a token" /> +<meta name="help" content="https://html.spec.whatwg.org/multipage/parsing.html#create-an-element-for-the-token" /> +<meta name="help" content="https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#throw-on-dynamic-markup-insertion-counter" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/custom-elements-helpers.js"></script> +</head> +<body> +<div id="log"></div> +<script> +<![CDATA[ + +async function construct_custom_element_in_parser(test, code) +{ + window.executed = false; + window.exception = false; + const content_window = await create_window_in_test_async(test, 'application/xml', `<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<script> +<![CDATA[ +let executed = false; +let exception = null; +class CustomElement extends window.HTMLElement { + constructor() { + super(); + try { + ${code} + } catch (error) { + exception = error; + } + executed = true; + } +} +customElements.define('some-element', CustomElement); +]]` + `> +</` + `script> +</head> +<body> +<some-element></some-element> +<script> +top.executed = executed; +top.exception = exception; +</script> +</body> +</html>`); + let content_document; + try { + content_document = content_window.document; + } catch (error) { } + assert_true(executed, 'Must synchronously instantiate a custom element'); + return {window: content_window, document: content_document, exception}; +} + +promise_test(async function () { + const result = await construct_custom_element_in_parser(this, `document.open()`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); + }, 'document.open() must throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + const result = await construct_custom_element_in_parser(this, `document.open('text/html')`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); +}, 'document.open("text/html") must throw an InvalidStateError when synchronously constructing a custom element'); + +// https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-document-open-window +promise_test(async function () { + let load_promise = new Promise((resolve) => window.onmessage = (event) => resolve(event.data)); + const url = top.location.href.substring(0, top.location.href.lastIndexOf('/')) + '/resources/navigation-destination.html'; + const result = await construct_custom_element_in_parser(this, `document.open('${url}', '_self', '')`); + assert_equals(result.exception, null); + assert_equals(await load_promise, 'didNavigate'); +}, 'document.open(URL) must NOT throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + const result = await construct_custom_element_in_parser(this, `document.close()`); + assert_not_equals(result.exception, null); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); +}, 'document.close() must throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + const result = await construct_custom_element_in_parser(this, `document.write('<b>some text</b>')`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); + assert_equals(result.document.querySelector('b'), null, 'Must not insert new content'); + assert_false(result.document.body.innerHTML.includes('some text'), 'Must not insert new content'); +}, 'document.write must throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + const result = await construct_custom_element_in_parser(this, `document.writeln('<b>some text</b>')`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); + assert_equals(result.document.querySelector('b'), null, 'Must not insert new content'); + assert_false(result.document.body.innerHTML.includes('some text'), 'Must not insert new content'); +}, 'document.writeln must throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test_async(this, 'text/html', '<!DOCTYPE html><html><body>'); + const result = await construct_custom_element_in_parser(this, `top.another_window.document.open()`); + assert_equals(result.exception, null); +}, 'document.open() of another document must not throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test_async(this, 'text/html', '<!DOCTYPE html><html><body>'); + const result = await construct_custom_element_in_parser(this, `top.another_window.document.open('text/html')`); + assert_equals(result.exception, null); +}, 'document.open("text/html") of another document must not throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test_async(this, 'text/html', '<!DOCTYPE html><html><body>'); + const result = await construct_custom_element_in_parser(this, `top.another_window.document.close()`); + assert_equals(result.exception, null); +}, 'document.close() of another document must not throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test_async(this, 'text/html', '<!DOCTYPE html><html><body>'); + const result = await construct_custom_element_in_parser(this, `top.another_window.document.write('<b>some text</b>')`); + assert_equals(result.exception, null); + assert_equals(another_window.document.querySelector('b').outerHTML, '<b>some text</b>'); +}, 'document.write of another document must not throw an InvalidStateError when synchronously constructing a custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test_async(this, 'text/html', '<!DOCTYPE html><html><body>'); + const result = await construct_custom_element_in_parser(this, `top.another_window.document.writeln('<b>some text</b>')`); + assert_equals(result.exception, null); + assert_equals(another_window.document.querySelector('b').outerHTML, '<b>some text</b>'); +}, 'document.writeln of another document must not throw an InvalidStateError when synchronously constructing a custom element'); + +]]> +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml b/third_party/blink/web_tests/external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml new file mode 100644 index 0000000..13f6645 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/custom-elements/throw-on-dynamic-markup-insertion-counter-reactions-xml-parser.xhtml
@@ -0,0 +1,134 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<title>Custom Elements: create an element for a token must increment and decrement document's throw-on-dynamic-markup-insertion counter</title> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org" /> +<meta name="assert" content="Invoking document.open, document.write, document.writeln, and document.write must throw an exception when the HTML parser is creating a custom element for a token" /> +<meta name="help" content="https://html.spec.whatwg.org/multipage/parsing.html#create-an-element-for-the-token" /> +<meta name="help" content="https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#throw-on-dynamic-markup-insertion-counter" /> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="resources/custom-elements-helpers.js"></script> +</head> +<body> +<div id="log"></div> +<script> +<![CDATA[ + +async function custom_element_reactions_in_parser(test, code) +{ + window.executed = false; + window.exception = false; + const content_window = await create_window_in_test_async(test, 'application/xml', `<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<script> +<![CDATA[ +let executed = false; +let exception = null; +class CustomElement extends window.HTMLElement { + constructor() { + super(); + try { + ${code} + } catch (error) { + exception = error; + } + executed = true; + } +} +CustomElement.observedAttributes = ['title']; +customElements.define('some-element', CustomElement); +]]` + `> +</` + `script> +</head> +<body> +<some-element title="some title"></some-element> +<script> +top.executed = executed; +top.exception = exception; +</script> +</body> +</html>`); + let content_document; + try { + content_document = content_window.document; + } catch (error) { } + assert_true(executed, 'Must immediately process custom element reactions for setting attributes'); + return {window: content_window, document: content_document, exception}; +} + +promise_test(async function () { + const result = await custom_element_reactions_in_parser(this, `document.open()`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); +}, 'document.open() must throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + const result = await custom_element_reactions_in_parser(this, `document.open('text/html')`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); +}, 'document.open("text/html") must throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +// https://html.spec.whatwg.org/multipage/dynamic-markup-insertion.html#dom-document-open-window +promise_test(async function () { + let load_promise = new Promise((resolve) => window.onmessage = (event) => resolve(event.data)); + const url = top.location.href.substring(0, top.location.href.lastIndexOf('/')) + '/resources/navigation-destination.html'; + const result = await custom_element_reactions_in_parser(this, `document.open('${url}', '_self', '')`); + assert_equals(result.exception, null); + assert_equals(await load_promise, 'didNavigate'); +}, 'document.open(URL) must NOT throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + const result = await custom_element_reactions_in_parser(this, `document.close()`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); +}, 'document.close() must throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + const result = await custom_element_reactions_in_parser(this, `document.write('<b>some text</b>')`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); + assert_equals(result.document.querySelector('b'), null, 'Must not insert new content'); + assert_false(result.document.body.innerHTML.includes('some text'), 'Must not insert new content'); +}, 'document.write must throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + const result = await custom_element_reactions_in_parser(this, `document.writeln('<b>some text</b>')`); + assert_throws_dom('InvalidStateError', result.window.DOMException, () => { throw result.exception; }, 'Must throw an InvalidStateError'); + assert_equals(result.document.querySelector('b'), null, 'Must not insert new content'); + assert_false(result.document.body.innerHTML.includes('some text'), 'Must not insert new content'); +}, 'document.writeln must throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test(this); + const result = await custom_element_reactions_in_parser(this, `top.another_window.document.open()`); + assert_equals(result.exception, null); +}, 'document.open() of another document must not throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test(this); + const result = await custom_element_reactions_in_parser(this, `top.another_window.document.open('text/html')`); + assert_equals(result.exception, null); +}, 'document.open("text/html") of another document must not throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test(this); + const result = await custom_element_reactions_in_parser(this, `top.another_window.document.close()`); + assert_equals(result.exception, null); +}, 'document.close() of another document must not throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test(this); + const result = await custom_element_reactions_in_parser(this, `top.another_window.document.write('<b>some text</b>')`); + assert_equals(result.exception, null); + assert_equals(another_window.document.querySelector('b').outerHTML, '<b>some text</b>'); +}, 'document.write of another document must not throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +promise_test(async function () { + window.another_window = await create_window_in_test(this); + const result = await custom_element_reactions_in_parser(this, `top.another_window.document.writeln('<b>some text</b>')`); + assert_equals(result.exception, null); + assert_equals(another_window.document.querySelector('b').outerHTML, '<b>some text</b>'); +}, 'document.writeln of another document must not throw an InvalidStateError when processing custom element reactions for a synchronous constructed custom element'); + +]]> +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-convertToBlob-roundtrip.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-convertToBlob-roundtrip.html deleted file mode 100644 index 75bd34d..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-convertToBlob-roundtrip.html +++ /dev/null
@@ -1,157 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -// No matter what is the color space and pixel format of the color managed -// canvas, toBlob() and toDataURL() always create the blob in sRGB color -// space, and respect the legacy behavior by not including any color space -// information in the blob/data url. - -var opaqueReferencePxiels, transparentReferencePixels; - -function testPixels(actualPixels, refPixels, testScenario) -{ - // Narrowing down the source of expected error: - // - Alpha values should always match. - // - Color components should be acceptably close. - if (testScenario.canvasColorParam.pixelFormat == 'uint8') { - let tolerance_color = 4; - for (let i = 0; i < actualPixels.length; i++) { - // Alpha channel - if (i % 4 == 3) - assert_equals(actualPixels[i], refPixels[i]); - else - assert_approx_equals(actualPixels[i], refPixels[i], tolerance_color); - } - } else { - // For half float backed canvas, we expect the error < 0.01. - let tolerance_color = 0.01; - for (let i = 0; i < actualPixels.length; i++) { - // Alpha channel - if (i % 4 == 3) - assert_equals(actualPixels[i], refPixels[i]); - else - assert_approx_equals(actualPixels[i], refPixels[i], tolerance_color); - } - } -} - -function createCanvas(testScenario) -{ - var canvas = document.createElement("canvas"); - canvas.width = 2; - canvas.height = 2; - return canvas; -} - -function generateFillStyle(red, green, blue, alpha) { - return "rgba(" + red + "," + green + "," + blue + "," + alpha + ")"; -} - -function drawPatternOnCanvsa(ctx, alpha, compositeOverBlack) { - if (compositeOverBlack) { - ctx.fillStyle = generateFillStyle(0, 0, 0, 1); - ctx.fillRect(0, 0, 2, 2); - } - ctx.fillStyle = generateFillStyle(155, 27, 27, alpha); - ctx.fillRect(0, 0, 1, 1); - ctx.fillStyle = generateFillStyle(27, 155, 27, alpha); - ctx.fillRect(1, 0, 1, 1); - ctx.fillStyle = generateFillStyle(27, 27, 155, alpha); - ctx.fillRect(0, 1, 1, 1); - ctx.fillStyle = generateFillStyle(27, 27, 27, alpha); - ctx.fillRect(1, 1, 1, 1); -} - -function testScenarioToString(testScenario) { - var str = "mimeType: " + testScenario.encodeOptions.type + - ", blobPixelFormat: " + testScenario.encodeOptions.pixelFormat + - ", source color space: " + testScenario.canvasColorParam.colorSpace + - ", pixel format: " + testScenario.canvasColorParam.pixelFormat + - ", alpha: " + testScenario.alpha; - return str; -} - -function runConvertToBlobTest(testScenario) { - var srcCanvas = createCanvas(testScenario); - var ctx = srcCanvas.getContext('2d', testScenario.canvasColorParam); - var compositeOverBlack = (testScenario.encodeOptions.type == "image/jpeg"); - drawPatternOnCanvsa(ctx, testScenario.alpha, compositeOverBlack); - var refPixels = ctx.getImageData(0, 0, 2, 2, testScenario.imageSetting).data; - - var t = async_test("Test canvas convertToBlob(): " + - testScenarioToString(testScenario)); - - var image = new Image(); - image.onload = t.step_func_done(function() { - var dstCanvas = createCanvas(testScenario); - var dstCtx = dstCanvas.getContext('2d', testScenario.canvasColorParam); - dstCtx.drawImage(image, 0, 0); - var actualPixels = dstCtx.getImageData(0, 0, 2, 2, testScenario.imageSetting).data; - testPixels(actualPixels, refPixels, testScenario); - }); - - srcCanvas.convertToBlob(testScenario.encodeOptions).then( - t.step_func(function(blob) { - var urlCreator = window.URL || window.webkitURL; - image.src = urlCreator.createObjectURL(blob); - }), - t.step_func_done(function(e) { - assert_false("convertToBlob failed."); - }) - ); -} - -function runAllTests() { - - var mimeTypes = ['image/png', 'image/jpeg', 'image/webp']; - var blobPixelFormats = ['uint8', 'uint16']; - - var encodeOptionsSet = []; - for (var i = 0; i < mimeTypes.length; i++) - for (var k = 0; k < blobPixelFormats.length; k++) { - var encodeOptions = {}; - encodeOptions.quality = 1; - encodeOptions.type = mimeTypes[i]; - encodeOptions.pixelFormat = blobPixelFormats[k]; - encodeOptionsSet.push(encodeOptions); - } - - var canvasColorParams = [ - {colorSpace: 'srgb', pixelFormat: 'uint8'}, - {colorSpace: 'srgb', pixelFormat: 'float16'}, - ]; - - var imageSettings = [ - {colorSpace: 'srgb', storageFormat: 'uint8'}, - {colorSpace: 'srgb', storageFormat: 'float32'}, - ]; - var alphaValues = [0.5, 1]; - - // The *correct* way to test convertToBlob() is to directly examine the - // image file for the expected color space and pixels. Since this is not - // easy to do in javascript, we use a round-trip test here and leave the - // more thorough testing to unit tests. - - var testScenarioSet = []; - for (var i = 0; i < encodeOptionsSet.length; i++) - for (var j = 0; j < canvasColorParams.length; j++) - for (var k = 0; k < alphaValues.length; k++) { - var testScenario = {}; - testScenario.encodeOptions = encodeOptionsSet[i]; - testScenario.canvasColorParam = canvasColorParams[j]; - testScenario.alpha = alphaValues[k]; - testScenario.imageSetting = imageSettings[j] - testScenarioSet.push(testScenario); - } - - for (var i = 0; i < testScenarioSet.length; i++) - runConvertToBlobTest(testScenarioSet[i]); -} - -test(function() { - runAllTests(); -}, "Overall test"); - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-toBlob-toDataURL.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-toBlob-toDataURL.html deleted file mode 100644 index 87f8d6d..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorManaged-toBlob-toDataURL.html +++ /dev/null
@@ -1,147 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -// No matter what is the color space and pixel format of the color managed -// canvas, toBlob() and toDataURL() always create the blob in sRGB color -// space, and respect the legacy behavior by not including any color space -// information in the blob/data url. - -var opaqueReferencePxiels, transparentReferencePixels; - -function testPixels(actualPixels, alpha) -{ - if (alpha == 1) - assert_array_approx_equals(actualPixels, opaqueReferencePxiels, 1); - else - assert_array_approx_equals(actualPixels, transparentReferencePixels, 2); -} - -function generateFillStyle(red, green, blue, alpha) { - return "rgba(" + red + "," + green + "," + blue + "," + alpha + ")"; -} - -function contextDrawHelper(ctx, alpha) { - ctx.fillStyle = generateFillStyle(155, 27, 27, alpha); - ctx.fillRect(0, 0, 1, 1); - ctx.fillStyle = generateFillStyle(27, 155, 27, alpha); - ctx.fillRect(1, 0, 1, 1); - ctx.fillStyle = generateFillStyle(27, 27, 155, alpha); - ctx.fillRect(0, 1, 1, 1); - ctx.fillStyle = generateFillStyle(27, 27, 27, alpha); - ctx.fillRect(1, 1, 1, 1); -} - -function prepareReferenceExpectedResults() { - var canvas1 = document.createElement("canvas"); - canvas1.width = 2; - canvas1.height = 2; - var ctx1 = canvas1.getContext('2d'); - contextDrawHelper(ctx1, 1); - opaqueReferencePxiels = ctx1.getImageData(0, 0, 2, 2).data; - - var canvas2 = document.createElement("canvas"); - canvas2.width = 2; - canvas2.height = 2; - var ctx2 = canvas2.getContext('2d'); - contextDrawHelper(ctx2, 0.5); - transparentReferencePixels = ctx2.getImageData(0, 0, 2, 2).data; -} - -function createCanvas(testScenario) -{ - var canvas = document.createElement("canvas"); - canvas.width = 2; - canvas.height = 2; - var ctx = canvas.getContext('2d', {colorSpace: testScenario.colorSpace, - pixelFormat: testScenario.pixelFormat}); - contextDrawHelper(ctx, testScenario.alpha); - return canvas; -} - -function testScenarioToString(testScenario) { - var str = "ImageFormat: " + testScenario.imageFormat + - ", source color space: " + testScenario.colorSpace + - ", pixel format: " + testScenario.pixelFormat + - ", alpha: " + testScenario.alpha; - if (testScenario.hasOwnProperty('colorSpaceConversion')) - str = str + ", intermediate color space: " + - testScenario.colorSpaceConversion; - return str; -} - -function runToBlobTest(testScenario) { - var srcCanvas = createCanvas(testScenario); - var t_blob = async_test("Test if toBlob() respects legacy behavior in \ - color managed canvas: " + testScenarioToString(testScenario)); - - var image = new Image(); - image.onload = t_blob.step_func_done(function() { - var dstCanvas = document.createElement("canvas"); - dstCanvas.width = 2; - dstCanvas.height = 2; - var ctx = dstCanvas.getContext('2d'); - ctx.drawImage(image, 0, 0); - var actualPixels = ctx.getImageData(0, 0, 2, 2).data; - testPixels(actualPixels, testScenario.alpha); - }); - - srcCanvas.toBlob(function(blob) { - var urlCreator = window.URL || window.webkitURL; - image.src = urlCreator.createObjectURL(blob); - }, 'image/png', 1); -} - -function runToDataURLTest(testScenario) { - var srcCanvas = createCanvas(testScenario); - var t_dataURL = async_test("Test if toDataURL() respects legacy behavior \ - in color managed canvas: " + testScenarioToString(testScenario)); - - var image = new Image(); - image.onload = t_dataURL.step_func_done(function() { - var dstCanvas = document.createElement("canvas"); - dstCanvas.width = 2; - dstCanvas.height = 2; - var ctx = dstCanvas.getContext('2d'); - ctx.drawImage(image, 0, 0); - var actualPixels = ctx.getImageData(0, 0, 2, 2).data; - testPixels(actualPixels, testScenario.alpha); - }); - image.src = srcCanvas.toDataURL(); -} - -function runAllTests() { - prepareReferenceExpectedResults(); - - var imageFormats = ['image/jpeg', 'image/png', 'image/webp']; - var colorSpaces = [ - {colorSpace: 'srgb', pixelFormat: 'uint8'}, - {colorSpace: 'srgb', pixelFormat: 'float16'}, - ]; - var alphaValues = [0.5, 1]; - - var testScenarioSet = []; - for (var i = 0; i < imageFormats.length; i++) - for (var j = 0; j < colorSpaces.length; j++) - for (var k = 0; k < alphaValues.length; k++) { - var testScenario = {}; - testScenario.imageFormat = imageFormats[i]; - testScenario.colorSpace = colorSpaces[j].colorSpace; - testScenario.pixelFormat = colorSpaces[j].pixelFormat; - testScenario.alpha = alphaValues[k]; - testScenarioSet.push(testScenario); - } - - for (var i = 0; i < testScenarioSet.length; i++) - runToBlobTest(testScenarioSet[i]); - - for (var i = 0; i < testScenarioSet.length; i++) - runToDataURLTest(testScenarioSet[i]); -} - -test(function() { - runAllTests(); -}, "Overall test"); - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorspace-arguments.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorspace-arguments.html deleted file mode 100644 index f44b324..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-colorspace-arguments.html +++ /dev/null
@@ -1,48 +0,0 @@ -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> - -<script> - -var testScenarios = [ - {testDescription: "Test default context creation parameters: srgb/uint8", - canvasColorSettings: {}, - expectedColorSettings: {colorSpace: "srgb", pixelFormat: "uint8"}}, - {testDescription: "Test CanvasColorSpace value srgb", - canvasColorSettings: {colorSpace: "srgb"}, - expectedColorSettings: {colorSpace: "srgb", pixelFormat: "uint8"}}, - - {testDescription: "Test CanvasPixelFormat value uint8", - canvasColorSettings: {pixelFormat: "uint8"}, - expectedColorSettings: {colorSpace: "srgb", pixelFormat: "uint8"}}, - {testDescription: "Test CanvasPixelFormat value float16", - canvasColorSettings: {pixelFormat: "float16"}, - expectedColorSettings: {colorSpace: "srgb", pixelFormat: "float16"}}, - - {testDescription: "Test supported color settings srgb/uint8", - canvasColorSettings: {colorSpace: "srgb", pixelFormat: "uint8"}, - expectedColorSettings: {colorSpace: "srgb", pixelFormat: "uint8"}}, - {testDescription: "Test supported color settings srgb/float16", - canvasColorSettings: {colorSpace: "srgb", pixelFormat: "float16"}, - expectedColorSettings: {colorSpace: "srgb", pixelFormat: "float16"}}, -]; - -function runTestScenario(testScenario) { - var t = test(function() { - var canvas = document. createElement('canvas'); - var ctx = canvas.getContext('2d', testScenario.canvasColorSettings); - var contextAttributes = ctx.getContextAttributes(); - assert_equals(contextAttributes.colorSpace, - testScenario.expectedColorSettings.colorSpace); - assert_equals(contextAttributes.pixelFormat, - testScenario.expectedColorSettings.pixelFormat); - }, testScenario.testDescription); -} - -function runAllTests() { - for (var i = 0; i < testScenarios.length; i++) - runTestScenario(testScenarios[i]); -} - -runAllTests(); -</script> -
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createImageBitmap-e_srgb.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createImageBitmap-e_srgb.html deleted file mode 100644 index 9fa42000..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createImageBitmap-e_srgb.html +++ /dev/null
@@ -1,577 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -var transparentBlack = [0, 0, 0, 0]; - -var e_sRGB_Red = [1, 0, 0, 1]; // sRGB(255,0,0,255) -var e_sRGB_Green = [0, 1, 0, 1]; // sRGB(0,255,0,255) -var e_sRGB_Blue = [0, 0, 1, 1]; // sRGB(0,0,255,255) -var e_sRGB_Black = [0, 0, 0, 1]; // sRGB(0,0,0,255) - -// sRGB(155,27,27,255) -var e_sRGB_OpaqueRed = [0.607422, 0.105835, 0.105835, 1]; -// sRGB(27,155,27,255) -var e_sRGB_OpaqueGreen = [0.105835, 0.607422, 0.105835, 1]; -// sRGB(27,27,155,255) -var e_sRGB_OpaqueBlue = [0.105835, 0.105835, 0.607422, 1]; -// sRGB(27,27,27,255) -var e_sRGB_OpaqueBlack = [0.105835, 0.105835, 0.105835, 1]; - -// sRGB(155,27,27,128) -var e_sRGB_TransparentRed = [0.607422, 0.105835, 0.105835, 0.501953]; -// sRGB(27, 155, 27, 128) -var e_sRGB_TransparentGreen = [0.105835, 0.607422, 0.105835, 0.501953]; -// sRGB(27, 27, 155, 128) -var e_sRGB_TransparentBlue = [0.105835, 0.105835, 0.607422, 0.501953]; -// sRGB(27, 27, 27, 128) -var e_sRGB_TransparentBlack = [0.105835, 0.105835, 0.105835, 0.501953]; - -// sRGB(226,31,31,128) -var e_sRGB_TransparentRedImage = [0.886230, 0.121521, 0.121521, 0.501953]; -// sRGB(226,31,31,128) -var e_sRGB_TransparentGreenImage = [0.121521, 0.886230, 0.121521, 0.501953]; -// sRGB(226,31,31,128) -var e_sRGB_TransparentBlueImage = [0.121521, 0.121521, 0.886230, 0.501953]; -// sRGB(226,31,31,128) -var e_sRGB_TransparentBlackImage = [0.121521, 0.121521, 0.121521, 0.501953]; - -function testPixels(ctx, tests, sourceType, imageSetting) -{ - var actual, expected, tolerance = 0.025; - if (sourceType === 'video') - tolerance = 0.03; - for (var i = 0; i < tests.length; i++) { - actual = ctx.getImageData(tests[i][0], tests[i][1], 1, 1, imageSetting).data; - assert_implements(actual, 'ImageData data not supported'); - expected = tests[i][2]; - assert_equals(actual.length, expected.length); - for (var j = 0; j < actual.length; j++) - assert_approx_equals(actual[j], expected[j], tolerance, tests[i][3]); - } -} - -function checkNoCrop(imageBitmap, colorInfo, sourceType) -{ - var canvas = document.createElement('canvas'); - canvas.width = 50; - canvas.height = 50; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - var imageSetting = {colorSpace: 'srgb', storageFormat:'float32'} - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(imageBitmap, 0, 0); - var tests; - if (colorInfo == 'fullColor') - tests = [[0, 0, e_sRGB_Red, "This pixel should be e-sRGB red."], - [39, 0, e_sRGB_Green, "This pixel should be e-sRGB green."], - [0, 39, e_sRGB_Blue, "This pixel should be e-sRGB blue."], - [39, 39, e_sRGB_Black, "This pixel should be e-sRGB black."], - [41, 41, transparentBlack, "This pixel should be transparent black."]]; - else if (colorInfo == 'opaque') - tests = [[0, 0, e_sRGB_OpaqueRed, - "This pixel should be e-sRGB like red."], - [39, 0, e_sRGB_OpaqueGreen, - "This pixel should be e-sRGB like green."], - [0, 39, e_sRGB_OpaqueBlue, - "This pixel should be e-sRGB like blue."], - [39, 39, e_sRGB_OpaqueBlack, - "This pixel should be e-sRGB like black."], - [41, 41, transparentBlack, "This pixel should be transparent black."]]; - else if (colorInfo == 'transparent') - tests = [[0, 0, e_sRGB_TransparentRed, - "This pixel should be e-sRGB transparent red."], - [39, 0, e_sRGB_TransparentGreen, - "This pixel should be e-sRGB transparent green."], - [0, 39, e_sRGB_TransparentBlue, - "This pixel should be e-sRGB transparent blue."], - [39, 39, e_sRGB_TransparentBlack, - "This pixel should be e-sRGB transparent black."], - [41, 41, transparentBlack, - "This pixel should be transparent black."]]; - else if (colorInfo === 'transparent-image') - tests = [[0, 0, e_sRGB_TransparentRedImage, - "This pixel should be e-sRGB transparent red."], - [39, 0, e_sRGB_TransparentGreenImage, - "This pixel should be e-sRGB transparent green."], - [0, 39, e_sRGB_TransparentBlueImage, - "This pixel should be e-sRGB transparent blue."], - [39, 39, e_sRGB_TransparentBlackImage, - "This pixel should be e-sRGB transparent black."], - [41, 41, transparentBlack, - "This pixel should be transparent black."]]; - testPixels(ctx, tests, sourceType, imageSetting); -} - -function checkCrop(imageBitmap, colorInfo, sourceType) -{ - var canvas = document.createElement('canvas'); - canvas.width = 50; - canvas.height = 50; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - var imageSetting = {colorSpace: 'srgb', storageFormat:'float32'}; - ctx.clearRect(0, 0, canvas.width, canvas.height); - ctx.drawImage(imageBitmap, 0, 0); - var tests; - if (colorInfo === 'fullColor') - tests = [[0, 0, e_sRGB_Red, "This pixel should be e-sRGB red."], - [19, 0, e_sRGB_Green, "This pixel should be e-sRGB green."], - [0, 19, e_sRGB_Blue, "This pixel should be e-sRGB blue."], - [19, 19, e_sRGB_Black, "This pixel should be e-sRGB black."], - [21, 21, transparentBlack, "This pixel should be transparent black."]]; - else if (colorInfo === 'opaque') - tests = [[0, 0, e_sRGB_OpaqueRed, - "This pixel should be e-sRGB like red."], - [19, 0, e_sRGB_OpaqueGreen, - "This pixel should be e-sRGB like green."], - [0, 19, e_sRGB_OpaqueBlue, - "This pixel should be e-sRGB like blue."], - [19, 19, e_sRGB_OpaqueBlack, - "This pixel should be e-sRGB like black."], - [21, 21, transparentBlack, "This pixel should be transparent black."]]; - else if (colorInfo === 'transparent') - tests = [[0, 0, e_sRGB_TransparentRed, - "This pixel should be e-sRGB transparent red."], - [19, 0, e_sRGB_TransparentGreen, - "This pixel should be e-sRGB transparent green."], - [0, 19, e_sRGB_TransparentBlue, - "This pixel should be e-sRGB transparent blue."], - [19, 19, e_sRGB_TransparentBlack, - "This pixel should be e-sRGB transparent black."], - [21, 21, transparentBlack, - "This pixel should be transparent black."]]; - else if (colorInfo === 'transparent-image') - tests = [[0, 0, e_sRGB_TransparentRedImage, - "This pixel should be e-sRGB transparent red."], - [19, 0, e_sRGB_TransparentGreenImage, - "This pixel should be e-sRGB transparent green."], - [0, 19, e_sRGB_TransparentBlueImage, - "This pixel should be e-sRGB transparent blue."], - [19, 19, e_sRGB_TransparentBlackImage, - "This pixel should be e-sRGB transparent black."], - [21, 21, transparentBlack, - "This pixel should be transparent black."]]; - testPixels(ctx, tests, sourceType, imageSetting); -} - - -function compareBitmaps(bitmap1, bitmap2) -{ - var canvas1 = document.createElement('canvas'); - var canvas2 = document.createElement('canvas'); - canvas1.width = 50; - canvas1.height = 50; - canvas2.width = 50; - canvas2.height = 50; - var ctx1 = canvas1.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - var ctx2 = canvas2.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - ctx1.clearRect(0, 0, canvas1.width, canvas1.height); - ctx2.clearRect(0, 0, canvas2.width, canvas2.height); - ctx1.drawImage(bitmap1, 0, 0); - ctx2.drawImage(bitmap2, 0, 0); - var data1 = ctx1.getImageData(0, 0, 50, 50, - {colorSpace: 'srgb', storageFormat:'float32'}).data; - assert_implements(data1, 'ImageData data not supported'); - var data2 = ctx2.getImageData(0, 0, 50, 50, - {colorSpace: 'srgb', storageFormat:'float32'}).data; - assert_implements(data2, 'ImageData data not supported'); - var dataMatched = true; - for (var i = 0; i < data1.length; i++) { - if (data1[i] != data2[i]) { - dataMatched = false; - break; - } - } - assert_false(dataMatched); -} - -function testImageBitmap(source, colorInfo, sourceType) -{ - return Promise.all([ - createImageBitmap(source, {resizeWidth: 40, resizeHeight: 40, resizeQuality: "high"}), - createImageBitmap(source, {resizeWidth: 40, resizeHeight: 40, resizeQuality: "medium"}), - createImageBitmap(source, {resizeWidth: 40, resizeHeight: 40, resizeQuality: "low"}), - createImageBitmap(source, {resizeWidth: 40, resizeHeight: 40, resizeQuality: "pixelated"}), - createImageBitmap(source, 5, 5, 10, 10, { - resizeWidth: 20, resizeHeight: 20, resizeQuality: "high"}), - createImageBitmap(source, 5, 5, 10, 10, { - resizeWidth: 20, resizeHeight: 20, resizeQuality: "medium"}), - createImageBitmap(source, 5, 5, 10, 10, { - resizeWidth: 20, resizeHeight: 20, resizeQuality: "low"}), - createImageBitmap(source, 5, 5, 10, 10, { - resizeWidth: 20, resizeHeight: 20, resizeQuality: "pixelated"}), - ]).then(([noCropHigh, noCropMedium, noCropLow, noCropPixelated, cropHigh, - cropMedium, cropLow, cropPixelated]) => { - checkNoCrop(noCropHigh, colorInfo, sourceType); - checkNoCrop(noCropMedium, colorInfo, sourceType); - checkNoCrop(noCropLow, colorInfo, sourceType); - checkNoCrop(noCropPixelated, colorInfo, sourceType); - checkCrop(cropHigh, colorInfo, sourceType); - checkCrop(cropMedium, colorInfo, sourceType); - checkCrop(cropLow, colorInfo, sourceType); - checkCrop(cropPixelated, colorInfo, sourceType); - // Brute-force comparison among all bitmaps is too expensive. - // In case of SVG, resize quality does not affect the images, so all - // of them are the same and the tests fail. Since, we ignore this test - // set for SVG. - if (sourceType != 'svg') { - compareBitmaps(noCropHigh, noCropMedium); - compareBitmaps(noCropLow, noCropPixelated); - compareBitmaps(cropHigh, cropMedium); - compareBitmaps(cropLow, cropPixelated); - } - }); -} - -function testImageBitmapTransparent(source) -{ - return testImageBitmap(source, 'transparent', 'general'); -} - -function testImageBitmapFromTransparentImage(source) -{ - return testImageBitmap(source, 'transparent-image', 'general'); -} - -function testImageBitmapVideoSource(source) -{ - return testImageBitmap(source, 'fullColor', 'video'); -} - -function testImageBitmapOpaque(source) -{ - return testImageBitmap(source, 'opaque', 'general'); -} - -function testImageBitmapFromSVG(source) -{ - return testImageBitmap(source, 'opaque', 'svg'); -} - -function initializeTestCanvas(canvasColorSpace, canvasPixelFormat) -{ - var testCanvas = document.createElement("canvas"); - testCanvas.width = 20; - testCanvas.height = 20; - var testCtx = testCanvas.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - testCtx.fillStyle = "rgba(155, 27, 27, 1)"; - testCtx.fillRect(0, 0, 10, 10); - testCtx.fillStyle = "rgba(27, 155, 27, 1)"; - testCtx.fillRect(10, 0, 10, 10); - testCtx.fillStyle = "rgba(27, 27, 155, 1)"; - testCtx.fillRect(0, 10, 10, 10); - testCtx.fillStyle = "rgba(27, 27, 27, 1)"; - testCtx.fillRect(10, 10, 10, 10); - return testCanvas; -} - -function initializeTestCanvasTransparent(canvasColorSpace, canvasPixelFormat) -{ - var testCanvas = document.createElement("canvas"); - testCanvas.width = 20; - testCanvas.height = 20; - var testCtx = testCanvas.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - testCtx.fillStyle = "rgba(155, 27, 27, 0.5)"; - testCtx.fillRect(0, 0, 10, 10); - testCtx.fillStyle = "rgba(27, 155, 27, 0.5)"; - testCtx.fillRect(10, 0, 10, 10); - testCtx.fillStyle = "rgba(27, 27, 155, 0.5)"; - testCtx.fillRect(0, 10, 10, 10); - testCtx.fillStyle = "rgba(27, 27, 27, 0.5)"; - testCtx.fillRect(10, 10, 10, 10); - return testCanvas; -} - -//////////////////////////////////////////////////////////////////////////////// - -// HTMLImageElement - Opaque sRGB -// File formats: AVIF, Bitmap, GIF, ICO, JPEG, PNG, WEBP -['avif', 'bmp', 'gif', 'ico', 'jpg', 'png', 'webp'].forEach(ext => { - promise_test(async () => { - const image = new Image(); - image.src = 'resources/pattern-srgb.' + ext; - await image.decode(); - await testImageBitmapOpaque(image); - }, 'createImageBitmap in e-sRGB from an opaque sRGB HTMLImageElement (' + ext + - ') with resize.'); -}); - -// HTMLImageElement - Transparent sRGB -// File formats: AVIF, Bitmap, ICO, PNG, WEBP -['avif', 'bmp', 'ico', 'png', 'webp'].forEach(ext => { - promise_test(async () => { - const image = new Image(); - image.src = 'resources/pattern-srgb-transparent.' + ext; - await image.decode(); - await testImageBitmapFromTransparentImage(image); - }, 'createImageBitmap in e-sRGB from a transparent sRGB HTMLImageElement (' + ext + - ') with resize.'); -}); - -//////////////////////////////////////////////////////////////////////////////// - -// SVG Image - sRGB -promise_test(async () => { - const image = new Image(); - image.src = 'resources/pattern-srgb.svg' - await image.decode(); - await testImageBitmapFromSVG(image); -}, 'createImageBitmap in e-sRGB from a sRGB SVG image with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -// HTMLVideoElement - sRGB -promise_test(async () => { - var video = document.createElement("video"); - assert_implements_optional(video.canPlayType("video/ogg"), "video/ogg not supported"); - let waitForFrame; - if ("requestVideoFrameCallback" in HTMLVideoElement.prototype) { - waitForFrame = new Promise((resolve) => { - video.requestVideoFrameCallback(resolve); - }); - } else { - waitForFrame = new Promise((resolve, reject) => { - video.onloadeddata = resolve; - video.onerror = reject; - }); - } - video.preload = "auto"; - video.src = 'resources/pattern-srgb-fullcolor.ogv' - await waitForFrame; - await testImageBitmapVideoSource(video); -}, 'createImageBitmap in e-sRGB from a sRGB HTMLVideoElement with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -// HTMLCanvasElement - Opaque sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvas('srgb', 'uint8'); - await testImageBitmapOpaque(testCanvas); -}, 'createImageBitmap in e-sRGB from an opaque sRGB HTMLCanvasElement with resize.'); - -// HTMLCanvasElement - Opaque e-sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvas('srgb', 'float16'); - await testImageBitmapOpaque(testCanvas); -}, 'createImageBitmap in e-sRGB from an opaque e-sRGB HTMLCanvasElement with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -// HTMLCanvasElement - Transparent sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvasTransparent('srgb', 'uint8'); - await testImageBitmapTransparent(testCanvas); -}, 'createImageBitmap in e-sRGB from a transparent sRGB HTMLCanvasElement with resize.'); - -// HTMLCanvasElement - Transparent e-sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvasTransparent('srgb', 'float16'); - await testImageBitmapTransparent(testCanvas); -}, 'createImageBitmap in e-sRGB from a transparent e-sRGB HTMLCanvasElement with resize.'); - -////////////////////////////////////////////////////////////////////////////// - -// Blob from file - Opaque sRGB -// File formats: AVIF, Bitmap, GIF, ICO, JPEG, PNG, WEBP -['avif', 'bmp', 'gif', 'ico', 'jpg', 'png', 'webp'].forEach(ext => { - promise_test(async () => { - const response = await fetch('resources/pattern-srgb.' + ext); - assert_true(response.ok); - const blob = await response.blob(); - await testImageBitmapOpaque(blob); - }, 'createImageBitmap in e-sRGB from an opaque sRGB Blob (' + ext + ') with resize.'); -}); - -// Blob form file - Transparent sRGB -// File formats: AVIF, Bitmap, ICO, PNG, WEBP -['avif', 'bmp', 'ico', 'png', 'webp'].forEach(ext => { - promise_test(async () => { - const response = await fetch('resources/pattern-srgb-transparent.' + ext); - assert_true(response.ok); - const blob = await response.blob(); - await testImageBitmapFromTransparentImage(blob); - }, 'createImageBitmap in e-sRGB from a transparent sRGB Blob (' + ext + ') with resize.'); -}); - -// Color managed blob from canvas -function testCreateImageBitmapFromColorManagedBlob(pixelFormat, isTransparent) { - promise_test(async () => { - let canvasPixelFormat = 'uint8'; - if (pixelFormat == 'uint16') - canvasPixelFormat = 'float16'; - let testCanvas; - if (isTransparent) - testCanvas = initializeTestCanvasTransparent('srgb', canvasPixelFormat); - else - testCanvas = initializeTestCanvas('srgb', canvasPixelFormat); - const blob = await testCanvas.convertToBlob({ - quality: 1, - type: 'image/png', - pixelFormat, - }); - if (isTransparent) - await testImageBitmapTransparent(blob); - else - await testImageBitmapOpaque(blob); - }, 'createImageBitmap in e-sRGB from color managed Blob' + - ' with resize. blobPixelFormat: ' + pixelFormat + - ', transparency: ' + isTransparent); -} - -function runAllCreateImageBitmapFromColorManagedBlobTests() { - var blobPixelFormats = ['uint8', 'uint16']; - var transparencies = [false, true]; - for (var j = 0; j < blobPixelFormats.length; j++) - for (var k = 0; k < transparencies.length; k++) { - testCreateImageBitmapFromColorManagedBlob( - blobPixelFormats[j], transparencies[k]); - } -} - -runAllCreateImageBitmapFromColorManagedBlobTests(); - -//////////////////////////////////////////////////////////////////////////////// - -// ImageData - Opaque sRGB -promise_test(async () => { - var canvas = initializeTestCanvas('srgb', 'uint8'); - var ctx = canvas.getContext('2d'); - var data = ctx.getImageData(0, 0, 20, 20, - {colorSpace: 'srgb', storageFormat:'uint8'}); - await testImageBitmapOpaque(data); -}, 'createImageBitmap in e-sRGB from an opaque sRGB ImageData with resize.'); - -// ImageData - Opaque e-sRGB -promise_test(async () => { - var canvas = initializeTestCanvas('srgb', 'float16'); - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - var data = ctx.getImageData(0, 0, 20, 20, - {colorSpace: 'srgb', storageFormat:'float32'}); - await testImageBitmapOpaque(data); -}, 'createImageBitmap in e-sRGB from an opaque e-sRGB ImageData with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -// ImageData - Transparent sRGB -promise_test(async () => { - var canvas = initializeTestCanvasTransparent('srgb', 'uint8'); - var ctx = canvas.getContext('2d'); - var data = ctx.getImageData(0, 0, 20, 20, - {colorSpace: 'srgb', storageFormat:'uint8'}); - await testImageBitmapTransparent(data); -}, 'createImageBitmap in e-sRGB from a transparent sRGB ImageData with resize.'); - -// ImageData - Transparent e-sRGB -promise_test(async () => { - var canvas = initializeTestCanvasTransparent('srgb', 'float16'); - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - var data = ctx.getImageData(0, 0, 20, 20, - {colorSpace: 'srgb', storageFormat:'float32'}); - await testImageBitmapTransparent(data); -}, 'createImageBitmap in e-sRGB from a transparent e-sRGB ImageData with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -// ImageBitmap - Opaque sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvas('srgb', 'uint8'); - await createImageBitmap(testCanvas).then(testImageBitmapOpaque); -}, 'createImageBitmap in e-sRGB from an opaque sRGB ImageBitmap with resize.'); - -// ImageBitmap - Opaque e-sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvas('srgb', 'float16'); - await createImageBitmap(testCanvas).then(testImageBitmapOpaque); -}, 'createImageBitmap in e-sRGB from an opaque e-sRGB ImageBitmap with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -// ImageBitmap - Transparent sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvasTransparent('srgb', 'uint8'); - await createImageBitmap(testCanvas).then(testImageBitmapTransparent); -}, 'createImageBitmap in e-sRGB from a transparent sRGB ImageBitmap with resize.'); - -// ImageBitmap - Transparent e-sRGB -promise_test(async () => { - var testCanvas = initializeTestCanvasTransparent('srgb', 'float16'); - await createImageBitmap(testCanvas).then(testImageBitmapTransparent); -}, 'createImageBitmap in e-sRGB from a transparent e-sRGB ImageBitmap with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -function initializeOffscreenCanvas(canvasColorSpace, canvasPixelFormat) -{ - var canvas = document.createElement("canvas"); - canvas.width = 20; - canvas.height = 20; - var offscreen = canvas.transferControlToOffscreen(); - var ctx = offscreen.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - ctx.fillStyle = "rgba(155, 27, 27, 1)"; - ctx.fillRect(0, 0, 10, 10); - ctx.fillStyle = "rgba(27, 155, 27, 1)"; - ctx.fillRect(10, 0, 10, 10); - ctx.fillStyle = "rgba(27, 27, 155, 1)"; - ctx.fillRect(0, 10, 10, 10); - ctx.fillStyle = "rgba(27, 27, 27, 1)"; - ctx.fillRect(10, 10, 10, 10); - return offscreen; -} - -//OffscreenCanvas - Opaque sRGB -promise_test(async () => { - var offscreen = initializeOffscreenCanvas('srgb', 'uint8'); - await testImageBitmapOpaque(offscreen); -}, 'createImageBitmap in e-sRGB from an opaque sRGB OffscreenCanvas with resize.'); - -//OffscreenCanvas - Opaque e-sRGB -promise_test(async () => { - var offscreen = initializeOffscreenCanvas('srgb', 'float16'); - await testImageBitmapOpaque(offscreen); -}, 'createImageBitmap in e-sRGB from an opaque e-sRGB OffscreenCanvas with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -function initializeOffscreenCanvasTransparent(canvasColorSpace, canvasPixelFormat) -{ - var canvas = document.createElement("canvas"); - canvas.width = 20; - canvas.height = 20; - var offscreen = canvas.transferControlToOffscreen(); - var ctx = offscreen.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - ctx.fillStyle = "rgba(155, 27, 27, 0.5)"; - ctx.fillRect(0, 0, 10, 10); - ctx.fillStyle = "rgba(27, 155, 27, 0.5)"; - ctx.fillRect(10, 0, 10, 10); - ctx.fillStyle = "rgba(27, 27, 155, 0.5)"; - ctx.fillRect(0, 10, 10, 10); - ctx.fillStyle = "rgba(27, 27, 27, 0.5)"; - ctx.fillRect(10, 10, 10, 10); - return offscreen; -} - -//OffscreenCanvas - Transparent sRGB -promise_test(async () => { - var offscreen = initializeOffscreenCanvasTransparent('srgb', 'uint8'); - await testImageBitmapTransparent(offscreen); -}, 'createImageBitmap in e-sRGB from a transparent sRGB OffscreenCanvas with resize.'); - -//OffscreenCanvas - Transparent e-sRGB -promise_test(async () => { - var offscreen = initializeOffscreenCanvasTransparent('srgb', 'float16'); - await testImageBitmapTransparent(offscreen); -}, 'createImageBitmap in e-sRGB from a transparent e-sRGB OffscreenCanvas with resize.'); - -//////////////////////////////////////////////////////////////////////////////// - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createPutGetImageData-colorManaged.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createPutGetImageData-colorManaged.html deleted file mode 100644 index 2018acbbe7..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-createPutGetImageData-colorManaged.html +++ /dev/null
@@ -1,133 +0,0 @@ -<!DOCTYPE html> -<body> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -var xWidth = xHeight = 10; - -function checkImageData(expectedColorSettings, imageData) { - var imageDataColorSettings = imageData.getSettings(); - assert_equals(expectedColorSettings.colorSpace, imageDataColorSettings.colorSpace); - assert_equals(expectedColorSettings.storageFormat, imageDataColorSettings.storageFormat); - assert_equals(imageData.data.length, 4 * xWidth * xHeight); -} - -// Test createImageData when the canvas is color managed -var helperImageData = new ImageData(xWidth, xHeight); -function runTestCreateImageData(canvasColorSettings, imageSetting) { - var aCanvas = document.createElement("canvas"); - aCanvas.width = xWidth; - aCanvas.height = xHeight; - var ctx = aCanvas.getContext('2d', canvasColorSettings); - var imageData = ctx.createImageData(xWidth, xHeight, imageSetting); - checkImageData(imageSetting, imageData); - - imageData = ctx.createImageData(helperImageData); - checkImageData(imageData.getSettings(), imageData); -} - -var testScenariosCreateImageData = [ - ["Test color managed cretateImageData: {srgb, uint8} -> {srgb, uint8}", - {colorSpace: "srgb", pixelFormat: "uint8"}, - {colorSpace: "srgb", storageFormat: "uint8"}], - ["Test color managed cretateImageData: {srgb, float16} -> {srgb, float32}", - {colorSpace: "srgb", pixelFormat: "float16"}, - {colorSpace: "srgb", storageFormat: "float32"}], -]; - -function runCreateImageDataTests() { - for (var i = 0; i < testScenariosCreateImageData.length; i++){ - var t = test(function() { - runTestCreateImageData(testScenariosCreateImageData[i][1], - testScenariosCreateImageData[i][2]); - }, testScenariosCreateImageData[i][0]); - } -} -runCreateImageDataTests(); - -// Test getImageData when the canvas is color managed -function runTestGetImageData(canvasColorSettings, imageSetting) { - var aCanvas = document.createElement("canvas"); - aCanvas.width = xWidth; - aCanvas.height = xHeight; - var ctx = aCanvas.getContext('2d', canvasColorSettings); - var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting); - checkImageData(imageSetting, imageData); -} - -var testScenariosGetImageData = [ - ["Test color managed getImageData: {srgb, uint8} -> {srgb, uint8}", - {colorSpace: "srgb", pixelFormat: "uint8"}, - {colorSpace: "srgb", storageFormat: "uint8"}], - ["Test color managed getImageData: {srgb, float16} -> {srgb, float32}", - {colorSpace: "srgb", pixelFormat: "float16"}, - {colorSpace: "srgb", storageFormat: "float32"}], -]; - -function runGetImageDataTests() { - for (var i = 0; i < testScenariosGetImageData.length; i++){ - var t = test(function() { - runTestGetImageData(testScenariosGetImageData[i][1], - testScenariosGetImageData[i][2]); - }, testScenariosGetImageData[i][0]); - } -} -runGetImageDataTests(); - -// Test putImageData when the canvas is color managed. - -var testScenariosPutImageData = []; -function prepareTestScenariosPutImageData() { - var colorSpaces = ["srgb"]; - var imageDataStorageFormats = ["uint8", "uint16", "float32"]; - var canvasPixelFormats = ["uint8", "float16"]; - // var canvasStorageFormats = ["uint8", "float32"]; - - for (i = 0; i < colorSpaces.length; i++) - for (j = 0; j < imageDataStorageFormats.length; j++) - for (k = 0; k < colorSpaces.length; k++) - for (l = 0; l < canvasPixelFormats.length; l++) { - testTitle = "Test color managed putImageData: ".concat( - "{", colorSpaces[i], ", ", imageDataStorageFormats[j], "} -> {", colorSpaces[k], - ", ", canvasPixelFormats[l], "}"); - imageDataColorSettings = - {colorSpace: colorSpaces[i], storageFormat: imageDataStorageFormats[j]}; - canvasColorSettings = - {colorSpace: colorSpaces[k], pixelFormat: canvasPixelFormats[l]}; - testScenariosPutImageData.push([testTitle, imageDataColorSettings, - canvasColorSettings]); - } -} - -function createAndPutImageData(imageDataColorSettings, canvasColorSettings) { - // create color managed canvas - var aCanvas = document.createElement("canvas"); - aCanvas.width = xWidth; - aCanvas.height = xHeight; - var ctx = aCanvas.getContext('2d', canvasColorSettings); - // create color managed ImageData - var imageData = ctx.createImageData(xWidth, xHeight, imageDataColorSettings); - // put image data into canvas. test succeeds if this does not crash. - ctx.putImageData(imageData, 0, 0); -} - -function runTestPutImageData(imageDataColorSettings, canvasColorSettings) { - createAndPutImageData(imageDataColorSettings, canvasColorSettings); - createAndPutImageData(imageDataColorSettings, canvasColorSettings); - createAndPutImageData(imageDataColorSettings, canvasColorSettings); -} - -prepareTestScenariosPutImageData(); - -function runPutImageDataTests() { - for (var i = 0; i < testScenariosPutImageData.length; i++){ - var t = test(function() { - runTestPutImageData(testScenariosPutImageData[i][1]); - }, testScenariosPutImageData[i][0]); - } -} -runPutImageDataTests(); - -</script> -</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-draw-high-bit-depth-images.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-draw-high-bit-depth-images.html deleted file mode 100644 index d830d6ea..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-draw-high-bit-depth-images.html +++ /dev/null
@@ -1,119 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -var testImagesPath = "resources/png-16bit/"; - -// Source of pixel comparison error in these tests: -// - color conversion from different color profiles (sRGB, Adobe RGB, Display P3, -// ProPhoto and Rec 2020) to target canvas color space (sRGB, e-sRGB). -// - comparing the result of drawing 8 bit and 16 bit PNGs with each other. -var defaultColorConversionTolerance = 8; -var wideGamutColorConversionTolerance = 0.05; - -function runTest(testScenario) { - var _8bitImageSrc = testImagesPath + testScenario._8bitImagePath; - var _16bitImageSrc = testImagesPath + testScenario._16bitImagePath; - var tolerance = defaultColorConversionTolerance; - if (testScenario.canvasColorParams.pixelFormat == 'float16') - tolerance = wideGamutColorConversionTolerance; - - var _8bitImage = new Image(); - var _16bitImage = new Image(); - var t_image = async_test(testScenarioToString(testScenario)); - _8bitImage.onload = t_image.step_func(function() { - _16bitImage.onload = t_image.step_func(function() { - var refCanvas = document.createElement("canvas"); - refCanvas.width = refCanvas.height = 2; - var refCtx = refCanvas.getContext( - '2d', testScenario.canvasColorParams); - refCtx.drawImage(_8bitImage, 0, 0); - var refPixels = refCtx.getImageData(0, 0, 2, 2, - testScenario.imageSetting).data; - - var testCanvas = document.createElement("canvas"); - testCanvas.width = testCanvas.height = 2; - var testCtx = testCanvas.getContext( - '2d', testScenario.canvasColorParams); - testCtx.drawImage(_16bitImage, 0, 0); - var testPixels = testCtx.getImageData(0, 0, 2, 2, - testScenario.imageSetting).data; - - assert_array_approx_equals(refPixels, testPixels, tolerance); - - t_image.done(); - }); - _16bitImage.src = _16bitImageSrc; - }); - _8bitImage.src = _8bitImageSrc; -} - -function runAllTests() { - var pngColorSpaces = [ - "_sRGB", - "_AdobeRGB", - "_DisplayP3", - "_ProPhoto", - "_Rec2020", - ]; - var pngTransparencyStatus = [ - "_opaque", - "_transparent", - ]; - var pngInterlaceStatus = [ - "", // non-interlaced - "_interlaced", - ]; - - - var _8bitPngPrefix = "2x2_8bit"; - var _16bitPngPrefix = "2x2_16bit"; - - var canvasColorParams = [ - {colorSpace: 'srgb', pixelFormat: 'uint8'}, - {colorSpace: 'srgb', pixelFormat: 'float16'}, - ]; - - var imageSettings = [ - {colorSpace: 'srgb', storageFormat: 'uint8'}, - {colorSpace: 'srgb', storageFormat: 'float32'}, - ]; - - var testScenarioSet = []; - var id = 1; - for (var i = 0; i < canvasColorParams.length; i++) { - for (var j = 0; j < pngColorSpaces.length; j++) { - for (var k = 0; k < pngTransparencyStatus.length; k++) { - for (var m = 0; m < pngInterlaceStatus.length; m++) { - var testScenario = {}; - testScenario.canvasColorParams = canvasColorParams[i]; - testScenario.imageSetting = imageSettings[i]; - testScenario._8bitImagePath = _8bitPngPrefix + - pngColorSpaces[j] + pngTransparencyStatus[k] + ".png"; - testScenario._16bitImagePath = _16bitPngPrefix + - pngInterlaceStatus[m] + pngColorSpaces[j] + - pngTransparencyStatus[k] + ".png"; - testScenarioSet.push(testScenario); - } - } - } - } - - for (var i = 0; i < testScenarioSet.length; i++) - runTest(testScenarioSet[i]); -} - -function testScenarioToString(testScenario) { - var str = "Canvas color params: " + - testScenario.canvasColorParams.colorSpace + ", " + - testScenario.canvasColorParams.pixelFormat + ". Testing " + - testScenario._8bitImagePath + " vs " + testScenario._16bitImagePath; - return str; -} - -test(function() { - runAllTests(); -}, "Overall test"); - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-e_srgb.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-e_srgb.html deleted file mode 100644 index 793cd920..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-e_srgb.html +++ /dev/null
@@ -1,53 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -// sRGB(226,31,31,128) -var e_sRGB_TransparentRed = [0.886230, 0.121521, 0.121521, 0.501953]; -// sRGB(226,31,31,128) -var e_sRGB_TransparentGreen = [0.121521, 0.886230, 0.121521, 0.501953]; -// sRGB(226,31,31,128) -var e_sRGB_TransparentBlue = [0.121521, 0.121521, 0.886230, 0.501953]; -// sRGB(226,31,31,128) -var e_sRGB_TransparentBlack = [0.121521, 0.121521, 0.121521, 0.501953]; - -function testPixels(ctx, tests, imageSetting) -{ - var actual, expected, tolerance = 0.01; - for (var i = 0; i < tests.length; i++) { - actual = ctx.getImageData(tests[i].x, tests[i].y, 1, 1, imageSetting).data; - expected = tests[i].color; - assert_equals(actual.length, expected.length); - for (var j = 0; j < actual.length; j++) - assert_approx_equals(actual[j], expected[j], tolerance); - } -} - -function drawSRGBImageOnExtendedSRGBCanvas(source) -{ - var canvas = document.createElement('canvas'); - canvas.width = 20; - canvas.height = 20; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - ctx.drawImage(source, 0, 0); - var tests = [{x: 5, y: 5, color: e_sRGB_TransparentRed}, - {x: 15, y: 5, color: e_sRGB_TransparentGreen}, - {x: 5, y: 15, color: e_sRGB_TransparentBlue}, - {x: 15, y: 15, color: e_sRGB_TransparentBlack}]; - testPixels(ctx, tests, {colorSpace: 'srgb', storageFormat:'float32'}); -} - -promise_test(function() { - return new Promise((resolve, reject) => { - var image = new Image(); - image.onload = function() { - resolve(image); - } - image.src = 'resources/pattern-semitransparent-srgb.png' - }).then(drawSRGBImageOnExtendedSRGBCanvas); -}, 'Draw SRGB image on an e-sRGB canvas and read back the e-sRGB pixels.'); - -</script> -
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-offscreenCanvas.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-offscreenCanvas.html deleted file mode 100644 index aebcea3c..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-drawImage-offscreenCanvas.html +++ /dev/null
@@ -1,183 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -function initializeBlankCanvas(canvasColorSpace, canvasPixelFormat) -{ - var testCanvas = document.createElement("canvas"); - testCanvas.width = 4; - testCanvas.height = 4; - var testCtx = testCanvas.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - return testCtx; -} - -function initializeCanvas(canvasColorSpace, canvasPixelFormat) -{ - var testCanvas = document.createElement("canvas"); - testCanvas.width = 4; - testCanvas.height = 4; - var testCtx = testCanvas.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - testCtx.fillStyle = "rgba(155, 27, 27, 1)"; - testCtx.fillRect(0, 0, 2, 2); - testCtx.fillStyle = "rgba(27, 155, 27, 1)"; - testCtx.fillRect(2, 0, 2, 2); - testCtx.fillStyle = "rgba(27, 27, 155, 1)"; - testCtx.fillRect(0, 2, 2, 2); - testCtx.fillStyle = "rgba(27, 27, 27, 1)"; - testCtx.fillRect(2, 2, 2, 2); - return testCtx; -} - -function initializeCanvasTransparent(canvasColorSpace, canvasPixelFormat) -{ - var testCanvas = document.createElement("canvas"); - testCanvas.width = 4; - testCanvas.height = 4; - var testCtx = testCanvas.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - testCtx.fillStyle = "rgba(155, 27, 27, 0.5)"; - testCtx.fillRect(0, 0, 2, 2); - testCtx.fillStyle = "rgba(27, 155, 27, 0.5)"; - testCtx.fillRect(2, 0, 2, 2); - testCtx.fillStyle = "rgba(27, 27, 155, 0.5)"; - testCtx.fillRect(0, 2, 2, 2); - testCtx.fillStyle = "rgba(27, 27, 27, 0.5)"; - testCtx.fillRect(2, 2, 2, 2); - return testCtx; -} - - -function initializeOffscreenCanvas(canvasColorSpace, canvasPixelFormat) -{ - var canvas = document.createElement("canvas"); - canvas.width = 4; - canvas.height = 4; - var offscreen = canvas.transferControlToOffscreen(); - var ctx = offscreen.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - ctx.fillStyle = "rgba(155, 27, 27, 1)"; - ctx.fillRect(0, 0, 2, 2); - ctx.fillStyle = "rgba(27, 155, 27, 1)"; - ctx.fillRect(2, 0, 2, 2); - ctx.fillStyle = "rgba(27, 27, 155, 1)"; - ctx.fillRect(0, 2, 2, 2); - ctx.fillStyle = "rgba(27, 27, 27, 1)"; - ctx.fillRect(2, 2, 2, 2); - return offscreen; -} - -function initializeOffscreenCanvasTransparent(canvasColorSpace, canvasPixelFormat) -{ - var canvas = document.createElement("canvas"); - canvas.width = 4; - canvas.height = 4; - var offscreen = canvas.transferControlToOffscreen(); - var ctx = offscreen.getContext('2d', - {colorSpace: canvasColorSpace, pixelFormat:canvasPixelFormat}); - ctx.fillStyle = "rgba(155, 27, 27, 0.5)"; - ctx.fillRect(0, 0, 2, 2); - ctx.fillStyle = "rgba(27, 155, 27, 0.5)"; - ctx.fillRect(2, 0, 2, 2); - ctx.fillStyle = "rgba(27, 27, 155, 0.5)"; - ctx.fillRect(0, 2, 2, 2); - ctx.fillStyle = "rgba(27, 27, 27, 0.5)"; - ctx.fillRect(2, 2, 2, 2); - return offscreen; -} - -function testPixels(testCtx, refCtx, pixelFormat, image_setting, isTrnasparent) -{ - var actual = testCtx.getImageData(0, 0, 4, 4, image_setting).data; - var expected = refCtx.getImageData(0, 0, 4, 4, image_setting).data; - - var tolerance = 4; - if (pixelFormat === 'float16') - tolerance = 0.02; - if (isTrnasparent) - tolerance = tolerance * 2; - assert_array_approx_equals(actual, expected, tolerance); -} - - -function runDrawOffscreenCanvasTestOpaque(testScenario) { - var canvas_ctx_opaque = initializeCanvas( - testScenario.canvasColorSpace, testScenario.canvasPixelFormat); - - var canvas_ctx_blank = initializeBlankCanvas( - testScenario.canvasColorSpace, testScenario.canvasPixelFormat); - var offscreen_canvas_opaque = initializeOffscreenCanvas( - testScenario.imageColorSpace, testScenario.imagePixelFormat); - canvas_ctx_blank.drawImage(offscreen_canvas_opaque, 0, 0); - var image_setting = {colorSpace: testScenario.canvasColorSpace, - storageFormat: testScenario.storageFormat} - testPixels(canvas_ctx_blank, canvas_ctx_opaque, - testScenario.canvasPixelFormat, image_setting, false); -} - -function runDrawOffscreenCanvasTestTransparent(testScenario) { - var canvas_ctx_transparent = initializeCanvasTransparent( - testScenario.canvasColorSpace, testScenario.canvasPixelFormat); - - var canvas_ctx_blank = initializeBlankCanvas( - testScenario.canvasColorSpace, testScenario.canvasPixelFormat); - var offscreen_canvas_transparent = initializeOffscreenCanvasTransparent( - testScenario.imageColorSpace, testScenario.imagePixelFormat); - canvas_ctx_blank.drawImage(offscreen_canvas_transparent, 0, 0); - var image_setting = {colorSpace: testScenario.canvasColorSpace, - storageFormat: testScenario.storageFormat} - testPixels(canvas_ctx_blank, canvas_ctx_transparent, - testScenario.canvasPixelFormat, image_setting, true); -} - -function runAllTests() { - var canvasColorSpaces = ['srgb']; - var canvasPixelFormats = ['uint8', 'float16']; - var storageFormats = ['uint8', 'float32']; - - var testScenarioSet = []; - for (var i = 0; i < canvasColorSpaces.length; i++) { - for (var j = 0; j < canvasPixelFormats.length; j++) { - var canvas_color_space = canvasColorSpaces[i]; - var canvas_pixel_format = canvasPixelFormats[j]; - var image_storage_format = storageFormats[j]; - for (var k = 0; k < canvasColorSpaces.length; k++) { - for (var m = 0; m < canvasPixelFormats.length; m++) { - var image_host_color_space = canvasColorSpaces[k]; - var image_host_pixel_format = canvasPixelFormats[m]; - - var testScenario = {}; - testScenario.canvasColorSpace = canvas_color_space; - testScenario.canvasPixelFormat = canvas_pixel_format; - testScenario.imageColorSpace = image_host_color_space; - testScenario.imagePixelFormat = image_host_pixel_format; - testScenario.storageFormat = image_storage_format; - testScenarioSet.push(testScenario); - } - } - } - } - - for (var i = 0; i < testScenarioSet.length; i++) { - test(function(t) { - runDrawOffscreenCanvasTestOpaque(testScenarioSet[i]); - runDrawOffscreenCanvasTestTransparent(testScenarioSet[i]); - }, testScenarioToString(testScenarioSet[i])); - } -} - -function testScenarioToString(testScenario) { - var str = "Test drawing color managed OffscreenCanvas: " + - "Canvas color params: " + - testScenario.canvasColorSpace + ", " + - testScenario.canvasPixelFormat + - "; OffscreenCanvas color params: " + - testScenario.imageColorSpace + ", " + - testScenario.imagePixelFormat; - return str; -} - -runAllTests(); -</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-getImageData-e_srgb.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-getImageData-e_srgb.html deleted file mode 100644 index 03e0d29..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/canvas-getImageData-e_srgb.html +++ /dev/null
@@ -1,94 +0,0 @@ -<!DOCTYPE html> -<body> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> -test(drawSRGBThenGetImageData_e_sRGB, 'tests drawing SRGB color on e-sRGB \ -canvas and getting e-sRGB image data.'); -test(putImageData_e_sRGBThenGetImageData_e_sRGB_InRange, 'tests putting and \ -getting in-range e-sRGB image data on e-sRGB canvas.'); -test(putImageData_e_sRGBThenGetImageData_e_sRGB_OutOfRange, 'tests putting and \ -getting out-of-range e-sRGB image data on e-sRGB canvas.'); -test(putImageDataSRGBThenGetImageData_e_sRGB, 'tests putting SRGB image data \ -on e-sRGB canvas and getting e-sRGB image data.'); - -function assert_array_approx_equals(actual, expected, epsilon) -{ - assert_equals(actual.length, expected.length); - for (var i=0; i < actual.length; i++) - assert_approx_equals(actual[i], expected[i], epsilon); -} - -function drawSRGBThenGetImageData_e_sRGB() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - ctx.fillStyle = 'rgba(51, 102, 153, 0.8)'; - ctx.fillRect(0, 0, 10, 10); - var pixel = ctx.getImageData(5, 5, 1, 1, {colorSpace: 'srgb', storageFormat:'float32'}).data; - // Check against the same color in e-sRGB. 0.01 protects the test against - // color conversion deviations. - assert_array_approx_equals(pixel, [0.2, 0.4, 0.6, 0.8], 0.01); -} - -function putImageData_e_sRGBThenGetImageData_e_sRGB_InRange() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}) - var imageData = ctx.createImageData(1, 1, - {colorSpace: 'srgb', storageFormat:'float32'}); - imageData.data[0] = 0.2; - imageData.data[1] = 0.4; - imageData.data[2] = 0.6; - imageData.data[3] = 0.8; - ctx.putImageData(imageData, 5, 5); - var pixel = ctx.getImageData(5, 5, 1, 1, {colorSpace: 'srgb', storageFormat:'float32'}).data; - // Check against the same color in e-sRGB. 0.001 protects the test against - // rounding errors. - assert_array_approx_equals(pixel, [0.2, 0.4, 0.6, 0.8], 0.01); -} - -function putImageData_e_sRGBThenGetImageData_e_sRGB_OutOfRange() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}) - var imageData = ctx.createImageData(1, 1, - {colorSpace: 'srgb', storageFormat:'float32'}); - imageData.data[0] = 1.3; - imageData.data[1] = -1.13; - imageData.data[2] = 0.7; - imageData.data[3] = 1.8; - ctx.putImageData(imageData, 5, 5); - var pixel = ctx.getImageData(5, 5, 1, 1, {colorSpace: 'srgb', storageFormat:'float32'}).data; - // Check against the same color in e-sRGB. 0.001 protects the test against - // rounding errors. - assert_array_approx_equals(pixel, [1.3, -1.13, 0.7, 1.8], 0.01); -} - -function putImageDataSRGBThenGetImageData_e_sRGB() { - var canvas = document.createElement('canvas'); - canvas.width = 10; - canvas.height = 10; - var ctx = canvas.getContext('2d', - {colorSpace: 'srgb', pixelFormat:'float16'}); - var dataSRGB = new Uint8ClampedArray(4); - var imageData = ctx.createImageData(1, 1, - {colorSpace: 'srgb', storageFormat:'uint8'}); - imageData.data[0] = 51; - imageData.data[1] = 102; - imageData.data[2] = 153; - imageData.data[3] = 204; - ctx.putImageData(imageData, 5, 5); - var pixel = ctx.getImageData(5, 5, 1, 1, {colorSpace: 'srgb', storageFormat:'float32'}).data; - // Check against the same color in e-sRGB. 0.01 protects the test against - // color conversion deviations. - assert_array_approx_equals(pixel, [0.2, 0.4, 0.6, 0.8], 0.01); -} -</script> -</body>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/imageData-colorManagedBehavior.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/imageData-colorManagedBehavior.html deleted file mode 100644 index 49078bab..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/imageData-colorManagedBehavior.html +++ /dev/null
@@ -1,348 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -var srgbPixels = - [[155,27,27,128, "srgbRed"], [27,155,27,128, "srgbGreen"], - [27,27,155,128, "srgbBlue"], [27,27,27,128, "srgbBlack"]]; - -var e_srgbPixels = - [[0.607422, 0.121521, 0.121521, 0.501953, "e_sRgbRed"], - [0.121521, 0.607422, 0.121521, 0.501953, "e_sRgbGreen"], - [0.121521, 0.121521, 0.607422, 0.501953, "e_sRgbBlue"], - [0.121521, 0.121521, 0.121521, 0.501953, "e_sRgbBlack"]]; - -var xWidth = xHeight = 2; -var colorCorrectionToleranceSRGB = 1; -// The error level in SRGB->WCG_U8->SRGB is higher than normal color correction -// operations as the pixels are clipped in WCG when U8 storage is used instead -// of F16 storage. -var colorCorrectionToleranceWCG_U8toSRGB_U8 = 6; -var colorCorrectionToleranceWCG = 0.02; - -function testBlankPixels(actualData, width, height) -{ - var message = "This pixel should be transparent black"; - var blankData = new Array(4 * width * height).fill(0); - assert_array_equals(actualData, blankData, message); -} - -function testPixels(actualData, expectedPixels, tolerance) -{ - assert_equals(actualData.length, 4 * xWidth * xHeight); - for (var i = 0; i < xWidth * xHeight; i++) { - var message = "This pixel should be " + expectedPixels[i][4]; - for (var j = 0; j < 4; j++) - assert_approx_equals(actualData[i*4+j], expectedPixels[i][j], tolerance, - message); - } -} - -function checkImageDataSettings(expectColorSetting, imageData) { - var imageDataSettings = imageData.getSettings(); - assert_equals(expectColorSetting.colorSpace, - imageDataSettings.colorSpace); - assert_equals(expectColorSetting.storageFormat, - imageDataSettings.storageFormat); -} - -function checkImageDataColorValues(canvasColorSettings, imageData, isBlank = '', - width = xWidth, height = xHeight, isWCG_U8toSRGB_U8 = '') { - var data = imageData.data; - if (isBlank === 'isBlank') { - testBlankPixels(data, width, height); - } else { - var expectedPixels = srgbPixels; - var tolerance = colorCorrectionToleranceSRGB; - if (isWCG_U8toSRGB_U8 === 'isWCG_U8toSRGB_U8') - tolerance = colorCorrectionToleranceWCG_U8toSRGB_U8; - if (canvasColorSettings.pixelFormat != "uint8") { - expectedPixels = e_srgbPixels; - tolerance = colorCorrectionToleranceWCG; - } - testPixels(data, expectedPixels, tolerance); - } -} - -function initializeColorManagedCanvas(canvasColorSettings) -{ - var canvas = document.createElement('canvas'); - canvas.width = xWidth; - canvas.height = xHeight; - var ctx = canvas.getContext('2d', - {colorSpace: canvasColorSettings.colorSpace, - pixelFormat: canvasColorSettings.pixelFormat}); - ctx.fillStyle = "rgba(155, 27, 27, 0.5)"; - ctx.fillRect(0, 0, xWidth/2, xHeight/2); - ctx.fillStyle = "rgba(27, 155, 27, 0.5)"; - ctx.fillRect(xWidth/2, 0, xWidth/2, xHeight/2); - ctx.fillStyle = "rgba(27, 27, 155, 0.5)"; - ctx.fillRect(0, xHeight/2, xWidth/2, xHeight/2); - ctx.fillStyle = "rgba(27, 27, 27, 0.5)"; - ctx.fillRect(xWidth/2, xHeight/2, xWidth/2, xHeight/2); - return canvas; -} - -var canvasColorSettingsSet = [ - {name: "SRGB", colorSettings: {colorSpace: "srgb", pixelFormat: "uint8"}, - imageSetting: {colorSpace: "srgb", storageFormat: "uint8"}}, - {name: "e-SRGB", colorSettings: {colorSpace: "srgb", pixelFormat: "float16"}, - imageSetting: {colorSpace: "srgb", storageFormat: "float32"}}, -]; - -var srgbImageDataU8, e_srgbImageDataU16, e_srgbImageDataF32; - -function PreparePredefinedImageDataObjects() { - var canvas = document.createElement('canvas'); - var ctx = canvas.getContext('2d'); - srgbImageDataU8 = ctx.createImageData(xWidth, xHeight, - {colorSpace: "srgb", storageFormat: "uint8"}); - e_srgbImageDataU16 = ctx.createImageData(xWidth, xHeight, - {colorSpace: "srgb", storageFormat: "uint16"}); - e_srgbImageDataF32 = ctx.createImageData(xWidth, xHeight, - {colorSpace: "srgb", storageFormat: "float32"}); - - for (var i = 0; i < xWidth * xHeight; i++) - for (var j = 0; j < 4; j++) { - srgbImageDataU8.data[i*4+j] = srgbPixels[i][j]; - e_srgbImageDataU16.data[i*4+j] = - Math.round(e_srgbPixels[i][j] * 65535); - e_srgbImageDataF32.data[i*4+j] = e_srgbPixels[i][j]; - } -} - -PreparePredefinedImageDataObjects(); -var imageDataSettingsSet = [ - {name: "SRGB U8", colorSettings: {colorSpace: "srgb", storageFormat: "uint8"}, - imageData: srgbImageDataU8}, - {name: "e-SRGB U16", colorSettings: {colorSpace: "srgb", - storageFormat: "uint16"}, imageData: e_srgbImageDataU16}, - {name: "e-SRGB F32", colorSettings: {colorSpace: "srgb", - storageFormat: "float32"}, imageData: e_srgbImageDataF32}, -]; - -//////////////////////////////////////////////////////////////////////////////// - -// * ImageData imagedata = ctx.createImageData(width, height); -// No color conversion. imagedata follows the color settings of the canvas. - -function runTestCreateImageDataWH(canvasColorSettings, imageSetting) { - var canvas = initializeColorManagedCanvas(canvasColorSettings); - var ctx = canvas.getContext('2d'); - var imageData = ctx.createImageData(xWidth, xHeight, imageSetting); - checkImageDataSettings(imageSetting, imageData); -} - -var testScenariosCreateImageDataWH = []; -for (var i = 0; i < canvasColorSettingsSet.length; i++) { - var message = "Test createImageData(width, height) from " + - canvasColorSettingsSet[i].name + " canvas "; - testScenariosCreateImageDataWH. - push([message, canvasColorSettingsSet[i].colorSettings, - canvasColorSettingsSet[i].imageSetting]); -} - -function runTestCreateImageDataWHTests() { - for (var i = 0; i < testScenariosCreateImageDataWH.length; i++){ - var t = test(function() { - runTestCreateImageDataWH(testScenariosCreateImageDataWH[i][1], - testScenariosCreateImageDataWH[i][2]); - }, testScenariosCreateImageDataWH[i][0]); - } -} -runTestCreateImageDataWHTests(); - -//////////////////////////////////////////////////////////////////////////////// - -// * ImageData imagedata = ctx.getImageData(sx, sy, sw, sh); -// No color conversion. imagedata follows the color settings of the canvas. - -function runTestGetImageDataXYWH(canvasColorSettings, imageSetting) { - var canvas = initializeColorManagedCanvas(canvasColorSettings); - var ctx = canvas.getContext('2d'); - var imageData = ctx.getImageData(0, 0, xWidth, xHeight, imageSetting); - checkImageDataSettings(imageSetting, imageData); - checkImageDataColorValues(canvasColorSettings, imageData); -} - -var testScenariosGetImageDataXYWH = []; -for (var i = 0; i < canvasColorSettingsSet.length; i++) { - var message = "Test getImageData(sx, sy, sw, sh) from " + - canvasColorSettingsSet[i].name + " canvas "; - testScenariosGetImageDataXYWH. - push([message, canvasColorSettingsSet[i].colorSettings, - canvasColorSettingsSet[i].imageSetting]); -} - -function runTestGetImageDataXYWHTests() { - for (var i = 0; i < testScenariosGetImageDataXYWH.length; i++){ - var t = test(function() { - runTestGetImageDataXYWH(testScenariosGetImageDataXYWH[i][1], - testScenariosGetImageDataXYWH[i][2]); - }, testScenariosGetImageDataXYWH[i][0]); - } -} -runTestGetImageDataXYWHTests(); - -//////////////////////////////////////////////////////////////////////////////// - -// * void ctx.putImageData(imagedata, dx, dy, ...); -// Color conversion, if needed, to the color settings of the canvas. - -function runTestPutImageDataDxDy(canvasColorSettings, imageData, imageSetting) { - var canvas = document.createElement('canvas'); - canvas.width = xWidth * 2; - canvas.height = xHeight * 2; - var ctx = canvas.getContext('2d', - {colorSpace: canvasColorSettings.colorSpace, - pixelFormat: canvasColorSettings.pixelFormat}); - ctx.putImageData(imageData, xWidth/2, xHeight/2); - var ctxImageData = ctx.getImageData(xWidth/2, xHeight/2, xWidth, xHeight, imageSetting); - checkImageDataSettings(imageSetting, ctxImageData); - checkImageDataColorValues(canvasColorSettings, ctxImageData, 'noBlank', - xWidth, xHeight, 'isWCG_U8toSRGB_U8'); -} - -var testScenariosPutImageDataDxDy = []; -for (var i = 0; i < canvasColorSettingsSet.length; i++) { - for (var j = 0; j < imageDataSettingsSet.length; j++) { - var message = "Test putImageData(imagedata, dx, dy): " + - canvasColorSettingsSet[i].name + " canvas, " + - imageDataSettingsSet[j].name + " ImageData"; - testScenariosPutImageDataDxDy. - push([message, canvasColorSettingsSet[i].colorSettings, - imageDataSettingsSet[j].imageData, - canvasColorSettingsSet[i].imageSetting]); - } -} - -function runTestPutImageDataDxDyTests() { - for (var i = 0; i < testScenariosPutImageDataDxDy.length; i++){ - var t = test(function() { - runTestPutImageDataDxDy( - testScenariosPutImageDataDxDy[i][1], testScenariosPutImageDataDxDy[i][2], - testScenariosPutImageDataDxDy[i][3]); - }, testScenariosPutImageDataDxDy[i][0]); - } -} -runTestPutImageDataDxDyTests(); - -//////////////////////////////////////////////////////////////////////////////// - -// * ImageData imageData = ctx.createImageData(imagedata); -// Color conversion, if needed, to the color settings of the canvas. The -// returned imageData should be transparent black. - -function runTestCreateImageDataFromImageData(canvasColorSettings, imageData) { - var canvas = document.createElement('canvas'); - canvas.width = xWidth * 2; - canvas.height = xHeight * 2; - var ctx = canvas.getContext('2d', - {colorSpace: canvasColorSettings.colorSpace, - pixelFormat: canvasColorSettings.pixelFormat}); - var ctxImageData = ctx.createImageData(imageData); - checkImageDataSettings(imageData.getSettings(), ctxImageData); - checkImageDataColorValues(canvasColorSettings, ctxImageData, 'isBlank'); -} - -var testScenariosCreateImageDataFromImageData = []; -for (var i = 0; i < canvasColorSettingsSet.length; i++) { - for (var j = 0; j < imageDataSettingsSet.length; j++) { - var message = "Test createImageData(imagedata): " + - canvasColorSettingsSet[i].name + " canvas, " + - imageDataSettingsSet[j].name + " ImageData"; - testScenariosCreateImageDataFromImageData. - push([message, canvasColorSettingsSet[i].colorSettings, - imageDataSettingsSet[j].imageData, - canvasColorSettingsSet[i].imageSetting]); - } -} - -function runTestCreateImageDataFromImageDataTests() { - for (var i = 0; i < testScenariosCreateImageDataFromImageData.length; i++){ - var t = test(function() { - runTestCreateImageDataFromImageData( - testScenariosCreateImageDataFromImageData[i][1], - testScenariosCreateImageDataFromImageData[i][2]); - }, testScenariosCreateImageDataFromImageData[i][0]); - } -} -runTestCreateImageDataFromImageDataTests(); - -//////////////////////////////////////////////////////////////////////////////// - -// *ImageData ctx.createImageData(width, height, imageDataSettings); -// No color conversion to the color settings of the canvas. Blank ImageData -// should be created based on imageDataSettings. - -function runTestCreateImageDataWHC(canvasColorSettings, imageDataSettings) { - var canvas = initializeColorManagedCanvas(canvasColorSettings); - var ctx = canvas.getContext('2d'); - width = height = 3; - var imageData = ctx.createImageData(width, height, imageDataSettings); - var colorSettings = imageData.getSettings(); - assert_equals(colorSettings.colorSpace, - imageDataSettings.colorSpace, - "colorSpace should match"); - assert_equals(colorSettings.storageFormat, - imageDataSettings.storageFormat, - "storageFormat should match"); - var blankData = new Array(4 * width * height).fill(0); - assert_array_equals(imageData.data, blankData, - "ImageData should be transparent black"); -} - -var testScenariosCreateImageDataWHC = []; -for (var i = 0; i < canvasColorSettingsSet.length; i++) { - for (var j = 0; j < imageDataSettingsSet.length; j++) { - message = "Test createImageData(width, height, imageDataSettings): " + - canvasColorSettingsSet[i].name + " canvas, " + - imageDataSettingsSet[j].name + " ImageData"; - testScenariosCreateImageDataWHC. - push([message, canvasColorSettingsSet[i].colorSettings, - imageDataSettingsSet[j].colorSettings]); - } -} - -function runTestCreateImageDataWHCTests() { - for (var i = 0; i < testScenariosCreateImageDataWHC.length; i++){ - var t = test(function() { - runTestCreateImageDataWHC( - testScenariosCreateImageDataWHC[i][1], - testScenariosCreateImageDataWHC[i][2]); - }, testScenariosCreateImageDataWHC[i][0]); - } -} -runTestCreateImageDataWHCTests(); - -//////////////////////////////////////////////////////////////////////////////// - -// *ImageData ctx.createImageData(data, width, height, imageDataSettings); -// No color conversion to the color settings of the canvas. ImageData is created -// from param "data" with proper storage format and is tagged with the -// CanvasColorSpace which is given in imageDataSettings. - -function runTestCreateImageDataDWHC(canvasColorSettings, imageData) { - var data = imageData.data; - width = xWidth; - height = xHeight; - var colorSettings = imageData.getSettings(); - - var canvas = initializeColorManagedCanvas(canvasColorSettings); - var ctx = canvas.getContext('2d'); - var newImageData = ctx.createImageData(data, width, height, colorSettings); - var newColorSettings = newImageData.getSettings(); - assert_equals(newColorSettings.colorSpace, - colorSettings.colorSpace, - "colorSpace should match"); - assert_equals(newColorSettings.storageFormat, - colorSettings.storageFormat, - "storageFormat should match"); - assert_array_equals(newImageData.data, imageData.data, - "ImageData should be transparent black"); -} - -//////////////////////////////////////////////////////////////////////////////// - -</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/transferFromImageBitmap.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/transferFromImageBitmap.html deleted file mode 100644 index 1b90396..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/transferFromImageBitmap.html +++ /dev/null
@@ -1,120 +0,0 @@ -<!DOCTYPE HTML> -<script src="/resources/testharness.js"></script> -<script src="/resources/testharnessreport.js"></script> -<script> - -// This test examines the color managed ImageBitmapRenderingContext. -// - We first draw on 2D canvas with different color space and alpha -// properties. -// - Next, the canvas is used as a source image to create an ImageBitmap. -// Different colorSpaceConversion values are tested when creating the -// intermediate ImageBitmap object. -// - Next, ImageBitmap is transferred to an ImageBitmapRenderingContext. -// - Since we cannot read back pixels from ImageBitmapRenderingContext, we -// draw it to another 2D canvas and read back the pixels. -// - Finally, we compare the pixels read from the first 2D canvas with those -// read from the final 2D canvas. We expect them to match with some -// tolerance. - -function testPixels(actualPixels, expectedPixels, testScenario) -{ - var tolerance = 0; - if (testScenario.pixelFormat == "float16") - tolerance = 0.01; - - assert_array_approx_equals(actualPixels, expectedPixels, tolerance); -} - -function generateFillStyle(red, green, blue, alpha) { - return "rgba(" + red + "," + green + "," + blue + "," + alpha + ")"; -} - -function generateExpectedResult(testScenario, canvas) -{ - var ctx = canvas.getContext('2d', {colorSpace: testScenario.colorSpace, - pixelFormat: testScenario.pixelFormat}); - ctx.fillStyle = generateFillStyle(155, 27, 27, testScenario.alpha); - ctx.fillRect(0, 0, 1, 1); - ctx.fillStyle = generateFillStyle(27, 155, 27, testScenario.alpha); - ctx.fillRect(1, 0, 1, 1); - ctx.fillStyle = generateFillStyle(27, 27, 155, testScenario.alpha); - ctx.fillRect(0, 1, 1, 1); - ctx.fillStyle = generateFillStyle(27, 27, 27, testScenario.alpha); - ctx.fillRect(1, 1, 1, 1); - return ctx.getImageData(0, 0, 2, 2, testScenario.imageSetting).data; -} - -function generateTestName(testScenario) { - var str = "Testing ImageBitmapRenderingContext:" + - " Source color space: " + testScenario.colorSpace + - ", pixel format: " + testScenario.pixelFormat + - ", alpha: " + testScenario.alpha + - ", intermediate color space: " + - testScenario.colorSpaceConversion; - return str; -} - -function runTransferFromImageBitmapTest(testScenario) { - var canvas = document.createElement("canvas"); - canvas.width = 2; - canvas.height = 2; - var expectedPixels = generateExpectedResult(testScenario, canvas); - - promise_test(function() { - var options = {colorSpaceConversion: testScenario.colorSpaceConversion}; - var promise = createImageBitmap(canvas, options); - return Promise.all([promise]).then(([imagebitmap]) => { - var dstCanvas = document.createElement("canvas"); - dstCanvas.width = 2; - dstCanvas.height = 2; - var dstCtx = dstCanvas.getContext('bitmaprenderer'); - dstCtx.transferFromImageBitmap(imagebitmap); - - // ImageBitmapRenderingContext does not have ImageData, so we draw - // it on another canvas and read back the data. - var finalCanvas = document.createElement("canvas"); - finalCanvas.width = 2; - finalCanvas.height = 2; - var ctx = finalCanvas.getContext('2d', - {colorSpace: testScenario.colorSpace, - pixelFormat: testScenario.pixelFormat}); - ctx.drawImage(dstCanvas, 0, 0); - var actualPixels = ctx.getImageData(0, 0, 2, 2, testScenario.imageSetting).data; - testPixels(actualPixels, expectedPixels, testScenario); - }); - }, generateTestName(testScenario)); -} - - -function runAllTests() { - var colorSpaces = [ - {colorSpace: 'srgb', pixelFormat: 'uint8'}, - {colorSpace: 'srgb', pixelFormat: 'float16'}, - ]; - var imageSettings = [ - {colorSpace: 'srgb', storageFormat: 'uint8'}, - {colorSpace: 'srgb', storageFormat: 'float32'}, - ]; - var alphaValues = [0.5, 1]; - var colorSpaceConversions = ['none', 'default']; - - var testScenarios = []; - for (var i = 0; i < colorSpaces.length; i++) - for (var j = 0; j < alphaValues.length; j++) - for (var k = 0; k < colorSpaceConversions.length; k++) { - var testScenario = {}; - testScenario.colorSpace = colorSpaces[i].colorSpace; - testScenario.pixelFormat = colorSpaces[i].pixelFormat; - testScenario.alpha = alphaValues[j]; - testScenario.colorSpaceConversion = colorSpaceConversions[k]; - testScenario.imageSetting = imageSettings[i]; - testScenarios.push(testScenario); - } - - for (var i = 0; i < testScenarios.length; i++) - runTransferFromImageBitmapTest(testScenarios[i]); -} - -runAllTests(); - -</script> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/directionality/bdi-element-invalid-dir-ref.html b/third_party/blink/web_tests/external/wpt/html/dom/directionality/bdi-element-invalid-dir-ref.html new file mode 100644 index 0000000..88ccd4b9b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/dom/directionality/bdi-element-invalid-dir-ref.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html> +<head> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality"> +<style> +div { width: 100px; height: 100px; background: green; } +</style> +</head> +<body> +<div></div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/dom/directionality/bdi-element-invalid-dir.html b/third_party/blink/web_tests/external/wpt/html/dom/directionality/bdi-element-invalid-dir.html new file mode 100644 index 0000000..629cee8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/dom/directionality/bdi-element-invalid-dir.html
@@ -0,0 +1,17 @@ +<!DOCTYPE html> +<html> +<head> +<meta name="author" title="Ryosuke Niwa" href="mailto:rniwa@webkit.org"> +<link rel="help" href="https://html.spec.whatwg.org/multipage/dom.html#the-directionality"> +<link rel="match" href="bdi-element-invalid-dir-ref.html"> +<style> +div { position: relative; width: 100px; height: 100px; background: red; } +bdi { width: 100px; height: 100px; display: block; } +span { display: inline-block; width: 50px; height: 100px; background: green; color: green; } +#left { background: green; position: absolute; left: 0px; top: 0px; } +</style> +</head> +<body> +<div><bdi dir="foo"><span id="left"></span><span>ת</span></bdi></div> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-css-properties.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-css-properties.tentative.html index c0e58f0..ac5e9f7 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-css-properties.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-css-properties.tentative.html
@@ -49,6 +49,6 @@ ]); } -testprop('hover-pop-up-delay'); -testprop('hover-pop-up-hide-delay'); +testprop('pop-up-show-delay'); +testprop('pop-up-hide-delay'); </script>
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html index 76cc332..979cb0a 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-focus.tentative.html
@@ -49,49 +49,6 @@ <button autofocus>second autofocus button</button> </div> -<div popup delegatesfocus data-test='delegatesfocus pop-up'> - <p>This is a pop-up</p> - <button class=should-be-focused>first button should be focused</button> - <button>second button</button> -</div> - -<div popup delegatesfocus data-test='delegatesfocus takes precedence over autofocus'> - <p>This is a pop-up</p> - <button class=should-be-focused>first button</button> - <button autofocus>autofocus button should NOT be focused</button> -</div> - -<div popup delegatesfocus autofocus data-test='delegatesfocus takes precedence over autofocus 2'> - <p>This is a pop-up</p> - <button class=should-be-focused>first button</button> - <button>autofocus button should NOT be focused</button> -</div> - -<div popup delegatesfocus data-test='delegatesfocus on empty pop-up has no effect' data-no-focus></div> - -<div popup data-test='delegatesfocus on child has no effect' data-no-focus> - <p>This is a pop-up</p> - <button delegatesfocus>first button</button> -</div> - -<div popup delegatesfocus data-test='delegatesfocus skips contained pop-ups'> - <p>This is a pop-up</p> - <div popup> - <button>Contained pop-up button</button> - </div> - <button class=should-be-focused>first button</button> - <button>autofocus button should NOT be focused</button> -</div> - -<div popup delegatesfocus data-test='delegatesfocus skips contained dialogs'> - <p>This is a pop-up</p> - <dialog> - <button>Contained dialog button</button> - </dialog> - <button class=should-be-focused>first button</button> - <button>autofocus button should NOT be focused</button> -</div> - <style> [popup] { border: 2px solid black;
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hover-hide.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hover-hide.tentative.html index 64a81a4..16acd68 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hover-hide.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hover-hide.tentative.html
@@ -14,11 +14,11 @@ <style> [popup] { top:100px; - hover-pop-up-hide-delay: 100ms; + pop-up-hide-delay: 100ms; } [popuphovertarget] { top:200px; - hover-pop-up-delay: 100ms; + pop-up-show-delay: 100ms; } #unrelated {top: 300px;} div { @@ -60,9 +60,9 @@ assert_false(popUp.matches(':top-layer')); assert_true(msSinceMouseOver() >= hoverWaitTime,'waitForHoverTime should wait the specified time'); assert_true(hoverWaitTime > hoverDelays,'hoverDelays is the value from CSS, hoverWaitTime should be longer than that'); - assert_equals(getComputedStyleTimeMs(invoker1,'hoverPopUpDelay'),hoverDelays,'hover-pop-up-delay is incorrect'); - assert_equals(getComputedStyleTimeMs(popUp,'hoverPopUpHideDelay'),hoverDelays,'hover-pop-up-hide-delay is incorrect'); -},`The hover-pop-up-hide-delay causes a pop-up to be hidden after a delay`); + assert_equals(getComputedStyleTimeMs(invoker1,'popUpShowDelay'),hoverDelays,'pop-up-show-delay is incorrect'); + assert_equals(getComputedStyleTimeMs(popUp,'popUpHideDelay'),hoverDelays,'pop-up-hide-delay is incorrect'); +},`The pop-up-hide-delay causes a pop-up to be hidden after a delay`); promise_test(async (t) => { await mouseOver(unrelated); @@ -110,7 +110,7 @@ await mouseOver(unrelated); const popUp = document.getElementById('example2'); const invoker = document.getElementById('invoker2'); - assert_equals(getComputedStyleTimeMs(popUp,'hoverPopUpHideDelay'),hoverDelays,'hover-pop-up-hide-delay is incorrect'); + assert_equals(getComputedStyleTimeMs(popUp,'popUpHideDelay'),hoverDelays,'pop-up-hide-delay is incorrect'); assert_false(popUp.matches(':top-layer')); await mouseOver(invoker); popUp.showPopUp();
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hoverpopup-attribute.tentative.html b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-popuphovertarget-attribute.tentative.html similarity index 90% rename from third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hoverpopup-attribute.tentative.html rename to third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-popuphovertarget-attribute.tentative.html index 56646d4..e845b0d 100644 --- a/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-hoverpopup-attribute.tentative.html +++ b/third_party/blink/web_tests/external/wpt/html/semantics/popups/popup-popuphovertarget-attribute.tentative.html
@@ -20,21 +20,21 @@ </style> <script> -const hoverPopUpDelay = 100; // The CSS delay setting. +const popUpShowDelay = 100; // The CSS delay setting. const hoverWaitTime = 200; // How long to wait to cover the delay for sure. let nextId = 0; async function makePopUpAndInvoker(test, popUpType, invokerType, delayMs) { - delayMs = delayMs || hoverPopUpDelay; + delayMs = delayMs || popUpShowDelay; const popUp = Object.assign(document.createElement('div'),{popUp: popUpType, id: `pop-up-${nextId++}`}); document.body.appendChild(popUp); popUp.textContent = 'Pop-up'; let invoker = document.createElement('div'); invoker.setAttribute('class','invoker'); invoker.setAttribute('popuphovertarget',popUp.id); - invoker.setAttribute('style',`hover-pop-up-delay: ${delayMs}ms; hover-pop-up-hide-delay: 1000s;`); + invoker.setAttribute('style',`pop-up-show-delay: ${delayMs}ms; pop-up-hide-delay: 1000s;`); document.body.appendChild(invoker); - const actualHoverDelay = Number(getComputedStyle(invoker)['hoverPopUpDelay'].slice(0,-1))*1000; - assert_equals(actualHoverDelay,delayMs,'hover-pop-up-delay is incorrect'); + const actualHoverDelay = Number(getComputedStyle(invoker)['popUpShowDelay'].slice(0,-1))*1000; + assert_equals(actualHoverDelay,delayMs,'pop-up-show-delay is incorrect'); const originalInvoker = invoker; const reassignPopupFn = (p) => originalInvoker.setAttribute('popuphovertarget',p.id); switch (invokerType) { @@ -95,12 +95,12 @@ await mouseOver(invoker); let showing = popUp.matches(':top-layer'); // See NOTE above. - if (msSinceMouseOver() < hoverPopUpDelay) + if (msSinceMouseOver() < popUpShowDelay) assert_false(showing,'pop-up should not show immediately'); await waitForHoverTime(hoverWaitTime); assert_true(msSinceMouseOver() >= hoverWaitTime,'waitForHoverTime should wait the specified time'); assert_true(popUp.matches(':top-layer'),'pop-up should show after delay'); - assert_true(hoverWaitTime > hoverPopUpDelay,'hoverPopUpDelay is the CSS setting, hoverWaitTime should be longer than that'); + assert_true(hoverWaitTime > popUpShowDelay,'popUpShowDelay is the CSS setting, hoverWaitTime should be longer than that'); popUp.hidePopUp(); // Cleanup },`popuphovertarget attribute shows a pop-up with popup=${type}, invokerType=${invokerType}`); @@ -118,7 +118,7 @@ if (msSinceMouseOver() >= longerHoverDelay) return; // The WPT runner was too slow. assert_false(showing,'pop-up should not show after not long enough of a delay'); - },`popuphovertarget hover-pop-up-delay is respected (popup=${type}, invokerType=${invokerType})`); + },`hoverpopup pop-up-show-delay is respected (popup=${type}, invokerType=${invokerType})`); promise_test(async (t) => { const {popUp,invoker} = await makePopUpAndInvoker(t,type,invokerType); @@ -137,7 +137,7 @@ let showing = popUp.matches(':top-layer'); popUp.remove(); // See NOTE above. - if (msSinceMouseOver() >= hoverPopUpDelay) + if (msSinceMouseOver() >= popUpShowDelay) return; // The WPT runner was too slow. assert_false(showing,'pop-up should not show immediately'); await waitForHoverTime(hoverWaitTime); @@ -157,7 +157,7 @@ let eitherShowing = popUp.matches(':top-layer') || popUp2.matches(':top-layer'); reassignPopupFn(popUp2); // See NOTE above. - if (msSinceMouseOver() >= hoverPopUpDelay) + if (msSinceMouseOver() >= popUpShowDelay) return; // The WPT runner was too slow. assert_false(eitherShowing,'pop-up should not show immediately'); await waitForHoverTime(hoverWaitTime);
diff --git a/third_party/blink/web_tests/external/wpt/html/syntax/parsing-html-fragments/innerHTML-setter-default-namespace.xhtml b/third_party/blink/web_tests/external/wpt/html/syntax/parsing-html-fragments/innerHTML-setter-default-namespace.xhtml new file mode 100644 index 0000000..19f17f1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/syntax/parsing-html-fragments/innerHTML-setter-default-namespace.xhtml
@@ -0,0 +1,35 @@ +<?xml version="1.0" encoding="utf-8"?> +<html xmlns="http://www.w3.org/1999/xhtml"> +<head> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +</head> +<body> +<span xmlns="someNamespace" xmlns:html="http://www.w3.org/1999/xhtml"> + <html:span id="target"/> +</span> +<script> +<![CDATA[ + +test(() => { + const element = document.getElementById("target"); + element.innerHTML = '<b /><html:b />'; + assert_equals(element.firstChild.prefix, null); + assert_equals(element.firstChild.namespaceURI, "someNamespace"); + assert_equals(element.lastChild.prefix, 'html'); + assert_equals(element.lastChild.namespaceURI, "http://www.w3.org/1999/xhtml"); +}, "Setting innerHTML on a HTML element with a non-HTML namespace as the default namespace"); + +test(() => { + const element = document.getElementById("target"); + element.outerHTML = '<b /><html:b />'; + assert_equals(element.firstChild.prefix, null); + assert_equals(element.firstChild.namespaceURI, "someNamespace"); + assert_equals(element.lastChild.prefix, 'html'); + assert_equals(element.lastChild.namespaceURI, "http://www.w3.org/1999/xhtml"); +}, "Setting outerHTML on a HTML element with a non-HTML namespace as the default namespace"); + +]]> +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/load-from-mem-cache-transfer-size.html b/third_party/blink/web_tests/external/wpt/resource-timing/load-from-mem-cache-transfer-size.html new file mode 100644 index 0000000..3d2d32d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/resource-timing/load-from-mem-cache-transfer-size.html
@@ -0,0 +1,65 @@ +<!DOCTYPE HTML> +<html> + +<head> + <meta charset="utf-8" /> + <title>This tests transfer size of resource timing when loaded from memory cache.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="resources/entry-invariants.js"></script> +</head> + +<body> + <script> + function getScript(url) { + const script = document.createElement("script"); + const loaded = new Promise(resolve => { + script.onload = script.onerror = resolve; + }); + script.src = url; + document.body.appendChild(script); + return loaded; + } + function add_iframe(url) { + return new Promise(function (resolve) { + var frame = document.createElement('iframe'); + frame.src = url; + frame.onload = function () { resolve(frame); }; + document.body.appendChild(frame); + }); + } + promise_test(async t => { + // Add unique token to url so that each run the url is different to avoid + // flakiness. + let url = 'resources/resource_timing_test0.js?unique=' + + Math.random().toString().substr(2); + let frame; + return add_iframe('resources/iframe-load-from-mem-cache-transfer-size.html') + .then((f) => { + frame = f; + // Load script onto iframe in order to get it into the memory cache. + return frame.contentWindow.getScript(url.split('/')[1]) + }) + .then(() => { + // Verify that the transferSize in case of normal load is greater than + // 0. + assert_positive_( + frame.contentWindow.performance.getEntriesByType('resource') + .filter(e => e.name.includes(url))[0], ['transferSize']); + + // Load the same script onto the parent document. This time the script + // is coming from memory cache. + return getScript(url); + }) + .then(() => { + // Verify that the transferSize in case of memory cache load is 0. + assert_zeroed_( + window.performance.getEntriesByType('resource') + .filter(e => e.name.includes(url))[0], ['transferSize']); + }); + }, "The transferSize of resource timing entries should be 0 when resource \ + is loaded from memory cache."); + </script> +</body> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/iframe-load-from-mem-cache-transfer-size.html b/third_party/blink/web_tests/external/wpt/resource-timing/resources/iframe-load-from-mem-cache-transfer-size.html new file mode 100644 index 0000000..6f37a33e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/iframe-load-from-mem-cache-transfer-size.html
@@ -0,0 +1,24 @@ +<!DOCTYPE HTML> +<html> + +<head> + <meta charset="utf-8" /> + <title>transfer size of resource timing when loaded from memory cache.</title> +</head> + +<body> + <script> + // This function is called from the test in the parent document. + function getScript(url) { + const script = document.createElement("script"); + const loaded = new Promise(resolve => { + script.onload = script.onerror = resolve; + }); + script.src = url; + document.body.appendChild(script); + return loaded; + } + </script> +</body> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/resource-timing/resources/resource_timing_test0.js.headers b/third_party/blink/web_tests/external/wpt/resource-timing/resources/resource_timing_test0.js.headers new file mode 100644 index 0000000..308bee94 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/resource-timing/resources/resource_timing_test0.js.headers
@@ -0,0 +1,2 @@ +Content-Type: text/javascript +Cache-Control: max-age=36000
diff --git a/third_party/blink/web_tests/fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html b/third_party/blink/web_tests/fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html index 3cb2e6f..57fe5b6 100644 --- a/third_party/blink/web_tests/fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html +++ b/third_party/blink/web_tests/fast/events/touch/gesture/touch-gesture-noscroll-body-propagated.html
@@ -115,6 +115,6 @@ await conditionHolds(() => { return notScrolled(); }); assert_equals(scrollEventsOccurred, expectedScrollEventsOccurred); }, 'This tests that a page cannot be scrolled vertically with touch if its ' + - 'body has style overflow-y:hidden and the scroll event is propogated ' + + 'body has style overflow-y:hidden and the scroll event is propagated ' + 'from a scrollable child div.'); </script>
diff --git a/third_party/blink/web_tests/fast/forms/calendar-picker/calendar-picker-clear-button.html b/third_party/blink/web_tests/fast/forms/calendar-picker/calendar-picker-clear-button.html index 51793355..9e44b60 100644 --- a/third_party/blink/web_tests/fast/forms/calendar-picker/calendar-picker-clear-button.html +++ b/third_party/blink/web_tests/fast/forms/calendar-picker/calendar-picker-clear-button.html
@@ -11,13 +11,15 @@ </head> <body> <input type="date" value="2021-07-15"> +<input type="date" value="2021-07-15" required> <input type="week" value="2021-W01"> -<input type="datetime-local" value="2021-07-15T00:00" /> +<input type="week" value="2021-W01" required> +<input type="datetime-local" value="2021-07-15T00:00" > +<input type="datetime-local" value="2021-07-15T00:00" required> <script> -for (const inputType of ["date", "week", "datetime-local"]) { +document.querySelectorAll('input').forEach(element => { promise_test(() => { - let element = document.querySelector(`input[type="${inputType}"]`); return openPicker(element) .then(() => { // Make the picker dismiss synchronously so we don't need to insert @@ -29,8 +31,8 @@ assert_equals(element.value, "", "Clear button should have updated in-page control to empty string."); assert_equals(internals.pagePopupWindow, null, "Click on Clear button should close popup."); }); - }, `Calendar picker: Clear button for input[type="${inputType}"] should clear date`); -} + }, `Calendar picker: Clear button for ${element.outerHTML} should clear date`); +}); </script> </body>
diff --git a/third_party/blink/web_tests/fast/js/script-tests/date-big-setdate.js b/third_party/blink/web_tests/fast/js/script-tests/date-big-setdate.js index b0f6cb2..0c4ae6a 100644 --- a/third_party/blink/web_tests/fast/js/script-tests/date-big-setdate.js +++ b/third_party/blink/web_tests/fast/js/script-tests/date-big-setdate.js
@@ -28,7 +28,7 @@ testCases.push([new Date(0), 97, 98]); // Added more special cases. These dates match the recent DST changes in the US. - // These tests check that the new changes are correctly propogated to the past and + // These tests check that the new changes are correctly propagated to the past and // all of the tests should show DST occurring on the same date. testCases.push([new Date(1970, 0,0,0,0,0,0), 98, 99]); testCases.push([new Date(1998, 0,0,0,0,0,0), 98, 99]);
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png deleted file mode 100644 index 242ff5ea..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png deleted file mode 100644 index 14574ee0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-layout-ng/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png deleted file mode 100644 index 242ff5ea..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png deleted file mode 100644 index 14574ee0..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/cookies/partitioned-cookies/partitioned-attribute.https.html b/third_party/blink/web_tests/http/tests/cookies/partitioned-cookies/partitioned-attribute.https.html index 8186160..9ce383a3 100644 --- a/third_party/blink/web_tests/http/tests/cookies/partitioned-cookies/partitioned-attribute.https.html +++ b/third_party/blink/web_tests/http/tests/cookies/partitioned-cookies/partitioned-attribute.https.html
@@ -17,39 +17,33 @@ test(() => { assert_equals(document.cookie, ""); - // Valid Partitioned cookie: __Host- prefix and no SameParty attribute. - const validCookie = "__Host-foo=bar"; - const validCookieAttributes = "; Secure; Path=/; SameSite=None; Partitioned"; - const prefixedCookieLine = validCookie + validCookieAttributes; - document.cookie = prefixedCookieLine; - assert_equals(document.cookie, validCookie); - deleteExistingCookie(prefixedCookieLine) + // Valid Partitioned cookie: has Secure, Domain is allowed. + const cookie = "foo=bar"; + const cookieLine = cookie + "; Secure; SameSite=None; Partitioned;"; + document.cookie = cookieLine; + assert_equals(document.cookie, cookie); + deleteExistingCookie(cookieLine); - // Partitioned cookie with no __Host- prefix are valid as long as they have - // the Secure and Path=/. - const noPrefixCookie = "foo=bar"; - const noPrefixCookieLine = noPrefixCookie + validCookieAttributes; - document.cookie = noPrefixCookieLine; - assert_equals(document.cookie, "foo=bar"); - deleteExistingCookie(noPrefixCookieLine); - - // Partitioned cookie with Domain is still valid. - const domainCookie = "foo=baz"; - const domainCookieLine = domainCookie + validCookieAttributes + `; Domain=${ - window.location.hostname}`; + // Domain is allowed. + const domainCookieLine = cookieLine + ` Domain=${ + window.location.hostname};`; document.cookie = domainCookieLine; - assert_equals(document.cookie, "foo=baz"); + assert_equals(document.cookie, cookie); deleteExistingCookie(domainCookieLine); + // Path is allowed. + const pathCookieLine = cookieLine + ` Path=${ + window.location.pathname.split('/').slice(0, 2).join('/')};`; + document.cookie = pathCookieLine; + assert_equals(document.cookie, cookie); + deleteExistingCookie(pathCookieLine); + // Invalid Partitioned cookie: SameParty attribute. - assertInvalidCookie(prefixedCookieLine + "; SameParty"); + assertInvalidCookie(cookie + "; SameParty"); // Invalid Partitioned cookie: No Secure attribute. // No SameSite=None since that independently requires Secure. - assertInvalidCookie(validCookie + "; Path=/; Partitioned;"); - - // Invalid Partitioned cookie: No Path attribute. - assertInvalidCookie(validCookie + "; Secure; SameSite=None; Partitioned;"); + assertInvalidCookie(cookie + "; Path=/; Partitioned;"); }, "Partitioned cookie attribute semantics"); </script>
diff --git a/third_party/blink/web_tests/http/tests/navigation/navigator-language-in-insecure-context-disabled.html b/third_party/blink/web_tests/http/tests/navigation/navigator-language-in-insecure-context-disabled.html deleted file mode 100644 index d5504bd..0000000 --- a/third_party/blink/web_tests/http/tests/navigation/navigator-language-in-insecure-context-disabled.html +++ /dev/null
@@ -1,7 +0,0 @@ -<!DOCTYPE html> -<script src="/resources/get-host-info.js"></script> -<script> -let file_pathname = window.location.pathname; -let folder_pathname = file_pathname.substring(0, file_pathname.lastIndexOf('/')); -window.location = get_host_info().UNAUTHENTICATED_ORIGIN + folder_pathname + '/resources/navigator-language-in-insecure-context-disabled-helper.html'; -</script>
diff --git a/third_party/blink/web_tests/http/tests/navigation/resources/navigator-language-in-insecure-context-disabled-helper.html b/third_party/blink/web_tests/http/tests/navigation/resources/navigator-language-in-insecure-context-disabled-helper.html deleted file mode 100644 index d898bb1..0000000 --- a/third_party/blink/web_tests/http/tests/navigation/resources/navigator-language-in-insecure-context-disabled-helper.html +++ /dev/null
@@ -1,15 +0,0 @@ -<!DOCTYPE html> -<script src="/js-test-resources/js-test.js"></script> -<script src="/resources/get-host-info.js"></script> -<script> -if (window.internals) - internals.runtimeFlags.navigatorLanguageInInsecureContextEnabled = false; -let is_secure_context = window.location.origin != get_host_info().UNAUTHENTICATED_ORIGIN; -let is_secure_text = is_secure_context ? "secure" : "insecure"; -description('Test navigator.language and navigator.languages in ' + is_secure_text + ' context.') -window.jsTestIsAsync = true; -shouldBe('navigator.language', '"en-US"'); -shouldBe('navigator.languages.length', '1'); -shouldBe('navigator.languages[0]', '"en-US"'); -finishJSTest(); -</script>
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-pseudo/dir-pseudo-on-bdi-element-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-pseudo/dir-pseudo-on-bdi-element-expected.txt new file mode 100644 index 0000000..1bc5087 --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-pseudo/dir-pseudo-on-bdi-element-expected.txt
@@ -0,0 +1,8 @@ +This is a testharness.js-based test. +PASS bdi element without dir content attribute +FAIL bdi element with invalid dir content attribute assert_false: expected false got true +PASS bdi element with dir=auto content attribute +PASS bdi element with dir=ltr content attribute +PASS bdi element with dir=rtl content attribute +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/css-pseudo/dir-pseudo-on-input-element-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-pseudo/dir-pseudo-on-input-element-expected.txt new file mode 100644 index 0000000..2e0ab34f --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/css-pseudo/dir-pseudo-on-input-element-expected.txt
@@ -0,0 +1,21 @@ +This is a testharness.js-based test. +PASS input element whose type attribute is in the telephone state +FAIL input element whose type attribute is in the telephone state in a RTL block assert_true: expected true got false +PASS input element whose type attribute is in the text state +PASS input element whose type attribute is in the search state +PASS input element whose type attribute is in the url state +PASS input element whose type attribute is in the email state +FAIL input element whose type attribute is in the password state assert_true: expected true got false +PASS input element whose type attribute is in the date state +PASS input element whose type attribute is in the time state +PASS input element whose type attribute is in the number state +PASS input element whose type attribute is in the range state +PASS input element whose type attribute is in the color state +FAIL input element whose type attribute is in the checkbox state assert_true: expected true got false +FAIL input element whose type attribute is in the radio state assert_true: expected true got false +FAIL input element whose type attribute is in the submit state assert_true: expected true got false +FAIL input element whose type attribute is in the image state assert_true: expected true got false +FAIL input element whose type attribute is in the reset state assert_true: expected true got false +FAIL input element whose type attribute is in the button state assert_true: expected true got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/media-query-matches-in-iframe-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/media-query-matches-in-iframe-expected.txt new file mode 100644 index 0000000..13cf904e --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/css/mediaqueries/media-query-matches-in-iframe-expected.txt
@@ -0,0 +1,25 @@ +This is a testharness.js-based test. +PASS matchMedia('(max-width: 150px)').matches should update immediately +PASS matchMedia('(width: 100px)').matches should update immediately +PASS matchMedia('(orientation: portrait)').matches should update immediately +PASS matchMedia('(aspect-ratio: 1/1)').matches should update immediately +PASS matchMedia('(max-aspect-ratio: 4/3)').matches should update immediately +PASS matchMedia('(height: 100px)').matches should update immediately +PASS matchMedia('(max-height: 150px)').matches should update immediately +PASS matchMedia('(min-aspect-ratio: 3/4)').matches should update immediately +PASS matchMedia('(min-height: 150px)').matches should update immediately +PASS matchMedia('(aspect-ratio: 1/2)').matches should update immediately +PASS matchMedia('(min-width: 150px)').matches should update immediately +PASS matchMedia('(min-aspect-ratio: 4/3)').matches should update immediately +FAIL matchMedia('(max-width: 150px)') should not receive a change event until update the rendering step of HTML5 event loop assert_equals: expected 1 but got 0 +FAIL matchMedia('(width: 100px)') should not receive a change event until update the rendering step of HTML5 event loop assert_equals: expected 1 but got 0 +FAIL matchMedia('(orientation: portrait)') should not receive a change event until update the rendering step of HTML5 event loop assert_equals: expected 1 but got 0 +FAIL matchMedia('(aspect-ratio: 1/1)') should not receive a change event until update the rendering step of HTML5 event loop assert_equals: expected 1 but got 0 +FAIL matchMedia('(max-aspect-ratio: 4/3)') should not receive a change event until update the rendering step of HTML5 event loop assert_equals: expected 1 but got 0 +FAIL matchMedia('(max-width: 150px)') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called assert_array_equals: lengths differ, expected array ["resize", "change"] length 2, got [] length 0 +FAIL matchMedia('(width: 100px)') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called assert_array_equals: lengths differ, expected array ["resize", "change"] length 2, got [] length 0 +FAIL matchMedia('(orientation: portrait)') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called assert_array_equals: lengths differ, expected array ["resize", "change"] length 2, got [] length 0 +FAIL matchMedia('(aspect-ratio: 1/1)') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called assert_array_equals: lengths differ, expected array ["resize", "change"] length 2, got [] length 0 +FAIL matchMedia('(max-aspect-ratio: 4/3)') should receive a change event after resize event on the window but before a requestAnimationFrame callback is called assert_array_equals: lengths differ, expected array ["resize", "change"] length 2, got [] length 0 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/external/wpt/custom-elements/perform-microtask-checkpoint-before-construction-xml-parser-expected.txt b/third_party/blink/web_tests/platform/generic/external/wpt/custom-elements/perform-microtask-checkpoint-before-construction-xml-parser-expected.txt new file mode 100644 index 0000000..869c05e --- /dev/null +++ b/third_party/blink/web_tests/platform/generic/external/wpt/custom-elements/perform-microtask-checkpoint-before-construction-xml-parser-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL XML parser must perform a microtask checkpoint before constructing a custom element assert_equals: expected 1 but got 0 +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-expected.png index 949c0252c..31aa5e6 100644 --- a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-expected.png +++ b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-fill-expected.png b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-fill-expected.png index 5323902..a49be76f 100644 --- a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-fill-expected.png +++ b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-arc-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-expected.png index 392a4a0d..be29611 100644 --- a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-expected.png +++ b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-fill-expected.png index 5f15f2c..eb7b3d0 100644 --- a/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ b/third_party/blink/web_tests/platform/generic/fast/canvas/canvas-ellipse-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt b/third_party/blink/web_tests/platform/generic/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt similarity index 100% rename from third_party/blink/web_tests/platform/mac/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt rename to third_party/blink/web_tests/platform/generic/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt
diff --git a/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-listing-expected.txt b/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-listing-expected.txt index 9aa0327..3389da66 100644 --- a/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-listing-expected.txt
@@ -197,8 +197,6 @@ grid-template-columns: none grid-template-rows: none height: 0px -hover-pop-up-delay: 0.5s -hover-pop-up-hide-delay: infinity * 1s hyphens: manual image-orientation: from-image image-rendering: auto @@ -281,6 +279,8 @@ perspective: none perspective-origin: 384.5px 0px pointer-events: auto +pop-up-hide-delay: infinity * 1s +pop-up-show-delay: 0.5s position: static position-fallback: none r: 0px
diff --git a/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt b/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt index ec6754d..ed8863f 100644 --- a/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/fast/css/getComputedStyle/computed-style-without-renderer-listing-expected.txt
@@ -197,8 +197,6 @@ grid-template-columns: none grid-template-rows: none height: auto -hover-pop-up-delay: 0.5s -hover-pop-up-hide-delay: infinity * 1s hyphens: manual image-orientation: from-image image-rendering: auto @@ -281,6 +279,8 @@ perspective: none perspective-origin: 50% 50% pointer-events: auto +pop-up-hide-delay: infinity * 1s +pop-up-show-delay: 0.5s position: static position-fallback: none r: 0px
diff --git a/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png index 3f8423b..3d489455 100644 --- a/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ b/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png index 4082c8c..0f5cb1bd 100644 --- a/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ b/third_party/blink/web_tests/platform/generic/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/fast/table/frame-and-rules-expected.png b/third_party/blink/web_tests/platform/generic/fast/table/frame-and-rules-expected.png deleted file mode 100644 index 692da6c4..0000000 --- a/third_party/blink/web_tests/platform/generic/fast/table/frame-and-rules-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/http/tests/navigation/navigator-language-in-insecure-context-disabled-expected.txt b/third_party/blink/web_tests/platform/generic/http/tests/navigation/navigator-language-in-insecure-context-disabled-expected.txt deleted file mode 100644 index 8dc6ddbb..0000000 --- a/third_party/blink/web_tests/platform/generic/http/tests/navigation/navigator-language-in-insecure-context-disabled-expected.txt +++ /dev/null
@@ -1,11 +0,0 @@ -Test navigator.language and navigator.languages in insecure context. - -On success, you will see a series of "PASS" messages, followed by "TEST COMPLETE". - -FAIL navigator.language should be en-US. Was . -FAIL navigator.languages.length should be 1. Was 0. -FAIL navigator.languages[0] should be en-US (of type string). Was undefined (of type undefined). -PASS successfullyParsed is true - -TEST COMPLETE -
diff --git a/third_party/blink/web_tests/platform/generic/svg/css/getComputedStyle-listing-expected.txt b/third_party/blink/web_tests/platform/generic/svg/css/getComputedStyle-listing-expected.txt index 065b29cf..db763472 100644 --- a/third_party/blink/web_tests/platform/generic/svg/css/getComputedStyle-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/svg/css/getComputedStyle-listing-expected.txt
@@ -197,8 +197,6 @@ grid-template-columns: none grid-template-rows: none height: 100px -hover-pop-up-delay: 0.5s -hover-pop-up-hide-delay: infinity * 1s hyphens: manual image-orientation: from-image image-rendering: auto @@ -281,6 +279,8 @@ perspective: none perspective-origin: 0px 0px pointer-events: auto +pop-up-hide-delay: infinity * 1s +pop-up-show-delay: 0.5s position: static position-fallback: none r: 0px
diff --git a/third_party/blink/web_tests/platform/generic/virtual/disable-accept-language-header/http/tests/navigation/language/accept-language-header-expected.txt b/third_party/blink/web_tests/platform/generic/virtual/disable-accept-language-header/http/tests/navigation/language/accept-language-header-expected.txt deleted file mode 100644 index a1d8c918..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/disable-accept-language-header/http/tests/navigation/language/accept-language-header-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -Tests the default Accept-Language header - -HTTP Accept-Language header should be: -
diff --git a/third_party/blink/web_tests/platform/generic/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/generic/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index c08d7bb..0000000 --- a/third_party/blink/web_tests/platform/generic/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/generic/webexposed/css-properties-as-js-properties-expected.txt b/third_party/blink/web_tests/platform/generic/webexposed/css-properties-as-js-properties-expected.txt index 3f049e0..abdf893 100644 --- a/third_party/blink/web_tests/platform/generic/webexposed/css-properties-as-js-properties-expected.txt +++ b/third_party/blink/web_tests/platform/generic/webexposed/css-properties-as-js-properties-expected.txt
@@ -218,8 +218,6 @@ gridTemplateColumns gridTemplateRows height -hoverPopUpDelay -hoverPopUpHideDelay hyphens imageOrientation imageRendering @@ -339,6 +337,8 @@ placeItems placeSelf pointerEvents +popUpHideDelay +popUpShowDelay position positionFallback prefix
diff --git a/third_party/blink/web_tests/platform/generic/webexposed/css-property-listing-expected.txt b/third_party/blink/web_tests/platform/generic/webexposed/css-property-listing-expected.txt index f322609a..ddb5a3c4 100644 --- a/third_party/blink/web_tests/platform/generic/webexposed/css-property-listing-expected.txt +++ b/third_party/blink/web_tests/platform/generic/webexposed/css-property-listing-expected.txt
@@ -213,8 +213,6 @@ grid-template-columns grid-template-rows height - hover-pop-up-delay - hover-pop-up-hide-delay hyphens image-orientation image-rendering @@ -301,6 +299,8 @@ perspective perspective-origin pointer-events + pop-up-hide-delay + pop-up-show-delay position position-fallback quotes
diff --git a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-transforms-during-path-expected.png index ad390e9d..c1633cf 100644 --- a/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-transforms-during-path-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/linux/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/linux/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png index 10c5f0c..382795c 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png deleted file mode 100644 index 2d7844c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index 8740310..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.13/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png deleted file mode 100644 index 2d7844c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index 8740310..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.14/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png deleted file mode 100644 index 94016c7e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png deleted file mode 100644 index d82feba..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png deleted file mode 100644 index 9d94d95..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png deleted file mode 100644 index f9cd12f4..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png deleted file mode 100644 index 2d7844c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index 8740310..0000000 --- a/third_party/blink/web_tests/platform/mac-mac10.15/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png deleted file mode 100644 index 94016c7e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png deleted file mode 100644 index 9d94d95..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png deleted file mode 100644 index f9cd12f4..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png deleted file mode 100644 index 8740310..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png deleted file mode 100644 index 94016c7e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png deleted file mode 100644 index d82feba..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png deleted file mode 100644 index 9d94d95..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png deleted file mode 100644 index f9cd12f4..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png b/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png deleted file mode 100644 index 2d7844c..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png deleted file mode 100644 index 94016c7e..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png deleted file mode 100644 index 9d94d95..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png deleted file mode 100644 index f9cd12f4..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-transforms-during-path-expected.png index 4ee9168..34eb2d3 100644 --- a/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-transforms-during-path-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/mac/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png index 934ae01..d508dce3 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png index 2a09fd9..8c9acae 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png index b3cbc604..911309e 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png index 8740310..fd25073 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-transforms-during-path-expected.png index 1d627db3..756b4da0 100644 --- a/third_party/blink/web_tests/platform/win/fast/canvas/canvas-transforms-during-path-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt b/third_party/blink/web_tests/platform/win/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt deleted file mode 100644 index a37f6ac7..0000000 --- a/third_party/blink/web_tests/platform/win/fast/css-grid-layout/preferred-width-computed-after-layout-expected.txt +++ /dev/null
@@ -1,10 +0,0 @@ -This is a testharness.js-based test. -PASS Input 1 test -FAIL Input 2 test assert_equals: Error expected 204 but got 208 -FAIL Input 3 test assert_equals: Error expected 204 but got 208 -PASS Input 4 test -PASS Input 5 test -PASS Input 6 test -PASS Input 7 test -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/win/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png index a9bb261..9507413e 100644 --- a/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/gpu/fast/canvas/canvas-transforms-during-path-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png index 242ff5ea..eec6c51e 100644 --- a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-arc-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png index 14574ee0..b5cbcf5 100644 --- a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png new file mode 100644 index 0000000..afd31eb5 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/oopr-canvas2d/fast/canvas/canvas-ellipse-circumference-fill-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-line-grammar-error-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-line-grammar-error-expected.png deleted file mode 100644 index 9da068a7..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-line-grammar-error-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-line-spelling-error-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-line-spelling-error-expected.png deleted file mode 100644 index f0bf0c21..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-line-spelling-error-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png deleted file mode 100644 index 3d489455..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-skip-ink-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png deleted file mode 100644 index 0f5cb1bd..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png deleted file mode 100644 index e985d8f..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png deleted file mode 100644 index 9da9cee..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-links-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png deleted file mode 100644 index 54641f83..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-not-propagated-by-out-of-flow-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png deleted file mode 100644 index b34df05..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-inherit-simple-underlines-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png b/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png deleted file mode 100644 index 5f8f72c..0000000 --- a/third_party/blink/web_tests/platform/win10/fast/css3-text/css3-text-decoration/text-decoration-style-wavy-font-size-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/virtual/disable-accept-language-header/README.md b/third_party/blink/web_tests/virtual/disable-accept-language-header/README.md deleted file mode 100644 index e9c59b9..0000000 --- a/third_party/blink/web_tests/virtual/disable-accept-language-header/README.md +++ /dev/null
@@ -1 +0,0 @@ -# This suite runs tests with --disable-features=AcceptLanguageHeader
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/aggregatable-debug-report.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/aggregatable-debug-report.sub.https.html index fa289c02..f36768f8 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/aggregatable-debug-report.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/aggregatable-debug-report.sub.https.html
@@ -10,7 +10,6 @@ const trigger_debug_key = '357'; await registerAttributionSrc(t, { source: { - source_event_id: '1', destination: `https://{{host}}`, aggregation_keys: { campaignCounts: "0x159",
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/debug-key.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/debug-key.sub.https.html index ff4cdc46b..c3113bf 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/debug-key.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/debug-key.sub.https.html
@@ -12,7 +12,6 @@ attribution_reporting_promise_test(async t => { await registerAttributionSrc(t, { source: { - source_event_id: '1', destination: `https://{{host}}`, debug_key: forSource ? testCase.debugKey : undefined, },
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-debug-report.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-debug-report.sub.https.html index c2744ce..e291e0a 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-debug-report.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/event-level-debug-report.sub.https.html
@@ -10,7 +10,6 @@ const trigger_debug_key = '357'; await registerAttributionSrc(t, { source: { - source_event_id: '1', destination: `https://{{host}}`, debug_key: source_debug_key, },
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/multiple-event-level-attributions.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/multiple-event-level-attributions.sub.https.html index 3c19234..748d99e 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/multiple-event-level-attributions.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/multiple-event-level-attributions.sub.https.html
@@ -10,7 +10,6 @@ attribution_reporting_promise_test(async t => { await registerAttributionSrc(t, { source: { - source_event_id: '1', destination: `https://{{host}}`, }, method: 'a', @@ -45,10 +44,6 @@ return 0; }); - reports.forEach(report => { - assert_equals(report.source_event_id, '1'); - }); - assert_equals(reports[0].trigger_data, '3'); assert_equals(reports[1].trigger_data, '4'); assert_equals(reports[2].trigger_data, '5');
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report.sub.https.html index c0b259f4..1a96231 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report.sub.https.html
@@ -6,7 +6,6 @@ <script> attribution_reporting_promise_test(async t => { const source = { - source_event_id: '9153495207648170476', destination: `https://{{host}}`, aggregation_keys: { campaignCounts: "0x159",
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/source-registration.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/source-registration.sub.https.html index a9fde608..19ae2bcb 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/source-registration.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/source-registration.sub.https.html
@@ -20,7 +20,6 @@ attribution_reporting_promise_test(async t => { const expectedSourceType = await registerAttributionSrc(t, { source: { - source_event_id: '1', destination: `https://{{host}}`, }, method: 'variant', @@ -34,7 +33,7 @@ assert_equals(payload.reports.length, 1); const report = JSON.parse(payload.reports[0].body); - assert_equals(report.source_event_id, '1'); + assert_equals(report.source_event_id, '0'); assert_equals(report.source_type, expectedSourceType); }, 'Source registration succeeds.'); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-data-sanitization.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-data-sanitization.sub.https.html index d3f228f..571fa066 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-data-sanitization.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-data-sanitization.sub.https.html
@@ -28,7 +28,6 @@ attribution_reporting_promise_test(async t => { await registerAttributionSrc(t, { source: { - source_event_id: '999', destination: `https://{{host}}`, }, method,
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-registration.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-registration.sub.https.html index f46a85fc..5f766d9 100644 --- a/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-registration.sub.https.html +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/trigger-registration.sub.https.html
@@ -17,7 +17,6 @@ <script> attribution_reporting_promise_test(async t => { await registerAttributionSrc(t, {source: { - source_event_id: '1', destination: `https://{{host}}`, }});
diff --git a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/position-fallback-001.html b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/position-fallback-001.html index 2c748af5..5df0455a 100644 --- a/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/position-fallback-001.html +++ b/third_party/blink/web_tests/wpt_internal/css/css-anchor-position/position-fallback-001.html
@@ -7,54 +7,102 @@ <style> .cb { position: relative; - width: 200px; - height: 100px; + width: 190px; + height: 70px; background: yellow; + border-bottom: 1px solid black; } .spacer { width: 1px; - height: 25px; + height: 20px; } .anchor1 { anchor-name: --a1; - margin-left: 50px; + margin-left: 45px; width: 100px; - height: 50px; + height: 30px; background: blue; } .target { position: absolute; position-fallback: --fallback1; - left: anchor(--a1 right); - top: anchor(--a1 top); - width: 100px; - height: 50px; + width: 40px; + height: 15px; + margin: 5px; background: orange; } @position-fallback --fallback1 { - @try { - left: auto; - right: anchor(--a1 left); + @try { /* 1: Position to the right of the anchor. */ + left: anchor(--a1 right); + top: anchor(--a1 top); } - @try { + @try { /* 2: Position to the left of the anchor. */ + right: anchor(--a1 left); + top: anchor(--a1 top); + } + @try { /* 3: Position to the bottom of the anchor. */ + left: anchor(--a1 left); top: anchor(--a1 bottom); } - @try { - top: auto; + @try { /* 4: Position to the top of the anchor. */ + left: anchor(--a1 left); bottom: anchor(--a1 top); } - @try { + @try { /* 5: Position to the left with the narrower width. */ left: anchor(--a1 right); - width: 50px; + top: anchor(--a1 top); + width: 35px; + height: 40px; } } </style> <body onload="checkLayout('.target')"> + <!-- If the `cb` is wider, the 1st `@try` fits. --> + <div class="cb" style="width: 195px"> + <div class="spacer"></div> + <div class="anchor1"></div> + <div class="target" + data-offset-x=150 data-offset-y=25 + data-expected-width=40 data-expected-height=15></div> + </div> + <!-- If the `margin-left` is wider, the 2nd `@try` fits. --> + <div class="cb"> + <div class="spacer"></div> + <div class="anchor1" style="margin-left: 50px"></div> + <div class="target" + data-offset-x=5 data-offset-y=25 + data-expected-width=40 data-expected-height=15></div> + </div> + <!-- Without a spacer, the 3rd `@try` fits. --> + <div class="cb"> + <div class="anchor1"></div> + <div class="target" + data-offset-x=50 data-offset-y=35 + data-expected-width=40 data-expected-height=15></div> + </div> + <!-- With two spacers, the 4th `@try` fits. --> + <div class="cb"> + <div class="spacer"></div> + <div class="spacer"></div> + <div class="anchor1"></div> + <div class="target" + data-offset-x=50 data-offset-y=20 + data-expected-width=40 data-expected-height=15></div> + </div> + <!-- With a spacer, the last `@try` fits. --> <div class="cb"> <div class="spacer"></div> <div class="anchor1"></div> <div class="target" data-offset-x=150 data-offset-y=25 - data-expected-width=50 data-expected-height=50></div> + data-expected-width=35 data-expected-height=40></div> + </div> + <!-- If the `cb` is narrower, no rules fit. The last rule is used. --> + <div class="cb" style="width: 185px"> + <div class="spacer"></div> + <div class="anchor1"></div> + <div class="target" + data-offset-x=150 data-offset-y=25 + data-expected-width=35 data-expected-height=40></div> </div> </body>
diff --git a/third_party/gvr-android-sdk/libgvr_shim_static_arm64_Cr.a.sha1 b/third_party/gvr-android-sdk/libgvr_shim_static_arm64_Cr.a.sha1 index 49f6e615..eb49ac71 100644 --- a/third_party/gvr-android-sdk/libgvr_shim_static_arm64_Cr.a.sha1 +++ b/third_party/gvr-android-sdk/libgvr_shim_static_arm64_Cr.a.sha1
@@ -1 +1 @@ -4d7587416f234194cc64940d2d9a44b013ab6365 \ No newline at end of file +f86c6e7872f7996a8646b63841b63060e2772d5e \ No newline at end of file
diff --git a/third_party/gvr-android-sdk/libgvr_shim_static_arm_Cr.a.sha1 b/third_party/gvr-android-sdk/libgvr_shim_static_arm_Cr.a.sha1 index 3fa8ec3..2df24f2d 100644 --- a/third_party/gvr-android-sdk/libgvr_shim_static_arm_Cr.a.sha1 +++ b/third_party/gvr-android-sdk/libgvr_shim_static_arm_Cr.a.sha1
@@ -1 +1 @@ -aab5e02dacc6dc66f5abdf0c3ce08b73cbf8b8e9 \ No newline at end of file +dfec094416354f624eef6db969a1b65f03cc91ac \ No newline at end of file
diff --git a/third_party/lzma_sdk/README.chromium b/third_party/lzma_sdk/README.chromium index a6d547d..a9da1bea 100644 --- a/third_party/lzma_sdk/README.chromium +++ b/third_party/lzma_sdk/README.chromium
@@ -23,6 +23,11 @@ extract files. 7zr is "lightweight" and only handles 7zip extensions. 7za can handle a few more. 7za.exe comes from https://www.7-zip.org/a/7z2107-extra.7z. +The 7zz (arm64/x86-64) command for macOS is extracted from +https://7-zip.org/a/7z2107-mac.tar.xz. It is necessary to remove +`com.apple.quarantine` file attribute with command `xattr -c` before adding +the file. + The patch in chromium.patch was applied to 7zCrc.c, CpuArch.c, LZFind.c and Sha256.c to disable some ARM code that was failing to build in Android and Fuschia as well as some of the AVX2 and SSE4 code for Windows. In Fuschia,
diff --git a/third_party/lzma_sdk/bin/mac64/7zz b/third_party/lzma_sdk/bin/mac64/7zz new file mode 100755 index 0000000..2f28ba3 --- /dev/null +++ b/third_party/lzma_sdk/bin/mac64/7zz Binary files differ
diff --git a/third_party/lzma_sdk/bin/7za.exe b/third_party/lzma_sdk/bin/win64/7za.exe similarity index 100% rename from third_party/lzma_sdk/bin/7za.exe rename to third_party/lzma_sdk/bin/win64/7za.exe Binary files differ
diff --git a/third_party/lzma_sdk/bin/7zr.exe b/third_party/lzma_sdk/bin/win64/7zr.exe similarity index 100% rename from third_party/lzma_sdk/bin/7zr.exe rename to third_party/lzma_sdk/bin/win64/7zr.exe Binary files differ
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 6fc77e4..bb18a6d3 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: 377dc47c9f2a54ec9b4df7dac3d0419a782f37e3 +Version: 4bf31d18da0faddcf0a39262c743c4ea95de95ac License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/wpt_tools/README.chromium b/third_party/wpt_tools/README.chromium index 2b5c1fe..21e2640 100644 --- a/third_party/wpt_tools/README.chromium +++ b/third_party/wpt_tools/README.chromium
@@ -1,7 +1,7 @@ Name: web-platform-tests - Test Suites for Web Platform specifications Short Name: wpt URL: https://github.com/web-platform-tests/wpt/ -Version: 6cc880d5283965ca9c9b6eb2a8af4ba0c024f872 +Version: 853d9c3a31016504d1a51aa811c9890495a1d442 License: LICENSES FOR W3C TEST SUITES (https://www.w3.org/Consortium/Legal/2008/03-bsd-license.html) License File: NOT_SHIPPED Security Critical: no
diff --git a/third_party/wpt_tools/wpt/tools/wpt/update.py b/third_party/wpt_tools/wpt/tools/wpt/update.py index deaa413..41faeac5 100644 --- a/third_party/wpt_tools/wpt/tools/wpt/update.py +++ b/third_party/wpt_tools/wpt/tools/wpt/update.py
@@ -25,7 +25,7 @@ def update_expectations(_, **kwargs): - from wptrunner import metadata, products, wptcommandline + from wptrunner import metadata, wptcommandline commandline.setup_logging("web-platform-tests", kwargs, @@ -39,22 +39,12 @@ if not kwargs["manifest_path"]: kwargs["manifest_path"] = os.path.join(wpt_root, "MANIFEST.json") - if "product" not in kwargs["extra_property"]: - kwargs["extra_property"].append("product") - - use_wptrunner_update_props = kwargs.get("product") is not None - kwargs = wptcommandline.check_args_metadata_update(kwargs) - # By default update according to product. - # If we passed in the name of a product, then use the configured update properties - # for that product. - if use_wptrunner_update_props: - update_properties = products.load_product_update(kwargs["config"], kwargs["product"]) - if kwargs["extra_property"]: - update_properties[0].extend(kwargs["extra_property"]) - else: - update_properties = (kwargs["extra_property"], {}) + update_properties = metadata.get_properties(properties_file=kwargs["properties_file"], + extra_properties=kwargs["extra_property"], + config=kwargs["config"], + product=kwargs["product"]) manifest_update(kwargs["test_paths"]) metadata.update_expected(kwargs["test_paths"],
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py index 4a76316..3ae9711 100644 --- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py +++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/metadata.py
@@ -10,6 +10,7 @@ from sys import intern from . import manifestupdate +from . import products from . import testloader from . import wptmanifest from . import wpttest @@ -51,6 +52,72 @@ return list(self.items()) +def get_properties(properties_file=None, extra_properties=None, config=None, product=None): + """Read the list of properties to use for updating metadata. + + :param properties_file: Path to a JSON file containing properties. + :param extra_properties: List of extra properties to use + :param config: (deprecated) wptrunner config + :param Product: (deprecated) product name (requires a config argument to be used) + """ + properties = [] + dependents = {} + + if properties_file is not None: + logger.debug(f"Reading update properties from {properties_file}") + try: + with open(properties_file) as f: + data = json.load(f) + msg = None + if "properties" not in data: + msg = "Properties file missing 'properties' key" + elif not isinstance(data["properties"], list): + msg = "Properties file 'properties' value must be a list" + elif not all(isinstance(item, str) for item in data["properties"]): + msg = "Properties file 'properties' value must be a list of strings" + elif "dependents" in data: + dependents = data["dependents"] + if not isinstance(dependents, dict): + msg = "Properties file 'dependent_properties' value must be an object" + elif (not all(isinstance(dependents[item], list) and + all(isinstance(item_value, str) + for item_value in dependents[item]) + for item in dependents)): + msg = ("Properties file 'dependent_properties' values must be lists of" + + " strings") + if msg is not None: + logger.error(msg) + raise ValueError(msg) + + properties = data["properties"] + except OSError: + logger.critical(f"Error opening properties file {properties_file}") + raise + except ValueError: + logger.critical(f"Error parsing properties file {properties_file}") + raise + elif product is not None: + logger.warning("Falling back to getting metadata update properties from wptrunner browser " + "product file, this will be removed") + if config is None: + msg = "Must provide a config together with a product" + logger.critical(msg) + raise ValueError(msg) + + properties, dependents = products.load_product_update(config, product) + + if extra_properties is not None: + properties.extend(extra_properties) + + properties_set = set(properties) + if any(item not in properties_set for item in dependents.keys()): + msg = "All 'dependent' keys must be in 'properties'" + logger.critical(msg) + raise ValueError(msg) + + return properties, dependents + + def update_expected(test_paths, log_file_names, update_properties, full_update=False, disable_intermittent=None, update_intermittent=False, remove_intermittent=False, **kwargs):
diff --git a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py index dab42db..115e9de 100644 --- a/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py +++ b/third_party/wpt_tools/wpt/tools/wptrunner/wptrunner/wptcommandline.py
@@ -655,6 +655,12 @@ print("Log file %s is a directory" % item, file=sys.stderr) sys.exit(1) + if kwargs["properties_file"] is None and not kwargs["no_properties_file"]: + default_file = os.path.join(kwargs["test_paths"]["/"]["metadata_path"], + "update_properties.json") + if os.path.exists(default_file): + kwargs["properties_file"] = default_file + return kwargs @@ -677,8 +683,9 @@ parser = argparse.ArgumentParser("web-platform-tests-update", description="Update script for web-platform-tests tests.") + # This will be removed once all consumers are updated to the properties-file based system parser.add_argument("--product", action="store", choices=product_choices, - default=None, help="Browser for which metadata is being updated") + default=None, help=argparse.SUPPRESS) parser.add_argument("--config", action="store", type=abs_path, help="Path to config file") parser.add_argument("--metadata", action="store", type=abs_path, dest="metadata_root", help="Path to the folder containing test metadata"), @@ -697,8 +704,14 @@ help="Remove obsolete intermittent statuses from expected statuses.") parser.add_argument("--no-remove-obsolete", action="store_false", dest="remove_obsolete", default=True, help="Don't remove metadata files that no longer correspond to a test file") + parser.add_argument("--properties-file", + help="""Path to a JSON file containing run_info properties to use in update. This must be of the form + {"properties": [<name>], "dependents": {<property name>: [<name>]}}""") + parser.add_argument("--no-properties-file", action="store_true", + help="Don't use the default properties file at " + "${metadata_root}/update_properties.json, even if it exists.") parser.add_argument("--extra-property", action="append", default=[], - help="Extra property from run_info.json to use in metadata update") + help="Extra property from run_info.json to use in metadata update.") # TODO: Should make this required iff run=logfile parser.add_argument("run_log", nargs="*", type=abs_path, help="Log file from run of tests")
diff --git a/tools/binary_size/libsupersize/dwarfdump.py b/tools/binary_size/libsupersize/dwarfdump.py index f357a0dc..1aa3326 100755 --- a/tools/binary_size/libsupersize/dwarfdump.py +++ b/tools/binary_size/libsupersize/dwarfdump.py
@@ -9,12 +9,90 @@ import dataclasses import logging import os +import re import subprocess import typing import path_util +_DWARF_DUMP_FLAGS = ['--debug-info', '--recurse-depth=0'] + +# Matching and group examples: +# '0x00001234: DW_TAG_compile_unit' -> None +# ' DW_AT_low_pc (0x123)' -> ('DW_', None) +# ' DW_AT_name ("foo")' -> ('DW_', 'foo') +_RE_DW_AT_NAME = re.compile(r'\s+(DW_)(?:AT_name\s+\("(.*?)"\))?') + + +class _DwoNameLookup: + """Helper to look up name (source file) from .dwo files + + dwarfdump of an ELF file normally specifies source files in DW_AT_name fields. + However, debug fission can move debug info from ELF files to .dwo files. In + this case, dwarfdump would omit DW_AT_name of affected symbols, and use + DW_AT_GNU_dwo_name to specify the path (relative to output dir) of the + matching .dwo files, whose dwarfdump would then specify the matching source + file in DW_AT_name. + + This class performs cached lookup from .dwo to name (source file). + """ + + def __init__(self, any_path): + finder = path_util.OutputDirectoryFinder( + any_path_within_output_directory=any_path) + self._output_path = finder.Detect() # May be None. + self._dwarf_dump_path = path_util.GetDwarfdumpPath() + self._cache = {} + + def _ReadName(self, dwo_path): + """Runs dwarfdump on .dwo to extract name. + + If this is not possible then returns |dwo_path|. + """ + if self._output_path is None: + return dwo_path + # Assumption: |dwo_path| is relative to output path. + real_dwo_path = os.path.join(self._output_path, dwo_path) + cmd = [self._dwarf_dump_path, real_dwo_path] + _DWARF_DUMP_FLAGS + proc = subprocess.Popen(cmd, + stdout=subprocess.PIPE, + stderr=subprocess.DEVNULL, + encoding='utf-8') + name = None + state = 0 + # Scan output line by line, exit and terminate as soon as possible. + for line in iter(proc.stdout.readline, ''): + if state == 0: # Scan for DW_TAG_compile_unit. + if 'DW_TAG_compile_unit' in line: + state = 1 + elif state == 1: # scan for DW_AT_name. + m = _RE_DW_AT_NAME.match(line) + if not m: # Not even matching prefix ' DW_'. + break + name = m.groups()[1] + if name is not None: # Extracted names. + break + # Else matches ' DW_': Continue scanning. + proc.kill() + return dwo_path if name is None else name + + def Lookup(self, dwo_path): + """Looks up name in .dwo, with caching.""" + if dwo_path in self._cache: + name = self._cache[dwo_path] + else: + name = self._ReadName(dwo_path) + self._cache[dwo_path] = name + return name + + def LogStats(self): + if self._cache: + num_success = sum(1 for k, v in self._cache.items() if k != v) + logging.info('Successful .dwo lookups: %d / %d', num_success, + len(self._cache)) + + @dataclasses.dataclass(order=True) class _AddressRange: start: int @@ -59,29 +137,24 @@ return _SourceMapper(_Parse(elf_path)) -def CreateAddressSourceMapperForTest(lines): - return _SourceMapper(_ParseDumpOutput(lines)) +def CreateAddressSourceMapperForTest(lines, dwo_name_lookup=None): + return _SourceMapper(_ParseDumpOutput(lines, dwo_name_lookup)) -def ParseDumpOutputForTest(lines): - return _ParseDumpOutput(lines) +def ParseDumpOutputForTest(lines, dwo_name_lookup=None): + return _ParseDumpOutput(lines, dwo_name_lookup) def _Parse(elf_path): - cmd = [ - path_util.GetDwarfdumpPath(), - elf_path, - '--debug-info', - '--recurse-depth=0', - ] + cmd = [path_util.GetDwarfdumpPath(), elf_path] + _DWARF_DUMP_FLAGS logging.debug('Running: %s', ' '.join(cmd)) stdout = subprocess.check_output(cmd, stderr=subprocess.DEVNULL, encoding='utf-8') - return _ParseDumpOutput(stdout.splitlines()) + return _ParseDumpOutput(stdout.splitlines(), _DwoNameLookup(elf_path)) -def _ParseDumpOutput(lines): +def _ParseDumpOutput(lines, dwo_name_lookup=None): """Parses passed-in dwarfdump stdout.""" # List of (_AddressRange, source path) tuples. @@ -94,11 +167,17 @@ line = next(line_it, None) continue - line, address_ranges, source_path = _ParseCompileUnit(line_it) - if source_path and address_ranges: + line, address_ranges, source_path, dwo_path = _ParseCompileUnit(line_it) + if (source_path or dwo_path) and address_ranges: for address_range in address_ranges: + if dwo_path: + source_path = (dwo_name_lookup.Lookup(dwo_path) + if dwo_name_lookup else dwo_path) range_info_list.append((address_range, source_path)) + if dwo_name_lookup: + dwo_name_lookup.LogStats() + return sorted(range_info_list) @@ -107,11 +186,13 @@ Example: 0x000026: DW_AT_compile_unit - DW_AT_low_pc (0x02f) + DW_AT_low_pc (0x02f) DW_AT_high_pc (0x03f) - DW_AT_name (foo.cc) + DW_AT_name ("foo.cc") + DW_AT_GNU_dwo_name ("foo.dwo") """ source_path = None + dwo_path = None single_range = _AddressRange(0, 0) range_addresses = [] @@ -129,21 +210,19 @@ assert single_range.start == 0 elif single_range.start > 0: range_addresses.append(single_range) - return (line, range_addresses, source_path) + return (line, range_addresses, source_path, dwo_path) if line.startswith('DW_AT_low_pc', dw_index): single_range.start = int(_ExtractDwValue(line), 16) if single_range.stop == 0: single_range.stop = single_range.start + 1 - continue - if line.startswith('DW_AT_high_pc', dw_index): + elif line.startswith('DW_AT_high_pc', dw_index): single_range.stop = int(_ExtractDwValue(line), 16) - continue - if line.startswith('DW_AT_name', dw_index): + elif line.startswith('DW_AT_name', dw_index): source_path = _ExtractDwValue(line) - continue - - if line.startswith('DW_AT_ranges', dw_index): + elif line.startswith('DW_AT_GNU_dwo_name', dw_index): + dwo_path = _ExtractDwValue(line) + elif line.startswith('DW_AT_ranges', dw_index): range_addresses = _ParseRanges(line_it) @@ -180,9 +259,9 @@ """Extract DW_AT_ value from dwarfdump stdout. Examples: - DW_AT_name ("foo.cc") - DW_AT_decl_line (177) - DW_AT_low_pc (0x2) + DW_AT_name ("foo.cc") + DW_AT_decl_line (177) + DW_AT_low_pc (0x2) """ lparen_index = line.rfind('(') if lparen_index < 0: @@ -208,9 +287,12 @@ format='%(levelname).1s %(relativeCreated)6d %(message)s') if args.dwarf_dump_output: + dwo_name_lookup = _DwoNameLookup(args.dwarf_dump_output) with open(args.dwarf_dump_output, 'r') as f: - source_mapper = CreateAddressSourceMapperForTest(f.read().splitlines()) + source_mapper = CreateAddressSourceMapperForTest(f.read().splitlines(), + dwo_name_lookup) else: + assert args.elf_file source_mapper = CreateAddressSourceMapper(args.elf_file) logging.warning('Found %d source paths across %d ranges', source_mapper.NumberOfPaths(), source_mapper.num_ranges)
diff --git a/tools/cast3p/cast_core.version b/tools/cast3p/cast_core.version index bd5a9c9..1a9cdc3 100644 --- a/tools/cast3p/cast_core.version +++ b/tools/cast3p/cast_core.version
@@ -1 +1 @@ -cast_20220722_1034_RC00 +cast_20220805_0600_RC00
diff --git a/tools/cast3p/runtime.version b/tools/cast3p/runtime.version index 8dcca9fd..1c8f78cd 100644 --- a/tools/cast3p/runtime.version +++ b/tools/cast3p/runtime.version
@@ -1 +1 @@ -311537 +312047
diff --git a/tools/grit/preprocess_if_expr.gni b/tools/grit/preprocess_if_expr.gni index 4a278768..7ad04fb 100644 --- a/tools/grit/preprocess_if_expr.gni +++ b/tools/grit/preprocess_if_expr.gni
@@ -10,7 +10,10 @@ # Declare deps of preprocess_if_expr.py as inputs as well, to re-trigger # preprocess_if_expr() targets whenever those change. - inputs = [ "//tools/grit/grit/node/base.py" ] + inputs = [ + "//tools/grit/grit/node/base.py", + "//tools/grit/grit/format/html_inline.py", + ] forward_variables_from(invoker, [
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 86afcf8..fcc22d5 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -7984,6 +7984,16 @@ </description> </action> +<action name="Extensions.ContextMenu.Hosts.PermissionsPageClicked"> + <owner>emiliapaz@chromium.org</owner> + <owner>extensions-core@chromium.org</owner> + <description> + The user clicked the "Permissions page" option in the runtime host + permissions section of an extension's context menu. This is recorded for + both keyboard and mouse activations. + </description> +</action> + <action name="Extensions.ExtensionDisabled"> <owner>archanasimha@chromium.org</owner> <description>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 53a6301..024cbe4 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -32117,6 +32117,7 @@ <int value="997" label="DeviceAutofillSAMLUsername"/> <int value="998" label="EnterpriseProfileCreationKeepBrowsingData"/> <int value="999" label="KerberosDomainAutocomplete"/> + <int value="1000" label="KerberosDefaultConfiguration"/> </enum> <enum name="EnterprisePoliciesSources"> @@ -36251,6 +36252,14 @@ label="Associate Account Dismissed By OS After Learn More Pressed"/> </enum> +<enum name="FastPairSavedDevicesUiEvent"> + <int value="0" label="Settings - saved device list subpage shown"/> + <int value="1" label="Settings - user has devices saved to their account"/> + <int value="2" label="Settings - remove saved device dialog"/> + <int value="3" + label="Settings - remove confirmed on remove saved device dialog"/> +</enum> + <enum name="FastPairVersion"> <int value="0" label="v1"/> <int value="1" label="v2"/> @@ -63936,8 +63945,8 @@ <int value="719" label="anchor-name"/> <int value="720" label="position-fallback"/> <int value="721" label="anchor-scroll"/> - <int value="722" label="hover-pop-up-delay"/> - <int value="723" label="hover-pop-up-hide-delay"/> + <int value="722" label="pop-up-show-delay"/> + <int value="723" label="pop-up-hide-delay"/> </enum> <enum name="MappedEditingCommands"> @@ -74588,6 +74597,7 @@ <int value="14" label="PD Sink"/> <int value="15" label="PD Sinking Host"/> <int value="16" label="Non-PD Sink"/> + <int value="17" label="Power Brick"/> </enum> <enum name="PassiveForcedListenerResultType"> @@ -84198,7 +84208,7 @@ <int value="1" label="IndividualKey"/> <int value="2" label="FourZoneFortyLed"/> <int value="3" label="FourZoneTwelveLed"/> - <int value="4" label="FourZoneFifteenLed"/> + <int value="4" label="FourZoneFourLed"/> </enum> <enum name="RoamingUserDataDirectoryDeletionResult">
diff --git a/tools/metrics/histograms/metadata/bluetooth/histograms.xml b/tools/metrics/histograms/metadata/bluetooth/histograms.xml index 9c053066..eab92c1 100644 --- a/tools/metrics/histograms/metadata/bluetooth/histograms.xml +++ b/tools/metrics/histograms/metadata/bluetooth/histograms.xml
@@ -918,6 +918,17 @@ </summary> </histogram> +<histogram name="Bluetooth.ChromeOS.FastPair.SavedDevices.UiEvent" + enum="FastPairSavedDevicesUiEvent" expires_after="2022-09-20"> + <owner>julietlevesque@google.com</owner> + <owner>chromeos-cross-device-eng@google.com</owner> + <summary> + Records events that happen in the Fast Pair Saved Devices Settings UI, e.g. + when a surface is shown. This is emitted a single time for each event that + occurs. + </summary> +</histogram> + <histogram name="Bluetooth.ChromeOS.FastPair.SavedDevices.UpdateOptInStatus.Result.{FastPairPairingProtocol}" enum="BooleanSuccess" expires_after="2022-09-20">
diff --git a/tools/metrics/histograms/metadata/cookie/histograms.xml b/tools/metrics/histograms/metadata/cookie/histograms.xml index de30ae8d..c7f0244 100644 --- a/tools/metrics/histograms/metadata/cookie/histograms.xml +++ b/tools/metrics/histograms/metadata/cookie/histograms.xml
@@ -274,6 +274,33 @@ </summary> </histogram> +<histogram name="Cookie.FirstPartySets.ContextDelayedQueriesCount" + units="queries" expires_after="M110"> + <owner>shuuran@chromium.org</owner> + <owner>kaustubhag@chromium.org</owner> + <summary> + The number of queries that were delayed for a browser context (i.e. answered + asynchronously instead of synchronously). + + Recorded once per profile during log-in when the First-Party Sets info is + ready for the network context. If the feature was disabled, 0 is recorded. + </summary> +</histogram> + +<histogram name="Cookie.FirstPartySets.ContextMostDelayedQueryDelta" units="ms" + expires_after="M110"> + <owner>shuuran@chromium.org</owner> + <owner>kaustubhag@chromium.org</owner> + <summary> + The length of time between when the first asynchronous query was received, + and when asynchronous queries started to be answered for a browser context. + + Recorded once per profile profile during log-in when the First-Party Sets + info is ready in the network context. Recorded for all clients, even those + with low-resolution clocks. If the feature was disabled, 0 is recorded. + </summary> +</histogram> + <histogram name="Cookie.FirstPartySets.DelayedQueriesCount" units="queries" expires_after="M110"> <owner>cfredric@chromium.org</owner> @@ -338,6 +365,7 @@ restarts.) Recorded for all clients, even those with low-resolution clocks. </summary> <token key="Landmark"> + <variant name="ContextReadyToServeQueries"/> <variant name="ReadCommandLineSet"/> <variant name="ReadComponentSets"/> <variant name="ReadPersistedSets"/>
diff --git a/tools/metrics/histograms/metadata/download/histograms.xml b/tools/metrics/histograms/metadata/download/histograms.xml index ab4c9db..54370e9 100644 --- a/tools/metrics/histograms/metadata/download/histograms.xml +++ b/tools/metrics/histograms/metadata/download/histograms.xml
@@ -61,9 +61,14 @@ </variants> <histogram name="Download.ApiFunctions" enum="DownloadFunctions" - expires_after="2020-03-08"> + expires_after="2023-02-02"> <owner>dtrainor@chromium.org</owner> - <summary>Downloads extension API function calls.</summary> + <owner>xinghuilu@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <summary> + Downloads extension API function calls. Warning: this histogram was expired + from 2020-03-08 to 2022-08-02; data may be missing. + </summary> </histogram> <histogram name="Download.AttachmentServices.Duration" units="ms"
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index b586d2b..93b249b 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -94,36 +94,6 @@ </summary> </histogram> -<histogram name="Enterprise.AppRestrictionLoadTime2" units="ms" - expires_after="2021-04-04"> - <owner>twellington@google.com</owner> - <owner>tedchcoc@chromium.org</owner> - <summary> - Records the time it takes to retrieve applicaton restrictions from the - system. Android only. - </summary> -</histogram> - -<histogram name="Enterprise.AppRestrictionLoadTime2.EmptyBundle" units="ms" - expires_after="2021-08-09"> - <owner>twellington@google.com</owner> - <owner>tedchcoc@chromium.org</owner> - <summary> - Records the time it takes to retrieve applicaton restrictions from the - system when the retrieved Bundle is empty. Android only. - </summary> -</histogram> - -<histogram name="Enterprise.AppRestrictionLoadTime2.NonEmptyBundle" units="ms" - expires_after="2021-08-09"> - <owner>twellington@google.com</owner> - <owner>tedchcoc@chromium.org</owner> - <summary> - Records the time it takes to retrieve applicaton restrictions from the - system when the retrieved Bundle is not empty. Android only. - </summary> -</histogram> - <histogram name="Enterprise.AttributesTPMConsistency" enum="EnterpriseAttributesTPMConsistencyType" expires_after="never"> <!-- expires-never: Needed for health check. -->
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 23f1ed5..fd17c6a3 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -5778,6 +5778,28 @@ </summary> </histogram> +<histogram name="Feedback.ChromeOSApp.IncludedEmail" units="boolean" + expires_after="2023-07-27"> + <owner>longbowei@google.com</owner> + <owner>xiangdongkong@google.com</owner> + <owner>cros-feedback-app@google.com</owner> + <summary> + Records whether the email is included when the feedback report is submitted. + Fires when user's feedback report is being sent. + </summary> +</histogram> + +<histogram name="Feedback.ChromeOSApp.IncludedFile" units="boolean" + expires_after="2023-07-27"> + <owner>longbowei@google.com</owner> + <owner>xiangdongkong@google.com</owner> + <owner>cros-feedback-app@google.com</owner> + <summary> + Records whether attached file is included when the feedback report is + submitted. Fires when user's feedback report is being sent. + </summary> +</histogram> + <histogram name="Feedback.ChromeOSApp.IncludedScreenshot" units="boolean" expires_after="2023-07-27"> <owner>longbowei@google.com</owner> @@ -5789,6 +5811,28 @@ </summary> </histogram> +<histogram name="Feedback.ChromeOSApp.IncludedSystemInfo" units="boolean" + expires_after="2023-07-27"> + <owner>longbowei@google.com</owner> + <owner>xiangdongkong@google.com</owner> + <owner>cros-feedback-app@google.com</owner> + <summary> + Records whether the system and information is included when the feedback + report is submitted. Fires when a user's feedback report is being sent. + </summary> +</histogram> + +<histogram name="Feedback.ChromeOSApp.IncludedUrl" units="boolean" + expires_after="2023-07-27"> + <owner>longbowei@google.com</owner> + <owner>xiangdongkong@google.com</owner> + <owner>cros-feedback-app@google.com</owner> + <summary> + Records whether the page url is included when the feedback report is + submitted. Fires when user's feedback report is being sent. + </summary> +</histogram> + <histogram name="Feedback.ChromeOSApp.Openduration" units="ms" expires_after="2023-07-15"> <owner>longbowei@google.com</owner>
diff --git a/tools/metrics/ukm/ukm.xml b/tools/metrics/ukm/ukm.xml index 472a5d36..e87b080 100644 --- a/tools/metrics/ukm/ukm.xml +++ b/tools/metrics/ukm/ukm.xml
@@ -10593,7 +10593,7 @@ Reflects the current status of user gesture/activation. This is a bit field with the following values: - 0b0001 if there is a user gesture on the stack; - 0b0010 if there was a user gesture on the page (ie. was - activated); - 0b0100 if there was a user gesture propogated after a + activated); - 0b0100 if there was a user gesture propagated after a navigation. </summary> </metric>
diff --git a/tools/visual_debugger/app.html b/tools/visual_debugger/app.html index 8fb1c7db..c6f8d8e 100644 --- a/tools/visual_debugger/app.html +++ b/tools/visual_debugger/app.html
@@ -192,17 +192,6 @@ </div> <div class='panelSection'> - <div class='sectionTitle'> - <i class="material-icons-outlined"> - water - </i> - Threads - </div> - - <div id='threads' class='section'></div> -</div> - -<div class='panelSection'> <div class='sectionTitle'>Viewer Controls</div> <div class='section' id='controls'> <div id='buttons'> @@ -281,17 +270,6 @@ </div> </div> -<div style='margin-right: 10px' id='importtracing'> - <div class='sectionTitle'>Tracing (Prototype)...</div> - <div class='section'> - <button id='importtracebutton' class="mdc-button mdc-button--outline" - title="Import tracing data (json) into visual debugger app."> - <div class="mdc-button__ripple"></div> - <span class="mdc-button__label">Import Trace</span> - </button> - </div> -</div> - <script> function processIncomingFrame(json) { if (!json) return;
diff --git a/tools/visual_debugger/filter.js b/tools/visual_debugger/filter.js index 5f537b4..479d849a 100644 --- a/tools/visual_debugger/filter.js +++ b/tools/visual_debugger/filter.js
@@ -21,79 +21,16 @@ get anno() { return this.anno_; } }; -// Represents a thread making a debug call to -// the visual debugger. -// -class Thread { - // Keeps track of all threads that debug calls came in from - // while the app is running. - static registered_threads = {}; - - constructor(json) { - this.threadName_ = json.thread_name; - // Calls from each thread is enabled by default. - this.enabled_ = true; - - // Add new thread to a pool of thread objects. - Thread.registered_threads[this.threadName_] = this; - - // Create thread filter chip. - this.createThreadFilterChip() - } - - static isThreadRegistered(threadName) { - // If thread already registered, return true. - return (threadName in Thread.registered_threads); - } - - createThreadFilterChip() { - const threadFilters = document.querySelector('#threads'); - const threadChip = document.createElement('div'); - - threadChip.style = 'display:inline-block; margin-right: 10px'; - - // Create checkbox for each thread chip. - const checkbox = document.createElement('input'); - checkbox.type = 'checkbox'; - checkbox.id = this.threadName_; - checkbox.name = this.threadName_; - // Check off checkbox by default as calls from each thread - // are enabled by default. - checkbox.checked = true; - - checkbox.addEventListener('click', () => { - Thread.registered_threads[this.threadName_].toggleEnableThread(); - Player.instance.refresh(); - }); - - // Add label to checkbox with the name of the thread. - const checkboxLabel = document.createElement('label'); - checkboxLabel.for = this.threadName_; - checkboxLabel.innerHTML = this.threadName_; - - threadChip.appendChild(checkbox); - threadChip.appendChild(checkboxLabel); - // Add to DOM list of thread checkbox filters. - threadFilters.appendChild(threadChip); - } - - toggleEnableThread() { - this.enabled_ = !this.enabled_; - } -} - // Represents a draw call. // This is currently only used for drawing rect. But this (or something like // this) could potentially be also used for drawing logs etc. // class DrawCall { constructor(json) { - // e.g. {"drawindex":"44", option":{"alpha":"1.000000","color":"#ffffff"} - // ,"pos":"0.000000,763.000000","size":"255x5","source_index":"0", - // "thread_id":"123456"} + // e.g. {"drawindex":"44","option":{"alpha":"1.000000","color":"#ffffff"} + // ,"pos":"0.000000,763.000000","size":"255x5","source_index":"0"} this.sourceIndex_ = parseInt(json.source_index); this.drawIndex_ = parseInt(json.drawindex); - this.threadId_ = parseInt(json.thread_id); this.size_ = { width: json.size[0], height: json.size[1],
diff --git a/tools/visual_debugger/frame.js b/tools/visual_debugger/frame.js index 056ef9f..40f161f 100644 --- a/tools/visual_debugger/frame.js +++ b/tools/visual_debugger/frame.js
@@ -39,8 +39,7 @@ // Represents a single frame, and contains all associated data. // class DrawFrame { - // Circular buffer supports 2^14 frames. - static maxBufferNumFrames = 16384; + static maxBufferNumFrames = 10000; static frameBuffer = new CircularBuffer(DrawFrame.maxBufferNumFrames); static buffer_map = new Object(); static count() { return DrawFrame.frameBuffer.instances.length; } @@ -59,19 +58,6 @@ this.drawTexts_ = json.text; this.drawCalls_ = json.drawcalls.map(c => new DrawCall(c)); this.buffer_map = json.buff_map; - - this.thread_mapping_ = {} - - json.threads.forEach(t => { - // If new thread has not been registered yet, then register it. - if (!(Thread.isThreadRegistered(t.thread_name))) { - new Thread(t); - }; - // Map thread id's to thread name and enabled state. - this.thread_mapping_[t.thread_id] = {threadName: t.thread_name, - threadEnabled: true} - }); - this.submissionFreezeIndex_ = -1; if (json.new_sources) { for (const s of json.new_sources) { @@ -170,24 +156,11 @@ } draw(canvas, context, scale, orientationDeg, transformMatrix) { - // Look at global state of which threads have been enabled/disabled and - // map the states to the current frame's threads. - for (const threadId of Object.keys(this.thread_mapping_)) { - const mappedThread = this.thread_mapping_[threadId]; - mappedThread.threadEnabled = - Thread.registered_threads[mappedThread.threadName].enabled_; - } - for (const call of this.drawCalls_) { - if (call.drawIndex_ > this.submissionFreezeIndex()) break; - - // If thread not enabled, then skip draw call from this thread. - if (!this.thread_mapping_[call.threadId_].threadEnabled) { - continue; - } - + if (call.drawIndex_ > this.submissionFreezeIndex()) + break; call.draw(canvas, context, scale, orientationDeg, - transformMatrix, DrawFrame.buffer_map); + transformMatrix, DrawFrame.buffer_map); } context.fillStyle = 'black'; @@ -201,11 +174,6 @@ context.fillText(this.num_, newFrameNumPos[0], newFrameNumPos[1]); for (const text of this.drawTexts_) { - // If thread not enabled, then skip text calls from this thread. - if (!this.thread_mapping_[text.thread_id].threadEnabled) { - continue; - } - const textPosX = text.pos[0]; const textPosY = text.pos[1];
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc index bcb01bd..5010869b 100644 --- a/ui/accessibility/accessibility_features.cc +++ b/ui/accessibility/accessibility_features.cc
@@ -146,7 +146,7 @@ } const base::Feature kAccessibilityOSSettingsVisibility{ - "AccessibilityOSSettingsVisibility", base::FEATURE_ENABLED_BY_DEFAULT}; + "AccessibilityOSSettingsVisibility", base::FEATURE_DISABLED_BY_DEFAULT}; bool IsAccessibilityOSSettingsVisibilityEnabled() { return base::FeatureList::IsEnabled(
diff --git a/ui/accessibility/ax_tree.cc b/ui/accessibility/ax_tree.cc index ecb0283..38256f64 100644 --- a/ui/accessibility/ax_tree.cc +++ b/ui/accessibility/ax_tree.cc
@@ -802,9 +802,9 @@ { ScopedTreeUpdateInProgressStateSetter tree_update_in_progress(*this); - - DestroyNodeAndSubtree(root_, nullptr); - root_ = nullptr; + // ExtractAsDangling clears the underlying pointer and returns another + // raw_ptr instance that is allowed to dangle. + DestroyNodeAndSubtree(root_.ExtractAsDangling(), nullptr); } // tree_update_in_progress. }
diff --git a/ui/accessibility/ax_tree.h b/ui/accessibility/ax_tree.h index 9f0870cc..0686f564 100644 --- a/ui/accessibility/ax_tree.h +++ b/ui/accessibility/ax_tree.h
@@ -389,7 +389,7 @@ bool allow_recursion) const; base::ObserverList<AXTreeObserver> observers_; - raw_ptr<AXNode, DanglingUntriaged> root_ = nullptr; + raw_ptr<AXNode> root_ = nullptr; std::string error_; AXTreeData data_; base::flat_map<AXNodeID, std::unique_ptr<AXNode>> id_map_;
diff --git a/ui/chromeos/translations/ui_chromeos_strings_af.xtb b/ui/chromeos/translations/ui_chromeos_strings_af.xtb index d234fee..bce328d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_af.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_af.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Outo-opstelling-URL:</translation> <translation id="2288278176040912387">Platespeler</translation> <translation id="2291538123825441971">Maak tans <ph name="NUMBER_OF_FILES" /> lêers oop.</translation> -<translation id="2303282178633578561">Sluit SIM-kaart</translation> <translation id="2303301624314357662">Maak tans lêer <ph name="FILE_NAME" /> oop.</translation> <translation id="2304820083631266885">Planeet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> is uitgegooi.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Jou onlangse lêers sal hier verskyn</translation> <translation id="2578394532502990878">Tamil-foneties</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Jou admin vereis dat jy SIM-slot deaktiveer.</translation> <translation id="2602810353103180630">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Seinsterkte <ph name="SIGNAL_STRENGTH" />%, Geblokkeer deur jou administrateur, Besonderhede</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-video</translation> -<translation id="2617342710774726426">SIM-kaart is gesluit</translation> <translation id="2620090360073999360">Google Drive kan nie op hierdie oomblik bereik word nie.</translation> <translation id="2621713457727696555">Beveilig</translation> <translation id="2638942478653899953">Google Drive kon nie bereik word nie. <ph name="BEGIN_LINK" />Meld asseblief af<ph name="END_LINK" /> en meld dan weer aan.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Letties</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" />-filter is af.</translation> <translation id="5494920125229734069">Kies almal</translation> -<translation id="5500104704744051184">Jy sal nie hierdie netwerk kan gebruik totdat jy die PUK ingevoer het nie</translation> <translation id="5500122897333236901">Yslands</translation> <translation id="5508696409934741614">Kolle</translation> <translation id="5522908512596376669">Lêerlys het na lysaansig toe verander.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Kon nie netwerk opstel nie</translation> <translation id="7839804798877833423">Dit sal ongeveer <ph name="FILE_SIZE" /> mobiele data gebruik om hierdie lêers te gaan haal.</translation> <translation id="7846076177841592234">Kanselleer keuse</translation> -<translation id="7847617962681804761">PIN word vereis om mobiele data te gebruik</translation> <translation id="7853966320808728790">Franse BÉPO</translation> <translation id="7857117644404132472">Voeg uitsondering by</translation> <translation id="7868774406711971383">Pools</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Sinkroniseer tans <ph name="NUMBER_OF_FILES" /> items …</translation> <translation id="8600173386174225982">Lêerlys het na kleinkiekieaansig toe verander.</translation> <translation id="8601932370724196034">Crostini-prentlêer</translation> -<translation id="8608515571837163082">’n Verkeerde PIN is te veel kere ingevoer. Voer die persoonlike deblokkeringsleutel (PUK) van 8 syfers in wat deur die diensverskaffer verskaf is.</translation> <translation id="8609695766746872526">Yslands</translation> <translation id="863903787380594467">Verkeerde PIN. Jy het <ph name="RETRIES" /> pogings oor.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Poort</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_am.xtb b/ui/chromeos/translations/ui_chromeos_strings_am.xtb index a40f2a5..ee9642f5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_am.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_am.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">የራስ-ውቅር ዩአርኤል፦</translation> <translation id="2288278176040912387">የሙዚቃ ማጫወቻ</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ፋይሎችን በመክፈት ላይ።</translation> -<translation id="2303282178633578561">ሲም ካርድን ቆልፍ</translation> <translation id="2303301624314357662">ፋይል <ph name="FILE_NAME" />ን በመክፈት ላይ።</translation> <translation id="2304820083631266885">ፕላኔት</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ወጥቷል።</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">የእርስዎ የቅርብ ጊዜ ፋይሎች እዚህ ይታያሉ</translation> <translation id="2578394532502990878">ታሚልኛ ፎነቲክ</translation> <translation id="2579959351793446050">ኦዲያ</translation> -<translation id="2593644851255584939">የእርስዎ አስተዳዳሪ የሲም ቁልፍን እንዲያሰናክሉ ይፈልግብዎታል።</translation> <translation id="2602810353103180630">አውታረ መረብ <ph name="NETWORK_INDEX" /> ከ<ph name="NETWORK_COUNT" />፣ <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />፣ የሲግናል ጥንካሬ <ph name="SIGNAL_STRENGTH" />%፣ በአስተዳዳሪዎ የታገደ፣ ዝርዝሮች</translation> <translation id="2614589611416690597">የ<ph name="VIDEO_TYPE" /> ቪዲዮ</translation> -<translation id="2617342710774726426">ሲም ካርድ ተዘግቷል</translation> <translation id="2620090360073999360">Google Drive በዚህ ጊዜ ሊደረስበት አይችልም።</translation> <translation id="2621713457727696555">ደህንነቱ ተጠብቋል</translation> <translation id="2638942478653899953">Google Drive ሊደረስበት አልተቻለም። እባክዎ <ph name="BEGIN_LINK" />ዘግተው ይውጡ<ph name="END_LINK" />ና ተመልሰው ይግቡ።</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">ላትቪያኛ</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ማጣሪያ ጠፍቷል።</translation> <translation id="5494920125229734069">ሁሉንም ይመርጣል</translation> -<translation id="5500104704744051184">PUKውን እስካላስገቡ ድረስ ይህን አውታረ መረብ ሊጠቀሙበት አይችሉም</translation> <translation id="5500122897333236901">አይስላንድኛ</translation> <translation id="5508696409934741614">ነጥቦች</translation> <translation id="5522908512596376669">የፋይል ዝርዝር ወደ ዝርዝር ዕይታ ተለውጧል።</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">አውታረ መረብን ማዋቀር ላይ ስህተት</translation> <translation id="7839804798877833423">እነዚህን ፋይሎች ማምጣት <ph name="FILE_SIZE" /> ገደማ የተንቀሳቃሽ ስልክ ውሂብ ይጠቀማል።</translation> <translation id="7846076177841592234">ምርጫ ሰርዝ</translation> -<translation id="7847617962681804761">ሞባይል ውሂብን ለመጠቀም ፒን ያስፈልጋል።</translation> <translation id="7853966320808728790">የፈረንሳይኛ BÉPO</translation> <translation id="7857117644404132472">ለየት ያሉትን ያክሉ</translation> <translation id="7868774406711971383">ፖላንድኛ</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ንጥሎችን በማመሳሰል ላይ...</translation> <translation id="8600173386174225982">የፋይል ዝርዝር ወደ ድንክየ ዕይታ ተለውጧል።</translation> <translation id="8601932370724196034">የCrostini ምስል ፋይል</translation> -<translation id="8608515571837163082">የተሳሳተ ፒን ከልክ በላይ ብዙ ጊዜ ገብቷል። በአገልግሎት አቅራቢው የቀረበውን ባለ 8-አሃዝ የግል እገዳውን ማንሻ ቁልፍ (PUK) ያስገቡ።</translation> <translation id="8609695766746872526">አይስላንድኛ</translation> <translation id="863903787380594467">የተሳሳተ ፒን። እርስዎ <ph name="RETRIES" /> ቀሪ ሙከራዎች አሉዎት።</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ወደብ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb index d3feae50..b9965b1e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ar.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ar.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">عنوان URL للإعداد التلقائي:</translation> <translation id="2288278176040912387">مشغّل أقراص مسجلة</translation> <translation id="2291538123825441971">جارٍ فتح <ph name="NUMBER_OF_FILES" /> من الملفات.</translation> -<translation id="2303282178633578561">قفل شريحة SIM</translation> <translation id="2303301624314357662">جارٍ فتح ملف <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">كوكب</translation> <translation id="2305020378527873881">تم إخراج <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ستظهر هنا أحدث الملفات.</translation> <translation id="2578394532502990878">التاميلية الصوتية</translation> <translation id="2579959351793446050">الأوديا</translation> -<translation id="2593644851255584939">يطلب منك المشرف إيقاف "قفل شريحة SIM".</translation> <translation id="2602810353103180630">الشبكة <ph name="NETWORK_INDEX" /> من <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، قوة الإشارة <ph name="SIGNAL_STRENGTH" />%، حجب المشرف هذه الشبكة، التفاصيل</translation> <translation id="2614589611416690597">ملف فيديو <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">تم قفل شريحة SIM</translation> <translation id="2620090360073999360">لا يمكن الوصول إلى Google Drive في الوقت الحالي.</translation> <translation id="2621713457727696555">مؤمّنة</translation> <translation id="2638942478653899953">تعذر الوصول إلى Google Drive. يُرجى <ph name="BEGIN_LINK" />الخروج<ph name="END_LINK" /> ثم تسجيل الدخول مرة أخرى.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">اللاتفية</translation> <translation id="5489965683297092283">تم إيقاف الفلتر <ph name="FILTER_NAME" />.</translation> <translation id="5494920125229734069">اختيار الكل</translation> -<translation id="5500104704744051184">لن تتمكّن من استخدام هذه الشبكة إلى بعد إدخال رمز PUK.</translation> <translation id="5500122897333236901">الأيسلندية</translation> <translation id="5508696409934741614">نقاط</translation> <translation id="5522908512596376669">تم تغيير قائمة الملفات إلى عرض القائمة.</translation> @@ -811,7 +807,6 @@ <translation id="7831491651892296503">حدث خطأ أثناء إعداد الشبكة</translation> <translation id="7839804798877833423">سيؤدي جلب هذه الملفات إلى استخدام حوالي <ph name="FILE_SIZE" /> من بيانات الجوال.</translation> <translation id="7846076177841592234">إلغاء الاختيار</translation> -<translation id="7847617962681804761">يجب إدخال رقم التعريف الشخصي لاستخدام بيانات الجوّال.</translation> <translation id="7853966320808728790">BÉPO الفرنسية</translation> <translation id="7857117644404132472">إضافة استثناء</translation> <translation id="7868774406711971383">البولندية</translation> @@ -906,7 +901,6 @@ <translation id="8579285237314169903">جارٍ مزامنة <ph name="NUMBER_OF_FILES" /> من البنود...</translation> <translation id="8600173386174225982">تم تغيير قائمة الملف إلى عرض الصور المصغرة.</translation> <translation id="8601932370724196034">ملف صورة Crostini</translation> -<translation id="8608515571837163082">لقد أدخلت رقم تعريف شخصي غير صحيح عدّة مرات. أدخِل مفتاح إزالة الحظر (PUK) المكوّن من 8 أرقام والمتوفّر من خلال مشغّل شبكة الجوّال.</translation> <translation id="8609695766746872526">الآيسلندية</translation> <translation id="863903787380594467">رقم التعريف الشخصي غير صحيح. يتبقى لديك <ph name="RETRIES" /> محاولة.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - منفذ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_as.xtb b/ui/chromeos/translations/ui_chromeos_strings_as.xtb index 5eabb31..0fbf9f7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_as.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_as.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">স্বয়ংক্ৰিয় কনফিগাৰেশ্বন URL:</translation> <translation id="2288278176040912387">ৰেকৰ্ড প্লেয়াৰ</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" />টা ফাইল খুলি থকা হৈছে</translation> -<translation id="2303282178633578561">ছিম কাৰ্ড লক কৰক</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ফাইলটো খুলি থকা হৈছে।</translation> <translation id="2304820083631266885">গ্ৰহ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> সুৰক্ষিতভাৱে গুচোৱা হ’ল।</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">আপোনাৰ শেহতীয়া ফাইলসমূহ ইয়াত প্ৰদৰ্শিত হ’ব</translation> <translation id="2578394532502990878">তামিল ফ’নেটিক</translation> <translation id="2579959351793446050">ওড়িয়া</translation> -<translation id="2593644851255584939">আপোনাৰ প্ৰশাসকে আপুনি ছিমৰ লক অক্ষম কৰাটো বিচাৰে।</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> টা নেটৱৰ্কৰ <ph name="NETWORK_INDEX" /> নম্বৰটো, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ছিগনেলৰ ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, আপোনাৰ প্ৰশাসকে অৱৰোধ কৰিছে, সবিশেষ</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ভিডিঅ’</translation> -<translation id="2617342710774726426">ছিম কাৰ্ড লক কৰা হৈছে</translation> <translation id="2620090360073999360">এই মুহূৰ্তত Google Driveৰ সৈতে সংযোগ স্থাপন কৰিব নোৱাৰি।</translation> <translation id="2621713457727696555">সুৰক্ষিত</translation> <translation id="2638942478653899953">Google Drive পাব পৰা অৱস্থাত নাই। অনুগ্ৰহ কৰি <ph name="BEGIN_LINK" />লগ আউট কৰক<ph name="END_LINK" /> আৰু পুনৰ লগ ইন কৰক।</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">লাটভিয়ান</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ফিল্টাৰটো অফ হৈ আছে।</translation> <translation id="5494920125229734069">সকলো বাছনি কৰক</translation> -<translation id="5500104704744051184">আপুনি PUKটো নিদিয়া পৰ্যন্ত এই নেটৱৰ্কটো ব্যৱহাৰ কৰিব নোৱাৰিব</translation> <translation id="5500122897333236901">আইচলেণ্ডীয়</translation> <translation id="5508696409934741614">ডট্</translation> <translation id="5522908512596376669">ফাইলৰ সূচীখন সূচী ভিউ ম'ডলৈ সলনি কৰা হৈছে।</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">নেটৱৰ্ক কনফিগাৰ কৰাত আসোঁৱাহ</translation> <translation id="7839804798877833423">এই ফাইলবোৰ বিচাৰি আনিবলৈ ম’বাইল ডেটাৰ প্ৰায় <ph name="FILE_SIZE" /> খৰচ হ’ব৷</translation> <translation id="7846076177841592234">বাছনি বাতিল কৰক</translation> -<translation id="7847617962681804761">ম'বাইল ডেটা ব্যৱহাৰ কৰিবলৈ পিনটোৰ আৱশ্যক</translation> <translation id="7853966320808728790">ফৰাছী বেপ’</translation> <translation id="7857117644404132472">ব্যতিক্ৰম যোগ কৰক</translation> <translation id="7868774406711971383">প’লিশ্ব</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" />টা বস্তু ছিংক কৰি থকা হৈছে...</translation> <translation id="8600173386174225982">ফাইলৰ সূচীখন থাম্বনেইল ভিউ ম'ডলৈ সলনি কৰা হৈছে।</translation> <translation id="8601932370724196034">Crostini প্ৰতিচ্ছবিৰ ফাইল</translation> -<translation id="8608515571837163082">বহুবাৰ এটা ভুল পিন দিয়া হৈছে। বাহকে প্ৰদান কৰা ৮ টা অংকৰ অৱৰোধৰ পৰা আঁতৰোৱাৰ ব্যক্তিগত কীটো (PUK) দিয়ক।</translation> <translation id="8609695766746872526">আইচলেণ্ডীয়</translation> <translation id="863903787380594467">ভুল পিন। আপোনাৰ <ph name="RETRIES" /> টা প্ৰয়াস বাকী আছে।</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - প’ৰ্ট</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_az.xtb b/ui/chromeos/translations/ui_chromeos_strings_az.xtb index 99a8f62..c53b85e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_az.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_az.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Avtokonfiqurasiya URL-i:</translation> <translation id="2288278176040912387">Rekord oyunçu</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> fayl açılır.</translation> -<translation id="2303282178633578561">SİM kartı kilidləyin</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> faylı açılır.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> çıxarılıb.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Son fayllarınız burada görünəcək</translation> <translation id="2578394532502990878">Tamil dili (Fonetik)</translation> <translation id="2579959351793446050">Oriya dili</translation> -<translation id="2593644851255584939">Administratorunuz SİM Kilidi deaktiv etməyinizi tələb edir.</translation> <translation id="2602810353103180630">Şəbəkə <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Siqnal Gücü <ph name="SIGNAL_STRENGTH" />%, Administrator tərəfindən bloklanıb, Detallar</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> videosu</translation> -<translation id="2617342710774726426">SIM kart kilidlənib</translation> <translation id="2620090360073999360">Hazırda Google Diskə daxil olmaq mümkün deyil.</translation> <translation id="2621713457727696555">Güvənli</translation> <translation id="2638942478653899953">Google Diskə daxil olmaq alınmadı. Lütfən, <ph name="BEGIN_LINK" />hesabdan çıxın<ph name="END_LINK" /> və yenidən daxil olun.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Latış</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> filtri deaktivdir.</translation> <translation id="5494920125229734069">Hamısını seçin</translation> -<translation id="5500104704744051184">PUK kodu daxil edilənə qədər bu şəbəkədən istifadə edə bilməyəcəksiniz</translation> <translation id="5500122897333236901">İsland</translation> <translation id="5508696409934741614">Nöqtə</translation> <translation id="5522908512596376669">Fayl siyahısı siyahı görünüşünə dəyişdirilib.</translation> @@ -807,7 +803,6 @@ <translation id="7831491651892296503">Şəbəkə konfiqurasiya xətası</translation> <translation id="7839804798877833423">Bu faylların əldə edilməsi təxminən <ph name="FILE_SIZE" /> mobil data istifadə edəcək.</translation> <translation id="7846076177841592234">Seçimi ləğv edin</translation> -<translation id="7847617962681804761">Mobil datadan istifadə etmək üçün PIN tələb olunur</translation> <translation id="7853966320808728790">Fransız BÉPO</translation> <translation id="7857117644404132472">İstisna əlavə edin</translation> <translation id="7868774406711971383">Polyak</translation> @@ -902,7 +897,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> element sinxronlaşır...</translation> <translation id="8600173386174225982">Fayl siyahısı miniatür görünüşünə dəyişdirilib.</translation> <translation id="8601932370724196034">Crostini şəkil faylı</translation> -<translation id="8608515571837163082">Yanlış PİN kod dəfələrlə daxil edilib. Pperator tərəfindən təmin edilən 8 rəqəmli Şəxsi Blokdan Çıxarma Açarını (PUK) daxil edin.</translation> <translation id="8609695766746872526">İsland</translation> <translation id="863903787380594467">Yanlış PIN. <ph name="RETRIES" /> cəhdiniz qalıb.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_be.xtb b/ui/chromeos/translations/ui_chromeos_strings_be.xtb index a758266227..b8ce1031 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_be.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_be.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL-адрас аўтаматычнай канфігурацыі:</translation> <translation id="2288278176040912387">Патэфон</translation> <translation id="2291538123825441971">Адкрываюцца некалькі файлаў (<ph name="NUMBER_OF_FILES" />) .</translation> -<translation id="2303282178633578561">Заблакіраваць SIM-карту</translation> <translation id="2303301624314357662">Адкрываецца файл "<ph name="FILE_NAME" />".</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881">Носьбіт <ph name="VOLUME_NAME" /> выняты.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Вашы нядаўнія файлы будуць з'яўляцца тут</translation> <translation id="2578394532502990878">Тамільская (фанетычная раскладка)</translation> <translation id="2579959351793446050">Орыя</translation> -<translation id="2593644851255584939">Ваш адміністратар патрабуе, каб вы адключылі блакіроўку SIM-карты.</translation> <translation id="2602810353103180630">Сетка <ph name="NETWORK_INDEX" /> з <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, заблакіравана адміністратарам, магутнасць сігналу – <ph name="SIGNAL_STRENGTH" />%, падрабязныя звесткі</translation> <translation id="2614589611416690597">Відэа <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM-карта заблакіравана</translation> <translation id="2620090360073999360">Зараз звязацца з Google Дыскам не ўдалося.</translation> <translation id="2621713457727696555">Абаронена</translation> <translation id="2638942478653899953">Не ўдалося атрымаць доступ да Google Дыска. <ph name="BEGIN_LINK" />Выйдзіце<ph name="END_LINK" /> і зноў увайдзіце ва ўліковы запіс.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Ачысціць сметніцу</translation> <translation id="5163869187418756376">Збой абагульвання. Праверце падключэнне і паўтарыце спробу пазней.</translation> <translation id="516592729076796170">Праграмісцкая Дворака для ЗША</translation> +<translation id="5172749059808361023">Звесткі пра абмежаванні</translation> <translation id="5177526793333269655">Рэжым мініяцюр</translation> <translation id="5194713942430106590">Каб адсартаваць слупок па ўзрастанні, націсніце тут.</translation> <translation id="5211614973734216083">Фарэрская</translation> @@ -528,7 +526,6 @@ <translation id="5489067830765222292">Латышская</translation> <translation id="5489965683297092283">Выключаны фільтр "<ph name="FILTER_NAME" />".</translation> <translation id="5494920125229734069">Выбраць усё</translation> -<translation id="5500104704744051184">Вы не зможаце выкарыстоўваць гэту сетку, пакуль не ўведзяце PUK-код</translation> <translation id="5500122897333236901">Ісландская</translation> <translation id="5508696409934741614">Кропкі</translation> <translation id="5522908512596376669">Спіс файлаў перайшоў у рэжым спіса.</translation> @@ -809,7 +806,6 @@ <translation id="7831491651892296503">Памылка наладжвання сеткі</translation> <translation id="7839804798877833423">Каб атрымаць гэтыя файлы, будзе выкарыстана прыкладна <ph name="FILE_SIZE" /> мабільнага трафіка.</translation> <translation id="7846076177841592234">Скасаваць выбар</translation> -<translation id="7847617962681804761">Каб выкарыстоўваць мабільную перадачу даных, трэба ўвесці PIN-код</translation> <translation id="7853966320808728790">Французская раскладка клавіятуры BÉPO</translation> <translation id="7857117644404132472">Дадаць выключэнне</translation> <translation id="7868774406711971383">Польская</translation> @@ -904,7 +900,6 @@ <translation id="8579285237314169903">Ідзе сінхранізацыя элементаў (<ph name="NUMBER_OF_FILES" />)...</translation> <translation id="8600173386174225982">Спіс файлаў перайшоў у рэжым мініяцюр.</translation> <translation id="8601932370724196034">Файл вобраза Crostini</translation> -<translation id="8608515571837163082">Занадта шмат разоў быў уведзены няправільны PIN-код. Увядзіце 8-значны PUK-код, атрыманы ад аператара.</translation> <translation id="8609695766746872526">Ісландская</translation> <translation id="863903787380594467">Няправільны PIN-код. Засталося спроб: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – порт</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb index 28ea358..08d6f4f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bg.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bg.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL адрес за автоматично конфигуриране:</translation> <translation id="2288278176040912387">Грамофон</translation> <translation id="2291538123825441971">Отварят се <ph name="NUMBER_OF_FILES" /> файла.</translation> -<translation id="2303282178633578561">Заключване на SIM картата</translation> <translation id="2303301624314357662">Файлът „<ph name="FILE_NAME" />“ се отваря.</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881">Изваждането на „<ph name="VOLUME_NAME" />“ завърши.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Скорошните ви файлове ще се показват тук</translation> <translation id="2578394532502990878">Тамилски (фонетична клавиатура)</translation> <translation id="2579959351793446050">Одия</translation> -<translation id="2593644851255584939">Администраторът ви изисква да деактивирате заключването на SIM картата.</translation> <translation id="2602810353103180630">Мрежа <ph name="NETWORK_INDEX" /> от <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, сила на сигнала <ph name="SIGNAL_STRENGTH" />%, блокирана от администратора ви, подробности</translation> <translation id="2614589611416690597">Видеоклип във формат <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM картата е заключена</translation> <translation id="2620090360073999360">В момента няма връзка с Google Диск.</translation> <translation id="2621713457727696555">защитена</translation> <translation id="2638942478653899953">Не можа да се установи връзка с Google Диск. Моля, <ph name="BEGIN_LINK" />излезте от профила си<ph name="END_LINK" /> и влезте отново.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Латвийски</translation> <translation id="5489965683297092283">Филтърът „<ph name="FILTER_NAME" />“ е изключен.</translation> <translation id="5494920125229734069">Избиране на всички</translation> -<translation id="5500104704744051184">Няма да можете да използвате тази мрежа, докато не въведете PUK кода</translation> <translation id="5500122897333236901">исландски</translation> <translation id="5508696409934741614">Точки</translation> <translation id="5522908512596376669">Списъкът с файлове е превключен към списъчен изглед.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Грешка при конфигурирането на мрежата</translation> <translation id="7839804798877833423">При извличането на тези файлове ще се използват приблизително <ph name="FILE_SIZE" /> мобилни данни.</translation> <translation id="7846076177841592234">Анулиране на избора</translation> -<translation id="7847617962681804761">За използването на мобилни данни се изисква ПИН код</translation> <translation id="7853966320808728790">френски (BÉPO)</translation> <translation id="7857117644404132472">Добавяне на изключение</translation> <translation id="7868774406711971383">Полски</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> елемента се синхронизират...</translation> <translation id="8600173386174225982">Списъкът с файлове е превключен към изглед с миниизображения.</translation> <translation id="8601932370724196034">Файл с образ на Crostini</translation> -<translation id="8608515571837163082">Въведохте грешен ПИН код твърде много пъти. Въведете 8-цифрения PUK код, предоставен от оператора.</translation> <translation id="8609695766746872526">Исландски</translation> <translation id="863903787380594467">Неправилен ПИН код. Остават ви <ph name="RETRIES" /> опита.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Порт</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb index 7b67810..411b7f4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bn.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">স্বতঃকনফিগারেশান URL:</translation> <translation id="2288278176040912387">রেকর্ড প্লেয়ার</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" />টি ফাইল খোলা হচ্ছে।</translation> -<translation id="2303282178633578561">সিম কার্ড লক করুন</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> খোলা হচ্ছে।</translation> <translation id="2304820083631266885">গ্রহ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> সরিয়ে দেওয়া হয়েছে।</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">আপনার সাম্প্রতিক ফাইল এখানে দেখা যাবে</translation> <translation id="2578394532502990878">তামিল ফোনেটিক</translation> <translation id="2579959351793446050">ওড়িয়া</translation> -<translation id="2593644851255584939">আপনার অ্যাডমিনিস্ট্রেটর চান যে আপনি সিম কার্ড লক বন্ধ করুন।</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />টি নেটওয়ার্কের মধ্যে <ph name="NETWORK_INDEX" /> নম্বর নেটওয়ার্ক, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, সিগন্যাল ক্ষমতা <ph name="SIGNAL_STRENGTH" />%, আপনার অ্যাডমিনিস্ট্রেটর ব্লক করেছেন, বিবরণ</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ভিডিও</translation> -<translation id="2617342710774726426">সিম কার্ড লক করা আছে</translation> <translation id="2620090360073999360">এই সময়ে Google ড্রাইভে পৌঁছানো যাবে না৷</translation> <translation id="2621713457727696555">সুরক্ষিত</translation> <translation id="2638942478653899953">Google ড্রাইভে পৌঁছানো যাবে না৷ অনুগ্রহ করে <ph name="BEGIN_LINK" />লগ-আউট<ph name="END_LINK" /> করুন এবং আবার লগ-ইন করুন৷</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">ট্র্যাশ খালি করুন</translation> <translation id="5163869187418756376">শেয়ার করে ব্যর্থ হয়েছে৷ আপনার সংযোগটি পরীক্ষা করে পরে আবার চেষ্টা করুন৷</translation> <translation id="516592729076796170">মার্কিন যুক্তরাষ্ট্র প্রোগ্রামার ডিভোরাক</translation> +<translation id="5172749059808361023">সীমাবদ্ধতার বিবরণ</translation> <translation id="5177526793333269655">থাম্বনেল ভিউ</translation> <translation id="5194713942430106590">কলামের মানগুলি ছোট থেকে বড় ক্রমানুযায়ী সাজাতে ক্লিক করুন।</translation> <translation id="5211614973734216083">ফ্যারোইজ</translation> @@ -528,7 +526,6 @@ <translation id="5489067830765222292">লাতভিয়ান</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ফিল্টার বন্ধ আছে।</translation> <translation id="5494920125229734069">সকল বেছে নিন</translation> -<translation id="5500104704744051184">আপনি PUK না লেখা পর্যন্ত এই নেটওয়ার্ক ব্যবহার করতে পারবেন না</translation> <translation id="5500122897333236901">আইসল্যান্ডিক</translation> <translation id="5508696409934741614">বিন্দু</translation> <translation id="5522908512596376669">লিস্ট ভিউতে ফাইলের তালিকা পরিবর্তিত হয়েছে।</translation> @@ -809,7 +806,6 @@ <translation id="7831491651892296503">নেটওয়ার্ক কনফিগার করার সময় ত্রুটি</translation> <translation id="7839804798877833423">এই ফাইলগুলি আনতে আনুমানিক মোবাইল ডেটা <ph name="FILE_SIZE" /> ব্যবহার হবে</translation> <translation id="7846076177841592234">নির্বাচন বাতিল করুন</translation> -<translation id="7847617962681804761">মোবাইল ডেটা ব্যবহার করতে পিন লাগবে</translation> <translation id="7853966320808728790">ফরাসি BÉPO</translation> <translation id="7857117644404132472">ব্যতিক্রম যোগ করুন</translation> <translation id="7868774406711971383">পোলিশ</translation> @@ -904,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" />টি আইটেম সিঙ্ক করা হচ্ছে...</translation> <translation id="8600173386174225982">থাম্বনেল ভিউতে ফাইলের তালিকা পরিবর্তিত হয়েছে।</translation> <translation id="8601932370724196034">Crostini ছবির ফাইল</translation> -<translation id="8608515571837163082">একটি ভুল পিন অনেকবার লেখা হয়েছে। আপনার পরিষেবা প্রদানকারীর থেকে পাওয়া ৮-সংখ্যার 'পার্সোনাল আনব্লকিং কী' (PUK) লিখুন।</translation> <translation id="8609695766746872526">আইসল্যান্ডিক</translation> <translation id="863903787380594467">ভুল পিন দিয়েছেন। আপনি আর <ph name="RETRIES" /> বার চেষ্টা করতে পারবেন।</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - পোর্ট</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb index 12816a2..e425669 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_bs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_bs.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL za automatsku konfiguraciju:</translation> <translation id="2288278176040912387">Gramofon</translation> <translation id="2291538123825441971">Broj fajlova koji se trenutno otvara: <ph name="NUMBER_OF_FILES" />.</translation> -<translation id="2303282178633578561">Zaključaj SIM karticu</translation> <translation id="2303301624314357662">Otvaranje datoteke <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> je izbačen.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Vaši nedavni fajlovi će se prikazati ovdje</translation> <translation id="2578394532502990878">tamilski fonetski</translation> <translation id="2579959351793446050">odija</translation> -<translation id="2593644851255584939">Vaš administrator traži da onemogućite zaključavanje SIM-a.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. mreža od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, blokirao vaš administrator, detalji</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> videozapis</translation> -<translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2620090360073999360">Trenutno nije moguće pristupiti usluzi Google Disk.</translation> <translation id="2621713457727696555">Osigurano</translation> <translation id="2638942478653899953">Pristupanje Google Disku nije uspjelo. <ph name="BEGIN_LINK" />Odjavite se<ph name="END_LINK" /> te se ponovo prijavite.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Isprazni Otpad</translation> <translation id="5163869187418756376">Dijeljenje nije uspjelo. Provjerite vezu i pokušajte ponovo kasnije.</translation> <translation id="516592729076796170">SAD programer Dvorak</translation> +<translation id="5172749059808361023">Pojedinosti ograničenja</translation> <translation id="5177526793333269655">Prikaz minijatura</translation> <translation id="5194713942430106590">Kliknite da poredate kolonu uzlaznim poretkom.</translation> <translation id="5211614973734216083">farski</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">latvijski</translation> <translation id="5489965683297092283">Filter <ph name="FILTER_NAME" /> je isključen.</translation> <translation id="5494920125229734069">Odaberi sve</translation> -<translation id="5500104704744051184">Nećete moći koristiti ovu mrežu dok ne unesete PUK</translation> <translation id="5500122897333236901">Islandska</translation> <translation id="5508696409934741614">Točke</translation> <translation id="5522908512596376669">Spisak fajlova je izmijenjen na prikaz spiska.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Greška prilikom konfiguriranja mreže</translation> <translation id="7839804798877833423">Preuzimanje ovih fajlova potrošit će otprilike <ph name="FILE_SIZE" /> podataka na mobilnoj mreži.</translation> <translation id="7846076177841592234">Otkazivanje odabira</translation> -<translation id="7847617962681804761">Potreban je PIN da koristite prijenos podataka na mobilnoj mreži</translation> <translation id="7853966320808728790">Francuska BÉPO</translation> <translation id="7857117644404132472">Dodaj izuzetak</translation> <translation id="7868774406711971383">poljski</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Sinhroniziranje sljedećeg broja stavki: <ph name="NUMBER_OF_FILES" /></translation> <translation id="8600173386174225982">Spisak fajlova je izmijenjen na prikaz sličica.</translation> <translation id="8601932370724196034">Crostini fajl slike</translation> -<translation id="8608515571837163082">Pogrešan PIN je unesen previše puta. Unesite osmocifreni lični ključ za deblokiranje (PUK) koji vam je dao operater.</translation> <translation id="8609695766746872526">islandski</translation> <translation id="863903787380594467">Pogrešan PIN. Broj preostalih pokušaja: <ph name="RETRIES" /></translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – priključak</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb index 56ea56f9..a686e17 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ca.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ca.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de configuració automàtica:</translation> <translation id="2288278176040912387">Tocadiscos</translation> <translation id="2291538123825441971">S'estan obrint <ph name="NUMBER_OF_FILES" /> fitxers.</translation> -<translation id="2303282178633578561">Bloqueja la targeta SIM</translation> <translation id="2303301624314357662">S'està obrint el fitxer <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">S'ha expulsat <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Els teus fitxers recents es mostraran aquí</translation> <translation id="2578394532502990878">Tàmil fonètic</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">L'administrador necessita que desactivis el bloqueig de la SIM.</translation> <translation id="2602810353103180630">Xarxa <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, <ph name="SIGNAL_STRENGTH" />% d'intensitat del senyal, bloquejada per l'administrador, detalls</translation> <translation id="2614589611416690597">Vídeo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">La targeta SIM està bloquejada</translation> <translation id="2620090360073999360">No es pot contactar amb Google Drive en aquest moment.</translation> <translation id="2621713457727696555">Segura</translation> <translation id="2638942478653899953">No s'ha pogut accedir a Google Drive. <ph name="BEGIN_LINK" />Tanqueu la sessió<ph name="END_LINK" /> i torneu-la a iniciar.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Letó</translation> <translation id="5489965683297092283">El filtre <ph name="FILTER_NAME" /> està desactivat.</translation> <translation id="5494920125229734069">Selecciona-ho tot</translation> -<translation id="5500104704744051184">No podràs utilitzar aquesta xarxa fins que no introdueixis el PUK</translation> <translation id="5500122897333236901">Islandès</translation> <translation id="5508696409934741614">Punts</translation> <translation id="5522908512596376669">La llista de fitxers ha canviat a la visualització de llista.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">S'ha produït un error en configurar la xarxa</translation> <translation id="7839804798877833423">Per obtenir aquests fitxers s'utilitzaran aproximadament <ph name="FILE_SIZE" /> de dades mòbils.</translation> <translation id="7846076177841592234">Cancel·la la selecció</translation> -<translation id="7847617962681804761">Es requereix un PIN per utilitzar dades mòbils</translation> <translation id="7853966320808728790">BÉPO francès</translation> <translation id="7857117644404132472">Afegeix una excepció</translation> <translation id="7868774406711971383">Polonès</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">S'estan sincronitzant <ph name="NUMBER_OF_FILES" /> elements...</translation> <translation id="8600173386174225982">La llista de fitxers ha canviat a la visualització de miniatures.</translation> <translation id="8601932370724196034">Fitxer d'imatge de Crostini</translation> -<translation id="8608515571837163082">S'ha introduït un PIN incorrecte massa vegades. Introdueix el número personal de desbloqueig (PUK) de 8 dígits proporcionat per l'operador.</translation> <translation id="8609695766746872526">Islandès</translation> <translation id="863903787380594467">El PIN no és correcte. Et queden <ph name="RETRIES" /> intents.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb index 99c1b936..16ecbc9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cs.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cs.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Adresa URL automatické konfigurace:</translation> <translation id="2288278176040912387">Gramofon</translation> <translation id="2291538123825441971">Otevírání <ph name="NUMBER_OF_FILES" /> souborů.</translation> -<translation id="2303282178633578561">Zamykat SIM kartu</translation> <translation id="2303301624314357662">Otevírání souboru <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Svazek <ph name="VOLUME_NAME" /> byl odpojen.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Tady se zobrazí vaše nedávné soubory</translation> <translation id="2578394532502990878">tamilština (fonetická)</translation> <translation id="2579959351793446050">urijština</translation> -<translation id="2593644851255584939">Váš administrátor vyžaduje, abyste deaktivovali zámek SIM karty.</translation> <translation id="2602810353103180630">Síť <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, síla signálu: <ph name="SIGNAL_STRENGTH" /> %, blokováno administrátorem, podrobnosti</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM karta je uzamčena</translation> <translation id="2620090360073999360">Disk Google není momentálně k dispozici.</translation> <translation id="2621713457727696555">Zabezpečeno</translation> <translation id="2638942478653899953">Disk Google nelze použít. <ph name="BEGIN_LINK" />Odhlaste se prosím<ph name="END_LINK" /> a opět se přihlaste.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">lotyština</translation> <translation id="5489965683297092283">Filtr <ph name="FILTER_NAME" /> je vypnutý.</translation> <translation id="5494920125229734069">Vybrat vše</translation> -<translation id="5500104704744051184">Tuto síť budete moci používat až po zadání kódu PUK</translation> <translation id="5500122897333236901">islandština</translation> <translation id="5508696409934741614">Tečky</translation> <translation id="5522908512596376669">Seznam souborů byl změněn na seznamové zobrazení.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Chyba při konfiguraci sítě</translation> <translation id="7839804798877833423">Načtení souborů spotřebuje přibližně <ph name="FILE_SIZE" /> mobilních dat.</translation> <translation id="7846076177841592234">Zrušit výběr</translation> -<translation id="7847617962681804761">K používání mobilních dat je potřeba PIN</translation> <translation id="7853966320808728790">Francouzská klávesnice BÉPO</translation> <translation id="7857117644404132472">Přidat výjimku</translation> <translation id="7868774406711971383">polština</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Synchronizace <ph name="NUMBER_OF_FILES" /> položek...</translation> <translation id="8600173386174225982">Seznam souborů se změnil na zobrazení miniatur.</translation> <translation id="8601932370724196034">Soubor obrazu Crostini</translation> -<translation id="8608515571837163082">Příliš mnohokrát jste zadali nesprávný PIN. Zadejte osmimístný kód PUK, který vám poskytl operátor.</translation> <translation id="8609695766746872526">islandština</translation> <translation id="863903787380594467">Nesprávný PIN. Počet zbývajících pokusů: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb index 5e00ce85..7acea2b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_cy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_cy.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL awtoffurffweddu:</translation> <translation id="2288278176040912387">Chwaraeydd recordiau</translation> <translation id="2291538123825441971">Wrthi'n agor <ph name="NUMBER_OF_FILES" /> ffeil.</translation> -<translation id="2303282178633578561">Cloi cerdyn SIM</translation> <translation id="2303301624314357662">Yn agor ffeil <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planed</translation> <translation id="2305020378527873881">Mae <ph name="VOLUME_NAME" /> wedi'i dynnu.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Bydd eich ffeiliau diweddar yn ymddangos yma</translation> <translation id="2578394532502990878">Tamileg Seinegol</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Mae eich gweinyddwr yn gofyn i chi analluogi Clo SIM.</translation> <translation id="2602810353103180630">Rhwydwaith <ph name="NETWORK_INDEX" /> o <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Cryfder Signal <ph name="SIGNAL_STRENGTH" />%, Rhwystrwyd gan eich Gweinyddwr, Manylion</translation> <translation id="2614589611416690597">Fideo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Mae'r cerdyn SIM wedi'i gloi</translation> <translation id="2620090360073999360">Ni ellir cyrraedd Google Drive ar hyn o bryd.</translation> <translation id="2621713457727696555">Diogel</translation> <translation id="2638942478653899953">Ni ellid cyrraedd Google Drive. <ph name="BEGIN_LINK" />Allgofnodwch<ph name="END_LINK" /> a mewngofnodwch eto.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Latfieg</translation> <translation id="5489965683297092283">Mae'r hidlydd <ph name="FILTER_NAME" /> wedi'i ddiffodd.</translation> <translation id="5494920125229734069">Dewis pob un</translation> -<translation id="5500104704744051184">Ni fyddwch yn gallu defnyddio'r rhwydwaith hwn nes i chi roi'r PUK</translation> <translation id="5500122897333236901">Islandeg</translation> <translation id="5508696409934741614">Dotiau</translation> <translation id="5522908512596376669">Mae'r rhestr ffeiliau wedi newid i wedd rhestr.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Bu gwall wrth ffurfweddu'r rhwydwaith</translation> <translation id="7839804798877833423">Bydd nôl y ffeiliau hyn yn defnyddio tua <ph name="FILE_SIZE" /> o ddata symudol.</translation> <translation id="7846076177841592234">Canslo dewis</translation> -<translation id="7847617962681804761">Mae angen PIN i ddefnyddio data symudol</translation> <translation id="7853966320808728790">BÉPO Ffrengig</translation> <translation id="7857117644404132472">Ychwanegu eithriad</translation> <translation id="7868774406711971383">Pwyleg</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Wrthi'n cysoni <ph name="NUMBER_OF_FILES" /> o eitemau…</translation> <translation id="8600173386174225982">Mae'r rhestr ffeiliau wedi newid i olwg mân-luniau.</translation> <translation id="8601932370724196034">Ffeil llun Crostini</translation> -<translation id="8608515571837163082">Rhoddwyd y PIN anghywir gormod o weithiau. Rhowch yr Allwedd Ddadrwystro Bersonol (PUK) 8-digid a ddarperir gan y cludwr.</translation> <translation id="8609695766746872526">Islandeg</translation> <translation id="863903787380594467">PIN anghywir. Mae gennych <ph name="RETRIES" /> ymgais ar ôl.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Porth</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_da.xtb b/ui/chromeos/translations/ui_chromeos_strings_da.xtb index 178462d..d394d52 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_da.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_da.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Webadresse til automatisk konfiguration:</translation> <translation id="2288278176040912387">Pladespiller</translation> <translation id="2291538123825441971">Åbner <ph name="NUMBER_OF_FILES" /> filer.</translation> -<translation id="2303282178633578561">Lås SIM-kort</translation> <translation id="2303301624314357662">Åbner filen <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> er skubbet ud.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Dine seneste filer vises her</translation> <translation id="2578394532502990878">Tamil fonetisk</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Din administrator kræver, at du deaktiverer SIM-lås.</translation> <translation id="2602810353103180630">Netværk <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signalstyrke på <ph name="SIGNAL_STRENGTH" /> %, blokeret af din administrator, oplysninger</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-video</translation> -<translation id="2617342710774726426">SIM-kortet er låst</translation> <translation id="2620090360073999360">Der er ikke adgang til Google Drev på nuværende tidspunkt.</translation> <translation id="2621713457727696555">Beskyttet</translation> <translation id="2638942478653899953">Der kunne ikke oprettes forbindelse til Google Drev. <ph name="BEGIN_LINK" />Log ud <ph name="END_LINK" />, og log ind igen.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Tøm papirkurv</translation> <translation id="5163869187418756376">Deling mislykkedes. Kontrollér din forbindelse, og prøv igen senere.</translation> <translation id="516592729076796170">Amerikansk (Programmer Dvorak) tastatur</translation> +<translation id="5172749059808361023">Oplysninger om begrænsning</translation> <translation id="5177526793333269655">Miniaturevisning</translation> <translation id="5194713942430106590">Klik for at sortere kolonnen i stigende rækkefølge.</translation> <translation id="5211614973734216083">Færøsk</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Lettisk</translation> <translation id="5489965683297092283">Filteret <ph name="FILTER_NAME" /> er deaktiveret.</translation> <translation id="5494920125229734069">Vælg alle</translation> -<translation id="5500104704744051184">Du kan ikke bruge dette netværk, før du har angivet PUK-koden</translation> <translation id="5500122897333236901">Islandsk</translation> <translation id="5508696409934741614">Prikker</translation> <translation id="5522908512596376669">Der blev skiftet til listevisning for listen med filer.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Der opstod en fejl under konfigurationen af netværket</translation> <translation id="7839804798877833423">Hvis du henter disse filer, bruge du ca. <ph name="FILE_SIZE" /> mobildata.</translation> <translation id="7846076177841592234">Annuller valg</translation> -<translation id="7847617962681804761">Der kræves en pinkode for at bruge mobildata</translation> <translation id="7853966320808728790">Fransk BÉPO</translation> <translation id="7857117644404132472">Tilføj undtagelse</translation> <translation id="7868774406711971383">Polsk</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> elementer synkroniseres...</translation> <translation id="8600173386174225982">Der blev skiftet til miniaturevisning for listen med filer.</translation> <translation id="8601932370724196034">Crostini-billedfil</translation> -<translation id="8608515571837163082">Der blev angivet en forkert pinkode for mange gange. Angiv den 8-cifrede PUK-kode, du har fået af dit mobilselskab.</translation> <translation id="8609695766746872526">Islandsk</translation> <translation id="863903787380594467">Forkert pinkode. Du har <ph name="RETRIES" /> forsøg tilbage.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_de.xtb b/ui/chromeos/translations/ui_chromeos_strings_de.xtb index e8f0596..c13207c 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_de.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_de.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL für Autokonfiguration:</translation> <translation id="2288278176040912387">Plattenspieler</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> Dateien werden geöffnet.</translation> -<translation id="2303282178633578561">SIM-Karte sperren</translation> <translation id="2303301624314357662">Datei "<ph name="FILE_NAME" />" wird geöffnet.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881">"<ph name="VOLUME_NAME" />" wurde ausgeworfen.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Hier werden deine zuletzt verwendeten Dateien angezeigt</translation> <translation id="2578394532502990878">Tamil (phonetisch)</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Dein Administrator verlangt, dass du die SIM-Sperre deaktivierst.</translation> <translation id="2602810353103180630">Netzwerk <ph name="NETWORK_INDEX" /> von <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Signalstärke <ph name="SIGNAL_STRENGTH" /> %, vom Administrator blockiert, Details</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-Video</translation> -<translation id="2617342710774726426">SIM-Karte ist gesperrt</translation> <translation id="2620090360073999360">Google Drive ist momentan nicht erreichbar.</translation> <translation id="2621713457727696555">Gesichert</translation> <translation id="2638942478653899953">Google Drive konnte nicht erreicht werden. Bitte <ph name="BEGIN_LINK" />melde dich ab<ph name="END_LINK" /> und melde dich dann erneut an.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Lettisch</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" />-Filter ist aus.</translation> <translation id="5494920125229734069">Alle auswählen</translation> -<translation id="5500104704744051184">Du kannst dieses Mobilfunknetz erst verwenden, wenn du die PUK eingegeben hast</translation> <translation id="5500122897333236901">Isländisch</translation> <translation id="5508696409934741614">Punkte</translation> <translation id="5522908512596376669">Die Dateiliste wird jetzt in der Listenansicht angezeigt.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Fehler bei der Netzwerkkonfiguration</translation> <translation id="7839804798877833423">Zum Abrufen dieser Dateien werden etwa <ph name="FILE_SIZE" /> mobile Daten benötigt.</translation> <translation id="7846076177841592234">Auswahl aufheben</translation> -<translation id="7847617962681804761">Zur Nutzung mobiler Daten ist eine PIN erforderlich</translation> <translation id="7853966320808728790">Französisch – Bépo</translation> <translation id="7857117644404132472">Ausnahme hinzufügen</translation> <translation id="7868774406711971383">Polnisch</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> Elemente werden synchronisiert...</translation> <translation id="8600173386174225982">Die Dateiliste wird jetzt in der Miniaturansicht angezeigt.</translation> <translation id="8601932370724196034">Crostini-Bilddatei</translation> -<translation id="8608515571837163082">Es wurde zu oft die falsche PIN eingegeben. Gib den achtstelligen PIN-Entsperrschlüssel (PUK) ein, den du vom Mobilfunkanbieter erhalten hast.</translation> <translation id="8609695766746872526">Isländisch</translation> <translation id="863903787380594467">Falsche PIN. Du hast noch <ph name="RETRIES" /> Versuche.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_el.xtb b/ui/chromeos/translations/ui_chromeos_strings_el.xtb index 27aad84..e4e447f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_el.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_el.xtb
@@ -150,7 +150,6 @@ <translation id="2282155092769082568">Αυτόματη διαμόρφωση URL</translation> <translation id="2288278176040912387">Πικάπ</translation> <translation id="2291538123825441971">Άνοιγμα <ph name="NUMBER_OF_FILES" /> αρχείων.</translation> -<translation id="2303282178633578561">Κλείδωμα κάρτας SIM</translation> <translation id="2303301624314357662">Άνοιγμα αρχείου <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Πλανήτης</translation> <translation id="2305020378527873881">Το στοιχείο <ph name="VOLUME_NAME" /> καταργήθηκε.</translation> @@ -189,10 +188,8 @@ <translation id="2570012981255377263">Τα πρόσφατα αρχεία σας θα εμφανίζονται εδώ</translation> <translation id="2578394532502990878">Φωνητική εισαγωγή Ταμίλ</translation> <translation id="2579959351793446050">Όντια</translation> -<translation id="2593644851255584939">Ο διαχειριστής σας απαιτεί να απενεργοποιήσετε το κλείδωμα SIM.</translation> <translation id="2602810353103180630">Δίκτυο <ph name="NETWORK_INDEX" /> από <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ισχύς σήματος <ph name="SIGNAL_STRENGTH" />%, Αποκλείστηκε από τον διαχειριστή σας, Λεπτομέρειες</translation> <translation id="2614589611416690597">Βίντεο <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Η κάρτα SIM είναι κλειδωμένη</translation> <translation id="2620090360073999360">Δεν είναι δυνατή η σύνδεση με το Google Drive αυτή τη φορά.</translation> <translation id="2621713457727696555">Unsecured</translation> <translation id="2638942478653899953">Δεν ήταν δυνατή η επικοινωνία με το Google Drive. <ph name="BEGIN_LINK" />Αποσυνδεθείτε<ph name="END_LINK" /> και συνδεθείτε ξανά.</translation> @@ -542,7 +539,6 @@ <translation id="5489067830765222292">Λετονικά</translation> <translation id="5489965683297092283">Το φίλτρο <ph name="FILTER_NAME" /> είναι ανενεργό.</translation> <translation id="5494920125229734069">Επιλογή όλων</translation> -<translation id="5500104704744051184">Δεν θα μπορείτε να χρησιμοποιήσετε αυτό το δίκτυο μέχρι να εισαγάγετε τον κωδικό PUK.</translation> <translation id="5500122897333236901">Ισλανδικά</translation> <translation id="5508696409934741614">Τελείες</translation> <translation id="5522908512596376669">Η λίστα αρχείων έχει αλλάξει σε προβολή λίστας.</translation> @@ -827,7 +823,6 @@ <translation id="7831491651892296503">Σφάλμα κατά τη διαμόρφωση του δικτύου</translation> <translation id="7839804798877833423">Για την ανάκτηση αυτών των αρχείων θα χρησιμοποιηθούν περίπου <ph name="FILE_SIZE" /> δεδομένων κινητής τηλεφωνίας.</translation> <translation id="7846076177841592234">Ακύρωση επιλογής</translation> -<translation id="7847617962681804761">Απαιτείται PIN για τη χρήση δεδομένων κινητής τηλεφωνίας</translation> <translation id="7853966320808728790">Γαλλικά BÉPO</translation> <translation id="7857117644404132472">Προσθήκη εξαίρεσης</translation> <translation id="7868774406711971383">Πολωνικά</translation> @@ -925,7 +920,6 @@ <translation id="8579285237314169903">Γίνεται συγχρονισμός <ph name="NUMBER_OF_FILES" /> στοιχείων…</translation> <translation id="8600173386174225982">Η λίστα αρχείων έχει αλλάξει σε προβολή μικρογραφίας.</translation> <translation id="8601932370724196034">Αρχείο εικόνας Crostini</translation> -<translation id="8608515571837163082">Έγινε εισαγωγή εσφαλμένου PIN πάρα πολλές φορές. Εισαγάγετε το προσωπικό κλειδί κατάργησης αποκλεισμού 8 ψηφίων (PUK) που παρέχεται από την εταιρεία κινητής τηλεφωνίας.</translation> <translation id="8609695766746872526">Ισλανδικά</translation> <translation id="863903787380594467">Εσφαλμένο PIN. Απομένουν <ph name="RETRIES" /> προσπάθειες.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Θύρα</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb index fafd00c..2d6d50a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_en-GB.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Auto-configuration URL:</translation> <translation id="2288278176040912387">Record player</translation> <translation id="2291538123825441971">Opening <ph name="NUMBER_OF_FILES" /> files.</translation> -<translation id="2303282178633578561">Lock SIM card</translation> <translation id="2303301624314357662">Opening file <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> has been ejected.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Your recent files will appear here</translation> <translation id="2578394532502990878">Tamil phonetic</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Your administrator requires you to disable SIM lock.</translation> <translation id="2602810353103180630">Network <ph name="NETWORK_INDEX" /> of <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signal strength <ph name="SIGNAL_STRENGTH" />%, blocked by your administrator. Details</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> video</translation> -<translation id="2617342710774726426">SIM card is locked</translation> <translation id="2620090360073999360">Google Drive cannot be reached at this time.</translation> <translation id="2621713457727696555">Secured</translation> <translation id="2638942478653899953">Google Drive could not be reached. Please <ph name="BEGIN_LINK" />log out<ph name="END_LINK" /> and log back in.</translation> @@ -530,7 +527,6 @@ <translation id="5489067830765222292">Latvian</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> filter is off.</translation> <translation id="5494920125229734069">Select all</translation> -<translation id="5500104704744051184">You won't be able to use this network until you enter the PUK</translation> <translation id="5500122897333236901">Icelandic</translation> <translation id="5508696409934741614">Dots</translation> <translation id="5522908512596376669">File list has changed to list view.</translation> @@ -811,7 +807,6 @@ <translation id="7831491651892296503">Error configuring network</translation> <translation id="7839804798877833423">Fetching these files will use approximately <ph name="FILE_SIZE" /> of mobile data.</translation> <translation id="7846076177841592234">Cancel selection</translation> -<translation id="7847617962681804761">PIN is required to use mobile data</translation> <translation id="7853966320808728790">French BÉPO</translation> <translation id="7857117644404132472">Add exception</translation> <translation id="7868774406711971383">Polish</translation> @@ -906,7 +901,6 @@ <translation id="8579285237314169903">Syncing <ph name="NUMBER_OF_FILES" /> items...</translation> <translation id="8600173386174225982">File list has changed to thumbnail view.</translation> <translation id="8601932370724196034">Crostini image file</translation> -<translation id="8608515571837163082">An incorrect PIN was entered too many times. Enter the 8-digit Personal Unblocking Key (PUK) provided by the operator.</translation> <translation id="8609695766746872526">Icelandic</translation> <translation id="863903787380594467">Incorrect PIN. You have <ph name="RETRIES" /> remaining attempts.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb index 9ee99049..a607049e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es-419.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de autoconfiguración:</translation> <translation id="2288278176040912387">Tocadiscos</translation> <translation id="2291538123825441971">Abriendo <ph name="NUMBER_OF_FILES" /> archivos</translation> -<translation id="2303282178633578561">Bloquear la tarjeta SIM</translation> <translation id="2303301624314357662">Abriendo el archivo <ph name="FILE_NAME" /></translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Se expulsó <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Tus archivos recientes aparecerán aquí.</translation> <translation id="2578394532502990878">Tamil (fonético)</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Tu administrador requiere que inhabilites el bloqueo de la SIM.</translation> <translation id="2602810353103180630">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, intensidad de la señal: <ph name="SIGNAL_STRENGTH" />%, bloqueda por tu administrador, detalles</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation> <translation id="2620090360073999360">No se puede acceder a Google Drive en este momento.</translation> <translation id="2621713457727696555">Segura</translation> <translation id="2638942478653899953">No se pudo establecer conexión con Google Drive. <ph name="BEGIN_LINK" />Sal de la cuenta<ph name="END_LINK" /> y vuelve a acceder.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Letón</translation> <translation id="5489965683297092283">El filtro <ph name="FILTER_NAME" /> está desactivado.</translation> <translation id="5494920125229734069">Seleccionar todo</translation> -<translation id="5500104704744051184">Para usar esta red, debes ingresar la PUK.</translation> <translation id="5500122897333236901">Islandés</translation> <translation id="5508696409934741614">Puntos</translation> <translation id="5522908512596376669">La lista de archivos cambió a la vista de lista.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Se produjo un error cuando se configuraba la red</translation> <translation id="7839804798877833423">Para recuperar estos archivos, se utilizará aproximadamente <ph name="FILE_SIZE" /> de los datos móviles.</translation> <translation id="7846076177841592234">Cancelar la selección</translation> -<translation id="7847617962681804761">Para usar datos móviles se requiere el PIN.</translation> <translation id="7853966320808728790">Francés BÉPO</translation> <translation id="7857117644404132472">Agregar excepción</translation> <translation id="7868774406711971383">Polaco</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Sincronizando <ph name="NUMBER_OF_FILES" /> elementos…</translation> <translation id="8600173386174225982">La lista de archivos cambió a la vista de miniaturas.</translation> <translation id="8601932370724196034">Archivo de imagen de Crostini</translation> -<translation id="8608515571837163082">Se ingresó el PIN de forma incorrecta demasiadas veces. Ingresa la clave personal de desbloqueo (PUK) de 8 dígitos que te proporcionó el proveedor.</translation> <translation id="8609695766746872526">Islandés</translation> <translation id="863903787380594467">El PIN es incorrecto. Te quedan <ph name="RETRIES" /> intentos.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" />: puerto</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_es.xtb b/ui/chromeos/translations/ui_chromeos_strings_es.xtb index bd1bb1d7..5d6331e6 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_es.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_es.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de configuración automática:</translation> <translation id="2288278176040912387">Tocadiscos</translation> <translation id="2291538123825441971">Se están abriendo <ph name="NUMBER_OF_FILES" /> archivos.</translation> -<translation id="2303282178633578561">Bloquear tarjeta SIM</translation> <translation id="2303301624314357662">Abriendo el archivo <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Se ha expulsado <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Tus archivos recientes aparecerán aquí</translation> <translation id="2578394532502990878">Tamil (fonético)</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Tu administrador requiere que inhabilites el bloqueo de la SIM.</translation> <translation id="2602810353103180630">Red <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />. <ph name="NETWORK_NAME" />. <ph name="CONNECTION_STATUS" /> Intensidad de la señal: <ph name="SIGNAL_STRENGTH" /> %. Bloqueada por tu administrador. Detalles.</translation> <translation id="2614589611416690597">Vídeo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">La tarjeta SIM está bloqueada</translation> <translation id="2620090360073999360">No se puede acceder a Google Drive en este momento.</translation> <translation id="2621713457727696555">Segura</translation> <translation id="2638942478653899953">No se ha podido acceder a Google Drive. <ph name="BEGIN_LINK" />Cierra la sesión<ph name="END_LINK" /> y vuelve a iniciarla.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Letón</translation> <translation id="5489965683297092283">El filtro <ph name="FILTER_NAME" /> se ha desactivado.</translation> <translation id="5494920125229734069">Seleccionar todo</translation> -<translation id="5500104704744051184">No podrás usar esta red hasta que escribas el PUK</translation> <translation id="5500122897333236901">Islandés</translation> <translation id="5508696409934741614">Puntos</translation> <translation id="5522908512596376669">La lista de archivos ha cambiado a la vista de lista.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">No se ha podido configurar la red</translation> <translation id="7839804798877833423">Para recuperar estos archivos se utilizarán aproximadamente <ph name="FILE_SIZE" /> de datos móviles.</translation> <translation id="7846076177841592234">Cancelar selección</translation> -<translation id="7847617962681804761">Se requiere un PIN para usar los datos móviles.</translation> <translation id="7853966320808728790">BÉPO francés</translation> <translation id="7857117644404132472">Añadir excepción</translation> <translation id="7868774406711971383">Polaco</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Sincronizando <ph name="NUMBER_OF_FILES" /> elementos...</translation> <translation id="8600173386174225982">La lista de archivos ha cambiado a la vista de miniaturas.</translation> <translation id="8601932370724196034">Archivo de imagen de Crostini</translation> -<translation id="8608515571837163082">Se ha escrito un PIN incorrecto demasiadas veces. Escribe el código PUK de 8 dígitos proporcionado por tu operador.</translation> <translation id="8609695766746872526">Islandés</translation> <translation id="863903787380594467">PIN incorrecto. Te quedan <ph name="RETRIES" /> intentos.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> (puerto)</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_et.xtb b/ui/chromeos/translations/ui_chromeos_strings_et.xtb index 00e17aa..a366c10 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_et.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_et.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Automaatse konfigureerimise URL:</translation> <translation id="2288278176040912387">Grammofon</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> faili avamine.</translation> -<translation id="2303282178633578561">SIM-kaardi lukustamine</translation> <translation id="2303301624314357662">Faili <ph name="FILE_NAME" /> avamine.</translation> <translation id="2304820083631266885">Planeet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> on väljutatud.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Teie hiljutised failid kuvatakse siin</translation> <translation id="2578394532502990878">tamili, foneetiline</translation> <translation id="2579959351793446050">odia</translation> -<translation id="2593644851255584939">Administraator nõuab, et keelaksite SIM-i luku.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. võrk <ph name="NETWORK_COUNT" />-st, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signaalitugevus: <ph name="SIGNAL_STRENGTH" />%, blokeeris administraator, üksikasjad</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-video</translation> -<translation id="2617342710774726426">SIM-kaart on lukustatud</translation> <translation id="2620090360073999360">Google Drive'iga ei saa praegu ühendust.</translation> <translation id="2621713457727696555">Kaitstud</translation> <translation id="2638942478653899953">Google Drive'iga ei saadud ühendust. <ph name="BEGIN_LINK" />Logige välja<ph name="END_LINK" /> ja tagasi sisse.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">läti</translation> <translation id="5489965683297092283">Filter <ph name="FILTER_NAME" /> on välja lülitatud.</translation> <translation id="5494920125229734069">Valige kõik</translation> -<translation id="5500104704744051184">Te ei saa seda võrku kasutada enne, kui sisestate PUK-i</translation> <translation id="5500122897333236901">islandi keel</translation> <translation id="5508696409934741614">Punktid</translation> <translation id="5522908512596376669">Faililoendi jaoks aktiveeriti loendikuva.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Viga võrgu seadistamisel</translation> <translation id="7839804798877833423">Failide toomine kasutab umbes <ph name="FILE_SIZE" /> mobiilsideandmeid.</translation> <translation id="7846076177841592234">Tühista valik</translation> -<translation id="7847617962681804761">Mobiilse andmeside kasutamiseks on vaja PIN-koodi</translation> <translation id="7853966320808728790">Prantsuse BÉPO</translation> <translation id="7857117644404132472">Lisa erand</translation> <translation id="7868774406711971383">poola</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> üksuse sünkroonimine ...</translation> <translation id="8600173386174225982">Faililoendi jaoks aktiveeriti pisipildikuva.</translation> <translation id="8601932370724196034">Crostini pildifail</translation> -<translation id="8608515571837163082">Vale PIN-kood sisestati liiga mitu korda. Sisestage operaatorilt saadud kaheksakohaline isiklik avamisvõti (PUK).</translation> <translation id="8609695766746872526">islandi</translation> <translation id="863903787380594467">Vale PIN-kood. Teil on veel <ph name="RETRIES" /> katset.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb index ec6cb4b9..f95be88 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_eu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_eu.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Konfigurazio automatikoaren URLa:</translation> <translation id="2288278176040912387">Disko-jogailua</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> fitxategi irekitzen.</translation> -<translation id="2303282178633578561">Blokeatu SIM txartela</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> fitxategia irekitzen.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Kanporatu da <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Azken fitxategiak hemen agertuko dira</translation> <translation id="2578394532502990878">Tamildar fonetikoa</translation> <translation id="2579959351793446050">Odiarra</translation> -<translation id="2593644851255584939">SIMa blokeatzeko ezarpena desgaitzea eskatzen du administratzaileak.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> saretatik <ph name="NETWORK_INDEX" />garrena, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Seinalearen indarra: ehuneko <ph name="SIGNAL_STRENGTH" />, Administratzaileak blokeatu du, Xehetasunak</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> bideoa</translation> -<translation id="2617342710774726426">Blokeatuta dago SIM txartela</translation> <translation id="2620090360073999360">Une honetan, ezin da konektatu Google Drive zerbitzuarekin.</translation> <translation id="2621713457727696555">Babestuta</translation> <translation id="2638942478653899953">Ezin izan da Google Drive-rekin konektatu. <ph name="BEGIN_LINK" />Amaitu saioa<ph name="END_LINK" /> eta hasi saioa berriro.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Letoniarra</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> iragazkia inaktibo dago.</translation> <translation id="5494920125229734069">Hautatu guztiak</translation> -<translation id="5500104704744051184">Ezingo duzu erabili sarea PUKa idatzi arte</translation> <translation id="5500122897333236901">Islandiarra</translation> <translation id="5508696409934741614">Puntuak</translation> <translation id="5522908512596376669">Zerrenda-ikuspegira aldatu da fitxategi-zerrenda.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Errore bat gertatu da sarea konfiguratzean</translation> <translation id="7839804798877833423">Fitxategi horiek eskuratzeko, mugikorreko datuen <ph name="FILE_SIZE" /> erabiliko dira.</translation> <translation id="7846076177841592234">Utzi hautapena bertan behera</translation> -<translation id="7847617962681804761">PINa behar da datu-konexioa erabiltzeko</translation> <translation id="7853966320808728790">BÉPO teklatu frantsesa</translation> <translation id="7857117644404132472">Gehitu salbuespena</translation> <translation id="7868774406711971383">Poloniarra</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> elementu sinkronizatzen…</translation> <translation id="8600173386174225982">Irudi txikiko ikuspegira aldatu da fitxategi-zerrenda.</translation> <translation id="8601932370724196034">Crostini motako irudi-fitxategia</translation> -<translation id="8608515571837163082">PINa gehiegitan idatzi da oker. Idatzi operadoreak emandako zortzi digituko desblokeatzeko gako pertsonala (PUKa).</translation> <translation id="8609695766746872526">Islandiarra</translation> <translation id="863903787380594467">PINa okerra da. <ph name="RETRIES" /> saiakera gelditzen zaizkizu.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Ataka</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb index 0fcdc16..3f734e8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fa.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">نشانی وب پیکربندی خودکار</translation> <translation id="2288278176040912387">ضبط صوت</translation> <translation id="2291538123825441971">درحال باز کردن <ph name="NUMBER_OF_FILES" /> فایل.</translation> -<translation id="2303282178633578561">قفل کردن سیم کارت</translation> <translation id="2303301624314357662">درحال باز کردن فایل <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">سیاره</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> خارج شد.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">فایلهای اخیرتان اینجا نشان داده میشود</translation> <translation id="2578394532502990878">تامیل (آوایی)</translation> <translation id="2579959351793446050">اوریه</translation> -<translation id="2593644851255584939">سرپرستتان از شما میخواهد قفل سیمکارت را غیرفعال کنید.</translation> <translation id="2602810353103180630">شبکه <ph name="NETWORK_INDEX" /> از <ph name="NETWORK_COUNT" />، <ph name="NETWORK_NAME" />، <ph name="CONNECTION_STATUS" />، قدرت سیگنال <ph name="SIGNAL_STRENGTH" />٪، سرپرستتان آن را مسدود کرده است، جزئیات</translation> <translation id="2614589611416690597">ویدیوی <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">سیمکارت قفل است</translation> <translation id="2620090360073999360">دسترسی به Google Drive در حال حاضر ممکن نیست.</translation> <translation id="2621713457727696555">ایمن شد</translation> <translation id="2638942478653899953">دسترسی به Google Drive امکانپذیر نیست. لطفاً <ph name="BEGIN_LINK" />از سیستم خارج شوید<ph name="END_LINK" /> و دوباره وارد شوید.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">لتونیایی</translation> <translation id="5489965683297092283">فیلتر <ph name="FILTER_NAME" /> خاموش است.</translation> <translation id="5494920125229734069">انتخاب همه</translation> -<translation id="5500104704744051184">تا زمانیکه PUK را وارد نکنید، نمیتوانید از این شبکه استفاده کنید</translation> <translation id="5500122897333236901">ایسلندی</translation> <translation id="5508696409934741614">نقطهها</translation> <translation id="5522908512596376669">نمای فهرست فایل به نمای فهرستی تغییر کرده است.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">خطا در پیکربندی شبکه</translation> <translation id="7839804798877833423">دریافت این فایلها تقریباً <ph name="FILE_SIZE" /> از داده تلفن همراه شما را مصرف میکند.</translation> <translation id="7846076177841592234">لغو انتخاب</translation> -<translation id="7847617962681804761">برای استفاده از داده تلفن همراه، به پین نیاز دارید</translation> <translation id="7853966320808728790">BÉPO فرانسوی</translation> <translation id="7857117644404132472">افزودن استثنا</translation> <translation id="7868774406711971383">لهستانی</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">در حال همگامسازی <ph name="NUMBER_OF_FILES" /> مورد...</translation> <translation id="8600173386174225982">فهرست فایل به نمای تصویر کوچک تغییر کرده است.</translation> <translation id="8601932370724196034">فایل تصویری Crostini</translation> -<translation id="8608515571837163082">پین نادرست دفعات زیادی وارد شده است. «کلید لغو انسداد شخصی» (PUK) ۸ رقمی را که شرکت مخابراتی ارائه کرده است وارد کنید.</translation> <translation id="8609695766746872526">ایسلندی</translation> <translation id="863903787380594467">پین اشتباه است. <ph name="RETRIES" /> تلاش دیگر دارید.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - درگاه</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb index 7ff554a..b89ecc6b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fi.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Automaattisen määrityksen URL-osoite:</translation> <translation id="2288278176040912387">Levysoitin</translation> <translation id="2291538123825441971">Avataan <ph name="NUMBER_OF_FILES" /> tiedostoa.</translation> -<translation id="2303282178633578561">Lukitse SIM-kortti</translation> <translation id="2303301624314357662">Avataan tiedostoa <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeetta</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> on poistettu.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Viimeksi käytetyt tiedostot näkyvät täällä</translation> <translation id="2578394532502990878">foneettinen tamil</translation> <translation id="2579959351793446050">orija</translation> -<translation id="2593644851255584939">Järjestelmänvalvoja edellyttää, että poistat SIM-lukituksen käytöstä.</translation> <translation id="2602810353103180630">Verkko <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signaalin voimakkuus <ph name="SIGNAL_STRENGTH" /> %, järjestelmänvalvojan estämä, lisätietoja</translation> <translation id="2614589611416690597">Video, jonka tyyppi on <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM-kortti on lukittu.</translation> <translation id="2620090360073999360">Google Drive ei ole käytettävissä juuri nyt.</translation> <translation id="2621713457727696555">Suojattu</translation> <translation id="2638942478653899953">Google Driveen ei saada yhteyttä. <ph name="BEGIN_LINK" />Kirjaudu ulos<ph name="END_LINK" /> ja takaisin sisään.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">latvia</translation> <translation id="5489965683297092283">Suodatin ei käytössä: <ph name="FILTER_NAME" /></translation> <translation id="5494920125229734069">Valitse kaikki</translation> -<translation id="5500104704744051184">Et voi käyttää tätä verkkoa ennen kuin lisäät PUK-koodin</translation> <translation id="5500122897333236901">islanti</translation> <translation id="5508696409934741614">Pisteet</translation> <translation id="5522908512596376669">Tiedostot näkyvät nyt luettelona.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Verkon määritysvirhe</translation> <translation id="7839804798877833423">Mobiiliyhteyden kautta noudettavien tiedostojen koko on noin <ph name="FILE_SIZE" />.</translation> <translation id="7846076177841592234">Peru valinta</translation> -<translation id="7847617962681804761">Mobiilidatan käyttö edellyttää PIN-koodia</translation> <translation id="7853966320808728790">Ranskalainen BÉPO</translation> <translation id="7857117644404132472">Lisää poikkeus</translation> <translation id="7868774406711971383">puola</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Synkronoidaan <ph name="NUMBER_OF_FILES" /> kohdetta…</translation> <translation id="8600173386174225982">Tiedostot näkyvät nyt pikkukuvina.</translation> <translation id="8601932370724196034">Crostini-kuvatiedosto</translation> -<translation id="8608515571837163082">Väärä PIN-koodi on syötetty liian monta kertaa. Lisää operaattorilta saamasi 8-numeroinen PUK-koodi.</translation> <translation id="8609695766746872526">islanti</translation> <translation id="863903787380594467">Väärä PIN-koodi. Sinulla on <ph name="RETRIES" /> yritystä jäljellä.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – portti</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb index 95aa4821..5aa97fe 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fil.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fil.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Autoconfiguration URL:</translation> <translation id="2288278176040912387">Record player</translation> <translation id="2291538123825441971">Binubuksan ang <ph name="NUMBER_OF_FILES" /> (na) file.</translation> -<translation id="2303282178633578561">I-lock ang SIM card</translation> <translation id="2303301624314357662">Binubuksan ang file na <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Na-eject ang <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Lalabas dito ang iyong mga kamakailang file</translation> <translation id="2578394532502990878">Tamil Phonetic</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Hinihiling sa iyo ng administrator mo na i-disable ang SIM Lock.</translation> <translation id="2602810353103180630">Network <ph name="NETWORK_INDEX" /> sa <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Lakas ng Signal <ph name="SIGNAL_STRENGTH" />%, Na-block ng iyong Administrator, Mga Detalye</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> na video</translation> -<translation id="2617342710774726426">Naka-lock ang SIM card</translation> <translation id="2620090360073999360">Hindi maaabot ang Google Drive sa ngayon.</translation> <translation id="2621713457727696555">Secured</translation> <translation id="2638942478653899953">Hindi maabot ang Google Drive. Mangyaring <ph name="BEGIN_LINK" />mag-log out<ph name="END_LINK" /> at mag-log in muli.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Latvian</translation> <translation id="5489965683297092283">Naka-off ang filter na <ph name="FILTER_NAME" />.</translation> <translation id="5494920125229734069">Piliin ang lahat</translation> -<translation id="5500104704744051184">Hindi mo magagamit ang network na ito hanggang sa ilagay mo ang PUK</translation> <translation id="5500122897333236901">Icelandic</translation> <translation id="5508696409934741614">Mga Dot</translation> <translation id="5522908512596376669">Naging list view ang listahan ng file.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Nagkaroon ng error sa pag-configure sa network</translation> <translation id="7839804798877833423">Ang pagkuha sa mga file na ito ay gagamit ng humigit-kumulang <ph name="FILE_SIZE" /> (na) mobile data.</translation> <translation id="7846076177841592234">Kanselahin ang pinili</translation> -<translation id="7847617962681804761">Kailangan ng PIN para magamit ang mobile data</translation> <translation id="7853966320808728790">French na BÉPO</translation> <translation id="7857117644404132472">Magdagdag ng exception</translation> <translation id="7868774406711971383">Polish</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Nagsi-sync ng <ph name="NUMBER_OF_FILES" /> (na) item...</translation> <translation id="8600173386174225982">Naging thumbnail view ang listahan ng file.</translation> <translation id="8601932370724196034">Crostini image file</translation> -<translation id="8608515571837163082">Napakaraming beses nang naglagay ng maling PIN. Ilagay ang 8 digit na Personal Unblocking Key (PUK) na ibinigay ng carrier.</translation> <translation id="8609695766746872526">Icelandic</translation> <translation id="863903787380594467">Mali ang PIN. Mayroon ka na lang <ph name="RETRIES" /> (na) natitirang pagsubok.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb index 98040f2..32073a2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr-CA.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL d'autoconfiguration :</translation> <translation id="2288278176040912387">Tourne-disque</translation> <translation id="2291538123825441971">Ouverture de <ph name="NUMBER_OF_FILES" /> fichiers en cours…</translation> -<translation id="2303282178633578561">Verrouiller la carte SIM</translation> <translation id="2303301624314357662">Ouverture du fichier <ph name="FILE_NAME" /> en cours…</translation> <translation id="2304820083631266885">Planète</translation> <translation id="2305020378527873881">Le volume <ph name="VOLUME_NAME" /> a été éjecté.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Vos fichiers récents s'afficheront ici</translation> <translation id="2578394532502990878">Tamoul (phonétique)</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Votre administrateur vous demande de désactiver le verrouillage de la carte SIM.</translation> <translation id="2602810353103180630">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, puissance du signal <ph name="SIGNAL_STRENGTH" /> %, bloqué par votre administrateur, détails</translation> <translation id="2614589611416690597">Vidéo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">La carte SIM est verrouillée</translation> <translation id="2620090360073999360">Google Disque est temporairement inaccessible.</translation> <translation id="2621713457727696555">Sécurisé</translation> <translation id="2638942478653899953">Impossible d'accéder à Google Disque. Veuillez vous <ph name="BEGIN_LINK" />déconnecter<ph name="END_LINK" />, puis vous reconnecter.</translation> @@ -530,7 +527,6 @@ <translation id="5489067830765222292">Letton</translation> <translation id="5489965683297092283">Le filtre <ph name="FILTER_NAME" /> est désactivé.</translation> <translation id="5494920125229734069">Tout sélectionner</translation> -<translation id="5500104704744051184">Vous ne pourrez pas utiliser ce réseau tant que vous n'aurez pas entré la PUK.</translation> <translation id="5500122897333236901">Islandais</translation> <translation id="5508696409934741614">Points</translation> <translation id="5522908512596376669">La liste de fichiers utilise maintenant l'affichage en liste.</translation> @@ -811,7 +807,6 @@ <translation id="7831491651892296503">Erreur de configuration réseau</translation> <translation id="7839804798877833423">L'obtention de ces fichiers utilisera environ <ph name="FILE_SIZE" /> de données mobiles.</translation> <translation id="7846076177841592234">Annuler la sélection</translation> -<translation id="7847617962681804761">Un NIP est nécessaire pour utiliser les données cellulaires</translation> <translation id="7853966320808728790">BÉPO français</translation> <translation id="7857117644404132472">Ajouter une exception</translation> <translation id="7868774406711971383">Polonais</translation> @@ -906,7 +901,6 @@ <translation id="8579285237314169903">Synchronisation de <ph name="NUMBER_OF_FILES" /> éléments en cours...</translation> <translation id="8600173386174225982">La liste de fichiers utilise maintenant l'affichage en miniatures.</translation> <translation id="8601932370724196034">Fichier d'image Crostini</translation> -<translation id="8608515571837163082">Un NIP incorrect a été entré trop de fois. Entrez la clé personnelle de déblocage (PUK) à huit chiffres fournie par le fournisseur de services.</translation> <translation id="8609695766746872526">Islandais</translation> <translation id="863903787380594467">NIP incorrect. Il vous reste <ph name="RETRIES" /> tentatives.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb index 135a0d0..f7fa6032 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_fr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_fr.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de configuration automatique :</translation> <translation id="2288278176040912387">Tourne-disque</translation> <translation id="2291538123825441971">Ouverture de <ph name="NUMBER_OF_FILES" /> fichiers.</translation> -<translation id="2303282178633578561">Verrouiller la carte SIM</translation> <translation id="2303301624314357662">Ouverture du fichier <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planète</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> a été éjecté.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Vos fichiers récents s'afficheront ici</translation> <translation id="2578394532502990878">Tamoul (phonétique)</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Votre administrateur exige que vous désactiviez le verrouillage SIM.</translation> <translation id="2602810353103180630">Réseau <ph name="NETWORK_INDEX" /> sur <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Force du signal : <ph name="SIGNAL_STRENGTH" /> %, Bloqué par votre administrateur, Détails</translation> <translation id="2614589611416690597">Fichier vidéo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">La carte SIM est verrouillée</translation> <translation id="2620090360073999360">Impossible d'établir la connexion à Google Drive pour le moment.</translation> <translation id="2621713457727696555">Sécurisé</translation> <translation id="2638942478653899953">Impossible d'accéder à Google Drive. Veuillez vous <ph name="BEGIN_LINK" />déconnecter<ph name="END_LINK" />, puis vous reconnecter.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Letton</translation> <translation id="5489965683297092283">Le filtre <ph name="FILTER_NAME" /> est désactivé.</translation> <translation id="5494920125229734069">Tout sélectionner</translation> -<translation id="5500104704744051184">Vous ne pourrez pas utiliser ce réseau avant d'avoir saisi la clé PUK</translation> <translation id="5500122897333236901">Islandais</translation> <translation id="5508696409934741614">Points</translation> <translation id="5522908512596376669">Les fichiers s'affichent désormais sous forme de liste.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Erreur lors de la configuration du réseau</translation> <translation id="7839804798877833423">L'opération de récupération de ces fichiers consommera environ <ph name="FILE_SIZE" /> de données mobiles.</translation> <translation id="7846076177841592234">Annuler la sélection</translation> -<translation id="7847617962681804761">Code PIN requis pour utiliser les données mobiles</translation> <translation id="7853966320808728790">BÉPO français</translation> <translation id="7857117644404132472">Ajouter une exception</translation> <translation id="7868774406711971383">Polonais</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Synchronisation de <ph name="NUMBER_OF_FILES" /> éléments en cours…</translation> <translation id="8600173386174225982">Les fichiers s'affichent désormais sous forme de vignettes.</translation> <translation id="8601932370724196034">Fichier image Crostini</translation> -<translation id="8608515571837163082">Vous avez saisi un code PIN erroné trop de fois. Saisissez le code de déblocage (clé PUK) à huit chiffres fourni par votre opérateur.</translation> <translation id="8609695766746872526">Islandais</translation> <translation id="863903787380594467">Code PIN incorrect. Il vous reste <ph name="RETRIES" /> tentatives.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb index 94af704..ec8867b51 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gl.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de configuración automática:</translation> <translation id="2288278176040912387">Tocadiscos</translation> <translation id="2291538123825441971">Abrindo <ph name="NUMBER_OF_FILES" /> ficheiros.</translation> -<translation id="2303282178633578561">Bloquear tarxeta SIM</translation> <translation id="2303301624314357662">Abrindo o ficheiro <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Expulsouse <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Os teus ficheiros recentes mostraranse aquí</translation> <translation id="2578394532502990878">Támil (fonético)</translation> <translation id="2579959351793446050">Odiá</translation> -<translation id="2593644851255584939">O teu administrador require que desactives o bloqueo da SIM.</translation> <translation id="2602810353103180630">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, intensidade do sinal do <ph name="SIGNAL_STRENGTH" /> %, bloqueada polo administrador, detalles</translation> <translation id="2614589611416690597">Vídeo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">A tarxeta SIM está bloqueada</translation> <translation id="2620090360073999360">Non se pode acceder a Google Drive neste momento.</translation> <translation id="2621713457727696555">Protexida</translation> <translation id="2638942478653899953">Non se puido acceder a Google Drive. <ph name="BEGIN_LINK" />Pecha sesión<ph name="END_LINK" /> e volve iniciala.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Letón</translation> <translation id="5489965683297092283">Desactivouse o filtro <ph name="FILTER_NAME" />.</translation> <translation id="5494920125229734069">Seleccionar todo</translation> -<translation id="5500104704744051184">Non poderás usar esta rede mentres non metas o PUK</translation> <translation id="5500122897333236901">Islandés</translation> <translation id="5508696409934741614">Puntos</translation> <translation id="5522908512596376669">A lista de ficheiros cambiou á vista de lista.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Produciuse un erro ao configurar a rede</translation> <translation id="7839804798877833423">A recuperación destes ficheiros ocupará aproximadamente <ph name="FILE_SIZE" /> de datos móbiles.</translation> <translation id="7846076177841592234">Cancelar selección</translation> -<translation id="7847617962681804761">É necesario indicar o PIN para utilizar os datos móbiles</translation> <translation id="7853966320808728790">BÉPO francés</translation> <translation id="7857117644404132472">Engadir excepción</translation> <translation id="7868774406711971383">Polaco</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Sincronizando <ph name="NUMBER_OF_FILES" /> elementos...</translation> <translation id="8600173386174225982">A lista de ficheiros cambiou á vista de miniatura.</translation> <translation id="8601932370724196034">Ficheiro de imaxe de Crostini</translation> -<translation id="8608515571837163082">Meteuse un PIN incorrecto demasiadas veces. Escribe a clave de desbloqueo persoal (PUK) de 8 díxitos que che facilitou o operador.</translation> <translation id="8609695766746872526">Islandés</translation> <translation id="863903787380594467">O PIN é incorrecto. Quédanche <ph name="RETRIES" /> intentos.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" />: porto</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb index cba36d9..6b076a9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_gu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_gu.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">સ્વતઃગોઠવણી URL:</translation> <translation id="2288278176040912387">રેકોર્ડ પ્લેયર</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ફાઇલ ખુલી રહી છે.</translation> -<translation id="2303282178633578561">સિમ કાર્ડ લૉક કરો</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ફાઇલ ખુલી રહી છે.</translation> <translation id="2304820083631266885">ગ્રહ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> બહાર કાઢવામાં આવ્યું છે.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">તમારી હાલની ફાઇલો અહીં દેખાશે</translation> <translation id="2578394532502990878">તમિળ ફોનેટિક</translation> <translation id="2579959351793446050">ઉડિયા</translation> -<translation id="2593644851255584939">તમારા ઍડમિનિસ્ટ્રેટર માટે જરૂરી છે કે તમે સિમ કાર્ડ લૉક કરવાની સુવિધા બંધ કરો.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />માંથી નેટવર્ક <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, સિગ્નલની પ્રબળતા <ph name="SIGNAL_STRENGTH" />%, તમારા વ્યવસ્થાપક દ્વારા બ્લૉક કરવામાં આવ્યું છે, વિગતો</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> વીડિયો</translation> -<translation id="2617342710774726426">SIM કાર્ડ લૉક કરેલ છે</translation> <translation id="2620090360073999360">આ સમયે Google ડ્રાઇવ પર જઈ શકાતું નથી.</translation> <translation id="2621713457727696555">સુરક્ષિત</translation> <translation id="2638942478653899953">Google ડ્રાઇવ પર પહોંચી શકાયું નથી. કૃપા કરીને <ph name="BEGIN_LINK" />લૉગ આઉટ કરો<ph name="END_LINK" /> અને પાછા લૉગ ઇન કરો.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">લૅતવિયન</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ફિલ્ટર બંધ છે.</translation> <translation id="5494920125229734069">બધા પસંદ કરો</translation> -<translation id="5500104704744051184">જ્યાં સુધી તમે PUK દાખલ નહીં કરો, ત્યાં સુધી તમે આ નેટવર્કનો ઉપયોગ કરી શકશો નહીં</translation> <translation id="5500122897333236901">આઇસલેન્ડિક</translation> <translation id="5508696409934741614">બિંદુઓ</translation> <translation id="5522908512596376669">ફાઇલ સૂચિને સૂચિ દૃશ્યમાં બદલી છે.</translation> @@ -808,7 +804,6 @@ <translation id="7831491651892296503">નેટવર્કની ગોઠવણી કરતી વખતે ભૂલ આવી</translation> <translation id="7839804798877833423">આ ફાઇલોને મેળવવામાં લગભગ <ph name="FILE_SIZE" /> મોબાઇલ ડેટાનો ઉપયોગ થશે.</translation> <translation id="7846076177841592234">પસંદગી રદ કરો</translation> -<translation id="7847617962681804761">મોબાઇલ ડેટાનો ઉપયોગ કરવા માટે પિન જરૂરી છે</translation> <translation id="7853966320808728790">ફ્રેંચ BÉPO</translation> <translation id="7857117644404132472">અપવાદ ઉમેરો</translation> <translation id="7868774406711971383">પોલિશ</translation> @@ -903,7 +898,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> આઇટમ્સ સમન્વયિત કરી રહ્યાં છે...</translation> <translation id="8600173386174225982">ફાઇલ સૂચિને થંબનેલ દૃશ્યમાં બદલી છે.</translation> <translation id="8601932370724196034">Crostini છબી ફાઇલ</translation> -<translation id="8608515571837163082">ઘણી બધી વખત કોઈ ખોટો પિન દાખલ કરવામાં આવ્યો છે. મોબાઇલ ઑપરેટર દ્વારા આપવામાં આવેલો 8-અંકનો પર્સનલ અનબ્લૉકિંગ કી (PUK) દાખલ કરો.</translation> <translation id="8609695766746872526">આઇસલેન્ડિક</translation> <translation id="863903787380594467">ખોટો પિન. તમારા <ph name="RETRIES" /> પ્રયાસ બાકી છે.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - પોર્ટ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb index e406a83..c9106b6a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hi.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL का अपने आप कॉन्फ़िगरेशन:</translation> <translation id="2288278176040912387">रिकॉर्ड प्लेयर</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> फ़ाइलें खुल रही हैं.</translation> -<translation id="2303282178633578561">सिम कार्ड लॉक करें</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> फ़ाइल खुल रही है.</translation> <translation id="2304820083631266885">ग्रह</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> को निकाल लिया गया है.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">आपकी हाल ही की फ़ाइलें यहां दिखेंगी</translation> <translation id="2578394532502990878">तमिल फ़ोनेटिक</translation> <translation id="2579959351793446050">ओडिया</translation> -<translation id="2593644851255584939">आपका एडमिन चाहता है कि आप सिम लॉक की सुविधा बंद करें.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> में से नेटवर्क <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, सिग्नल का स्तर <ph name="SIGNAL_STRENGTH" />%, आपके एडमिन ने ब्लॉक किया है, ब्यौरा</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> वीडियो</translation> -<translation id="2617342710774726426">सिम कार्ड लॉक है</translation> <translation id="2620090360073999360">इस समय Google डिस्क तक नहीं पहुंचा जा सकता.</translation> <translation id="2621713457727696555">सुरक्षित</translation> <translation id="2638942478653899953">Google डिस्क तक नहीं पहुंचा जा सका. कृपया <ph name="BEGIN_LINK" />लॉग आउट करें<ph name="END_LINK" /> और वापस प्रवेश करें.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">लातवियन</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> फ़िल्टर बंद है.</translation> <translation id="5494920125229734069">सभी को चुनें</translation> -<translation id="5500104704744051184">जब तक PUK नहीं डाला जाता, तब तक इस नेटवर्क का इस्तेमाल नहीं किया जा सकेगा</translation> <translation id="5500122897333236901">आइसलैंडिक</translation> <translation id="5508696409934741614">बिंदु</translation> <translation id="5522908512596376669">फ़ाइल की सूची को अब सूची की तरह दिखाया जा रहा है.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">नेटवर्क कॉन्फ़िगर करने में गड़बड़ी</translation> <translation id="7839804798877833423">इन फ़ाइलों को लाने में मोबाइल डेटा का करीब <ph name="FILE_SIZE" /> उपयोग होगा.</translation> <translation id="7846076177841592234">चुना गया हटाएं</translation> -<translation id="7847617962681804761">मोबाइल डेटा के इस्तेमाल के लिए पिन ज़रूरी है</translation> <translation id="7853966320808728790">फ़्रेंच बेपो</translation> <translation id="7857117644404132472">अपवाद जोड़ें</translation> <translation id="7868774406711971383">पोलिश</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> आइटम समन्वयित कर रहा है...</translation> <translation id="8600173386174225982">फ़ाइल की सूची अब थंबनेल की तरह दिखाई जा रही है.</translation> <translation id="8601932370724196034">Crostini इमेज फ़ाइल</translation> -<translation id="8608515571837163082">कई बार गलत पिन डाला गया. मोबाइल और इंटरनेट सेवा देने वाली कंपनी से मिली आठ अंकों वाली निजी अनब्लॉकिंग कुंजी (PUK) डालें.</translation> <translation id="8609695766746872526">आइसलैंडिक</translation> <translation id="863903787380594467">आपने गलत पिन डाला है. आप <ph name="RETRIES" /> बार और कोशिश कर सकते हैं.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - पोर्ट</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb index dbb8a4d..50514762 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hr.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL za automatsku konfiguraciju:</translation> <translation id="2288278176040912387">Gramofon</translation> <translation id="2291538123825441971">Otvaranje datoteka (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Zaključaj SIM karticu</translation> <translation id="2303301624314357662">Otvaranje datoteke <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881">Stavka <ph name="VOLUME_NAME" /> izbačena je.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Ovdje će se prikazati vaše nedavne datoteke</translation> <translation id="2578394532502990878">tamilski fonetski</translation> <translation id="2579959351793446050">orijski</translation> -<translation id="2593644851255584939">Administrator zahtijeva da onemogućite zaključavanje SIM-a.</translation> <translation id="2602810353103180630">Mreža <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, blokirao vaš administrator, pojedinosti</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> videozapis</translation> -<translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2620090360073999360">Trenutačno nije moguće pristupiti usluzi Google disk.</translation> <translation id="2621713457727696555">Zaštićeno</translation> <translation id="2638942478653899953">Nije bilo moguće pristupiti Google disku. <ph name="BEGIN_LINK" />Odjavite se<ph name="END_LINK" /> i ponovo prijavite.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Isprazni otpad</translation> <translation id="5163869187418756376">Dijeljenje nije uspjelo. Provjerite vezu i pokušajte ponovo kasnije.</translation> <translation id="516592729076796170">Američka programerska Dvorak</translation> +<translation id="5172749059808361023">Pojedinosti ograničenja</translation> <translation id="5177526793333269655">Prikaz minijatura</translation> <translation id="5194713942430106590">Kliknite da biste stavke u stupcu poredali uzlaznim redoslijedom.</translation> <translation id="5211614973734216083">farski</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">latvijski</translation> <translation id="5489965683297092283">Filtar <ph name="FILTER_NAME" /> je isključen.</translation> <translation id="5494920125229734069">Odaberi sve</translation> -<translation id="5500104704744051184">Nećete moći koristiti ovu mrežu dok ne unesete PUK</translation> <translation id="5500122897333236901">Islandski</translation> <translation id="5508696409934741614">Točke</translation> <translation id="5522908512596376669">Popis datoteka promijenio se na prikaz popisa.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Pogreška prilikom konfiguriranja mreže</translation> <translation id="7839804798877833423">Dohvaćanje tih datoteka potrošit će približno <ph name="FILE_SIZE" /> mobilnih podataka.</translation> <translation id="7846076177841592234">Poništi odabir</translation> -<translation id="7847617962681804761">Za upotrebu mobilnih podataka potreban je PIN</translation> <translation id="7853966320808728790">Francuska BÉPO</translation> <translation id="7857117644404132472">Dodaj iznimku</translation> <translation id="7868774406711971383">poljski</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Sinkronizacija ovoliko stavki: <ph name="NUMBER_OF_FILES" />...</translation> <translation id="8600173386174225982">Popis datoteka promijenio se na prikaz minijatura.</translation> <translation id="8601932370724196034">Slikovna datoteka Crostinija</translation> -<translation id="8608515571837163082">Unijeli ste netočan PIN previše puta. Unesite osmeroznamenkasti osobni ključ za deblokiranje (PUK) koji ste dobili od mobilnog operatera.</translation> <translation id="8609695766746872526">islandski</translation> <translation id="863903787380594467">Netočan PIN. Preostao vam je sljedeći broj pokušaja: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – priključak</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb index fbf383d..f654de2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hu.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL automatikus konfigurációja:</translation> <translation id="2288278176040912387">Lemezjátszó</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> fájl megnyitása.</translation> -<translation id="2303282178633578561">SIM-kártya lezárása</translation> <translation id="2303301624314357662">A <ph name="FILE_NAME" /> fájl megnyitása folyamatban van.</translation> <translation id="2304820083631266885">Bolygó</translation> <translation id="2305020378527873881">A(z) <ph name="VOLUME_NAME" /> kiadása megtörtént.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Itt jelennek majd meg a legutóbbi fájlok</translation> <translation id="2578394532502990878">tamil, fonetikus</translation> <translation id="2579959351793446050">odia</translation> -<translation id="2593644851255584939">A rendszergazda a SIM-zárolás feloldását kéri.</translation> <translation id="2602810353103180630">Hálózat száma: <ph name="NETWORK_INDEX" />, összes hálózat: <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jelerősség: <ph name="SIGNAL_STRENGTH" />%, rendszergazda tiltja, részletek</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> videó</translation> -<translation id="2617342710774726426">A SIM-kártya zárolva van</translation> <translation id="2620090360073999360">A Google Drive jelenleg nem érhető el.</translation> <translation id="2621713457727696555">Biztonságos</translation> <translation id="2638942478653899953">A Google Drive nem érhető el. Kérjük, <ph name="BEGIN_LINK" />jelentkezzen ki<ph name="END_LINK" />, majd jelentkezzen be újra.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">lett</translation> <translation id="5489965683297092283">A(z) <ph name="FILTER_NAME" /> szűrő ki van kapcsolva.</translation> <translation id="5494920125229734069">Összes kiválasztása</translation> -<translation id="5500104704744051184">Addig nem tudja használni ezt a hálózatot, amíg meg nem adja a PUK kódot</translation> <translation id="5500122897333236901">izlandi</translation> <translation id="5508696409934741614">Pöttyök</translation> <translation id="5522908512596376669">A fájllista nézete listanézetre változott.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Hiba történt a hálózat konfigurálásakor</translation> <translation id="7839804798877833423">E fájlok lekérése mintegy <ph name="FILE_SIZE" />-nyi mobiladat-forgalmat fog generálni.</translation> <translation id="7846076177841592234">Kijelölés törlése</translation> -<translation id="7847617962681804761">A mobiladatok használatához PIN-kód megadása szükséges.</translation> <translation id="7853966320808728790">Francia BÉPO</translation> <translation id="7857117644404132472">Kivétel hozzáadása</translation> <translation id="7868774406711971383">lengyel</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> elem szinkronizálása…</translation> <translation id="8600173386174225982">A fájllista nézete indexképnézetre változott.</translation> <translation id="8601932370724196034">Crostini-képfájl</translation> -<translation id="8608515571837163082">Túl sokszor lett megadva helytelen PIN-kód. Adja meg a szolgáltatótól kapott nyolcjegyű személyes feloldókulcsot (PUK kódot).</translation> <translation id="8609695766746872526">izlandi</translation> <translation id="863903787380594467">Helytelen PIN-kód. <ph name="RETRIES" /> próbálkozási lehetősége maradt.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb index 69971cc..2d460c8 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_hy.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_hy.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Ինքնակազմաձևման URL-ը՝</translation> <translation id="2288278176040912387">Գրամոֆոն</translation> <translation id="2291538123825441971">Բացվում է <ph name="NUMBER_OF_FILES" /> ֆայլ։</translation> -<translation id="2303282178633578561">SIM քարտի կողպում</translation> <translation id="2303301624314357662">Բացվում է <ph name="FILE_NAME" /> ֆայլը։</translation> <translation id="2304820083631266885">Մոլորակ</translation> <translation id="2305020378527873881">Չհաջողվեց առբերել <ph name="VOLUME_NAME" /> պանակը։</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Ձեր վերջին ֆայլերը կհայտնվեն այստեղ</translation> <translation id="2578394532502990878">թամիլերեն (հնչյունային)</translation> <translation id="2579959351793446050">օրիյա</translation> -<translation id="2593644851255584939">Ձեր ադմինիստրատորը պահանջում է, որ միացնեք SIM քարտի կողպումը։</translation> <translation id="2602810353103180630">Ցանց <ph name="NETWORK_INDEX" />՝ <ph name="NETWORK_COUNT" />-ից, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ազդանշանի ուժգնությունը՝ <ph name="SIGNAL_STRENGTH" />%, արգելափակված է ադմինիստրատորի կողմից, մանրամասներ</translation> <translation id="2614589611416690597">Տեսանյութ (<ph name="VIDEO_TYPE" />)</translation> -<translation id="2617342710774726426">SIM քարտը կողպված է</translation> <translation id="2620090360073999360">Google Drive-ը մատչելի չէ այս պահին:</translation> <translation id="2621713457727696555">Պաշտպանված է</translation> <translation id="2638942478653899953">Google Drive-ն անհասանելի է: <ph name="BEGIN_LINK" />Դուրս գրվեք<ph name="END_LINK" /> և նորից մուտք գործեք:</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">լատվիերեն</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> զտիչն անջատված է։</translation> <translation id="5494920125229734069">Ընտրել բոլորը</translation> -<translation id="5500104704744051184">Դուք չեք կարողանա օգտվել այս ցանցից, մինչև չմուտքագրեք PUK կոդը</translation> <translation id="5500122897333236901">Իսլանդական</translation> <translation id="5508696409934741614">Կետեր</translation> <translation id="5522908512596376669">Ֆայլերի ցանկն այժմ ցուցադրված է ցանկի տեսքով:</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Չհաջողվեց կազմաձևել ցանցը</translation> <translation id="7839804798877833423">Այս ֆայլերը քաշելու համար կպահանջվի մոտ <ph name="FILE_SIZE" /> բջջային տվյալների հոսք:</translation> <translation id="7846076177841592234">Չեղարկել ընտրվածքը</translation> -<translation id="7847617962681804761">Բջջային ինտերնետն օգտագործելու համար անհրաժեշտ է նշել PIN կոդը</translation> <translation id="7853966320808728790">Ֆրանսիական BÉPO</translation> <translation id="7857117644404132472">Ավելացնել բացառություն</translation> <translation id="7868774406711971383">լեհերեն</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> տարրի համաժամացում…</translation> <translation id="8600173386174225982">Ֆայլերի ցանկն այժմ ցուցադրված է մանրապատկերների տեսքով:</translation> <translation id="8601932370724196034">Crostini գրաֆիկական ֆայլ</translation> -<translation id="8608515571837163082">PIN կոդը սխալ է մուտքագրվել չափազանց շատ անգամներ։ Մուտքագրեք ութանիշ անձնական արգելահանման բանալին (PUK), որը տրամադրվել է ձեր օպերատորի կողմից։</translation> <translation id="8609695766746872526">իսլանդերեն</translation> <translation id="863903787380594467">PIN կոդը սխալ է։ Մնաց <ph name="RETRIES" /> փորձ։</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Միացք</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_id.xtb b/ui/chromeos/translations/ui_chromeos_strings_id.xtb index 14c1c7c..57fd421 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_id.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_id.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL konfigurasi otomatis:</translation> <translation id="2288278176040912387">Pemutar piringan hitam</translation> <translation id="2291538123825441971">Membuka <ph name="NUMBER_OF_FILES" /> file.</translation> -<translation id="2303282178633578561">Kunci kartu SIM</translation> <translation id="2303301624314357662">Membuka file <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> telah dikeluarkan.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">File terbaru Anda akan muncul di sini</translation> <translation id="2578394532502990878">Fonetik Tamil</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Administrator mengharuskan Anda menonaktifkan Kunci SIM.</translation> <translation id="2602810353103180630">Jaringan <ph name="NETWORK_INDEX" /> dari <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Kekuatan Sinyal <ph name="SIGNAL_STRENGTH" />%, Diblokir oleh Administrator Anda, Detail</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Kartu SIM terkunci</translation> <translation id="2620090360073999360">Google Drive tidak dapat dijangkau saat ini.</translation> <translation id="2621713457727696555">Aman</translation> <translation id="2638942478653899953">Google Drive tidak dapat dibuka. <ph name="BEGIN_LINK" />Keluar<ph name="END_LINK" /> dan masuk lagi.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Latvia</translation> <translation id="5489965683297092283">Filter <ph name="FILTER_NAME" /> nonaktif.</translation> <translation id="5494920125229734069">Pilih semua</translation> -<translation id="5500104704744051184">Anda tidak akan dapat menggunakan jaringan ini hingga Anda memasukkan PUK</translation> <translation id="5500122897333236901">Islandia</translation> <translation id="5508696409934741614">Titik</translation> <translation id="5522908512596376669">Daftar file telah berubah menjadi tampilan daftar.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Terjadi error saat mengonfigurasi jaringan</translation> <translation id="7839804798877833423">Mengambil file ini akan menggunakan sekitar <ph name="FILE_SIZE" /> data seluler.</translation> <translation id="7846076177841592234">Batalkan pilihan</translation> -<translation id="7847617962681804761">Perlu PIN untuk menggunakan data seluler</translation> <translation id="7853966320808728790">BÉPO Prancis</translation> <translation id="7857117644404132472">Tambahkan pengecualian</translation> <translation id="7868774406711971383">Polandia</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Menyinkronkan <ph name="NUMBER_OF_FILES" /> item...</translation> <translation id="8600173386174225982">Daftar file telah diubah menjadi tampilan thumbnail.</translation> <translation id="8601932370724196034">File gambar Crostini</translation> -<translation id="8608515571837163082">Terlalu sering memasukkan PIN yang salah. Masukkan Kunci Pembuka Blokir Pribadi (PUK) 8 digit yang diberikan oleh operator.</translation> <translation id="8609695766746872526">Islandia</translation> <translation id="863903787380594467">PIN salah. Tersisa <ph name="RETRIES" /> upaya lagi.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_is.xtb b/ui/chromeos/translations/ui_chromeos_strings_is.xtb index 3252c956..f3064e4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_is.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_is.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Sjálfvirk stilling vefslóðar:</translation> <translation id="2288278176040912387">Grammófónn</translation> <translation id="2291538123825441971">Opnar <ph name="NUMBER_OF_FILES" /> skrár.</translation> -<translation id="2303282178633578561">Læsa SIM-korti</translation> <translation id="2303301624314357662">Opnar skrána <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Pláneta</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> hefur verið aftengt.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Nýjustu skrárnar þínar birtast hér</translation> <translation id="2578394532502990878">Tamíl hljóðritun</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Stjórnandinn gerir kröfu um að þú slökkvir á SIM-lás.</translation> <translation id="2602810353103180630">Netkerfi <ph name="NETWORK_INDEX" /> af <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, sendistyrkur <ph name="SIGNAL_STRENGTH" />%, útilokað af kerfisstjóra, nánar</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> myndskeið</translation> -<translation id="2617342710774726426">SIM-kortið er læst</translation> <translation id="2620090360073999360">Ekki næst í Google Drive á þessari stundu.</translation> <translation id="2621713457727696555">Læst</translation> <translation id="2638942478653899953">Ekki náðist í Google Drive. <ph name="BEGIN_LINK" />Skráðu þig út<ph name="END_LINK" /> og svo aftur inn.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Lettneska</translation> <translation id="5489965683297092283">Slökkt er á síunni <ph name="FILTER_NAME" />.</translation> <translation id="5494920125229734069">Velja allt</translation> -<translation id="5500104704744051184">Þú munt ekki geta notað þetta net þar til þú hefur slegið inn PUK-númerið</translation> <translation id="5500122897333236901">Íslenskt</translation> <translation id="5508696409934741614">Punktar</translation> <translation id="5522908512596376669">Skráalista var breytt í listayfirlit.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Villa við að stilla netkerfi</translation> <translation id="7839804798877833423">Um það bil <ph name="FILE_SIZE" /> af farsímagögnum verða notuð til að sækja þessar skrár.</translation> <translation id="7846076177841592234">Hætta við val</translation> -<translation id="7847617962681804761">Til að nota farsímagögn þarf PIN-númer</translation> <translation id="7853966320808728790">Franskt BÉPO</translation> <translation id="7857117644404132472">Bæta við undantekningu</translation> <translation id="7868774406711971383">Pólska</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Samstillir <ph name="NUMBER_OF_FILES" /> atriði...</translation> <translation id="8600173386174225982">Skráalista var breytt í smámyndayfirlit.</translation> <translation id="8601932370724196034">Crostini-myndskrá</translation> -<translation id="8608515571837163082">Rangt PIN-númer var slegið inn of oft. Sláðu inn 8 talna PUK-númerið frá símafyrirtækinu.</translation> <translation id="8609695766746872526">Íslenska</translation> <translation id="863903787380594467">Rangt PIN-númer. <ph name="RETRIES" /> tilraunir eru eftir.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – gátt</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_it.xtb b/ui/chromeos/translations/ui_chromeos_strings_it.xtb index 00eebd1..56f74b3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_it.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_it.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL di configurazione automatica:</translation> <translation id="2288278176040912387">Giradischi</translation> <translation id="2291538123825441971">Apertura di file <ph name="NUMBER_OF_FILES" />.</translation> -<translation id="2303282178633578561">Blocca scheda SIM</translation> <translation id="2303301624314357662">Apertura del file <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Pianeta</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> è stato espulso.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">I tuoi file recenti verranno mostrati qui</translation> <translation id="2578394532502990878">Tamil fonetica</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">L'amministratore richiede la disattivazione del blocco SIM.</translation> <translation id="2602810353103180630">Rete <ph name="NETWORK_INDEX" /> di <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, intensità del segnale: <ph name="SIGNAL_STRENGTH" />%, bloccata dall'amministratore, dettagli</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">La scheda SIM è bloccata</translation> <translation id="2620090360073999360">Al momento non è possibile raggiungere Google Drive.</translation> <translation id="2621713457727696555">Protetta</translation> <translation id="2638942478653899953">Impossibile raggiungere Google Drive. <ph name="BEGIN_LINK" />Esci<ph name="END_LINK" /> e accedi di nuovo.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Lettone</translation> <translation id="5489965683297092283">Il filtro <ph name="FILTER_NAME" /> non è attivo.</translation> <translation id="5494920125229734069">Seleziona tutto</translation> -<translation id="5500104704744051184">Non potrai utilizzare questa rete finché non inserisci il PUK</translation> <translation id="5500122897333236901">Islandese</translation> <translation id="5508696409934741614">Punti</translation> <translation id="5522908512596376669">L'elenco dei file è stato modificato in visualizzazione elenco.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Errore durante la configurazione della rete</translation> <translation id="7839804798877833423">Per il recupero di questi file verranno utilizzati circa <ph name="FILE_SIZE" /> di dati mobili.</translation> <translation id="7846076177841592234">Annulla selezione</translation> -<translation id="7847617962681804761">Viene richiesto il PIN per usare i dati mobili</translation> <translation id="7853966320808728790">BÉPO francese</translation> <translation id="7857117644404132472">Aggiungi eccezione</translation> <translation id="7868774406711971383">Polacco</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Sincronizzazione di <ph name="NUMBER_OF_FILES" /> elementi...</translation> <translation id="8600173386174225982">L'elenco dei file è stato modificato in visualizzazione miniatura.</translation> <translation id="8601932370724196034">File immagine Crostini</translation> -<translation id="8608515571837163082">Hai inserito troppe volte un PIN non corretto. Inserisci il PUK (codice personale di sblocco) di 8 cifre fornito dall'operatore.</translation> <translation id="8609695766746872526">Islandese</translation> <translation id="863903787380594467">PIN errato. Hai ancora <ph name="RETRIES" /> tentativi a disposizione.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Porta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb index 4cb1d83..00ca0a71 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_iw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_iw.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">כתובת אתר של תצורה אוטומטית:</translation> <translation id="2288278176040912387">פטיפון</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> קבצים נפתחים.</translation> -<translation id="2303282178633578561">נעילת כרטיס ה-SIM</translation> <translation id="2303301624314357662">הקובץ <ph name="FILE_NAME" /> נפתח.</translation> <translation id="2304820083631266885">כוכב לכת</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> הוצא.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">הקבצים האחרונים יופיעו כאן</translation> <translation id="2578394532502990878">טמילית פונטית</translation> <translation id="2579959351793446050">אודיה</translation> -<translation id="2593644851255584939">יש דרישה מהאדמין להשבית את נעילת ה-SIM.</translation> <translation id="2602810353103180630">רשת <ph name="NETWORK_INDEX" /> מתוך <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, עוצמת האות <ph name="SIGNAL_STRENGTH" />%, נחסמה על ידי מנהל המערכת, פרטים</translation> <translation id="2614589611416690597">קובץ וידאו בפורמט <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">כרטיס ה-SIM נעול</translation> <translation id="2620090360073999360">לא ניתן להגיע אל Google Drive בשלב זה.</translation> <translation id="2621713457727696555">מאובטחת</translation> <translation id="2638942478653899953">לא ניתן היה להגיע אל Google Drive. <ph name="BEGIN_LINK" />יש לצאת<ph name="END_LINK" /> ואז להתחבר שוב.</translation> @@ -530,7 +527,6 @@ <translation id="5489067830765222292">לטבית</translation> <translation id="5489965683297092283">המסנן <ph name="FILTER_NAME" /> מושבת.</translation> <translation id="5494920125229734069">בחירת הכול</translation> -<translation id="5500104704744051184">לא תהיה לך אפשרות להשתמש ברשת הזו עד להזנת PUK</translation> <translation id="5500122897333236901">איסלנדית</translation> <translation id="5508696409934741614">נקודות</translation> <translation id="5522908512596376669">רשימת הקבצים מוצגת עכשיו בתצוגת רשימה.</translation> @@ -811,7 +807,6 @@ <translation id="7831491651892296503">אירעה שגיאה בהגדרת הרשת</translation> <translation id="7839804798877833423">הבאת קבצים אלה תצרוך בערך <ph name="FILE_SIZE" /> מחבילת הגלישה.</translation> <translation id="7846076177841592234">ביטול הבחירה</translation> -<translation id="7847617962681804761">נדרש קוד גישה לשימוש בחבילת הגלישה</translation> <translation id="7853966320808728790">BÉPO - צרפתית</translation> <translation id="7857117644404132472">להוספת מקרה חריג</translation> <translation id="7868774406711971383">פולנית</translation> @@ -906,7 +901,6 @@ <translation id="8579285237314169903">מתבצע סנכרון ל-<ph name="NUMBER_OF_FILES" /> פריטים...</translation> <translation id="8600173386174225982">רשימת הקבצים מוצגת עכשיו בתצוגת תמונות ממוזערות.</translation> <translation id="8601932370724196034">קובץ תמונה Crostini</translation> -<translation id="8608515571837163082">הוזן קוד אימות שגוי יותר מדי פעמים. צריך להזין את המפתח האישי לביטול החסימה (PUK) בן 8 הספרות שקיבלת מהספק.</translation> <translation id="8609695766746872526">איסלנדית</translation> <translation id="863903787380594467">קוד האימות שגוי. נותרו לך עוד <ph name="RETRIES" /> ניסיונות.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – יציאה</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb index 724141d..19e71f5 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ja.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ja.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">自動設定 URL:</translation> <translation id="2288278176040912387">レコード プレーヤー</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> 個のファイルを開いています。</translation> -<translation id="2303282178633578561">SIM カードをロック</translation> <translation id="2303301624314357662">ファイル <ph name="FILE_NAME" /> を開いています。</translation> <translation id="2304820083631266885">惑星</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> が取り外されました。</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">最近使用したファイルがここに表示されます</translation> <translation id="2578394532502990878">タミル語(表音)</translation> <translation id="2579959351793446050">オディア語</translation> -<translation id="2593644851255584939">管理者が SIM ロックを無効にするよう求めています。</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" /> 番目のネットワーク(全 <ph name="NETWORK_COUNT" /> 件)、<ph name="NETWORK_NAME" />、<ph name="CONNECTION_STATUS" />、信号強度 <ph name="SIGNAL_STRENGTH" />%、管理者によってブロック、詳細</translation> <translation id="2614589611416690597">動画(<ph name="VIDEO_TYPE" />)</translation> -<translation id="2617342710774726426">SIM カードはロックされています</translation> <translation id="2620090360073999360">現在 Google ドライブにアクセスできません。</translation> <translation id="2621713457727696555">保護あり</translation> <translation id="2638942478653899953">Google ドライブにアクセスできませんでした。<ph name="BEGIN_LINK" />ログアウト<ph name="END_LINK" />してもう一度ログインしてください。</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">ゴミ箱を空にする</translation> <translation id="5163869187418756376">共有できませんでした。接続を確認し、しばらくしてからもう一度お試しください。</translation> <translation id="516592729076796170">US Programmer Dvorak 配列</translation> +<translation id="5172749059808361023">制限の詳細</translation> <translation id="5177526793333269655">サムネイル ビュー</translation> <translation id="5194713942430106590">クリックすると、列が昇順で並べ替えられます。</translation> <translation id="5211614973734216083">フェロー語</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">ラトビア語</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> フィルタがオフになりました。</translation> <translation id="5494920125229734069">すべて選択する</translation> -<translation id="5500104704744051184">PUK を入力するまでこのネットワークは使用できません。</translation> <translation id="5500122897333236901">アイスランド語</translation> <translation id="5508696409934741614">ドット</translation> <translation id="5522908512596376669">ファイルの一覧がリスト表示に切り替わりました。</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">ネットワークの設定中にエラーが発生しました</translation> <translation id="7839804798877833423">このファイルを取得すると、約 <ph name="FILE_SIZE" /> のモバイル データを使用します。</translation> <translation id="7846076177841592234">選択解除</translation> -<translation id="7847617962681804761">モバイルデータを使用するには PIN が必要です</translation> <translation id="7853966320808728790">フランス語 BÉPO</translation> <translation id="7857117644404132472">例外を追加</translation> <translation id="7868774406711971383">ポーランド語</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> 個のアイテムを同期しています...</translation> <translation id="8600173386174225982">ファイルの一覧がサムネイル表示に切り替わりました。</translation> <translation id="8601932370724196034">Crostini 画像ファイル</translation> -<translation id="8608515571837163082">間違った PIN が繰り返し入力されました。携帯通信会社が提供する 8 桁の PIN ブロック解除キー(PUK)を入力してください。</translation> <translation id="8609695766746872526">アイスランド語</translation> <translation id="863903787380594467">PIN が正しくありません。入力できるのはあと <ph name="RETRIES" /> 回です。</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ポート</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb index 272ff6e..9c84630 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ka.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ka.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">ავტოკონფიგურაციის URL:</translation> <translation id="2288278176040912387">ფლეიერი</translation> <translation id="2291538123825441971">მიმდინარეობს <ph name="NUMBER_OF_FILES" /> ფაილის გახსნა.</translation> -<translation id="2303282178633578561">SIM ბარათის დაბლოკვა</translation> <translation id="2303301624314357662">იხსნება <ph name="FILE_NAME" /> ფაილი.</translation> <translation id="2304820083631266885">პლანეტა</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ამოღებულია.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">თქვენი ბოლოდროინდელი ფაილები აქ გამოჩნდება</translation> <translation id="2578394532502990878">ტამილური ფონეტიკური</translation> <translation id="2579959351793446050">ორია</translation> -<translation id="2593644851255584939">თქვენი ადმინისტრატორი მოითხოვს, რომ გათიშოთ SIM ბარათის ჩაკეტვა.</translation> <translation id="2602810353103180630">ქსელი <ph name="NETWORK_INDEX" /> / <ph name="NETWORK_COUNT" />-დან, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, სიგნალის სიძლიერე: <ph name="SIGNAL_STRENGTH" />%, დაბლოკილია თქვენი ადმინისტრატორის მიერ, დეტალები</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ვიდეო</translation> -<translation id="2617342710774726426">SIM ბარათი დაბლოკილია</translation> <translation id="2620090360073999360">Google Drive-ზე წვდომა ამჟამად შეუძლებელია.</translation> <translation id="2621713457727696555">დაცული</translation> <translation id="2638942478653899953">Google Drive-თან დაკავშირება ვერ მოხერხდა. <ph name="BEGIN_LINK" />გამოდით<ph name="END_LINK" /> და ხელახლა შედით.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">წაშლილების გასუფთავება</translation> <translation id="5163869187418756376">გაზიარება ვერ მოხერხდა. შეამოწმეთ კავშირი და ხელახლა სცადეთ.</translation> <translation id="516592729076796170">შეერთებული შტატების დვორაკი პროგრამისტებისთვის</translation> +<translation id="5172749059808361023">შეზღუდვის დეტალები</translation> <translation id="5177526793333269655">ესკიზების ხედი</translation> <translation id="5194713942430106590">დააწკაპუნეთ სვეტის ზრდადი მიმდევრობით დასალაგებლად.</translation> <translation id="5211614973734216083">ფარერული</translation> @@ -528,7 +526,6 @@ <translation id="5489067830765222292">ლატვიური</translation> <translation id="5489965683297092283">ფილტრი <ph name="FILTER_NAME" /> გამორთულია.</translation> <translation id="5494920125229734069">აარჩიეთ ყველა</translation> -<translation id="5500104704744051184">ამ ქსელს ვერ გამოიყენებთ, სანამ PUK-ს არ შეიყვანთ</translation> <translation id="5500122897333236901">ისლანდიური</translation> <translation id="5508696409934741614">წერტილები</translation> <translation id="5522908512596376669">ფაილების სია ნაჩვენებია სიის ხედში.</translation> @@ -809,7 +806,6 @@ <translation id="7831491651892296503">შეცდომა ქსელის კონფიგურაციისას</translation> <translation id="7839804798877833423">ამ ფაილების შერჩევას გამოყენებული იქნება დაახლოებით <ph name="FILE_SIZE" /> მობილური მონაცემებისა.</translation> <translation id="7846076177841592234">შერჩევის გაუქმება</translation> -<translation id="7847617962681804761">მობილური ინტერნეტის გამოსაყენებლად საჭიროა PIN კოდის გამოყენება</translation> <translation id="7853966320808728790">ფრანგული BÉPO</translation> <translation id="7857117644404132472">გამონაკლისის დამატება</translation> <translation id="7868774406711971383">პოლონური</translation> @@ -904,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ელემენტის სინქრონიზაცია…</translation> <translation id="8600173386174225982">ფაილების სია ნაჩვენებია ესკიზების ხედში.</translation> <translation id="8601932370724196034">Crostini იმიჯის ფაილი</translation> -<translation id="8608515571837163082">არასწორი PIN-კოდი ზედმეტად ბევრჯერ შეიყვანეთ. შეიყვანეთ განბლოკვის პერსონალური 8-ციფრიანი გასაღები (PUK), რომელიც თქვენმა ოპერატორმა მოგაწოდათ.</translation> <translation id="8609695766746872526">ისლანდიური</translation> <translation id="863903787380594467">PIN-კოდი არასწორია. <ph name="RETRIES" /> მცდელობა დაგრჩათ.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> — პორტი</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb index a33d036..1186a616 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kk.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Автоматты конфигурациялау URL мекенжайы:</translation> <translation id="2288278176040912387">Пластина ойнатқыш</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> файл ашылуда.</translation> -<translation id="2303282178633578561">SIM картасын құлыптау</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> файлы ашылуда.</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> шығарылды.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Жақында пайдаланған файлдарыңыз осы жерде көрсетіледі.</translation> <translation id="2578394532502990878">Тамиль (фонетикалық)</translation> <translation id="2579959351793446050">Одия</translation> -<translation id="2593644851255584939">Әкімшіңіз SIM картасының құлпын ашуды талап етеді.</translation> <translation id="2602810353103180630">Желі: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, сигнал күші: <ph name="SIGNAL_STRENGTH" />%, әкімші бөгеген, мәліметтер</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> бейнесі</translation> -<translation id="2617342710774726426">SIM картасы құлыпталған</translation> <translation id="2620090360073999360">Google Drive жүйесіне қазір кіру мүмкін емес.</translation> <translation id="2621713457727696555">Қорғалған</translation> <translation id="2638942478653899953">Google Drive мазмұнына қол жеткізу мүмкін емес. <ph name="BEGIN_LINK" />Жүйеден шығып<ph name="END_LINK" />, қайта кіріңіз.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Латыш</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> сүзгісі өшірулі.</translation> <translation id="5494920125229734069">Барлығын таңдау</translation> -<translation id="5500104704744051184">PUK кодын енгізбейінше, бұл желіні пайдалана алмайсыз.</translation> <translation id="5500122897333236901">исланд</translation> <translation id="5508696409934741614">Нүктелер</translation> <translation id="5522908512596376669">Файлдар тізім ретінде көрсетілді.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Желіні конфигурациялауда қате болды</translation> <translation id="7839804798877833423">Бұл файлдарды алу үшін ұялы деректердің шамамен <ph name="FILE_SIZE" /> пайдаланылады.</translation> <translation id="7846076177841592234">Таңдаудан бас тарту</translation> -<translation id="7847617962681804761">Мобильдік интернетті пайдалану үшін PIN коды қажет.</translation> <translation id="7853966320808728790">Француз BÉPO</translation> <translation id="7857117644404132472">Ерекше жағдайды қосу</translation> <translation id="7868774406711971383">Поляк</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> элемент синхрондалуда…</translation> <translation id="8600173386174225982">Файлдар нобай ретінде көрсетілді.</translation> <translation id="8601932370724196034">Crostini кескін файлы</translation> -<translation id="8608515571837163082">PIN коды бірнеше рет қате енгізілді. Оператор берген 8 цифрлы Жеке бөгеуден шығару кодын (PUK кодын) енгізіңіз.</translation> <translation id="8609695766746872526">Исланд</translation> <translation id="863903787380594467">PIN коды дұрыс емес. <ph name="RETRIES" /> әрекет қалды.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – ұяшық</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_km.xtb b/ui/chromeos/translations/ui_chromeos_strings_km.xtb index c9ea91de..b15bbd4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_km.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_km.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">ការកំណត់រចនាសម្ព័ន្ធ URL ដោយស្វ័យប្រវត្តិ៖</translation> <translation id="2288278176040912387">ឧបករណ៍ចាក់ថាស</translation> <translation id="2291538123825441971">កំពុងបើកឯកសារ <ph name="NUMBER_OF_FILES" />។</translation> -<translation id="2303282178633578561">ចាក់សោស៊ីមកាត</translation> <translation id="2303301624314357662">កំពុងបើកឯកសារ <ph name="FILE_NAME" /> ។</translation> <translation id="2304820083631266885">ភព</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ត្រូវបានដកចេញ។</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ឯកសារថ្មីៗរបស់អ្នកនឹងបង្ហាញនៅទីនេះ</translation> <translation id="2578394532502990878">សូរសព្ទជាភាសាតាមិល</translation> <translation id="2579959351793446050">ភាសាអូឌៀ</translation> -<translation id="2593644851255584939">អ្នកគ្រប់គ្រងរបស់អ្នកតម្រូវឱ្យអ្នកបិទការចាក់សោស៊ីម។</translation> <translation id="2602810353103180630">បណ្ដាញ <ph name="NETWORK_INDEX" /> នៃ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, កម្លាំងរលកសញ្ញា <ph name="SIGNAL_STRENGTH" />%, បានទប់ស្កាត់ដោយអ្នកគ្រប់គ្រងរបស់អ្នក, ព័ត៌មានលម្អិត</translation> <translation id="2614589611416690597">វីដេអូ <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">ស៊ីមកាតជាប់សោ</translation> <translation id="2620090360073999360">មិនអាចទៅកាន់ Google Drive បានទេនៅពេលនេះ។</translation> <translation id="2621713457727696555">មានសុវត្ថិភាព</translation> <translation id="2638942478653899953">មិនអាចទៅកាន់ Google Drive ទេ។ សូម <ph name="BEGIN_LINK" />ចាកចេញ<ph name="END_LINK" /> ហើយចូលត្រលប់វិញ។</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">សម្អាតធុងសំរាម</translation> <translation id="5163869187418756376">ការចែករំលែកបានបរាជ័យ។ ពិនិត្យការភ្ជាប់របស់អ្នក ហើយព្យាយាមម្តងទៀត។</translation> <translation id="516592729076796170">អ្នកសរសេរកម្មវិធីអាមេរិក Dvorak</translation> +<translation id="5172749059808361023">ព័ត៌មានលម្អិតអំពីការដាក់កំហិត</translation> <translation id="5177526793333269655">មើលរូបតំណាងតូច</translation> <translation id="5194713942430106590">ចុចដើម្បីតម្រៀបជួរឈរតាមលំដាប់កើន។</translation> <translation id="5211614973734216083">ភាសាហ្វារូស</translation> @@ -528,7 +526,6 @@ <translation id="5489067830765222292">ភាសាឡាតវី</translation> <translation id="5489965683297092283">តម្រង<ph name="FILTER_NAME" />ត្រូវបានបិទ។</translation> <translation id="5494920125229734069">ជ្រើសរើសទាំងអស់</translation> -<translation id="5500104704744051184">អ្នកនឹងមិនអាចប្រើបណ្ដាញនេះបានទេរហូតទាល់តែអ្នកបញ្ចូល PUK</translation> <translation id="5500122897333236901">ភាសាអាយឡែន</translation> <translation id="5508696409934741614">ចំណុច</translation> <translation id="5522908512596376669">បញ្ជីឯកសារបានប្ដូរទៅទិដ្ឋភាពបញ្ជី។</translation> @@ -809,7 +806,6 @@ <translation id="7831491651892296503">មានបញ្ហាក្នុងការកំណត់រចនាសម្ព័ន្ធបណ្តាញ</translation> <translation id="7839804798877833423">ការនាំយកឯកសារទាំងនេះនឹងត្រូវប្រើប្រហែល <ph name="FILE_SIZE" /> នៃទិន្នន័យទូរស័ព្ទរបស់អ្នក។</translation> <translation id="7846076177841592234">បោះបង់ការជ្រើសរើស</translation> -<translation id="7847617962681804761">តម្រូវឱ្យមានកូដ PIN ដើម្បីប្រើទិន្នន័យទូរសព្ទចល័ត</translation> <translation id="7853966320808728790">BÉPO បារាំង</translation> <translation id="7857117644404132472">បន្ថែមការលើកលែង</translation> <translation id="7868774406711971383">ភាសាប៉ូឡូញ</translation> @@ -904,7 +900,6 @@ <translation id="8579285237314169903">កំពុងធ្វើសមកម្មធាតុ <ph name="NUMBER_OF_FILES" />...</translation> <translation id="8600173386174225982">បញ្ជីឯកសារបានប្ដូរទៅទិដ្ឋភាពរូបភាពតូចៗ។</translation> <translation id="8601932370724196034">ឯកសាររូបភាព Crostini</translation> -<translation id="8608515571837163082">បានបញ្ចូលកូដ PIN មិនត្រឹមត្រូវច្រើនដងពេក។ បញ្ចូលកូដឈប់ទប់ស្កាត់ផ្ទាល់ខ្លួន (PUK) ចំនួន 8 ខ្ទង់ដែលផ្តល់ដោយក្រុមហ៊ុនសេវាទូរសព្ទ។</translation> <translation id="8609695766746872526">ភាសាអ៊ីស្លង់</translation> <translation id="863903787380594467">កូដ PIN មិនត្រឹមត្រូវទេ។ អ្នកអាចព្យាយាមបាន <ph name="RETRIES" /> ដងទៀត។</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - រន្ធ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb index ed922e87..1e625a7 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_kn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_kn.xtb
@@ -144,7 +144,6 @@ <translation id="2282155092769082568">ಸ್ವಯಂ ಕಾನ್ಫಿಗರೇಶನ್ URL:</translation> <translation id="2288278176040912387">ರೆಕಾರ್ಡ್ ಪ್ಲೇಯರ್</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ಫೈಲ್ಗಳನ್ನು ತೆರೆಯಲಾಗುತ್ತಿದೆ.</translation> -<translation id="2303282178633578561">ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಮಾಡಿ</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ಫೈಲ್ ಅನ್ನು ತೆರೆಯಲಾಗುತ್ತಿದೆ.</translation> <translation id="2304820083631266885">ಗ್ರಹ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ಅನ್ನು ಎಜೆಕ್ಟ್ ಮಾಡಲಾಗಿದೆ.</translation> @@ -183,10 +182,8 @@ <translation id="2570012981255377263">ನಿಮ್ಮ ಇತ್ತೀಚಿನ ಫೈಲ್ಗಳು ಇಲ್ಲಿ ಗೋಚರಿಸುತ್ತವೆ</translation> <translation id="2578394532502990878">ತಮಿಳು ಫೋನೆಟಿಕ್</translation> <translation id="2579959351793446050">ಒಡಿಯಾ</translation> -<translation id="2593644851255584939">ನಿಮ್ಮ ನಿರ್ವಾಹಕರ ಪ್ರಕಾರ, ನೀವು SIM ಲಾಕ್ ಅನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಬೇಕಾಗುತ್ತದೆ.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> ರಲ್ಲಿ <ph name="NETWORK_INDEX" /> ನೆಟ್ವರ್ಕ್,<ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ಸಿಗ್ನಲ್ ಸಾಮರ್ಥ್ಯ <ph name="SIGNAL_STRENGTH" />%, ನಿಮ್ಮ ನಿರ್ವಾಹಕರು ನಿರ್ಬಂಧಿಸಿದ್ದಾರೆ, ವಿವರಗಳು</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ವೀಡಿಯೊ</translation> -<translation id="2617342710774726426">ಸಿಮ್ ಕಾರ್ಡ್ ಲಾಕ್ ಮಾಡಲಾಗಿದೆ</translation> <translation id="2620090360073999360">ಈ ಸಮಯದಲ್ಲಿ Google ಡ್ರೈವ್ ಅನ್ನು ತಲುಪಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="2621713457727696555">ಸುರಕ್ಷಿತವಾಗಿದೆ</translation> <translation id="2638942478653899953">Google ಡ್ರೈವ್ ಅನ್ನು ತಲುಪಲಾಗಲಿಲ್ಲ. ದಯವಿಟ್ಟು <ph name="BEGIN_LINK" />ಲಾಗ್ ಔಟ್<ph name="END_LINK" /> ಮಾಡಿ ಹಾಗೂ ಮತ್ತೆ ಹಿಂತಿರುಗಿ ಲಾಗ್ ಇನ್ ಮಾಡಿ.</translation> @@ -527,7 +524,6 @@ <translation id="5489067830765222292">ಲ್ಯಾಟ್ವಿಯನ್</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ಫಿಲ್ಟರ್ ಆಫ್ ಆಗಿದೆ.</translation> <translation id="5494920125229734069">ಎಲ್ಲವನ್ನೂ ಆಯ್ಕೆ ಮಾಡಿ</translation> -<translation id="5500104704744051184">ನೀವು PUK ಕೋಡ್ ನಮೂದಿಸುವವರೆಗೂ ಈ ನೆಟ್ವರ್ಕ್ ಬಳಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ</translation> <translation id="5500122897333236901">ಐಸ್ಲ್ಯಾಂಡಿಕ್</translation> <translation id="5508696409934741614">ಚುಕ್ಕೆಗಳು</translation> <translation id="5522908512596376669">ಫೈಲ್ ಪಟ್ಟಿಯನ್ನು, ಪಟ್ಟಿ ವೀಕ್ಷಣೆಗೆ ಬದಲಾಯಿಸಲಾಗಿದೆ.</translation> @@ -798,7 +794,6 @@ <translation id="7831491651892296503">ನೆಟ್ವರ್ಕ್ ಕಾನ್ಫಿಗರ್ ಮಾಡುವಲ್ಲಿ ದೋಷ</translation> <translation id="7839804798877833423">ಈ ಫೈಲ್ಗಳನ್ನು ಪಡೆಯುವುದರಿಂದ ಮೊಬೈಲ್ ಡೇಟಾದ ಸುಮಾರು <ph name="FILE_SIZE" /> ಅನ್ನು ಬಳಸುತ್ತದೆ.</translation> <translation id="7846076177841592234">ಆಯ್ಕೆ ರದ್ದುಮಾಡಿ</translation> -<translation id="7847617962681804761">ಮೊಬೈಲ್ ಡೇಟಾ ಬಳಸಲು ಪಿನ್ ಅಗತ್ಯವಿದೆ</translation> <translation id="7853966320808728790">ಫ್ರೆಂಚ್ BÉPO</translation> <translation id="7857117644404132472">ವಿನಾಯಿತಿ ಸೇರಿಸು</translation> <translation id="7868774406711971383">ಪೋಲಿಷ್</translation> @@ -893,7 +888,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ಐಟಂಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ...</translation> <translation id="8600173386174225982">ಫೈಲ್ ಪಟ್ಟಿಯನ್ನು, ಥಂಬ್ನೇಲ್ ವೀಕ್ಷಣೆಗೆ ಬದಲಿಸಲಾಗಿದೆ.</translation> <translation id="8601932370724196034">Crostini ಚಿತ್ರದ ಫೈಲ್</translation> -<translation id="8608515571837163082">ತಪ್ಪಾದ ಪಿನ್ ಸಂಖ್ಯೆಯನ್ನು ಹಲವಾರು ಬಾರಿ ನಮೂದಿಸಿಲಾಗಿದೆ. ಕ್ಯಾರಿಯರ್ ಒದಗಿಸಿದ 8-ಸಂಖ್ಯೆಯ ಪರ್ಸನಲ್ ಅನ್ಬ್ಲಾಕಿಂಗ್ ಕೀ (PUK) ಅನ್ನು ನಮೂದಿಸಿ.</translation> <translation id="8609695766746872526">ಐಸ್ಲ್ಯಾಂಡಿಕ್</translation> <translation id="863903787380594467">ತಪ್ಪಾದ ಪಿನ್. ನೀವು <ph name="RETRIES" /> ಬಾಕಿ ಉಳಿದಿರುವ ಪ್ರಯತ್ನಗಳನ್ನು ಹೊಂದಿರುವಿರಿ.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ಪೋರ್ಟ್</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb index c74189e..1b232e4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ko.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ko.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">자동설정 URL:</translation> <translation id="2288278176040912387">레코드 플레이어</translation> <translation id="2291538123825441971">파일 <ph name="NUMBER_OF_FILES" />개를 열고 있습니다.</translation> -<translation id="2303282178633578561">SIM 카드 잠금</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> 파일을 엽니다.</translation> <translation id="2304820083631266885">행성</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" />이(가) 제거되었습니다.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">최근 파일이 여기에 표시됩니다.</translation> <translation id="2578394532502990878">타밀어(표음)</translation> <translation id="2579959351793446050">오리야어</translation> -<translation id="2593644851255584939">관리자의 요청에 따라 SIM 잠금을 사용 중지해야 합니다.</translation> <translation id="2602810353103180630">네트워크 <ph name="NETWORK_COUNT" />개 중 <ph name="NETWORK_INDEX" />번째, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, 신호 강도 <ph name="SIGNAL_STRENGTH" />%, 관리자가 차단함, 세부정보</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> 동영상</translation> -<translation id="2617342710774726426">SIM 카드가 잠겨 있습니다.</translation> <translation id="2620090360073999360">현재 Google Drive에 연결할 수 없습니다.</translation> <translation id="2621713457727696555">보안</translation> <translation id="2638942478653899953">Google Drive에 연결할 수 없습니다. <ph name="BEGIN_LINK" />로그아웃<ph name="END_LINK" />한 후 다시 로그인하세요.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">라트비아어</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> 필터가 해제되었습니다.</translation> <translation id="5494920125229734069">모두 선택</translation> -<translation id="5500104704744051184">PUK를 입력할 때까지 이 네트워크를 사용할 수 없습니다.</translation> <translation id="5500122897333236901">아이슬란드어</translation> <translation id="5508696409934741614">점</translation> <translation id="5522908512596376669">파일 목록을 목록 보기로 변경했습니다.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">네트워크를 설정하는 중에 오류가 발생했습니다</translation> <translation id="7839804798877833423">이 파일을 가져오는 데 약 <ph name="FILE_SIZE" />의 모바일 데이터가 사용됩니다.</translation> <translation id="7846076177841592234">선택 취소</translation> -<translation id="7847617962681804761">모바일 데이터를 사용하려면 PIN이 필요합니다.</translation> <translation id="7853966320808728790">프랑스어 BÉPO</translation> <translation id="7857117644404132472">예외 추가</translation> <translation id="7868774406711971383">폴란드어</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" />개 항목 동기화 중...</translation> <translation id="8600173386174225982">파일 목록을 미리보기 이미지 뷰로 변경했습니다.</translation> <translation id="8601932370724196034">Crostini 이미지 파일</translation> -<translation id="8608515571837163082">잘못된 PIN을 너무 여러 번 입력했습니다. 이동통신사에서 제공한 8자리 PUK(Personal Unblocking Key)를 입력하세요.</translation> <translation id="8609695766746872526">아이슬란드어</translation> <translation id="863903787380594467">잘못된 PIN입니다. 기회가 <ph name="RETRIES" />번 남았습니다.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - 포트</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb index 44b3cc1..fd00db2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ky.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ky.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Автоконфигурация URL'и:</translation> <translation id="2288278176040912387">Жазууну ойноткуч</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> файл ачылууда.</translation> -<translation id="2303282178633578561">SIM картаны кулпулоо</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> файлы ачылууда.</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> чыгарылды.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Акыркы файлдарыңыз ушул жерде көрүнөт</translation> <translation id="2578394532502990878">Тамилче (фонетикалык)</translation> <translation id="2579959351793446050">Одияча</translation> -<translation id="2593644851255584939">Администраторуңуз SIM картаны кулпулоону талап кылууда.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> ичинен <ph name="NETWORK_INDEX" />-тармак, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Сигналдын күчү <ph name="SIGNAL_STRENGTH" />%, Администраторуңуз бөгөттөп койгон, Чоо-жайы</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> форматындагы видео</translation> -<translation id="2617342710774726426">SIM-карта кулпуланган</translation> <translation id="2620090360073999360">Учурда Google Drive'га жетүү мүмкүн эмес.</translation> <translation id="2621713457727696555">Корголгон</translation> <translation id="2638942478653899953">Google Drive жеткиликтүү эмес. <ph name="BEGIN_LINK" />Тутумдан чыгып<ph name="END_LINK" />, кайра кириңиз.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Латвияча</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> чыпкасы өчүк.</translation> <translation id="5494920125229734069">Баарын тандоо</translation> -<translation id="5500104704744051184">PUK кодун киргизмейинче бул тармакты колдоно албайсыз</translation> <translation id="5500122897333236901">Исландча</translation> <translation id="5508696409934741614">Чекиттер</translation> <translation id="5522908512596376669">Файлдардын тизмеси тизме көрүнүшүнө которулду.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Тармакты конфигурациялоо учурунда ката кетти</translation> <translation id="7839804798877833423">Бул файлдар алынганда болжол менен мобилдик дайындардын <ph name="FILE_SIZE" /> колдонулат.</translation> <translation id="7846076177841592234">Тандоону жокко чыгаруу</translation> -<translation id="7847617962681804761">Мобилдик трафикти колдонуу үчүн PIN код керектелет</translation> <translation id="7853966320808728790">Французча BÉPO</translation> <translation id="7857117644404132472">Өзгөчө учурду кошуу</translation> <translation id="7868774406711971383">Полякча</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> нерсе шайкештирилүүдө…</translation> <translation id="8600173386174225982">Файлдардын тизмеси эскиз көрүнүшүнө которулду.</translation> <translation id="8601932370724196034">Crostini сүрөт файлы</translation> -<translation id="8608515571837163082">Туура эмес PIN код өтө көп жолу киргизилди. Байланыш операторуңуз берген 8 орундуу Жеке бөгөттөн чыгаруу ачкычын (PUK) киргизиңиз.</translation> <translation id="8609695766746872526">Исландча</translation> <translation id="863903787380594467">PIN код туура эмес. Сизде <ph name="RETRIES" /> аракет калды.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Оюкча</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb index 3c0486a..e30a859 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lo.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lo.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL ການກຳນົດຄ່າອັດໂນມັດ:</translation> <translation id="2288278176040912387">ເຄື່ອງຫຼິ້ນບັນທຶກ</translation> <translation id="2291538123825441971">ກຳລັງເປີດ <ph name="NUMBER_OF_FILES" /> ໄຟລ໌.</translation> -<translation id="2303282178633578561">ລັອກຊິມກາດ</translation> <translation id="2303301624314357662">ກຳລັງເປີດໄຟລ໌ <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">ດາວເຄາະ</translation> <translation id="2305020378527873881">ຖອດ <ph name="VOLUME_NAME" /> ອອກແລ້ວ.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ໄຟລ໌ຫຼ້າສຸດຂອງທ່ານຈະປາກົດຢູ່ບ່ອນນີ້</translation> <translation id="2578394532502990878">ພາສາທາມິລ (ຕາມການອອກສຽງ)</translation> <translation id="2579959351793446050">ພາສາໂອເດຍ</translation> -<translation id="2593644851255584939">ຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານຕ້ອງການໃຫ້ທ່ານປິດການນຳໃຊ້ລັອກ SIM.</translation> <translation id="2602810353103180630">ເຄືອຂ່າຍທີ <ph name="NETWORK_INDEX" /> ຈາກທັງໝົດ <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ຄວາມແຮງສັນຍານ <ph name="SIGNAL_STRENGTH" />%, ຖືກບລັອກໂດຍຜູ້ເບິ່ງແຍງລະບົບຂອງທ່ານ, ລາຍລະອຽດ</translation> <translation id="2614589611416690597">ວິດີໂອ <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">ແຜ່ນ SIM ລັອກແລ້ວ</translation> <translation id="2620090360073999360">ບໍ່ສາມາດເຂົ້າເຖິງ Google Drive ໄດ້ໃນເວລານີ້.</translation> <translation id="2621713457727696555">ຮັກສາຄວາມປອດໄພແລ້ວ</translation> <translation id="2638942478653899953">ບໍ່ສາມາດເຂົ້າຫາ Google Drive ໄດ້. ກະລຸນາ <ph name="BEGIN_LINK" />ອອກຈາກລະບົບ<ph name="END_LINK" /> ແລະລົງຊື່ກັບເຂົ້າຫາອີກ.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">ພາສາລັດວຽນ</translation> <translation id="5489965683297092283">ປິດຕົວກັ່ນຕອງ <ph name="FILTER_NAME" /> ແລ້ວ.</translation> <translation id="5494920125229734069">ເລືອກທັງຫມົດ</translation> -<translation id="5500104704744051184">ທ່ານຈະບໍ່ສາມາດໃຊ້ເຄືອຂ່າຍນີ້ໄດ້ຈົນກວ່າທ່ານຈະໃສ່ລະຫັດ PUK</translation> <translation id="5500122897333236901">ພາສາໄອແລນດິກ</translation> <translation id="5508696409934741614">ຈຸດ</translation> <translation id="5522908512596376669">ລາຍການໄຟລ໌ໄດ້ປ່ຽນເປັນມຸມມອງລາຍການແລ້ວ.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">ມີຄວາມຜິດພາດໃນການກຳນົດຄ່າເຄືອຂ່າຍ</translation> <translation id="7839804798877833423">ການໄປເອົາໄຟລ໌ເຫຼົ່ານີ້ຈະໃຊ້ຂໍ້ມູນມືຖືປະມານ <ph name="FILE_SIZE" />.</translation> <translation id="7846076177841592234">ຍົກເລີກການເລືອກ</translation> -<translation id="7847617962681804761">ຕ້ອງໃຊ້ PIN ໃນການໃຊ້ອິນເຕີເນັດມືຖື</translation> <translation id="7853966320808728790">BÉPO ພາສາຝຣັ່ງ</translation> <translation id="7857117644404132472">ເພີ່ມຂໍ້ຍົກເວັ້ນ</translation> <translation id="7868774406711971383">ພາສາໂພລິຊ</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">ກໍາລັງຊິງຄ໌ <ph name="NUMBER_OF_FILES" /> ລາຍການ...</translation> <translation id="8600173386174225982">ລາຍການໄຟລ໌ໄດ້ປ່ຽນເປັນມຸມມອງຮູບຫຍໍ້ແລ້ວ.</translation> <translation id="8601932370724196034">ໄຟລ໌ຮູບພາບ Crostini</translation> -<translation id="8608515571837163082">ລະບຸ PIN ບໍ່ຖືກຕ້ອງຫຼາຍເທື່ອເກີນໄປແລ້ວ. ປ້ອນລະຫັດຍົກເລີກການບລັອກ (PUK) 8 ຫຼັກ ທີ່ໃຫ້ມາໂດຍຜູ້ໃຫ້ບໍລິການ.</translation> <translation id="8609695766746872526">ພາສາໄອແລນດິກ</translation> <translation id="863903787380594467">PIN ບໍ່ຖືກຕ້ອງ. ທ່ານລອງໄດ້ອີກ <ph name="RETRIES" /> ເທື່ອ.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ຜອດ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb index 1e271041..b40baf2 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lt.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lt.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Automatinės konfigūracijos URL:</translation> <translation id="2288278176040912387">Grotuvas</translation> <translation id="2291538123825441971">Atidaroma failų: <ph name="NUMBER_OF_FILES" />.</translation> -<translation id="2303282178633578561">Užrakinti SIM kortelę</translation> <translation id="2303301624314357662">Atidaromas failas „<ph name="FILE_NAME" />“.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">„<ph name="VOLUME_NAME" />“ pašalintas.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Naujausi failai bus rodomi čia</translation> <translation id="2578394532502990878">Tamilų k. fonetinė</translation> <translation id="2579959351793446050">Orijų k.</translation> -<translation id="2593644851255584939">Administratorius reikalauja išjungti SIM kortelės užraktą.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" /> tinklas iš <ph name="NETWORK_COUNT" />, „<ph name="NETWORK_NAME" />“, <ph name="CONNECTION_STATUS" />, signalo stiprumas <ph name="SIGNAL_STRENGTH" /> %, užblokavo administratorius, išsami informacija</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> vaizdo įrašas</translation> -<translation id="2617342710774726426">SIM kortelė užrakinta</translation> <translation id="2620090360073999360">„Google“ diskas šiuo metu nepasiekiamas.</translation> <translation id="2621713457727696555">Apsaugota</translation> <translation id="2638942478653899953">Nepavyko pasiekti „Google“ disko. <ph name="BEGIN_LINK" />Atsijunkite<ph name="END_LINK" /> ir vėl prisijunkite.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Latvių k.</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> filtras išjungtas.</translation> <translation id="5494920125229734069">Pasirinkti viską</translation> -<translation id="5500104704744051184">Negalėsite naudoti šio tinklo, kol įvesite PUK kodą</translation> <translation id="5500122897333236901">Islandų</translation> <translation id="5508696409934741614">Taškai</translation> <translation id="5522908512596376669">Failų sąrašas pakeistas į sąrašo rodinį.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Klaida konfigūruojant tinklą</translation> <translation id="7839804798877833423">Šiems failams gauti reikės apytiksliai <ph name="FILE_SIZE" /> duomenų mobiliesiems.</translation> <translation id="7846076177841592234">Atšaukti pasirinkimą</translation> -<translation id="7847617962681804761">Norint naudoti mobiliojo ryšio duomenis, būtinas PIN kodas</translation> <translation id="7853966320808728790">Prancūziška BÉPO</translation> <translation id="7857117644404132472">Pridėti išimtį</translation> <translation id="7868774406711971383">Lenkų k.</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Sinchronizuojama elementų: <ph name="NUMBER_OF_FILES" />…</translation> <translation id="8600173386174225982">Failų sąrašas pakeistas į miniatiūrų rodinį.</translation> <translation id="8601932370724196034">„Crostini“ vaizdo failas</translation> -<translation id="8608515571837163082">Per daug kartų įvestas netinkamas PIN kodas. Įveskite operatoriaus pateiktą aštuonių skaitmenų asmeninį blokavimo panaikinimo raktą (PUK kodą).</translation> <translation id="8609695766746872526">Islandų k.</translation> <translation id="863903787380594467">Netinkamas PIN kodas. Liko bandymų: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – prievadas</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb index 90c6daf..1b11fb3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_lv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_lv.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Automātiskās konfigurācijas vietrādis URL</translation> <translation id="2288278176040912387">Ierakstu atskaņotājs</translation> <translation id="2291538123825441971">Notiek <ph name="NUMBER_OF_FILES" /> failu atvēršana.</translation> -<translation id="2303282178633578561">Bloķēt SIM karti</translation> <translation id="2303301624314357662">Tiek atvērts fails <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planēta</translation> <translation id="2305020378527873881">Sējums <ph name="VOLUME_NAME" /> ir noņemts.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Jaunākie faili tiks rādīti šeit</translation> <translation id="2578394532502990878">Tamilu, fonētiskā</translation> <translation id="2579959351793446050">Oriju</translation> -<translation id="2593644851255584939">Administrators pieprasa atspējot SIM kartes bloķēšanu.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. tīkls no <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signāla stiprums: <ph name="SIGNAL_STRENGTH" />%, bloķēja jūsu administrators, detalizēta informācija</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> video</translation> -<translation id="2617342710774726426">SIM karte ir bloķēta.</translation> <translation id="2620090360073999360">Šobrīd Google disku nevar sasniegt.</translation> <translation id="2621713457727696555">Aizsargāts</translation> <translation id="2638942478653899953">Nevarēja piekļūt Google diskam. Lūdzu, <ph name="BEGIN_LINK" />atsakieties<ph name="END_LINK" /> un atkārtoti piesakieties.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Latviešu</translation> <translation id="5489965683297092283">Filtrs “<ph name="FILTER_NAME" />” ir izslēgts.</translation> <translation id="5494920125229734069">Atlasīt visu</translation> -<translation id="5500104704744051184">Nevarēsiet lietot šo tīklu, kamēr nebūsiet ievadījis PUK.</translation> <translation id="5500122897333236901">Īslandiešu valoda</translation> <translation id="5508696409934741614">Punkti</translation> <translation id="5522908512596376669">Failu saraksts ir mainīts uz saraksta skatu.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Tīkla konfigurācijas kļūda</translation> <translation id="7839804798877833423">Izgūstot šos failus, tiks izmantoti aptuveni <ph name="FILE_SIZE" /> mobilo datu.</translation> <translation id="7846076177841592234">Atcelt atlasi</translation> -<translation id="7847617962681804761">Lai izmantotu mobilos datus, jānorāda PIN</translation> <translation id="7853966320808728790">Franču valodas BÉPO tastatūra</translation> <translation id="7857117644404132472">Pievienot izņēmumu</translation> <translation id="7868774406711971383">Poļu</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Notiek <ph name="NUMBER_OF_FILES" /> vienumu sinhronizēšana...</translation> <translation id="8600173386174225982">Failu saraksts ir mainīts uz sīktēlu skatu.</translation> <translation id="8601932370724196034">Crostini attēla fails</translation> -<translation id="8608515571837163082">Pārāk daudz reižu tika ievadīts nepareizs PIN. Ievadiet astoņu ciparu personisko atbloķēšanas atslēgu (PUK), ko nodrošina mobilo sakaru operators.</translation> <translation id="8609695766746872526">Islandiešu</translation> <translation id="863903787380594467">Nepareizs PIN. Atlikuši <ph name="RETRIES" /> mēģinājumi.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> — ports</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb index cc968da5..d68b751 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mk.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Линк за автоматско конфигурирање:</translation> <translation id="2288278176040912387">Грамофон</translation> <translation id="2291538123825441971">Се отвораат <ph name="NUMBER_OF_FILES" /> датотеки.</translation> -<translation id="2303282178633578561">Заклучи SIM-картичка</translation> <translation id="2303301624314357662">Се отвора датотеката <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> е отстранет.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Неодамнешните датотеки ќе се појават тука</translation> <translation id="2578394532502990878">фонетски тамилски</translation> <translation id="2579959351793446050">одија</translation> -<translation id="2593644851255584939">Администраторот бара да го оневозможите заклучувањето SIM-картичка.</translation> <translation id="2602810353103180630">Мрежа <ph name="NETWORK_INDEX" /> од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, јачина на сигналот: <ph name="SIGNAL_STRENGTH" /> %, блокирано од администраторот, детали</translation> <translation id="2614589611416690597">Видео: <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM-картичката е заклучена</translation> <translation id="2620090360073999360">Не може да се достапи до Google Диск во моментов.</translation> <translation id="2621713457727696555">Заштитена</translation> <translation id="2638942478653899953">Не може да се добие Google Диск. <ph name="BEGIN_LINK" />Одјавете се<ph name="END_LINK" /> и повторно најавете се.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">летонски</translation> <translation id="5489965683297092283">Филтерот <ph name="FILTER_NAME" /> е исклучен.</translation> <translation id="5494920125229734069">Избери сè</translation> -<translation id="5500104704744051184">Нема да може да ја користите мрежава додека не внесете PUK</translation> <translation id="5500122897333236901">Исландски</translation> <translation id="5508696409934741614">Точки</translation> <translation id="5522908512596376669">Списокот со датотеки се смени во преглед на список.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Грешка при конфигурирање на мрежата</translation> <translation id="7839804798877833423">Земањето на овие датотеки ќе користи приближно <ph name="FILE_SIZE" /> од мобилните податоци.</translation> <translation id="7846076177841592234">Откажи избор</translation> -<translation id="7847617962681804761">Потребен е PIN за користење мобилен интернет</translation> <translation id="7853966320808728790">Француска BÉPO</translation> <translation id="7857117644404132472">Додајте исклучок</translation> <translation id="7868774406711971383">полски</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Се синхронизираат <ph name="NUMBER_OF_FILES" /> ставки...</translation> <translation id="8600173386174225982">Списокот со датотеки се смени во преглед на сликички.</translation> <translation id="8601932370724196034">Датотека со слика Crostini</translation> -<translation id="8608515571837163082">Внесовте погрешен PIN премногу пати. Внесете го 8-цифрениот личен клуч за одблокирање (PUK) обезбеден од операторот.</translation> <translation id="8609695766746872526">исландски</translation> <translation id="863903787380594467">Погрешен PIN. Имате уште <ph name="RETRIES" /> обиди.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Порта</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb index 0200d2b3..63fdc19 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ml.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ml.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">സ്വയമേവ കോൺഫിഗറേഷൻ URL:</translation> <translation id="2288278176040912387">റെക്കോർഡ് പ്ലേയർ</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ഫയലുകൾ തുറക്കുന്നു.</translation> -<translation id="2303282178633578561">സിം കാർഡ് ലോക്ക് ചെയ്യുക</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ഫയൽ തുറക്കുന്നു.</translation> <translation id="2304820083631266885">ഗ്രഹം</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ഒഴിവാക്കി.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">നിങ്ങളുടെ അടുത്തിടെയുള്ള ഫയലുകൾ ഇവിടെ ദൃശ്യമാകും</translation> <translation id="2578394532502990878">തമിഴ് ഉച്ചാരണ ശബ്ദം</translation> <translation id="2579959351793446050">ഒഡിയ</translation> -<translation id="2593644851255584939">സിം ലോക്ക് പ്രവർത്തനരഹിതമാക്കാൻ നിങ്ങളുടെ അഡ്മിൻ ആവശ്യപ്പെടുന്നു.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />-ൽ <ph name="NETWORK_COUNT" /> നെറ്റ്വർക്ക്, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, സിഗ്നൽ ശക്തി <ph name="SIGNAL_STRENGTH" />%, നിങ്ങളുടെ അഡ്മിൻ ബ്ലോക്ക് ചെയ്തിരിക്കുന്നു, വിശദാംശങ്ങൾ</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> വീഡിയോ</translation> -<translation id="2617342710774726426">സിം കാർഡ് ലോക്കുചെയ്തു</translation> <translation id="2620090360073999360">Google ഡ്രൈവിൽ ഇപ്പോൾ എത്തിച്ചേരാൻ കഴിയില്ല.</translation> <translation id="2621713457727696555">സുരക്ഷിതമാക്കി</translation> <translation id="2638942478653899953">Google ഡ്രൈവിൽ പ്രവേശിക്കാനായില്ല. <ph name="BEGIN_LINK" />ലോഗ് ഔട്ട്<ph name="END_LINK" /> ചെയ്ത ശേഷം തിരികെ ലോഗ് ഇൻ ചെയ്യുക.</translation> @@ -530,7 +527,6 @@ <translation id="5489067830765222292">ലാത്വിയൻ</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ഫിൽട്ടർ ഓഫാണ്.</translation> <translation id="5494920125229734069">എല്ലാം തിരഞ്ഞെടുക്കുക</translation> -<translation id="5500104704744051184">PUK നൽകുന്നത് വരെ നിങ്ങൾക്ക് ഈ നെറ്റ്വർക്ക് ഉപയോഗിക്കാനാകില്ല</translation> <translation id="5500122897333236901">ഐസ്ലാന്ഡിക്</translation> <translation id="5508696409934741614">ഡോട്ടുകൾ</translation> <translation id="5522908512596376669">ഫയൽ ലിസ്റ്റ് ഗ്രിഡ് കാഴ്ചയിലേക്ക് മാറ്റിയിട്ടുണ്ട്.</translation> @@ -811,7 +807,6 @@ <translation id="7831491651892296503">നെറ്റ്വര്ക്ക് കോണ്ഫിഗര് ചെയ്യുന്നതിൽ പിശക്</translation> <translation id="7839804798877833423">ഈ ഫയലുകൾ ലഭ്യമാക്കുന്നതിന് ഏകദേശം <ph name="FILE_SIZE" /> മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കും.</translation> <translation id="7846076177841592234">തിരഞ്ഞെടുത്തത് റദ്ദാക്കുക</translation> -<translation id="7847617962681804761">മൊബൈൽ ഡാറ്റ ഉപയോഗിക്കാൻ പിൻ ആവശ്യമാണ്</translation> <translation id="7853966320808728790">ഫ്രഞ്ച് BÉPO</translation> <translation id="7857117644404132472">ഒഴിവാക്കൽ ചേർക്കുക</translation> <translation id="7868774406711971383">പോളിഷ്</translation> @@ -906,7 +901,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ഇനങ്ങൾ സമന്വയിപ്പിക്കുന്നു...</translation> <translation id="8600173386174225982">ഫയൽ ലിസ്റ്റ് ലഘുചിത്ര കാഴ്ചയിലേക്ക് മാറ്റിയിട്ടുണ്ട്.</translation> <translation id="8601932370724196034">Crostini ചിത്ര ഫയൽ</translation> -<translation id="8608515571837163082">തെറ്റായ പിൻ നിരവധി തവണ നൽകി. നിങ്ങളുടെ സേവനദാതാവ് നൽകിയ 8 അക്ക പേഴ്സണൽ അൺബ്ലോക്കിംഗ് കീ (PUK) നൽകുക.</translation> <translation id="8609695766746872526">ഐസ്ലാന്ഡിക്</translation> <translation id="863903787380594467">പിൻ തെറ്റാണ്. നിങ്ങൾക്ക് <ph name="RETRIES" /> ശ്രമങ്ങൾ കൂടി ബാക്കിയുണ്ട്.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - പോർട്ട്</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb index 372fdabd..9ad48b9 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mn.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Автоматаар тохируулах URL:</translation> <translation id="2288278176040912387">Бичлэг тоглуулагч</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> файлыг нээж байна.</translation> -<translation id="2303282178633578561">SIM картыг түгжих</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> файлыг нээж байна.</translation> <translation id="2304820083631266885">Гараг</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" />-г салгалаа.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Таны саяхны файлууд энд харагдана</translation> <translation id="2578394532502990878">Тамил авиа зүй</translation> <translation id="2579959351793446050">Одиа</translation> -<translation id="2593644851255584939">Таны администратор SIM түгжээгээ идэвхгүй болгохыг шаардаж байна.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />-н <ph name="NETWORK_INDEX" />-р сүлжээ, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Дохионы хүч <ph name="SIGNAL_STRENGTH" />%, Танай администратор блоклосон, Дэлгэрэнгүй</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> видео</translation> -<translation id="2617342710774726426">SIM карт түгжигдсэн</translation> <translation id="2620090360073999360">Google Drive-д одоогоор хандаж болохгүй байна.</translation> <translation id="2621713457727696555">Хамгаалалттай</translation> <translation id="2638942478653899953">Google Drive-тай холбогдож чадсангүй. <ph name="BEGIN_LINK" /> руу ороод <ph name="END_LINK" />-ээс гараад дахин нэвтэрнэ үү.</translation> @@ -486,6 +483,7 @@ <translation id="5159560892333415631">Хогийн савыг хоослох</translation> <translation id="5163869187418756376">Хуваалцах ажиллагаа амжилтгүй боллоо. Холболтоо шалгаад, дараа дахин оролдож үзнэ үү.</translation> <translation id="516592729076796170">US Programmer Dvorak</translation> +<translation id="5172749059808361023">Хязгаарлалтын дэлгэрэнгүй</translation> <translation id="5177526793333269655">Хажуугийн талбарт жижгээр харах</translation> <translation id="5194713942430106590">Баганыг өсөх дарааллаар эрэмбэлэхийн тулд товшино уу.</translation> <translation id="5211614973734216083">Фарер</translation> @@ -526,7 +524,6 @@ <translation id="5489067830765222292">Латви</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> шүүлтүүр унтраалттай байна.</translation> <translation id="5494920125229734069">Бүгдийг сонго</translation> -<translation id="5500104704744051184">Та PUK-г оруулах хүртлээ энэ сүлжээг ашиглах боломжгүй байх болно</translation> <translation id="5500122897333236901">Исланд</translation> <translation id="5508696409934741614">Цэг</translation> <translation id="5522908512596376669">Файлын жагсаалтыг жагсаалтаар харах горимд шилжүүлэв.</translation> @@ -807,7 +804,6 @@ <translation id="7831491651892296503">Сүлжээг тохируулахад алдаа гарлаа</translation> <translation id="7839804798877833423">Эдгээр файлуудыг татаж авчрахад гар утасны өгөгдлийн ойролцоогоор <ph name="FILE_SIZE" />-ийг ашиглах болно.</translation> <translation id="7846076177841592234">Сонголтыг цуцлах</translation> -<translation id="7847617962681804761">Мобайл дата ашиглахын тулд ПИН шаардлагатай</translation> <translation id="7853966320808728790">Франц хэлний BÉPO</translation> <translation id="7857117644404132472">Онцгой тохиолдол нэмэх</translation> <translation id="7868774406711971383">Польш</translation> @@ -902,7 +898,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> зүйлийг хуулж байна</translation> <translation id="8600173386174225982">Файлын жагсаалтыг өнгөц зургаар харах горимд шилжүүлэв.</translation> <translation id="8601932370724196034">Crostini зургийн файл</translation> -<translation id="8608515571837163082">ПИН-г хэт олон удаа буруу оруулсан байна. Оператор компанийн олгосон 8 оронтой Блокоос гаргах хувийн түлхүүр (PUK)-ийг оруулна уу.</translation> <translation id="8609695766746872526">Исланд</translation> <translation id="863903787380594467">ПИН буруу байна. Танд <ph name="RETRIES" /> оролдлого үлдлээ.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Порт</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb index 4dfe3fbc..33520e9f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_mr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_mr.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">स्वयंकॉन्फिगरेशन URL:</translation> <translation id="2288278176040912387">रेकॉर्ड प्लेयर</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> फाइल उघडत आहे</translation> -<translation id="2303282178633578561">सिम कार्ड लॉक करा</translation> <translation id="2303301624314357662">फाइल <ph name="FILE_NAME" /> उघडत आहे.</translation> <translation id="2304820083631266885">ग्रह</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> बाहेर काढले गेले आहे.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">तुमच्या अलीकडील फाइल येथे दिसतील</translation> <translation id="2578394532502990878">तमिळ फोनेटिक</translation> <translation id="2579959351793446050">ओडिया</translation> -<translation id="2593644851255584939">तुमच्या अॅडमिनिस्ट्रेटरनुसार तुम्ही सिम लॉक बंद करणे आवश्यक आहे.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> पैकी <ph name="NETWORK_INDEX" /> नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, सिग्नल क्षमता <ph name="SIGNAL_STRENGTH" />%, तुमच्या अॅडमिनिस्ट्रेटर ने ब्लॉक केलेले नेटवर्क, तपशील</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> व्हिडिओ</translation> -<translation id="2617342710774726426">सिम कार्ड लॉक केले आहे</translation> <translation id="2620090360073999360">Google ड्राइव्ह यावेळी पोहोचू शकत नाही.</translation> <translation id="2621713457727696555">सुरक्षित</translation> <translation id="2638942478653899953">Google ड्राइव्ह पर्यंत पोहोचणे शक्य नाही. कृपया <ph name="BEGIN_LINK" />लॉग आउट करा<ph name="END_LINK" /> आणि परत लॉग इन करा.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">लाटवियन</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> फिल्टर बंद आहे.</translation> <translation id="5494920125229734069">सर्व निवडा</translation> -<translation id="5500104704744051184">तुम्ही PUK एंटर करेपर्यंत तुम्हाला हे नेटवर्क वापरता येणार नाही</translation> <translation id="5500122897333236901">आइसलँडिक</translation> <translation id="5508696409934741614">बिंदू</translation> <translation id="5522908512596376669">फाइल सूची सूची दृश्यमध्ये बदलली गेली आहे.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">नेटवर्क कॉंफिगर करताना एरर आली</translation> <translation id="7839804798877833423">या फाइल प्राप्त करताना अंदाजे <ph name="FILE_SIZE" /> मोबाइल डेटा वापरला जाईल.</translation> <translation id="7846076177841592234">निवड रद्द करा</translation> -<translation id="7847617962681804761">मोबाइल डेटा वापरण्यासाठी पिन आवश्यक आहे</translation> <translation id="7853966320808728790">फ्रेंच बेपो</translation> <translation id="7857117644404132472">एक्सेप्शन जोडा</translation> <translation id="7868774406711971383">पोलिश</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> आयटम संकालित करीत आहे...</translation> <translation id="8600173386174225982">फाइल सूची थंबनेल व्ह्यूमध्ये बदलली गेली आहे.</translation> <translation id="8601932370724196034">Crostini इमेज फाइल</translation> -<translation id="8608515571837163082">बऱ्याच वेळा चुकीचा पिन एंटर केला होता. वाहकाद्वारे पुरवलेली आठ अंकी वैयक्तिक अनब्लॉक करण्याची की (PUK) एंटर करा.</translation> <translation id="8609695766746872526">आइसलँडिक</translation> <translation id="863903787380594467">चुकीचा पिन. तुमच्याकडे <ph name="RETRIES" /> प्रयत्न शिल्लक आहेत.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - पोर्ट</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb index 5b205c3..5e340bf0d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ms.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ms.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL autokonfigurasi:</translation> <translation id="2288278176040912387">Pemain Piring Hitam</translation> <translation id="2291538123825441971">Membuka <ph name="NUMBER_OF_FILES" /> fail.</translation> -<translation id="2303282178633578561">Kunci kad SIM</translation> <translation id="2303301624314357662">Membuka fail <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" />telah dikeluarkan.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Fail terbaharu anda akan dipaparkan di sini</translation> <translation id="2578394532502990878">Fonetik Tamil</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Pentadbir anda menghendaki anda melumpuhkan Kunci SIM.</translation> <translation id="2602810353103180630">Rangkaian <ph name="NETWORK_INDEX" /> daripada <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Kekuatan Isyarat <ph name="SIGNAL_STRENGTH" />%, Disekat oleh Pentadbir anda, Butiran</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Kad SIM dikunci</translation> <translation id="2620090360073999360">Google Drive tidak dapat dicapai pada masa ini.</translation> <translation id="2621713457727696555">Selamat</translation> <translation id="2638942478653899953">Google Drive tidak dapat dicapai. Sila <ph name="BEGIN_LINK" />log keluar<ph name="END_LINK" /> dan log masuk kembali.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Kosongkan Sampah</translation> <translation id="5163869187418756376">Perkongsian gagal. Periksa sambungan anda dan cuba lagi nanti.</translation> <translation id="516592729076796170">Dvorak Pengatur Cara AS</translation> +<translation id="5172749059808361023">Butiran sekatan</translation> <translation id="5177526793333269655">Paparan lakaran kenit</translation> <translation id="5194713942430106590">Klik untuk mengisih lajur dalam tertib menaik.</translation> <translation id="5211614973734216083">Faroe</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Latvia</translation> <translation id="5489965683297092283">Penapis <ph name="FILTER_NAME" /> dimatikan.</translation> <translation id="5494920125229734069">Pilih semua</translation> -<translation id="5500104704744051184">Anda tidak akan dapat menggunakan rangkaian ini sehingga anda memasukkan PUK</translation> <translation id="5500122897333236901">Bahasa Iceland</translation> <translation id="5508696409934741614">Titik</translation> <translation id="5522908512596376669">Senarai fail telah berubah kepada paparan senarai.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Ralat mengkonfigurasi rangkaian</translation> <translation id="7839804798877833423">Pengambilan fail ini akan menggunakan kira-kira <ph name="FILE_SIZE" /> data mudah alih.</translation> <translation id="7846076177841592234">Batalkan pilihan</translation> -<translation id="7847617962681804761">PIN diperlukan untuk menggunakan data mudah alih</translation> <translation id="7853966320808728790">BEPO Perancis</translation> <translation id="7857117644404132472">Tambah pengecualian</translation> <translation id="7868774406711971383">Poland</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Menyegerakkan <ph name="NUMBER_OF_FILES" /> item...</translation> <translation id="8600173386174225982">Senarai fail telah berubah kepada paparan lakaran kecil.</translation> <translation id="8601932370724196034">Fail imej Crostini</translation> -<translation id="8608515571837163082">PIN yang salah telah dimasukkan terlalu banyak kali. Masukkan Kunci Penyahsekat Peribadi (PUK) 8 digit yang diberikan oleh pembawa.</translation> <translation id="8609695766746872526">Iceland</translation> <translation id="863903787380594467">PIN salah. Anda mempunyai <ph name="RETRIES" /> percubaan lagi.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_my.xtb b/ui/chromeos/translations/ui_chromeos_strings_my.xtb index de476a7c..cbcec7ad 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_my.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_my.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">အလိုအလျောက် စီစဉ်သတ်မှတ်ခြင်း URL −</translation> <translation id="2288278176040912387">ကစားသူ မှတ်တမ်းတင်</translation> <translation id="2291538123825441971">ဖိုင် <ph name="NUMBER_OF_FILES" /> ခု ဖွင့်နေသည်။</translation> -<translation id="2303282178633578561">ဆင်းမ်ကတ် လော့ခ်ချရန်</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" />ဖိုင် ကို ဖွင့်နေသည်။</translation> <translation id="2304820083631266885">ဂြိုဟ်</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ကို ထုတ်ပယ်ထားသည်။</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">လတ်တလောဖိုင်များသည် ဤနေရာတွင် ပေါ်လာမည်</translation> <translation id="2578394532502990878">တမီးလ် အသံထွက်</translation> <translation id="2579959351793446050">အိုဒီယာ</translation> -<translation id="2593644851255584939">သင့်စီမံခန့်ခွဲသူက ‘ဆင်းမ်လော့ခ်’ ပိတ်စေလိုပါသည်။</translation> <translation id="2602810353103180630">ကွန်ရက် <ph name="NETWORK_COUNT" /> ခုအနက် <ph name="NETWORK_INDEX" /> ခုမြောက်၊ <ph name="NETWORK_NAME" />၊ <ph name="CONNECTION_STATUS" />၊ လိုင်းဆွဲအား <ph name="SIGNAL_STRENGTH" />%၊ သင့်စီမံခန့်ခွဲသူက ပိတ်ထားသည်၊ အသေးစိတ်</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ဗီဒီယို</translation> -<translation id="2617342710774726426">ဆင်းမ်ကတ် လော့ခ်ကျနေပါသည်</translation> <translation id="2620090360073999360">ဒီတစ်ချီမှာ Google ဒရိုက်ဗ် လက်လှမ်း မမှီပါ။</translation> <translation id="2621713457727696555">လုံခြုံပြီ</translation> <translation id="2638942478653899953">Google Drive အားမချိတ်ဆက် နိုင်ပါ။ ကျေးဇူးပြု၍ <ph name="BEGIN_LINK" />ထွက်<ph name="END_LINK" /> ကာ ပြန်ဝင်ပါ။</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">အမှိုက်ပုံး ရှင်းရန်</translation> <translation id="5163869187418756376">မျှဝေခြင်း မအောင်မြင်ပါ။ သင့်ချိတ်ဆက်မှုအား စစ်ဆေးကာ နောက်မှ ထပ်မံကြိုးစားပါ။</translation> <translation id="516592729076796170">US Programmer Dvorak</translation> +<translation id="5172749059808361023">ကန့်သတ်ချက် အသေးစိတ်</translation> <translation id="5177526793333269655">လက်သည်းပုံ ကြည့်ရန်</translation> <translation id="5194713942430106590">ကော်လံကို ငယ်စဉ်ကြီးလိုက်စီရန် နှိပ်ပါ။</translation> <translation id="5211614973734216083">ဖာရို</translation> @@ -528,7 +526,6 @@ <translation id="5489067830765222292">လတ်ဗီးယား</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ဖီလ်တာ ပိတ်ပြီးပြီ။</translation> <translation id="5494920125229734069">အားလုံး ရွေးရန်</translation> -<translation id="5500104704744051184">PUK မထည့်မီ ဤကွန်ရက်ကို မသုံးနိုင်ပါ</translation> <translation id="5500122897333236901">အိုက်စ်လန်</translation> <translation id="5508696409934741614">အစက်များ</translation> <translation id="5522908512596376669">ဖိုင်စာရင်းကို စာရင်းမြင်ကွင်းအဖြစ် ပြောင်းထားသည်။</translation> @@ -809,7 +806,6 @@ <translation id="7831491651892296503">ကွန်ရက်စီစဉ်သတ်မှတ်ရာတွင် အမှားအယွင်းရှိပါသည်</translation> <translation id="7839804798877833423">ဒီဖိုင်များကို ရယူခြင်းက မိုဘိုင်း ဒေတာ၏ <ph name="FILE_SIZE" />ခန့်ကို အသုံးပြုမည်။</translation> <translation id="7846076177841592234">ရွေးချယ်ထားသောဖိုင်များကို ပြန်ဖျက်ပါ</translation> -<translation id="7847617962681804761">မိုဘိုင်းဒေတာသုံးရန် ပင်နံပါတ် လိုအပ်သည်</translation> <translation id="7853966320808728790">ပြင်သစ် BÉPO</translation> <translation id="7857117644404132472">ခြွင်းချက်ထည့်ပါ</translation> <translation id="7868774406711971383">ပိုလန်</translation> @@ -904,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ခုအား စင့်လုပ်နေခြင်း...</translation> <translation id="8600173386174225982">ဖိုင်စာရင်းကို ပုံသေးမြင်ကွင်းအဖြစ် ပြောင်းထားသည်။</translation> <translation id="8601932370724196034">Crostini ပုံပါဝင်သော ဖိုင်</translation> -<translation id="8608515571837163082">ပင်နံပါတ်အမှားကို အကြိမ်များစွာ ထည့်ထားသည်။ မိုဘိုင်းဖုန်းကုမ္ပဏီက ပို့ထားသည့် ဂဏန်း ၈ လုံးပါ ‘ပင်နံပါတ် ပြန်ဖွင့်သည့် ကုဒ်’ (PUK) ထည့်ပါ။</translation> <translation id="8609695766746872526">အိုက်စ်လန်</translation> <translation id="863903787380594467">ပင်နံပါတ် မမှန်ပါ။ သင့်တွင် ကြိုးစားခွင့် <ph name="RETRIES" /> ကြိမ် ကျန်သည်။</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ပို့တ်</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb index 0bda9f2..6bb0ee87 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ne.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ne.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">स्वतः कन्फिगुरेसनको URL:</translation> <translation id="2288278176040912387">रेकर्ड प्लेयर</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> फाइलहरू खोल्दै।</translation> -<translation id="2303282178633578561">SIM कार्ड लक गरियोस्</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> फाइल खोल्दै।</translation> <translation id="2304820083631266885">ग्रह</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> हटाइएको छ।</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">तपाईंका हालसालैका फाइलहरू यहाँ देखिने छन्</translation> <translation id="2578394532502990878">तमिल फोनेटिक</translation> <translation id="2579959351793446050">ओडिया</translation> -<translation id="2593644851255584939">तपाईंका एड्मिनका अनुसार तपाईंले SIM लक अफ गर्नु पर्ने हुन्छ।</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> मध्ये <ph name="NETWORK_INDEX" /> औँ नेटवर्क, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, सिग्नलको क्षमता <ph name="SIGNAL_STRENGTH" />%, तपाईंका एड्मिनले ब्लक गरेको, विवरणहरू</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> भिडियो</translation> -<translation id="2617342710774726426">SIM कार्ड लक गरिएको छ</translation> <translation id="2620090360073999360">यस समुमा Google ड्राइभ को पहुँच गर्न सकिँदैन।</translation> <translation id="2621713457727696555">सुरक्षित पारियो</translation> <translation id="2638942478653899953">Google ड्राइभमा पुग्न सकिएन। कृपया <ph name="BEGIN_LINK" />लग आउट<ph name="END_LINK" /> गर्नुहोस् र फेरि लग इन गर्नुहोस्।</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">लात्भियाली</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> फिल्टर अफ छ।</translation> <translation id="5494920125229734069">सबै चयन गर्नुहोस्</translation> -<translation id="5500104704744051184">तपाईंले PUK हालेपछि मात्र तपाईं यो नेटवर्क प्रयोग गर्न सक्नुहुन्छ</translation> <translation id="5500122897333236901">आइसलैंडको</translation> <translation id="5508696409934741614">डटहरू</translation> <translation id="5522908512596376669">फाइलको सूचीको दृश्य परिवर्तन गरी सूची दृश्य बनाइयो।</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">नेटवर्क कन्फिगर गर्दा त्रुटि भयो</translation> <translation id="7839804798877833423">यी फाइलहरू ल्याउने क्रममा लगभग <ph name="FILE_SIZE" /> को मोबाइल लगत प्रयोग गर्छ।</translation> <translation id="7846076177841592234">चयन रद्द गर्नुहोस्</translation> -<translation id="7847617962681804761">मोबाइल डेटा प्रयोग गर्न PIN हाल्नु पर्ने हुन्छ</translation> <translation id="7853966320808728790">फ्रान्सेली BÉPO</translation> <translation id="7857117644404132472">अपवाद थप्नुहोस्</translation> <translation id="7868774406711971383">पोलिस</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> वस्तुहरू समक्रमण गर्दै...</translation> <translation id="8600173386174225982">फाइलको सूचीको दृश्य परिवर्तन गरी थम्बनेल दृश्य बनाइयो।</translation> <translation id="8601932370724196034">Crostini छवि फाइल</translation> -<translation id="8608515571837163082">तपाईंले अत्यन्तै धेरै पटक गलत PIN हाल्नुभयो। तपाईंको मोबाइल सेवा प्रदायकले उपलब्ध गराएको ८ अङ्कको पर्सनल अनब्लकिङ की (PUK) हाल्नुहोस्।</translation> <translation id="8609695766746872526">आइसल्यान्डिक</translation> <translation id="863903787380594467">PIN मिलेन। तपाईं अझै <ph name="RETRIES" /> पटक प्रयास गर्न सक्नुहुन्छ।</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - पोर्ट</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb index b1f5312c..5a2bdb3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_nl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_nl.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL voor autoconfiguratie</translation> <translation id="2288278176040912387">Platenspeler</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> bestanden openen.</translation> -<translation id="2303282178633578561">Simkaart vergrendelen</translation> <translation id="2303301624314357662">Bestand <ph name="FILE_NAME" /> wordt geopend.</translation> <translation id="2304820083631266885">Planeet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> is verwijderd.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Je recente bestanden zie je hier</translation> <translation id="2578394532502990878">Tamil (fonetisch)</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Je beheerder vereist dat je simlock uitzet.</translation> <translation id="2602810353103180630">Netwerk <ph name="NETWORK_INDEX" /> van <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signaalsterkte <ph name="SIGNAL_STRENGTH" />%, geblokkeerd door je beheerder, details</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-video</translation> -<translation id="2617342710774726426">Simkaart is vergrendeld</translation> <translation id="2620090360073999360">Kan Google Drive momenteel niet bereiken.</translation> <translation id="2621713457727696555">Beveiligd</translation> <translation id="2638942478653899953">Google Drive kan niet worden bereikt. <ph name="BEGIN_LINK" />Log uit<ph name="END_LINK" /> en log weer in.</translation> @@ -489,6 +486,7 @@ <translation id="5159560892333415631">Prullenbak leegmaken</translation> <translation id="5163869187418756376">Delen mislukt. Controleer de verbinding en probeer het later opnieuw.</translation> <translation id="516592729076796170">Amerikaans Programmer Dvorak</translation> +<translation id="5172749059808361023">Beperkingsdetails</translation> <translation id="5177526793333269655">Miniatuurweergave</translation> <translation id="5194713942430106590">Klik om de kolom in oplopende volgorde te sorteren.</translation> <translation id="5211614973734216083">Faeröers</translation> @@ -530,7 +528,6 @@ <translation id="5489067830765222292">Lets</translation> <translation id="5489965683297092283">Het filter <ph name="FILTER_NAME" /> staat uit.</translation> <translation id="5494920125229734069">Alles selecteren</translation> -<translation id="5500104704744051184">Je kunt dit netwerk pas gebruiken nadat je de pukcode hebt opgegeven</translation> <translation id="5500122897333236901">IJslands</translation> <translation id="5508696409934741614">Stippen</translation> <translation id="5522908512596376669">Bestandslijst is gewijzigd naar lijstweergave.</translation> @@ -811,7 +808,6 @@ <translation id="7831491651892296503">Fout bij configureren van netwerk</translation> <translation id="7839804798877833423">Voor het ophalen van deze bestanden wordt ongeveer <ph name="FILE_SIZE" /> aan mobiele data gebruikt.</translation> <translation id="7846076177841592234">Selectie opheffen</translation> -<translation id="7847617962681804761">De pincode is vereist om mobiele data te gebruiken</translation> <translation id="7853966320808728790">Franse BÉPO</translation> <translation id="7857117644404132472">Uitzondering toevoegen</translation> <translation id="7868774406711971383">Pools</translation> @@ -906,7 +902,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> items synchroniseren...</translation> <translation id="8600173386174225982">Bestandslijst is gewijzigd naar miniatuurweergave.</translation> <translation id="8601932370724196034">Crostini-afbeeldingsbestand</translation> -<translation id="8608515571837163082">Je hebt te vaak een verkeerde pincode opgegeven. Geef de 8-cijferige pukcode op die je van de provider hebt gekregen.</translation> <translation id="8609695766746872526">IJslands</translation> <translation id="863903787380594467">Onjuiste pincode. Je hebt nog <ph name="RETRIES" /> pogingen.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" />: poort</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_no.xtb b/ui/chromeos/translations/ui_chromeos_strings_no.xtb index 24e41e3b..005976b3 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_no.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_no.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Nettadresse for automatisk konfigurering:</translation> <translation id="2288278176040912387">Platespiller</translation> <translation id="2291538123825441971">Åpner <ph name="NUMBER_OF_FILES" /> filer.</translation> -<translation id="2303282178633578561">Lås SIM-kortet</translation> <translation id="2303301624314357662">Åpner filen <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> er løst ut.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">De nylige filene dine vises her</translation> <translation id="2578394532502990878">Tamil, fonetisk</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Administratoren din krever at du slår av SIM-låsen.</translation> <translation id="2602810353103180630">Nettverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" /> – <ph name="NETWORK_NAME" /> – <ph name="CONNECTION_STATUS" /> – signalstyrke <ph name="SIGNAL_STRENGTH" /> % – blokkert av administratoren din – detaljer</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-video</translation> -<translation id="2617342710774726426">SIM-kortet er låst</translation> <translation id="2620090360073999360">Google Disk kan ikke nås for øyeblikket.</translation> <translation id="2621713457727696555">Sikret</translation> <translation id="2638942478653899953">Google Disk kan ikke nås. <ph name="BEGIN_LINK" />Logg av<ph name="END_LINK" /> og på igjen.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Tøm papirkurven</translation> <translation id="5163869187418756376">Delingen mislyktes. Sjekk tilkoblingen din og prøv på nytt senere.</translation> <translation id="516592729076796170">Amerikansk programmeringstastatur (Dvorak)</translation> +<translation id="5172749059808361023">Begrensningsdetaljer</translation> <translation id="5177526793333269655">Miniatyrbildevisning</translation> <translation id="5194713942430106590">Klikk for å sortere kolonnen i stigende rekkefølge.</translation> <translation id="5211614973734216083">Færøysk</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Latvisk</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" />-filteret er av.</translation> <translation id="5494920125229734069">Velg alle</translation> -<translation id="5500104704744051184">Du kan ikke bruke dette nettverket før du har oppgitt PUK-koden</translation> <translation id="5500122897333236901">Islandsk</translation> <translation id="5508696409934741614">Prikker</translation> <translation id="5522908512596376669">Fillisten vises nå i listevisning.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">En feil oppsto under konfigureringen av nettverket</translation> <translation id="7839804798877833423">Henting av disse filene kommer til å bruke ca. <ph name="FILE_SIZE" /> mobildata.</translation> <translation id="7846076177841592234">Opphev valget</translation> -<translation id="7847617962681804761">PIN-kode kreves for å bruke mobildata</translation> <translation id="7853966320808728790">Fransk BÉPO</translation> <translation id="7857117644404132472">Legg til unntak</translation> <translation id="7868774406711971383">Polsk</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Synkroniserer <ph name="NUMBER_OF_FILES" /> elementer …</translation> <translation id="8600173386174225982">Fillisten vises nå i miniatyrbildevisning.</translation> <translation id="8601932370724196034">Crostini-bildefil</translation> -<translation id="8608515571837163082">Feil PIN-kode ble tastet inn for mange ganger. Oppgi den åttesifrede PUK-koden fra operatøren.</translation> <translation id="8609695766746872526">Islandsk</translation> <translation id="863903787380594467">Feil PIN-kode. Du har <ph name="RETRIES" /> forsøk igjen.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_or.xtb b/ui/chromeos/translations/ui_chromeos_strings_or.xtb index 8059dca9..d5fe311 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_or.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_or.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">ସ୍ଵତଃକନଫିଗ୍ରେସନ୍ URL:</translation> <translation id="2288278176040912387">ରେକର୍ଡ ପ୍ଲେୟାର୍</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" />ଟି ଫାଇଲ୍ ଖୋଲାଯାଉଛି।</translation> -<translation id="2303282178633578561">SIM କାର୍ଡ ଲକ୍ କରନ୍ତୁ</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" />ଫାଇଲ୍ ଖୋଲୁଛି।</translation> <translation id="2304820083631266885">ଗ୍ରହ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ବାହାର କରାଯାଇଛି</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ଆପଣଙ୍କ ବର୍ତ୍ତମାନର ଫାଇଲଗୁଡ଼ିକ ଏଠାରେ ଦେଖାଯିବ</translation> <translation id="2578394532502990878">ତାମିଲ ଫୋନେଟିକ୍</translation> <translation id="2579959351793446050">ଓଡ଼ିଆ</translation> -<translation id="2593644851255584939">ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ପାଇଁ ଆପଣଙ୍କୁ SIM ଲକ ଅକ୍ଷମ କରିବାର ଆବଶ୍ୟକତା ଅଛି।</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />ଟିରୁ <ph name="NETWORK_INDEX" /> ନମ୍ବର ନେଟୱାର୍କ, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ସିଗନାଲ କ୍ଷମତା <ph name="SIGNAL_STRENGTH" />%, ଆପଣଙ୍କ ଆଡମିନିଷ୍ଟ୍ରେଟରଙ୍କ ଦ୍ୱାରା ବ୍ଲକ କରାଯାଇଛି, ବିବରଣୀ</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ଭିଡିଓ</translation> -<translation id="2617342710774726426">SIM କାର୍ଡ ଲକ୍ ହୋଇଯାଇଛି।</translation> <translation id="2620090360073999360">ଏହି ସମୟରେ Google Driveରେ ପହଞ୍ଚି ହେବ ନାହିଁ।</translation> <translation id="2621713457727696555">ସୁରକ୍ଷିତ</translation> <translation id="2638942478653899953">Google Drive ପର୍ଯ୍ୟନ୍ତ ପହଞ୍ଚିହେଲା ନାହିଁ। ଦୟାକରି <ph name="BEGIN_LINK" />ଲଗ୍ ଆଉଟ୍<ph name="END_LINK" /> ଏବଂ ଫେରି ଲଗ୍ ଇନ୍ କରନ୍ତୁ।</translation> @@ -523,7 +520,6 @@ <translation id="5489067830765222292">ଲାତଭିଆନ୍</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ଫିଲ୍ଟର ବନ୍ଦ ଅଛି।</translation> <translation id="5494920125229734069">ସମସ୍ତ ଚୟନ କରନ୍ତୁ</translation> -<translation id="5500104704744051184">ଆପଣ PUKକୁ ନଲେଖିବା ପର୍ଯ୍ୟନ୍ତ ଏହି ନେଟୱାର୍କକୁ ବ୍ୟବହାର କରିବା ପାଇଁ ସକ୍ଷମ ହେବେ ନାହିଁ</translation> <translation id="5500122897333236901">ଆଇସ୍ଲେଣ୍ଡିକ୍</translation> <translation id="5508696409934741614">ଡଟ୍</translation> <translation id="5522908512596376669">ଫାଇଲ୍ର ତାଲିକା ଭ୍ୟୁ ତାଲିକାରେ ବଦଳି ଯାଇଛି।</translation> @@ -804,7 +800,6 @@ <translation id="7831491651892296503">ନେଟ୍ୱର୍କ କନ୍ଫିଗର୍ କରିବା ସମୟରେ ତ୍ରୁଟି ହୋଇଛି</translation> <translation id="7839804798877833423">ଏହି ଫାଇଲ୍ଗୁଡ଼ିକ ଆଣିବା ପାଇଁ ଆନୁମାନିକ <ph name="FILE_SIZE" /> ମୋବାଇଲ୍ ଡାଟା ବ୍ୟବହାର ହେବ।</translation> <translation id="7846076177841592234">ଚୟନିତ ଆଇଟମ୍ ବାତିଲ୍ କରନ୍ତୁ</translation> -<translation id="7847617962681804761">ମୋବାଇଲ ଡାଟା ବ୍ୟବହାର କରିବା ପାଇଁ PINର ଆବଶ୍ୟକତା ଅଛି</translation> <translation id="7853966320808728790">ଫ୍ରେଞ୍ଚ BÉPO</translation> <translation id="7857117644404132472">ବ୍ୟତିକ୍ରମ ଯୋଗ କରନ୍ତୁ</translation> <translation id="7868774406711971383">ପୋଲିଶ୍</translation> @@ -899,7 +894,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" />ଟି ଆଇଟମ୍ ସିଙ୍କ୍ ହେଉଛି...</translation> <translation id="8600173386174225982">ଫାଇଲ୍ ତାଲିକାକୁ ଥମ୍ବନେଲ୍ ଭ୍ୟୁରେ ପରିବର୍ତ୍ତନ କରାଯାଇଛି।</translation> <translation id="8601932370724196034">Crostini ଛବି ଫାଇଲ୍</translation> -<translation id="8608515571837163082">ଏକ ଭୁଲ PIN ବହୁତ ଥର ଲେଖାଯାଇଛି। କ୍ୟାରିଅର ଦ୍ୱାରା ପ୍ରଦାନ କରାଯାଇଥିବା 8-ଅଙ୍କ ବିଶିଷ୍ଟ ବ୍ୟକ୍ତିଗତ ଅନବ୍ଲକ କରିବା କୀ (PUK) ଲେଖନ୍ତୁ।</translation> <translation id="8609695766746872526">ଆଇସଲାଣ୍ଡିକ୍</translation> <translation id="863903787380594467">ଭୁଲ PIN। ଆପଣଙ୍କ ପାଖରେ <ph name="RETRIES" />ଟି ପ୍ରଚେଷ୍ଟା ବାକି ଅଛି।</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ପୋର୍ଟ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb index 020e61f..0b1215a 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pa.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pa.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">ਸਵੈ-ਸੰਰੂਪਣ URL:</translation> <translation id="2288278176040912387">ਰਿਕਾਰਡ ਪਲੇਅਰ</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ਫ਼ਾਈਲਾਂ ਖੋਲ੍ਹੀਆਂ ਜਾ ਰਹੀਆਂ ਹਨ।</translation> -<translation id="2303282178633578561">ਸਿਮ ਕਾਰਡ ਲਾਕ ਕਰੋ</translation> <translation id="2303301624314357662">ਫ਼ਾਈਲ <ph name="FILE_NAME" /> ਨੂੰ ਖੋਲ੍ਹਿਆ ਜਾ ਰਿਹਾ ਹੈ।</translation> <translation id="2304820083631266885">ਗ੍ਰਹਿ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ਨੂੰ ਕੱਢ ਦਿੱਤਾ ਗਿਆ ਹੈ।</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ਤੁਹਾਡੀਆਂ ਹਾਲੀਆ ਫ਼ਾਈਲਾਂ ਇੱਥੇ ਦਿਸਣਗੀਆਂ</translation> <translation id="2578394532502990878">ਤਮਿਲ ਧੁਨੀਆਤਮਿਕ</translation> <translation id="2579959351793446050">ਉੜੀਆ</translation> -<translation id="2593644851255584939">ਤੁਹਾਡਾ ਪ੍ਰਸ਼ਾਸਕ ਚਾਹੁੰਦਾ ਹੈ ਕਿ ਤੁਸੀਂ ਸਿਮ ਲਾਕ ਬੰਦ ਕਰੋ।</translation> <translation id="2602810353103180630">ਨੈੱਟਵਰਕ <ph name="NETWORK_COUNT" /> ਵਿੱਚੋਂ <ph name="NETWORK_INDEX" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ਸਿਗਨਲ ਦੀ ਤੀਬਰਤਾ <ph name="SIGNAL_STRENGTH" />%, ਤੁਹਾਡੇ ਪ੍ਰਸ਼ਾਸਕ ਵੱਲੋਂ ਬਲਾਕ ਕੀਤਾ ਗਿਆ, ਵੇਰਵੇ</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ਵੀਡੀਓ</translation> -<translation id="2617342710774726426">ਸਿਮ ਕਾਰਡ ਲੌਕ ਕੀਤਾ ਹੋਇਆ ਹੈ</translation> <translation id="2620090360073999360">ਇਸ ਸਮੇਂ Google Drive ਤੇ ਨਹੀਂ ਪਹੁੰਚਿਆ ਜਾ ਸਕਦਾ।</translation> <translation id="2621713457727696555">ਸੁਰੱਖਿਅਤ</translation> <translation id="2638942478653899953">Google Drive 'ਤੇ ਪਹੁੰਚਿਆ ਨਹੀਂ ਜਾ ਸਕਿਆ। ਕਿਰਪਾ ਕਰਕੇ <ph name="BEGIN_LINK" />ਲੌਗ ਆਉਟ<ph name="END_LINK" /> ਅਤੇ ਫਿਰ ਲੌਗ ਇਨ ਕਰੋ।</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">ਰੱਦੀ ਨੂੰ ਖਾਲੀ ਕਰੋ</translation> <translation id="5163869187418756376">ਸਾਂਝਾਕਰਨ ਅਸਫਲ। ਆਪਣੇ ਕਨੈਕਸ਼ਨ ਦੀ ਜਾਂਚ ਕਰੋ ਅਤੇ ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="516592729076796170">US Programmer Dvorak</translation> +<translation id="5172749059808361023">ਪਾਬੰਦੀ ਦੇ ਵੇਰਵੇ</translation> <translation id="5177526793333269655">ਲਘੂ-ਚਿੱਤਰ ਦ੍ਰਿਸ਼</translation> <translation id="5194713942430106590">ਕਾਲਮ ਨੂੰ ਵਧਦੇ ਕ੍ਰਮ ਵਿੱਚ ਕ੍ਰਮ-ਬੱਧ ਕਰਨ ਲਈ ਕਲਿੱਕ ਕਰੋ।</translation> <translation id="5211614973734216083">ਫ਼ਰੋਇਸ</translation> @@ -528,7 +526,6 @@ <translation id="5489067830765222292">ਲਾਤਵੀਅਨ</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ਫਿਲਟਰ ਬੰਦ ਹੈ।</translation> <translation id="5494920125229734069">ਸਾਰੇ ਚੁਣੋ</translation> -<translation id="5500104704744051184">ਜਦੋਂ ਤੱਕ ਤੁਸੀਂ PUK ਦਾਖਲ ਨਹੀਂ ਕਰਦੇ, ਤੁਸੀਂ ਇਸ ਨੈੱਟਵਰਕ ਨੂੰ ਨਹੀਂ ਵਰਤ ਸਕੋਗੇ</translation> <translation id="5500122897333236901">Icelandic</translation> <translation id="5508696409934741614">ਬਿੰਦੀਆਂ</translation> <translation id="5522908512596376669">ਫ਼ਾਈਲ ਸੂਚੀ, ਸੂਚੀ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਬਦਲ ਗਈ ਹੈ।</translation> @@ -809,7 +806,6 @@ <translation id="7831491651892296503">ਨੈੱਟਵਰਕ ਦਾ ਸੰਰੂਪਣ ਕਰਨ ਵਿੱਚ ਗੜਬੜ ਹੋਈ</translation> <translation id="7839804798877833423">ਇਹਨਾਂ ਫਾਈਲਾਂ ਨੂੰ ਪ੍ਰਾਪਤ ਕਰਨ ਨਾਲ ਇਹ ਲਗਭਗ <ph name="FILE_SIZE" /> ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤਣਗੀਆਂ।</translation> <translation id="7846076177841592234">ਚੋਣ ਰੱਦ ਕਰੋ</translation> -<translation id="7847617962681804761">ਮੋਬਾਈਲ ਡਾਟਾ ਵਰਤਣ ਲਈ ਪਿੰਨ ਲੋੜੀਂਦਾ ਹੈ</translation> <translation id="7853966320808728790">ਫਰਾਂਸੀਸੀ BÉPO</translation> <translation id="7857117644404132472">ਅਪਵਾਦ ਸ਼ਾਮਲ ਕਰੋ</translation> <translation id="7868774406711971383">ਪੋਲਿਸ਼</translation> @@ -904,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ਆਈਟਮਾਂ ਸਿੰਕ ਕਰ ਰਿਹਾ ਹੈ...</translation> <translation id="8600173386174225982">ਫ਼ਾਈਲ ਸੂਚੀ, ਲਘੂ-ਚਿੱਤਰ ਦ੍ਰਿਸ਼ ਵਿੱਚ ਬਦਲ ਗਈ ਹੈ।</translation> <translation id="8601932370724196034">Crostini ਈਮੇਜ ਫ਼ਾਈਲ</translation> -<translation id="8608515571837163082">ਗਲਤ ਪਿੰਨ ਬਹੁਤ ਵਾਰ ਦਾਖਲ ਕੀਤਾ ਗਿਆ। ਕੈਰੀਅਰ ਵੱਲੋਂ ਮੁਹੱਈਆ ਕਰਵਾਈ 8-ਅੰਕਾਂ ਦੀ ਨਿੱਜੀ ਅਣਬਲਾਕਿੰਗ ਕੁੰਜੀ (PUK) ਦਾਖਲ ਕਰੋ।</translation> <translation id="8609695766746872526">ਆਈਸਲੈਂਡੀ</translation> <translation id="863903787380594467">ਗਲਤ ਪਿੰਨ। ਤੁਹਾਡੇ ਕੋਲ <ph name="RETRIES" /> ਕੋਸ਼ਿਸ਼ਾਂ ਬਾਕੀ ਹਨ।</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - ਪੋਰਟ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb index 7748618..66045d45 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pl.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL automatycznej konfiguracji:</translation> <translation id="2288278176040912387">Gramofon</translation> <translation id="2291538123825441971">Otwieram pliki (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Zablokuj kartę SIM</translation> <translation id="2303301624314357662">Otwieram plik <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">Odłączono <ph name="VOLUME_NAME" />.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Tutaj będą się pojawiać ostatnie pliki</translation> <translation id="2578394532502990878">Tamilski fonetyczny</translation> <translation id="2579959351793446050">Orija</translation> -<translation id="2593644851255584939">Administrator wymaga wyłączenia blokady karty SIM.</translation> <translation id="2602810353103180630">Sieć <ph name="NETWORK_INDEX" /> z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, siła sygnału: <ph name="SIGNAL_STRENGTH" />%, zablokowana przez administratora, szczegóły</translation> <translation id="2614589611416690597">Plik wideo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Karta SIM jest zablokowana</translation> <translation id="2620090360073999360">Dysk Google jest obecnie nieosiągalny.</translation> <translation id="2621713457727696555">Zabezpieczona</translation> <translation id="2638942478653899953">Nie można uzyskać dostępu do Dysku Google. <ph name="BEGIN_LINK" />Wyloguj się<ph name="END_LINK" /> i ponownie zaloguj.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Opróżnij kosz</translation> <translation id="5163869187418756376">Niepowodzenie udostępniania. Sprawdź połączenie i spróbuj ponownie później.</translation> <translation id="516592729076796170">Amerykańska dewelopera (Dvorak)</translation> +<translation id="5172749059808361023">Informacje o ograniczeniu</translation> <translation id="5177526793333269655">Widok miniatur</translation> <translation id="5194713942430106590">Kliknij, by posortować kolumnę w kolejności rosnącej.</translation> <translation id="5211614973734216083">Farerski</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Łotewski</translation> <translation id="5489965683297092283">Filtr <ph name="FILTER_NAME" /> jest wyłączony.</translation> <translation id="5494920125229734069">Wybierz wszystko</translation> -<translation id="5500104704744051184">Nie możesz korzystać z tej sieci, dopóki nie podasz kodu PUK</translation> <translation id="5500122897333236901">Islandzki</translation> <translation id="5508696409934741614">Punkty</translation> <translation id="5522908512596376669">Lista plików została przełączona na widok listy.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Podczas konfigurowania sieci wystąpił błąd</translation> <translation id="7839804798877833423">Pobranie tych plików spowoduje przesłanie <ph name="FILE_SIZE" /> przy użyciu komórkowej transmisji danych.</translation> <translation id="7846076177841592234">Anuluj wybór</translation> -<translation id="7847617962681804761">Do korzystania z mobilnej transmisji danych wymagany jest kod PIN</translation> <translation id="7853966320808728790">Francuska BÉPO</translation> <translation id="7857117644404132472">Dodaj wyjątek</translation> <translation id="7868774406711971383">Polski</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Synchronizuję elementy – <ph name="NUMBER_OF_FILES" />...</translation> <translation id="8600173386174225982">Lista plików została przełączona na widok miniatur.</translation> <translation id="8601932370724196034">Plik graficzny Crostini</translation> -<translation id="8608515571837163082">Zbyt wiele razy podano nieprawidłowy kod PIN. Wpisz 8-cyfrowy kod PUK otrzymany od operatora.</translation> <translation id="8609695766746872526">Islandzki</translation> <translation id="863903787380594467">Nieprawidłowy kod PIN. Pozostałe próby: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb index e2b5c89..3449274 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-BR.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de configuração automática</translation> <translation id="2288278176040912387">Gravador</translation> <translation id="2291538123825441971">Abrindo <ph name="NUMBER_OF_FILES" /> arquivos.</translation> -<translation id="2303282178633578561">Bloquear chip</translation> <translation id="2303301624314357662">Abrindo o arquivo <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881">O volume <ph name="VOLUME_NAME" /> foi ejetado.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Seus arquivos recentes vão aparecer aqui</translation> <translation id="2578394532502990878">Tâmil (fonético)</translation> <translation id="2579959351793446050">Oriá</translation> -<translation id="2593644851255584939">O administrador exige que você desative o bloqueio do chip.</translation> <translation id="2602810353103180630">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, intensidade do sinal em <ph name="SIGNAL_STRENGTH" />%, bloqueada pelo administrador, detalhes</translation> <translation id="2614589611416690597">Vídeo de <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">O chip está bloqueado</translation> <translation id="2620090360073999360">Não é possível acessar o Google Drive neste momento.</translation> <translation id="2621713457727696555">Protegida</translation> <translation id="2638942478653899953">Não foi possível acessar o Google Drive. <ph name="BEGIN_LINK" />Saia<ph name="END_LINK" /> e faça login novamente.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Esvaziar lixeira</translation> <translation id="5163869187418756376">Falha no compartilhamento. Verifique sua conexão e tente novamente mais tarde.</translation> <translation id="516592729076796170">Programmer Dvorak americano</translation> +<translation id="5172749059808361023">Detalhes de restrição</translation> <translation id="5177526793333269655">Visualização em miniatura</translation> <translation id="5194713942430106590">Clique para classificar a coluna em ordem crescente.</translation> <translation id="5211614973734216083">Faroês</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Letão</translation> <translation id="5489965683297092283">O filtro <ph name="FILTER_NAME" /> está desativado.</translation> <translation id="5494920125229734069">Selecionar tudo</translation> -<translation id="5500104704744051184">Não será possível usar esta rede até que a PUK seja inserida.</translation> <translation id="5500122897333236901">Islandês</translation> <translation id="5508696409934741614">Pontos</translation> <translation id="5522908512596376669">A lista de arquivos foi alterada para a visualização em lista.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Erro ao configurar a rede</translation> <translation id="7839804798877833423">A busca destes arquivos usará aproximadamente <ph name="FILE_SIZE" /> de dados móveis.</translation> <translation id="7846076177841592234">Cancelar seleção</translation> -<translation id="7847617962681804761">PIN necessário para usar os dados móveis</translation> <translation id="7853966320808728790">BÉPO francês</translation> <translation id="7857117644404132472">Adicionar exceção</translation> <translation id="7868774406711971383">Polonês</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Sincronizando <ph name="NUMBER_OF_FILES" /> itens...</translation> <translation id="8600173386174225982">A lista de arquivos foi alterada para a visualização em miniatura.</translation> <translation id="8601932370724196034">Arquivo de imagem do Crostini</translation> -<translation id="8608515571837163082">Um PIN incorreto foi digitado muitas vezes. Digite a chave de desbloqueio pessoal (PUK) de oito dígitos fornecida pela operadora.</translation> <translation id="8609695766746872526">Islandês</translation> <translation id="863903787380594467">PIN incorreto. Você tem <ph name="RETRIES" /> tentativas restantes.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Porta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb index 4cebbb89..efaba188 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_pt-PT.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL de configuração automática:</translation> <translation id="2288278176040912387">Gira-discos</translation> <translation id="2291538123825441971">A abrir <ph name="NUMBER_OF_FILES" /> ficheiros…</translation> -<translation id="2303282178633578561">Bloquear cartão SIM</translation> <translation id="2303301624314357662">A abrir o ficheiro <ph name="FILE_NAME" />…</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> foi ejetado.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Os seus ficheiros recentes são apresentados aqui</translation> <translation id="2578394532502990878">Fonética de tâmil</translation> <translation id="2579959351793446050">Oriá</translation> -<translation id="2593644851255584939">O administrador requer que desative o bloqueio do SIM.</translation> <translation id="2602810353103180630">Rede <ph name="NETWORK_INDEX" /> de <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Intensidade do sinal <ph name="SIGNAL_STRENGTH" />%, Bloqueada pelo administrador, Detalhes</translation> <translation id="2614589611416690597">Vídeo <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">O cartão SIM está bloqueado</translation> <translation id="2620090360073999360">Não é possível aceder ao Google Drive neste momento.</translation> <translation id="2621713457727696555">Protegida</translation> <translation id="2638942478653899953">Não foi possível aceder ao Google Drive. <ph name="BEGIN_LINK" />Termine a sessão<ph name="END_LINK" /> e inicie a sessão novamente.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Esvaziar lixo</translation> <translation id="5163869187418756376">Falha ao partilhar. Verifique a ligação e tente novamente mais tarde.</translation> <translation id="516592729076796170">Dvorak de programador americano</translation> +<translation id="5172749059808361023">Detalhes da restrição</translation> <translation id="5177526793333269655">Vista de miniatura</translation> <translation id="5194713942430106590">Clique para ordenar a coluna por ordem ascendente.</translation> <translation id="5211614973734216083">Faroense</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Letão</translation> <translation id="5489965683297092283">O filtro <ph name="FILTER_NAME" /> está desativado.</translation> <translation id="5494920125229734069">Selecionar tudo</translation> -<translation id="5500104704744051184">Não pode usar esta rede enquanto não introduzir o PUK</translation> <translation id="5500122897333236901">Islandês</translation> <translation id="5508696409934741614">Pontos</translation> <translation id="5522908512596376669">A lista de ficheiros foi alterada para a vista de lista.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Ocorreu um erro ao configurar a rede.</translation> <translation id="7839804798877833423">A obtenção destes ficheiros utilizará aproximadamente <ph name="FILE_SIZE" /> de dados móveis.</translation> <translation id="7846076177841592234">Cancelar seleção</translation> -<translation id="7847617962681804761">É necessário um PIN para utilizar os dados móveis</translation> <translation id="7853966320808728790">BÉPO francês</translation> <translation id="7857117644404132472">Adicionar exceção</translation> <translation id="7868774406711971383">Polaco</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">A sincronizar <ph name="NUMBER_OF_FILES" /> itens...</translation> <translation id="8600173386174225982">A lista de ficheiros foi alterada para a vista de miniatura.</translation> <translation id="8601932370724196034">Ficheiro de imagem do Crostini</translation> -<translation id="8608515571837163082">Foi introduzido um PIN incorreto demasiadas vezes. Introduza a chave de desbloqueio pessoal de 8 dígitos (PUK) indicada pelo operador.</translation> <translation id="8609695766746872526">Islandês</translation> <translation id="863903787380594467">PIN incorreto. Tem mais <ph name="RETRIES" /> tentativas.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Porta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb index a1511ed2..e59e79d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ro.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ro.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Adresa URL de autoconfigurare:</translation> <translation id="2288278176040912387">Picup</translation> <translation id="2291538123825441971">Se deschid <ph name="NUMBER_OF_FILES" /> fișiere.</translation> -<translation id="2303282178633578561">Blochează cardul SIM</translation> <translation id="2303301624314357662">Se deschide <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planetă</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> a fost scos.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Fișierele recente vor apărea aici</translation> <translation id="2578394532502990878">Tamilă fonetică</translation> <translation id="2579959351793446050">Odia</translation> -<translation id="2593644851255584939">Administratorul solicită să dezactivezi blocarea cardului SIM.</translation> <translation id="2602810353103180630">Rețeaua <ph name="NETWORK_INDEX" /> din <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Puterea semnalului: <ph name="SIGNAL_STRENGTH" /> %, Blocată de administrator, Detalii</translation> <translation id="2614589611416690597">Videoclip <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Cardul SIM este blocat</translation> <translation id="2620090360073999360">Disc Google nu poate fi accesat în acest moment.</translation> <translation id="2621713457727696555">Securizată</translation> <translation id="2638942478653899953">Google Drive nu a putut fi accesat. <ph name="BEGIN_LINK" />Deconectați-vă<ph name="END_LINK" /> și conectați-vă din nou.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Golește coșul de gunoi</translation> <translation id="5163869187418756376">Trimiterea nu a reușit. Verificați conexiunea la internet și încercați din nou mai târziu.</translation> <translation id="516592729076796170">Programator S.U.A. Dvorak</translation> +<translation id="5172749059808361023">Detalii despre restricții</translation> <translation id="5177526793333269655">Vizualizare cu miniaturi</translation> <translation id="5194713942430106590">Dă clic pentru a sorta coloana în ordine crescătoare.</translation> <translation id="5211614973734216083">Faroeză</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Letonă</translation> <translation id="5489965683297092283">Filtrul <ph name="FILTER_NAME" /> este dezactivat.</translation> <translation id="5494920125229734069">Selectează-le pe toate</translation> -<translation id="5500104704744051184">Nu vei putea să folosești rețeaua până când nu introduci codul PUK</translation> <translation id="5500122897333236901">Islandeză</translation> <translation id="5508696409934741614">Puncte</translation> <translation id="5522908512596376669">Lista de fișiere s-a modificat la afișare listă.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Eroare la configurarea rețelei</translation> <translation id="7839804798877833423">Preluarea acestor fișiere va utiliza aproximativ <ph name="FILE_SIZE" /> din datele mobile.</translation> <translation id="7846076177841592234">Anulează selecția</translation> -<translation id="7847617962681804761">Pentru a folosi datele mobile, este necesar codul PIN</translation> <translation id="7853966320808728790">Franceză BÉPO</translation> <translation id="7857117644404132472">Adaugă o excepție</translation> <translation id="7868774406711971383">Poloneză</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Se sincronizează <ph name="NUMBER_OF_FILES" /> elemente...</translation> <translation id="8600173386174225982">Lista de fișiere s-a modificat la vizualizare cu miniaturi.</translation> <translation id="8601932370724196034">Fișier imagine Crostini</translation> -<translation id="8608515571837163082">Codul PIN a fost introdus greșit de prea multe ori. Introdu cheia personală de deblocare (PUK) din opt cifre oferită de operator.</translation> <translation id="8609695766746872526">Islandeză</translation> <translation id="863903787380594467">Codul PIN este incorect. Mai ai <ph name="RETRIES" /> încercări.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb index f5579cb..f319f6bc 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ru.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ru.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL автоматической настройки:</translation> <translation id="2288278176040912387">Патефон</translation> <translation id="2291538123825441971">Открываются файлы (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Блокировка SIM-карты</translation> <translation id="2303301624314357662">Открывается файл <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881">Том <ph name="VOLUME_NAME" /> извлечен.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Здесь будут появляться ваши недавние файлы.</translation> <translation id="2578394532502990878">Тамильский, фонетический</translation> <translation id="2579959351793446050">Ория</translation> -<translation id="2593644851255584939">Согласно настройкам администратора, SIM-карта должна быть разблокирована.</translation> <translation id="2602810353103180630">Сеть <ph name="NETWORK_INDEX" /> из <ph name="NETWORK_COUNT" />, название – "<ph name="NETWORK_NAME" />", статус подключения – "<ph name="CONNECTION_STATUS" />", уровень сигнала – <ph name="SIGNAL_STRENGTH" /> %, заблокирована администратором, дополнительные сведения</translation> <translation id="2614589611416690597">Видео <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM-карта заблокирована</translation> <translation id="2620090360073999360">В данный момент Google Диск недоступен.</translation> <translation id="2621713457727696555">Защищена</translation> <translation id="2638942478653899953">Не удается подключиться к Google Диску. Попробуйте <ph name="BEGIN_LINK" />выйти<ph name="END_LINK" /> и снова зайти в систему.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Латышский</translation> <translation id="5489965683297092283">Фильтр "<ph name="FILTER_NAME" />" отключен.</translation> <translation id="5494920125229734069">Выделить все</translation> -<translation id="5500104704744051184">Вы не сможете использовать эту сеть, пока не введете PUK-код.</translation> <translation id="5500122897333236901">Исландский</translation> <translation id="5508696409934741614">Точки</translation> <translation id="5522908512596376669">Файлы отображаются в виде списка.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Ошибка при настройке сети</translation> <translation id="7839804798877833423">При загрузке этих файлов по мобильному каналу передачи данных будет использовано около <ph name="FILE_SIZE" /> трафика.</translation> <translation id="7846076177841592234">Отменить выбор</translation> -<translation id="7847617962681804761">Для использования мобильного интернета нужен PIN-код</translation> <translation id="7853966320808728790">Французская (BÉPO)</translation> <translation id="7857117644404132472">Добавить исключение</translation> <translation id="7868774406711971383">Польский</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Синхронизация файлов (<ph name="NUMBER_OF_FILES" />)...</translation> <translation id="8600173386174225982">Файлы отображаются в виде значков.</translation> <translation id="8601932370724196034">Графический файл Crostini</translation> -<translation id="8608515571837163082">PIN-код был введен неверно слишком много раз. Введите 8-значный PUK-код, предоставленный оператором связи.</translation> <translation id="8609695766746872526">Исландский</translation> <translation id="863903787380594467">Неверный PIN-код. Осталось попыток: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – порт</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_si.xtb b/ui/chromeos/translations/ui_chromeos_strings_si.xtb index abe960b..4574051f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_si.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_si.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">ස්වයංවින්යාසකරණ URL:</translation> <translation id="2288278176040912387">තැටි වාදකය</translation> <translation id="2291538123825441971">ගොනු <ph name="NUMBER_OF_FILES" />ක් විවෘත කිරීම.</translation> -<translation id="2303282178633578561">SIM පත අගුලු දමන්න</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ගොනුව විවෘත කිරීම.</translation> <translation id="2304820083631266885">ග්රහලෝකය</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ඉවත් කර ඇත.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ඔබේ මෑත ගොනු මෙහි දිස් වනු ඇත</translation> <translation id="2578394532502990878">දෙමළ ශබ්දිම</translation> <translation id="2579959351793446050">ඔඩියා</translation> -<translation id="2593644851255584939">ඔබේ පරිපාලකයා ඔබ SIM අගුල අබල කිරීම අවශ්ය කරයි.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />කින් <ph name="NETWORK_INDEX" />වන ජාලය, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" /> සංඥා ප්රබලතාව <ph name="SIGNAL_STRENGTH" />%, ඔබගේ පරිපාලක විසින් අවහිර කර ඇත, විස්තර</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> වීඩියෝ</translation> -<translation id="2617342710774726426">SIM පත අගුළු වැටී ඇත</translation> <translation id="2620090360073999360">මේ අවස්ථාවේ Google Drive වෙත ලගාවිය නොහැක.</translation> <translation id="2621713457727696555">ආරක්ෂිතයි</translation> <translation id="2638942478653899953">Google Drive වෙත ප්රවේශ විය නොහැක. <ph name="BEGIN_LINK" />ප්රවිෂ්ටයෙන් පිට වී<ph name="END_LINK" /> නැවතත් ප්රවිෂ්ට වන්න.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">ලැට්වියානු</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> පෙරහන ක්රියාවිරහිතයි.</translation> <translation id="5494920125229734069">සියල්ල තෝරන්න</translation> -<translation id="5500104704744051184">ඔබ PUK ඇතුළත් කරන තෙක් ඔබට මෙම ජාලය භාවිත කිරීමට නොහැකි වෙයි</translation> <translation id="5500122897333236901">අයිස්ලාන්තික</translation> <translation id="5508696409934741614">තිත්</translation> <translation id="5522908512596376669">ගොනු ලැයිස්තුව ලැයිස්තු දසුනට වෙනස් විය.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">ජාලය වින්යාස කිරීමේ දෝෂයකි</translation> <translation id="7839804798877833423">මෙම ගොනු සොයා ගැනීමෙන් ආසන්න වශයෙන් ජංගම දත්ත <ph name="FILE_SIZE" /> භාවිතා වේ.</translation> <translation id="7846076177841592234">තේරීම අවලංගු කරන්න</translation> -<translation id="7847617962681804761">ජංගම දත්ත භාවිත කිරීමට PIN අවශ්යයි</translation> <translation id="7853966320808728790">ප්රංශ BÉPO</translation> <translation id="7857117644404132472">ව්යතිරේකයක් එක් කරන්න</translation> <translation id="7868774406711971383">පෝලන්ත</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">අයිතම <ph name="NUMBER_OF_FILES" /> සම්මුහුර්ත කරයි...</translation> <translation id="8600173386174225982">ගොනු ලැයිස්තුව සිඟිති රූ දසුනට වෙනස් විය.</translation> <translation id="8601932370724196034">Crostini රූප ගොනුව</translation> -<translation id="8608515571837163082">වැරදි රහස් අංකයක් ඉතා වැඩි වාර ගණනක් ඇතුළු කරන ලදි. වාහකය විසින් සපයන ලද ඉලක්කම් 8 ක පුද්ගලික අවහිර නොකිරීමේ යතුර (PUK) ඇතුළත් කරන්න.</translation> <translation id="8609695766746872526">අයිස්ලන්ත</translation> <translation id="863903787380594467">වැරදි PIN එකකි. ඔබට උත්සාහයන් <ph name="RETRIES" />ක් ඉතිරිව ඇත.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - තොට</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb index e93c0e6..c94619f 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sk.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Webová adresa automatickej konfigurácie</translation> <translation id="2288278176040912387">Gramofón</translation> <translation id="2291538123825441971">Otvárajú sa súbory (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Zamykať SIM kartu</translation> <translation id="2303301624314357662">Otvára sa súbor <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planéta</translation> <translation id="2305020378527873881">Zväzok <ph name="VOLUME_NAME" /> bol odpojený.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Tu sa budú zobrazovať vaše nedávne súbory</translation> <translation id="2578394532502990878">Tamilská fonetická klávesnica</translation> <translation id="2579959351793446050">Uríjska klávesnica</translation> -<translation id="2593644851255584939">Správca vyžaduje, aby ste deaktivovali zámku SIM karty.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. sieť z <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, sila signálu: <ph name="SIGNAL_STRENGTH" /> %, zablokoval váš správca, podrobnosti</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM karta je uzamknutá</translation> <translation id="2620090360073999360">Služba Disk Google nie je momentálne k dispozícii.</translation> <translation id="2621713457727696555">Zabezpečená</translation> <translation id="2638942478653899953">Disk Google je nedostupný. <ph name="BEGIN_LINK" />Odhláste sa<ph name="END_LINK" /> a znova sa prihláste.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Vyprázdniť kôš</translation> <translation id="5163869187418756376">Zdieľanie zlyhalo. Skontrolujte pripojenie a skúste to neskôr.</translation> <translation id="516592729076796170">US Programmer Dvorak</translation> +<translation id="5172749059808361023">Podrobnosti o obmedzeniach</translation> <translation id="5177526793333269655">Zobrazenie miniatúr</translation> <translation id="5194713942430106590">Kliknutím zoradíte stĺpec vo vzostupnom poradí.</translation> <translation id="5211614973734216083">Faerská klávesnica</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">Lotyšská klávesnica</translation> <translation id="5489965683297092283">Filter <ph name="FILTER_NAME" /> je vypnutý.</translation> <translation id="5494920125229734069">Vybrať všetko</translation> -<translation id="5500104704744051184">Túto sieť budete môcť používať, až keď zadáte PUK</translation> <translation id="5500122897333236901">Islandčina</translation> <translation id="5508696409934741614">Bodky</translation> <translation id="5522908512596376669">Zoznam súborov sa zmenil na zobrazenie zoznamu.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Chyba pri konfigurácii siete</translation> <translation id="7839804798877833423">Načítanie týchto súborov spotrebuje približne <ph name="FILE_SIZE" /> mobilných dát.</translation> <translation id="7846076177841592234">Zrušiť výber</translation> -<translation id="7847617962681804761">Na používanie mobilných dát sa vyžaduje PIN</translation> <translation id="7853966320808728790">Francúzština – BÉPO</translation> <translation id="7857117644404132472">Pridať výnimku</translation> <translation id="7868774406711971383">Poľská klávesnica</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Synchronizujú sa položky (počet: <ph name="NUMBER_OF_FILES" />)...</translation> <translation id="8600173386174225982">Zoznam súborov sa zmenil na zobrazenie miniatúr.</translation> <translation id="8601932370724196034">Súbor obrázka Crostini</translation> -<translation id="8608515571837163082">Príliš veľakrát bol zadaný nesprávny PIN. Zadajte osemmiestny PUK od operátora.</translation> <translation id="8609695766746872526">Islandská klávesnica</translation> <translation id="863903787380594467">Nesprávny kód PIN. Zostáva vám tento počet pokusov: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb index 7f5d6cb..7de4b07b 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sl.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sl.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Spletni naslov samodejne konfiguracije:</translation> <translation id="2288278176040912387">Gramofon</translation> <translation id="2291538123825441971">Odpiranje toliko datotek: <ph name="NUMBER_OF_FILES" />.</translation> -<translation id="2303282178633578561">Zakleni kartico SIM</translation> <translation id="2303301624314357662">Odpiranje datoteke <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881">Pogon <ph name="VOLUME_NAME" /> je bil izvržen.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Vaše nedavne datoteke bodo prikazane tukaj</translation> <translation id="2578394532502990878">tamilščina (fonetična)</translation> <translation id="2579959351793446050">odijščina</translation> -<translation id="2593644851255584939">Skrbnik zahteva, da onemogočite zaklepanje kartice SIM.</translation> <translation id="2602810353103180630">Omrežje <ph name="NETWORK_INDEX" /> od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, moč signala <ph name="SIGNAL_STRENGTH" /> %, blokiral skrbnik, podrobnosti</translation> <translation id="2614589611416690597">Videoposnetek <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Kartica SIM je zaklenjena</translation> <translation id="2620090360073999360">Storitev Google Drive trenutno ni na voljo.</translation> <translation id="2621713457727696555">Varno</translation> <translation id="2638942478653899953">Google Drive ni dosegljiv. <ph name="BEGIN_LINK" />Odjavite se<ph name="END_LINK" /> in se znova prijavite.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Izprazni smetnjak</translation> <translation id="5163869187418756376">Souporaba ni uspela. Preverite povezavo in poskusite znova.</translation> <translation id="516592729076796170">Angleška tipkovnica Dvorak za programerje (ZDA)</translation> +<translation id="5172749059808361023">Podrobnosti o omejitvi</translation> <translation id="5177526793333269655">Pogled sličic</translation> <translation id="5194713942430106590">Kliknite, če želite razvrstiti elemente stolpca v naraščajočem vrstnem redu.</translation> <translation id="5211614973734216083">ferščina</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">latvijščina</translation> <translation id="5489965683297092283">Filter <ph name="FILTER_NAME" /> je izklopljen.</translation> <translation id="5494920125229734069">Izberi vse</translation> -<translation id="5500104704744051184">Tega omrežja ne bo mogoče uporabljati, dokler ne vnesete kode PUK.</translation> <translation id="5500122897333236901">islandščina</translation> <translation id="5508696409934741614">Pike</translation> <translation id="5522908512596376669">Seznam datotek je spremenjen na prikaz seznama.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Napaka pri konfiguriranju omrežja</translation> <translation id="7839804798877833423">Za prenos teh datotek bo porabljenih približno <ph name="FILE_SIZE" /> MB mobilnih podatkov.</translation> <translation id="7846076177841592234">Prekliči izbor</translation> -<translation id="7847617962681804761">Če želite uporabljati prenos podatkov v mobilnem omrežju, potrebujete kodo PIN.</translation> <translation id="7853966320808728790">francoščina – BÉPO</translation> <translation id="7857117644404132472">Dodaj izjemo</translation> <translation id="7868774406711971383">poljščina</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Sinhroniziranje datotek (<ph name="NUMBER_OF_FILES" />) ...</translation> <translation id="8600173386174225982">Seznam datotek je spremenjen na pogled sličic.</translation> <translation id="8601932370724196034">Slikovna datoteka za Crostini</translation> -<translation id="8608515571837163082">Prevečkrat ste vnesli napačno kodo PIN. Vnesite 8-mestno osebno kodo za odblokiranje (PUK), ki jo dobite od operaterja.</translation> <translation id="8609695766746872526">islandščina</translation> <translation id="863903787380594467">Napačna koda PIN. Imate še toliko poskusov: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – vrata</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb index fbcf52a..4ce07e4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sq.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sq.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL-ja e konfigurimit automatik:</translation> <translation id="2288278176040912387">Gramafoni</translation> <translation id="2291538123825441971">Po hapen <ph name="NUMBER_OF_FILES" /> skedarë.</translation> -<translation id="2303282178633578561">Kyçe kartën SIM</translation> <translation id="2303301624314357662">Po hap skedarin <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> është nxjerrë.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Skedarët e tu më të fundit do të shfaqen këtu</translation> <translation id="2578394532502990878">Tamilisht fonetike</translation> <translation id="2579959351793446050">Odiaisht</translation> -<translation id="2593644851255584939">Administratori yt kërkon që të çaktivizosh kyçjen e kartës SIM.</translation> <translation id="2602810353103180630">Rrjeti <ph name="NETWORK_INDEX" /> nga <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, fuqia e sinjalit <ph name="SIGNAL_STRENGTH" />%, bllokuar nga administratori yt, detajet</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Karta SIM është e kyçur</translation> <translation id="2620090360073999360">"Disku i Google" nuk mund të arrihet në këtë moment.</translation> <translation id="2621713457727696555">I siguruar</translation> <translation id="2638942478653899953">"Disku i Google" është i paarritshëm. <ph name="BEGIN_LINK" />Dil<ph name="END_LINK" /> dhe identifikohu përsëri.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Letonisht</translation> <translation id="5489965683297092283">Filtri <ph name="FILTER_NAME" /> është joaktiv.</translation> <translation id="5494920125229734069">Zgjidh të gjitha</translation> -<translation id="5500104704744051184">Nuk do të mund ta përdorësh këtë rrjet derisa të futësh kodin PUK</translation> <translation id="5500122897333236901">Islandisht</translation> <translation id="5508696409934741614">Pika</translation> <translation id="5522908512596376669">Lista e skedarëve ka ndryshuar në pamjen e listës.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Gabim gjatë konfigurimit të rrjetit</translation> <translation id="7839804798877833423">Marrja e këtyre skedarëve do të përdorë afro <ph name="FILE_SIZE" /> të dhëna celulare.</translation> <translation id="7846076177841592234">Anulo zgjedhjen</translation> -<translation id="7847617962681804761">Kërkohet PIN për të përdorur të dhënat celulare</translation> <translation id="7853966320808728790">Franceze BÉPO</translation> <translation id="7857117644404132472">Shto një përjashtim</translation> <translation id="7868774406711971383">Polonisht</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Po sinkronizohen <ph name="NUMBER_OF_FILES" /> artikuj...</translation> <translation id="8600173386174225982">Lista e skedarëve ka ndryshuar në pamjen e miniaturës.</translation> <translation id="8601932370724196034">Skedar imazhi Crostini</translation> -<translation id="8608515571837163082">Është futur shumë herë një kod PIN i gabuar. Fut "Çelësin personal të zhbllokimit" (PUK) me 8 shifra të dhënë nga operatori celular.</translation> <translation id="8609695766746872526">Islandisht</translation> <translation id="863903787380594467">Kodi PIN është i pasaktë. Të kanë mbetur edhe <ph name="RETRIES" /> përpjekje.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - porta</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb index 013ddc8..cb14372 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr-Latn.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL za automatsku konfiguraciju:</translation> <translation id="2288278176040912387">Gramofon</translation> <translation id="2291538123825441971">Otvaraju se datoteke (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Zaključaj SIM karticu</translation> <translation id="2303301624314357662">Otvara se datoteka <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Planeta</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> je izbačen.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Nedavni fajlovi će se prikazivati ovde</translation> <translation id="2578394532502990878">fonetski tamilski</translation> <translation id="2579959351793446050">orija</translation> -<translation id="2593644851255584939">Administrator zahteva da onemogućite zaključavanje SIM kartice.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. mreža od <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, jačina signala <ph name="SIGNAL_STRENGTH" />%, blokirao administrator, detalji</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM kartica je zaključana</translation> <translation id="2620090360073999360">Trenutno nije moguće uspostaviti vezu sa Google diskom.</translation> <translation id="2621713457727696555">Zaštićeno</translation> <translation id="2638942478653899953">Nije moguće uspostaviti vezu sa Google diskom. <ph name="BEGIN_LINK" />Odjavite se<ph name="END_LINK" />, pa se ponovo prijavite.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Isprazni Otpad</translation> <translation id="5163869187418756376">Deljenje nije uspelo. Proverite vezu i pokušajte ponovo kasnije.</translation> <translation id="516592729076796170">Američka Dvorak tastatura za programere</translation> +<translation id="5172749059808361023">Detalji ograničenja</translation> <translation id="5177526793333269655">Prikaz sličica</translation> <translation id="5194713942430106590">Kliknite da biste sortirali stavke u koloni po rastućem redosledu.</translation> <translation id="5211614973734216083">farski</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">letonski</translation> <translation id="5489965683297092283">Filter <ph name="FILTER_NAME" /> je isključen.</translation> <translation id="5494920125229734069">Izbor svih stavki</translation> -<translation id="5500104704744051184">Nećete moći da koristite ovu mrežu dok ne unesete PUK</translation> <translation id="5500122897333236901">islandski</translation> <translation id="5508696409934741614">Tačke</translation> <translation id="5522908512596376669">Lista datoteka se promenila u prikaz liste.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Greška pri konfiguraciji mreže</translation> <translation id="7839804798877833423">Preuzimanje ovih datoteka će iskoristiti oko <ph name="FILE_SIZE" /> podataka za mobilne uređaje.</translation> <translation id="7846076177841592234">Otkaži izbor</translation> -<translation id="7847617962681804761">PIN je neophodan da bi se koristili mobilni podaci</translation> <translation id="7853966320808728790">Francuska BÉPO</translation> <translation id="7857117644404132472">Dodaj izuzetak</translation> <translation id="7868774406711971383">poljski</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Sinhronizuju se stavke (<ph name="NUMBER_OF_FILES" />)...</translation> <translation id="8600173386174225982">Lista datoteka se promenila u prikaz sličica.</translation> <translation id="8601932370724196034">Crostini datoteka slike</translation> -<translation id="8608515571837163082">Previše puta ste uneli pogrešan PIN. Unesite osmocifrenu ličnu šifru za otključavanje (PUK) koju vam je dao mobilni operater.</translation> <translation id="8609695766746872526">islandski</translation> <translation id="863903787380594467">Netačan PIN. Preostalih pokušaja: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb index f497173..baa5e03 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sr.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL за аутоматску конфигурацију:</translation> <translation id="2288278176040912387">Грамофон</translation> <translation id="2291538123825441971">Отварају се датотеке (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Закључај SIM картицу</translation> <translation id="2303301624314357662">Отвара се датотека <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> је избачен.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Недавни фајлови ће се приказивати овде</translation> <translation id="2578394532502990878">фонетски тамилски</translation> <translation id="2579959351793446050">орија</translation> -<translation id="2593644851255584939">Администратор захтева да онемогућите закључавање SIM картице.</translation> <translation id="2602810353103180630"><ph name="NETWORK_INDEX" />. мрежа од <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, јачина сигнала <ph name="SIGNAL_STRENGTH" />%, блокирао администратор, детаљи</translation> <translation id="2614589611416690597">Видео <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM картица је закључана</translation> <translation id="2620090360073999360">Тренутно није могуће успоставити везу са Google диском.</translation> <translation id="2621713457727696555">Заштићено</translation> <translation id="2638942478653899953">Није могуће успоставити везу са Google диском. <ph name="BEGIN_LINK" />Одјавите се<ph name="END_LINK" />, па се поново пријавите.</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">Испразни Отпад</translation> <translation id="5163869187418756376">Дељење није успело. Проверите везу и покушајте поново касније.</translation> <translation id="516592729076796170">Америчка Дворак тастатура за програмере</translation> +<translation id="5172749059808361023">Детаљи ограничења</translation> <translation id="5177526793333269655">Приказ сличица</translation> <translation id="5194713942430106590">Кликните да бисте сортирали ставке у колони по растућем редоследу.</translation> <translation id="5211614973734216083">фарски</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">летонски</translation> <translation id="5489965683297092283">Филтер <ph name="FILTER_NAME" /> је искључен.</translation> <translation id="5494920125229734069">Избор свих ставки</translation> -<translation id="5500104704744051184">Нећете моћи да користите ову мрежу док не унесете PUK</translation> <translation id="5500122897333236901">исландски</translation> <translation id="5508696409934741614">Тачке</translation> <translation id="5522908512596376669">Листа датотека се променила у приказ листе.</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">Грешка при конфигурацији мреже</translation> <translation id="7839804798877833423">Преузимање ових датотека ће искористити око <ph name="FILE_SIZE" /> података за мобилне уређаје.</translation> <translation id="7846076177841592234">Откажи избор</translation> -<translation id="7847617962681804761">PIN је неопходан да би се користили мобилни подаци</translation> <translation id="7853966320808728790">Француска BÉPO</translation> <translation id="7857117644404132472">Додај изузетак</translation> <translation id="7868774406711971383">пољски</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">Синхронизују се ставке (<ph name="NUMBER_OF_FILES" />)...</translation> <translation id="8600173386174225982">Листа датотека се променила у приказ сличица.</translation> <translation id="8601932370724196034">Crostini датотека слике</translation> -<translation id="8608515571837163082">Превише пута сте унели погрешан PIN. Унесите осмоцифрену личну шифру за откључавање (PUK) коју вам је дао мобилни оператер.</translation> <translation id="8609695766746872526">исландски</translation> <translation id="863903787380594467">Нетачан PIN. Преосталих покушаја: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – порт</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb index d6cf4d0..de58655 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sv.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sv.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Webbadress för automatisk konfiguration:</translation> <translation id="2288278176040912387">Skivspelare</translation> <translation id="2291538123825441971">Öppnar <ph name="NUMBER_OF_FILES" /> filer.</translation> -<translation id="2303282178633578561">Lås SIM-kort</translation> <translation id="2303301624314357662">Öppnar filen <ph name="FILE_NAME" /></translation> <translation id="2304820083631266885">Planet</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> har tagits bort.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">De senaste filerna visas här</translation> <translation id="2578394532502990878">tamil, fonetiskt</translation> <translation id="2579959351793446050">odia</translation> -<translation id="2593644851255584939">Administratören kräver att du inaktiverar SIM-låset.</translation> <translation id="2602810353103180630">Nätverk <ph name="NETWORK_INDEX" /> av <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, signalstyrka <ph name="SIGNAL_STRENGTH" /> %, blockerat av administratören, information</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" />-video</translation> -<translation id="2617342710774726426">SIM-kortet är låst</translation> <translation id="2620090360073999360">Det går inte att nå Google Drive just nu.</translation> <translation id="2621713457727696555">Skyddat</translation> <translation id="2638942478653899953">Det gick inte att nå Google Drive. <ph name="BEGIN_LINK" />Logga ut<ph name="END_LINK" /> och sedan in igen.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">lettiska</translation> <translation id="5489965683297092283">Filtret <ph name="FILTER_NAME" /> är av.</translation> <translation id="5494920125229734069">Markera alla</translation> -<translation id="5500104704744051184">Du kan inte använda det här nätverket förrän du anger PUK-koden</translation> <translation id="5500122897333236901">isländska</translation> <translation id="5508696409934741614">Punkter</translation> <translation id="5522908512596376669">Fillistan har ändrats till listvy.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Fel i nätverkskonfigurationen</translation> <translation id="7839804798877833423">Att hämta dessa filer kräver ungefär <ph name="FILE_SIZE" /> mobildata.</translation> <translation id="7846076177841592234">Rensa val</translation> -<translation id="7847617962681804761">En pinkod krävs för att använda mobildata</translation> <translation id="7853966320808728790">franska (BÉPO)</translation> <translation id="7857117644404132472">Lägg till undantag</translation> <translation id="7868774406711971383">polska</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Synkroniserar <ph name="NUMBER_OF_FILES" /> objekt ...</translation> <translation id="8600173386174225982">Fillistan har ändrats till miniatyrvy.</translation> <translation id="8601932370724196034">Bildfil för Crostini</translation> -<translation id="8608515571837163082">Fel pinkod har angetts för många gånger. Ange den åttasiffriga PUK-koden (Personal Unblocking Key) som du har fått från operatören.</translation> <translation id="8609695766746872526">isländska</translation> <translation id="863903787380594467">Fel pinkod. Du har <ph name="RETRIES" /> försök kvar.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb index 1093c4b..a7999faf 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_sw.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_sw.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL ya kuweka mipangilio kiotomatiki:</translation> <translation id="2288278176040912387">Kicheza rekodi</translation> <translation id="2291538123825441971">Inafungua faili <ph name="NUMBER_OF_FILES" />.</translation> -<translation id="2303282178633578561">Funga SIM kadi</translation> <translation id="2303301624314357662">Inafungua faili ya <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Sayari</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> imeondolewa.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Faili zako za hivi karibuni zitaonekana hapa</translation> <translation id="2578394532502990878">Fonetiki ya Kitamili</translation> <translation id="2579959351793446050">Kiodia</translation> -<translation id="2593644851255584939">Msimamizi wako anahitaji uzime hali ya kufunga SIM.</translation> <translation id="2602810353103180630">Mtandao wa <ph name="NETWORK_INDEX" /> kati ya <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Uthabiti wa Mtandao, <ph name="SIGNAL_STRENGTH" />%, Umezuiwa na Msimamizi wako, Maelezo</translation> <translation id="2614589611416690597">Video ya <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM kadi imefungwa</translation> <translation id="2620090360073999360">Hifadhi ya Google haiwezi kufikiwa kwa wakati huu.</translation> <translation id="2621713457727696555">Unalindwa</translation> <translation id="2638942478653899953">Hifadhi ya Google haikuweza kupatikana. Tafadhali <ph name="BEGIN_LINK" />ondoka<ph name="END_LINK" /> na uingie tena.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Kilativia</translation> <translation id="5489965683297092283">Kichujio cha <ph name="FILTER_NAME" /> kimezimwa.</translation> <translation id="5494920125229734069">Chagua zote</translation> -<translation id="5500104704744051184">Hutaweza kutumia mtandao huu hadi utakapoweka PUK</translation> <translation id="5500122897333236901">Kiaislandi</translation> <translation id="5508696409934741614">Nukta</translation> <translation id="5522908512596376669">Umebadilisha orodha ya faili kuwa mwonekano wa orodha.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Hitilafu imetokea wakati wa kuweka mipangilio ya mtandao</translation> <translation id="7839804798877833423">Kupata faili hizi kutatumia takribani <ph name="FILE_SIZE" /> za data ya simu ya mkononi.</translation> <translation id="7846076177841592234">Ghairi uchaguzi</translation> -<translation id="7847617962681804761">Unahitaji PIN ili uweze kutumia data ya mtandao wa simu</translation> <translation id="7853966320808728790">BÉPO ya Kifaransa</translation> <translation id="7857117644404132472">Ongeza kighairi</translation> <translation id="7868774406711971383">Kipolandi</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Inasasisha vipengee <ph name="NUMBER_OF_FILES" />...</translation> <translation id="8600173386174225982">Orodha ya faili imebadilishwa kuwa mwonekano wa kijipicha.</translation> <translation id="8601932370724196034">Picha ya faili ya Crostini</translation> -<translation id="8608515571837163082">Umeweka PIN isiyo sahihi mara nyingi mno. Weka Nambari Binafsi ya Kufungua (PUK) yenye tarakimu 8 uliyopewa na mtoa huduma.</translation> <translation id="8609695766746872526">Kiaislandi</translation> <translation id="863903787380594467">PIN si sahihi. Umebakisha majaribio <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Mlango</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb index 1345512..8cec14d 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ta.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ta.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">தானியங்கு உள்ளமைவு URL:</translation> <translation id="2288278176040912387">பதிவு பிளேயர்</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ஃபைல்களைத் திறக்கிறது.</translation> -<translation id="2303282178633578561">சிம் கார்டைப் பூட்டு</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ஃபைலைத் திறக்கிறது.</translation> <translation id="2304820083631266885">கோள்</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> வெளியேற்றப்பட்டது.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">உங்கள் சமீபத்திய ஃபைல்கள் இங்கே காட்டப்படும்</translation> <translation id="2578394532502990878">தமிழ் ஒலிப்புமுறை</translation> <translation id="2579959351793446050">ஒடியா</translation> -<translation id="2593644851255584939">சிம் பூட்டை முடக்குமாறு உங்கள் நிர்வாகி கோருகிறார்.</translation> <translation id="2602810353103180630">நெட்வொர்க் <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, சிக்னல் வலிமை <ph name="SIGNAL_STRENGTH" />%, உங்கள் நிர்வாகி தடுத்துள்ளார், விவரங்கள்</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> வீடியோ</translation> -<translation id="2617342710774726426">சிம் கார்டு பூட்டப்பட்டுள்ளது</translation> <translation id="2620090360073999360">இந்த நேரத்தில் Google இயக்ககத்தை அடைய முடியாது.</translation> <translation id="2621713457727696555">பாதுகாக்கப்பட்ட வைஃபை நெட்வொர்க்</translation> <translation id="2638942478653899953">Google இயக்ககத்தை அடைய முடியவில்லை. <ph name="BEGIN_LINK" />வெளியேறி<ph name="END_LINK" /> திரும்பவும் உள்நுழையவும்.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">லாட்வியன்</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> வடிப்பான் முடக்கப்பட்டுள்ளது.</translation> <translation id="5494920125229734069">எல்லாவற்றையும் தேர்ந்தெடு</translation> -<translation id="5500104704744051184">PUKவை வழங்கினால் மட்டுமே இந்த நெட்வொர்க்கைப் பயன்படுத்த முடியும்</translation> <translation id="5500122897333236901">ஐஸ்லாண்டிக்</translation> <translation id="5508696409934741614">புள்ளிகள்</translation> <translation id="5522908512596376669">ஃபைல் பட்டியல் 'பட்டியல் காட்சிக்கு' மாறியுள்ளது.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">நெட்வொர்க்கை உள்ளமைப்பதில் பிழை</translation> <translation id="7839804798877833423">இந்த ஃபைல்களைப் பெற்றால், மொபைல் டேட்டாவில் தோராயமாக <ph name="FILE_SIZE" /> ஐப் பயன்படுத்தும்.</translation> <translation id="7846076177841592234">தேர்வை ரத்துசெய்</translation> -<translation id="7847617962681804761">மொபைல் டேட்டாவைப் பயன்படுத்த பின் (PIN) தேவை</translation> <translation id="7853966320808728790">ஃபிரஞ்ச் பீபோ</translation> <translation id="7857117644404132472">விதிவிலக்கைச் சேர்</translation> <translation id="7868774406711971383">போலிஷ்</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> உருப்படிகளை ஒத்திசைக்கிறது...</translation> <translation id="8600173386174225982">ஃபைல் பட்டியல் சிறுபடக் காட்சிக்கு மாறியுள்ளது.</translation> <translation id="8601932370724196034">Crostini பட ஃபைல்</translation> -<translation id="8608515571837163082">பலமுறை தவறான பின்னை (PIN) வழங்கிவிட்டீர்கள். மொபைல் நெட்வொர்க் நிறுவனம் வழங்கிய, தடுப்பை நீக்குவதற்கான 8 இலக்கத் தனிப்பட்ட குறியீட்டை (PUK) வழங்கவும்.</translation> <translation id="8609695766746872526">ஐஸ்லாண்டிக்</translation> <translation id="863903787380594467">தவறான பின். <ph name="RETRIES" /> முயற்சிகள் மீதமுள்ளன.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - போர்ட்</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_te.xtb b/ui/chromeos/translations/ui_chromeos_strings_te.xtb index c5fcf887..925ff89 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_te.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_te.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">ఆటోకాన్ఫిగరేషన్ URL:</translation> <translation id="2288278176040912387">రికార్డ్ ప్లేయర్</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ఫైళ్లను తెరుస్తోంది.</translation> -<translation id="2303282178633578561">సిమ్ కార్డ్ను లాక్ చేయి</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> ఫైల్ని తెరుస్తోంది.</translation> <translation id="2304820083631266885">గ్రహం</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> తొలగించబడింది.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">మీ తాజా ఫైళ్లు ఇక్కడ కనిపిస్తాయి</translation> <translation id="2578394532502990878">తమిళం ఫొనెటిక్</translation> <translation id="2579959351793446050">ఒడియా</translation> -<translation id="2593644851255584939">SIM లాక్ను డిజేబుల్ చేయాల్సిందిగా మీ అడ్మినిస్ట్రేటర్ కోరుతున్నారు.</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" />లో <ph name="NETWORK_INDEX" /> నెట్వర్క్, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, సిగ్నల్ సామర్థ్యం <ph name="SIGNAL_STRENGTH" />%, మీ అడ్మినిస్ట్రేటర్ బ్లాక్ చేశారు, వివరాలు</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> వీడియో</translation> -<translation id="2617342710774726426">SIM కార్డ్ లాక్ అయింది</translation> <translation id="2620090360073999360">Google Driveను ఈ సమయంలో చేరుకోవడం సాధ్యపడదు.</translation> <translation id="2621713457727696555">సురక్షితమైంది</translation> <translation id="2638942478653899953">Google Driveను చేరుకోవడం సాధ్యపడలేదు. దయచేసి <ph name="BEGIN_LINK" />లాగ్ అవుట్<ph name="END_LINK" /> చేసి, తిరిగి లాగిన్ చేయండి.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">లాత్వియన్</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> ఫిల్టర్ ఆఫ్లో ఉంది.</translation> <translation id="5494920125229734069">అన్నీ ఎంచుకోండి</translation> -<translation id="5500104704744051184">మీరు PUKను ఎంటర్ చేసే వరకు మీరు ఈ నెట్వర్క్ను ఉపయోగించలేరు</translation> <translation id="5500122897333236901">ఐస్లాండిక్</translation> <translation id="5508696409934741614">చుక్కలు</translation> <translation id="5522908512596376669">ఫైల్ లిస్ట్, "లిస్ట్ వీక్షణ"కు మార్చబడింది.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">నెట్వర్క్ను కాన్ఫిగర్ చేయడంలో ఎర్రర్</translation> <translation id="7839804798877833423">ఈ ఫైళ్లను పొందడానికి మొబైల్ డేటాలో సుమారుగా <ph name="FILE_SIZE" /> ఉపయోగించబడుతుంది.</translation> <translation id="7846076177841592234">ఎంపికను రద్దు చేయి</translation> -<translation id="7847617962681804761">మొబైల్ డేటాను ఉపయోగించడానికి PIN అవసరం</translation> <translation id="7853966320808728790">ఫ్రెంచ్ BÉPO</translation> <translation id="7857117644404132472">మినహాయింపును జోడించు</translation> <translation id="7868774406711971383">పోలిష్</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> అంశాలను సింక్ చేస్తోంది...</translation> <translation id="8600173386174225982">ఫైల్ లిస్ట్, "సూక్ష్మచిత్ర వీక్షణ"కు మార్చబడింది.</translation> <translation id="8601932370724196034">Crostini చిత్రం ఫైల్</translation> -<translation id="8608515571837163082">చాలా ఎక్కువ సార్లు తప్పు PIN ఎంటర్ చేయబడింది. క్యారియర్ అందించిన 8-అంకెల వ్యక్తిగత అన్బ్లాకింగ్ కీ (PUK)ని ఎంటర్ చేయండి.</translation> <translation id="8609695766746872526">ఐస్లాండిక్</translation> <translation id="863903787380594467">పిన్ తప్పు. మీకు <ph name="RETRIES" /> ప్రయత్నాలు మిగిలి ఉన్నాయి.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - పోర్ట్</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_th.xtb b/ui/chromeos/translations/ui_chromeos_strings_th.xtb index 5d8c4eac..b885ee1 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_th.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_th.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL การกำหนดค่าอัตโนมัติ:</translation> <translation id="2288278176040912387">เครื่องเล่นแผ่นเสียง</translation> <translation id="2291538123825441971">กำลังเปิด <ph name="NUMBER_OF_FILES" /> ไฟล์</translation> -<translation id="2303282178633578561">ล็อกซิมการ์ด</translation> <translation id="2303301624314357662">กำลังเปิดไฟล์ <ph name="FILE_NAME" /></translation> <translation id="2304820083631266885">ดาวเคราะห์</translation> <translation id="2305020378527873881">นำ <ph name="VOLUME_NAME" /> ออกแล้ว</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">ไฟล์ล่าสุดจะปรากฏที่นี่</translation> <translation id="2578394532502990878">ทมิฬ (ตามการออกเสียง)</translation> <translation id="2579959351793446050">โอเดีย</translation> -<translation id="2593644851255584939">ผู้ดูแลระบบกำหนดให้คุณปิดใช้การล็อกซิม</translation> <translation id="2602810353103180630">เครือข่ายที่ <ph name="NETWORK_INDEX" /> จาก <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, ความแรงสัญญาณ <ph name="SIGNAL_STRENGTH" />%, ถูกผู้ดูแลระบบบล็อก, รายละเอียด</translation> <translation id="2614589611416690597">วิดีโอ <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">ซิมการ์ดถูกล็อก</translation> <translation id="2620090360073999360">ไม่สามารถเข้าถึง Google ไดรฟ์ได้ในเวลานี้</translation> <translation id="2621713457727696555">ปลอดภัย</translation> <translation id="2638942478653899953">ไม่สามารถเข้าถึง Google ไดรฟ์ โปรด<ph name="BEGIN_LINK" />ออกจากระบบ<ph name="END_LINK" /> และเข้าสู่ระบบใหม่อีกครั้ง</translation> @@ -488,6 +485,7 @@ <translation id="5159560892333415631">ล้างถังขยะ</translation> <translation id="5163869187418756376">การแชร์ล้มเหลว ตรวจสอบการเชื่อมต่อของคุณและพยายามอีกครั้งในภายหลัง</translation> <translation id="516592729076796170">ดีโวรักโปรแกรมเมอร์สหรัฐอเมริกา</translation> +<translation id="5172749059808361023">รายละเอียดข้อจำกัด</translation> <translation id="5177526793333269655">มุมมองรูปภาพขนาดย่อ</translation> <translation id="5194713942430106590">คลิกเพื่อจัดเรียงคอลัมน์จากน้อยไปหามาก</translation> <translation id="5211614973734216083">แฟโร</translation> @@ -529,7 +527,6 @@ <translation id="5489067830765222292">ลัตเวีย</translation> <translation id="5489965683297092283">ตัวกรอง <ph name="FILTER_NAME" /> ปิดอยู่</translation> <translation id="5494920125229734069">เลือกทั้งหมด</translation> -<translation id="5500104704744051184">คุณจะใช้เครือข่ายนี้ไม่ได้จนกว่าจะป้อน PUK</translation> <translation id="5500122897333236901">ไอซ์แลนดิก</translation> <translation id="5508696409934741614">จุด</translation> <translation id="5522908512596376669">เปลี่ยนรายการไฟล์เป็นมุมมองรายการแล้ว</translation> @@ -810,7 +807,6 @@ <translation id="7831491651892296503">เกิดข้อผิดพลาดในการกำหนดค่าเครือข่าย</translation> <translation id="7839804798877833423">การดึงไฟล์เหล่านี้จะใช้ข้อมูลมือถือขนาดประมาณ <ph name="FILE_SIZE" /></translation> <translation id="7846076177841592234">ยกเลิกการเลือก</translation> -<translation id="7847617962681804761">ต้องมี PIN เพื่อใช้อินเทอร์เน็ตมือถือ</translation> <translation id="7853966320808728790">ภาษาฝรั่งเศสแบบ BÉPO</translation> <translation id="7857117644404132472">เพิ่มข้อยกเว้น</translation> <translation id="7868774406711971383">โปแลนด์</translation> @@ -905,7 +901,6 @@ <translation id="8579285237314169903">กำลังซิงค์ <ph name="NUMBER_OF_FILES" /> รายการ...</translation> <translation id="8600173386174225982">เปลี่ยนรายการไฟล์เป็นมุมมองภาพขนาดย่อแล้ว</translation> <translation id="8601932370724196034">ไฟล์ภาพ Crostini</translation> -<translation id="8608515571837163082">ป้อน PIN ไม่ถูกต้องหลายครั้งเกินไป ป้อนคีย์การเลิกบล็อกส่วนตัว (PUK) 8 หลักจากผู้ให้บริการ</translation> <translation id="8609695766746872526">ไอซ์แลนด์</translation> <translation id="863903787380594467">PIN ไม่ถูกต้อง คุณลองได้อีก <ph name="RETRIES" /> ครั้ง</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - พอร์ต</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb index 64c9529f..99352cae 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_tr.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_tr.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Otomatik yapılandırma URL'si:</translation> <translation id="2288278176040912387">Plak çalar</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> dosya açılıyor.</translation> -<translation id="2303282178633578561">SIM kartı kilitle</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> dosyası açılıyor.</translation> <translation id="2304820083631266885">Gezegen</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> çıkarıldı.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Son dosyalarınız burada gösterilir</translation> <translation id="2578394532502990878">Tamilce Fonetik</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Yöneticiniz, SIM kilidini devre dışı bırakmanızı zorunlu tutuyor.</translation> <translation id="2602810353103180630">Ağ <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Sinyal Gücü %<ph name="SIGNAL_STRENGTH" />, Yöneticiniz tarafından engellenmiş, Ayrıntılar</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> video</translation> -<translation id="2617342710774726426">SIM kart kilitli</translation> <translation id="2620090360073999360">Google Drive'a şu anda erişilemiyor.</translation> <translation id="2621713457727696555">Güvenlik sağlandı</translation> <translation id="2638942478653899953">Google Drive'a erişilemedi. Lütfen <ph name="BEGIN_LINK" />çıkıp<ph name="END_LINK" /> tekrar giriş yapın.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Letonca</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> filtresi kapalı.</translation> <translation id="5494920125229734069">Tümünü seç</translation> -<translation id="5500104704744051184">PUK'u girmeden bu ağı kullanamazsınız</translation> <translation id="5500122897333236901">İzlanda dili</translation> <translation id="5508696409934741614">Noktalar</translation> <translation id="5522908512596376669">Dosya listesi, liste görünümü olarak değiştirildi.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Ağ yapılandırılırken hata oluştu</translation> <translation id="7839804798877833423">Bu dosyaları getirmek için yaklaşık olarak <ph name="FILE_SIZE" /> mobil veri kullanılacak.</translation> <translation id="7846076177841592234">Seçimi iptal et</translation> -<translation id="7847617962681804761">Mobil veri kullanmak için PIN gerekir</translation> <translation id="7853966320808728790">Fransızca BÉPO</translation> <translation id="7857117644404132472">İstisna ekle</translation> <translation id="7868774406711971383">Lehçe</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> öğe senkronize ediliyor...</translation> <translation id="8600173386174225982">Dosya listesi, küçük resim görünümü olarak değiştirildi.</translation> <translation id="8601932370724196034">Crostini resim dosyası</translation> -<translation id="8608515571837163082">Çok sayıda yanlış PIN girildi. Operatörünüz tarafından sağlanan 8 basamaklı Kişisel Engelleme Anahtarınızı (PUK) girin.</translation> <translation id="8609695766746872526">İzlandaca</translation> <translation id="863903787380594467">Yanlış PIN. <ph name="RETRIES" /> deneme hakkınız kaldı.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Bağlantı noktası</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb index 017a279..151b96aa 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uk.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uk.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL-адреса автоконфігурації:</translation> <translation id="2288278176040912387">Грамофон</translation> <translation id="2291538123825441971">Відкриваються файли (<ph name="NUMBER_OF_FILES" />).</translation> -<translation id="2303282178633578561">Заблокувати SIM-карту</translation> <translation id="2303301624314357662">Відкривається файл "<ph name="FILE_NAME" />".</translation> <translation id="2304820083631266885">Планета</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> відключено.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Тут відображатимуться нещодавні файли</translation> <translation id="2578394532502990878">Тамільська, фонетична розкладка</translation> <translation id="2579959351793446050">Орія</translation> -<translation id="2593644851255584939">Адміністратор вимагає, щоб ви розблокували SIM-карту.</translation> <translation id="2602810353103180630">Мережа №<ph name="NETWORK_INDEX" />; загалом мереж: <ph name="NETWORK_COUNT" />; назва мережі: <ph name="NETWORK_NAME" />; стан з’єднання: <ph name="CONNECTION_STATUS" />; рівень сигналу: <ph name="SIGNAL_STRENGTH" />%; заблоковано адміністратором; відомості</translation> <translation id="2614589611416690597">Відео <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">SIM-карту заблоковано</translation> <translation id="2620090360073999360">Зараз неможливо отримати доступ до Google Диска.</translation> <translation id="2621713457727696555">Захищено</translation> <translation id="2638942478653899953">Диск Google недоступний. <ph name="BEGIN_LINK" />Вийдіть<ph name="END_LINK" /> і ввійдіть знову.</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">Латвійська</translation> <translation id="5489965683297092283">Фільтр "<ph name="FILTER_NAME" />" вимкнено.</translation> <translation id="5494920125229734069">Вибрати все</translation> -<translation id="5500104704744051184">Ви не зможете користуватися цією мережею, доки не введете PUK-код</translation> <translation id="5500122897333236901">Ісландська</translation> <translation id="5508696409934741614">Крапки</translation> <translation id="5522908512596376669">Список файлів тепер відображається у вигляді списку.</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">Помилка налаштування мережі</translation> <translation id="7839804798877833423">Для отримання цих файлів буде використано приблизно <ph name="FILE_SIZE" /> мобільного передавання даних.</translation> <translation id="7846076177841592234">Скасувати вибір</translation> -<translation id="7847617962681804761">Щоб використовувати мобільний Інтернет, потрібно ввести PIN-код</translation> <translation id="7853966320808728790">Французька клавіатура BÉPO</translation> <translation id="7857117644404132472">Додати виняток</translation> <translation id="7868774406711971383">Польська</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">Синхронізація стількох елементів: <ph name="NUMBER_OF_FILES" />…</translation> <translation id="8600173386174225982">Список файлів тепер відображається у вигляді ескізів.</translation> <translation id="8601932370724196034">Файл зображення Crostini</translation> -<translation id="8608515571837163082">Ви ввели неправильний PIN-код забагато разів. Введіть 8-значний PUK-код, який надав оператор.</translation> <translation id="8609695766746872526">Ісландська</translation> <translation id="863903787380594467">Неправильний PIN-код. Залишилося спроб: <ph name="RETRIES" />.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Порт</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb index cfdc679..4c2fae77 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_ur.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_ur.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">خودکار کنفیگریشن URL:</translation> <translation id="2288278176040912387">ریکارڈ پلیئر</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> فائلیں کھل رہی ہیں۔</translation> -<translation id="2303282178633578561">SIM کارڈ کو مقفل کریں</translation> <translation id="2303301624314357662">فائل <ph name="FILE_NAME" /> کھل رہی ہے۔</translation> <translation id="2304820083631266885">سیارہ</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> کو خارج کر دیا گیا ہے۔</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">آپ کی حالیہ فائلیں یہاں ظاہر ہوں گی</translation> <translation id="2578394532502990878">تمل فونیٹک</translation> <translation id="2579959351793446050">اڑیہ</translation> -<translation id="2593644851255584939">آپ کا منتظم آپ سے SIM لاک کو غیر فعال کرنے کا مطالبہ کرتا ہے۔</translation> <translation id="2602810353103180630"><ph name="NETWORK_COUNT" /> میں سے <ph name="NETWORK_INDEX" />، <ph name="NETWORK_NAME" /> نیٹ ورک، <ph name="CONNECTION_STATUS" />، سگنل کی مضبوطی <ph name="SIGNAL_STRENGTH" />%، آپ کے منتظم کے ذریعے مسدود کردہ، تفاصیل</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ویڈیو</translation> -<translation id="2617342710774726426">SIM کارڈ مقفل ہے</translation> <translation id="2620090360073999360">اس وقت Google Drive تک رسائی نہیں ہو سکتی ہے۔</translation> <translation id="2621713457727696555">محفوظ ہے</translation> <translation id="2638942478653899953">Google Drive تک رسائی حاصل نہیں ہو سکی۔ براہ کرم <ph name="BEGIN_LINK" />لاگ آؤٹ کریں<ph name="END_LINK" /> اور دوبارہ لاگ ان کریں۔</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">لیٹویائی</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> فلٹر آف ہے۔</translation> <translation id="5494920125229734069">سبھی کو منتخب کریں</translation> -<translation id="5500104704744051184">جب تک آپ PUK درج نہیں کرتے ہیں تب تک آپ اس نیٹ ورک کا استعمال نہیں کر سکیں گے</translation> <translation id="5500122897333236901">آئس لینڈک</translation> <translation id="5508696409934741614">نقطے</translation> <translation id="5522908512596376669">فائل کی فہرست کو فہرست منظر پر تبدیل کر دیا گيا ہے۔</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">نیٹ ورک کو ترتیب دینے میں خرابی</translation> <translation id="7839804798877833423">ان فائلوں کو بازیافت کرنے میں تقریباً <ph name="FILE_SIZE" /> موبائل ڈیٹا استعمال ہوگا۔</translation> <translation id="7846076177841592234">انتخاب منسوخ کریں</translation> -<translation id="7847617962681804761">موبائل ڈیٹا استعمال کرنے کیلئے PIN درکار ہے</translation> <translation id="7853966320808728790">فرانسیسی BÉPO</translation> <translation id="7857117644404132472">استثناء شامل کریں</translation> <translation id="7868774406711971383">پولش</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> آئٹمز کی مطابقت پذیری ہو رہی ہے…</translation> <translation id="8600173386174225982">فائل فہرست کو تھمب نیل منظر میں تبدیل کر دیا گیا ہے۔</translation> <translation id="8601932370724196034">Crostini تصویر فائل</translation> -<translation id="8608515571837163082">ایک غلط PIN کئی مرتبہ درج کیا گیا۔ کیرئیر کے ذریعے فراہم کردہ 8 ہندسوں کی غیر مسدود کرنے کی ذاتی کلید (PUK) درج کریں۔</translation> <translation id="8609695766746872526">آئس لینڈک</translation> <translation id="863903787380594467">غلط PIN۔ آپ کے پاس <ph name="RETRIES" /> کوششیں بچی ہیں۔</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - پورٹ</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb index 4b082fa..8a085e4 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_uz.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_uz.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">Avtomatik sozlash uchun URL manzil:</translation> <translation id="2288278176040912387">Patefon</translation> <translation id="2291538123825441971"><ph name="NUMBER_OF_FILES" /> ta fayl ochilmoqda.</translation> -<translation id="2303282178633578561">SIM kartani qulflash</translation> <translation id="2303301624314357662"><ph name="FILE_NAME" /> fayli ochilmoqda.</translation> <translation id="2304820083631266885">Sayyora</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> tizimdan uzildi.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Oxirgi fayllar shu yerda chiqadi</translation> <translation id="2578394532502990878">Tamil (fonetik)</translation> <translation id="2579959351793446050">Oriya</translation> -<translation id="2593644851255584939">Administrator SIM qulfini faolsizlantirishni talab qiladi.</translation> <translation id="2602810353103180630">Tarmoq: <ph name="NETWORK_INDEX" />/<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Signal darajasi: <ph name="SIGNAL_STRENGTH" />%, Administrator tomonidan bloklangan, Batafsil</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> video</translation> -<translation id="2617342710774726426">SIM karta qulflangan</translation> <translation id="2620090360073999360">Ayni paytda Google Disk ish faoliyatida emas.</translation> <translation id="2621713457727696555">Himoyalangan</translation> <translation id="2638942478653899953">Google Drive‘ga ulanib bo‘lmadi. Iltimos, <ph name="BEGIN_LINK" />tizimdan chiqing<ph name="END_LINK" /> va qaytadan kiring.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Latish</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> filtri oʻchiq.</translation> <translation id="5494920125229734069">Hammasini tanlash</translation> -<translation id="5500104704744051184">PUK kaliti kiritilmaguncha bu tarmoqdan foydalana olmaysiz</translation> <translation id="5500122897333236901">Island tili</translation> <translation id="5508696409934741614">Nuqtalar</translation> <translation id="5522908512596376669">Fayllar roʻyxati uchun saralash shakli almashdi.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Tarmoqni sozlashda xatolik yuz berdi</translation> <translation id="7839804798877833423">Bu fayllarni yuklashga taxminan <ph name="FILE_SIZE" /> mobil trafik sarf bo‘ladi.</translation> <translation id="7846076177841592234">Belgilashni bekor qilish</translation> -<translation id="7847617962681804761">Mobil internetdan foydalanish uchun PIN kod talab etiladi</translation> <translation id="7853966320808728790">Fransuz BEPO</translation> <translation id="7857117644404132472">Istisno qo‘shish</translation> <translation id="7868774406711971383">Polyak</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903"><ph name="NUMBER_OF_FILES" /> ta element sinxronlanmoqda...</translation> <translation id="8600173386174225982">Fayllar roʻyxati uchun saralash shakli eskizlarga almashdi.</translation> <translation id="8601932370724196034">Crostini tasvir fayli</translation> -<translation id="8608515571837163082">PIN kod juda koʻp marta xato kiritildi. Aloqa operatori taqdim qilgan 8-raqamli shaxsiy qulfdan chiqarish kalitini (PUK) kiriting.</translation> <translation id="8609695766746872526">Island</translation> <translation id="863903787380594467">PIN kod xato. Sizda <ph name="RETRIES" /> ta urinish qoldi.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – port</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb index 6862bd7..adc9532e 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_vi.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_vi.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">URL tự động định cấu hình:</translation> <translation id="2288278176040912387">Máy quay đĩa hát</translation> <translation id="2291538123825441971">Đang mở <ph name="NUMBER_OF_FILES" /> tệp.</translation> -<translation id="2303282178633578561">Khóa thẻ SIM</translation> <translation id="2303301624314357662">Đang mở tệp <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Hành tinh</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> đã được đẩy ra.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Các tệp gần đây của bạn sẽ xuất hiện ở đây</translation> <translation id="2578394532502990878">Tiếng Tamil (phiên âm)</translation> <translation id="2579959351793446050">Tiếng Odia</translation> -<translation id="2593644851255584939">Quản trị viên của bạn yêu cầu bạn tắt chế độ Khoá SIM.</translation> <translation id="2602810353103180630">Mạng <ph name="NETWORK_INDEX" /> trong tổng số <ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Cường độ tín hiệu <ph name="SIGNAL_STRENGTH" />%, Quản trị viên của bạn đã chặn, Thông tin chi tiết</translation> <translation id="2614589611416690597">Video <ph name="VIDEO_TYPE" /></translation> -<translation id="2617342710774726426">Thẻ SIM bị khóa</translation> <translation id="2620090360073999360">Không thể kết nối với Google Drive tại thời điểm này.</translation> <translation id="2621713457727696555">Đã bảo mật</translation> <translation id="2638942478653899953">Không thể truy cập Google Drive. Vui lòng <ph name="BEGIN_LINK" />đăng xuất<ph name="END_LINK" /> và đăng nhập lại.</translation> @@ -530,7 +527,6 @@ <translation id="5489067830765222292">Tiếng Latvia</translation> <translation id="5489965683297092283">Đang tắt bộ lọc <ph name="FILTER_NAME" />.</translation> <translation id="5494920125229734069">Chọn tất cả</translation> -<translation id="5500104704744051184">Bạn chỉ có thể sử dụng mạng này khi đã nhập PUK</translation> <translation id="5500122897333236901">Tiếng Ai-xơ-len</translation> <translation id="5508696409934741614">Dấu chấm</translation> <translation id="5522908512596376669">Danh sách tệp đã thay đổi thành chế độ xem danh sách.</translation> @@ -811,7 +807,6 @@ <translation id="7831491651892296503">Lỗi khi định cấu hình mạng</translation> <translation id="7839804798877833423">Tìm nạp các tệp này sẽ sử dụng khoảng <ph name="FILE_SIZE" /> dữ liệu di động.</translation> <translation id="7846076177841592234">Hủy chọn</translation> -<translation id="7847617962681804761">Bạn cần nhập mã PIN để dùng dữ liệu di động</translation> <translation id="7853966320808728790">BÉPO tiếng Pháp</translation> <translation id="7857117644404132472">Thêm ngoại lệ</translation> <translation id="7868774406711971383">Tiếng Ba Lan</translation> @@ -906,7 +901,6 @@ <translation id="8579285237314169903">Đang đồng bộ hóa <ph name="NUMBER_OF_FILES" /> mục...</translation> <translation id="8600173386174225982">Danh sách tệp đã thay đổi thành chế độ xem hình thu nhỏ.</translation> <translation id="8601932370724196034">Tệp hình ảnh Crostini</translation> -<translation id="8608515571837163082">Bạn đã nhập sai mã PIN quá nhiều lần. Nhập Khoá mở khoá cá nhân (PUK) gồm 8 chữ số do nhà mạng cung cấp.</translation> <translation id="8609695766746872526">Tiếng Iceland</translation> <translation id="863903787380594467">Mã PIN không chính xác. Bạn còn <ph name="RETRIES" /> lần nhập.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> – Cổng</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb index f63f41c..7a44ffa 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-CN.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">自动配置网址:</translation> <translation id="2288278176040912387">电唱机</translation> <translation id="2291538123825441971">正在打开 <ph name="NUMBER_OF_FILES" /> 个文件。</translation> -<translation id="2303282178633578561">锁定 SIM 卡</translation> <translation id="2303301624314357662">正在打开文件“<ph name="FILE_NAME" />”</translation> <translation id="2304820083631266885">星球</translation> <translation id="2305020378527873881">已移除 <ph name="VOLUME_NAME" />。</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">您最近用过的文件会显示在此处</translation> <translation id="2578394532502990878">泰米尔语注音</translation> <translation id="2579959351793446050">奥里亚语</translation> -<translation id="2593644851255584939">您的管理员要求您停用 SIM 卡锁定功能。</translation> <translation id="2602810353103180630">第 <ph name="NETWORK_INDEX" /> 个网络(共 <ph name="NETWORK_COUNT" /> 个),<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,信号强度为 <ph name="SIGNAL_STRENGTH" />%,由您的管理员管理,详细信息</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> 视频</translation> -<translation id="2617342710774726426">SIM 卡已被锁定</translation> <translation id="2620090360073999360">Google 云端硬盘目前无法访问。</translation> <translation id="2621713457727696555">受保护</translation> <translation id="2638942478653899953">无法访问 Google 云端硬盘。请先<ph name="BEGIN_LINK" />退出<ph name="END_LINK" />,然后再重新登录。</translation> @@ -524,7 +521,6 @@ <translation id="5489067830765222292">拉脱维亚语</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" />过滤器已关闭。</translation> <translation id="5494920125229734069">全选</translation> -<translation id="5500104704744051184">在输入正确的 PUK 之前,您将无法使用此网络</translation> <translation id="5500122897333236901">冰岛语</translation> <translation id="5508696409934741614">圆点</translation> <translation id="5522908512596376669">文件列表已切换到列表视图。</translation> @@ -805,7 +801,6 @@ <translation id="7831491651892296503">配置网络时出错</translation> <translation id="7839804798877833423">抓取这些文件将使用约 <ph name="FILE_SIZE" /> 移动数据。</translation> <translation id="7846076177841592234">取消选择</translation> -<translation id="7847617962681804761">必须输入 PIN 码才能使用移动数据</translation> <translation id="7853966320808728790">法语 BÉPO</translation> <translation id="7857117644404132472">添加例外情况</translation> <translation id="7868774406711971383">波兰语</translation> @@ -900,7 +895,6 @@ <translation id="8579285237314169903">正在同步 <ph name="NUMBER_OF_FILES" /> 个文件…</translation> <translation id="8600173386174225982">文件列表已切换到缩略图视图。</translation> <translation id="8601932370724196034">Crostini 映像文件</translation> -<translation id="8608515571837163082">您输错 PIN 码的次数过多。请输入运营商提供的 8 位数个人解锁密钥 (PUK)。</translation> <translation id="8609695766746872526">冰岛语</translation> <translation id="863903787380594467">PIN 码不正确。您还有 <ph name="RETRIES" /> 次尝试机会。</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - 端口</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb index 515bf53..23e2e71 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-HK.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">自動設定網址:</translation> <translation id="2288278176040912387">唱機</translation> <translation id="2291538123825441971">開緊 <ph name="NUMBER_OF_FILES" /> 個檔案。</translation> -<translation id="2303282178633578561">鎖定 SIM 卡</translation> <translation id="2303301624314357662">開緊「<ph name="FILE_NAME" />」。</translation> <translation id="2304820083631266885">行星</translation> <translation id="2305020378527873881">「<ph name="VOLUME_NAME" />」退出咗。</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">您最近的檔案將會在這裡顯示</translation> <translation id="2578394532502990878">泰米爾文 (拼音)</translation> <translation id="2579959351793446050">歐利亞文</translation> -<translation id="2593644851255584939">管理員要求您停用 SIM 卡鎖定。</translation> <translation id="2602810353103180630">第 <ph name="NETWORK_INDEX" /> 個網絡,一共有 <ph name="NETWORK_COUNT" /> 個網絡,<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,訊號強度係 <ph name="SIGNAL_STRENGTH" />%,管理員封鎖咗呢個網絡,詳情</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> 影片</translation> -<translation id="2617342710774726426">SIM 卡已鎖定</translation> <translation id="2620090360073999360">目前無法使用 Google 雲端硬碟。</translation> <translation id="2621713457727696555">已受保護</translation> <translation id="2638942478653899953">無法連上「Google 雲端硬碟」。請<ph name="BEGIN_LINK" />登出<ph name="END_LINK" />並重新登入帳戶。</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">拉脫維亞文</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" />篩選器閂咗。</translation> <translation id="5494920125229734069">全部選取</translation> -<translation id="5500104704744051184">您需要先輸入 PUK,才能使用此網絡</translation> <translation id="5500122897333236901">冰島文</translation> <translation id="5508696409934741614">圓點</translation> <translation id="5522908512596376669">檔案清單改咗做清單檢視模式。</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">設定網絡時發生錯誤</translation> <translation id="7839804798877833423">擷取這些檔案大約會使用 <ph name="FILE_SIZE" /> 流動數據流量。</translation> <translation id="7846076177841592234">取消選取</translation> -<translation id="7847617962681804761">必須輸入 PIN 才能使用流動數據</translation> <translation id="7853966320808728790">法文 BÉPO</translation> <translation id="7857117644404132472">新增例外情況</translation> <translation id="7868774406711971383">波蘭文</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">正在同步處理 <ph name="NUMBER_OF_FILES" /> 個項目…</translation> <translation id="8600173386174225982">檔案清單改咗做縮圖檢視模式。</translation> <translation id="8601932370724196034">Crostini 圖像檔案</translation> -<translation id="8608515571837163082">您輸入錯誤 PIN 的次數過多。請輸入由流動網絡供應商提供的 8 位數個人解鎖金鑰 (PUK)。</translation> <translation id="8609695766746872526">冰島文</translation> <translation id="863903787380594467">PIN 不正確。您還可嘗試 <ph name="RETRIES" /> 次。</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - 連接埠</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb index d33d33cb..5b467059 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zh-TW.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">自動設定網址:</translation> <translation id="2288278176040912387">唱機</translation> <translation id="2291538123825441971">正在開啟 <ph name="NUMBER_OF_FILES" /> 個檔案。</translation> -<translation id="2303282178633578561">鎖定 SIM 卡</translation> <translation id="2303301624314357662">正在開啟「<ph name="FILE_NAME" />」。</translation> <translation id="2304820083631266885">行星</translation> <translation id="2305020378527873881">「<ph name="VOLUME_NAME" />」已退出。</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">最近存取的檔案會顯示在這裡</translation> <translation id="2578394532502990878">泰米爾文 (拼音)</translation> <translation id="2579959351793446050">歐利亞文</translation> -<translation id="2593644851255584939">管理員要求你停用 SIM 卡鎖定功能。</translation> <translation id="2602810353103180630">第 <ph name="NETWORK_INDEX" /> 個網路 (共 <ph name="NETWORK_COUNT" /> 個),<ph name="NETWORK_NAME" />,<ph name="CONNECTION_STATUS" />,訊號強度 <ph name="SIGNAL_STRENGTH" />%,遭到管理員封鎖,詳細資料</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> 影片</translation> -<translation id="2617342710774726426">SIM 卡已鎖定</translation> <translation id="2620090360073999360">目前無法使用 Google 雲端硬碟。</translation> <translation id="2621713457727696555">已受到安全保護</translation> <translation id="2638942478653899953">無法連上 Google 雲端硬碟。請<ph name="BEGIN_LINK" />登出<ph name="END_LINK" />並重新登入帳戶。</translation> @@ -529,7 +526,6 @@ <translation id="5489067830765222292">拉脫維亞文</translation> <translation id="5489965683297092283"><ph name="FILTER_NAME" /> 篩選器已關閉。</translation> <translation id="5494920125229734069">全選</translation> -<translation id="5500104704744051184">你必須先輸入 PUK,才能使用這個網路</translation> <translation id="5500122897333236901">冰島文</translation> <translation id="5508696409934741614">圓點</translation> <translation id="5522908512596376669">檔案清單已變更為清單檢視模式。</translation> @@ -810,7 +806,6 @@ <translation id="7831491651892296503">網路設定錯誤</translation> <translation id="7839804798877833423">擷取這些檔案大約會使用 <ph name="FILE_SIZE" /> 行動數據流量。</translation> <translation id="7846076177841592234">全部取消選取</translation> -<translation id="7847617962681804761">必須輸入 PIN 碼才能使用行動數據</translation> <translation id="7853966320808728790">法文 BÉPO</translation> <translation id="7857117644404132472">新增例外狀況</translation> <translation id="7868774406711971383">波蘭文</translation> @@ -905,7 +900,6 @@ <translation id="8579285237314169903">正在同步處理 <ph name="NUMBER_OF_FILES" /> 個項目...</translation> <translation id="8600173386174225982">檔案清單已變更為縮圖檢視模式。</translation> <translation id="8601932370724196034">Crostini 圖片檔</translation> -<translation id="8608515571837163082">輸入錯誤 PIN 碼的次數太多。輸入電信業者提供的 8 位數個人解鎖金鑰 (PUK)。</translation> <translation id="8609695766746872526">冰島文</translation> <translation id="863903787380594467">PIN 碼不正確,你還有 <ph name="RETRIES" /> 次重試機會。</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - 連接埠</translation>
diff --git a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb index 01cb85e9..ace9730 100644 --- a/ui/chromeos/translations/ui_chromeos_strings_zu.xtb +++ b/ui/chromeos/translations/ui_chromeos_strings_zu.xtb
@@ -148,7 +148,6 @@ <translation id="2282155092769082568">I-URL yokulungiselelwa ngokuzenzakalela:</translation> <translation id="2288278176040912387">Isidlali serekhodi</translation> <translation id="2291538123825441971">Ukuvula amafayela e-<ph name="NUMBER_OF_FILES" />.</translation> -<translation id="2303282178633578561">Khiya ikhadi le-SIM</translation> <translation id="2303301624314357662">Ivula ifayela <ph name="FILE_NAME" />.</translation> <translation id="2304820083631266885">Iplanethi</translation> <translation id="2305020378527873881"><ph name="VOLUME_NAME" /> ikhishiwe.</translation> @@ -187,10 +186,8 @@ <translation id="2570012981255377263">Amafayela akho akamuva azovela lapha</translation> <translation id="2578394532502990878">I-Tamil Phonetic</translation> <translation id="2579959351793446050">Isi-Odia</translation> -<translation id="2593644851255584939">Umlawuli wakho udinga ukuthi ukhubaze Ukukhiya Kwe-SIM.</translation> <translation id="2602810353103180630">Inethiwekhi engu-<ph name="NETWORK_INDEX" /> kwezingu-<ph name="NETWORK_COUNT" />, <ph name="NETWORK_NAME" />, <ph name="CONNECTION_STATUS" />, Amandla Wesinglai<ph name="SIGNAL_STRENGTH" />%, Kuvinjelwe Umphathi wakho, Imininingwane</translation> <translation id="2614589611416690597"><ph name="VIDEO_TYPE" /> ividiyo</translation> -<translation id="2617342710774726426">I-SIM card ikhiyiwe</translation> <translation id="2620090360073999360">I-Google Drayivu ayikwazi ukufinyelelwa ngalesi sikhathi.</translation> <translation id="2621713457727696555">Kuvikelwe</translation> <translation id="2638942478653899953">I-Google Drayivu ayikwazanga ukufinyelelwa. Sicela <ph name="BEGIN_LINK" />uphume ngemvume<ph name="END_LINK" /> uphinde ungene ngemvume.</translation> @@ -528,7 +525,6 @@ <translation id="5489067830765222292">Latvian</translation> <translation id="5489965683297092283">Isihlungi esithi <ph name="FILTER_NAME" /> sivaliwe.</translation> <translation id="5494920125229734069">Khetha konke</translation> -<translation id="5500104704744051184">Ngeke ukwazi ukusebenzisa le nethiwekhi uze ufake i-PUK</translation> <translation id="5500122897333236901">Icelandic</translation> <translation id="5508696409934741614">Amachashazi</translation> <translation id="5522908512596376669">Uhlu lwefayela lushintshele kuhlu lokubuka.</translation> @@ -809,7 +805,6 @@ <translation id="7831491651892296503">Iphutha lokulungiselela inethiwekhi</translation> <translation id="7839804798877833423">Ukulanda lama fayela cishe kuzosebenzisa idatha yeselula engu-<ph name="FILE_SIZE" />.</translation> <translation id="7846076177841592234">Khansela ukukhetha</translation> -<translation id="7847617962681804761">Iphinikhodi iyadingeka ukuze usebenzise idatha yeselula</translation> <translation id="7853966320808728790">I-French BÉPO</translation> <translation id="7857117644404132472">Engeza okuhlukile</translation> <translation id="7868774406711971383">Polish</translation> @@ -904,7 +899,6 @@ <translation id="8579285237314169903">Ivumelanisa izinto ezingu-<ph name="NUMBER_OF_FILES" />...</translation> <translation id="8600173386174225982">Uhlu lwefayela lushintshele ekubukeni kwesithonjana.</translation> <translation id="8601932370724196034">Ifayela lesithombe se-Crostini</translation> -<translation id="8608515571837163082">Iphinikhodi engalungile ifakwe izikhathi eziningi kakhulu. Faka ukhiye we-Personal Unblocking Key (PUK) onamadijithi ayi-8 onikezwe inkampani yenethiwekhi.</translation> <translation id="8609695766746872526">Icelandic</translation> <translation id="863903787380594467">Iphinikhodi engalungile. Unemizamo engu-<ph name="RETRIES" /> esele.</translation> <translation id="8639391553632924850"><ph name="INPUT_LABEL" /> - Imbobo</translation>
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc b/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc index f803e30..5292429 100644 --- a/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc +++ b/ui/ozone/platform/drm/gpu/drm_overlay_manager.cc
@@ -91,9 +91,54 @@ return; } + struct OverlayReindexZOrder { + size_t index; + int plane_z_order; + }; + + std::vector<OverlayReindexZOrder> overlay_reindex; + for (size_t i = 0; i < candidates->size(); i++) { + overlay_reindex.emplace_back( + (OverlayReindexZOrder{i, (*candidates)[i].plane_z_order})); + } + // Create a mapping for sorted z order to candidate index. + std::sort(overlay_reindex.begin(), overlay_reindex.end(), + [](const auto& a, const auto& b) { + return a.plane_z_order > b.plane_z_order; + }); + + // Active |display_rect| occluders that have a clip. This list is in z plane + // order. + std::vector<gfx::RectF> display_rect_with_clip; + // List of underlays that have failed by being occluded by an underlay with a + // clip rect. This list is in |candidate| ordering. + std::vector<bool> underlay_fail_clip; + underlay_fail_clip.resize(candidates->size()); + for (auto& reindex : overlay_reindex) { + const auto& candidate = (*candidates)[reindex.index]; + + if (candidate.plane_z_order < 0) { + for (auto& rect : display_rect_with_clip) { + if (rect.Intersects(candidate.display_rect)) { + underlay_fail_clip[reindex.index] = true; + break; + } + } + } + + if (candidate.plane_z_order < 0 && candidate.clip_rect && + !gfx::RectF(*candidate.clip_rect).Contains(candidate.display_rect)) { + // This underlay has a clip that is incompatible with all future + // intersecting underlays. + display_rect_with_clip.emplace_back(candidate.display_rect); + } + } + std::vector<OverlaySurfaceCandidate> result_candidates; - for (auto& candidate : *candidates) { - bool can_handle = CanHandleCandidate(candidate, widget); + for (size_t i = 0; i < candidates->size(); i++) { + auto& candidate = (*candidates)[i]; + bool can_handle = + !underlay_fail_clip[i] && CanHandleCandidate(candidate, widget); // CanHandleCandidate() should never return false if the candidate is // the primary plane. @@ -202,8 +247,9 @@ return false; } - if (candidate.clip_rect && !candidate.clip_rect->Contains( - gfx::ToNearestRect(candidate.display_rect))) { + if (candidate.plane_z_order >= 0 && candidate.clip_rect && + !candidate.clip_rect->Contains( + gfx::ToNearestRect(candidate.display_rect))) { VLOG(3) << "Overlay Rejected: clip_rect=" << candidate.clip_rect->ToString() << ", display_rect=" << candidate.display_rect.ToString(); return false;
diff --git a/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc b/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc index 47784e5..f158d8f 100644 --- a/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc +++ b/ui/ozone/platform/drm/gpu/drm_overlay_manager_unittest.cc
@@ -364,4 +364,67 @@ EXPECT_EQ(secondary_calls, 4); } +TEST(DrmOverlayManagerTest, SingleClipRectUnderlaySupport) { + TestDrmOverlayManager manager; + + // Candidates for output surface and underlay quad. + std::vector<OverlaySurfaceCandidate> candidates = { + CreateCandidate(gfx::Rect(0, 0, 100, 100), 0), + CreateCandidate(gfx::Rect(10, 10, 20, 20), -1)}; + + // Set a clip rect that imposes a restriction on |display_rect|. + candidates[1].clip_rect = gfx::Rect(10, 10, 15, 15); + + for (int i = 0; i < 4; i++) + manager.CheckOverlaySupport(&candidates, kPrimaryWidget); + + EXPECT_EQ(manager.requests().size(), 1u); + EXPECT_TRUE(manager.requests()[0][1].overlay_handled); + + manager.requests().clear(); + // Now make the overlay candidate a single-on-top overlay. Single-on-top + // overlays with restrictive clip rects are not supported. + candidates[1].plane_z_order = 1; + for (int i = 0; i < 4; i++) + manager.CheckOverlaySupport(&candidates, kPrimaryWidget); + + EXPECT_EQ(manager.requests().size(), 1u); + EXPECT_FALSE(manager.requests()[0][1].overlay_handled); +} + +TEST(DrmOverlayManagerTest, MultiClipRectUnderlaySupport) { + TestDrmOverlayManager manager; + + // Two underlay quads who's |display_rect| overlap. The order here is + // important; even though the -2 underlay comes first in the list it will be + // occluded by the -1 underlay and when -1 clipped the -2 underlay should + // fail. + std::vector<OverlaySurfaceCandidate> candidates = { + CreateCandidate(gfx::Rect(0, 0, 100, 100), 0), + CreateCandidate(gfx::Rect(10, 10, 20, 20), -2), + CreateCandidate(gfx::Rect(20, 20, 20, 20), -1)}; + + // Set a clip rect that imposes a restriction on |display_rect|. + candidates[1].clip_rect = gfx::Rect(10, 10, 15, 15); + candidates[2].clip_rect = gfx::Rect(20, 20, 15, 15); + + for (int i = 0; i < 4; i++) + manager.CheckOverlaySupport(&candidates, kPrimaryWidget); + + EXPECT_EQ(manager.requests().size(), 1u); + EXPECT_FALSE(manager.requests()[0][1].overlay_handled); + EXPECT_TRUE(manager.requests()[0][2].overlay_handled); + + manager.requests().clear(); + // Now remove the clipping constraint on the -1 underlay which should allow + // the -2 underlay to be handled. + candidates[2].clip_rect = gfx::Rect(20, 20, 50, 50); + for (int i = 0; i < 4; i++) + manager.CheckOverlaySupport(&candidates, kPrimaryWidget); + + EXPECT_EQ(manager.requests().size(), 1u); + EXPECT_TRUE(manager.requests()[0][1].overlay_handled); + EXPECT_TRUE(manager.requests()[0][2].overlay_handled); +} + } // namespace ui
diff --git a/ui/ozone/platform/wayland/common/wayland_overlay_config.cc b/ui/ozone/platform/wayland/common/wayland_overlay_config.cc index b9a35ca..c6c649a0 100644 --- a/ui/ozone/platform/wayland/common/wayland_overlay_config.cc +++ b/ui/ozone/platform/wayland/common/wayland_overlay_config.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "ui/ozone/platform/wayland/common/wayland_overlay_config.h" +#include "ui/gfx/color_space.h" namespace wl { @@ -16,6 +17,7 @@ BufferId buffer_id, float scale_factor) : z_order(data.z_order), + color_space(data.color_space), transform(data.plane_transform), buffer_id(buffer_id), surface_scale_factor(scale_factor),
diff --git a/ui/ozone/platform/wayland/common/wayland_overlay_config.h b/ui/ozone/platform/wayland/common/wayland_overlay_config.h index 0273ac2b..c6704f5 100644 --- a/ui/ozone/platform/wayland/common/wayland_overlay_config.h +++ b/ui/ozone/platform/wayland/common/wayland_overlay_config.h
@@ -7,6 +7,7 @@ #include <memory> +#include "ui/gfx/color_space.h" #include "ui/gfx/gpu_fence.h" #include "ui/gfx/gpu_fence_handle.h" #include "ui/gfx/overlay_plane_data.h" @@ -32,6 +33,9 @@ // plane. int z_order = 0; + // Specifies the color space data of the wayland config. + gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); + // Specifies how the buffer is to be transformed during composition. gfx::OverlayTransform transform = gfx::OverlayTransform::OVERLAY_TRANSFORM_NONE;
diff --git a/ui/ozone/platform/wayland/host/wayland_window.cc b/ui/ozone/platform/wayland/host/wayland_window.cc index 8a02abe..6b29dd7 100644 --- a/ui/ozone/platform/wayland/host/wayland_window.cc +++ b/ui/ozone/platform/wayland/host/wayland_window.cc
@@ -25,6 +25,7 @@ #include "ui/events/event_utils.h" #include "ui/events/ozone/events_ozone.h" #include "ui/events/platform/platform_event_source.h" +#include "ui/gfx/color_space.h" #include "ui/gfx/geometry/point_f.h" #include "ui/gfx/geometry/size.h" #include "ui/gfx/native_widget_types.h" @@ -869,7 +870,7 @@ gfx::RectF(visual_size), gfx::RectF(), root_surface()->use_blending(), gfx::Rect(), root_surface()->opacity(), gfx::OverlayPriorityHint::kNone, - rounded_clip_bounds, gfx::ColorSpace(), absl::nullopt), + rounded_clip_bounds, gfx::ColorSpace::CreateSRGB(), absl::nullopt), nullptr, root_surface()->buffer_id(), buffer_scale); }
diff --git a/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h b/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h index 3134b37..adad069 100644 --- a/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h +++ b/ui/ozone/platform/wayland/host/xdg_popup_wrapper_impl.h
@@ -28,7 +28,7 @@ ~XDGPopupWrapperImpl() override; - // XDGPopupWrapper: + // ShellPopupWrapper overrides: bool Initialize(const ShellPopupParams& params) override; void AckConfigure(uint32_t serial) override; bool IsConfigured() override;
diff --git a/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom b/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom index 1cf87696..8edc807 100644 --- a/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom +++ b/ui/ozone/platform/wayland/mojom/wayland_overlay_config.mojom
@@ -5,6 +5,7 @@ module wl.mojom; import "ui/gfx/geometry/mojom/geometry.mojom"; +import "ui/gfx/mojom/color_space.mojom"; import "ui/gfx/mojom/gpu_fence_handle.mojom"; import "ui/gfx/mojom/overlay_transform.mojom"; import "ui/gfx/mojom/overlay_priority_hint.mojom"; @@ -18,6 +19,9 @@ // plane. int32 z_order; + // Specifies the color space data of the wayland config. + gfx.mojom.ColorSpace color_space; + // Specifies how the buffer is to be transformed during composition. gfx.mojom.OverlayTransform transform;
diff --git a/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc b/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc index 2a8f04e..63694c27 100644 --- a/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc +++ b/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.cc
@@ -24,6 +24,9 @@ wl::WaylandOverlayConfig* out) { out->z_order = data.z_order(); + if (!data.ReadColorSpace(&out->color_space)) + return false; + if (!data.ReadTransform(&out->transform)) return false;
diff --git a/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h b/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h index 1f8dace19..a0aaf07 100644 --- a/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h +++ b/ui/ozone/platform/wayland/mojom/wayland_overlay_config_mojom_traits.h
@@ -6,6 +6,7 @@ #define UI_OZONE_PLATFORM_WAYLAND_MOJOM_WAYLAND_OVERLAY_CONFIG_MOJOM_TRAITS_H_ #include "skia/public/mojom/skcolor4f_mojom_traits.h" +#include "ui/gfx/mojom/color_space_mojom_traits.h" #include "ui/gfx/mojom/gpu_fence_handle_mojom_traits.h" #include "ui/gfx/mojom/overlay_priority_hint_mojom_traits.h" #include "ui/gfx/mojom/overlay_transform_mojom_traits.h" @@ -22,6 +23,11 @@ return input.z_order; } + static const gfx::ColorSpace color_space( + const wl::WaylandOverlayConfig& input) { + return input.color_space; + } + static const gfx::OverlayTransform& transform( const wl::WaylandOverlayConfig& input) { return input.transform;
diff --git a/ui/ozone/public/overlay_surface_candidate.cc b/ui/ozone/public/overlay_surface_candidate.cc index 3b1e59e..712eb61 100644 --- a/ui/ozone/public/overlay_surface_candidate.cc +++ b/ui/ozone/public/overlay_surface_candidate.cc
@@ -28,10 +28,11 @@ gfx::Rect rrect = gfx::ToNearestRect(param.display_rect); return std::tie(plane_z_order, format, lrect, lwidth, lheight, transform, - crop_rect, is_opaque, opacity, native_pixmap_unique_id) < + crop_rect, is_opaque, opacity, native_pixmap_unique_id, + color_space) < std::tie(param.plane_z_order, param.format, rrect, rwidth, rheight, param.transform, param.crop_rect, param.is_opaque, - param.opacity, param.native_pixmap_unique_id); + param.opacity, param.native_pixmap_unique_id, color_space); } } // namespace ui
diff --git a/ui/ozone/public/overlay_surface_candidate.h b/ui/ozone/public/overlay_surface_candidate.h index 6a722f26..2fc79c7 100644 --- a/ui/ozone/public/overlay_surface_candidate.h +++ b/ui/ozone/public/overlay_surface_candidate.h
@@ -11,6 +11,7 @@ #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/skia/include/core/SkColor.h" #include "ui/gfx/buffer_types.h" +#include "ui/gfx/color_space.h" #include "ui/gfx/geometry/rect.h" #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/rrect_f.h" @@ -43,6 +44,8 @@ gfx::OverlayTransform transform = gfx::OVERLAY_TRANSFORM_NONE; // Format of the buffer to composite. gfx::BufferFormat format = gfx::BufferFormat::BGRA_8888; + // Color space of the buffer + gfx::ColorSpace color_space = gfx::ColorSpace::CreateSRGB(); // Stacking order of the overlay plane relative to the main surface, // which is 0. Signed to allow for "underlays". int plane_z_order = 0;
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.h b/ui/views/cocoa/native_widget_mac_ns_window_host.h index fc847f1..5a0910009 100644 --- a/ui/views/cocoa/native_widget_mac_ns_window_host.h +++ b/ui/views/cocoa/native_widget_mac_ns_window_host.h
@@ -69,6 +69,10 @@ gfx::NativeWindow window); static NativeWidgetMacNSWindowHost* GetFromNativeView(gfx::NativeView view); + // Key used to bind the content NSView to the overlay widget in immersive + // mode. + static const char kImmersiveContentNSView[]; + // Unique integer id handles are used to bridge between the // NativeWidgetMacNSWindowHost in one process and the NativeWidgetNSWindowHost // potentially in another. @@ -189,9 +193,7 @@ // Geometry of the content area of the window, in DIPs. Note that this is not // necessarily the same as the views::View's size. - const gfx::Rect& GetContentBoundsInScreen() const { - return content_bounds_in_screen_; - } + gfx::Rect GetContentBoundsInScreen() const; // The display that the window is currently on (or best guess thereof). const display::Display& GetCurrentDisplay() const { return display_; }
diff --git a/ui/views/cocoa/native_widget_mac_ns_window_host.mm b/ui/views/cocoa/native_widget_mac_ns_window_host.mm index a3b06fbf..aebada61 100644 --- a/ui/views/cocoa/native_widget_mac_ns_window_host.mm +++ b/ui/views/cocoa/native_widget_mac_ns_window_host.mm
@@ -43,6 +43,7 @@ #include "ui/views/views_delegate.h" #include "ui/views/widget/native_widget_mac.h" #include "ui/views/widget/widget_delegate.h" +#include "ui/views/widget/widget_utils_mac.h" #include "ui/views/window/dialog_delegate.h" #include "ui/views/word_lookup_client.h" @@ -239,7 +240,7 @@ // If the window is a system created NSToolbarFullScreenWindow we need to do // some additional work to find the original window. - if ([window isKindOfClass:NSClassFromString(@"NSToolbarFullScreenWindow")]) { + if (views::IsNSToolbarFullScreenWindow(window)) { NSWindow* original = OriginalHostingWindowFromFullScreenWindow(window); if (NativeWidgetMacNSWindow* widget_window = base::mac::ObjCCast<NativeWidgetMacNSWindow>(original)) { @@ -257,6 +258,10 @@ } // static +const char NativeWidgetMacNSWindowHost::kImmersiveContentNSView[] = + "kImmersiveContentNSView"; + +// static NativeWidgetMacNSWindowHost* NativeWidgetMacNSWindowHost::GetFromId( uint64_t bridged_native_widget_id) { auto found = GetIdToWidgetHostImplMap().find(bridged_native_widget_id); @@ -635,6 +640,20 @@ return true; } +gfx::Rect NativeWidgetMacNSWindowHost::GetContentBoundsInScreen() const { + NSView* contentView = + (NSView*)GetNativeWindowProperty(kImmersiveContentNSView); + if (!contentView) + return content_bounds_in_screen_; + + // In immersive fullscreen, the content view is hosted in another NSWindow. + NSRect boundsInWindow = [contentView convertRect:contentView.bounds + toView:nil]; + NSRect boundsInScreen = + [contentView.window convertRectToScreen:boundsInWindow]; + return gfx::ScreenRectFromNSRect(boundsInScreen); +} + gfx::Rect NativeWidgetMacNSWindowHost::GetRestoredBounds() const { if (target_fullscreen_state_ || in_fullscreen_transition_) return window_bounds_before_fullscreen_;
diff --git a/ui/views/controls/animated_image_view_unittest.cc b/ui/views/controls/animated_image_view_unittest.cc index 6659862..fa41cc67 100644 --- a/ui/views/controls/animated_image_view_unittest.cc +++ b/ui/views/controls/animated_image_view_unittest.cc
@@ -58,10 +58,8 @@ params.ownership = Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; widget_.Init(std::move(params)); - auto view = std::make_unique<AnimatedImageView>(); - view->SetUseDefaultFillLayout(true); - view_ = view.get(); - widget_.SetContentsView(std::move(view)); + view_ = widget_.SetContentsView(std::make_unique<AnimatedImageView>()); + view_->SetUseDefaultFillLayout(true); widget_.Show(); } @@ -97,7 +95,7 @@ view_->SetAnimatedImage(CreateAnimationWithSize(gfx::Size(80, 80))); view_->SetVerticalAlignment(ImageViewBase::Alignment::kCenter); view_->SetHorizontalAlignment(ImageViewBase::Alignment::kCenter); - widget_.GetContentsView()->Layout(); + RunScheduledLayout(view_); view_->Play(); static constexpr float kExpectedDefaultOrigin =
diff --git a/ui/views/controls/button/label_button_unittest.cc b/ui/views/controls/button/label_button_unittest.cc index 0524fca..97dedf98 100644 --- a/ui/views/controls/button/label_button_unittest.cc +++ b/ui/views/controls/button/label_button_unittest.cc
@@ -90,8 +90,12 @@ // Windows is platform-dependent. test_widget_->Show(); - button_ = test_widget_->GetContentsView()->AddChildView( - std::make_unique<TestLabelButton>()); + // Place the button into a separate container view which itself does no + // layouts. This will isolate the button from the client view which does + // a fill layout by default. + auto* container = + test_widget_->client_view()->AddChildView(std::make_unique<View>()); + button_ = container->AddChildView(std::make_unique<TestLabelButton>()); // Establish the expected text colors for testing changes due to state. themed_normal_text_color_ = @@ -425,12 +429,12 @@ button_->SetImage(Button::STATE_NORMAL, image); button_->SetBoundsRect(gfx::Rect(button_->GetPreferredSize())); - button_->Layout(); + RunScheduledLayout(button_); int y_origin_centered = button_->image()->origin().y(); button_->SetBoundsRect(gfx::Rect(button_->GetPreferredSize())); button_->SetImageCentered(false); - button_->Layout(); + RunScheduledLayout(button_); int y_origin_not_centered = button_->image()->origin().y(); EXPECT_LT(y_origin_not_centered, y_origin_centered); @@ -463,17 +467,17 @@ gfx::Size button_size = button_->GetPreferredSize(); button_size.Enlarge(50, 0); button_->SetSize(button_size); - button_->Layout(); + RunScheduledLayout(button_); EXPECT_LT(button_->image()->bounds().right(), button_->label()->bounds().x()); int left_align_label_midpoint = button_->label()->bounds().CenterPoint().x(); button_->SetHorizontalAlignment(gfx::ALIGN_CENTER); - button_->Layout(); + RunScheduledLayout(button_); EXPECT_LT(button_->image()->bounds().right(), button_->label()->bounds().x()); int center_align_label_midpoint = button_->label()->bounds().CenterPoint().x(); EXPECT_LT(left_align_label_midpoint, center_align_label_midpoint); button_->SetHorizontalAlignment(gfx::ALIGN_RIGHT); - button_->Layout(); + RunScheduledLayout(button_); EXPECT_LT(button_->label()->bounds().right(), button_->image()->bounds().x()); button_->SetText(std::u16string()); @@ -521,7 +525,7 @@ gfx::Size preferred_size = button_->GetPreferredSize(); preferred_size.set_height(button_->GetHeightForWidth(preferred_size.width())); button_->SetSize(preferred_size); - button_->Layout(); + RunScheduledLayout(button_); EXPECT_EQ(preferred_size.width(), image.width() + image_spacing + text_wrap_width); @@ -631,7 +635,7 @@ // is increased. button_->SetText(longer_text); EXPECT_TRUE(ViewTestApi(button_).needs_layout()); - button_->Layout(); + RunScheduledLayout(button_); EXPECT_GT(button_->label()->bounds().width(), original_label_width * 2); EXPECT_GT(button_->GetPreferredSize().width(), original_width * 2); @@ -639,7 +643,7 @@ // text is restored. button_->SetText(text); EXPECT_TRUE(ViewTestApi(button_).needs_layout()); - button_->Layout(); + RunScheduledLayout(button_); EXPECT_EQ(original_label_width, button_->label()->bounds().width()); EXPECT_EQ(original_width, button_->GetPreferredSize().width()); } @@ -723,7 +727,7 @@ // The border size + the content height is more than button's preferred size. button_->SetBorder(CreateEmptyBorder( gfx::Insets::TLBR(image_size / 2, 0, image_size / 2, 0))); - button_->Layout(); + RunScheduledLayout(button_); // Ensure that content (image and label) doesn't get clipped by the border. EXPECT_GE(button_->image()->height(), image_size);
diff --git a/ui/views/controls/combobox/combobox_unittest.cc b/ui/views/controls/combobox/combobox_unittest.cc index 00dc0cd..43be08d 100644 --- a/ui/views/controls/combobox/combobox_unittest.cc +++ b/ui/views/controls/combobox/combobox_unittest.cc
@@ -542,7 +542,7 @@ TestComboboxListener listener(combobox_); combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); - combobox_->Layout(); + RunScheduledLayout(combobox_); // Click the left side. The menu is shown. EXPECT_EQ(0, menu_show_count_); @@ -559,7 +559,7 @@ combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); - combobox_->Layout(); + RunScheduledLayout(combobox_); combobox_->SetEnabled(false); // Click the left side, but nothing happens since the combobox is disabled. @@ -637,7 +637,7 @@ combobox_->SetCallback(base::BindRepeating( &TestComboboxListener::OnPerformAction, base::Unretained(&listener))); - combobox_->Layout(); + RunScheduledLayout(combobox_); // Click the right side (arrow button). The menu is shown. const gfx::Point right_point(combobox_->x() + combobox_->width() - 1,
diff --git a/ui/views/controls/image_view_unittest.cc b/ui/views/controls/image_view_unittest.cc index 5efb0842..60ea497 100644 --- a/ui/views/controls/image_view_unittest.cc +++ b/ui/views/controls/image_view_unittest.cc
@@ -102,7 +102,7 @@ bitmap.allocN32Pixels(kImageSkiaSize, kImageSkiaSize); gfx::ImageSkia image_skia = gfx::ImageSkia::CreateFrom1xBitmap(bitmap); image_view()->SetImage(image_skia); - widget()->GetContentsView()->Layout(); + RunScheduledLayout(image_view()); EXPECT_NE(gfx::Size(), image_skia.size()); // With no changes to the size / padding of |image_view|, the origin of @@ -112,11 +112,11 @@ // Test insets are always respected in LTR and RTL. constexpr int kInset = 5; image_view()->SetBorder(CreateEmptyBorder(kInset)); - widget()->GetContentsView()->Layout(); + RunScheduledLayout(image_view()); EXPECT_EQ(kInset, CurrentImageOriginForParam()); SetRTL(true); - widget()->GetContentsView()->Layout(); + RunScheduledLayout(image_view()); EXPECT_EQ(kInset, CurrentImageOriginForParam()); // Check this still holds true when the insets are asymmetrical. @@ -124,11 +124,11 @@ constexpr int kTrailingInset = 6; image_view()->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR( kLeadingInset, kLeadingInset, kTrailingInset, kTrailingInset))); - widget()->GetContentsView()->Layout(); + RunScheduledLayout(image_view()); EXPECT_EQ(kLeadingInset, CurrentImageOriginForParam()); SetRTL(false); - widget()->GetContentsView()->Layout(); + RunScheduledLayout(image_view()); EXPECT_EQ(kLeadingInset, CurrentImageOriginForParam()); }
diff --git a/ui/views/controls/scroll_view_unittest.cc b/ui/views/controls/scroll_view_unittest.cc index 35fc12b..dd0d3386 100644 --- a/ui/views/controls/scroll_view_unittest.cc +++ b/ui/views/controls/scroll_view_unittest.cc
@@ -345,7 +345,7 @@ ScrollView* scroll_view = widget_->SetContentsView(std::make_unique<ScrollView>()); scroll_view->SetContents(std::move(contents)); - scroll_view->Layout(); + RunScheduledLayout(scroll_view); widget_->GetCompositor()->AddObserver(this); @@ -488,7 +488,7 @@ // Verifies the viewport is sized to fit the available space. TEST_F(ScrollViewTest, ViewportSizedToFit) { View* contents = InstallContents(); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); } @@ -498,7 +498,7 @@ View* contents = InstallContents(); scroll_view_->ClipHeightTo(100, 200); scroll_view_->SetBorder(CreateSolidBorder(2, 0)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ("2,2 96x96", contents->parent()->bounds().ToString()); // Make sure the width of |contents| is set properly not to overflow the @@ -512,7 +512,7 @@ const gfx::Rect default_outer_bounds(0, 0, 100, 100); scroll_view_->SetContents(std::make_unique<VerticalResizingView>()); scroll_view_->SetBoundsRect(default_outer_bounds); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible()); EXPECT_TRUE(scroll_view_->horizontal_scroll_bar()->GetVisible()); } @@ -524,7 +524,7 @@ ScrollView::ScrollBarMode::kHiddenButEnabled); scroll_view_->SetContents(std::make_unique<VerticalResizingView>()); scroll_view_->SetBoundsRect(default_outer_bounds); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible()); EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible()); } @@ -536,7 +536,7 @@ ScrollView::ScrollBarMode::kHiddenButEnabled); scroll_view_->SetContents(std::make_unique<HorizontalResizingView>()); scroll_view_->SetBoundsRect(default_outer_bounds); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible()); EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible()); } @@ -548,7 +548,7 @@ ScrollView::ScrollBarMode::kDisabled); scroll_view_->SetContents(std::make_unique<VerticalResizingView>()); scroll_view_->SetBoundsRect(default_outer_bounds); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible()); EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible()); } @@ -559,7 +559,7 @@ scroll_view_->SetVerticalScrollBarMode(ScrollView::ScrollBarMode::kDisabled); scroll_view_->SetContents(std::make_unique<HorizontalResizingView>()); scroll_view_->SetBoundsRect(default_outer_bounds); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(scroll_view_->vertical_scroll_bar()->GetVisible()); EXPECT_FALSE(scroll_view_->horizontal_scroll_bar()->GetVisible()); } @@ -571,7 +571,7 @@ // Size the contents such that vertical scrollbar is needed. contents->SetBounds(0, 0, 50, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(), contents->parent()->width()); EXPECT_EQ(100, contents->parent()->height()); @@ -584,7 +584,7 @@ // Size the contents such that horizontal scrollbar is needed. contents->SetBounds(0, 0, 400, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100, contents->parent()->width()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight(), contents->parent()->height()); @@ -593,7 +593,7 @@ // Both horizontal and vertical. contents->SetBounds(0, 0, 300, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(), contents->parent()->width()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight(), @@ -609,7 +609,7 @@ scroll_view_->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR( kTopPadding, kLeftPadding, kBottomPadding, kRightPadding))); contents->SetBounds(0, 0, 50, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth() - kLeftPadding - kRightPadding, contents->parent()->width()); @@ -626,7 +626,7 @@ // Horizontal with border. contents->SetBounds(0, 0, 400, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100 - kLeftPadding - kRightPadding, contents->parent()->width()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutHeight() - kTopPadding - kBottomPadding, @@ -643,7 +643,7 @@ // Both horizontal and vertical with border. contents->SetBounds(0, 0, 300, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth() - kLeftPadding - kRightPadding, contents->parent()->width()); @@ -724,7 +724,7 @@ // Size the contents such that vertical scrollbar is needed. contents->SetBounds(0, 0, 50, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(0, contents->parent()->x()); EXPECT_EQ(20, contents->parent()->y()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(), @@ -750,7 +750,7 @@ // Size the contents such that horizontal scrollbar is needed. contents->SetBounds(0, 0, 400, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(0, contents->parent()->x()); EXPECT_EQ(20, contents->parent()->y()); EXPECT_EQ(100, contents->parent()->width()); @@ -767,7 +767,7 @@ // Both horizontal and vertical. contents->SetBounds(0, 0, 300, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(0, contents->parent()->x()); EXPECT_EQ(20, contents->parent()->y()); EXPECT_EQ(100 - scroll_view_->GetScrollBarLayoutWidth(), @@ -821,7 +821,7 @@ // Scroll the horizontal scrollbar, after which, the scroll bar thumb position // should be updated (i.e. it should be non-zero). contents->SetBounds(0, 0, 400, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); auto* scroll_bar = test_api.GetScrollBar(HORIZONTAL); ASSERT_TRUE(scroll_bar); EXPECT_TRUE(scroll_bar->GetVisible()); @@ -831,7 +831,7 @@ // Scroll the vertical scrollbar. contents->SetBounds(0, 0, 50, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); scroll_bar = test_api.GetScrollBar(VERTICAL); ASSERT_TRUE(scroll_bar); EXPECT_TRUE(scroll_bar->GetVisible()); @@ -849,7 +849,7 @@ View* contents = InstallContents(); contents->SetBounds(0, 0, 400, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); auto* scroll_bar = test_api.GetScrollBar(HORIZONTAL); ASSERT_TRUE(scroll_bar); EXPECT_FALSE(scroll_bar->GetVisible()); @@ -869,7 +869,7 @@ View* contents = InstallContents(); contents->SetBounds(0, 0, 50, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); auto* scroll_bar = test_api.GetScrollBar(VERTICAL); ASSERT_TRUE(scroll_bar); EXPECT_FALSE(scroll_bar->GetVisible()); @@ -888,7 +888,7 @@ auto* contents_ptr = scroll_view_->SetContents(std::move(contents)); scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::Vector2d(0, 0), test_api.IntegralViewOffset()); // Scroll to y=405 height=10, this should make the y position of the content @@ -918,7 +918,7 @@ auto* contents_ptr = scroll_view_->SetContents(std::move(contents)); scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::Vector2d(0, 0), test_api.IntegralViewOffset()); // Scroll to x=305 width=10, this should make the x position of the content @@ -948,7 +948,7 @@ auto* contents_ptr = scroll_view_->SetContents(std::move(contents)); scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::Vector2d(0, 0), test_api.IntegralViewOffset()); // Scroll to y=305 height=10, this should make the y position of the content @@ -979,7 +979,7 @@ auto* child_ptr = contents_ptr->AddChildView(std::move(child)); scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 100)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::Vector2d(), test_api.IntegralViewOffset()); // Set focus to the child control. This should cause the control to scroll to @@ -1014,11 +1014,11 @@ inner_scroll_view_ptr->SetContents(std::move(inner_contents)); inner_scroll_view_ptr->SetBoundsRect(gfx::Rect(0, 510, 100, 100)); - inner_scroll_view_ptr->Layout(); + RunScheduledLayout(inner_scroll_view_ptr); EXPECT_EQ(gfx::Vector2d(), inner_test_api.IntegralViewOffset()); scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 200, 200)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::Vector2d(), outer_test_api.IntegralViewOffset()); // Scroll the inner scroll view to y=405 height=10. This should make the y @@ -1058,7 +1058,7 @@ scroll_view_->GetPreferredSize()); scroll_view_->SizeToPreferredSize(); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::Size(kWidth, kNormalContentHeight), scroll_view_->contents()->size()); @@ -1078,7 +1078,7 @@ EXPECT_EQ(gfx::Size(kWidth, kMinHeight), scroll_view_->GetPreferredSize()); scroll_view_->SizeToPreferredSize(); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); // Layered scrolling requires the contents to fill the viewport. if (contents->layer()) { @@ -1102,7 +1102,7 @@ EXPECT_EQ(gfx::Size(kWidth, kMaxHeight), scroll_view_->GetPreferredSize()); scroll_view_->SizeToPreferredSize(); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); // The width may be less than kWidth if the scroll bar takes up some width. EXPECT_GE(kWidth, scroll_view_->contents()->width()); @@ -1125,7 +1125,7 @@ gfx::Size new_size(kWidth, scroll_view_->GetHeightForWidth(kWidth)); scroll_view_->SetSize(new_size); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); int expected_width = kWidth - scroll_view_->GetScrollBarLayoutWidth(); EXPECT_EQ(scroll_view_->contents()->size().width(), expected_width); @@ -1157,7 +1157,7 @@ View* corner_view = ScrollViewTestApi(scroll_view_.get()).corner_view(); contents->SetBounds(0, 0, 200, 200); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); // Corner view should not exist if using overlay scrollbars. if (scroll_view_->vertical_scroll_bar()->OverlapsContent()) { @@ -1177,22 +1177,22 @@ // Corner view should be removed when only the vertical scrollbar is visible. contents->SetBounds(0, 0, 50, 200); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(corner_view->parent()); // ... or when only the horizontal scrollbar is visible. contents->SetBounds(0, 0, 200, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(corner_view->parent()); // ... or when no scrollbar is visible. contents->SetBounds(0, 0, 50, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_FALSE(corner_view->parent()); // Corner view should reappear when both scrollbars reappear. contents->SetBounds(0, 0, 200, 200); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(scroll_view_.get(), corner_view->parent()); EXPECT_TRUE(corner_view->GetVisible()); } @@ -1394,7 +1394,7 @@ // Size the contents such that vertical scrollbar is needed. // Since it is overlaid, the ViewPort size should match the ScrollView. contents->SetBounds(0, 0, 50, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100, contents->parent()->width()); EXPECT_EQ(100, contents->parent()->height()); EXPECT_EQ(0, scroll_view_->GetScrollBarLayoutWidth()); @@ -1403,7 +1403,7 @@ // Size the contents such that horizontal scrollbar is needed. contents->SetBounds(0, 0, 400, 50); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100, contents->parent()->width()); EXPECT_EQ(100, contents->parent()->height()); EXPECT_EQ(0, scroll_view_->GetScrollBarLayoutHeight()); @@ -1412,7 +1412,7 @@ // Both horizontal and vertical scrollbars. contents->SetBounds(0, 0, 300, 400); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100, contents->parent()->width()); EXPECT_EQ(100, contents->parent()->height()); EXPECT_EQ(0, scroll_view_->GetScrollBarLayoutWidth()); @@ -1430,7 +1430,7 @@ // to be smaller, and ScrollbarWidth and ScrollbarHeight are non-zero. SetOverlayScrollersEnabled(false); EXPECT_TRUE(ViewTestApi(scroll_view_.get()).needs_layout()); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(100 - VerticalScrollBarWidth(), contents->parent()->width()); EXPECT_EQ(100 - HorizontalScrollBarHeight(), contents->parent()->height()); EXPECT_NE(0, VerticalScrollBarWidth()); @@ -1559,7 +1559,7 @@ View* contents = InstallContents(); contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(gfx::PointF(), test_api.CurrentOffset()); @@ -1570,14 +1570,14 @@ // Making the viewport 55 pixels taller should scroll up the same amount. scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 100, 155)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y()); EXPECT_EQ(fully_scrolled.x(), test_api.CurrentOffset().x()); // And 77 pixels wider should scroll left. Also make it short again: the y- // offset from the last change should remain. scroll_view_->SetBoundsRect(gfx::Rect(0, 0, 177, 100)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(fully_scrolled.y() - 55, test_api.CurrentOffset().y()); EXPECT_EQ(fully_scrolled.x() - 77, test_api.CurrentOffset().x()); } @@ -1599,19 +1599,19 @@ scroll_view_->ScrollToPosition(test_api.GetScrollBar(VERTICAL), 25); EXPECT_EQ(25, test_api.CurrentOffset().y()); // Call Layout; no change to scroll position. - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(25, test_api.CurrentOffset().y()); // Change contents of |contents|, call Layout; still no change to scroll // position. contents->SetPreferredSize(gfx::Size(300, 500)); contents->InvalidateLayout(); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(25, test_api.CurrentOffset().y()); // Change |contents| to be shorter than the ScrollView's clipped height. // This /will/ change the scroll location due to ConstrainScrollToBounds. contents->SetPreferredSize(gfx::Size(300, 50)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ(0, test_api.CurrentOffset().y()); } @@ -2060,7 +2060,7 @@ View* contents = InstallContents(); contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); gfx::Size expected_size = scroll_view_->size(); expected_size.Enlarge(-kThickness, 0); @@ -2086,7 +2086,7 @@ View* contents = InstallContents(); contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); gfx::Size expected_size = scroll_view_->size(); expected_size.Enlarge(-kThickness, 0); @@ -2111,7 +2111,7 @@ View* contents = InstallContents(); contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); gfx::Size expected_size = scroll_view_->size(); expected_size.Enlarge(0, -kThickness); @@ -2137,7 +2137,7 @@ View* contents = InstallContents(); contents->SetBoundsRect(gfx::Rect(0, 0, 300, 300)); - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); gfx::Size expected_size = scroll_view_->size(); expected_size.Enlarge(0, -kThickness); @@ -2149,7 +2149,7 @@ test::ObserveViewDeletion view_deletion{contents}; // Make sure the content is installed and working. - scroll_view_->Layout(); + RunScheduledLayout(scroll_view_.get()); EXPECT_EQ("0,0 100x100", contents->parent()->bounds().ToString()); // This should be legal and not DCHECK.
diff --git a/ui/views/controls/styled_label_unittest.cc b/ui/views/controls/styled_label_unittest.cc index 18d54c5..dd67683 100644 --- a/ui/views/controls/styled_label_unittest.cc +++ b/ui/views/controls/styled_label_unittest.cc
@@ -118,7 +118,7 @@ InitStyledLabel(text); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); EXPECT_EQ(u"This is a test block of text", LabelAt(styled(), 0)->GetText()); @@ -129,7 +129,7 @@ InitStyledLabel(text); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); EXPECT_EQ(u" This is a test block of text", @@ -141,7 +141,7 @@ const std::string text(std::string("First line\n") + indented_line); InitStyledLabel(text); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(2u, styled()->children().size()); EXPECT_EQ(ASCIIToUTF16(indented_line), LabelAt(styled(), 1)->GetText()); } @@ -155,7 +155,7 @@ gfx::Size label_preferred_size = label.GetPreferredSize(); // Correct handling of \n and label width limit encountered at the same place styled()->SetBounds(0, 0, label_preferred_size.width(), 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(2u, styled()->children().size()); EXPECT_EQ(ASCIIToUTF16(first_line), LabelAt(styled(), 0)->GetText()); const auto* label_1 = LabelAt(styled(), 1); @@ -171,7 +171,7 @@ gfx::Size label_preferred_size = label.GetPreferredSize(); styled()->SetBounds(0, 0, label_preferred_size.width() / 2, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); EXPECT_EQ(u"a", LabelAt(styled(), 0)->GetText()); @@ -193,7 +193,7 @@ styled()->SetBounds( 0, 0, styled()->GetInsets().width() + label_preferred_size.width(), styled()->GetInsets().height() + 2 * label_preferred_size.height()); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(2u, styled()->children().size()); EXPECT_EQ(3, styled()->children()[0]->x()); EXPECT_EQ(3, styled()->children()[0]->y()); @@ -207,7 +207,7 @@ const std::string multiline_text("one\n\nthree"); InitStyledLabel(multiline_text); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(3 * default_height, styled()->GetHeightForWidth(1000)); ASSERT_EQ(2u, styled()->children().size()); EXPECT_EQ(styled()->GetHeightForWidth(1000), @@ -226,7 +226,7 @@ styled()->SetBounds( 0, 0, styled()->GetInsets().width() + label_preferred_size.width(), styled()->GetInsets().height() + 2 * label_preferred_size.height()); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(2u, styled()->children().size()); ASSERT_EQ(gfx::Point(), styled()->origin()); @@ -267,7 +267,7 @@ // Verify layout creates the right number of children. styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(7u, styled()->children().size()); } @@ -284,7 +284,7 @@ style_info); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(2u, styled()->children().size()); EXPECT_EQ(gfx::Font::UNDERLINE, @@ -329,11 +329,11 @@ StyledLabel unstyled; unstyled.SetText(ASCIIToUTF16(bold_text)); unstyled.SetBounds(0, 0, styled_width, pref_height); - unstyled.Layout(); + RunScheduledLayout(&unstyled); EXPECT_EQ(1u, unstyled.children().size()); styled()->SetBounds(0, 0, styled_width, pref_height); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(3u, styled()->children().size()); @@ -368,7 +368,7 @@ style_info_link); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); // The code below is not prepared to deal with dark mode. auto* const native_theme = widget()->GetNativeTheme(); @@ -395,7 +395,7 @@ // Test adjusted color readability. styled()->SetDisplayedOnBackgroundColor(SK_ColorBLACK); - styled()->Layout(); + RunScheduledLayout(styled()); label->SetBackgroundColor(SK_ColorBLACK); const SkColor kAdjustedTextColor = label->GetEnabledColor(); @@ -432,7 +432,7 @@ pref_height - styled()->GetInsets().height()); styled()->SetBounds(0, 0, label_preferred_size.width(), pref_height); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(label_preferred_size.width(), styled()->width()); @@ -469,7 +469,7 @@ EXPECT_EQ(label.GetPreferredSize().height(), styled()->height()); EXPECT_EQ(label.GetPreferredSize().width(), styled()->width()); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); Label* sublabel = LabelAt(styled(), 0); EXPECT_EQ(style::CONTEXT_DIALOG_TITLE, sublabel->GetTextContext()); @@ -513,7 +513,7 @@ TEST_F(StyledLabelTest, HandleEmptyLayout) { const std::string text("This is a test block of text."); InitStyledLabel(text); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(0u, styled()->children().size()); } @@ -533,7 +533,7 @@ EXPECT_EQ(0u, styled()->children().size()); styled()->SetBounds(0, 0, preferred_width, preferred_height); - styled()->Layout(); + RunScheduledLayout(styled()); // controls should be created after layout // height should be the same as precalculated @@ -545,7 +545,7 @@ EXPECT_EQ(real_height, precalculated_height); // another call to Layout should not kill and recreate all controls - styled()->Layout(); + RunScheduledLayout(styled()); View* first_child_after_second_layout = styled()->children().empty() ? nullptr : styled()->children().front(); EXPECT_EQ(first_child_after_layout, first_child_after_second_layout); @@ -568,7 +568,7 @@ gfx::Size label_preferred_size = label.GetPreferredSize(); styled()->SetBorder(CreateEmptyBorder(gfx::Insets::TLBR(5, 10, 6, 20))); styled()->SetBounds(0, 0, 1000, 0); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ( label_preferred_size.height() + 5 /*top border*/ + 6 /*bottom border*/, styled()->GetPreferredSize().height()); @@ -641,7 +641,7 @@ const std::string text("text"); InitStyledLabel(text); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); const auto& children = styled()->children(); ASSERT_EQ(1u, children.size()); @@ -649,15 +649,15 @@ EXPECT_EQ(0, children.front()->bounds().x()); styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(1000, children.front()->bounds().right()); styled()->SetHorizontalAlignment(gfx::ALIGN_LEFT); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(0, children.front()->bounds().x()); styled()->SetHorizontalAlignment(gfx::ALIGN_CENTER); - styled()->Layout(); + RunScheduledLayout(styled()); Label label(ASCIIToUTF16(text)); EXPECT_EQ((1000 - label.GetPreferredSize().width()) / 2, children.front()->bounds().x()); @@ -674,7 +674,7 @@ const std::string text("text"); InitStyledLabel(text); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); const auto& children = styled()->children(); ASSERT_EQ(1u, children.size()); @@ -684,16 +684,16 @@ // Setting |ALIGN_LEFT| should be flipped to |ALIGN_RIGHT|. styled()->SetHorizontalAlignment(gfx::ALIGN_LEFT); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(1000, children.front()->bounds().right()); // Setting |ALIGN_RIGHT| should be flipped to |ALIGN_LEFT|. styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT); - styled()->Layout(); + RunScheduledLayout(styled()); EXPECT_EQ(0, children.front()->bounds().x()); styled()->SetHorizontalAlignment(gfx::ALIGN_CENTER); - styled()->Layout(); + RunScheduledLayout(styled()); Label label(ASCIIToUTF16(text)); EXPECT_EQ((1000 - label.GetPreferredSize().width()) / 2, children.front()->bounds().x()); @@ -720,7 +720,7 @@ styled()->AddCustomView(std::move(custom_view)); styled()->SetBounds(0, 0, 1000, 500); - styled()->Layout(); + RunScheduledLayout(styled()); const int height = styled()->GetPreferredSize().height(); for (const auto* child : styled()->children()) EXPECT_EQ(height / 2, child->bounds().CenterPoint().y()); @@ -742,7 +742,7 @@ } styled()->SetBounds(0, 0, kViewWidth * 3, height); - styled()->Layout(); + RunScheduledLayout(styled()); for (const auto* child : styled()->children()) EXPECT_EQ(height / 2, child->bounds().CenterPoint().y()); @@ -754,13 +754,13 @@ InitStyledLabel(text); styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT); styled()->SetBounds(0, 0, 1000, 1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); const View* child = styled()->children().front(); EXPECT_EQ(1000, child->bounds().right()); styled()->SetSize({800, 1000}); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); const View* new_child = styled()->children().front(); EXPECT_EQ(child, new_child); @@ -774,7 +774,7 @@ InitStyledLabel(text); styled()->SetHorizontalAlignment(gfx::ALIGN_RIGHT); styled()->SizeToFit(1000); - styled()->Layout(); + RunScheduledLayout(styled()); ASSERT_EQ(1u, styled()->children().size()); EXPECT_EQ(1000, styled()->children().front()->bounds().right()); } @@ -794,7 +794,7 @@ size.set_width(size.width() / 2); size.set_height(styled()->GetHeightForWidth(size.width())); styled()->SetSize(size); - styled()->Layout(); + RunScheduledLayout(styled()); const gfx::Size new_size = styled()->GetPreferredSize(); EXPECT_LE(new_size.width(), size.width()); EXPECT_EQ(new_size.height(), size.height());
diff --git a/ui/views/controls/table/table_view_unittest.cc b/ui/views/controls/table/table_view_unittest.cc index 2e2493ff..a2ddafb 100644 --- a/ui/views/controls/table/table_view_unittest.cc +++ b/ui/views/controls/table/table_view_unittest.cc
@@ -30,6 +30,7 @@ #include "ui/views/style/platform_style.h" #include "ui/views/test/focus_manager_test.h" #include "ui/views/test/views_test_base.h" +#include "ui/views/widget/unique_widget_ptr.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" #include "ui/views/widget/widget_utils.h" @@ -453,17 +454,16 @@ table_ = table.get(); auto scroll_view = TableView::CreateScrollViewWithTable(std::move(table)); scroll_view->SetBounds(0, 0, 10000, 10000); - scroll_view->Layout(); helper_ = std::make_unique<TableViewTestHelper>(table_); widget_ = std::make_unique<Widget>(); Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW_FRAMELESS); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(0, 0, 650, 650); params.delegate = GetWidgetDelegate(widget_.get()); widget_->Init(std::move(params)); - widget_->GetRootView()->AddChildView(std::move(scroll_view)); + RunScheduledLayout( + widget_->GetRootView()->AddChildView(std::move(scroll_view))); widget_->Show(); } @@ -597,7 +597,7 @@ std::unique_ptr<TableViewTestHelper> helper_; - std::unique_ptr<Widget> widget_; + UniqueWidgetPtr widget_; private: gfx::Point GetPointForRow(int row) { @@ -2183,7 +2183,6 @@ ViewsTestBase::SetUp(); widget_ = std::make_unique<Widget>(); Widget::InitParams params = CreateParams(Widget::InitParams::TYPE_WINDOW); - params.ownership = views::Widget::InitParams::WIDGET_OWNS_NATIVE_WIDGET; params.bounds = gfx::Rect(0, 0, 650, 650); widget_->Init(std::move(params)); widget_->Show(); @@ -2197,14 +2196,13 @@ Widget* widget() { return widget_.get(); } private: - std::unique_ptr<Widget> widget_; + UniqueWidgetPtr widget_; }; TEST_F(TableViewDefaultConstructabilityTest, TestFunctionalWithoutModel) { auto scroll_view = TableView::CreateScrollViewWithTable(std::make_unique<TableView>()); scroll_view->SetBounds(0, 0, 10000, 10000); - scroll_view->Layout(); - widget()->GetContentsView()->AddChildView(std::move(scroll_view)); + widget()->client_view()->AddChildView(std::move(scroll_view)); } } // namespace views
diff --git a/ui/views/controls/webview/webview_unittest.cc b/ui/views/controls/webview/webview_unittest.cc index edf636d..ea25270f 100644 --- a/ui/views/controls/webview/webview_unittest.cc +++ b/ui/views/controls/webview/webview_unittest.cc
@@ -173,9 +173,9 @@ top_level_widget_->SetBounds(gfx::Rect(0, 10, 100, 100)); View* const contents_view = top_level_widget_->SetContentsView(std::make_unique<View>()); - web_view_ = new WebView(browser_context_.get()); - web_view_->SetBoundsRect(gfx::Rect(contents_view->size())); - contents_view->AddChildView(web_view_.get()); + auto web_view = std::make_unique<WebView>(browser_context_.get()); + web_view->SetBoundsRect(gfx::Rect(contents_view->size())); + web_view_ = contents_view->AddChildView(std::move(web_view)); top_level_widget_->Show(); ASSERT_EQ(gfx::Rect(0, 0, 100, 100), web_view_->bounds()); } @@ -231,8 +231,8 @@ EXPECT_FALSE(observer1.was_shown()); web_view()->SetWebContents(web_contents1.get()); - // Layout() is normally async, call it now to ensure visibility is updated. - web_view()->Layout(); + // Layout is normally async, ensure it runs now so visibility is updated. + RunScheduledLayout(web_view()); EXPECT_TRUE(observer1.was_shown()); #if defined(USE_AURA) EXPECT_TRUE(web_contents1->GetNativeView()->IsVisible()); @@ -251,8 +251,8 @@ // Setting the new WebContents should hide the existing one. web_view()->SetWebContents(web_contents2.get()); - // Layout() is normally async, call it now to ensure visibility is updated. - web_view()->Layout(); + // Layout is normally async, ensure it runs now so visibility is updated. + RunScheduledLayout(web_view()); EXPECT_FALSE(observer1.was_shown()); EXPECT_TRUE(observer2.was_shown()); EXPECT_TRUE(observer2.valid_root_while_shown()); @@ -270,8 +270,8 @@ EXPECT_EQ(1, observer1.shown_count()); web_view()->SetWebContents(web_contents1.get()); - // Layout() is normally async, call it now to ensure visibility is updated. - web_view()->Layout(); + // Layout is normally async, ensure it runs now so visibility is updated. + RunScheduledLayout(web_view()); EXPECT_EQ(1, observer1.shown_count()); // Nothing else should change.
diff --git a/ui/views/test/views_test_base.cc b/ui/views/test/views_test_base.cc index 1e3fc23d..4ac102b 100644 --- a/ui/views/test/views_test_base.cc +++ b/ui/views/test/views_test_base.cc
@@ -114,6 +114,19 @@ run_loop.RunUntilIdle(); } +void ViewsTestBase::RunScheduledLayout(View* view) { + DCHECK(view); + Widget* widget = view->GetWidget(); + if (widget) { + widget->LayoutRootViewIfNecessary(); + return; + } + View* parent_view = view; + while (parent_view->parent()) + parent_view = parent_view->parent(); + parent_view->Layout(); +} + Widget::InitParams ViewsTestBase::CreateParams(Widget::InitParams::Type type) { Widget::InitParams params(type); params.context = GetContext();
diff --git a/ui/views/test/views_test_base.h b/ui/views/test/views_test_base.h index b8131f207..da9d5d164 100644 --- a/ui/views/test/views_test_base.h +++ b/ui/views/test/views_test_base.h
@@ -77,6 +77,11 @@ void RunPendingMessages(); + // Ensure the given view is properly laid out. If the view is in a Widget view + // tree, invoke Widget::LayoutRootViewIfNecessary(). Otherwise lay out the + // root parent view. + void RunScheduledLayout(View* view); + // Returns CreateParams for a widget of type |type|. This is used by // CreateParamsForTestWidget() and thus by CreateTestWidget(), and may also be // used directly. The default implementation sets the context to
diff --git a/ui/views/widget/native_widget_mac.mm b/ui/views/widget/native_widget_mac.mm index 42b1de8..d9df913 100644 --- a/ui/views/widget/native_widget_mac.mm +++ b/ui/views/widget/native_widget_mac.mm
@@ -42,6 +42,7 @@ #include "ui/views/widget/native_widget_delegate.h" #include "ui/views/widget/widget_aura_utils.h" #include "ui/views/widget/widget_delegate.h" +#include "ui/views/widget/widget_utils_mac.h" #include "ui/views/window/native_frame_view.h" using remote_cocoa::mojom::WindowVisibilityState; @@ -220,6 +221,14 @@ ns_window_host_->SetParent(parent_host); ns_window_host_->InitWindow(params, ConvertBoundsToScreenIfNeeded(params.bounds)); + + // In immersive fullscreen, bubbles will be shown under the toolbar by + // default. Fix it by explicitly StackAbove() its parent. + if (params.parent && views::IsNSToolbarFullScreenWindow( + params.parent.GetNativeNSView().window)) { + StackAbove(params.parent); + } + OnWindowInitialized(); // Only set the z-order here if it is non-default since setting it may affect
diff --git a/ui/views/widget/widget_utils_mac.h b/ui/views/widget/widget_utils_mac.h index 8a3d31a..bf72f1fb 100644 --- a/ui/views/widget/widget_utils_mac.h +++ b/ui/views/widget/widget_utils_mac.h
@@ -5,12 +5,15 @@ #ifndef UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_ #define UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_ +#include "ui/views/views_export.h" #include "ui/views/widget/widget.h" namespace views { gfx::Size GetWindowSizeForClientSize(Widget* widget, const gfx::Size& size); +VIEWS_EXPORT bool IsNSToolbarFullScreenWindow(NSWindow* window); + } // namespace views #endif // UI_VIEWS_WIDGET_WIDGET_UTILS_MAC_H_
diff --git a/ui/views/widget/widget_utils_mac.mm b/ui/views/widget/widget_utils_mac.mm index 6a3b1dc..5725676 100644 --- a/ui/views/widget/widget_utils_mac.mm +++ b/ui/views/widget/widget_utils_mac.mm
@@ -14,4 +14,11 @@ widget->GetNativeWindow().GetNativeNSWindow(), size); } +bool IsNSToolbarFullScreenWindow(NSWindow* window) { + // TODO(bur): Investigate other approaches to detecting + // NSToolbarFullScreenWindow. This is a private class and the name could + // change. + return [window isKindOfClass:NSClassFromString(@"NSToolbarFullScreenWindow")]; +} + } // namespace views
diff --git a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js index 0c1ef883..b8b1cd2 100644 --- a/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js +++ b/ui/webui/resources/cr_components/chromeos/bluetooth/bluetooth_metrics_utils.js
@@ -71,4 +71,27 @@ 'Bluetooth.ChromeOS.UserInitiatedReconnectionAttempt.Duration.' + successHistogramName + transportHistogramName, durationInMs); -} \ No newline at end of file +} + +/** + * These values are persisted to logs and should not be renumbered or re-used. + * See tools/metrics/histograms/enums.xml. + * @enum {number} + */ +export const FastPairSavedDevicesUiEvent = { + SETTINGS_SAVED_DEVICE_LIST_SUBPAGE_SHOWN: 0, + SETTINGS_SAVED_DEVICE_LIST_HAS_DEVICES: 1, + SETTINGS_SAVED_DEVICE_LIST_REMOVE_DIALOG: 2, + SETTINGS_SAVED_DEVICE_LIST_REMOVE: 3, +}; + +/** + * Records metric indicating that |uiEvent| was displayed to the user. + * @param {!FastPairSavedDevicesUiEvent} uiEvent + * Fast Pair Saved Devices UI event displayed. + */ +export function recordSavedDevicesUiEventMetrics(uiEvent) { + chrome.metricsPrivate.recordEnumerationValue( + 'Bluetooth.ChromeOS.FastPair.SavedDevices.UiEvent', uiEvent, + Object.keys(FastPairSavedDevicesUiEvent).length); +}