diff --git a/DEPS b/DEPS index 4880335..3646202 100644 --- a/DEPS +++ b/DEPS
@@ -242,7 +242,7 @@ # # CQ_INCLUDE_TRYBOTS=luci.chrome.try:lacros-amd64-generic-chrome-skylab # CQ_INCLUDE_TRYBOTS=luci.chrome.try:lacros-arm-generic-chrome-skylab - 'lacros_sdk_version': '15626.0.0', + 'lacros_sdk_version': '15632.0.0', # Generate location tag metadata to include in tests result data uploaded # to ResultDB. This isn't needed on some configs and the tool that generates @@ -310,11 +310,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': '1e6025a7fe2856d4c9400937c1210736f71428d9', + 'src_internal_revision': 'b4e35d03eabbf984521b008315144df3c1b6e22c', # 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': '0fef7d25a55f52cfb7153b4990e288a8e36f2a2a', + 'skia_revision': 'fcd1b7521805ab1cde2947be6118f329e4ace14d', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. @@ -322,7 +322,7 @@ # 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': '34c8778b4a73855471c2b27e5ea221e2861a6d73', + 'angle_revision': '32ef34df48920cff6f6b629c515e052fa4baa968', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -389,7 +389,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling chromium_variations # and whatever else without interference from each other. - 'chromium_variations_revision': '923dfb9e61617b401ffc72b882a8eb48210d1bef', + 'chromium_variations_revision': '990efdd6cf54f2124621d065e2de629856c395e4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -397,15 +397,15 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libFuzzer # and whatever else without interference from each other. - 'libfuzzer_revision': '26cc39e59b2bf5cbc20486296248a842c536878d', + 'libfuzzer_revision': '758bd21f103a501b362b1ca46fa8fcb692eaa303', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling fuzztest # and whatever else without interference from each other. - 'fuzztest_revision': 'd0d81c430b7bf5b282f98f479b312bfca670e67f', + 'fuzztest_revision': 'ce460dd7cae252b8505ce0009121bcac17939e3a', # 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': 'd49819fe244438697b53be6ca829f35b0959f009', + 'devtools_frontend_revision': '46268f4b777d9e3812ae478fd3254f82fea73f3a', # 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. @@ -445,7 +445,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': 'addd7493ccd6a001f0e5458007982f10df77cd0a', + 'dawn_revision': 'e1f1c0135a5eca328a320d4f14d21b24576eea9b', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -469,7 +469,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libavifinfo # and whatever else without interference from each other. - 'libavifinfo_revision': '5e8d92c8bbc63dead2781d67c7236a26aef209cf', + 'libavifinfo_revision': 'b496868f7c3fd17dfeeecc0364fe37e19edd548a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Speedometer v3.0 # and whatever else without interference from each other. @@ -845,7 +845,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'c3b5fedc549373d6593a9fccb650bc1fd6567ef8', + 'aa3c18d7af25c04cdf5ff613708d191707815647', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1051,7 +1051,7 @@ 'packages': [ { 'package': 'chromium/third_party/androidx', - 'version': 'bl8kJNxJrZ69JjDS2Jmlex7NRMWGrBoAZfrbs7U_GksC', + 'version': 'IrpbN40qmrgJhRlrreSznX0-bvcK-SQ73XYHV4x-Y0gC', }, ], 'condition': 'checkout_android', @@ -1260,7 +1260,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'e884bb39adc4411392a38ef69a0fb7c3299365f4', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'f76c26cb2612ceff9adf29c0f63c539c285b5f4a', 'condition': 'checkout_chromeos', }, @@ -1281,7 +1281,7 @@ # For Linux and Chromium OS. 'src/third_party/cros_system_api': { - 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + '9f5095452ada37b9ffb6b4909c0b8e08e3c18d9c', + 'url': Var('chromium_git') + '/chromiumos/platform2/system_api.git' + '@' + 'b7b78587c03de1cd478f31f734498430773adeb3', 'condition': 'checkout_linux', }, @@ -1301,7 +1301,7 @@ Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '46b0231738a9dbba7b3827649d231fe6a6290fb9', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '5c18380d0cee521d0eb41984f178253763d2f7c1', 'condition': 'checkout_src_internal', }, @@ -1790,7 +1790,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('android_git') + '/platform/external/perfetto.git' + '@' + 'd3bf532f84cf34f899c5785043ceb4af8f76d4e3', + Var('android_git') + '/platform/external/perfetto.git' + '@' + 'a3d4c1de9bcf2a0471ab183c45cf111efd29571e', 'src/third_party/perl': { 'url': Var('chromium_git') + '/chromium/deps/perl.git' + '@' + '6f3e5028eb65d0b4c5fdd792106ac4c84eee1eb3', @@ -1928,14 +1928,14 @@ 'packages': [ { 'package': 'chromium/third_party/turbine', - 'version': 'yCsGwOtj8SizFXXeS-xmdIaZ3PuyTsy8IJsp411p_uIC', + 'version': 'hgwj3KajqJCdACBdNiRoYQZhZw2NhHu0-pwuAp3S-LcC', }, ], 'condition': 'checkout_android', 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@1e40b8e966f5dbac2e886e5ba1eb30f660cd5cf9', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@7413048934e28b97ae00c37c419e576db8add866', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + 'e87036508bb156f9986ea959323de1869e328f58', @@ -1972,10 +1972,10 @@ Var('chromium_git') + '/external/khronosgroup/webgl.git' + '@' + 'f4bf599a8b575df685c31d9c4729a70a04e377ed', 'src/third_party/webgpu-cts/src': - Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + 'f2b59e03621238d0d0fd6305be2c406ce3e45ac2', + Var('chromium_git') + '/external/github.com/gpuweb/cts.git' + '@' + '609645eb5b272668cbfb120d1aa9549eee86e02d', 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + 'dd15070b4539d49ae5e135e7d12b64bbc7bafb27', + Var('webrtc_git') + '/src.git' + '@' + 'bce7ce7ba054ac0e79fed49b84ef52fb24c31778', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -2098,7 +2098,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'mWIrgHjjRR43j32ZeRpMJ65Ee-ZIVreCbVQBh16XrAcC', + 'version': 'GjoP6BjK77E8Knwrylogi1eAlNj7mZwo3pPM54XqKF4C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2109,7 +2109,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'nCS9qowrYZljzco4s3wL6-p8O-ZTylGZeYi9tmTcmbEC', + 'version': 'ieHsTWezKOjEQ5USdZZUrnDFeBFjurom9oEYs573jHIC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2142,7 +2142,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/projector_app/app', - 'version': 'mAPcfvCOFi2zP9MHXaTMy2x1F8CWmfWi9WpnxfKMIAEC', + 'version': 'Vx9PMhzwegc7g8haMPr9VE4BYvgBSqLtFrHW9bHMV3wC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2200,17 +2200,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/android_arch_lifecycle_common_java8': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8', - 'version': 'version:2@1.1.1.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/android_arch_lifecycle_livedata': { 'packages': [ { @@ -2255,28 +2244,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_animated_vector_drawable': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_appcompat_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_appcompat_v7', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_asynclayoutinflater': { 'packages': [ { @@ -2288,17 +2255,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_cardview_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_cardview_v7', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_collections': { 'packages': [ { @@ -2343,17 +2299,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_design': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_design', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_documentfile': { 'packages': [ { @@ -2409,17 +2354,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_multidex': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_multidex', - 'version': 'version:2@1.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_print': { 'packages': [ { @@ -2431,17 +2365,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_recyclerview_v7': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_slidingpanelayout': { 'packages': [ { @@ -2497,50 +2420,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_support_fragment': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_fragment', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_support_media_compat': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_media_compat', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_support_v4': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_v4', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - - 'src/third_party/android_deps/libs/com_android_support_support_vector_drawable': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_swiperefreshlayout': { 'packages': [ { @@ -2552,17 +2431,6 @@ 'dep_type': 'cipd', }, - 'src/third_party/android_deps/libs/com_android_support_transition': { - 'packages': [ - { - 'package': 'chromium/third_party/android_deps/libs/com_android_support_transition', - 'version': 'version:2@28.0.0.cr1', - }, - ], - 'condition': 'checkout_android', - 'dep_type': 'cipd', - }, - 'src/third_party/android_deps/libs/com_android_support_versionedparcelable': { 'packages': [ { @@ -4269,7 +4137,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - '53a8c425fd177be6bf436f31930c2b99408e51eb', + 'd1898d6f4bafeaedb7e6d9e61ace74701449b609', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/PRESUBMIT.py b/PRESUBMIT.py index e612700d..1f00e761 100644 --- a/PRESUBMIT.py +++ b/PRESUBMIT.py
@@ -1034,6 +1034,7 @@ True, [ # Clang plugins have different build config. + '^tools/clang/blink_gc_plugin/', '^tools/clang/plugins/', # Not an error in third_party folders. _THIRD_PARTY_EXCEPT_BLINK,
diff --git a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java index 541165b..32456ed 100644 --- a/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java +++ b/android_webview/javatests/src/org/chromium/android_webview/test/AwAutofillTest.java
@@ -1389,6 +1389,31 @@ TestThreadUtils.runOnUiThreadBlocking(() -> { histograms.assertExpected(); }); } + /** + * Tests that the metrics of the ongoing session are recorded on AwContents destruction. + */ + @Test + @SmallTest + @Feature({"AndroidWebView"}) + public void testUMASessionMetricsRecordedOnAwContentsDestruction() throws Throwable { + var histograms = TestThreadUtils.runOnUiThreadBlocking(() -> { + return HistogramWatcher.newBuilder() + .expectIntRecord(AutofillProviderUMA.UMA_AUTOFILL_AUTOFILL_SESSION, + AutofillProviderUMA + .USER_SELECT_SUGGESTION_USER_CHANGE_FORM_NO_FORM_SUBMITTED) + .expectNoRecords(AutofillProviderUMA.UMA_AUTOFILL_SUBMISSION_SOURCE) + .expectNoRecords(AutofillProviderUMA.UMA_AUTOFILL_AWG_SUGGSTION_AVAILABILITY) + .build(); + }); + mUMATestHelper.triggerAutofill(); + invokeOnProvideAutoFillVirtualStructure(); + invokeOnInputUIShown(); + mUMATestHelper.simulateUserSelectSuggestion(); + mUMATestHelper.simulateUserChangeField(); + TestThreadUtils.runOnUiThreadBlocking(() -> { mAwContents.destroy(); }); + TestThreadUtils.runOnUiThreadBlocking(() -> { histograms.assertExpected(); }); + } + @Test @SmallTest @Feature({"AndroidWebView"})
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java index 12043a502..664c040 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibServiceWorkerControllerAdapter.java
@@ -7,6 +7,7 @@ import static org.chromium.support_lib_glue.SupportLibWebViewChromiumFactory.recordApiCall; import org.chromium.android_webview.AwServiceWorkerController; +import org.chromium.android_webview.common.Lifetime; import org.chromium.base.TraceEvent; import org.chromium.support_lib_boundary.ServiceWorkerClientBoundaryInterface; import org.chromium.support_lib_boundary.ServiceWorkerControllerBoundaryInterface; @@ -18,6 +19,7 @@ /** * Adapter between AwServiceWorkerController and ServiceWorkerControllerBoundaryInterface. */ +@Lifetime.Profile class SupportLibServiceWorkerControllerAdapter implements ServiceWorkerControllerBoundaryInterface { AwServiceWorkerController mAwServiceWorkerController;
diff --git a/android_webview/test/embedded_test_server/BUILD.gn b/android_webview/test/embedded_test_server/BUILD.gn index 8bb2c3f..d386c1f 100644 --- a/android_webview/test/embedded_test_server/BUILD.gn +++ b/android_webview/test/embedded_test_server/BUILD.gn
@@ -66,10 +66,6 @@ # Used as an additional_apk in test scripts. never_incremental = true - # Multidex requires a custom Application class to initialize it. Simpler to - # just disable it. - enable_multidex = false - deps = [ ":aw_net_java_test_support" ] android_manifest = "java/AndroidManifest.xml" apk_name = "ChromiumNetTestAwSupport"
diff --git a/ash/accelerators/accelerator_commands.cc b/ash/accelerators/accelerator_commands.cc index 0ac636bf..76f54eb 100644 --- a/ash/accelerators/accelerator_commands.cc +++ b/ash/accelerators/accelerator_commands.cc
@@ -1687,13 +1687,6 @@ void VolumeDown() { auto* audio_handler = CrasAudioHandler::Get(); if (features::IsQsRevampEnabled()) { - if (audio_handler->IsOutputMuted() && - !audio_handler->IsOutputVolumeBelowDefaultMuteLevel()) { - // The output node can be muted while the previous level is preserved. - // First update the mute state to update the slider style if the level is - // greater than `kMuteThresholdPercent`, and then adjust the volume level. - audio_handler->SetOutputMute(false); - } // Only plays the audio if unmuted. if (!audio_handler->IsOutputMuted()) { AcceleratorController::PlayVolumeAdjustmentSound();
diff --git a/ash/accelerators/accelerator_commands_unittest.cc b/ash/accelerators/accelerator_commands_unittest.cc index 01839f5..fe4a5c3 100644 --- a/ash/accelerators/accelerator_commands_unittest.cc +++ b/ash/accelerators/accelerator_commands_unittest.cc
@@ -176,16 +176,40 @@ // Volume down, should decrease to zero and no mute. PressAndReleaseKey(ui::VKEY_VOLUME_DOWN, ui::EF_NONE); EXPECT_EQ(audio_handler->GetOutputVolumePercent(), 0); - // For QsRevamp: the muted state is equivalent to the zero volume state. - if (features::IsQsRevampEnabled()) { - EXPECT_TRUE(audio_handler->IsOutputMuted()); - } else { - EXPECT_FALSE(audio_handler->IsOutputMuted()); - } + EXPECT_FALSE(audio_handler->IsOutputMuted()); // Volume down again, should decrease to zero and mute. PressAndReleaseKey(ui::VKEY_VOLUME_DOWN, ui::EF_NONE); EXPECT_EQ(audio_handler->GetOutputVolumePercent(), 0); + // For QsRevamp: output node mute state will not change. + if (features::IsQsRevampEnabled()) { + EXPECT_FALSE(audio_handler->IsOutputMuted()); + } else { + EXPECT_TRUE(audio_handler->IsOutputMuted()); + } +} + +TEST_F(AcceleratorCommandsAudioTest, ChangeVolumeAfterMuted) { + // This behavior is for QsRevamp. + if (!features::IsQsRevampEnabled()) { + return; + } + + SetUpAudioNode(); + auto* audio_handler = CrasAudioHandler::Get(); + // Make sure that output node is in mute state. + audio_handler->SetOutputVolumePercent(80); + audio_handler->SetOutputMute(true); EXPECT_TRUE(audio_handler->IsOutputMuted()); + EXPECT_EQ(audio_handler->GetOutputVolumePercent(), 80); + // Press the volume down key will decrease the volume but won't change the + // muted state. + PressAndReleaseKey(ui::VKEY_VOLUME_DOWN, ui::EF_NONE); + EXPECT_TRUE(audio_handler->IsOutputMuted()); + EXPECT_LE(audio_handler->GetOutputVolumePercent(), 80); + // Volume up, should bring back the volume to its original level and unmute. + PressAndReleaseKey(ui::VKEY_VOLUME_UP, ui::EF_NONE); + EXPECT_EQ(audio_handler->GetOutputVolumePercent(), 80); + EXPECT_FALSE(audio_handler->IsOutputMuted()); } TEST_F(AcceleratorCommandsAudioTest, VolumeMuteToggle) {
diff --git a/ash/ambient/util/time_of_day_utils.cc b/ash/ambient/util/time_of_day_utils.cc index 14aea07..0c7a92a 100644 --- a/ash/ambient/util/time_of_day_utils.cc +++ b/ash/ambient/util/time_of_day_utils.cc
@@ -7,6 +7,7 @@ #include <string> #include <utility> +#include "ash/constants/ambient_time_of_day_constants.h" #include "ash/constants/ash_features.h" #include "base/check.h" #include "base/functional/bind.h" @@ -20,8 +21,6 @@ namespace { -constexpr char kTimeOfDayDlcId[] = "timeofday-dlc"; - void OnInstallDlcComplete(base::OnceCallback<void(base::FilePath)> on_done, const DlcserviceClient::InstallResult& result) { CHECK(on_done);
diff --git a/ash/app_list/app_list_controller_impl.cc b/ash/app_list/app_list_controller_impl.cc index 5c6ed2f..03068a4 100644 --- a/ash/app_list/app_list_controller_impl.cc +++ b/ash/app_list/app_list_controller_impl.cc
@@ -329,8 +329,6 @@ registry->RegisterBooleanPref(prefs::kLauncherUseLongContinueDelay, false); // The prefs for launcher search controls. - // TODO(crbug.com/1352636): Consider merging this to - // `search_notifier_controller` and rename it. registry->RegisterDictionaryPref(prefs::kLauncherSearchCategoryControlStatus); }
diff --git a/ash/app_list/model/search/search_result.h b/ash/app_list/model/search/search_result.h index e816fa0..4265324 100644 --- a/ash/app_list/model/search/search_result.h +++ b/ash/app_list/model/search/search_result.h
@@ -238,9 +238,6 @@ private: friend class SearchController; - // TODO(crbug.com/1352636) Remove this friend class. Currently used to mock - // results for SearchResultImageView prototyping. - friend class SearchResultImageView; // Opens the result. Clients should use AppListViewDelegate::OpenSearchResult. virtual void Open(int event_flags);
diff --git a/ash/app_list/views/app_list_item_view_pixeltest.cc b/ash/app_list/views/app_list_item_view_pixeltest.cc index 7aba161..141f003 100644 --- a/ash/app_list/views/app_list_item_view_pixeltest.cc +++ b/ash/app_list/views/app_list_item_view_pixeltest.cc
@@ -218,12 +218,12 @@ if (jelly_enabled()) { EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( - GenerateScreenshotName(), /*revision_number=*/5, GetItemViewAt(0), + GenerateScreenshotName(), /*revision_number=*/4, GetItemViewAt(0), GetItemViewAt(1), GetItemViewAt(2), GetItemViewAt(3), GetItemViewAt(4))); } else { EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( - GenerateScreenshotName(), /*revision_number=*/6, GetItemViewAt(0), + GenerateScreenshotName(), /*revision_number=*/5, GetItemViewAt(0), GetItemViewAt(1), GetItemViewAt(2), GetItemViewAt(3), GetItemViewAt(4))); } @@ -268,7 +268,7 @@ GetItemViewAt(4))); } else { EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( - GenerateScreenshotName(), /*revision_number=*/6, GetItemViewAt(0), + GenerateScreenshotName(), /*revision_number=*/5, GetItemViewAt(0), GetItemViewAt(1), GetItemViewAt(2), GetItemViewAt(3), GetItemViewAt(4))); }
diff --git a/ash/app_list/views/app_list_search_view_unittest.cc b/ash/app_list/views/app_list_search_view_unittest.cc index d4bbb427..dc3b7ff 100644 --- a/ash/app_list/views/app_list_search_view_unittest.cc +++ b/ash/app_list/views/app_list_search_view_unittest.cc
@@ -19,7 +19,6 @@ #include "ash/app_list/views/search_box_view.h" #include "ash/app_list/views/search_notifier_controller.h" #include "ash/app_list/views/search_result_image_list_view.h" -#include "ash/app_list/views/search_result_image_view_delegate.h" #include "ash/app_list/views/search_result_list_view.h" #include "ash/app_list/views/search_result_page_view.h" #include "ash/constants/ash_features.h" @@ -416,47 +415,6 @@ client->set_search_callback(TestAppListClient::SearchCallback()); } -TEST_P(SearchResultImageViewTest, ShowContextMenu) { - auto* test_helper = GetAppListTestHelper(); - test_helper->ShowAppList(); - - // Press a key to start a search. - PressAndReleaseKey(ui::VKEY_A); - - SearchModel::SearchResults* results = test_helper->GetSearchResults(); - SetUpImageSearchResults( - results, 1, SharedAppListConfig::instance().image_search_max_results()); - - // Check result container visibility. - std::vector<SearchResultContainerView*> result_containers = - GetSearchView()->result_container_views_for_test(); - ASSERT_EQ(static_cast<int>(result_containers.size()), kResultContainersCount); - for (auto* container : result_containers) { - EXPECT_TRUE(container->RunScheduledUpdateForTest()); - } - - // SearchResultImageListView container should be visible. - ASSERT_TRUE( - views::IsViewClass<SearchResultImageListView>(result_containers[2])); - EXPECT_TRUE(result_containers[2]->GetVisible()); - auto* search_result_image_view = result_containers[2]->GetResultViewAt(2); - ASSERT_TRUE(search_result_image_view->GetVisible()); - ASSERT_TRUE( - views::IsViewClass<SearchResultImageView>(search_result_image_view)); - - // Perform a long tap on `search_result_image_view`. - auto image_view_center_point = - search_result_image_view->GetBoundsInScreen().CenterPoint(); - auto* event_generator = GetEventGenerator(); - ui::GestureEvent long_tap(image_view_center_point.x(), - image_view_center_point.y(), 0, base::TimeTicks(), - ui::GestureEventDetails(ui::ET_GESTURE_LONG_TAP)); - event_generator->Dispatch(&long_tap); - - // The `SearchResultImageViewDelegate` should be showing a context menu. - EXPECT_TRUE(SearchResultImageViewDelegate::Get()->HasActiveContextMenu()); -} - TEST_P(SearchResultImageViewTest, ActivateImageResult) { auto* test_helper = GetAppListTestHelper(); test_helper->ShowAppList(); @@ -593,7 +551,7 @@ auto* notifier_controller = GetSearchView()->search_notifier_controller(); EXPECT_EQ(notifier_controller->GetPrivacyNoticeShownCount(prefs), 0); EXPECT_TRUE(notifier_controller->ShouldShowPrivacyNotice()); - // TODO(crbug.com/1352636): Check that the image search is not enabled. + EXPECT_FALSE(IsImageSearchEnabled(prefs)); // Press a character key to open the search. PressAndReleaseKey(ui::VKEY_A); @@ -646,7 +604,9 @@ auto* search_notifier_controller = GetSearchView()->search_notifier_controller(); EXPECT_TRUE(search_notifier_controller->ShouldShowPrivacyNotice()); - // TODO(crbug.com/1352636): Check that the image search is not enabled. + PrefService* prefs = + Shell::Get()->session_controller()->GetLastActiveUserPrefService(); + EXPECT_FALSE(IsImageSearchEnabled(prefs)); // Press a character key to open the search. PressAndReleaseKey(ui::VKEY_A); @@ -661,8 +621,6 @@ // The privacy notice should not be shown again after accepted. EXPECT_FALSE(GetSearchView()->search_notifier_view()); EXPECT_FALSE(search_notifier_controller->ShouldShowPrivacyNotice()); - PrefService* prefs = - Shell::Get()->session_controller()->GetLastActiveUserPrefService(); EXPECT_TRUE(IsImageSearchEnabled(prefs)); }
diff --git a/ash/app_list/views/app_list_view_pixeltest.cc b/ash/app_list/views/app_list_view_pixeltest.cc index 68d133da..1b7c1bf 100644 --- a/ash/app_list/views/app_list_view_pixeltest.cc +++ b/ash/app_list/views/app_list_view_pixeltest.cc
@@ -362,7 +362,7 @@ TEST_P(AppListViewTabletPixelTest, Basic) { EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "tablet_launcher_basics", - /*revision_number=*/IsJellyEnabled() ? 8 : 6, + /*revision_number=*/IsJellyEnabled() ? 7 : 6, GetAppListTestHelper()->GetAppsContainerView())); } @@ -384,7 +384,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "tablet_launcher_top_gradient_zone", - /*revision_number=*/6, + /*revision_number=*/IsJellyEnabled() ? 6 : 5, GetAppListTestHelper()->GetAppsContainerView())); } @@ -406,7 +406,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "tablet_launcher_bottom_gradient_zone", - /*revision_number=*/IsJellyEnabled() ? 8 : 7, + /*revision_number=*/IsJellyEnabled() ? 7 : 6, GetAppListTestHelper()->GetAppsContainerView())); }
diff --git a/ash/app_list/views/search_box_view.cc b/ash/app_list/views/search_box_view.cc index b9009568..ccbb174 100644 --- a/ash/app_list/views/search_box_view.cc +++ b/ash/app_list/views/search_box_view.cc
@@ -1452,8 +1452,6 @@ break; case ResultSelectionController::MoveResult:: kSelectionCycleBeforeFirstResult: - // TODO(crbug.com/1352636): Handle the case where the search notifier - // exists. // If the result selection was about to cycle, clear the selection and // move the focus to the next element in the SearchBoxView - // close_button().
diff --git a/ash/app_list/views/search_result_container_view.cc b/ash/app_list/views/search_result_container_view.cc index f7a44d52..4d176c3 100644 --- a/ash/app_list/views/search_result_container_view.cc +++ b/ash/app_list/views/search_result_container_view.cc
@@ -143,9 +143,7 @@ } void SearchResultContainerView::AppendShownResultMetadata( - std::vector<SearchResultAimationMetadata>* result_metadata_) { - NOTREACHED(); -} + std::vector<SearchResultAimationMetadata>* result_metadata_) {} bool SearchResultContainerView::HasAnimatingChildView() { auto is_animating = [](views::View* view) {
diff --git a/ash/app_list/views/search_result_image_list_view.cc b/ash/app_list/views/search_result_image_list_view.cc index 7d3d8c8f..2ad7519 100644 --- a/ash/app_list/views/search_result_image_list_view.cc +++ b/ash/app_list/views/search_result_image_list_view.cc
@@ -193,12 +193,6 @@ return image_views_[index]; } -void SearchResultImageListView::AppendShownResultMetadata( - std::vector<SearchResultAimationMetadata>* result_metadata_) { - // TODO(crbug.com/1352636) Update once animations are defined by UX. - return; -} - std::vector<SearchResultImageView*> SearchResultImageListView::GetSearchResultImageViews() { return image_views_; @@ -244,11 +238,6 @@ } } -void SearchResultImageListView::OnSelectedResultChanged() { - // TODO(crbug.com/1352636) once result selection spec is available. - return; -} - int SearchResultImageListView::DoUpdate() { std::vector<SearchResult*> display_results = SearchModel::FilterSearchResultsByFunction(
diff --git a/ash/app_list/views/search_result_image_list_view.h b/ash/app_list/views/search_result_image_list_view.h index ce386e66..13b6cb9 100644 --- a/ash/app_list/views/search_result_image_list_view.h +++ b/ash/app_list/views/search_result_image_list_view.h
@@ -39,8 +39,6 @@ // Overridden from SearchResultContainerView: SearchResultImageView* GetResultViewAt(size_t index) override; - void AppendShownResultMetadata( - std::vector<SearchResultAimationMetadata>* result_metadata_) override; // Returns all search result image views children of this view. std::vector<SearchResultImageView*> GetSearchResultImageViews(); @@ -62,7 +60,6 @@ private: // Overridden from SearchResultContainerView: - void OnSelectedResultChanged() override; int DoUpdate() override; void UpdateResultsVisibility(bool force_hide) override; views::View* GetTitleLabel() override;
diff --git a/ash/app_list/views/search_result_image_view.cc b/ash/app_list/views/search_result_image_view.cc index 3708ddf..be85184 100644 --- a/ash/app_list/views/search_result_image_view.cc +++ b/ash/app_list/views/search_result_image_view.cc
@@ -99,7 +99,6 @@ SetCallback(base::BindRepeating(&SearchResultImageView::OnImageViewPressed, base::Unretained(this))); - set_context_menu_controller(SearchResultImageViewDelegate::Get()); set_drag_controller(SearchResultImageViewDelegate::Get()); } @@ -108,18 +107,6 @@ true /* by_button_press */); } -void SearchResultImageView::OnGestureEvent(ui::GestureEvent* event) { - SearchResultImageViewDelegate::Get()->HandleSearchResultImageViewGestureEvent( - this, *event); - SearchResultBaseView::OnGestureEvent(event); -} - -void SearchResultImageView::OnMouseEvent(ui::MouseEvent* event) { - SearchResultImageViewDelegate::Get()->HandleSearchResultImageViewMouseEvent( - this, *event); - SearchResultBaseView::OnMouseEvent(event); -} - gfx::Size SearchResultImageView::CalculatePreferredSize() const { // Keep the ratio of the width and height be 3:2. return gfx::Size(preferred_width_, 2 * preferred_width_ / 3);
diff --git a/ash/app_list/views/search_result_image_view.h b/ash/app_list/views/search_result_image_view.h index c3f7b97..b2ba443 100644 --- a/ash/app_list/views/search_result_image_view.h +++ b/ash/app_list/views/search_result_image_view.h
@@ -30,8 +30,6 @@ void OnImageViewPressed(const ui::Event& event); // Overridden from views::View: - void OnGestureEvent(ui::GestureEvent* event) override; - void OnMouseEvent(ui::MouseEvent* event) override; gfx::Size CalculatePreferredSize() const override; // Updates `preferred_width_`.
diff --git a/ash/app_list/views/search_result_image_view_delegate.cc b/ash/app_list/views/search_result_image_view_delegate.cc index 0e0e88b..82816cf 100644 --- a/ash/app_list/views/search_result_image_view_delegate.cc +++ b/ash/app_list/views/search_result_image_view_delegate.cc
@@ -33,74 +33,6 @@ g_instance = nullptr; } -// TODO(crbug.com/1352636) -void SearchResultImageViewDelegate::HandleSearchResultImageViewGestureEvent( - SearchResultImageView* view, - const ui::GestureEvent& event) {} - -// TODO(crbug.com/1352636) -void SearchResultImageViewDelegate::HandleSearchResultImageViewMouseEvent( - SearchResultImageView* view, - const ui::MouseEvent& event) { - switch (event.type()) { - case ui::ET_MOUSE_ENTERED: - // TODO(crbug.com/1352636) Paint background highlight to indicate hover. - break; - case ui::ET_MOUSE_EXITED: - // TODO(crbug.com/1352636) Remove hover background highlight. - break; - case ui::ET_MOUSE_PRESSED: - // TODO(crbug.com/1352636) implement multi-result selection. - break; - case ui::ET_MOUSE_RELEASED: - // TODO(crbug.com/1352636) implement multi-result selection. - break; - default: - break; - } -} - -bool SearchResultImageViewDelegate::HasActiveContextMenu() const { - return context_menu_runner_ && context_menu_runner_->IsRunning(); -} - -ui::SimpleMenuModel* SearchResultImageViewDelegate::BuildMenuModel() { - context_menu_model_ = std::make_unique<ui::SimpleMenuModel>(this); - // TODO(crbug.com/1352636) update with internationalized accessible name if we - // launch this feature. - context_menu_model_->AddTitle(u"Search Result Image View Context Menu"); - // TODO(crbug.com/1352636) AddItemWithStringId(command_id,string_id); - return context_menu_model_.get(); -} - -void SearchResultImageViewDelegate::OnMenuClosed() { - context_menu_model_.reset(); - context_menu_runner_.reset(); -} - -// TODO(crbug.com/1352636) Add context menu support. -void SearchResultImageViewDelegate::ShowContextMenuForViewImpl( - views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) { - if (HasActiveContextMenu()) - return; - - int run_types = views::MenuRunner::USE_ASH_SYS_UI_LAYOUT | - views::MenuRunner::CONTEXT_MENU | - views::MenuRunner::FIXED_ANCHOR; - - context_menu_runner_ = std::make_unique<views::MenuRunner>( - BuildMenuModel(), run_types, - base::BindRepeating(&SearchResultImageViewDelegate::OnMenuClosed, - weak_ptr_factory_.GetWeakPtr())); - - context_menu_runner_->RunMenuAt( - source->GetWidget(), /*button_controller=*/nullptr, - /*bounds=*/gfx::Rect(point, gfx::Size()), - views::MenuAnchorPosition::kBubbleBottomRight, source_type); -} - bool SearchResultImageViewDelegate::CanStartDragForView( views::View* sender, const gfx::Point& press_pt, @@ -130,10 +62,4 @@ return; } -// TODO(crbug.com/1352636) Add context menu support. -void SearchResultImageViewDelegate::ExecuteCommand(int command_id, - int event_flags) { - return; -} - } // namespace ash
diff --git a/ash/app_list/views/search_result_image_view_delegate.h b/ash/app_list/views/search_result_image_view_delegate.h index 611c419..fd394f79 100644 --- a/ash/app_list/views/search_result_image_view_delegate.h +++ b/ash/app_list/views/search_result_image_view_delegate.h
@@ -5,34 +5,19 @@ #ifndef ASH_APP_LIST_VIEWS_SEARCH_RESULT_IMAGE_VIEW_DELEGATE_H_ #define ASH_APP_LIST_VIEWS_SEARCH_RESULT_IMAGE_VIEW_DELEGATE_H_ -#include <memory> - #include "ash/ash_export.h" #include "ui/base/models/simple_menu_model.h" #include "ui/views/context_menu_controller.h" #include "ui/views/drag_controller.h" -namespace ui { -class GestureEvent; -class MouseEvent; -} // namespace ui - -namespace views { -class MenuRunner; -} // namespace views - namespace ash { class SearchResultImageView; -// TODO(crbug.com/1352636) implement class functionality. -// A delegate for `SearchResultImageView` which implements context menu, drag -// and drop, and selection functionality. Only a single delegate instance -// exists at a time and is shared by all existing search result image views in -// order to support multiselection which requires a shared state. -class ASH_EXPORT SearchResultImageViewDelegate - : public views::ContextMenuController, - public views::DragController, - public ui::SimpleMenuModel::Delegate { +// A delegate for `SearchResultImageView` which implements drag and drop. Only a +// single delegate instance exists at a time and is shared by all existing +// search result image views in order to support multiselection which requires a +// shared state. +class ASH_EXPORT SearchResultImageViewDelegate : public views::DragController { public: // Returns the singleton instance. static SearchResultImageViewDelegate* Get(); @@ -43,30 +28,7 @@ const SearchResultImageViewDelegate&) = delete; ~SearchResultImageViewDelegate() override; - // Invoked when `view` receives the specified gesture `event`. - void HandleSearchResultImageViewGestureEvent(SearchResultImageView* view, - const ui::GestureEvent& event); - - // Invoked when `view` receives the specified mouse pressed `event`. - void HandleSearchResultImageViewMouseEvent(SearchResultImageView* view, - const ui::MouseEvent& event); - - // Checks for an active `context_menu_runner_`. - bool HasActiveContextMenu() const; - private: - // Builds and returns a raw pointer to `context_menu_model_`. - ui::SimpleMenuModel* BuildMenuModel(); - - // Called when the context menu is closed. Used as a callback for - // `context_menu_runner_`. - void OnMenuClosed(); - - // views::ContextMenuController: - void ShowContextMenuForViewImpl(views::View* source, - const gfx::Point& point, - ui::MenuSourceType source_type) override; - // views::DragController: bool CanStartDragForView(views::View* sender, const gfx::Point& press_pt, @@ -76,14 +38,6 @@ void WriteDragDataForView(views::View* sender, const gfx::Point& press_pt, ui::OSExchangeData* data) override; - - // SimpleMenuModel::Delegate: - void ExecuteCommand(int command_id, int event_flags) override; - - std::unique_ptr<ui::SimpleMenuModel> context_menu_model_; - std::unique_ptr<views::MenuRunner> context_menu_runner_; - - base::WeakPtrFactory<SearchResultImageViewDelegate> weak_ptr_factory_{this}; }; } // namespace ash
diff --git a/ash/ash_strings.grd b/ash/ash_strings.grd index d86e4eab..39f1029c 100644 --- a/ash/ash_strings.grd +++ b/ash/ash_strings.grd
@@ -2595,6 +2595,9 @@ <message name="IDS_ASH_DESKS_DESK_NAME" desc="Alert when highlighting the desk name"> Desk name </message> + <message name="IDS_ASH_DESKS_DESK_PREVIEW" desc="The desk preview accessible name"> + Desk preview + </message> <message name="IDS_ASH_DESKS_DESK_ACCESSIBLE_NAME" desc="The full accessible desk name"> Desk: <ph name="DESK_NAME">$1</ph> </message> @@ -3024,8 +3027,14 @@ <message name="IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE" desc="Message displayed in the notification when hotspot is turned on and one device is connected."> 1 device connected </message> - <message name="IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES" desc="Message displayed in the notification when hotspot is turned on and no devices are connected."> - No devices connected + <message name="IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES_NOTIFICATION" desc="Message displayed in the notification when hotspot is turned on and no devices are connected."> + No devices connected. WiFi will be turned off to start using Hotspot. + </message> + <message name="IDS_ASH_HOTSPOT_ON_MESSAGE_MULTIPLE_CONNECTED_DEVICES_NOTIFICATION" desc="Message displayed in the notification when hotspot is turned on and multiple devices are connected."> + <ph name="DEVICECOUNT">$1</ph> devices connected. WiFi will be turned off to start using Hotspot. + </message> + <message name="IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE_NOTIFICATION" desc="Message displayed in the notification when hotspot is turned on and one device is connected."> + 1 device connected. WiFi will be turned off to start using Hotspot. </message> <message name="IDS_ASH_TURN_OFF_HOTSPOT_LABEL" desc="The label for button used to turn off hotspot."> Turn off @@ -3039,9 +3048,6 @@ <message name="IDS_ASH_HOTSPOT_NOTIFICATION_WIFI_TURN_ON_BUTTON" desc="The label for button to turn WiFi on in the hotspot notification."> Turn on WiFi instead </message> - <message name="IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE" desc="Message displayed in the system notification shown when WiFi is turned off upon enabling hotspot."> - We've turned off the WiFi to start using Hotspot through Mobile data. This may incur data costs. - </message> <message name="IDS_ASH_HOTSPOT_WIFI_TURNED_ON_MESSAGE" desc="Message displayed in the system notification shown when hotspot is disabled due to WiFi being turned on."> Hotspot has been turned off to use WiFi. To use Hotspot, turn WiFi off. </message>
diff --git a/ash/ash_strings_grd/IDS_ASH_DESKS_DESK_PREVIEW.png.sha1 b/ash/ash_strings_grd/IDS_ASH_DESKS_DESK_PREVIEW.png.sha1 new file mode 100644 index 0000000..058a0976 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_DESKS_DESK_PREVIEW.png.sha1
@@ -0,0 +1 @@ +c14144b250b790a2418b3df1a4faf92ba4a50d26 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_MULTIPLE_CONNECTED_DEVICES_NOTIFICATION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_MULTIPLE_CONNECTED_DEVICES_NOTIFICATION.png.sha1 new file mode 100644 index 0000000..46c5007 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_MULTIPLE_CONNECTED_DEVICES_NOTIFICATION.png.sha1
@@ -0,0 +1 @@ +f2493be3f05b34ae8b2f5bf11a0ce78de5793a21 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES.png.sha1 deleted file mode 100644 index f7f592a..0000000 --- a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -5a60463112cfbbd5b9a8ed3943f9d1079bfdf297 \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES_NOTIFICATION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES_NOTIFICATION.png.sha1 new file mode 100644 index 0000000..5ac9344 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES_NOTIFICATION.png.sha1
@@ -0,0 +1 @@ +378ba35d98490cd74ab6a449ded68735d296f58c \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE_NOTIFICATION.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE_NOTIFICATION.png.sha1 new file mode 100644 index 0000000..7dbfdec4 --- /dev/null +++ b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE_NOTIFICATION.png.sha1
@@ -0,0 +1 @@ +14e10a123990d633cdc0c0c01b3e9d921605ed6a \ No newline at end of file
diff --git a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE.png.sha1 b/ash/ash_strings_grd/IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE.png.sha1 deleted file mode 100644 index 339c216..0000000 --- a/ash/ash_strings_grd/IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE.png.sha1 +++ /dev/null
@@ -1 +0,0 @@ -dad69cfe3fea482fe4f8016432a7f3f4abeccc50 \ No newline at end of file
diff --git a/ash/components/arc/arc_features.cc b/ash/components/arc/arc_features.cc index 456ef1e..bf812238 100644 --- a/ash/components/arc/arc_features.cc +++ b/ash/components/arc/arc_features.cc
@@ -287,6 +287,11 @@ "ArcTrackpadScrollTouchscreenEmulation", base::FEATURE_DISABLED_BY_DEFAULT); +// Controls whether ARC should be enabled on unaffiliated devices on client side +BASE_FEATURE(kUnaffiliatedDeviceArcRestriction, + "UnaffiliatedDeviceArcRestriction", + base::FEATURE_DISABLED_BY_DEFAULT); + // Controls ARC USB Storage UI feature. // When enabled, chrome://settings and Files.app will ask if the user wants // to expose USB storage devices to ARC.
diff --git a/ash/components/arc/arc_features.h b/ash/components/arc/arc_features.h index 4b5b1fa9..e83fd970 100644 --- a/ash/components/arc/arc_features.h +++ b/ash/components/arc/arc_features.h
@@ -63,6 +63,7 @@ BASE_DECLARE_FEATURE(kSyncInstallPriority); BASE_DECLARE_FEATURE(kTouchscreenEmulation); BASE_DECLARE_FEATURE(kTrackpadScrollTouchscreenEmulation); +BASE_DECLARE_FEATURE(kUnaffiliatedDeviceArcRestriction); BASE_DECLARE_FEATURE(kUsbStorageUIFeature); BASE_DECLARE_FEATURE(kUseDalvikMemoryProfile); BASE_DECLARE_FEATURE(kUseDefaultBlockSize);
diff --git a/ash/constants/BUILD.gn b/ash/constants/BUILD.gn index 1f000448..d1b0019 100644 --- a/ash/constants/BUILD.gn +++ b/ash/constants/BUILD.gn
@@ -10,6 +10,7 @@ output_name = "ash_constants" defines = [ "IS_ASH_CONSTANTS_IMPL" ] sources = [ + "ambient_time_of_day_constants.h", "ambient_video.cc", "ambient_video.h", "app_types.h",
diff --git a/ash/constants/ambient_time_of_day_constants.h b/ash/constants/ambient_time_of_day_constants.h new file mode 100644 index 0000000..d71f7e53 --- /dev/null +++ b/ash/constants/ambient_time_of_day_constants.h
@@ -0,0 +1,15 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_CONSTANTS_AMBIENT_TIME_OF_DAY_CONSTANTS_H_ +#define ASH_CONSTANTS_AMBIENT_TIME_OF_DAY_CONSTANTS_H_ + +namespace ash { + +// DLC package id containing assets for the time of day screen saver. +inline constexpr char kTimeOfDayDlcId[] = "timeofday-dlc"; + +} // namespace ash + +#endif // ASH_CONSTANTS_AMBIENT_TIME_OF_DAY_CONSTANTS_H_
diff --git a/ash/constants/ash_features.cc b/ash/constants/ash_features.cc index 0d5f7b7..8396656 100644 --- a/ash/constants/ash_features.cc +++ b/ash/constants/ash_features.cc
@@ -108,7 +108,7 @@ BASE_FEATURE(kAltClickAndSixPackCustomization, "AltClickAndSixPackCustomization", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); // Controls whether to enable AutoEnrollment for Kiosk in OOBE BASE_FEATURE(kAutoEnrollmentKioskInOobe, @@ -2894,7 +2894,7 @@ // Enables settings to be split per device. BASE_FEATURE(kInputDeviceSettingsSplit, "InputDeviceSettingsSplit", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); // Enables bug fix for dead keys on the Terminal app. // When enabled, dead keys correctly emit the 'Dead' event on key down for the
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h index 15ee6e5..430da441 100644 --- a/ash/constants/ash_pref_names.h +++ b/ash/constants/ash_pref_names.h
@@ -1887,6 +1887,13 @@ inline constexpr char kTouchpadDefaultSettings[] = "ash.settings.touchpad.defaults"; +// An integer pref that controls the state (Disabled, Ctrl, etc) of the +// F11/F12 settings found in the customize keyboard keys subpage in device +// settings. Can be controlled through device policy +// DeviceExtendedFkeysMofidier. +inline constexpr char kExtendedFkeysModifier[] = + "ash.settings.extended_fkeys_modifier"; + // NOTE: New prefs should start with the "ash." prefix. Existing prefs moved // into this file should not be renamed, since they may be synced.
diff --git a/ash/public/mojom/input_device_settings.mojom b/ash/public/mojom/input_device_settings.mojom index 6e530d6f..dee8688 100644 --- a/ash/public/mojom/input_device_settings.mojom +++ b/ash/public/mojom/input_device_settings.mojom
@@ -38,6 +38,12 @@ bool value; }; +// Represents the policy that controls the F11/F12 settings. +struct InputDeviceSettingsFkeyPolicy { + PolicyStatus policy_status; + ui.mojom.ExtendedFkeysModifier value; +}; + // Represents the current set of keyboard enterprise policies. All members are // optional. When null, there is no enterprise policy set for the given setting. struct KeyboardPolicies { @@ -48,6 +54,10 @@ // policy_definitions/Miscellaneous/ // DeviceSwitchFunctionKeysBehaviorEnabled.yaml InputDeviceSettingsPolicy? enable_meta_fkey_rewrites_policy; + // This policy is defined at components/policy/resources/templates/ + // policy_definitions/Miscellaneous/ + // DeviceExtendedFkeysModifier.yaml + InputDeviceSettingsFkeyPolicy? extended_fkeys_policy; }; // Represents the current set of mouse enterprise policies. All members are
diff --git a/ash/shelf/login_shelf_view_pixeltest.cc b/ash/shelf/login_shelf_view_pixeltest.cc index b433357..a32f92fc 100644 --- a/ash/shelf/login_shelf_view_pixeltest.cc +++ b/ash/shelf/login_shelf_view_pixeltest.cc
@@ -77,28 +77,28 @@ PressAndReleaseKey(ui::VKEY_TAB); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "focus_on_login_user_expand_button", - /*revision_number=*/7, primary_big_user_view_.get(), + /*revision_number=*/6, primary_big_user_view_.get(), primary_shelf_window)); // Trigger the tab key. Check that the login shelf shutdown button is focused. PressAndReleaseKey(ui::VKEY_TAB); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "focus_on_shutdown_button", - /*revision_number=*/7, primary_big_user_view_.get(), + /*revision_number=*/6, primary_big_user_view_.get(), primary_shelf_window)); // Trigger the tab key. Check that the browser as guest button is focused. PressAndReleaseKey(ui::VKEY_TAB); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "focus_on_browser_as_guest_button", - /*revision_number=*/7, primary_big_user_view_.get(), + /*revision_number=*/6, primary_big_user_view_.get(), primary_shelf_window)); // Trigger the tab key. Check that the add person button is focused. PressAndReleaseKey(ui::VKEY_TAB); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "focus_on_add_person_button", - /*revision_number=*/7, primary_big_user_view_.get(), + /*revision_number=*/6, primary_big_user_view_.get(), primary_shelf_window)); } @@ -119,7 +119,7 @@ PressAndReleaseKey(ui::VKEY_TAB); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "focus_on_time_view.rev_0", - /*revision_number=*/5, primary_shelf_window)); + /*revision_number=*/4, primary_shelf_window)); PressAndReleaseKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN); PressAndReleaseKey(ui::VKEY_TAB, ui::EF_SHIFT_DOWN); @@ -127,7 +127,7 @@ // Move the focus back to the add person button. EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "refocus_on_login_shelf", - /*revision_number=*/5, primary_shelf_window)); + /*revision_number=*/4, primary_shelf_window)); } class LoginShelfWithPolicyWallpaperPixelTestWithRTL
diff --git a/ash/shelf/scrollable_shelf_view_pixeltest.cc b/ash/shelf/scrollable_shelf_view_pixeltest.cc index c147a0908..3e755c9 100644 --- a/ash/shelf/scrollable_shelf_view_pixeltest.cc +++ b/ash/shelf/scrollable_shelf_view_pixeltest.cc
@@ -113,7 +113,7 @@ // Verify the shelf context menu and the shelf. EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "shelf_context_menu", - /*revision_number=*/12, + /*revision_number=*/11, GetPrimaryShelf() ->shelf_widget() ->shelf_view_for_testing()
diff --git a/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc b/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc index 7b73421..ef51ad03 100644 --- a/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc +++ b/ash/system/accessibility/accessibility_detailed_view_pixeltest.cc
@@ -61,7 +61,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/6, detailed_view_container)); + /*revision_number=*/5, detailed_view_container)); } } // namespace ash
diff --git a/ash/system/audio/audio_detailed_view_pixeltest.cc b/ash/system/audio/audio_detailed_view_pixeltest.cc index 2df655b..0b419781 100644 --- a/ash/system/audio/audio_detailed_view_pixeltest.cc +++ b/ash/system/audio/audio_detailed_view_pixeltest.cc
@@ -58,7 +58,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "qs_audio_detailed_view", - /*revision_number=*/9, detailed_view)); + /*revision_number=*/8, detailed_view)); } TEST_F(AudioDetailedViewPixelTest, ShowNoiseCancellationButton) { @@ -93,7 +93,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "qs_audio_detailed_view", - /*revision_number=*/3, detailed_view)); + /*revision_number=*/2, detailed_view)); } } // namespace ash
diff --git a/ash/system/audio/unified_audio_detailed_view_controller_unittest.cc b/ash/system/audio/unified_audio_detailed_view_controller_unittest.cc index 447fcebb..ee697ec 100644 --- a/ash/system/audio/unified_audio_detailed_view_controller_unittest.cc +++ b/ash/system/audio/unified_audio_detailed_view_controller_unittest.cc
@@ -735,20 +735,15 @@ CrasAudioHandler::ACTIVATE_BY_USER); EXPECT_EQ(kHeadphoneId, cras_audio_handler_->GetPrimaryActiveOutputNode()); - // Sets the device level to 0 to mute the device. - cras_audio_handler_->SetVolumeGainPercentForDevice(kHeadphoneId, /*value=*/0); - - // For QsRevamp: level is 0 state should be equal to the muted state. - if (IsQsRevampEnabled()) { - EXPECT_TRUE(cras_audio_handler_->IsOutputMutedForDevice(kHeadphoneId)); - } else { - EXPECT_FALSE(cras_audio_handler_->IsOutputMutedForDevice(kHeadphoneId)); - } - - // Unmute the device by setting a volume level greater than 0. + // Sets a volume level greater than 0 and the device is unmuted. cras_audio_handler_->SetVolumeGainPercentForDevice(kHeadphoneId, /*value=*/10); EXPECT_FALSE(cras_audio_handler_->IsOutputMutedForDevice(kHeadphoneId)); + + // Sets the device level to 0. The mute state is controlled by the mute + // button so the output is still unmuted. + cras_audio_handler_->SetVolumeGainPercentForDevice(kHeadphoneId, /*value=*/0); + EXPECT_FALSE(cras_audio_handler_->IsOutputMutedForDevice(kHeadphoneId)); } class UnifiedAudioDetailedViewControllerSodaTest
diff --git a/ash/system/audio/unified_volume_view.cc b/ash/system/audio/unified_volume_view.cc index d49a3e71..352ca80 100644 --- a/ash/system/audio/unified_volume_view.cc +++ b/ash/system/audio/unified_volume_view.cc
@@ -179,7 +179,11 @@ IDS_ASH_STATUS_TRAY_VOLUME, state_tooltip_text)); } else { level = audio_handler->GetOutputVolumePercentForDevice(device_id_) / 100.f; - const bool is_muted = audio_handler->IsOutputMutedForDevice(device_id_); + + // Still needs to check if `level` is 0 because toggling the output mute by + // keyboard will not set it to be muted in `UnifiedVolumeSliderController`. + const bool is_muted = + audio_handler->IsOutputMutedForDevice(device_id_) || level == 0; auto active_device_id = audio_handler->GetPrimaryActiveOutputNode(); @@ -271,11 +275,6 @@ void UnifiedVolumeView::OnOutputNodeVolumeChanged(uint64_t node_id, int volume) { - // For QsRevamp: we don't distinguish volume is 0 and muted state. Also unmute - // the output node if volume is not 0. - if (features::IsQsRevampEnabled()) { - CrasAudioHandler::Get()->SetOutputMute(/*mute_on=*/volume == 0); - } Update(/*by_user=*/true); }
diff --git a/ash/system/audio/unified_volume_view_unittest.cc b/ash/system/audio/unified_volume_view_unittest.cc index 32ed6dfb..a5355d3 100644 --- a/ash/system/audio/unified_volume_view_unittest.cc +++ b/ash/system/audio/unified_volume_view_unittest.cc
@@ -160,7 +160,8 @@ } // Tests that pressing the keyboard volume mute key will mute the slider, and -// pressing the volume up key will restore the volume level. +// pressing the volume up key will unmute and increase the volume level by one +// step. TEST_F(UnifiedVolumeViewTest, VolumeMuteThenVolumeUp) { // Sets the volume level by user. const float level = 0.8; @@ -170,22 +171,26 @@ EXPECT_EQ(slider()->GetValue(), level); CheckSliderIcon(level); + const bool is_muted = CrasAudioHandler::Get()->IsOutputMuted(); PressAndReleaseKey(ui::KeyboardCode::VKEY_VOLUME_MUTE); - // The slider level should remain as `level`. + // The slider level should remain as `level` and the mute state toggles. EXPECT_EQ(slider()->GetValue(), level); CheckSliderIcon(level); + EXPECT_EQ(CrasAudioHandler::Get()->IsOutputMuted(), !is_muted); PressAndReleaseKey(ui::KeyboardCode::VKEY_VOLUME_UP); // The slider level should increase by `kVolumeStepChange` and the icon should - // change accordingly. + // change accordingly. The mute state toggles back to the original state. const float new_level = level + kVolumeStepChange; EXPECT_FLOAT_EQ(slider()->GetValue(), new_level); CheckSliderIcon(new_level); + EXPECT_EQ(CrasAudioHandler::Get()->IsOutputMuted(), is_muted); } // Tests that pressing the keyboard volume mute key will mute the slider, and -// pressing the volume down key will preserve the mute state. +// pressing the volume down key will preserve the mute state and decrease the +// volume level by one step. TEST_F(UnifiedVolumeViewTest, VolumeMuteThenVolumeDown) { // Sets the volume level by user. const float level = 0.8; @@ -195,18 +200,22 @@ EXPECT_EQ(slider()->GetValue(), level); CheckSliderIcon(level); + const bool is_muted = CrasAudioHandler::Get()->IsOutputMuted(); PressAndReleaseKey(ui::KeyboardCode::VKEY_VOLUME_MUTE); - // The slider level should remain as `level`. + // The slider level should remain as `level` and the mute state toggles. EXPECT_EQ(slider()->GetValue(), level); CheckSliderIcon(level); + EXPECT_EQ(CrasAudioHandler::Get()->IsOutputMuted(), !is_muted); PressAndReleaseKey(ui::KeyboardCode::VKEY_VOLUME_DOWN); // The slider level should decrease by `kVolumeStepChange` and the icon should - // change accordingly. + // change accordingly. The mute state remains the same as before pressing the + // volume down. const float new_level = level - kVolumeStepChange; EXPECT_FLOAT_EQ(slider()->GetValue(), new_level); CheckSliderIcon(new_level); + EXPECT_EQ(CrasAudioHandler::Get()->IsOutputMuted(), !is_muted); } // Tests when the slider is focused, press enter will toggle the mute state.
diff --git a/ash/system/bluetooth/bluetooth_detailed_view_impl_pixeltest.cc b/ash/system/bluetooth/bluetooth_detailed_view_impl_pixeltest.cc index 7978084..72c370f 100644 --- a/ash/system/bluetooth/bluetooth_detailed_view_impl_pixeltest.cc +++ b/ash/system/bluetooth/bluetooth_detailed_view_impl_pixeltest.cc
@@ -95,7 +95,7 @@ // Compare pixels. EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/6, detailed_view)); + /*revision_number=*/5, detailed_view)); } } // namespace
diff --git a/ash/system/brightness/display_detailed_view_pixeltest.cc b/ash/system/brightness/display_detailed_view_pixeltest.cc index 165af82..0bf68737d 100644 --- a/ash/system/brightness/display_detailed_view_pixeltest.cc +++ b/ash/system/brightness/display_detailed_view_pixeltest.cc
@@ -51,7 +51,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "qs_display_detailed_view", - /*revision_number=*/8, detailed_view)); + /*revision_number=*/7, detailed_view)); } } // namespace ash
diff --git a/ash/system/cast/cast_detailed_view_pixeltest.cc b/ash/system/cast/cast_detailed_view_pixeltest.cc index 8b2b891..e82133c 100644 --- a/ash/system/cast/cast_detailed_view_pixeltest.cc +++ b/ash/system/cast/cast_detailed_view_pixeltest.cc
@@ -68,7 +68,7 @@ ASSERT_TRUE(detailed_view); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/7, detailed_view)); + /*revision_number=*/6, detailed_view)); } } // namespace
diff --git a/ash/system/cast/cast_zero_state_view_pixeltest.cc b/ash/system/cast/cast_zero_state_view_pixeltest.cc index 02b388e..67532de5 100644 --- a/ash/system/cast/cast_zero_state_view_pixeltest.cc +++ b/ash/system/cast/cast_zero_state_view_pixeltest.cc
@@ -53,7 +53,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "cast_zero_state_view", - /*revision_number=*/9, detailed_view)); + /*revision_number=*/8, detailed_view)); } } // namespace ash
diff --git a/ash/system/hotspot/hotspot_notifier.cc b/ash/system/hotspot/hotspot_notifier.cc index 0535800e..46811b3 100644 --- a/ash/system/hotspot/hotspot_notifier.cc +++ b/ash/system/hotspot/hotspot_notifier.cc
@@ -16,8 +16,6 @@ namespace ash { // static -const char HotspotNotifier::kWiFiTurnedOffNotificationId[] = - "cros_hotspot_notifier_ids.wifi_turned_off"; const char HotspotNotifier::kAdminRestrictedNotificationId[] = "cros_hotspot_notifier_ids.admin_restricted"; @@ -52,31 +50,7 @@ HotspotNotifier::~HotspotNotifier() = default; -void HotspotNotifier::OnHotspotTurnedOn(bool wifi_turned_off) { - if (wifi_turned_off) { - scoped_refptr<message_center::NotificationDelegate> delegate = - base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( - base::BindRepeating(&HotspotNotifier::EnableWiFiHandler, - weak_ptr_factory_.GetWeakPtr(), - kWiFiTurnedOffNotificationId)); - - std::vector<message_center::ButtonInfo> notification_actions; - std::unique_ptr<message_center::Notification> notification = - CreateNotification( - l10n_util::GetStringUTF16(IDS_ASH_HOTSPOT_ON_TITLE), - l10n_util::GetStringUTF16(IDS_ASH_HOTSPOT_WIFI_TURNED_OFF_MESSAGE), - kWiFiTurnedOffNotificationId, delegate); - notification_actions.push_back( - message_center::ButtonInfo(l10n_util::GetStringUTF16( - IDS_ASH_HOTSPOT_NOTIFICATION_WIFI_TURN_ON_BUTTON))); - notification->set_buttons(notification_actions); - message_center::MessageCenter* message_center = - message_center::MessageCenter::Get(); - message_center->RemoveNotification(kWiFiTurnedOffNotificationId, - /*by_user=*/false); - message_center->AddNotification(std::move(notification)); - } -} +void HotspotNotifier::OnHotspotTurnedOn() {} void HotspotNotifier::OnHotspotTurnedOff( hotspot_config::mojom::DisableReason disable_reason) { @@ -162,12 +136,12 @@ const std::u16string& message = (hotspot_info->client_count == 0) ? l10n_util::GetStringUTF16( - IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES) + IDS_ASH_HOTSPOT_ON_MESSAGE_NO_CONNECTED_DEVICES_NOTIFICATION) : (hotspot_info->client_count == 1) ? l10n_util::GetStringUTF16( - IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE) + IDS_ASH_HOTSPOT_ON_MESSAGE_ONE_CONNECTED_DEVICE_NOTIFICATION) : l10n_util::GetStringFUTF16( - IDS_ASH_HOTSPOT_ON_MESSAGE_MULTIPLE_CONNECTED_DEVICES, + IDS_ASH_HOTSPOT_ON_MESSAGE_MULTIPLE_CONNECTED_DEVICES_NOTIFICATION, base::NumberToString16(hotspot_info->client_count)); scoped_refptr<message_center::NotificationDelegate> delegate = base::MakeRefCounted<message_center::HandleNotificationClickDelegate>( @@ -257,7 +231,7 @@ chromeos::network_config::mojom::DeviceStateType::kEnabled) { message_center::MessageCenter* message_center = message_center::MessageCenter::Get(); - message_center->RemoveNotification(kWiFiTurnedOffNotificationId, + message_center->RemoveNotification(kHotspotTurnedOnNotificationId, /*by_user=*/false); return; }
diff --git a/ash/system/hotspot/hotspot_notifier.h b/ash/system/hotspot/hotspot_notifier.h index 602ed727..5104e5c 100644 --- a/ash/system/hotspot/hotspot_notifier.h +++ b/ash/system/hotspot/hotspot_notifier.h
@@ -34,7 +34,6 @@ HotspotNotifier& operator=(const HotspotNotifier&) = delete; ~HotspotNotifier() override; - static const char kWiFiTurnedOffNotificationId[]; static const char kAdminRestrictedNotificationId[]; static const char kWiFiTurnedOnNotificationId[]; static const char kAutoDisabledNotificationId[]; @@ -45,7 +44,7 @@ friend class HotspotNotifierTest; // HotspotEnabledStateObserver: - void OnHotspotTurnedOn(bool wifi_turned_off) override; + void OnHotspotTurnedOn() override; void OnHotspotTurnedOff( hotspot_config::mojom::DisableReason disable_reason) override;
diff --git a/ash/system/hotspot/hotspot_notifier_unittest.cc b/ash/system/hotspot/hotspot_notifier_unittest.cc index e33c6b2bf..e5daf31 100644 --- a/ash/system/hotspot/hotspot_notifier_unittest.cc +++ b/ash/system/hotspot/hotspot_notifier_unittest.cc
@@ -150,26 +150,6 @@ mojo::Remote<hotspot_config::mojom::CrosHotspotConfig> cros_hotspot_config_; }; -TEST_F(HotspotNotifierTest, WiFiTurnedOff) { - SetValidHotspotCapabilities(); - SetReadinessCheckResultReady(); - AddActiveCellularService(); - helper()->manager_test()->SetSimulateTetheringEnableResult( - FakeShillSimulatedResult::kSuccess, shill::kTetheringEnableResultSuccess); - base::RunLoop().RunUntilIdle(); - - EnableHotspot(); - EXPECT_TRUE(message_center::MessageCenter::Get()->FindVisibleNotificationById( - HotspotNotifier::kWiFiTurnedOffNotificationId)); - - message_center::MessageCenter::Get()->ClickOnNotificationButton( - HotspotNotifier::kWiFiTurnedOffNotificationId, 0); - base::RunLoop().RunUntilIdle(); - EXPECT_FALSE( - message_center::MessageCenter::Get()->FindVisibleNotificationById( - HotspotNotifier::kWiFiTurnedOffNotificationId)); -} - TEST_F(HotspotNotifierTest, AdminRestricted) { SetValidHotspotCapabilities(); SetReadinessCheckResultReady(); @@ -179,8 +159,6 @@ base::RunLoop().RunUntilIdle(); EnableHotspot(); - EXPECT_TRUE(message_center::MessageCenter::Get()->FindVisibleNotificationById( - HotspotNotifier::kWiFiTurnedOffNotificationId)); NotifyHotspotTurnedOff( hotspot_config::mojom::DisableReason::kProhibitedByPolicy); @@ -198,8 +176,6 @@ base::RunLoop().RunUntilIdle(); EnableHotspot(); - EXPECT_TRUE(message_center::MessageCenter::Get()->FindVisibleNotificationById( - HotspotNotifier::kWiFiTurnedOffNotificationId)); NotifyHotspotTurnedOff(hotspot_config::mojom::DisableReason::kWifiEnabled); base::RunLoop().RunUntilIdle(); @@ -216,8 +192,6 @@ base::RunLoop().RunUntilIdle(); EnableHotspot(); - EXPECT_TRUE(message_center::MessageCenter::Get()->FindVisibleNotificationById( - HotspotNotifier::kWiFiTurnedOffNotificationId)); NotifyHotspotTurnedOff(hotspot_config::mojom::DisableReason::kAutoDisabled); base::RunLoop().RunUntilIdle(); @@ -241,8 +215,6 @@ base::RunLoop().RunUntilIdle(); EnableHotspot(); - EXPECT_TRUE(message_center::MessageCenter::Get()->FindVisibleNotificationById( - HotspotNotifier::kWiFiTurnedOffNotificationId)); NotifyHotspotTurnedOff(hotspot_config::mojom::DisableReason::kInternalError); base::RunLoop().RunUntilIdle();
diff --git a/ash/system/ime/ime_detailed_view_pixeltest.cc b/ash/system/ime/ime_detailed_view_pixeltest.cc index 0b432e86..87b5c17 100644 --- a/ash/system/ime/ime_detailed_view_pixeltest.cc +++ b/ash/system/ime/ime_detailed_view_pixeltest.cc
@@ -77,7 +77,7 @@ ASSERT_TRUE(detailed_view); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/8, detailed_view)); + /*revision_number=*/7, detailed_view)); } } // namespace
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager.cc b/ash/system/input_device_settings/input_device_settings_metrics_manager.cc index 9d92a0b..9eeb124d 100644 --- a/ash/system/input_device_settings/input_device_settings_metrics_manager.cc +++ b/ash/system/input_device_settings/input_device_settings_metrics_manager.cc
@@ -358,6 +358,26 @@ std::move(updated_settings_update_info_dict)); } +void RecordCurrentButtonRemappingAction( + const mojom::ButtonRemappingPtr& button_remapping, + const char* peripheral_kind) { + const std::string metric_name_prefix = base::StrCat( + {"ChromeOS.Settings.Device.", peripheral_kind, ".ButtonRemapping."}); + switch (button_remapping->remapping_action->which()) { + case mojom::RemappingAction::Tag::kAcceleratorAction: + // TODO(cambickel): Add metric recording for AcceleratorAction. + break; + case mojom::RemappingAction::Tag::kStaticShortcutAction: + base::UmaHistogramEnumeration( + base::StrCat({metric_name_prefix, "StaticShortcutAction.Initial"}), + button_remapping->remapping_action->get_static_shortcut_action()); + break; + case mojom::RemappingAction::Tag::kKeyEvent: + // TODO(cambickel): Add metric recording for KeyEvent. + break; + } +} + } // namespace InputDeviceSettingsMetricsManager::InputDeviceSettingsMetricsManager() = @@ -554,6 +574,11 @@ base::UmaHistogramBoolean( "ChromeOS.Settings.Device.Mouse.SwapPrimaryButtons.Initial", mouse.settings->swap_right); + + for (const auto& button_remapping : mouse.settings->button_remappings) { + RecordCurrentButtonRemappingAction(button_remapping, + /*peripheral_kind=*/"Mouse"); + } } void InputDeviceSettingsMetricsManager::RecordMouseChangedMetrics( @@ -818,7 +843,16 @@ } recorded_graphics_tablets_[account_id].insert(graphics_tablet.device_key); - // TODO(cambickel): Add graphics tablet initial metrics logging. + for (const auto& button_remapping : + graphics_tablet.settings->pen_button_remappings) { + RecordCurrentButtonRemappingAction(button_remapping, + /*peripheral_kind=*/"GraphicsTabletPen"); + } + for (const auto& button_remapping : + graphics_tablet.settings->tablet_button_remappings) { + RecordCurrentButtonRemappingAction(button_remapping, + /*peripheral_kind=*/"GraphicsTablet"); + } } void InputDeviceSettingsMetricsManager::RecordGraphicsTabletChangedMetrics(
diff --git a/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc b/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc index b878f9a..6909fc0 100644 --- a/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc +++ b/ash/system/input_device_settings/input_device_settings_metrics_manager_unittest.cc
@@ -312,10 +312,10 @@ mouse.device_key = kExternalMouseId; mouse.settings = mojom::MouseSettings::New(); mouse.settings->sensitivity = kSampleSensitivity; - mouse.settings->button_remappings.push_back( - mojom::ButtonRemapping::New("my-vkey", mojom::Button::NewVkey(ui::VKEY_A), - mojom::RemappingAction::NewAcceleratorAction( - AcceleratorAction::kBrightnessDown))); + mouse.settings->button_remappings.push_back(mojom::ButtonRemapping::New( + "my-vkey", mojom::Button::NewVkey(ui::VKEY_A), + mojom::RemappingAction::NewStaticShortcutAction( + mojom::StaticShortcutAction::kPaste))); mouse.settings->button_remappings.push_back(mojom::ButtonRemapping::New( "middle-button", mojom::Button::NewCustomizableButton(mojom::CustomizableButton::kMiddle), @@ -328,6 +328,15 @@ histogram_tester.ExpectTotalCount( "ChromeOS.Settings.Device.Mouse.Sensitivity.Initial", /*expected_count=*/1u); + histogram_tester.ExpectTotalCount( + "ChromeOS.Settings.Device.Mouse.ButtonRemapping." + "StaticShortcutAction.Initial", + /*expected_count=*/1); + histogram_tester.ExpectBucketCount( + "ChromeOS.Settings.Device.Mouse.ButtonRemapping." + "StaticShortcutAction.Initial", + /*sample=*/mojom::StaticShortcutAction::kPaste, + /*expected_count=*/1u); // Call RecordMouseInitialMetrics with the same user and same mouse, // ExpectTotalCount for mouse metric won't increase. @@ -335,6 +344,10 @@ histogram_tester.ExpectTotalCount( "ChromeOS.Settings.Device.Mouse.Sensitivity.Initial", /*expected_count=*/1u); + histogram_tester.ExpectTotalCount( + "ChromeOS.Settings.Device.Mouse.ButtonRemapping.StaticShortcutAction." + "Initial", + /*expected_count=*/1u); // Call RecordMouseInitialMetrics with the different user but same // mouse, ExpectTotalCount for mouse metric will increase. @@ -343,6 +356,10 @@ histogram_tester.ExpectTotalCount( "ChromeOS.Settings.Device.Mouse.Sensitivity.Initial", /*expected_count=*/2u); + histogram_tester.ExpectTotalCount( + "ChromeOS.Settings.Device.Mouse.ButtonRemapping.StaticShortcutAction." + "Initial", + /*expected_count=*/2u); // Call record changed settings metrics. const auto old_setting = mouse.settings->Clone(); @@ -543,11 +560,12 @@ mojom::RemappingAction::NewAcceleratorAction( AcceleratorAction::kBrightnessDown))); graphics_tablet.settings->pen_button_remappings.push_back( - mojom::ButtonRemapping::New("pen-middle-button", - mojom::Button::NewCustomizableButton( - mojom::CustomizableButton::kMiddle), - mojom::RemappingAction::NewAcceleratorAction( - AcceleratorAction::kMediaPlay))); + mojom::ButtonRemapping::New( + "pen-middle-button", + mojom::Button::NewCustomizableButton( + mojom::CustomizableButton::kMiddle), + mojom::RemappingAction::NewStaticShortcutAction( + mojom::StaticShortcutAction::kCopy))); graphics_tablet.settings->tablet_button_remappings.push_back( mojom::ButtonRemapping::New("tablet-vkey", mojom::Button::NewVkey(ui::VKEY_B), @@ -563,7 +581,37 @@ base::HistogramTester histogram_tester; SimulateUserLogin(kUser1); manager_.get()->RecordGraphicsTabletInitialMetrics(graphics_tablet); - // TODO(cambickel): Add tests for graphics tablet initial metrics. + histogram_tester.ExpectTotalCount( + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping." + "StaticShortcutAction.Initial", + /*expected_count=*/1); + histogram_tester.ExpectBucketCount( + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping." + "StaticShortcutAction.Initial", + /*sample=*/mojom::StaticShortcutAction::kCopy, + /*expected_count=*/1u); + histogram_tester.ExpectBucketCount( + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping." + "StaticShortcutAction.Initial", + /*sample=*/mojom::StaticShortcutAction::kPaste, + /*expected_count=*/0u); + + // Call RecordGraphicsTabletInitialMetrics with the same user and same + // graphics tablet, ExpectTotalCount for the metric won't increase. + manager_.get()->RecordGraphicsTabletInitialMetrics(graphics_tablet); + histogram_tester.ExpectTotalCount( + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping." + "StaticShortcutAction.Initial", + /*expected_count=*/1u); + + // Call RecordGraphicsTabletInitialMetrics with the different user but same + // graphics tablet, ExpectTotalCount for the metric will increase. + SimulateUserLogin(kUser2); + manager_.get()->RecordGraphicsTabletInitialMetrics(graphics_tablet); + histogram_tester.ExpectTotalCount( + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping." + "StaticShortcutAction.Initial", + /*expected_count=*/2u); // Call record changed settings metrics. const auto old_setting = graphics_tablet.settings->Clone(); @@ -578,12 +626,14 @@ *old_setting); // Test pen button remappings. histogram_tester.ExpectUniqueSample( - "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping.Name.Changed." + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping.Name." + "Changed." "Vkey", /*sample=*/ui::KeyboardCode::VKEY_C, /*expected_bucket_count=*/1u); histogram_tester.ExpectBucketCount( - "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping.Name.Changed." + "ChromeOS.Settings.Device.GraphicsTabletPen.ButtonRemapping.Name." + "Changed." "CustomizableButton", /*sample=*/mojom::CustomizableButton::kMiddle, /*expected_count=*/1u);
diff --git a/ash/system/input_device_settings/input_device_settings_policy_handler.cc b/ash/system/input_device_settings/input_device_settings_policy_handler.cc index 93e969b6..2ff0bce 100644 --- a/ash/system/input_device_settings/input_device_settings_policy_handler.cc +++ b/ash/system/input_device_settings/input_device_settings_policy_handler.cc
@@ -41,6 +41,36 @@ return policy; } +mojom::InputDeviceSettingsFkeyPolicyPtr GetFkeyPreferencePolicy( + const PrefService* pref_service) { + mojom::InputDeviceSettingsFkeyPolicyPtr policy; + + const auto* pref = + pref_service->FindPreference(prefs::kExtendedFkeysModifier); + if (!pref) { + return policy; + } + + if (pref->IsManaged()) { + auto* value = pref->GetValue(); + CHECK(value && value->is_int()); + policy = mojom::InputDeviceSettingsFkeyPolicy::New( + mojom::PolicyStatus::kManaged, + static_cast<ui::mojom::ExtendedFkeysModifier>(value->GetInt())); + + // Prefs with recommended values must use `GetRecommendedValue` instead + // of `IsRecommended` as `IsRecommended` may return false even if the pref + // has a recommended value. + } else if (auto* value = pref->GetRecommendedValue(); value) { + CHECK(value->is_int()); + policy = mojom::InputDeviceSettingsFkeyPolicy::New( + mojom::PolicyStatus::kRecommended, + static_cast<ui::mojom::ExtendedFkeysModifier>(value->GetInt())); + } + + return policy; +} + } // namespace InputDeviceSettingsPolicyHandler::InputDeviceSettingsPolicyHandler( @@ -78,6 +108,11 @@ base::BindRepeating( &InputDeviceSettingsPolicyHandler::OnKeyboardPoliciesChanged, base::Unretained(this))); + pref_change_registrar_.Add( + prefs::kExtendedFkeysModifier, + base::BindRepeating( + &InputDeviceSettingsPolicyHandler::OnKeyboardPoliciesChanged, + base::Unretained(this))); } RefreshKeyboardPolicies(/*notify=*/false); @@ -88,6 +123,9 @@ if (has_user_prefs_) { keyboard_policies_.top_row_are_fkeys_policy = GetBooleanPreferencePolicy( pref_change_registrar_.prefs(), prefs::kSendFunctionKeys); + + keyboard_policies_.extended_fkeys_policy = + GetFkeyPreferencePolicy(pref_change_registrar_.prefs()); } if (pref_change_registrar_local_state_.prefs()) {
diff --git a/ash/system/input_device_settings/input_device_settings_policy_handler_unittest.cc b/ash/system/input_device_settings/input_device_settings_policy_handler_unittest.cc index 4000087e..91856b71 100644 --- a/ash/system/input_device_settings/input_device_settings_policy_handler_unittest.cc +++ b/ash/system/input_device_settings/input_device_settings_policy_handler_unittest.cc
@@ -38,6 +38,9 @@ false); pref_service_->registry()->RegisterBooleanPref( prefs::kPrimaryMouseButtonRight, false); + pref_service_->registry()->RegisterIntegerPref( + prefs::kExtendedFkeysModifier, + static_cast<int>(ui::mojom::ExtendedFkeysModifier::kDisabled)); } void OnKeyboardPoliciesChanged() { ++num_times_keyboard_policies_changed_; } @@ -56,12 +59,16 @@ handler_->Initialize(local_state_.get(), pref_service_.get()); EXPECT_FALSE(handler_->keyboard_policies().top_row_are_fkeys_policy); EXPECT_FALSE(handler_->keyboard_policies().enable_meta_fkey_rewrites_policy); + EXPECT_FALSE(handler_->keyboard_policies().extended_fkeys_policy); } TEST_F(InputDeviceSettingsPolicyHandlerTest, KeyboardManagedPolicy) { pref_service_->SetManagedPref(prefs::kSendFunctionKeys, base::Value(false)); local_state_->SetManagedPref(prefs::kDeviceSwitchFunctionKeysBehaviorEnabled, base::Value(false)); + pref_service_->SetManagedPref( + prefs::kExtendedFkeysModifier, + base::Value(static_cast<int>(ui::mojom::ExtendedFkeysModifier::kAlt))); handler_->Initialize(local_state_.get(), pref_service_.get()); EXPECT_EQ( @@ -92,11 +99,28 @@ EXPECT_TRUE( handler_->keyboard_policies().enable_meta_fkey_rewrites_policy->value); EXPECT_EQ(2, num_times_keyboard_policies_changed_); + + EXPECT_EQ(mojom::PolicyStatus::kManaged, + handler_->keyboard_policies().extended_fkeys_policy->policy_status); + EXPECT_EQ(static_cast<int>(ui::mojom::ExtendedFkeysModifier::kAlt), + static_cast<int>( + handler_->keyboard_policies().extended_fkeys_policy->value)); + pref_service_->SetManagedPref( + prefs::kExtendedFkeysModifier, + base::Value( + static_cast<int>(ui::mojom::ExtendedFkeysModifier::kCtrlShift))); + EXPECT_EQ(static_cast<int>(ui::mojom::ExtendedFkeysModifier::kCtrlShift), + static_cast<int>( + handler_->keyboard_policies().extended_fkeys_policy->value)); + EXPECT_EQ(3, num_times_keyboard_policies_changed_); } TEST_F(InputDeviceSettingsPolicyHandlerTest, KeyboardRecommendedPolicy) { pref_service_->SetRecommendedPref(prefs::kSendFunctionKeys, base::Value(false)); + pref_service_->SetRecommendedPref( + prefs::kExtendedFkeysModifier, + base::Value(static_cast<int>(ui::mojom::ExtendedFkeysModifier::kAlt))); local_state_->SetRecommendedPref( prefs::kDeviceSwitchFunctionKeysBehaviorEnabled, base::Value(false)); handler_->Initialize(local_state_.get(), pref_service_.get()); @@ -116,6 +140,11 @@ EXPECT_EQ(1, num_times_keyboard_policies_changed_); EXPECT_EQ(mojom::PolicyStatus::kRecommended, + handler_->keyboard_policies().extended_fkeys_policy->policy_status); + EXPECT_EQ(static_cast<int>(ui::mojom::ExtendedFkeysModifier::kAlt), + static_cast<int>( + handler_->keyboard_policies().extended_fkeys_policy->value)); + EXPECT_EQ(mojom::PolicyStatus::kRecommended, handler_->keyboard_policies() .enable_meta_fkey_rewrites_policy->policy_status); EXPECT_FALSE(
diff --git a/ash/system/input_device_settings/input_device_settings_utils.cc b/ash/system/input_device_settings/input_device_settings_utils.cc index a1a8530..704f07ce 100644 --- a/ash/system/input_device_settings/input_device_settings_utils.cc +++ b/ash/system/input_device_settings/input_device_settings_utils.cc
@@ -18,6 +18,7 @@ #include "base/values.h" #include "components/account_id/account_id.h" #include "components/user_manager/known_user.h" +#include "ui/events/ash/mojom/extended_fkeys_modifier.mojom-shared.h" #include "ui/events/ash/mojom/modifier_key.mojom.h" #include "ui/events/ozone/evdev/keyboard_mouse_combo_device_metrics.h" @@ -100,6 +101,31 @@ } } +bool ShouldPersistFkeySetting( + const mojom::InputDeviceSettingsFkeyPolicyPtr& policy, + base::StringPiece setting_key, + absl::optional<ui::mojom::ExtendedFkeysModifier> new_value, + ui::mojom::ExtendedFkeysModifier default_value, + const base::Value::Dict* existing_settings_dict) { + if (!new_value.has_value()) { + return false; + } + + if (!policy) { + return ShouldPersistSetting(setting_key, new_value.value(), default_value, + /*force_persistence=*/{}, + existing_settings_dict); + } + + switch (policy->policy_status) { + case mojom::PolicyStatus::kRecommended: + return ExistingSettingsHasValue(setting_key, existing_settings_dict) || + new_value.value() != policy->value; + case mojom::PolicyStatus::kManaged: + return false; + } +} + template EXPORT_TEMPLATE_DEFINE(ASH_EXPORT) bool ShouldPersistSetting( base::StringPiece setting_key, bool new_value,
diff --git a/ash/system/input_device_settings/input_device_settings_utils.h b/ash/system/input_device_settings/input_device_settings_utils.h index ce166d9..2e6208e 100644 --- a/ash/system/input_device_settings/input_device_settings_utils.h +++ b/ash/system/input_device_settings/input_device_settings_utils.h
@@ -9,6 +9,7 @@ #include "ash/public/mojom/input_device_settings.mojom-forward.h" #include "base/export_template.h" #include "base/values.h" +#include "ui/events/ash/mojom/extended_fkeys_modifier.mojom-shared.h" #include "ui/events/devices/input_device.h" class AccountId; @@ -63,6 +64,13 @@ bool force_persistence, const base::Value::Dict* existing_settings_dict); +ASH_EXPORT bool ShouldPersistFkeySetting( + const mojom::InputDeviceSettingsFkeyPolicyPtr& policy, + base::StringPiece setting_key, + absl::optional<ui::mojom::ExtendedFkeysModifier> new_value, + ui::mojom::ExtendedFkeysModifier default_value, + const base::Value::Dict* existing_settings_dict); + // Templates exported for each valid value type. extern template EXPORT_TEMPLATE_DECLARE(ASH_EXPORT) bool ShouldPersistSetting( base::StringPiece setting_key,
diff --git a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc index cad6951..aacbbe3 100644 --- a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc +++ b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_impl.cc
@@ -103,6 +103,18 @@ : prefs::kKeyboardDefaultNonChromeOSSettings; } +ui::mojom::ExtendedFkeysModifier GetDefaultExtendedFkeysValue( + const mojom::KeyboardPolicies& keyboard_policies, + const mojom::Keyboard& keyboard) { + if (keyboard_policies.extended_fkeys_policy && + keyboard_policies.extended_fkeys_policy->policy_status == + mojom::PolicyStatus::kRecommended) { + return keyboard_policies.extended_fkeys_policy->value; + } + + return kDefaultFkey; +} + bool GetDefaultSuppressMetaFkeyRewritesValue( const mojom::KeyboardPolicies& keyboard_policies, const mojom::Keyboard& keyboard) { @@ -259,8 +271,10 @@ } if (ShouldAddExtendedFkeyProperties(keyboard)) { - settings->f11 = kDefaultFkey; - settings->f12 = kDefaultFkey; + const auto fkey_modifier = + GetDefaultExtendedFkeysValue(keyboard_policies, keyboard); + settings->f11 = fkey_modifier; + settings->f12 = fkey_modifier; } return settings; @@ -363,6 +377,20 @@ settings_dict.FindBool(prefs::kKeyboardSettingTopRowAreFKeys) .value_or(GetDefaultTopRowAreFKeysValue(keyboard_policies, keyboard)); + if (ShouldAddExtendedFkeyProperties(keyboard)) { + settings->f11 = + settings_dict.Find(prefs::kKeyboardSettingF11) + ? static_cast<ui::mojom::ExtendedFkeysModifier>( + settings_dict.FindInt(prefs::kKeyboardSettingF11).value()) + : GetDefaultExtendedFkeysValue(keyboard_policies, keyboard); + + settings->f12 = + settings_dict.Find(prefs::kKeyboardSettingF12) + ? static_cast<ui::mojom::ExtendedFkeysModifier>( + settings_dict.FindInt(prefs::kKeyboardSettingF12).value()) + : GetDefaultExtendedFkeysValue(keyboard_policies, keyboard); + } + const auto* modifier_remappings_dict = settings_dict.FindDict(prefs::kKeyboardSettingModifierRemappings); if (modifier_remappings_dict) { @@ -378,15 +406,6 @@ RetrieveSixPackRemappings(pref_service, settings_dict); } - if (ShouldAddExtendedFkeyProperties(keyboard)) { - settings->f11 = static_cast<ui::mojom::ExtendedFkeysModifier>( - settings_dict.FindInt(prefs::kKeyboardSettingF11) - .value_or(static_cast<int>(kDefaultFkey))); - settings->f12 = static_cast<ui::mojom::ExtendedFkeysModifier>( - settings_dict.FindInt(prefs::kKeyboardSettingF12) - .value_or(static_cast<int>(kDefaultFkey))); - } - return settings; } @@ -473,6 +492,25 @@ keyboard.settings->top_row_are_fkeys); } + if (ShouldAddExtendedFkeyProperties(keyboard)) { + if (ShouldPersistFkeySetting( + keyboard_policies.extended_fkeys_policy, prefs::kKeyboardSettingF11, + keyboard.settings->f11, + GetDefaultExtendedFkeysValue(keyboard_policies, keyboard), + existing_settings_dict)) { + settings_dict.Set(prefs::kKeyboardSettingF11, + static_cast<int>(keyboard.settings->f11.value())); + } + if (ShouldPersistFkeySetting( + keyboard_policies.extended_fkeys_policy, prefs::kKeyboardSettingF12, + keyboard.settings->f12, + GetDefaultExtendedFkeysValue(keyboard_policies, keyboard), + existing_settings_dict)) { + settings_dict.Set(prefs::kKeyboardSettingF12, + static_cast<int>(keyboard.settings->f12.value())); + } + } + if (features::IsAltClickAndSixPackCustomizationEnabled()) { base::Value::Dict six_pack_key_remappings; six_pack_key_remappings.Set( @@ -498,13 +536,6 @@ std::move(six_pack_key_remappings)); } - if (ShouldAddExtendedFkeyProperties(keyboard)) { - settings_dict.Set(prefs::kKeyboardSettingF11, - static_cast<int>(keyboard.settings->f11.value())); - settings_dict.Set(prefs::kKeyboardSettingF12, - static_cast<int>(keyboard.settings->f12.value())); - } - settings_dict.Set(prefs::kKeyboardSettingModifierRemappings, ConvertModifierRemappingsToDict(keyboard)); return settings_dict; @@ -694,6 +725,14 @@ keyboard->settings->suppress_meta_fkey_rewrites = !keyboard_policies.enable_meta_fkey_rewrites_policy->value; } + + if (ShouldAddExtendedFkeyProperties(*keyboard) && + keyboard_policies.extended_fkeys_policy && + keyboard_policies.extended_fkeys_policy->policy_status == + mojom::PolicyStatus::kManaged) { + keyboard->settings->f11 = keyboard_policies.extended_fkeys_policy->value; + keyboard->settings->f12 = keyboard_policies.extended_fkeys_policy->value; + } } void KeyboardPrefHandlerImpl::InitializeLoginScreenKeyboardSettings(
diff --git a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc index a384a0c..2e7a40a1 100644 --- a/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc +++ b/ash/system/input_device_settings/pref_handlers/keyboard_pref_handler_unittest.cc
@@ -810,9 +810,12 @@ policies.enable_meta_fkey_rewrites_policy = mojom::InputDeviceSettingsPolicy::New(mojom::PolicyStatus::kManaged, kDefaultSuppressMetaFKeyRewrites); + policies.extended_fkeys_policy = mojom::InputDeviceSettingsFkeyPolicy::New( + mojom::PolicyStatus::kManaged, ui::mojom::ExtendedFkeysModifier::kShift); mojom::Keyboard keyboard; keyboard.device_key = kKeyboardKey1; + keyboard.meta_key = mojom::MetaKey::kSearch; pref_handler_->InitializeKeyboardSettings(pref_service_.get(), policies, &keyboard); @@ -822,13 +825,21 @@ // policy doesn't affect the value of the setting. EXPECT_EQ(kDefaultSuppressMetaFKeyRewrites, keyboard.settings->suppress_meta_fkey_rewrites); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kShift, keyboard.settings->f11); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kShift, keyboard.settings->f12); keyboard.settings->top_row_are_fkeys = kDefaultTopRowAreFKeys; + keyboard.settings->f11 = kDefaultFkey; + keyboard.settings->f12 = kDefaultFkey; + EXPECT_EQ(kKeyboardSettingsDefault, *keyboard.settings); const auto* settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1); EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingTopRowAreFKeys)); EXPECT_FALSE( settings_dict->contains(prefs::kKeyboardSettingSuppressMetaFKeyRewrites)); + + EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingF11)); + EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingF12)); } TEST_F(KeyboardPrefHandlerTest, @@ -839,9 +850,13 @@ policies.enable_meta_fkey_rewrites_policy = mojom::InputDeviceSettingsPolicy::New(mojom::PolicyStatus::kRecommended, !kDefaultSuppressMetaFKeyRewrites); + policies.extended_fkeys_policy = mojom::InputDeviceSettingsFkeyPolicy::New( + mojom::PolicyStatus::kRecommended, + ui::mojom::ExtendedFkeysModifier::kCtrlShift); mojom::Keyboard keyboard; keyboard.device_key = kKeyboardKey1; + keyboard.meta_key = mojom::MetaKey::kSearch; pref_handler_->InitializeKeyboardSettings(pref_service_.get(), policies, &keyboard); @@ -851,13 +866,21 @@ // policy doesn't affect the value of the setting. EXPECT_EQ(kDefaultSuppressMetaFKeyRewrites, keyboard.settings->suppress_meta_fkey_rewrites); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kCtrlShift, + keyboard.settings->f11); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kCtrlShift, + keyboard.settings->f12); keyboard.settings->top_row_are_fkeys = kDefaultTopRowAreFKeys; + keyboard.settings->f11 = kDefaultFkey; + keyboard.settings->f12 = kDefaultFkey; keyboard.settings->suppress_meta_fkey_rewrites = kDefaultSuppressMetaFKeyRewrites; EXPECT_EQ(kKeyboardSettingsDefault, *keyboard.settings); const auto* settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1); EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingTopRowAreFKeys)); + EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingF11)); + EXPECT_FALSE(settings_dict->contains(prefs::kKeyboardSettingF12)); } TEST_F(KeyboardPrefHandlerTest, @@ -868,9 +891,13 @@ policies.enable_meta_fkey_rewrites_policy = mojom::InputDeviceSettingsPolicy::New(mojom::PolicyStatus::kRecommended, kDefaultSuppressMetaFKeyRewrites); + policies.extended_fkeys_policy = mojom::InputDeviceSettingsFkeyPolicy::New( + mojom::PolicyStatus::kRecommended, + ui::mojom::ExtendedFkeysModifier::kCtrlShift); mojom::Keyboard keyboard; keyboard.device_key = kKeyboardKey1; + keyboard.meta_key = mojom::MetaKey::kSearch; pref_handler_->InitializeKeyboardSettings( pref_service_.get(), /*keyboard_policies=*/{}, &keyboard); @@ -881,9 +908,15 @@ EXPECT_EQ(!kDefaultTopRowAreFKeys, keyboard.settings->top_row_are_fkeys); EXPECT_EQ(!kDefaultSuppressMetaFKeyRewrites, keyboard.settings->suppress_meta_fkey_rewrites); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kCtrlShift, + keyboard.settings->f11); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kCtrlShift, + keyboard.settings->f12); keyboard.settings->top_row_are_fkeys = kDefaultTopRowAreFKeys; keyboard.settings->suppress_meta_fkey_rewrites = kDefaultSuppressMetaFKeyRewrites; + keyboard.settings->f11 = kDefaultFkey; + keyboard.settings->f12 = kDefaultFkey; EXPECT_EQ(kKeyboardSettingsDefault, *keyboard.settings); const auto* settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1); @@ -898,9 +931,13 @@ policies.enable_meta_fkey_rewrites_policy = mojom::InputDeviceSettingsPolicy::New(mojom::PolicyStatus::kManaged, kDefaultSuppressMetaFKeyRewrites); + policies.extended_fkeys_policy = mojom::InputDeviceSettingsFkeyPolicy::New( + mojom::PolicyStatus::kManaged, + ui::mojom::ExtendedFkeysModifier::kCtrlShift); mojom::Keyboard keyboard; keyboard.device_key = kKeyboardKey1; + keyboard.meta_key = mojom::MetaKey::kSearch; pref_handler_->InitializeKeyboardSettings( pref_service_.get(), /*keyboard_policies=*/{}, &keyboard); @@ -909,6 +946,8 @@ keyboard.settings->top_row_are_fkeys = !kDefaultTopRowAreFKeys; keyboard.settings->suppress_meta_fkey_rewrites = !kDefaultSuppressMetaFKeyRewrites; + keyboard.settings->f11 = ui::mojom::ExtendedFkeysModifier::kAlt; + keyboard.settings->f12 = ui::mojom::ExtendedFkeysModifier::kAlt; CallUpdateKeyboardSettings(kKeyboardKey1, *keyboard.settings); pref_handler_->InitializeKeyboardSettings(pref_service_.get(), policies, @@ -916,9 +955,15 @@ EXPECT_EQ(!kDefaultTopRowAreFKeys, keyboard.settings->top_row_are_fkeys); EXPECT_EQ(!kDefaultSuppressMetaFKeyRewrites, keyboard.settings->suppress_meta_fkey_rewrites); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kCtrlShift, + keyboard.settings->f11); + EXPECT_EQ(ui::mojom::ExtendedFkeysModifier::kCtrlShift, + keyboard.settings->f12); keyboard.settings->top_row_are_fkeys = kDefaultTopRowAreFKeys; keyboard.settings->suppress_meta_fkey_rewrites = kDefaultSuppressMetaFKeyRewrites; + keyboard.settings->f11 = kDefaultFkey; + keyboard.settings->f12 = kDefaultFkey; EXPECT_EQ(kKeyboardSettingsDefault, *keyboard.settings); const auto* settings_dict = GetSettingsDictForDeviceKey(kKeyboardKey1); @@ -926,6 +971,12 @@ EXPECT_EQ( !kDefaultTopRowAreFKeys, settings_dict->FindBool(prefs::kKeyboardSettingTopRowAreFKeys).value()); + EXPECT_TRUE(settings_dict->contains(prefs::kKeyboardSettingF11)); + EXPECT_TRUE(settings_dict->contains(prefs::kKeyboardSettingF12)); + EXPECT_NE(static_cast<int>(kDefaultFkey), + settings_dict->FindInt(prefs::kKeyboardSettingF11).value()); + EXPECT_NE(static_cast<int>(kDefaultFkey), + settings_dict->FindInt(prefs::kKeyboardSettingF12).value()); } TEST_F(KeyboardPrefHandlerTest,
diff --git a/ash/system/locale/locale_detailed_view_pixeltest.cc b/ash/system/locale/locale_detailed_view_pixeltest.cc index 814e114e..6028ebd 100644 --- a/ash/system/locale/locale_detailed_view_pixeltest.cc +++ b/ash/system/locale/locale_detailed_view_pixeltest.cc
@@ -62,7 +62,7 @@ ASSERT_TRUE(detailed_view); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/7, detailed_view)); + /*revision_number=*/6, detailed_view)); } } // namespace
diff --git a/ash/system/message_center/ash_notification_view_pixeltest.cc b/ash/system/message_center/ash_notification_view_pixeltest.cc index b9259f76..126f0a3 100644 --- a/ash/system/message_center/ash_notification_view_pixeltest.cc +++ b/ash/system/message_center/ash_notification_view_pixeltest.cc
@@ -319,7 +319,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( base::StrCat({"screen_capture_popup_notification_", GetDisplayTypeName(GetDisplayType())}), - /*revision_number=*/10, + /*revision_number=*/9, test_api()->GetPopupViewForId(kScreenCaptureNotificationId))); }
diff --git a/ash/system/network/network_detailed_network_view_pixeltest.cc b/ash/system/network/network_detailed_network_view_pixeltest.cc index c820e762..9c99221 100644 --- a/ash/system/network/network_detailed_network_view_pixeltest.cc +++ b/ash/system/network/network_detailed_network_view_pixeltest.cc
@@ -136,7 +136,7 @@ // Compare pixels. EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/7, detailed_view)); + /*revision_number=*/6, detailed_view)); } } // namespace
diff --git a/ash/system/network/vpn_detailed_view_pixeltest.cc b/ash/system/network/vpn_detailed_view_pixeltest.cc index 7dd37fc0..19c147b 100644 --- a/ash/system/network/vpn_detailed_view_pixeltest.cc +++ b/ash/system/network/vpn_detailed_view_pixeltest.cc
@@ -129,7 +129,7 @@ // Compare pixels. EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/7, vpn_detailed_view_)); + /*revision_number=*/6, vpn_detailed_view_)); } TEST_F(VpnDetailedViewPixelTest, MultipleVpns) { @@ -138,7 +138,7 @@ // Compare pixels. EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "check_view", - /*revision_number=*/7, vpn_detailed_view_)); + /*revision_number=*/6, vpn_detailed_view_)); } } // namespace ash
diff --git a/ash/system/time/calendar_view_pixeltest.cc b/ash/system/time/calendar_view_pixeltest.cc index 66fd53b..c3f84f23 100644 --- a/ash/system/time/calendar_view_pixeltest.cc +++ b/ash/system/time/calendar_view_pixeltest.cc
@@ -111,7 +111,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "calendar_view", - /*revision_number=*/4, GetCalendarView())); + /*revision_number=*/3, GetCalendarView())); } TEST_F(CalendarViewPixelTest, EventList) {
diff --git a/ash/system/video_conference/bubble/bubble_view_pixeltest.cc b/ash/system/video_conference/bubble/bubble_view_pixeltest.cc index 80c4c93e1..a9519ed5 100644 --- a/ash/system/video_conference/bubble/bubble_view_pixeltest.cc +++ b/ash/system/video_conference/bubble/bubble_view_pixeltest.cc
@@ -191,7 +191,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "video_conference_bubble_view_basic", - /*revision_number=*/3, bubble_view())); + /*revision_number=*/2, bubble_view())); } // Pixel test that tests toggled on/off and focused/not focused for the toggle
diff --git a/ash/system/video_conference/video_conference_tray_pixeltest.cc b/ash/system/video_conference/video_conference_tray_pixeltest.cc index 51ecbcc..2a2bac6 100644 --- a/ash/system/video_conference/video_conference_tray_pixeltest.cc +++ b/ash/system/video_conference/video_conference_tray_pixeltest.cc
@@ -108,13 +108,13 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "video_conference_tray_audio_focused_not_toggled", - /*revision_number=*/4, video_conference_tray())); + /*revision_number=*/3, video_conference_tray())); PressAndReleaseKey(ui::VKEY_RETURN); EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "video_conference_tray_audio_focused_and_toggled", - /*revision_number=*/6, video_conference_tray())); + /*revision_number=*/5, video_conference_tray())); // Un-toggle the audio icon, then focus the video icon. PressAndReleaseKey(ui::VKEY_RETURN);
diff --git a/ash/webui/common/resources/network/network_list_item.js b/ash/webui/common/resources/network/network_list_item.js index ace2133..fba2f23 100644 --- a/ash/webui/common/resources/network/network_list_item.js +++ b/ash/webui/common/resources/network/network_list_item.js
@@ -253,6 +253,14 @@ loadTimeData.getBoolean('isUserLoggedIn'); }, }, + + isCellularCarrierLockEnabled_: { + type: Boolean, + value() { + return loadTimeData.valueExists('isCellularCarrierLockEnabled') && + loadTimeData.getBoolean('isCellularCarrierLockEnabled'); + }, + }, }, /** @private {?CrosNetworkConfigInterface} */ @@ -678,6 +686,13 @@ } if (this.networkState.type === NetworkType.kCellular) { + // For carrier lock, display string is different from regular + // pin lock + if (this.isCellularCarrierLockEnabled_ && + this.networkState.typeState.cellular.simLocked && + this.networkState.typeState.cellular.simLockType === 'network-pin') { + return this.i18n('networkListItemUpdatedCellularSimCardCarrierLocked'); + } if (this.isPsimPendingActivationWhileLoggedOut_()) { return this.i18n('networkListItemActivateAfterDeviceSetup'); } @@ -1150,6 +1165,11 @@ if (!this.networkState || !this.networkState.typeState.cellular) { return false; } + if (this.isCellularCarrierLockEnabled_ && + this.networkState.typeState.cellular.simLocked && + this.networkState.typeState.cellular.simLockType === 'network-pin') { + return false; + } return this.networkState.typeState.cellular.simLocked; },
diff --git a/ash/webui/common/resources/network/network_siminfo.html b/ash/webui/common/resources/network/network_siminfo.html index d37c61b..96dcce8 100644 --- a/ash/webui/common/resources/network/network_siminfo.html +++ b/ash/webui/common/resources/network/network_siminfo.html
@@ -30,13 +30,16 @@ <!-- SIM locked --> <template is="dom-if" if="[[eq_(State.SIM_LOCKED, state_)]]" restamp> - <div id="simLocked" class="property-box two-line"> - <cr-button id="unlockPinButton" - on-click="onUnlockPinTap_" - disabled="[[disabled]]"> - [[i18n('networkSimUnlock')]] - </cr-button> - </div> + <template is="dom-if" if="[[!isSimCarrierLocked_(isActiveSim_, + deviceState)]]" restamp> + <div id="simLocked" class="property-box two-line"> + <cr-button id="unlockPinButton" + on-click="onUnlockPinTap_" + disabled="[[disabled]]"> + [[i18n('networkSimUnlock')]] + </cr-button> + </div> + </template> </template> <!-- SIM unlocked -->
diff --git a/ash/webui/common/resources/network/network_siminfo.js b/ash/webui/common/resources/network/network_siminfo.js index a9dd033..8f0ba4f 100644 --- a/ash/webui/common/resources/network/network_siminfo.js +++ b/ash/webui/common/resources/network/network_siminfo.js
@@ -125,6 +125,14 @@ computed: 'computeIsSimPinLockRestricted_(globalPolicy,' + 'globalPolicy.*, lockEnabled_)', }, + + isCellularCarrierLockEnabled_: { + type: Boolean, + value() { + return loadTimeData.valueExists('isCellularCarrierLockEnabled') && + loadTimeData.getBoolean('isCellularCarrierLockEnabled'); + }, + }, }, /** @private {boolean|undefined} */ @@ -328,6 +336,25 @@ * @return {boolean} * @private */ + isSimCarrierLocked_() { + if (!this.isCellularCarrierLockEnabled_) { + return false; + } + + const simLockStatus = this.deviceState && this.deviceState.simLockStatus; + + if (this.isActiveSim_ && simLockStatus && + simLockStatus.lockType === 'network-pin') { + return true; + } + + return false; + }, + + /** + * @return {boolean} + * @private + */ shouldShowPolicyIndicator_() { return this.isSimPinLockRestricted_ && this.isActiveSim_; },
diff --git a/ash/webui/common/resources/network/sim_lock_dialogs.js b/ash/webui/common/resources/network/sim_lock_dialogs.js index 89938a0..bb06a9b 100644 --- a/ash/webui/common/resources/network/sim_lock_dialogs.js +++ b/ash/webui/common/resources/network/sim_lock_dialogs.js
@@ -178,6 +178,14 @@ value: false, computed: 'computeIsSimPinLockRestricted_(globalPolicy, globalPolicy.*)', }, + + isCellularCarrierLockEnabled_: { + type: Boolean, + value() { + return loadTimeData.valueExists('isCellularCarrierLockEnabled') && + loadTimeData.getBoolean('isCellularCarrierLockEnabled'); + }, + }, }, /** @private {?CrosNetworkConfigInterface} */ @@ -227,6 +235,14 @@ return; } + // If device is carrier locked, don't show any dialog + // Device could only be unlocked by carrier + if (this.isCellularCarrierLockEnabled_ && + simLockStatus.lockType === 'network-pin') { + this.isDialogOpen = false; + return; + } + // If lock is not enabled. Show enter pin to toggle it on. if (!simLockStatus.lockEnabled) { this.showEnterPinDialog_();
diff --git a/ash/webui/common/resources/quick_unlock/OWNERS b/ash/webui/common/resources/quick_unlock/OWNERS index 9f19c27..8875550 100644 --- a/ash/webui/common/resources/quick_unlock/OWNERS +++ b/ash/webui/common/resources/quick_unlock/OWNERS
@@ -1,5 +1,2 @@ # (in PST) alemate@chromium.org - -# (in CET) -rsorokin@google.com
diff --git a/ash/webui/common/resources/quick_unlock/fingerprint_progress.ts b/ash/webui/common/resources/quick_unlock/fingerprint_progress.ts index b86aed62..0a17e182 100644 --- a/ash/webui/common/resources/quick_unlock/fingerprint_progress.ts +++ b/ash/webui/common/resources/quick_unlock/fingerprint_progress.ts
@@ -184,11 +184,6 @@ */ reset() { if (this.dynamic) { - const link = document.createElement('link'); - link.rel = 'stylesheet'; - link.href = 'chrome://theme/colors.css?sets=legacy,sys'; - document.head.appendChild(link); - document.body.classList.add('jelly-enabled'); this.progressCircleFillColor = getComputedStyle(document.body) .getPropertyValue('--cros-sys-primary');
diff --git a/ash/webui/eche_app_ui/accessibility_provider.cc b/ash/webui/eche_app_ui/accessibility_provider.cc index 9610807..63f8c385 100644 --- a/ash/webui/eche_app_ui/accessibility_provider.cc +++ b/ash/webui/eche_app_ui/accessibility_provider.cc
@@ -58,7 +58,12 @@ AccessibilityProvider::AccessibilityProvider( std::unique_ptr<AccessibilityProviderProxy> proxy) - : proxy_(std::move(proxy)) {} + : proxy_(std::move(proxy)) { + // Register callback to know when accessibility should be enabled or disabled. + proxy_->SetAccessibilityEnabledStateChangedCallback(base::BindRepeating( + &AccessibilityProvider::OnAccessibilityEnabledStateChanged, + weak_ptr_factory_.GetWeakPtr())); +} AccessibilityProvider::~AccessibilityProvider() = default; void AccessibilityProvider::TrackView(AshWebView* view) { @@ -146,6 +151,11 @@ } } +void AccessibilityProvider::IsAccessibilityEnabled( + IsAccessibilityEnabledCallback callback) { + std::move(callback).Run(proxy_->IsAccessibilityEnabled()); +} + bool AccessibilityProvider::UseFullFocusMode() const { return proxy_->UseFullFocusMode(); } @@ -165,15 +175,6 @@ } } -void AccessibilityProvider::OnActionResult(const ui::AXActionData& action, - bool result) const { - // Tree source could be null if the app is switched before the response comes - // back. - if (tree_source_) { - tree_source_->NotifyActionResult(action, result); - } -} - void AccessibilityProvider::OnGetTextLocationDataResult( const ui::AXActionData& action, const absl::optional<std::vector<uint8_t>>& serialized_text_location) @@ -254,6 +255,19 @@ receiver_.Bind(std::move(receiver)); } +void AccessibilityProvider::OnActionResult(const ui::AXActionData& action, + bool result) const { + // Tree source could be null if the app is switched before the response comes + // back. + if (tree_source_) { + tree_source_->NotifyActionResult(action, result); + } +} + +void AccessibilityProvider::OnAccessibilityEnabledStateChanged(bool enabled) { + observer_remote_->EnableAccessibilityTreeStreaming(enabled); +} + // Serialization Delegate implementation gfx::RectF
diff --git a/ash/webui/eche_app_ui/accessibility_provider.h b/ash/webui/eche_app_ui/accessibility_provider.h index d227890..abed5db 100644 --- a/ash/webui/eche_app_ui/accessibility_provider.h +++ b/ash/webui/eche_app_ui/accessibility_provider.h
@@ -12,6 +12,7 @@ #include "ash/webui/eche_app_ui/mojom/eche_app.mojom.h" #include "ash/webui/eche_app_ui/proto/accessibility_mojom.pb.h" +#include "base/functional/callback_forward.h" #include "base/memory/weak_ptr.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" @@ -29,8 +30,11 @@ virtual ~AccessibilityProviderProxy() = default; virtual bool UseFullFocusMode() = 0; + virtual bool IsAccessibilityEnabled() = 0; virtual ax::android::mojom::AccessibilityFilterType GetFilterType() = 0; virtual void OnViewTracked() = 0; + virtual void SetAccessibilityEnabledStateChangedCallback( + base::RepeatingCallback<void(bool)>) = 0; }; class AccessibilityProvider : public mojom::AccessibilityProvider, @@ -43,8 +47,6 @@ // Track the current eche web view. void TrackView(AshWebView* view); void HandleStreamClosed(); - // Handles the result from perform action. - void OnActionResult(const ui::AXActionData& data, bool result) const; // Handles the result of a refreshWithExtraData call. void OnGetTextLocationDataResult(const ui::AXActionData& action, const absl::optional<std::vector<uint8_t>>& @@ -57,6 +59,7 @@ void SetAccessibilityObserver( ::mojo::PendingRemote<mojom::AccessibilityObserver> observer) override; void OnStreamOrientationChanged(bool isLandscape) override; + void IsAccessibilityEnabled(IsAccessibilityEnabledCallback callback) override; void Bind(mojo::PendingReceiver<mojom::AccessibilityProvider> receiver); @@ -68,6 +71,9 @@ ax::android::mojom::AccessibilityFilterType GetFilterType(); void UpdateDeviceBounds(int width, int height); gfx::Rect OnGetTextLocationDataResultInternal(proto::Rect proto_rect) const; + // Handles the result from perform action. + void OnActionResult(const ui::AXActionData& data, bool result) const; + void OnAccessibilityEnabledStateChanged(bool enabled); class SerializationDelegate : public ax::android::AXTreeSourceAndroid::SerializationDelegate {
diff --git a/ash/webui/eche_app_ui/eche_app_manager_unittest.cc b/ash/webui/eche_app_ui/eche_app_manager_unittest.cc index 7e7eb6d..7a749ee 100644 --- a/ash/webui/eche_app_ui/eche_app_manager_unittest.cc +++ b/ash/webui/eche_app_ui/eche_app_manager_unittest.cc
@@ -81,6 +81,11 @@ return ax::android::mojom::AccessibilityFilterType::ALL; } void OnViewTracked() override {} + + bool IsAccessibilityEnabled() override { return true; } + + void SetAccessibilityEnabledStateChangedCallback( + base::RepeatingCallback<void(bool)> callback) override {} }; } // namespace
diff --git a/ash/webui/eche_app_ui/mojom/eche_app.mojom b/ash/webui/eche_app_ui/mojom/eche_app.mojom index f7630c9..299215f 100644 --- a/ash/webui/eche_app_ui/mojom/eche_app.mojom +++ b/ash/webui/eche_app_ui/mojom/eche_app.mojom
@@ -81,6 +81,10 @@ // Notifies what orientation the stream has changed to for accessibility. OnStreamOrientationChanged(bool isLandscape); + + // Returns true if an accessibility feature that requires + // the tree stream is enabled. + IsAccessibilityEnabled() => (bool enabled); }; // Observer for accessibility provider. Should be created using @@ -89,6 +93,9 @@ // with the android phone through the SWA. // Proto from: ash/webui/eche_app_ui/proto/accessibility_mojom.proto interface AccessibilityObserver { + // Enable or disable accessibility tree streaming + // based on state of assistive technologies. + EnableAccessibilityTreeStreaming(bool enable); // Sends the accessibility action to the SWA for processing. // The proto sent is proto::AccessibilityActionData. PerformAction(array<uint8> serialized_proto) => (bool result);
diff --git a/ash/webui/eche_app_ui/resources/browser_proxy.js b/ash/webui/eche_app_ui/resources/browser_proxy.js index 4c16029b..f49b299 100644 --- a/ash/webui/eche_app_ui/resources/browser_proxy.js +++ b/ash/webui/eche_app_ui/resources/browser_proxy.js
@@ -138,6 +138,11 @@ return /** @type {!UidInfo} */ (await uidGenerator.getUid()); }); +guestMessagePipe.registerHandler(Message.IS_ACCESSIBILITY_ENABLED, async () => { + const result = await accessibility.isAccessibilityEnabled(); + return result.enabled; +}); + // Add Screen Backlight state listener and send state via pipes. systemInfoObserverRouter.onScreenBacklightStateChanged.addListener((state) => { console.log('echeapi browser_proxy.js onScreenBacklightStateChanged'); @@ -164,6 +169,14 @@ /** @type {boolean} */ androidDeviceOnCellular, }); }); + +accessibilityObserverRouter.enableAccessibilityTreeStreaming.addListener( + (enabled) => { + console.log('echeapi browser_proxy.js enableAccessibilityTreeStreaming'); + guestMessagePipe.sendMessage( + Message.ACCESSIBILITY_SET_TREE_STREAMING_ENABLED, enabled); + }); + accessibilityObserverRouter.performAction.addListener((action) => { return new Promise(async (resolve) => { const result = await guestMessagePipe.sendMessage(
diff --git a/ash/webui/eche_app_ui/resources/message_types.js b/ash/webui/eche_app_ui/resources/message_types.js index 1118d6b..068849589 100644 --- a/ash/webui/eche_app_ui/resources/message_types.js +++ b/ash/webui/eche_app_ui/resources/message_types.js
@@ -108,6 +108,8 @@ STREAM_ACTION: 'stream_action', // Message for virtual keyboard state IS_VIRTUAL_KEYBOARD_ENABLED: 'is_virtual_keyboard_enabled', + // Message for accessibility state + IS_ACCESSIBILITY_ENABLED: 'is_accessibility_enabled', // Message for Android network info ANDROID_NETWORK_INFO: 'android-network-info', // Message for changing app stream orientation @@ -115,6 +117,9 @@ // Message for notifying Chrome OS about a change in the status of the WebRTC // connection. CONNECTION_STATUS_CHANGED: 'connection_status_changed', + // Enable or disable accessibility tree streaming. + ACCESSIBILITY_SET_TREE_STREAMING_ENABLED: + 'accessibility_set_tree_streaming_enabled', // Message for sending accessibility event data. ACCESSIBILITY_EVENT_DATA: 'accessibility_event_data', // Message for getting the location of text in android.
diff --git a/ash/webui/eche_app_ui/resources/receiver.js b/ash/webui/eche_app_ui/resources/receiver.js index 52f7102a..5fa75d5 100644 --- a/ash/webui/eche_app_ui/resources/receiver.js +++ b/ash/webui/eche_app_ui/resources/receiver.js
@@ -82,6 +82,14 @@ /** @type {boolean} */ (message.androidDeviceOnCellular)); }); +let setAccessibilityEnabledCallback = null; +parentMessagePipe.registerHandler( + Message.ACCESSIBILITY_SET_TREE_STREAMING_ENABLED, (enabled) => { + if (setAccessibilityEnabledCallback) { + setAccessibilityEnabledCallback(enabled); + } + }); + // Handle accessibility perform action. let performActionCallback = null; parentMessagePipe.registerHandler( @@ -134,6 +142,11 @@ parentMessagePipe.sendMessage(Message.GET_UID)); } + isAccessibilityEnabled() { + console.log('echeapi receiver.js isAccessibilityEnabled'); + return (parentMessagePipe.sendMessage(Message.IS_ACCESSIBILITY_ENABLED)); + } + onScreenBacklightStateChanged(callback) { console.log('echeapi receiver.js onScreenBacklightStateChanged'); screenBacklightCallback = callback; @@ -223,6 +236,12 @@ } // TODO: rename this and similar methods to set'Xxx'Callback + onAccessibilityEnabledStateChanged(callback) { + console.log('echeapi receiver.js onAccessibilityEnabledStateChanged'); + setAccessibilityEnabledCallback = callback; + } + + // TODO: rename this and similar methods to set'Xxx'Callback onPerformAction(callback) { console.log('echeapi receiver.js onPerformAction'); performActionCallback = callback; @@ -251,6 +270,11 @@ echeapi.accessibility = {}; echeapi.accessibility.sendAccessibilityEventData = EcheApiBindingImpl.sendAccessibilityEventData.bind(EcheApiBindingImpl); +echeapi.accessibility.isAccessibilityEnabled = + EcheApiBindingImpl.isAccessibilityEnabled.bind(EcheApiBindingImpl); +echeapi.accessibility.registerAccessibilityEnabledStateChangedReceiver = + EcheApiBindingImpl.onAccessibilityEnabledStateChanged.bind( + EcheApiBindingImpl); echeapi.accessibility.registerPerformActionReceiver = EcheApiBindingImpl.onPerformAction.bind(EcheApiBindingImpl); echeapi.accessibility.registerRefreshWithExtraDataReceiver =
diff --git a/ash/webui/personalization_app/BUILD.gn b/ash/webui/personalization_app/BUILD.gn index 3cabc4e..116083f1 100644 --- a/ash/webui/personalization_app/BUILD.gn +++ b/ash/webui/personalization_app/BUILD.gn
@@ -42,6 +42,7 @@ "//chromeos/strings", "//components/keyed_service/content", "//components/keyed_service/core", + "//components/manta", "//content/public/browser", "//ui/chromeos", "//ui/chromeos/styles:cros_styles_views",
diff --git a/ash/webui/personalization_app/DEPS b/ash/webui/personalization_app/DEPS new file mode 100644 index 0000000..545cc0f5 --- /dev/null +++ b/ash/webui/personalization_app/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+components/manta", +]
diff --git a/ash/webui/personalization_app/personalization_app_ui.cc b/ash/webui/personalization_app/personalization_app_ui.cc index 83e63da..340496b 100644 --- a/ash/webui/personalization_app/personalization_app_ui.cc +++ b/ash/webui/personalization_app/personalization_app_ui.cc
@@ -30,6 +30,7 @@ #include "base/time/time.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/strings/grit/chromeos_strings.h" +#include "components/manta/features.h" #include "content/public/browser/browser_context.h" #include "content/public/browser/web_contents.h" #include "content/public/browser/web_ui_data_source.h" @@ -498,7 +499,9 @@ source->AddBoolean("isTimeOfDayWallpaperEnabled", features::IsTimeOfDayWallpaperEnabled()); - source->AddBoolean("isSeaPenEnabled", features::IsSeaPenEnabled()); + source->AddBoolean( + "isSeaPenEnabled", + features::IsSeaPenEnabled() && manta::features::IsMantaServiceEnabled()); } void PersonalizationAppUI::AddIntegers(content::WebUIDataSource* source) {
diff --git a/ash/wm/desks/desk_preview_view.cc b/ash/wm/desks/desk_preview_view.cc index fc20248..17ec23b 100644 --- a/ash/wm/desks/desk_preview_view.cc +++ b/ash/wm/desks/desk_preview_view.cc
@@ -359,6 +359,7 @@ views::InkDrop::Get(this)->SetMode(views::InkDropHost::InkDropMode::OFF); SetFocusBehavior(views::View::FocusBehavior::ALWAYS); SetPaintToLayer(ui::LAYER_TEXTURED); + SetAccessibleName(l10n_util::GetStringUTF16(IDS_ASH_DESKS_DESK_PREVIEW)); layer()->SetFillsBoundsOpaquely(false); layer()->SetMasksToBounds(false);
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index e4dbf37..0dde4a6 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -96,6 +96,9 @@ constexpr char kCloseAllUndoHistogramName[] = "Ash.Desks.CloseAllUndo"; constexpr char kCloseAllTotalHistogramName[] = "Ash.Desks.CloseAllTotal"; constexpr char kRemoveDeskTypeHistogramName[] = "Ash.Desks.RemoveDeskType"; +constexpr char kDeskApiRemoveDeskTypeHistogramName[] = + "Ash.DeskApi.RemoveDeskType"; +constexpr char kDeskApiCloseAllUndoHistogramName[] = "Ash.DeskApi.CloseAllUndo"; constexpr char kNumberOfWindowsClosed[] = "Ash.Desks.NumberOfWindowsClosed2"; constexpr char kNumberOfWindowsClosedByButton[] = "Ash.Desks.NumberOfWindowsClosed2.Button"; @@ -1982,6 +1985,10 @@ UMA_HISTOGRAM_ENUMERATION(kRemoveDeskHistogramName, source); UMA_HISTOGRAM_ENUMERATION(kRemoveDeskTypeHistogramName, close_type); + if (source == DesksCreationRemovalSource::kApi) { + base::UmaHistogramEnumeration(kDeskApiRemoveDeskTypeHistogramName, + close_type); + } // We should only announce desks are being merged if we are combining desks. // Otherwise, we tell the user that the desk has closed with its windows. @@ -2023,6 +2030,10 @@ void DesksController::UndoDeskRemoval() { DCHECK(temporary_removed_desk_); base::UmaHistogramBoolean(kCloseAllUndoHistogramName, true); + if (temporary_removed_desk_->desk_removal_source() == + DesksCreationRemovalSource::kApi) { + base::UmaHistogramBoolean(kDeskApiCloseAllUndoHistogramName, true); + } Desk* readded_desk_ptr = temporary_removed_desk_->desk(); auto readded_desk_data = std::move(temporary_removed_desk_); const int readded_desk_index = readded_desk_data->index();
diff --git a/ash/wm/wm_pixel_diff_test.cc b/ash/wm/wm_pixel_diff_test.cc index a134d4c2..5ef33df7 100644 --- a/ash/wm/wm_pixel_diff_test.cc +++ b/ash/wm/wm_pixel_diff_test.cc
@@ -160,7 +160,7 @@ EXPECT_TRUE(GetPixelDiffer()->CompareUiComponentsOnPrimaryScreen( "window_cycle_basic", - /*revision_number=*/9, widget)); + /*revision_number=*/8, widget)); } } // namespace ash
diff --git a/base/BUILD.gn b/base/BUILD.gn index 4a227a6..55479f4 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -4616,7 +4616,6 @@ "test/android/java/src/org/chromium/base/multidex/ChromiumMultiDexInstaller.java", "test/android/javatests/src/org/chromium/base/test/BaseActivityTestRule.java", "test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java", - "test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java", "test/android/javatests/src/org/chromium/base/test/BaseJUnit4ClassRunner.java", "test/android/javatests/src/org/chromium/base/test/BaseJUnit4TestRule.java", "test/android/javatests/src/org/chromium/base/test/LoadNative.java",
diff --git a/base/allocator/dispatcher/tls.h b/base/allocator/dispatcher/tls.h index f9f47aa..da3be06e 100644 --- a/base/allocator/dispatcher/tls.h +++ b/base/allocator/dispatcher/tls.h
@@ -34,6 +34,9 @@ #define DISABLE_TSAN_INSTRUMENTATION #endif +#define STR_HELPER(x) #x +#define STR(x) STR_HELPER(x) + // Verify that a condition holds and cancel the process in case it doesn't. The // functionality is similar to RAW_CHECK but includes more information in the // logged messages. It is non allocating to prevent recursions. @@ -45,7 +48,7 @@ if (!(condition)) { \ constexpr const char* message = \ "TLS System: " error_message " Failed condition '" #condition \ - "' in (" file "@" #line ").\n"; \ + "' in (" file "@" STR(line) ").\n"; \ ::logging::RawCheckFailure(message); \ } \ } while (0) @@ -470,6 +473,8 @@ #undef TLS_RAW_CHECK_IMPL #undef TLS_RAW_CHECK +#undef STR +#undef STR_HELPER #endif // USE_LOCAL_TLS_EMULATION() #endif // BASE_ALLOCATOR_DISPATCHER_TLS_H_
diff --git a/base/android/java/src/org/chromium/base/jank_tracker/JankTrackerStateController.java b/base/android/java/src/org/chromium/base/jank_tracker/JankTrackerStateController.java index 9a9ac492..b73883d 100644 --- a/base/android/java/src/org/chromium/base/jank_tracker/JankTrackerStateController.java +++ b/base/android/java/src/org/chromium/base/jank_tracker/JankTrackerStateController.java
@@ -6,6 +6,8 @@ import android.view.Window; +import org.chromium.base.Log; + /** * A simple holder class to enable easy starting and stopping of metric listening as well as * periodic reporting. This is used by JankTrackerImpl to hold the listener reference and this class @@ -13,6 +15,7 @@ * metrics. */ public class JankTrackerStateController { + private static final String TAG = "JankTracker"; protected final FrameMetricsListener mFrameMetricsListener; protected final JankReportingScheduler mReportingScheduler; @@ -41,7 +44,13 @@ public void stopMetricCollection(Window window) { mFrameMetricsListener.setIsListenerRecording(false); if (window != null) { - window.removeOnFrameMetricsAvailableListener(mFrameMetricsListener); + try { + window.removeOnFrameMetricsAvailableListener(mFrameMetricsListener); + } catch (IllegalArgumentException e) { + // Adding the listener failed for whatever reason, so it could not be unregistered. + Log.e(TAG, "Could not remove listener %s from window %s", mFrameMetricsListener, + window); + } } }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java index 5d82bf2b..9ac6b50 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java +++ b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumAndroidJUnitRunner.java
@@ -46,7 +46,6 @@ import org.chromium.base.Log; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.metrics.UmaRecorderHolder; -import org.chromium.base.multidex.ChromiumMultiDexInstaller; import org.chromium.base.test.util.CallbackHelper; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.InMemorySharedPreferences; @@ -64,18 +63,16 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; -import java.util.HashSet; import java.util.List; -import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; /** - * A custom AndroidJUnitRunner that supports multidex installer and lists out test information. - * Also customizes various TestRunner and Instrumentation behaviors, like when Activities get - * finished, and adds a timeout to waitForIdleSync. + * A custom AndroidJUnitRunner that supports incremental install and custom test listing. Also + * customizes various TestRunner and Instrumentation behaviors, like when Activities get finished, + * and adds a timeout to waitForIdleSync. * - * Please beware that is this not a class runner. It is declared in test apk AndroidManifest.xml + * <p>Please beware that is this not a class runner. It is declared in test apk AndroidManifest.xml * <instrumentation> */ @MainDex @@ -134,20 +131,6 @@ Context targetContext = super.getTargetContext(); boolean hasUnderTestApk = !getContext().getPackageName().equals(targetContext.getPackageName()); - // When there is an under-test APK, BuildConfig belongs to it and does not indicate whether - // the test apk is multidex. In this case, just assume it is. - boolean isTestMultidex = hasUnderTestApk || BuildConfig.IS_MULTIDEX_ENABLED; - if (isTestMultidex) { - if (hasUnderTestApk) { - // Need hacks to have multidex work when there is an under-test apk :(. - ChromiumMultiDexInstaller.install( - new BaseChromiumRunnerCommon.MultiDexContextWrapper( - getContext(), targetContext)); - BaseChromiumRunnerCommon.reorderDexPathElements(cl, getContext(), targetContext); - } else { - ChromiumMultiDexInstaller.install(getContext()); - } - } // Wrap |context| here so that calls to getSharedPreferences() from within // attachBaseContext() will hit our InMemorySharedPreferencesContext. @@ -299,30 +282,25 @@ } private Request createListTestRequest(Bundle arguments) { - ArrayList<DexFile> dexFiles = new ArrayList<>(); - try { - Class<?> bootstrapClass = - Class.forName("org.chromium.incrementalinstall.BootstrapApplication"); - DexFile[] incrementalInstallDexes = - (DexFile[]) bootstrapClass.getDeclaredField("sIncrementalDexFiles").get(null); - dexFiles.addAll(Arrays.asList(incrementalInstallDexes)); - } catch (Exception e) { - // Not an incremental apk. - if (BuildConfig.IS_MULTIDEX_ENABLED - && Build.VERSION.SDK_INT <= Build.VERSION_CODES.KITKAT) { - // Test listing fails for test classes that aren't in the main dex - // (crbug.com/903820). - addClassloaderDexFiles(dexFiles, getClass().getClassLoader()); - } - } - RunnerArgs runnerArgs = - new RunnerArgs.Builder().fromManifest(this).fromBundle(this, arguments).build(); TestRequestBuilder builder; - if (!dexFiles.isEmpty()) { - builder = new DexFileTestRequestBuilder(this, arguments, dexFiles); + if (BuildConfig.IS_INCREMENTAL_INSTALL) { + try { + Class<?> bootstrapClass = + Class.forName("org.chromium.incrementalinstall.BootstrapApplication"); + DexFile[] incrementalInstallDexes = + (DexFile[]) + bootstrapClass.getDeclaredField("sIncrementalDexFiles").get(null); + builder = + new DexFileTestRequestBuilder( + this, arguments, Arrays.asList(incrementalInstallDexes)); + } catch (Exception e) { + throw new RuntimeException(e); + } } else { builder = new TestRequestBuilder(this, arguments); } + RunnerArgs runnerArgs = + new RunnerArgs.Builder().fromManifest(this).fromBundle(this, arguments).build(); builder.addFromRunnerArgs(runnerArgs); builder.addPathToScan(getContext().getPackageCodePath()); @@ -338,15 +316,12 @@ } /** - * Wraps TestRequestBuilder to make it work with incremental install and for multidex <= K. + * Wraps TestRequestBuilder to make it work with incremental install. * - * TestRequestBuilder does not know to look through the incremental install dex files, and has - * no api for telling it to do so. This class checks to see if the list of tests was given - * by the runner (mHasClassList), and if not overrides the auto-detection logic in build() - * to manually scan all .dex files. - * - * On <= K, classes not in the main dex file are missed, so we manually list them by grabbing - * the loaded DexFiles from the ClassLoader. + * <p>TestRequestBuilder does not know to look through the incremental install dex files, and + * has no api for telling it to do so. This class checks to see if the list of tests was given + * by the runner (mHasClassList), and if not overrides the auto-detection logic in build() to + * manually scan all .dex files. */ private static class DexFileTestRequestBuilder extends TestRequestBuilder { final List<String> mExcludedPrefixes = new ArrayList<String>(); @@ -455,30 +430,6 @@ return field.get(instance); } - private static void addClassloaderDexFiles(List<DexFile> dexFiles, ClassLoader cl) { - // The main apk appears in the classpath twice sometimes, so check for apk path rather - // than comparing DexFile instances (e.g. on kitkat without an apk-under-test). - Set<String> apkPaths = new HashSet<>(); - try { - Object pathList = getField(cl.getClass().getSuperclass(), cl, "pathList"); - Object[] dexElements = - (Object[]) getField(pathList.getClass(), pathList, "dexElements"); - for (Object dexElement : dexElements) { - DexFile dexFile = (DexFile) getField(dexElement.getClass(), dexElement, "dexFile"); - // Prevent adding the main apk twice, and also skip any system libraries added due - // to <uses-library> manifest entries. - String apkPath = dexFile.getName(); - if (!apkPaths.contains(apkPath) && !apkPath.startsWith("/system")) { - dexFiles.add(dexFile); - apkPaths.add(apkPath); - } - } - } catch (Exception e) { - // No way to recover and test listing will fail. - throw new RuntimeException(e); - } - } - /** * ClassLoader that translates NoClassDefFoundError into ClassNotFoundException. * @@ -745,7 +696,6 @@ if (file.getName().equals("incremental-install-files")) { continue; } - // E.g. Legacy multidex files. if (file.getName().equals("code_cache")) { continue; } @@ -770,12 +720,6 @@ } private static boolean isSharedPrefFileAllowed(File f) { - // Multidex support library prefs need to stay or else multidex extraction will occur - // needlessly. - if (f.getName().endsWith("multidex.version.xml")) { - return true; - } - // WebView prefs need to stay because webview tests have no (good) way of hooking // SharedPreferences for instantiated WebViews. String[] allowlist = new String[] {
diff --git a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java b/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java deleted file mode 100644 index 835b7385..0000000 --- a/base/test/android/javatests/src/org/chromium/base/test/BaseChromiumRunnerCommon.java +++ /dev/null
@@ -1,164 +0,0 @@ -// Copyright 2017 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base.test; - -import android.content.Context; -import android.content.ContextWrapper; -import android.content.SharedPreferences; -import android.content.pm.ApplicationInfo; -import android.content.pm.PackageManager; - -import androidx.core.content.ContextCompat; - -import org.chromium.base.Log; -import org.chromium.base.test.util.PackageManagerWrapper; -import org.chromium.build.annotations.MainDex; - -import java.io.File; -import java.io.IOException; -import java.io.Serializable; -import java.lang.reflect.Field; -import java.util.Arrays; -import java.util.Comparator; - -/** - * Functionality common to the JUnit3 and JUnit4 runners. - */ -@MainDex -class BaseChromiumRunnerCommon { - private static final String TAG = "base_test"; - - /** - * A ContextWrapper that allows multidex test APKs to extract secondary dexes into - * the APK under test's data directory. - */ - @MainDex - static class MultiDexContextWrapper extends ContextWrapper { - private final Context mAppContext; - - MultiDexContextWrapper(Context instrContext, Context appContext) { - super(instrContext); - mAppContext = appContext; - } - - @Override - public File getFilesDir() { - return mAppContext.getFilesDir(); - } - - @Override - public SharedPreferences getSharedPreferences(String name, int mode) { - // Prefix so as to not conflict with main app's multidex prefs file. - return mAppContext.getSharedPreferences("test-" + name, mode); - } - - @Override - public PackageManager getPackageManager() { - return new PackageManagerWrapper(super.getPackageManager()) { - @Override - public ApplicationInfo getApplicationInfo(String packageName, int flags) { - try { - ApplicationInfo ai = super.getApplicationInfo(packageName, flags); - if (packageName.equals(getPackageName())) { - File dataDir = new File( - ContextCompat.getCodeCacheDir(mAppContext), "test-multidex"); - if (!dataDir.exists() && !dataDir.mkdirs()) { - throw new IOException(String.format( - "Unable to create test multidex directory \"%s\"", - dataDir.getPath())); - } - ai.dataDir = dataDir.getPath(); - } - return ai; - } catch (Exception e) { - Log.e(TAG, "Failed to get application info for %s", packageName, e); - } - return null; - } - }; - } - } - - /** - * Ensure all test dex entries precede app dex entries. - * - * @param cl ClassLoader to modify. Assumed to be a derivative of - * {@link dalvik.system.BaseDexClassLoader}. If this isn't - * the case, reordering will fail. - */ - static void reorderDexPathElements(ClassLoader cl, Context context, Context targetContext) { - try { - Log.i(TAG, - "Reordering dex files. If you're building a multidex test APK and see a " - + "class resolving to an unexpected implementation, this may be why."); - Field pathListField = findField(cl, "pathList"); - Object dexPathList = pathListField.get(cl); - Field dexElementsField = findField(dexPathList, "dexElements"); - Object[] dexElementsList = (Object[]) dexElementsField.get(dexPathList); - Arrays.sort(dexElementsList, - new DexListReorderingComparator( - context.getPackageName(), targetContext.getPackageName())); - dexElementsField.set(dexPathList, dexElementsList); - } catch (Exception e) { - Log.e(TAG, "Failed to reorder dex elements for testing.", e); - } - } - - /** - * Comparator for sorting dex list entries. - * - * Using this to sort a list of dex list entries will result in the following order: - * - Strings that contain neither the test package nor the app package in lexicographical - * order. - * - Strings that contain the test package in lexicographical order. - * - Strings that contain the app package but not the test package in lexicographical order. - */ - private static class DexListReorderingComparator implements Comparator<Object>, Serializable { - private String mTestPackage; - private String mAppPackage; - - public DexListReorderingComparator(String testPackage, String appPackage) { - mTestPackage = testPackage; - mAppPackage = appPackage; - } - - @Override - public int compare(Object o1, Object o2) { - String s1 = o1.toString(); - String s2 = o2.toString(); - if (s1.contains(mTestPackage)) { - if (!s2.contains(mTestPackage)) { - if (s2.contains(mAppPackage)) { - return -1; - } else { - return 1; - } - } - } else if (s1.contains(mAppPackage)) { - if (s2.contains(mTestPackage)) { - return 1; - } else if (!s2.contains(mAppPackage)) { - return 1; - } - } else if (s2.contains(mTestPackage) || s2.contains(mAppPackage)) { - return -1; - } - return s1.compareTo(s2); - } - } - - private static Field findField(Object instance, String name) throws NoSuchFieldException { - for (Class<?> clazz = instance.getClass(); clazz != null; clazz = clazz.getSuperclass()) { - try { - Field f = clazz.getDeclaredField(name); - f.setAccessible(true); - return f; - } catch (NoSuchFieldException e) { - } - } - throw new NoSuchFieldException( - "Unable to find field " + name + " in " + instance.getClass()); - } -}
diff --git a/base/time/time_apple.mm b/base/time/time_apple.mm index 8c3e041..073eab9 100644 --- a/base/time/time_apple.mm +++ b/base/time/time_apple.mm
@@ -88,28 +88,11 @@ } int64_t ComputeThreadTicks() { - // The pthreads library keeps a cached reference to the thread port, which - // does not have to be released like mach_thread_self() does. - mach_port_t thread_port = pthread_mach_thread_np(pthread_self()); - if (thread_port == MACH_PORT_NULL) { - DLOG(ERROR) << "Failed to get pthread_mach_thread_np()"; - return 0; - } - - mach_msg_type_number_t thread_info_count = THREAD_BASIC_INFO_COUNT; - thread_basic_info_data_t thread_info_data; - - kern_return_t kr = thread_info( - thread_port, THREAD_BASIC_INFO, - reinterpret_cast<thread_info_t>(&thread_info_data), &thread_info_count); - MACH_DCHECK(kr == KERN_SUCCESS, kr) << "thread_info"; - - base::CheckedNumeric<int64_t> absolute_micros( - thread_info_data.user_time.seconds + - thread_info_data.system_time.seconds); + struct timespec ts = {}; + CHECK(clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts) == 0); + base::CheckedNumeric<int64_t> absolute_micros(ts.tv_sec); absolute_micros *= base::Time::kMicrosecondsPerSecond; - absolute_micros += (thread_info_data.user_time.microseconds + - thread_info_data.system_time.microseconds); + absolute_micros += (ts.tv_nsec / base::Time::kNanosecondsPerMicrosecond); return absolute_micros.ValueOrDie(); }
diff --git a/base/win/registry.cc b/base/win/registry.cc index c33cda7..7b9dcb9 100644 --- a/base/win/registry.cc +++ b/base/win/registry.cc
@@ -268,14 +268,6 @@ return base::unexpected(result); } -FILETIME RegKey::GetLastWriteTime() const { - FILETIME last_write_time; - LONG result = RegQueryInfoKey(key_, nullptr, nullptr, nullptr, nullptr, - nullptr, nullptr, nullptr, nullptr, nullptr, - nullptr, &last_write_time); - return (result == ERROR_SUCCESS) ? last_write_time : FILETIME{}; -} - LONG RegKey::GetValueNameAt(DWORD index, std::wstring* name) const { wchar_t buf[256]; DWORD bufsize = std::size(buf);
diff --git a/base/win/registry.h b/base/win/registry.h index 860c1dd..ea7be2a 100644 --- a/base/win/registry.h +++ b/base/win/registry.h
@@ -85,9 +85,6 @@ // cannot be determined. base::expected<DWORD, LONG> GetValueCount() const; - // Returns the last write time or 0 on failure. - FILETIME GetLastWriteTime() const; - // Determines the nth value's name. LONG GetValueNameAt(DWORD index, std::wstring* name) const;
diff --git a/build/android/gyp/compile_resources.py b/build/android/gyp/compile_resources.py index 5024bfef..be0db0fb 100755 --- a/build/android/gyp/compile_resources.py +++ b/build/android/gyp/compile_resources.py
@@ -198,9 +198,6 @@ output_opts.add_argument( '--proguard-file', help='Path to proguard.txt generated file.') output_opts.add_argument( - '--proguard-file-main-dex', - help='Path to proguard.txt generated file for main dex.') - output_opts.add_argument( '--emit-ids-out', help='Path to file produced by aapt2 --emit-ids.') diff_utils.AddCommandLineFlags(parser) @@ -762,8 +759,6 @@ if options.proguard_file: link_command += ['--proguard', build.proguard_path] link_command += ['--proguard-minimal-keep-rules'] - if options.proguard_file_main_dex: - link_command += ['--proguard-main-dex', build.proguard_main_dex_path] if options.emit_ids_out: link_command += ['--emit-ids', build.emit_ids_path] @@ -903,7 +898,6 @@ (options.arsc_path, build.arsc_path), (options.proto_path, build.proto_path), (options.proguard_file, build.proguard_path), - (options.proguard_file_main_dex, build.proguard_main_dex_path), (options.emit_ids_out, build.emit_ids_path), (options.info_path, build.info_path), ]
diff --git a/build/android/gyp/dex.py b/build/android/gyp/dex.py index f2f92e0..ae87291 100755 --- a/build/android/gyp/dex.py +++ b/build/android/gyp/dex.py
@@ -61,13 +61,6 @@ parser.add_argument( '--incremental-dir', help='Path of directory to put intermediate dex files.') - parser.add_argument('--main-dex-rules-path', - action='append', - help='Path to main dex rules for multidex.') - parser.add_argument( - '--multi-dex', - action='store_true', - help='Allow multiple dex files within output.') parser.add_argument('--library', action='store_true', help='Allow numerous dex files within output.') @@ -94,12 +87,9 @@ '--classpath', action='append', help='GN-list of full classpath. Needed for --desugar') - parser.add_argument( - '--release', - action='store_true', - help='Run D8 in release mode. Release mode maximises main dex and ' - 'deletes non-essential line number information (vs debug which minimizes ' - 'main dex and keeps all line number information, and then some.') + parser.add_argument('--release', + action='store_true', + help='Run D8 in release mode.') parser.add_argument( '--min-api', help='Minimum Android API level compatibility.') parser.add_argument('--force-enable-assertions', @@ -116,9 +106,6 @@ ' Stores inputs to d8inputs.zip') options = parser.parse_args(args) - if options.main_dex_rules_path and not options.multi_dex: - parser.error('--main-dex-rules-path is unused if multidex is not enabled') - if options.force_enable_assertions and options.assertion_handler: parser.error('Cannot use both --force-enable-assertions and ' '--assertion-handler') @@ -220,10 +207,6 @@ needs_dexing = not all(f.endswith('.dex') for f in d8_inputs) needs_dexmerge = output.endswith('.dex') or not (options and options.library) if needs_dexing or needs_dexmerge: - if options and options.main_dex_rules_path: - for main_dex_rule in options.main_dex_rules_path: - dex_cmd = dex_cmd + ['--main-dex-rules', main_dex_rule] - tmp_dex_dir = os.path.join(tmp_dir, 'tmp_dex_dir') os.mkdir(tmp_dex_dir) @@ -429,8 +412,6 @@ build_utils.JAVA_PATH_FOR_INPUTS, options.r8_jar_path, options.custom_d8_jar_path ] + options.class_inputs + options.dex_inputs) - if options.main_dex_rules_path: - input_paths.extend(options.main_dex_rules_path) depfile_deps = options.class_inputs_filearg + options.dex_inputs_filearg @@ -484,8 +465,7 @@ for path in options.classpath: dex_cmd += ['--classpath', path] - if options.classpath or options.main_dex_rules_path: - # --main-dex-rules requires bootclasspath. + if options.classpath: dex_cmd += ['--lib', build_utils.JAVA_HOME] for path in options.bootclasspath: dex_cmd += ['--lib', path]
diff --git a/build/android/java/templates/BuildConfig.template b/build/android/java/templates/BuildConfig.template index 7d3f7b83..e2361af 100644 --- a/build/android/java/templates/BuildConfig.template +++ b/build/android/java/templates/BuildConfig.template
@@ -22,12 +22,6 @@ */ public class BuildConfig { -#if defined(ENABLE_MULTIDEX) - public static MAYBE_FINAL boolean IS_MULTIDEX_ENABLED = true; -#else - public static MAYBE_FINAL boolean IS_MULTIDEX_ENABLED MAYBE_FALSE; -#endif - #if defined(_ENABLE_ASSERTS) public static MAYBE_FINAL boolean ENABLE_ASSERTS = true; #else
diff --git a/build/android/main_dex_classes.flags b/build/android/main_dex_classes.flags deleted file mode 100644 index 7e04756..0000000 --- a/build/android/main_dex_classes.flags +++ /dev/null
@@ -1,47 +0,0 @@ -# Copyright 2017 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# Proguard flags for what should be kept in the main dex. Only used -# during main dex list determination, not during actual proguarding. - --keep @org.chromium.build.annotations.MainDex class * { - *; -} - --keepclasseswithmembers class * { - @org.chromium.build.annotations.MainDex <methods>; -} - -# Assume all IDL-generated classes should be kept. They can't reference other -# non-framework classes, so fairly low-risk. --keepclasseswithmembers class * { - public static ** asInterface(android.os.IBinder); -} - -# Required when code coverage is enabled. --keep class com.vladium.** { - *; -} - -# Renderers / GPU process don't load secondary dex. --keep public class * extends org.chromium.base.process_launcher.ChildProcessService { - *; -} - -# The following are based on $SDK_BUILD_TOOLS/mainDexClasses.rules -# Ours differ in that: -# 1. It omits -keeps for application / instrumentation / backupagents (these are -# redundant since they are added by aapt's main dex list rules output). -# 2. Omits keep for Application.attachBaseContext(), which is overly broad. -# 3. Omits keep for all annotations, which is also overly broad (and pulls in -# any class that has an @IntDef). - -######## START mainDexClasses.rules ######## - -# Keep old fashion tests in the main dex or they'll be silently ignored by InstrumentationTestRunner --keep public class * extends android.test.InstrumentationTestCase { - <init>(); -} - -######## END mainDexClasses.rules ########
diff --git a/build/config/android/internal_rules.gni b/build/config/android/internal_rules.gni index 4d058be4..afbbcf78 100644 --- a/build/config/android/internal_rules.gni +++ b/build/config/android/internal_rules.gni
@@ -1492,9 +1492,6 @@ _proguard_enabled = defined(invoker.proguard_enabled) && invoker.proguard_enabled _is_dex_merging = defined(invoker.input_dex_filearg) - _enable_multidex = - !defined(invoker.enable_multidex) || invoker.enable_multidex - _enable_main_dex_list = _enable_multidex && _min_sdk_version < 21 _enable_desugar = !defined(invoker.enable_desugar) || invoker.enable_desugar _desugar_needs_classpath = _enable_desugar @@ -1525,10 +1522,6 @@ "Proguard is required to support the custom assertion handler.") } - if (_enable_main_dex_list) { - _main_dex_rules = "//build/android/main_dex_classes.flags" - } - if (_desugar_needs_classpath || _proguard_enabled) { _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) } @@ -1594,22 +1587,6 @@ args += [ "--apply-mapping=$_rebased_apply_mapping_path" ] } - if (_enable_main_dex_list) { - if (defined(invoker.extra_main_dex_proguard_config)) { - args += [ - "--main-dex-rules-path", - rebase_path(invoker.extra_main_dex_proguard_config, - root_build_dir), - ] - inputs += [ invoker.extra_main_dex_proguard_config ] - } - args += [ - "--main-dex-rules-path", - rebase_path(_main_dex_rules, root_build_dir), - ] - inputs += [ _main_dex_rules ] - } - if (defined(invoker.output)) { output_path = invoker.output } else if (!defined(proguard_mapping_path)) { @@ -1663,7 +1640,7 @@ "--depfile", rebase_path(depfile, root_build_dir), "--output", - rebase_path(outputs[0], root_build_dir), + rebase_path(invoker.output, root_build_dir), "--min-api=$_min_sdk_version", "--r8-jar-path", rebase_path(_d8_path, root_build_dir), @@ -1685,25 +1662,6 @@ rebase_path("$target_out_dir/$target_name", root_build_dir), ] } - - if (_enable_multidex) { - args += [ "--multi-dex" ] - if (_enable_main_dex_list) { - if (defined(invoker.extra_main_dex_proguard_config)) { - args += [ - "--main-dex-rules-path", - rebase_path(invoker.extra_main_dex_proguard_config, - root_build_dir), - ] - inputs += [ invoker.extra_main_dex_proguard_config ] - } - args += [ - "--main-dex-rules-path", - rebase_path(_main_dex_rules, root_build_dir), - ] - inputs += [ _main_dex_rules ] - } - } if (_is_library) { args += [ "--library" ] } @@ -2175,8 +2133,6 @@ # proguard_file: (optional) # Path to proguard configuration file for this apk target. # - # proguard_file_main_dex: (optional) - # template("compile_resources") { forward_variables_from(invoker, TESTONLY_AND_VISIBILITY) @@ -2338,14 +2294,6 @@ ] } - if (defined(invoker.proguard_file_main_dex)) { - _outputs += [ invoker.proguard_file_main_dex ] - _args += [ - "--proguard-file-main-dex", - rebase_path(invoker.proguard_file_main_dex, root_build_dir), - ] - } - if (defined(invoker.aapt_locale_allowlist)) { _args += [ "--locale-allowlist=${invoker.aapt_locale_allowlist}" ] } @@ -4148,7 +4096,6 @@ deps += _header_classpath_deps + _unprocessed_jar_deps } - enable_multidex = false is_library = true # proguard_configs listed on java_library targets need to be marked
diff --git a/build/config/android/rules.gni b/build/config/android/rules.gni index cac756a..4b20245 100644 --- a/build/config/android/rules.gni +++ b/build/config/android/rules.gni
@@ -1546,7 +1546,7 @@ # Combines all dependent .jar files into a single proguarded .dex file. # # Variables: - # output: Path to the output dex. + # output: Path to the output .dex or .dex.jar. # proguard_enabled: Whether to enable R8. # proguard_configs: List of proguard configs. # proguard_enable_obfuscation: Whether to enable obfuscation (default=true). @@ -1595,7 +1595,6 @@ ]) deps = [ ":$_build_config_target_name" ] + _deps build_config = _build_config - enable_multidex = false output = invoker.output if (defined(proguard_enabled) && proguard_enabled) { # The individual dependencies would have caught real missing deps in @@ -1880,7 +1879,6 @@ # Variables: # use_final_fields: True to use final fields. When false, all other # variables must not be set. - # enable_multidex: Value for ENABLE_MULTIDEX. # min_sdk_version: Value for MIN_SDK_VERSION. # bundles_supported: Whether or not this target can be treated as a bundle. # resources_version_variable: @@ -1923,9 +1921,6 @@ if (invoker.use_final_fields) { forward_variables_from(invoker, [ "deps" ]) defines += [ "USE_FINAL" ] - if (invoker.enable_multidex) { - defines += [ "ENABLE_MULTIDEX" ] - } if (defined(invoker.min_sdk_version)) { defines += [ "_MIN_SDK_VERSION=${invoker.min_sdk_version}" ] } @@ -2118,8 +2113,6 @@ } _omit_dex = defined(invoker.omit_dex) && invoker.omit_dex - _enable_multidex = - !defined(invoker.enable_multidex) || invoker.enable_multidex if (!_is_bundle_module) { _final_apk_path = invoker.final_apk_path @@ -2305,11 +2298,6 @@ _final_deps = [ ":$_java_target_name" ] - _enable_main_dex_list = _enable_multidex && _min_sdk_version < 21 - if (_enable_main_dex_list) { - _generated_proguard_main_dex_config = - "$_base_path.resources.main-dex-proguard.txt" - } _generated_proguard_config = "$_base_path.resources.proguard.txt" if (defined(_shared_resources_allowlist_target)) { @@ -2399,9 +2387,6 @@ emit_ids_out_path = _compile_resources_emit_ids_out size_info_path = _res_size_info_path proguard_file = _generated_proguard_config - if (_enable_main_dex_list) { - proguard_file_main_dex = _generated_proguard_main_dex_config - } build_config = _build_config build_config_dep = ":$_build_config_target" @@ -2624,7 +2609,6 @@ bundles_supported = _bundles_supported use_final_fields = true assertions_implicitly_enabled = _assertions_implicitly_enabled - enable_multidex = _enable_multidex is_incremental_install = _incremental_apk write_clang_profiling_data = use_clang_coverage && _generate_native_libraries_java @@ -2797,7 +2781,6 @@ proguard_enabled = _proguard_enabled build_config = _build_config output = _final_dex_path - enable_multidex = _enable_multidex deps = [ ":$_build_config_target", ":$_java_target_name", @@ -2846,12 +2829,6 @@ if (!defined(enable_desugar)) { ignore_desugar_missing_deps = true } - - if (_enable_main_dex_list) { - # Generates main-dex config. - deps += [ ":$_compile_resources_target" ] - extra_main_dex_proguard_config = _generated_proguard_main_dex_config - } } _final_dex_target_dep = ":$_final_dex_target_name" @@ -3241,7 +3218,6 @@ "deps", "enable_lint", "enable_jni_multiplexing", - "enable_multidex", "enable_proguard_checks", "enforce_resource_overlays_in_tests", "expected_android_manifest", @@ -3389,7 +3365,6 @@ "data_deps", "deps", "enable_jni_multiplexing", - "enable_multidex", "expected_android_manifest", "expected_android_manifest_base", "expected_android_manifest_library_version_offset", @@ -4439,9 +4414,6 @@ # # proguard_enable_obfuscation: Whether to enable obfuscation (default=true) # - # enable_multidex: Optional. Enable multidexing of optimized modules jars - # when using synchronized proguarding. Only applies to base module. - # # proguard_android_sdk_dep: Optional. android_system_java_prebuilt() target # used as a library jar for synchronized proguarding. # @@ -4538,9 +4510,6 @@ _proguard_mapping_path = "${_bundle_path}.mapping" } - assert(_proguard_enabled || !defined(invoker.enable_multidex), - "Bundle only adds dexing step if proguarding is enabled.") - if (defined(invoker.extra_modules)) { _module_count = 0 not_needed([ "_module_count" ])
diff --git a/build/config/clang/clang.gni b/build/config/clang/clang.gni index 1a065b5..96cf72d8 100644 --- a/build/config/clang/clang.gni +++ b/build/config/clang/clang.gni
@@ -23,7 +23,8 @@ # TODO(crbug.com/1446146): Merge with enable_check_raw_ptr_fields once both # checks are activated on the same set of platforms. enable_check_raw_ref_fields = - build_with_chromium && !is_official_build && is_linux && !is_castos + build_with_chromium && !is_official_build && + ((is_linux && !is_castos) || (is_android && !is_cast_android) || is_win) clang_base_path = default_clang_base_path
diff --git a/cc/paint/oop_pixeltest.cc b/cc/paint/oop_pixeltest.cc index 6fc33bc..4f000b73 100644 --- a/cc/paint/oop_pixeltest.cc +++ b/cc/paint/oop_pixeltest.cc
@@ -2380,12 +2380,13 @@ UploadPixels(ri, yuv_mailboxes[1], uv_info, u_bitmap); UploadPixels(ri, yuv_mailboxes[2], uv_info, v_bitmap); - ri->ConvertYUVAMailboxesToRGB(dest_mailbox, kJPEG_SkYUVColorSpace, - TestColorSpaceConversion() - ? source_color_space.ToSkColorSpace().get() - : nullptr, - SkYUVAInfo::PlaneConfig::kY_U_V, - SkYUVAInfo::Subsampling::k420, yuv_mailboxes); + ri->ConvertYUVAMailboxesToRGB( + dest_mailbox, 0, 0, options.resource_size.width(), + options.resource_size.height(), kJPEG_SkYUVColorSpace, + TestColorSpaceConversion() ? source_color_space.ToSkColorSpace().get() + : nullptr, + SkYUVAInfo::PlaneConfig::kY_U_V, SkYUVAInfo::Subsampling::k420, + yuv_mailboxes); SkBitmap actual_bitmap = ReadbackMailbox(ri, dest_mailbox, options.resource_size, dest_color_space.ToSkColorSpace()); @@ -2461,10 +2462,11 @@ UploadPixels(ri, y_uv_mailboxes[0], y_info, y_bitmap); UploadPixels(ri, y_uv_mailboxes[1], uv_info, uv_bitmap); - ri->ConvertYUVAMailboxesToRGB(dest_mailbox, kJPEG_SkYUVColorSpace, - SkColorSpace::MakeSRGB().get(), - SkYUVAInfo::PlaneConfig::kY_UV, - SkYUVAInfo::Subsampling::k420, y_uv_mailboxes); + ri->ConvertYUVAMailboxesToRGB( + dest_mailbox, 0, 0, options.resource_size.width(), + options.resource_size.height(), kJPEG_SkYUVColorSpace, + SkColorSpace::MakeSRGB().get(), SkYUVAInfo::PlaneConfig::kY_UV, + SkYUVAInfo::Subsampling::k420, y_uv_mailboxes); SkBitmap actual_bitmap = ReadbackMailbox(ri, dest_mailbox, options.resource_size);
diff --git a/cc/resources/ui_resource_manager.cc b/cc/resources/ui_resource_manager.cc index d861cb4..b40f50c5 100644 --- a/cc/resources/ui_resource_manager.cc +++ b/cc/resources/ui_resource_manager.cc
@@ -24,7 +24,7 @@ DCHECK(!base::Contains(ui_resource_client_map_, next_id)); bool resource_lost = false; - UIResourceRequest request(UIResourceRequest::UI_RESOURCE_CREATE, next_id, + UIResourceRequest request(UIResourceRequest::Type::kCreate, next_id, client->GetBitmap(next_id, resource_lost)); ui_resource_request_queue_.push_back(request); @@ -41,7 +41,7 @@ if (iter == ui_resource_client_map_.end()) return; - UIResourceRequest request(UIResourceRequest::UI_RESOURCE_DELETE, uid); + UIResourceRequest request(UIResourceRequest::Type::kDelete, uid); ui_resource_request_queue_.push_back(request); ui_resource_client_map_.erase(iter); } @@ -53,7 +53,7 @@ bool resource_lost = true; if (!base::Contains(ui_resource_request_queue_, uid, &UIResourceRequest::GetId)) { - UIResourceRequest request(UIResourceRequest::UI_RESOURCE_CREATE, uid, + UIResourceRequest request(UIResourceRequest::Type::kCreate, uid, data.client->GetBitmap(uid, resource_lost)); ui_resource_request_queue_.push_back(request); }
diff --git a/cc/resources/ui_resource_request.cc b/cc/resources/ui_resource_request.cc index 224c21e..82cd6cc 100644 --- a/cc/resources/ui_resource_request.cc +++ b/cc/resources/ui_resource_request.cc
@@ -8,13 +8,12 @@ namespace cc { -UIResourceRequest::UIResourceRequest(UIResourceRequestType type, - UIResourceId id) +UIResourceRequest::UIResourceRequest(Type type, UIResourceId id) : type_(type), id_(id) { - DCHECK(type == UI_RESOURCE_DELETE); + DCHECK_EQ(type, Type::kDelete); } -UIResourceRequest::UIResourceRequest(UIResourceRequestType type, +UIResourceRequest::UIResourceRequest(Type type, UIResourceId id, const UIResourceBitmap& bitmap) : type_(type), id_(id), bitmap_(new UIResourceBitmap(bitmap)) {}
diff --git a/cc/resources/ui_resource_request.h b/cc/resources/ui_resource_request.h index 5a6fb6f7..35e3ab4 100644 --- a/cc/resources/ui_resource_request.h +++ b/cc/resources/ui_resource_request.h
@@ -16,20 +16,18 @@ class CC_EXPORT UIResourceRequest { public: - enum UIResourceRequestType { - UI_RESOURCE_CREATE, - UI_RESOURCE_DELETE, + enum class Type { + kCreate, + kDelete, }; - UIResourceRequest(UIResourceRequestType type, UIResourceId id); - UIResourceRequest(UIResourceRequestType type, - UIResourceId id, - const UIResourceBitmap& bitmap); + UIResourceRequest(Type type, UIResourceId id); + UIResourceRequest(Type type, UIResourceId id, const UIResourceBitmap& bitmap); UIResourceRequest(const UIResourceRequest& request); ~UIResourceRequest(); - UIResourceRequestType GetType() const { return type_; } + Type GetType() const { return type_; } UIResourceId GetId() const { return id_; } UIResourceBitmap GetBitmap() const { DCHECK(bitmap_); @@ -39,7 +37,7 @@ UIResourceRequest& operator=(const UIResourceRequest& request); private: - UIResourceRequestType type_; + Type type_; UIResourceId id_; std::unique_ptr<UIResourceBitmap> bitmap_; };
diff --git a/cc/slim/layer_tree_impl.cc b/cc/slim/layer_tree_impl.cc index 30f5893..f25cbea 100644 --- a/cc/slim/layer_tree_impl.cc +++ b/cc/slim/layer_tree_impl.cc
@@ -454,11 +454,11 @@ for (auto& resource_request : ui_resource_manager_.TakeUIResourcesRequests()) { switch (resource_request.GetType()) { - case cc::UIResourceRequest::UI_RESOURCE_CREATE: + case cc::UIResourceRequest::Type::kCreate: frame_sink_->UploadUIResource(resource_request.GetId(), resource_request.GetBitmap()); break; - case cc::UIResourceRequest::UI_RESOURCE_DELETE: + case cc::UIResourceRequest::Type::kDelete: frame_sink_->MarkUIResourceForDeletion(resource_request.GetId()); break; }
diff --git a/cc/trees/layer_tree_host_pixeltest_filters.cc b/cc/trees/layer_tree_host_pixeltest_filters.cc index ee7f864..6fb1679 100644 --- a/cc/trees/layer_tree_host_pixeltest_filters.cc +++ b/cc/trees/layer_tree_host_pixeltest_filters.cc
@@ -91,6 +91,11 @@ GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(LayerTreeHostFiltersPixelTestGPU); TEST_P(LayerTreeHostFiltersPixelTest, BackdropFilterBlurRect) { +#if defined(MEMORY_SANITIZER) + if (renderer_type() == viz::RendererType::kSkiaVk) { + GTEST_SKIP() << "TODO(crbug.com/1324336): Uninitialized data error"; + } +#endif scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( gfx::Rect(200, 200), SK_ColorWHITE); @@ -150,6 +155,11 @@ #define MAYBE_BackdropFilterBlurRadius BackdropFilterBlurRadius #endif // BUILDFLAG(IS_IOS) TEST_P(LayerTreeHostFiltersPixelTest, MAYBE_BackdropFilterBlurRadius) { +#if defined(MEMORY_SANITIZER) + if (renderer_type() == viz::RendererType::kSkiaVk) { + GTEST_SKIP() << "TODO(crbug.com/1324336): Uninitialized data error"; + } +#endif if (use_software_renderer()) { // TODO(989238): Software renderer does not support/implement // kClamp_TileMode. @@ -190,6 +200,11 @@ } TEST_P(LayerTreeHostFiltersPixelTest, BackdropFilterBlurRounded) { +#if defined(MEMORY_SANITIZER) + if (renderer_type() == viz::RendererType::kSkiaVk) { + GTEST_SKIP() << "TODO(crbug.com/1324336): Uninitialized data error"; + } +#endif scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer(gfx::Rect(200, 200), SK_ColorWHITE); @@ -237,6 +252,11 @@ } TEST_P(LayerTreeHostFiltersPixelTest, BackdropFilterBlurOutsets) { +#if defined(MEMORY_SANITIZER) + if (renderer_type() == viz::RendererType::kSkiaVk) { + GTEST_SKIP() << "TODO(crbug.com/1324336): Uninitialized data error"; + } +#endif scoped_refptr<SolidColorLayer> background = CreateSolidColorLayer( gfx::Rect(200, 200), SK_ColorWHITE);
diff --git a/cc/trees/layer_tree_impl.cc b/cc/trees/layer_tree_impl.cc index 667d564..41648fb 100644 --- a/cc/trees/layer_tree_impl.cc +++ b/cc/trees/layer_tree_impl.cc
@@ -2110,10 +2110,10 @@ ui_resource_request_queue_.size()); for (const auto& req : ui_resource_request_queue_) { switch (req.GetType()) { - case UIResourceRequest::UI_RESOURCE_CREATE: + case UIResourceRequest::Type::kCreate: host_impl_->CreateUIResource(req.GetId(), req.GetBitmap()); break; - case UIResourceRequest::UI_RESOURCE_DELETE: + case UIResourceRequest::Type::kDelete: host_impl_->DeleteUIResource(req.GetId()); break; }
diff --git a/chrome/VERSION b/chrome/VERSION index 957efab..b79f6d63 100644 --- a/chrome/VERSION +++ b/chrome/VERSION
@@ -1,4 +1,4 @@ MAJOR=119 MINOR=0 -BUILD=6044 +BUILD=6045 PATCH=0
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 0bcd52ec..ce172b1b 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -2491,7 +2491,6 @@ chrome_public_apk_or_module_tmpl("chrome_public_apk") { target_type = "android_apk" apk_name = "ChromePublic" - enable_multidex = is_java_debug art_profile_path = "//chrome/android/baseline_profiles/profile.txt" } @@ -3480,6 +3479,7 @@ "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java", "java/src/org/chromium/chrome/browser/compositor/layouts/content/TabContentManager.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java", + "java/src/org/chromium/chrome/browser/compositor/scene_layer/SolidColorSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java",
diff --git a/chrome/android/OWNERS b/chrome/android/OWNERS index 906a473b..6e4626d 100644 --- a/chrome/android/OWNERS +++ b/chrome/android/OWNERS
@@ -15,9 +15,7 @@ per-file chrome_java_resources.gni=* per-file chrome_test_java_sources.gni=* per-file chrome_junit_test_java_sources.gni=* - -# For VR Javatest changes. -per-file BUILD.gn=bsheedy@chromium.org +per-file BUILD.gn=* # Build-related files. per-file *.gn*=file://build/android/OWNERS
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 4ee9e382..ac72edb 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -383,6 +383,7 @@ "java/src/org/chromium/chrome/browser/compositor/resources/StaticResourcePreloads.java", "java/src/org/chromium/chrome/browser/compositor/resources/SystemResourcePreloads.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/ContextualSearchSceneLayer.java", + "java/src/org/chromium/chrome/browser/compositor/scene_layer/SolidColorSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/StaticTabSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabListSceneLayer.java", "java/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayer.java",
diff --git a/chrome/android/features/tab_ui/java/res/layout/tab_hover_card_holder.xml b/chrome/android/features/tab_ui/java/res/layout/tab_hover_card_holder.xml index cae4721..333e6972 100644 --- a/chrome/android/features/tab_ui/java/res/layout/tab_hover_card_holder.xml +++ b/chrome/android/features/tab_ui/java/res/layout/tab_hover_card_holder.xml
@@ -11,16 +11,30 @@ android:id="@+id/tab_hover_card_holder" android:layout_width="match_parent" android:layout_height="wrap_content" - android:padding="@dimen/tab_hover_card_layout_padding" android:visibility="gone" android:elevation="@dimen/tab_hover_card_elevation" android:orientation="vertical" android:background="@drawable/tab_hover_card_background"> + <!-- TODO (crbug.com/1451925): Rename to TabThumbnailView for generic use. --> + <org.chromium.chrome.browser.tasks.tab_management.TabGridThumbnailView + android:id="@+id/thumbnail" + android:layout_width="match_parent" + android:layout_height="@dimen/tab_hover_card_thumbnail_height" + android:gravity="center_horizontal" + android:scaleType="fitCenter" + android:importantForAccessibility="no" + app:cornerRadiusTopStart="@dimen/tab_hover_card_corner_radius" + app:cornerRadiusTopEnd="@dimen/tab_hover_card_corner_radius" + android:src="@color/thumbnail_placeholder_on_primary_bg"/> + <TextView android:id="@+id/title" android:layout_width="match_parent" android:layout_height="wrap_content" + android:layout_marginTop="@dimen/tab_hover_card_text_content_margin" + android:layout_marginStart="@dimen/tab_hover_card_text_content_margin" + android:layout_marginEnd="@dimen/tab_hover_card_text_content_margin" android:ellipsize="end" android:maxLines="2" android:textDirection="locale" @@ -31,6 +45,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_marginTop="@dimen/tab_hover_card_url_top_margin" + android:layout_marginStart="@dimen/tab_hover_card_text_content_margin" + android:layout_marginEnd="@dimen/tab_hover_card_text_content_margin" + android:layout_marginBottom="@dimen/tab_hover_card_text_content_margin" android:ellipsize="end" android:maxLines="1" android:textDirection="locale"
diff --git a/chrome/android/features/tab_ui/java/res/values/dimens.xml b/chrome/android/features/tab_ui/java/res/values/dimens.xml index cff0ab0b..7e2d585 100644 --- a/chrome/android/features/tab_ui/java/res/values/dimens.xml +++ b/chrome/android/features/tab_ui/java/res/values/dimens.xml
@@ -85,11 +85,12 @@ <dimen name="tab_selection_editor_longpress_entry_threshold">20dp</dimen> <dimen name="tab_selection_editor_share_sheet_preview_thumbnail_padding">10dp</dimen> - <!-- Tab hover card dimensions --> + <!-- Large form factor device strip tab hover card dimensions --> <dimen name="tab_hover_card_width">264dp</dimen> <dimen name="tab_hover_card_window_horizontal_margin">8dp</dimen> - <dimen name="tab_hover_card_layout_padding">16dp</dimen> - <dimen name="tab_hover_card_url_top_margin">4dp</dimen> + <dimen name="tab_hover_card_thumbnail_height">135dp</dimen> + <dimen name="tab_hover_card_text_content_margin">16dp</dimen> + <dimen name="tab_hover_card_url_top_margin">8dp</dimen> <dimen name="tab_hover_card_bg_color_elev">@dimen/default_elevation_0</dimen> <dimen name="tab_hover_card_corner_radius">8dp</dimen> <dimen name="tab_hover_card_elevation">6dp</dimen>
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView.java index c990974..da4521d6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView.java
@@ -120,7 +120,7 @@ if (!mInitialized) return; mRectF.set(0, 0, getMeasuredWidth(), getMeasuredHeight()); - if (TabUiFeatureUtilities.sThumbnailPlaceholder.isEnabled()) { + if (useThumbnailPlaceholder()) { resizeIconDrawable(); } } @@ -180,7 +180,7 @@ if (isPlaceholder()) { setBackground(mBackgroundDrawable); - if (TabUiFeatureUtilities.sThumbnailPlaceholder.isEnabled()) { + if (useThumbnailPlaceholder()) { updateIconDrawable(); } return; @@ -210,7 +210,7 @@ * @return whether the image drawable is a placeholder. */ public boolean isPlaceholder() { - if (TabUiFeatureUtilities.sThumbnailPlaceholder.isEnabled()) { + if (useThumbnailPlaceholder()) { // The drawable can only be null if we just removed the drawable and need to set the // mIconDrawable. if (getDrawable() == null) return true; @@ -242,7 +242,7 @@ // Make property changes outside the flag intentionally in the event the flag flips status // these will have no material effect on the UI and are safe. mIconColor = newColor; - if (TabUiFeatureUtilities.sThumbnailPlaceholder.isEnabled() && mIconDrawable != null) { + if (useThumbnailPlaceholder() && mIconDrawable != null) { setColorFilter(mIconColor, PorterDuff.Mode.SRC_IN); } @@ -298,4 +298,9 @@ setImageMatrix(mIconMatrix); } } + + private boolean useThumbnailPlaceholder() { + return TabUiFeatureUtilities.sThumbnailPlaceholder.isEnabled() + || TabUiFeatureUtilities.sAdvancedPeripheralsSupportTabStrip.isEnabled(); + } }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java index 2ce37ba..fd40417 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayout.java
@@ -21,6 +21,7 @@ import android.view.ViewGroup; import android.widget.FrameLayout; +import androidx.annotation.ColorInt; import androidx.annotation.IntDef; import androidx.annotation.Nullable; @@ -36,6 +37,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.components.LayoutTab; import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; +import org.chromium.chrome.browser.compositor.scene_layer.SolidColorSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.StaticTabSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.TabListSceneLayer; import org.chromium.chrome.browser.flags.ChromeFeatureList; @@ -127,7 +129,7 @@ * An empty SceneLayer is used to avoid drawing a SceneLayer with any content when the * animation is not running. Used when sGridTabSwitcherAndroidAnimations is enabled. */ - private SceneLayer mEmptySceneLayer; + private SolidColorSceneLayer mEmptySceneLayer; /** * TabListSceneLayer is used to show the dynamic resource for the Tab Switcher when using * composited animations. Used when sGridTabSwitcherAndroidAnimations is not enabled. @@ -362,6 +364,18 @@ @Override public void destroy() { mController.removeTabSwitcherViewObserver(mTabSwitcherObserver); + if (mTabSceneLayer != null) { + mTabSceneLayer.destroy(); + mTabSceneLayer = null; + } + if (mEmptySceneLayer != null) { + mEmptySceneLayer.destroy(); + mEmptySceneLayer = null; + } + if (mTabListSceneLayer != null) { + mTabListSceneLayer.destroy(); + mTabListSceneLayer = null; + } } @Override @@ -617,7 +631,7 @@ if (ChromeFeatureList.sGridTabSwitcherAndroidAnimations.isEnabled()) { mTabSceneLayer = new StaticTabSceneLayer(); - mEmptySceneLayer = new SceneLayer(); + mEmptySceneLayer = new SolidColorSceneLayer(); } else { mTabListSceneLayer = new TabListSceneLayer(); } @@ -668,8 +682,7 @@ Rect origin = new Rect(x, y, x + 1, y + 1); resetTabJavaView(new Rect(x, offsetY, x + 1, offsetY + 1)); mTabJavaView.setImageBitmap(null); - mTabJavaView.setBackgroundColor( - ChromeColors.getPrimaryBackgroundColor(getContext(), newIsIncognito)); + updateBackgroundColor(newIsIncognito); mTabJavaView.setVisibility(View.INVISIBLE); mRectAnimator = new GtsRectAnimator(mTabJavaView, origin, fullscreenRect); @@ -690,6 +703,7 @@ }); mRunningNewTabAnimation = true; + mShowEmptyLayer = true; mTabJavaView.invalidate(); mTabJavaView.setOnNextLayoutRunnable(() -> { mTabJavaView.setVisibility(View.VISIBLE); @@ -703,10 +717,12 @@ super.forceAnimationToFinish(); if (mConditionalAnimationRunnerRef != null && mConditionalAnimationRunnerRef.get() != null) { - // If we are forcing the animation to finish treat this identically to a timeout. - mConditionalAnimationRunnerRef.get().runAnimationDueToTimeout(); + // Prevent re-entrancy. + ConditionalAnimationRunner runner = mConditionalAnimationRunnerRef.get(); mConditionalAnimationRunnerRef.clear(); mConditionalAnimationRunnerRef = null; + // If we are forcing the animation to finish treat this identically to a timeout. + runner.runAnimationDueToTimeout(); } mTabJavaView.runOnNextLayoutRunnable(); if (mNewTabAnimation != null) { @@ -869,8 +885,7 @@ resetTabJavaView(new Rect(fullscreenRect.left, topMargin, fullscreenRect.right, fullscreenRect.bottom + topMargin)); - mTabJavaView.setBackgroundColor( - ChromeColors.getPrimaryBackgroundColor(getContext(), isIncognito())); + updateBackgroundColor(isIncognito()); mTabJavaView.setImageBitmap(bitmap); mTabJavaView.setVisibility(View.INVISIBLE); @@ -969,8 +984,7 @@ return; } - mTabJavaView.setBackgroundColor( - ChromeColors.getPrimaryBackgroundColor(getContext(), isIncognito())); + updateBackgroundColor(isIncognito()); mTabJavaView.setImageBitmap(bitmap); mRectAnimator.setRect(source); mTabJavaView.setVisibility(View.VISIBLE); @@ -1296,6 +1310,13 @@ } } + private void updateBackgroundColor(boolean isIncognito) { + @ColorInt + int backgroundColor = ChromeColors.getPrimaryBackgroundColor(getContext(), isIncognito); + mTabJavaView.setBackgroundColor(backgroundColor); + mEmptySceneLayer.setBackgroundColor(backgroundColor); + } + private ConditionalAnimationRunner createShrinkAnimationRunner(boolean shouldAnimate) { if (ChromeFeatureList.sGridTabSwitcherAndroidAnimations.isEnabled()) { return new ConditionalAnimationRunner((bitmap, tabListCanShowQuickly) -> {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java index ad9db28..428b767e 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabUiFeatureUtilities.java
@@ -50,6 +50,10 @@ public static final MutableFlagWithSafeDefault sThumbnailPlaceholder = new MutableFlagWithSafeDefault(ChromeFeatureList.THUMBNAIL_PLACEHOLDER, false); + public static final MutableFlagWithSafeDefault sAdvancedPeripheralsSupportTabStrip = + new MutableFlagWithSafeDefault( + ChromeFeatureList.ADVANCED_PERIPHERALS_SUPPORT_TAB_STRIP, false); + // Cached and fixed values. private static boolean sTabSelectionEditorLongPressEntryEnabled; private static Boolean sIsTabToGtsAnimationEnabled;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailViewRenderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailViewRenderTest.java index 4fed96b..73985073 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailViewRenderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailViewRenderTest.java
@@ -203,8 +203,10 @@ @Test @MediumTest @Feature("RenderTest") - @DisableFeatures({ChromeFeatureList.THUMBNAIL_PLACEHOLDER}) - public void testNoPlaceholderDrawable() throws IOException, InterruptedException { + @DisableFeatures({ChromeFeatureList.THUMBNAIL_PLACEHOLDER, + ChromeFeatureList.ADVANCED_PERIPHERALS_SUPPORT_TAB_STRIP}) + public void + testNoPlaceholderDrawable() throws IOException, InterruptedException { TestThreadUtils.runOnUiThreadBlocking(() -> { updateColor(/*isIncognito=*/true, /*isSelected=*/false); mTabGridThumbnailView.setImageDrawable(null);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java index eea151e6..792c17d2 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java
@@ -42,7 +42,6 @@ import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider.TabFavicon; import org.chromium.chrome.browser.tasks.tab_management.TabListFaviconProvider.TabFaviconFetcher; import org.chromium.chrome.tab_ui.R; -import org.chromium.chrome.test.AutomotiveContextWrapperTestRule; import org.chromium.chrome.test.util.browser.Features; import org.chromium.ui.modelutil.PropertyModel; import org.chromium.ui.widget.ViewLookupCachingFrameLayout; @@ -54,9 +53,6 @@ private static final int INIT_HEIGHT = 200; @Rule public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor(); - @Rule - public AutomotiveContextWrapperTestRule mAutomotiveContextWrapperTestRule = - new AutomotiveContextWrapperTestRule(); @Mock private ViewLookupCachingFrameLayout mViewGroup; @Mock
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java index 1d117f0..50e21d3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java
@@ -336,7 +336,7 @@ private ActivityTabStartupMetricsTracker mActivityTabStartupMetricsTracker; /** A means of providing the foreground tab of the activity to different features. */ - private ActivityTabProvider mActivityTabProvider = new ActivityTabProvider(); + private final ActivityTabProvider mActivityTabProvider = new ActivityTabProvider(); /** Whether or not the activity is in started state. */ private boolean mStarted; @@ -421,10 +421,18 @@ protected void onPreCreate() { incrementCounter(ChromePreferenceKeys.UMA_ON_PRECREATE_COUNTER); CachedFlagsSafeMode.getInstance().onStartOrResumeCheckpoint(); + if (earlyInitializeStartupMetrics()) { + mActivityTabStartupMetricsTracker = + new ActivityTabStartupMetricsTracker(mTabModelSelectorSupplier); + } super.onPreCreate(); initializeBackPressHandling(); } + private boolean earlyInitializeStartupMetrics() { + return ChromeFeatureList.sEarlyInitializeStartupMetrics.isEnabled(); + } + @Override protected void onAbortCreate() { super.onAbortCreate(); @@ -687,8 +695,10 @@ ChromeActivitySessionTracker.getInstance(); chromeActivitySessionTracker.registerTabModelSelectorSupplier( this, mTabModelSelectorSupplier); - mActivityTabStartupMetricsTracker = - new ActivityTabStartupMetricsTracker(mTabModelSelectorSupplier); + if (!earlyInitializeStartupMetrics()) { + mActivityTabStartupMetricsTracker = + new ActivityTabStartupMetricsTracker(mTabModelSelectorSupplier); + } } public ActivityTabStartupMetricsTracker getActivityTabStartupMetricsTracker() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java index 7055bf4..b79d0f7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/flags/ChromeCachedFlags.java
@@ -27,6 +27,7 @@ import org.chromium.chrome.browser.flags.CachedFlagUtils; import org.chromium.chrome.browser.flags.CachedFlagsSafeMode; import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.hub.HubFieldTrial; import org.chromium.chrome.browser.notifications.chime.ChimeFeatures; import org.chromium.chrome.browser.omaha.VersionNumberGetter; import org.chromium.chrome.browser.omnibox.OmniboxFeatures; @@ -86,6 +87,9 @@ BrandingController.USE_TEMPORARY_STORAGE, BrandingController.ANIMATE_TOOLBAR_ICON_TRANSITION, ChimeFeatures.ALWAYS_REGISTER, FeedPlaceholderLayout.ENABLE_INSTANT_START_ANIMATION, + HubFieldTrial.FLOATING_ACTION_BUTTON, HubFieldTrial.PANE_SWITCHER_USES_TEXT, + HubFieldTrial.SUPPORTS_OTHER_TABS, HubFieldTrial.SUPPORTS_SEARCH, + HubFieldTrial.SUPPORTS_BOOKMARKS, OptimizationGuidePushNotificationManager.MAX_CACHE_SIZE, OmniboxFeatures.ENABLE_MODERNIZE_VISUAL_UPDATE_ON_TABLET, OmniboxFeatures.MODERNIZE_VISUAL_UPDATE_ACTIVE_COLOR_ON_OMNIBOX, @@ -126,6 +130,7 @@ VersionNumberGetter.MIN_SDK_VERSION, MinimizeAppAndCloseTabBackPressHandler.SYSTEM_BACK, BackPressManager.TAB_HISTORY_RECOVER); + // clang-format on tryToCatchMissingParameters(fieldTrialsToCache); CachedFlagUtils.cacheFieldTrialParameters(fieldTrialsToCache); @@ -171,7 +176,6 @@ * Do not add new simple boolean flags here, add them to {@link #cacheNativeFlags} instead. */ public static void cacheAdditionalNativeFlags() { - CachedFlagsSafeMode.cacheSafeModeForCachedFlagsEnabled(); cacheReachedCodeProfilerTrialGroup(); // Propagate REACHED_CODE_PROFILER feature value to LibraryLoader. This can't be done in
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java index 06b32b5..f2ba6e8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFragment.java
@@ -39,6 +39,7 @@ import org.chromium.chrome.browser.browsing_data.TimePeriodUtils.TimePeriodSpinnerOption; import org.chromium.chrome.browser.feedback.FragmentHelpAndFeedbackLauncher; import org.chromium.chrome.browser.feedback.HelpAndFeedbackLauncher; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.historyreport.AppIndexingReporter; import org.chromium.chrome.browser.multiwindow.MultiWindowUtils; import org.chromium.chrome.browser.preferences.Pref; @@ -696,7 +697,11 @@ @VisibleForTesting SpannableString buildSignOutOfChromeText() { - return SpanApplier.applySpans(getContext().getString(R.string.sign_out_of_chrome_link), + int signOutOfChromeStringId = getClearBrowsingDataTabType() == ClearBrowsingDataTab.ADVANCED + && ChromeFeatureList.isEnabled(ChromeFeatureList.QUICK_DELETE_FOR_ANDROID) + ? R.string.sign_out_of_chrome_link_advanced + : R.string.sign_out_of_chrome_link; + return SpanApplier.applySpans(getContext().getString(signOutOfChromeStringId), new SpanInfo("<link1>", "</link1>", new NoUnderlineClickableSpan( requireContext(), createSignOutOfChromeCallback())));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java index 49200fb..60276b8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -91,7 +91,7 @@ () -> mLayerTitleCache, tabModelStartupInfoSupplier, lifecycleDispatcher, multiInstanceManager, - toolbarContainerView, tabHoverCardViewStub); + toolbarContainerView, tabHoverCardViewStub, tabContentManagerSupplier); addSceneOverlay(mTabStripLayoutHelperManager); addObserver(mTabStripLayoutHelperManager.getTabSwitcherObserver());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java index 55db864..031ec484 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -32,6 +32,7 @@ import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton; import org.chromium.chrome.browser.compositor.layouts.components.CompositorButton.CompositorOnClickHandler; import org.chromium.chrome.browser.compositor.layouts.components.TintedCompositorButton; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.compositor.layouts.eventfilter.AreaMotionEventFilter; import org.chromium.chrome.browser.compositor.layouts.eventfilter.MotionEventHandler; import org.chromium.chrome.browser.compositor.scene_layer.TabStripSceneLayer; @@ -299,6 +300,7 @@ * drag and drop. * @param toolbarContainerView @{link View} passed to @{link TabDragSource} for drag and drop. * @param tabHoverCardViewStub The {@link ViewStub} representing the strip tab hover card. + * @param tabContentManagerSupplier Supplier of the {@link TabContentManager} instance. */ public StripLayoutHelperManager(Context context, LayoutManagerHost managerHost, LayoutUpdateHost updateHost, LayoutRenderHost renderHost, @@ -306,7 +308,8 @@ ObservableSupplier<TabModelStartupInfo> tabModelStartupInfoSupplier, ActivityLifecycleDispatcher lifecycleDispatcher, MultiInstanceManager multiInstanceManager, View toolbarContainerView, - @NonNull ViewStub tabHoverCardViewStub) { + @NonNull ViewStub tabHoverCardViewStub, + ObservableSupplier<TabContentManager> tabContentManagerSupplier) { mUpdateHost = updateHost; mLayerTitleCacheSupplier = layerTitleCacheSupplier; mTabStripTreeProvider = new TabStripSceneLayer(context); @@ -409,7 +412,7 @@ tabHoverCardViewStub.setOnInflateListener((viewStub, view) -> { var hoverCardView = (StripTabHoverCardView) view; - hoverCardView.initialize(mTabModelSelector); + hoverCardView.initialize(mTabModelSelector, tabContentManagerSupplier); mNormalHelper.setTabHoverCardView(hoverCardView); mIncognitoHelper.setTabHoverCardView(hoverCardView); });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardView.java index 102463a..657087c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardView.java
@@ -7,6 +7,7 @@ import android.content.Context; import android.util.AttributeSet; import android.util.DisplayMetrics; +import android.util.Size; import android.widget.LinearLayout; import android.widget.TextView; @@ -15,12 +16,16 @@ import androidx.core.view.ViewCompat; import org.chromium.base.MathUtils; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.chrome.R; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.tab.TabUtils; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; import org.chromium.chrome.browser.tabmodel.TabModelSelectorObserver; +import org.chromium.chrome.browser.tasks.tab_management.TabGridThumbnailView; import org.chromium.chrome.browser.tasks.tab_management.TabManagementFieldTrial; import org.chromium.chrome.browser.tasks.tab_management.TabUiThemeProvider; import org.chromium.components.embedder_support.util.UrlUtilities; @@ -29,25 +34,28 @@ public class StripTabHoverCardView extends LinearLayout { // The max width of the tab hover card in terms of the enclosing window width percent. static final float HOVER_CARD_MAX_WIDTH_PERCENT = 0.9f; + static final int INVALID_TAB_ID = -1; private TextView mTitleView; private TextView mUrlView; + private TabGridThumbnailView mThumbnailView; private TabModelSelector mTabModelSelector; private TabModelSelectorObserver mTabModelSelectorObserver; + private TabContentManager mTabContentManager; + + private int mLastHoveredTabId = INVALID_TAB_ID; + private boolean mIsShowing; public StripTabHoverCardView(Context context, @Nullable AttributeSet attrs) { super(context, attrs); } - public StripTabHoverCardView(Context context) { - super(context); - } - @Override protected void onFinishInflate() { super.onFinishInflate(); mTitleView = findViewById(R.id.title); mUrlView = findViewById(R.id.url); + mThumbnailView = findViewById(R.id.thumbnail); } /** @@ -61,6 +69,29 @@ public void show(Tab hoveredTab, StripLayoutTab hoveredStripLayoutTab, boolean isSelectedTab, float height) { if (hoveredTab == null) return; + mLastHoveredTabId = hoveredTab.getId(); + mIsShowing = true; + + var thumbnailSize = new Size( + Math.round(getContext().getResources().getDimension(R.dimen.tab_hover_card_width)), + Math.round(getContext().getResources().getDimension( + R.dimen.tab_hover_card_thumbnail_height))); + mTabContentManager.getTabThumbnailWithCallback( + hoveredTab.getId(), thumbnailSize, thumbnail -> { + // Thumbnail request was for a previous hover. + if (hoveredTab.getId() != mLastHoveredTabId) return; + // View is not visible any more. + if (!mIsShowing) return; + if (thumbnail != null) { + TabUtils.setBitmapAndUpdateImageMatrix( + mThumbnailView, thumbnail, thumbnailSize); + } else { + // Always use the unselected tab version of the thumbnail placeholder. + mThumbnailView.updateThumbnailPlaceholder( + hoveredTab.isIncognito(), /* isSelected= */ false); + } + }, false, false); + mTitleView.setText(hoveredTab.getTitle()); String url = hoveredTab.getUrl().getHost(); // If the URL is a Chrome scheme, display the GURL spec instead of the host. For e.g., use @@ -83,16 +114,22 @@ * Hide the strip tab hover card. */ public void hide() { + mIsShowing = false; setVisibility(GONE); + mThumbnailView.setImageDrawable(null); + mLastHoveredTabId = INVALID_TAB_ID; } /** * Perform tasks after the view is inflated: update the hover card colors, and add a {@link * TabModelSelectorObserver} to update the view when a tab model is selected. * @param tabModelSelector The {@link TabModelSelector} to observe. + * @param tabContentManagerSupplier Supplier of the {@link TabContentManager} instance. */ - public void initialize(TabModelSelector tabModelSelector) { + public void initialize(TabModelSelector tabModelSelector, + ObservableSupplier<TabContentManager> tabContentManagerSupplier) { mTabModelSelector = tabModelSelector; + mTabContentManager = tabContentManagerSupplier.get(); mTabModelSelectorObserver = new TabModelSelectorObserver() { @Override public void onTabModelSelected(TabModel newModel, TabModel oldModel) { @@ -203,15 +240,15 @@ return new float[] {hoverCardXDp * displayDensity, hoverCardYDp * displayDensity}; } - void setTitleViewForTesting(TextView titleView) { - mTitleView = titleView; - } - - void setUrlViewForTesting(TextView urlView) { - mUrlView = urlView; - } - TabModelSelectorObserver getTabModelSelectorObserverForTesting() { return mTabModelSelectorObserver; } + + int getLastHoveredTabIdForTesting() { + return mLastHoveredTabId; + } + + boolean isShowingForTesting() { + return mIsShowing; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/SolidColorSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/SolidColorSceneLayer.java new file mode 100644 index 0000000..f0b93ce --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/scene_layer/SolidColorSceneLayer.java
@@ -0,0 +1,49 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.compositor.scene_layer; + +import androidx.annotation.ColorInt; + +import org.chromium.base.annotations.JNINamespace; +import org.chromium.base.annotations.NativeMethods; +import org.chromium.chrome.browser.layouts.scene_layer.SceneLayer; + +/** + * A solid color scene layer to use as a background for a layout without other composited content. + */ +@JNINamespace("android") +public class SolidColorSceneLayer extends SceneLayer { + // NOTE: If you use SceneLayer's native pointer here, the JNI generator will try to + // downcast using reinterpret_cast<>. We keep a separate pointer to avoid it. + private long mNativePtr; + + /** + * Set a background color for the scene layer. + * @param backgroundColor The {@link ColorInt} for the color to set. + */ + public void setBackgroundColor(@ColorInt int backgroundColor) { + SolidColorSceneLayerJni.get().setBackgroundColor(mNativePtr, backgroundColor); + } + + @Override + protected void initializeNative() { + if (mNativePtr == 0) { + mNativePtr = SolidColorSceneLayerJni.get().init(SolidColorSceneLayer.this); + } + assert mNativePtr != 0; + } + + @Override + public void destroy() { + super.destroy(); + mNativePtr = 0; + } + + @NativeMethods + interface Natives { + long init(SolidColorSceneLayer caller); + void setBackgroundColor(long nativeSolidColorSceneLayer, int backgroundColor); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java index f4acf9d..91ee9fe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ChromeBrowserInitializer.java
@@ -93,17 +93,8 @@ } /** - * @deprecated use isFullBrowserInitialized() instead, the name hasNativeInitializationCompleted - * is not accurate. - */ - @Deprecated - public boolean hasNativeInitializationCompleted() { - return isFullBrowserInitialized(); - } - - /** - * Either runs a task now, or queue it until native (full browser) initialization is done. - * + * Either runs a task now, or queue it until full browser initialization is done. + * <p> * All Runnables added this way will run in a single UI thread task. * * @param task The task to run.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java index 633f345..1a8b912c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/settings/AccountManagementFragment.java
@@ -300,7 +300,7 @@ SyncSettingsUtils.toOnClickListener(this, () -> { assert IdentityServicesProvider.get() .getIdentityManager(getProfile()) - .hasPrimaryAccount(ConsentLevel.SYNC); + .hasPrimaryAccount(ConsentLevel.SIGNIN); SyncSettingsUtils.openGoogleMyAccount(getActivity()); }));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS index 7dcc68c..84185e1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/DEPS
@@ -112,6 +112,7 @@ 'TabUtils\.java' : [ "+chrome/android/java/src/org/chromium/chrome/browser/app/ChromeActivity.java", "+chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsStateProvider.java", + "+chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridThumbnailView.java", ], 'TabViewManagerImpl\.java': [ "+chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BrowserControlsMarginSupplier.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index 6926253..9293be24 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -540,7 +540,7 @@ doClick(params.clickTargetId, tab); try { // Some tests have a long delay before starting the load. - loadCallback.waitForCallback(loadCount, 1, 10, TimeUnit.SECONDS); + loadCallback.waitForCallback(loadCount, 1, 20, TimeUnit.SECONDS); } catch (TimeoutException ex) { // Non-subframe clicks shouldn't be flaky. if (!params.willLoadSubframe) throw ex;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java index b51a099cd..3f096df 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/sync/OpenTabsTest.java
@@ -21,6 +21,7 @@ import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaNotSatisfiedException; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Feature; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.tabmodel.TabModelSelector; @@ -142,6 +143,7 @@ @Test @LargeTest @Feature({"Sync"}) + @DisabledTest(message = "crbug.com/1488616") public void testDownloadOpenTab() { addFakeServerTabs(FAKE_CLIENT, URL); SyncTestUtil.triggerSync();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java index 71ddccc3..dece719 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManagerTest.java
@@ -38,6 +38,7 @@ import org.chromium.chrome.browser.compositor.layouts.LayoutRenderHost; import org.chromium.chrome.browser.compositor.layouts.LayoutUpdateHost; import org.chromium.chrome.browser.compositor.layouts.components.TintedCompositorButton; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.compositor.overlays.strip.StripLayoutHelperManager.TabModelStartupInfo; import org.chromium.chrome.browser.compositor.scene_layer.TabStripSceneLayer; import org.chromium.chrome.browser.compositor.scene_layer.TabStripSceneLayerJni; @@ -101,6 +102,8 @@ private StripLayoutTab mHoveredStripTab; @Mock private ViewStub mTabHoverCardViewStub; + @Mock + private ObservableSupplierImpl<TabContentManager> mTabContentManagerSupplier; private StripLayoutHelperManager mStripLayoutHelperManager; private Context mContext; @@ -133,7 +136,7 @@ mStripLayoutHelperManager = new StripLayoutHelperManager(mContext, mManagerHost, mUpdateHost, mRenderHost, mLayerTitleCacheSupplier, mTabModelStartupInfoSupplier, mLifecycleDispatcher, mMultiInstanceManager, mToolbarContainerView, - mTabHoverCardViewStub); + mTabHoverCardViewStub, mTabContentManagerSupplier); mStripLayoutHelperManager.setTabModelSelector(mTabModelSelector, mTabCreatorManager); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardViewUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardViewUnitTest.java index 76eede1..d1433fd0 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardViewUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripTabHoverCardViewUnitTest.java
@@ -5,24 +5,32 @@ package org.chromium.chrome.browser.compositor.overlays.strip; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.anyFloat; +import static org.mockito.ArgumentMatchers.anyInt; import static org.mockito.ArgumentMatchers.eq; +import static org.mockito.ArgumentMatchers.refEq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.spy; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import static org.robolectric.Robolectric.buildActivity; +import android.app.Activity; import android.content.Context; import android.content.res.ColorStateList; -import android.view.ContextThemeWrapper; +import android.graphics.Bitmap; +import android.graphics.drawable.BitmapDrawable; +import android.util.Size; import android.view.View; +import android.widget.ImageView.ScaleType; import android.widget.TextView; import androidx.coordinatorlayout.widget.CoordinatorLayout.LayoutParams; import androidx.core.content.ContextCompat; -import androidx.test.core.app.ApplicationProvider; import org.junit.Before; import org.junit.Rule; @@ -30,19 +38,22 @@ import org.junit.rules.TestRule; import org.junit.runner.RunWith; import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.junit.MockitoJUnit; import org.mockito.junit.MockitoRule; import org.robolectric.annotation.Config; -import org.robolectric.annotation.LooperMode; -import org.robolectric.annotation.LooperMode.Mode; +import org.chromium.base.Callback; +import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.chrome.R; +import org.chromium.chrome.browser.compositor.layouts.content.TabContentManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tabmodel.TabModel; import org.chromium.chrome.browser.tabmodel.TabModelSelector; +import org.chromium.chrome.browser.tasks.tab_management.TabGridThumbnailView; import org.chromium.chrome.browser.tasks.tab_management.TabManagementFieldTrial; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; @@ -53,39 +64,62 @@ /** Unit tests for {@link StripTabHoverCardView}. */ @RunWith(BaseRobolectricTestRunner.class) -@EnableFeatures({ChromeFeatureList.TAB_STRIP_REDESIGN}) +@EnableFeatures({ChromeFeatureList.TAB_STRIP_REDESIGN, + ChromeFeatureList.ADVANCED_PERIPHERALS_SUPPORT_TAB_STRIP}) @Config(manifest = Config.NONE, qualifiers = "sw600dp") -@LooperMode(Mode.LEGACY) public class StripTabHoverCardViewUnitTest { @Rule public TestRule mFeaturesProcessorRule = new Features.JUnitProcessor(); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); - @Mock - private TextView mTitleView; - @Mock - private TextView mUrlView; + @Captor + private ArgumentCaptor<Callback<Bitmap>> mGetThumbnailCallbackCaptor; + @Mock private Tab mHoveredTab; @Mock private StripLayoutTab mHoveredStripTab; @Mock private TabModelSelector mTabModelSelector; + @Mock + private ObservableSupplier<TabContentManager> mTabContentManagerSupplier; + @Mock + private TabContentManager mTabContentManager; private static final float STRIP_STACK_HEIGHT = 500.f; private StripTabHoverCardView mTabHoverCardView; + private TabGridThumbnailView mThumbnailView; + private TextView mTitleView; + private TextView mUrlView; private Context mContext; + private Bitmap mBitmap; + private int mHoverCardWidth; @Before public void setUp() { - mContext = new ContextThemeWrapper(ApplicationProvider.getApplicationContext(), - org.chromium.chrome.R.style.Theme_BrowserUI_DayNight); - mTabHoverCardView = new StripTabHoverCardView(mContext); - mTabHoverCardView.setTitleViewForTesting(mTitleView); - mTabHoverCardView.setUrlViewForTesting(mUrlView); + Activity activity = buildActivity(Activity.class).setup().get(); + activity.setTheme(R.style.Theme_BrowserUI_DayNight); + mTabHoverCardView = (StripTabHoverCardView) activity.getLayoutInflater().inflate( + R.layout.tab_hover_card_holder, null); + mThumbnailView = mTabHoverCardView.findViewById(R.id.thumbnail); + mTitleView = mTabHoverCardView.findViewById(R.id.title); + mUrlView = mTabHoverCardView.findViewById(R.id.url); + + mContext = mTabHoverCardView.getContext(); mContext.getResources().getDisplayMetrics().density = 1f; + + when(mTabContentManagerSupplier.get()).thenReturn(mTabContentManager); + mTabHoverCardView.initialize(mTabModelSelector, mTabContentManagerSupplier); + mBitmap = Bitmap.createBitmap(100, 200, Bitmap.Config.RGB_565); + + mHoverCardWidth = + mContext.getResources().getDimensionPixelSize(R.dimen.tab_hover_card_width); + int thumbnailHeight = mContext.getResources().getDimensionPixelSize( + R.dimen.tab_hover_card_thumbnail_height); + mThumbnailView.measure(mHoverCardWidth, thumbnailHeight); + mThumbnailView.layout(0, 0, mHoverCardWidth, thumbnailHeight); } @Test @@ -94,22 +128,120 @@ var title = "Tab 1"; when(mHoveredTab.getTitle()).thenReturn(title); when(mHoveredTab.getUrl()).thenReturn(url); + when(mHoveredTab.getId()).thenReturn(1); StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); cardViewSpy.show(mHoveredTab, mHoveredStripTab, false, STRIP_STACK_HEIGHT); - verify(mTitleView).setText(eq(mHoveredTab.getTitle())); - verify(mUrlView).setText(eq(mHoveredTab.getUrl().getHost())); + assertEquals("Card title text is incorrect.", mHoveredTab.getTitle(), mTitleView.getText()); + assertEquals( + "Card URL text is incorrect.", mHoveredTab.getUrl().getHost(), mUrlView.getText()); + assertEquals("|mLastHoveredTabId| is incorrect.", 1, + cardViewSpy.getLastHoveredTabIdForTesting()); + assertTrue("|mIsShowing| should be true.", cardViewSpy.isShowingForTesting()); verify(cardViewSpy).setX(anyFloat()); verify(cardViewSpy).setY(anyFloat()); verify(cardViewSpy).setVisibility(eq(View.VISIBLE)); - // Test chrome:// tab hover card display text. - url = JUnitTestGURLs.NTP_URL; + verify(mTabContentManager) + .getTabThumbnailWithCallback(anyInt(), + refEq(new Size(mThumbnailView.getWidth(), mThumbnailView.getHeight())), + mGetThumbnailCallbackCaptor.capture(), eq(false), eq(false)); + mGetThumbnailCallbackCaptor.getValue().onResult(mBitmap); + + assertEquals("Thumbnail scale type is incorrect.", ScaleType.MATRIX, + mThumbnailView.getScaleType()); + assertNotNull("Thumbnail image matrix should be set.", mThumbnailView.getImageMatrix()); + assertEquals("Thumbnail image bitmap is incorrect.", mBitmap, + ((BitmapDrawable) mThumbnailView.getDrawable()).getBitmap()); + } + + @Test + public void hoveredTabUsesChromeScheme() { + var url = JUnitTestGURLs.NTP_URL; + var title = "Tab 1"; + when(mHoveredTab.getTitle()).thenReturn(title); when(mHoveredTab.getUrl()).thenReturn(url); - mTabHoverCardView.show(mHoveredTab, mHoveredStripTab, false, STRIP_STACK_HEIGHT); - verify(mUrlView).setText(eq(mHoveredTab.getUrl().getSpec().replaceFirst("/$", ""))); + StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); + cardViewSpy.show(mHoveredTab, mHoveredStripTab, false, STRIP_STACK_HEIGHT); + + assertEquals("Card title text is incorrect.", mHoveredTab.getTitle(), mTitleView.getText()); + // Verify chrome:// tab hover card display text. + assertEquals("Card URL text is incorrect.", + mHoveredTab.getUrl().getSpec().replaceFirst("/$", ""), mUrlView.getText()); + verify(cardViewSpy).setX(anyFloat()); + verify(cardViewSpy).setY(anyFloat()); + verify(cardViewSpy).setVisibility(eq(View.VISIBLE)); + } + + @Test + @EnableFeatures(ChromeFeatureList.THUMBNAIL_PLACEHOLDER) + public void hoveredTabHasMissingThumbnail() { + var url = JUnitTestGURLs.EXAMPLE_URL; + var title = "Tab 1"; + when(mHoveredTab.getTitle()).thenReturn(title); + when(mHoveredTab.getUrl()).thenReturn(url); + when(mHoveredTab.isIncognito()).thenReturn(false); + + StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); + cardViewSpy.show(mHoveredTab, mHoveredStripTab, false, STRIP_STACK_HEIGHT); + verify(mTabContentManager) + .getTabThumbnailWithCallback(anyInt(), + refEq(new Size(mThumbnailView.getWidth(), mThumbnailView.getHeight())), + mGetThumbnailCallbackCaptor.capture(), eq(false), eq(false)); + mGetThumbnailCallbackCaptor.getValue().onResult(null); + assertFalse("Thumbnail drawable should not contain a bitmap.", + mThumbnailView.getDrawable() instanceof BitmapDrawable); + } + + @Test + public void hoveredTabChangedBeforeThumbnailCallback() { + var url = JUnitTestGURLs.EXAMPLE_URL; + var title = "Tab 1"; + when(mHoveredTab.getTitle()).thenReturn(title); + when(mHoveredTab.getUrl()).thenReturn(url); + when(mHoveredTab.getId()).thenReturn(1); + + StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); + cardViewSpy.show(mHoveredTab, mHoveredStripTab, false, STRIP_STACK_HEIGHT); + // Assume that the hovered tab has changed before the thumbnail is fetched. + when(mHoveredTab.getId()).thenReturn(2); + + verify(mTabContentManager) + .getTabThumbnailWithCallback(anyInt(), + refEq(new Size(mThumbnailView.getWidth(), mThumbnailView.getHeight())), + mGetThumbnailCallbackCaptor.capture(), eq(false), eq(false)); + mGetThumbnailCallbackCaptor.getValue().onResult(mBitmap); + assertFalse("Thumbnail drawable should not contain a bitmap.", + mThumbnailView.getDrawable() instanceof BitmapDrawable); + } + + @Test + public void hoverCardHiddenBeforeThumbnailCallback() { + var url = JUnitTestGURLs.EXAMPLE_URL; + var title = "Tab 1"; + when(mHoveredTab.getTitle()).thenReturn(title); + when(mHoveredTab.getUrl()).thenReturn(url); + + StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); + cardViewSpy.show(mHoveredTab, mHoveredStripTab, false, STRIP_STACK_HEIGHT); + // Assume that the hover card is hidden before the thumbnail is fetched. + cardViewSpy.hide(); + // Verify state is reset on hide. + assertFalse("|mIsShowing| should be false.", mTabHoverCardView.isShowingForTesting()); + assertEquals( + "Hover card view should be hidden.", View.GONE, mTabHoverCardView.getVisibility()); + assertEquals("|mLastHoveredTabId| should be reset.", StripTabHoverCardView.INVALID_TAB_ID, + mTabHoverCardView.getLastHoveredTabIdForTesting()); + + verify(mTabContentManager) + .getTabThumbnailWithCallback(anyInt(), + refEq(new Size(mThumbnailView.getWidth(), mThumbnailView.getHeight())), + mGetThumbnailCallbackCaptor.capture(), eq(false), eq(false)); + mGetThumbnailCallbackCaptor.getValue().onResult(mBitmap); + assertFalse("Thumbnail drawable should not contain a bitmap.", + mThumbnailView.getDrawable() instanceof BitmapDrawable); } @Test @@ -132,11 +264,10 @@ @Test public void getHoverCardPosition_CardWidthExceedsWindowWidth() { // Set window width to be slightly smaller than the default card width. - float cardWidth = mContext.getResources().getDimension(R.dimen.tab_hover_card_width); - mContext.getResources().getDisplayMetrics().widthPixels = (int) (cardWidth - 1); + mContext.getResources().getDisplayMetrics().widthPixels = (int) (mHoverCardWidth - 1); // Set simulated hovered StripLayoutTab drawX for expected hover card position. when(mHoveredStripTab.getDrawX()).thenReturn(10f); - var originalLayoutParams = new LayoutParams((int) cardWidth, 200); + var originalLayoutParams = new LayoutParams((int) mHoverCardWidth, 200); StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); when(cardViewSpy.getLayoutParams()).thenReturn(originalLayoutParams); @@ -144,7 +275,7 @@ cardViewSpy.getHoverCardPosition(mHoveredStripTab, false, STRIP_STACK_HEIGHT); ArgumentCaptor<LayoutParams> captor = ArgumentCaptor.forClass(LayoutParams.class); verify(cardViewSpy).setLayoutParams(captor.capture()); - assertEquals("Card width is incorrect.", Math.round(0.9f * (cardWidth - 1)), + assertEquals("Card width is incorrect.", Math.round(0.9f * (mHoverCardWidth - 1)), captor.getValue().width); assertEquals("Card x position is incorrect.", 10f, position[0], 0f); assertEquals("Card y position is incorrect.", STRIP_STACK_HEIGHT, position[1], 0f); @@ -164,12 +295,11 @@ // Assume that the tab's hover card extends beyond the right edge of the app window. int windowWidth = mContext.getResources().getDisplayMetrics().widthPixels; - float cardWidth = mContext.getResources().getDimension(R.dimen.tab_hover_card_width); - when(mHoveredStripTab.getDrawX()).thenReturn(windowWidth - cardWidth + 1); + when(mHoveredStripTab.getDrawX()).thenReturn(windowWidth - mHoverCardWidth + 1f); position = mTabHoverCardView.getHoverCardPosition(mHoveredStripTab, false, STRIP_STACK_HEIGHT); assertEquals("Card should maintain a minimum margin from the right edge of the app window.", - windowWidth - cardWidth - windowHorizontalMargin, position[0], 0f); + windowWidth - mHoverCardWidth - windowHorizontalMargin, position[0], 0f); } @Test @@ -178,10 +308,9 @@ TabManagementFieldTrial.TAB_STRIP_REDESIGN_ENABLE_DETACHED.setForTesting(true); LocalizationUtils.setRtlForTesting(true); - float cardWidth = mContext.getResources().getDimension(R.dimen.tab_hover_card_width); // Set simulated hovered StripLayoutTab drawX and width for expected hover card position. when(mHoveredStripTab.getDrawX()).thenReturn(28f); - when(mHoveredStripTab.getWidth()).thenReturn(cardWidth - 2); + when(mHoveredStripTab.getWidth()).thenReturn(mHoverCardWidth - 2f); float[] position = mTabHoverCardView.getHoverCardPosition(mHoveredStripTab, false, STRIP_STACK_HEIGHT); @@ -191,7 +320,6 @@ } @Test - @EnableFeatures(ChromeFeatureList.ADVANCED_PERIPHERALS_SUPPORT_TAB_STRIP) public void updateHoverCardColors() { StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); @@ -200,38 +328,41 @@ verify(cardViewSpy) .setBackgroundTintList(eq(ColorStateList.valueOf(ContextCompat.getColor( mContext, R.color.default_bg_color_dark_elev_5_baseline)))); - verify(mTitleView).setTextColor(eq(mContext.getColor(R.color.default_text_color_light))); - verify(mUrlView).setTextColor( - eq(mContext.getColor(R.color.default_text_color_secondary_light))); + assertEquals("Title text color is incorrect.", + mContext.getColor(R.color.default_text_color_light), + mTitleView.getCurrentTextColor()); + assertEquals("URL text color is incorrect.", + mContext.getColor(R.color.default_text_color_secondary_light), + mUrlView.getCurrentTextColor()); // Test standard colors. cardViewSpy.updateHoverCardColors(false); verify(cardViewSpy) .setBackgroundTintList(eq(ColorStateList.valueOf(ChromeColors.getSurfaceColor( mContext, R.dimen.tab_hover_card_bg_color_elev)))); - verify(mTitleView).setTextColor(eq(SemanticColorUtils.getDefaultTextColor(mContext))); - verify(mUrlView).setTextColor( - eq(SemanticColorUtils.getDefaultTextColorSecondary(mContext))); + assertEquals("Title text color is incorrect.", + SemanticColorUtils.getDefaultTextColor(mContext), mTitleView.getCurrentTextColor()); + assertEquals("URL text color is incorrect.", + SemanticColorUtils.getDefaultTextColorSecondary(mContext), + mUrlView.getCurrentTextColor()); } @Test - @EnableFeatures(ChromeFeatureList.ADVANCED_PERIPHERALS_SUPPORT_TAB_STRIP) public void initialize() { StripTabHoverCardView cardViewSpy = spy(mTabHoverCardView); // View is inflated in standard tab model. when(mTabModelSelector.isIncognitoSelected()).thenReturn(false); - cardViewSpy.initialize(mTabModelSelector); + cardViewSpy.initialize(mTabModelSelector, mTabContentManagerSupplier); verify(cardViewSpy).updateHoverCardColors(false); // View is inflated in incognito tab model. when(mTabModelSelector.isIncognitoSelected()).thenReturn(true); - cardViewSpy.initialize(mTabModelSelector); + cardViewSpy.initialize(mTabModelSelector, mTabContentManagerSupplier); verify(cardViewSpy).updateHoverCardColors(true); } @Test - @EnableFeatures(ChromeFeatureList.ADVANCED_PERIPHERALS_SUPPORT_TAB_STRIP) public void tabModelSelectorObserver_OnTabModelSelected() { var standardTabModel = mock(TabModel.class); var incognitoTabModel = mock(TabModel.class); @@ -243,7 +374,7 @@ // Assume standard tab model. when(mTabModelSelector.isIncognitoSelected()).thenReturn(false); // TabModelSelectorObserver should be added after the view is inflated. - cardViewSpy.initialize(mTabModelSelector); + cardViewSpy.initialize(mTabModelSelector, mTabContentManagerSupplier); var tabModelSelectorObserver = cardViewSpy.getTabModelSelectorObserverForTesting(); assertNotNull("TabModelSelectorObserver should be set.", tabModelSelectorObserver);
diff --git a/chrome/android/webapk/shell_apk/javatests/dex_optimizer/BUILD.gn b/chrome/android/webapk/shell_apk/javatests/dex_optimizer/BUILD.gn index 14fd8c6..c0153c3 100644 --- a/chrome/android/webapk/shell_apk/javatests/dex_optimizer/BUILD.gn +++ b/chrome/android/webapk/shell_apk/javatests/dex_optimizer/BUILD.gn
@@ -8,10 +8,6 @@ # Used as an additional_apk in test scripts. never_incremental = true - # Multidex requires a custom Application class to initialize it. Simpler to - # just disable it. - enable_multidex = false - android_manifest = "AndroidManifest.xml" apk_name = "DexOptimizer" chromium_code = false
diff --git a/chrome/app/chromeos_strings.grdp b/chrome/app/chromeos_strings.grdp index b9d114d..eb123bb 100644 --- a/chrome/app/chromeos_strings.grdp +++ b/chrome/app/chromeos_strings.grdp
@@ -613,10 +613,10 @@ You can customize this device to fit your needs. These accessibility features can be changed later in Settings. </message> <message name="IDS_NETWORK_SELECTION_TITLE" desc="Title of network selection screen" meaning="A title of the dialog where user should select network to connect to Internet"> - Connect to network + Get connected to enjoy all the features on your new <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> </message> - <message name="IDS_NETWORK_SELECTION_HINT" desc="Under-title line on the network selection screen" meaning="A hint to the user why device should be connected to the network"> - To restore your data, connect to the internet + <message name="IDS_NETWORK_SELECTION_SUBTITLE" desc="Subtitle of the network selection screen"> + We will remember your network the next time you use the <ph name="DEVICE_TYPE">$1<ex>Chromebook</ex></ph> </message> <message name="IDS_NETWORK_SELECTION_ERROR" desc="Error shown when connection to network failed or timed out."> <ph name="PRODUCT_NAME">$1<ex>ChromeOS</ex></ph> was unable to connect to <ph name="NETWORK_ID">$2<ex>Public Wifi</ex></ph>. Please select another network or try again.
diff --git a/chrome/app/chromeos_strings_grdp/IDS_NETWORK_SELECTION_SUBTITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_NETWORK_SELECTION_SUBTITLE.png.sha1 new file mode 100644 index 0000000..602f8e3 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_NETWORK_SELECTION_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +6eda86cd12af7cc50161b95288787d63cec3fb83 \ No newline at end of file
diff --git a/chrome/app/chromeos_strings_grdp/IDS_NETWORK_SELECTION_TITLE.png.sha1 b/chrome/app/chromeos_strings_grdp/IDS_NETWORK_SELECTION_TITLE.png.sha1 new file mode 100644 index 0000000..602f8e3 --- /dev/null +++ b/chrome/app/chromeos_strings_grdp/IDS_NETWORK_SELECTION_TITLE.png.sha1
@@ -0,0 +1 @@ +6eda86cd12af7cc50161b95288787d63cec3fb83 \ No newline at end of file
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 76136be..0b10daa9 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -16036,7 +16036,7 @@ </message> <!-- Experimental enterprise plus_addresses feature strings --> - <message name="IDS_PLUS_ADDRESS_MODAL_TITLE" desc="Title for the experimental enterprise plus addresses feature modal" translateable="false" formatter_data="android_java"> + <message name="IDS_PLUS_ADDRESS_MODAL_TITLE" desc="Title for the experimental enterprise plus addresses feature modal" translateable="false"> Lorem Ipsum </message> <message name="IDS_PLUS_ADDRESS_MODAL_PLUS_ADDRESS_LABEL" desc="Label for the upper portion of the plus addresses modal" translateable="false" formatter_data="android_java">
diff --git a/chrome/app/resources/chromium_strings_af.xtb b/chrome/app/resources/chromium_strings_af.xtb index 63f6d81..83e61b5 100644 --- a/chrome/app/resources/chromium_strings_af.xtb +++ b/chrome/app/resources/chromium_strings_af.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Herbegin Chromium?</translation> <translation id="7483335560992089831">Kan nie dieselfde Chromium-weergawe installeer wat tans gebruik word nie. Maak Chromium asseblief toe en probeer weer.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium sal oor 1 minuut herbegin}other{Chromium sal oor # minute herbegin}}</translation> -<translation id="7561906087460245826">Vee data ook uit Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium kan jou belangstellings skat. ’n Werf wat jy besoek kan Chromium later vra om jou belangstellings te sien om die advertensies wat jy sien, te personaliseer.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-installeerder</translation> <translation id="761356813943268536">Chromium gebruik tans jou kamera en mikrofoon.</translation>
diff --git a/chrome/app/resources/chromium_strings_am.xtb b/chrome/app/resources/chromium_strings_am.xtb index 94cba62..304b1393 100644 --- a/chrome/app/resources/chromium_strings_am.xtb +++ b/chrome/app/resources/chromium_strings_am.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium ዳግም ይጀመር?</translation> <translation id="7483335560992089831">እየሄደ ያለውን ተመሳሳዩን የChromium ስሪት መጫን አይቻልም። እባክዎ Chromiumን ይዝጉና እንደገና ይሞክሩ።</translation> <translation id="753534427205733210">{0,plural, =1{Chromium በ1 ደቂቃ ውስጥ ዳግም ይጀመራል}one{Chromium በ# ደቂቃዎች ውስጥ ዳግም ይጀመራል}other{Chromium በ# ደቂቃዎች ውስጥ ዳግም ይጀመራል}}</translation> -<translation id="7561906087460245826">በተጨማሪ ከChromium (<ph name="URL" />) ውሂብን አጽዳ</translation> <translation id="7582945390259497898">Chromium የእርስዎን ፍላጎቶች ሊገምት ይችላል። በኋላ ላይ እርስዎ የሚጎበኙት ጣቢያ እርስዎ የሚያዩዋቸውን ማስታወቂያዎች ግላዊነት ለማላበስ Chromium ዝንባሌዎችዎን እንዲያይ ሊጠይቅ ይችላል።</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ጫኝ</translation> <translation id="761356813943268536">Chromium ካሜራዎን እና ማይክሮፎንዎን እየተጠቀመ ነው።</translation>
diff --git a/chrome/app/resources/chromium_strings_ar.xtb b/chrome/app/resources/chromium_strings_ar.xtb index a680a0c..f13c0df 100644 --- a/chrome/app/resources/chromium_strings_ar.xtb +++ b/chrome/app/resources/chromium_strings_ar.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">هل تريد إعادة تشغيل Chromium؟</translation> <translation id="7483335560992089831">لا يمكن تثبيت إصدار Chromium ذاته الذي يتم تشغيله حاليًا. يُرجى إغلاق Chromium وإعادة المحاولة.</translation> <translation id="753534427205733210">{0,plural, =1{ستتم إعادة تشغيل Chromium في غضون دقيقة واحدة}zero{ستتم إعادة تشغيل Chromium في غضون # دقيقة}two{ستتم إعادة تشغيل Chromium في غضون دقيقتين}few{ستتم إعادة تشغيل Chromium في غضون # دقائق}many{ستتم إعادة تشغيل Chromium في غضون # دقيقةً}other{ستتم إعادة تشغيل Chromium في غضون # دقيقة}}</translation> -<translation id="7561906087460245826">محو البيانات من Chromium أيضًا (<ph name="URL" />)</translation> <translation id="7582945390259497898">يمكن أن يحدّد Chromium اهتماماتك وفق تقديره. وبعد ذلك، يمكن للموقع الإلكتروني الذي تنتقل إليه أن يطلب من Chromium معرفة اهتماماتك من أجل تخصيص الإعلانات التي تظهر لك.</translation> <translation id="7583399374488819119">أداة تثبيت <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">يستخدم Chromium الكاميرا والميكروفون.</translation>
diff --git a/chrome/app/resources/chromium_strings_as.xtb b/chrome/app/resources/chromium_strings_as.xtb index c2826342..934fa78 100644 --- a/chrome/app/resources/chromium_strings_as.xtb +++ b/chrome/app/resources/chromium_strings_as.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chromium পুনৰ লঞ্চ কৰিবনে?</translation> <translation id="7483335560992089831">বর্তমান চলি থকা Chromiumৰ একেই সংস্কৰণটো ইনষ্টল কৰিব নোৱাৰি। অনুগ্ৰহ কৰি Chromium বন্ধ কৰি পুনৰ চেষ্টা কৰক।</translation> <translation id="753534427205733210">{0,plural, =1{১ মিনিটত Chromium পুনৰ লঞ্চ হ’ব}one{# মিনিটত Chromium পুনৰ লঞ্চ হ’ব}other{# মিনিটত Chromium পুনৰ লঞ্চ হ’ব}}</translation> -<translation id="7561906087460245826">লগতে Chromium (<ph name="URL" />)ৰ ডেটাও মচক</translation> <translation id="7582945390259497898">Chromiumএ আপোনাৰ আগ্ৰহ অনুমান কৰিব পাৰে। পাছত, আপুনি চোৱা কোনো ছাইটে আপুনি দেখা বিজ্ঞাপনসমূহ ব্যক্তিগতকৃত কৰিবলৈ Chromiumক আপোনাৰ আগ্ৰহসমূহৰ বিষয়ে সুধিব পাৰে।</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ইনষ্টলাৰ</translation> <translation id="761356813943268536">Chromiumএ আপোনাৰ কেমেৰা আৰু মাইক্ৰ'ফ'ন ব্যৱহাৰ কৰি আছে।</translation>
diff --git a/chrome/app/resources/chromium_strings_az.xtb b/chrome/app/resources/chromium_strings_az.xtb index 0df94070..f4f5b840d 100644 --- a/chrome/app/resources/chromium_strings_az.xtb +++ b/chrome/app/resources/chromium_strings_az.xtb
@@ -335,7 +335,6 @@ <translation id="7467949745582939695">Chromium yenidən başladılsın?</translation> <translation id="7483335560992089831">Hazırda istifadə olunan Chromium versiyasını quraşdıra bilməzsiniz. Lütfən, Chromium'u qapadın və yenidən cəhd edin.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 dəqiqəyə yenidən başlayacaq}other{Chromium # dəqiqəyə yenidən başlayacaq}}</translation> -<translation id="7561906087460245826">Chromium'dan datanı silin (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium maraqlarınızı təxmin edə bilər. Daha sonra ziyarət etdiyiniz sayt gördüyünüz reklamları fərdiləşdirmək üçün Chromium'dan maraqlarınızı görməyi tələb edə bilər.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> Quraşdırıcısı</translation> <translation id="761356813943268536">Chromium kameranızı və mikrofonunuzu işlədir.</translation>
diff --git a/chrome/app/resources/chromium_strings_be.xtb b/chrome/app/resources/chromium_strings_be.xtb index e1e9080c..64bdbf38c 100644 --- a/chrome/app/resources/chromium_strings_be.xtb +++ b/chrome/app/resources/chromium_strings_be.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Перазапусціць Chromium?</translation> <translation id="7483335560992089831">Немагчыма ўсталяваць тую ж версію Chromium, што зараз працуе. Закрыйце Chromium і паўтарыце спробу.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium будзе перазапушчаны праз 1 хвіліну}one{Chromium будзе перазапушчаны праз # хвіліну}few{Chromium будзе перазапушчаны праз # хвіліны}many{Chromium будзе перазапушчаны праз # хвілін}other{Chromium будзе перазапушчаны праз # хвіліны}}</translation> -<translation id="7561906087460245826">Таксама выдаліць даныя з Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium можа ацэньваць, якія вы маеце інтарэсы. Пасля гэтага сайты, якія вы наведваеце, могуць запытваць у браўзера Chromium інфармацыю пра вашы інтарэсы, каб персаналізаваць для вас рэкламу.</translation> <translation id="7583399374488819119">Усталёўшчык <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium выкарыстоўвае камеру і мікрафон.</translation>
diff --git a/chrome/app/resources/chromium_strings_bg.xtb b/chrome/app/resources/chromium_strings_bg.xtb index fba8643..801c43cc 100644 --- a/chrome/app/resources/chromium_strings_bg.xtb +++ b/chrome/app/resources/chromium_strings_bg.xtb
@@ -332,7 +332,6 @@ <translation id="7467949745582939695">Да се рестартира ли Chromium?</translation> <translation id="7483335560992089831">Не може да се инсталира същата версия на Chromium, която се използва понастоящем. Моля, затворете браузъра и опитайте отново.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ще се стартира отново след 1 минута}other{Chromium ще се стартира отново след # минути}}</translation> -<translation id="7561906087460245826">Да се изчистят и данните от Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium може да прогнозира интересите ви. По-късно посетен от вас сайт може да поиска от браузъра информация за тях с цел да персонализира показваните ви реклами.</translation> <translation id="7583399374488819119">Инсталационна програма за <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium използва камерата и микрофона ви.</translation>
diff --git a/chrome/app/resources/chromium_strings_bn.xtb b/chrome/app/resources/chromium_strings_bn.xtb index 022bda3..bc6f797 100644 --- a/chrome/app/resources/chromium_strings_bn.xtb +++ b/chrome/app/resources/chromium_strings_bn.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">Chromium আবার লঞ্চ করবেন?</translation> <translation id="7483335560992089831">একই Chromium ভার্সন যা বর্তমানে চলমান, ইনস্টল করতে পারবেন না৷ দয়া করে Chromium বন্ধ করুন এবং আবার চেষ্টা করুন৷</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ১ মিনিটের মধ্যে আবার লঞ্চ হবে}one{Chromium # মিনিটের মধ্যে আবার লঞ্চ হবে}other{Chromium # মিনিটের মধ্যে আবার লঞ্চ হবে}}</translation> -<translation id="7561906087460245826">এর পাশাপাশি, Chromium থেকেও ডেটা সরিয়ে দিন (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium আপনার আগ্রহ অনুমান করতে পারে। পরে, আপনি যে সাইটটি দেখেন সেটি আপনার দেখা বিজ্ঞাপনগুলিকে পছন্দমতো করার জন্য Chromium-কে আপনার আগ্রহগুলি দেখতে বলতে পারে।</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ইনস্টলার</translation> <translation id="761356813943268536">Chromium আপনার ক্যামেরা এবং মাইক্রোফোন ব্যবহার করছে৷</translation>
diff --git a/chrome/app/resources/chromium_strings_bs.xtb b/chrome/app/resources/chromium_strings_bs.xtb index 0ae4f3e..08914fd 100644 --- a/chrome/app/resources/chromium_strings_bs.xtb +++ b/chrome/app/resources/chromium_strings_bs.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Ponovo pokrenuti Chromium?</translation> <translation id="7483335560992089831">Nije moguće instalirati istu verziju Chromiuma koja je trenutno pokrenuta. Zatvorite Chromium i pokušajte ponovo.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium će se ponovo pokrenuti za 1 minutu}one{Chromium će se ponovo pokrenuti za # minutu}few{Chromium će se ponovo pokrenuti za # minuta}other{Chromium će se ponovo pokrenuti za # minuta}}</translation> -<translation id="7561906087460245826">Obriši i podatke iz Chromiuma (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium može procijeniti vaša interesovanja. Kasnije, web lokacija koju ste posjetili može zatražiti od Chromiuma da pogleda vaša interesovanja radi personalizacije oglasa koje vidite.</translation> <translation id="7583399374488819119">Alat za instaliranje preglednika <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium koristi vašu kameru i mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_ca.xtb b/chrome/app/resources/chromium_strings_ca.xtb index ff84c37..ee4a958 100644 --- a/chrome/app/resources/chromium_strings_ca.xtb +++ b/chrome/app/resources/chromium_strings_ca.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Vols tornar a iniciar Chromium?</translation> <translation id="7483335560992089831">No es pot instal·lar la mateixa versió de Chromium que s'està executant actualment. Tanqueu Chromium i torneu-ho a provar.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium es reiniciarà d'aquí a 1 minut}other{Chromium es reiniciarà d'aquí a # minuts}}</translation> -<translation id="7561906087460245826">Esborra també les dades de Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium pot estimar els teus interessos. Després, un lloc web que visitis pot demanar els teus interessos a Chromium per personalitzar els anuncis que veus.</translation> <translation id="7583399374488819119">Instal·lador de <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium està utilitzant la càmera i el micròfon.</translation>
diff --git a/chrome/app/resources/chromium_strings_cs.xtb b/chrome/app/resources/chromium_strings_cs.xtb index ef0f8da..ae825413 100644 --- a/chrome/app/resources/chromium_strings_cs.xtb +++ b/chrome/app/resources/chromium_strings_cs.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Restartovat Chromium?</translation> <translation id="7483335560992089831">Nelze nainstalovat verzi prohlížeče Chromium, která je právě spuštěná. Ukončete prohlížeč Chromium a zkuste to znovu.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium se za 1 minutu restartuje}few{Chromium se za # minuty restartuje}many{Chromium se za # minuty restartuje}other{Chromium se za # minut restartuje}}</translation> -<translation id="7561906087460245826">Také vymazat data z prohlížeče Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium dokáže odhadovat vaše zájmy. Později může navštívený web požádat Chromium o sdělení vašich zájmů, aby vám mohl přizpůsobit zobrazované reklamy.</translation> <translation id="7583399374488819119">instalační program prohlížeče <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium používá vaši kameru a mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_cy.xtb b/chrome/app/resources/chromium_strings_cy.xtb index 83e37b0..0d1d707 100644 --- a/chrome/app/resources/chromium_strings_cy.xtb +++ b/chrome/app/resources/chromium_strings_cy.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Ail-lansio Chromium?</translation> <translation id="7483335560992089831">Methu â gosod yr un fersiwn o Chromium sy'n rhedeg ar hyn o bryd. Caewch Chromium a rhowch gynnig arall arni.</translation> <translation id="753534427205733210">{0,plural, =1{Bydd Chromium yn ail-lansio mewn 1 funud}zero{Bydd Chromium yn ail-lansio mewn # munud}two{Bydd Chromium yn ail-lansio mewn # funud}few{Bydd Chromium yn ail-lansio mewn # munud}many{Bydd Chromium yn ail-lansio mewn # munud}other{Bydd Chromium yn ail-lansio mewn # munud}}</translation> -<translation id="7561906087460245826">Clirio data o Chromium hefyd (<ph name="URL" />)</translation> <translation id="7582945390259497898">Gall Chromium amcangyfrif eich diddordebau. Yn nes ymlaen, gall gwefan rydych yn ymweld â hi ofyn i Chromium weld eich diddordebau er mwyn personoleiddio'r hysbysebion rydych yn eu gweld.</translation> <translation id="7583399374488819119">Gosodwr <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Mae Chromium yn defnyddio'ch camera a'ch meicroffon.</translation>
diff --git a/chrome/app/resources/chromium_strings_da.xtb b/chrome/app/resources/chromium_strings_da.xtb index 1492c370..8468986 100644 --- a/chrome/app/resources/chromium_strings_da.xtb +++ b/chrome/app/resources/chromium_strings_da.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Vil du genstarte Chromium?</translation> <translation id="7483335560992089831">Kan ikke installere den samme version af Chromium som den, der kører i øjeblikket. Luk Chromium, og prøv igen.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium genstarter om 1 minut}one{Chromium genstarter om # minut}other{Chromium genstarter om # minutter}}</translation> -<translation id="7561906087460245826">Ryd også data fra Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium kan estimere dine interesser. Senere kan et website, du besøger, anmode Chromium om at se dine interesser med henblik på at personligt tilpasse de annoncer, du ser.</translation> <translation id="7583399374488819119">Installationsprogram til <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium bruger dit kamera og din mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_de.xtb b/chrome/app/resources/chromium_strings_de.xtb index 31d3774..7a0fbd02 100644 --- a/chrome/app/resources/chromium_strings_de.xtb +++ b/chrome/app/resources/chromium_strings_de.xtb
@@ -331,7 +331,6 @@ <translation id="7467949745582939695">Chromium neu starten?</translation> <translation id="7483335560992089831">Die Chromium-Version kann nicht installiert werden, da sie aktuell ausgeführt wird. Schließe Chromium bitte und versuche es erneut.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium wird in einer Minute neu gestartet}other{Chromium wird in # Minuten neu gestartet}}</translation> -<translation id="7561906087460245826">Daten aus Chromium ebenfalls löschen (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium kann deine Interessen schätzen. Wenn du eine Website besuchst, kann diese von Chromium dann deine Interessen anfordern, um die dir gezeigte Werbung zu personalisieren.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-Installationsprogramm</translation> <translation id="761356813943268536">Chromium verwendet deine Kamera und dein Mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_el.xtb b/chrome/app/resources/chromium_strings_el.xtb index 5f4a24e..9f0207ed 100644 --- a/chrome/app/resources/chromium_strings_el.xtb +++ b/chrome/app/resources/chromium_strings_el.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Επανεκκίνηση του Chromium;</translation> <translation id="7483335560992089831">Δεν είναι δυνατή η εγκατάσταση της ίδια έκδοσης του Chromium που εκτελείται αυτήν τη στιγμή. Κλείστε το Chromium και δοκιμάστε ξανά.</translation> <translation id="753534427205733210">{0,plural, =1{Η επανεκκίνηση του Chromium θα γίνει σε 1 λεπτό}other{Η επανεκκίνηση του Chromium θα γίνει σε # λεπτά}}</translation> -<translation id="7561906087460245826">Επίσης, να διαγραφούν δεδομένα από το Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Το Chromium μπορεί να κάνει εκτιμήσεις για τα ενδιαφέροντά σας. Αργότερα, ένας ιστότοπος που επισκέπτεστε μπορεί να ζητήσει από το Chromium να δει τα ενδιαφέροντά σας, προκειμένου να εξατομικεύσει τις διαφημίσεις που βλέπετε.</translation> <translation id="7583399374488819119">Πρόγραμμα εγκατάστασης <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Το Chromium χρησιμοποιεί την κάμερα και το μικρόφωνό σας.</translation>
diff --git a/chrome/app/resources/chromium_strings_en-GB.xtb b/chrome/app/resources/chromium_strings_en-GB.xtb index a0f3fe0..c9663856 100644 --- a/chrome/app/resources/chromium_strings_en-GB.xtb +++ b/chrome/app/resources/chromium_strings_en-GB.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Relaunch Chromium?</translation> <translation id="7483335560992089831">Cannot install the same Chromium version that is currently running. Please close Chromium and try again.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium will relaunch in 1 minute}other{Chromium will relaunch in # minutes}}</translation> -<translation id="7561906087460245826">Also clear data from Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium can estimate your interests. Later, a site that you visit can ask Chromium to see your interests in order to personalise the ads that you see.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> installer</translation> <translation id="761356813943268536">Chromium is using your camera and microphone.</translation>
diff --git a/chrome/app/resources/chromium_strings_es-419.xtb b/chrome/app/resources/chromium_strings_es-419.xtb index ca67c9ad..675730d 100644 --- a/chrome/app/resources/chromium_strings_es-419.xtb +++ b/chrome/app/resources/chromium_strings_es-419.xtb
@@ -332,7 +332,6 @@ <translation id="7467949745582939695">¿Quieres reiniciar Chromium?</translation> <translation id="7483335560992089831">No es posible instalar la misma versión de Chromium que se está ejecutando. Cierra Chromium y vuelve a intentarlo.</translation> <translation id="753534427205733210">{0,plural, =1{Se reiniciará Chromium en 1 minuto}other{Se reiniciará Chromium en # minutos}}</translation> -<translation id="7561906087460245826">También borrar los datos de Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium puede estimar tus intereses. Luego, los sitios que visites pueden consultar tus intereses con Chromium para personalizar los anuncios que te muestran.</translation> <translation id="7583399374488819119">Instalador de <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium está usando tu cámara y tu micrófono.</translation>
diff --git a/chrome/app/resources/chromium_strings_es.xtb b/chrome/app/resources/chromium_strings_es.xtb index 0bb0d74c..8234596f 100644 --- a/chrome/app/resources/chromium_strings_es.xtb +++ b/chrome/app/resources/chromium_strings_es.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">¿Reiniciar Chromium?</translation> <translation id="7483335560992089831">No se puede instalar la misma versión de Chromium que se está ejecutando actualmente. Cierra Chromium y vuelve a intentarlo.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium se reiniciará dentro de 1 minuto}other{Chromium se reiniciará dentro de # minutos}}</translation> -<translation id="7561906087460245826">Borrar también los datos de Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium estima tus intereses. Después, un sitio que visites puede pedirle a Chromium consultar tus intereses para personalizar los anuncios que veas.</translation> <translation id="7583399374488819119">Instalador de <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium está utilizando la cámara y el micrófono.</translation>
diff --git a/chrome/app/resources/chromium_strings_et.xtb b/chrome/app/resources/chromium_strings_et.xtb index 8c87d7d..a46108c2 100644 --- a/chrome/app/resources/chromium_strings_et.xtb +++ b/chrome/app/resources/chromium_strings_et.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">Kas käivitada Chromium uuesti?</translation> <translation id="7483335560992089831">Ei saa installida sama Chromiumi versiooni, mis praegu töötab. Sulgege Chromium ja proovige uuesti.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium käivitatakse uuesti 1 minuti pärast}other{Chromium käivitatakse uuesti # minuti pärast}}</translation> -<translation id="7561906087460245826">Kustuta andmed ka Chromiumist (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium suudab teie huvisid prognoosida. Hiljem saab teie külastatav sait taotleda Chromiumilt teie huvisid, et isikupärastada teile kuvatavaid reklaame.</translation> <translation id="7583399374488819119">Brauseri <ph name="COMPANY_NAME" /> installiprogramm</translation> <translation id="761356813943268536">Chromium kasutab kaamerat ja mikrofoni.</translation>
diff --git a/chrome/app/resources/chromium_strings_eu.xtb b/chrome/app/resources/chromium_strings_eu.xtb index ea6e4dbb..ce683dc 100644 --- a/chrome/app/resources/chromium_strings_eu.xtb +++ b/chrome/app/resources/chromium_strings_eu.xtb
@@ -333,7 +333,6 @@ <translation id="7467949745582939695">Chromium berrabiarazi nahi duzu?</translation> <translation id="7483335560992089831">Ezin da instalatu une honetan abian den Chromium-en bertsio bera. Itxi Chromium eta saiatu berriro.</translation> <translation id="753534427205733210">{0,plural, =1{1 minutu barru berrabiaraziko da Chromium}other{# minutu barru berrabiaraziko da Chromium}}</translation> -<translation id="7561906087460245826">Halaber, garbitu Chromium-eko datuak (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium-ek zure interesak estima ditzake. Beranduago, bisitatzen duzun webgune batek zure interesak ikusteko eska diezaioke Chromium-i, agertzen zaizkizun iragarkiak pertsonalizatze aldera.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> zerbitzuaren instalatzailea</translation> <translation id="761356813943268536">Chromium kamera eta mikrofonoa erabiltzen ari da.</translation>
diff --git a/chrome/app/resources/chromium_strings_fa.xtb b/chrome/app/resources/chromium_strings_fa.xtb index f2592d5a..331e457 100644 --- a/chrome/app/resources/chromium_strings_fa.xtb +++ b/chrome/app/resources/chromium_strings_fa.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">Chromium راهاندازی مجدد شود؟</translation> <translation id="7483335560992089831">نمیتوانید Chromium دارای نسخه مشابه با نسخه در حال اجرا را نصب کنید. لطفاً Chromium را ببندید و دوباره سعی کنید.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ۱ دقیقه دیگر راهاندازی مجدد میشود}one{Chromium # دقیقه دیگر راهاندازی مجدد میشود}other{Chromium # دقیقه دیگر راهاندازی مجدد میشود}}</translation> -<translation id="7561906087460245826">همچنین دادهها از Chromium پاک شود (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium میتوانید علایقتان را برآورد کند. بعداً، سایتی که از آن بازدید میکنید میتواند برای شخصی کردن آگهیهایی که به شما نشان میدهد از Chromium بخواهد علایق شما را ببیند.</translation> <translation id="7583399374488819119">نصبکننده <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium درحال استفاده از دوربین و میکروفون شما است.</translation>
diff --git a/chrome/app/resources/chromium_strings_fi.xtb b/chrome/app/resources/chromium_strings_fi.xtb index ad48d1e..35681f0 100644 --- a/chrome/app/resources/chromium_strings_fi.xtb +++ b/chrome/app/resources/chromium_strings_fi.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Käynnistä Chromium uudelleen?</translation> <translation id="7483335560992089831">Chromiumista ei voi asentaa versiota, joka on tällä hetkellä käynnissä. Sulje Chromium ja yritä uudelleen.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium käynnistetään uudelleen 1 minuutin kuluttua}other{Chromium käynnistetään uudelleen # minuutin kuluttua}}</translation> -<translation id="7561906087460245826">Poista data myös Chromiumista (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium voi arvioida sinua kiinnostavia aiheita. Sivut, joilla käyt, voivat myöhemmin pyytää Chromiumilta tietoja kiinnostuksen kohteistasi ja personoida näkemiäsi mainoksia.</translation> <translation id="7583399374488819119">Asennusohjelma: <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium käyttää kameraasi ja mikrofoniasi.</translation>
diff --git a/chrome/app/resources/chromium_strings_fil.xtb b/chrome/app/resources/chromium_strings_fil.xtb index 8cb7e872..11e3c8c7 100644 --- a/chrome/app/resources/chromium_strings_fil.xtb +++ b/chrome/app/resources/chromium_strings_fil.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Muling ilunsad ang Chromium?</translation> <translation id="7483335560992089831">Hindi ma-install ang parehong Bersyon ng Chromium na kasalukuyang tumatakbo. Pakisara ang Chromium at subukan ulit.</translation> <translation id="753534427205733210">{0,plural, =1{Muling ilulunsad ang Chromium sa loob ng 1 minuto}one{Muling ilulunsad ang Chromium sa loob ng # minuto}other{Muling ilulunsad ang Chromium sa loob ng # na minuto}}</translation> -<translation id="7561906087460245826">I-clear din ang data sa Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Puwedeng tantyahin ng Chromium ang iyong mga interes. Sa ibang pagkakataon, puwedeng hilingin ng site na binibisita mo sa Chromium na makita ang iyong mga interes para ma-personalize ang mga ad na nakikita mo.</translation> <translation id="7583399374488819119">Installer ng <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Ginagamit ng Chromium ang iyong camera at mikropono.</translation>
diff --git a/chrome/app/resources/chromium_strings_fr-CA.xtb b/chrome/app/resources/chromium_strings_fr-CA.xtb index 7bab965f..bca8f750e3 100644 --- a/chrome/app/resources/chromium_strings_fr-CA.xtb +++ b/chrome/app/resources/chromium_strings_fr-CA.xtb
@@ -333,7 +333,6 @@ <translation id="7467949745582939695">Relancer Chromium?</translation> <translation id="7483335560992089831">Vous ne pouvez pas installer la même version de Chromium qui est en cours d'exécution. Veuillez fermer Chromium et essayer à nouveau.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium redémarrera dans 1 minute}one{Chromium redémarrera dans # minute}other{Chromium redémarrera dans # minutes}}</translation> -<translation id="7561906087460245826">Effacer les données également dans Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium peut estimer vos intérêts. Ultérieurement, un site que vous visitez peut demander à Chromium de voir vos centres d'intérêt afin de personnaliser les annonces que vous voyez.</translation> <translation id="7583399374488819119">Programme d'installation de <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium utilise votre caméra et votre microphone</translation>
diff --git a/chrome/app/resources/chromium_strings_fr.xtb b/chrome/app/resources/chromium_strings_fr.xtb index b629a79..e689e4e0 100644 --- a/chrome/app/resources/chromium_strings_fr.xtb +++ b/chrome/app/resources/chromium_strings_fr.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Relancer Chromium ?</translation> <translation id="7483335560992089831">Impossible d'installer la même version de Chromium que celle qui est en cours d'exécution. Veuillez fermer Chromium, puis réessayer.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium va être relancé dans 1 minute}one{Chromium va être relancé dans # minute}other{Chromium va être relancé dans # minutes}}</translation> -<translation id="7561906087460245826">Effacer également les données issues de Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium peut estimer quels sont vos centres d'intérêt. Ensuite, un site que vous consultez pourra demander à Chromium de voir vos centres d'intérêt pour personnaliser les annonces qui vous sont présentées.</translation> <translation id="7583399374488819119">Programme d'installation de <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Votre webcam et votre micro sont en cours d'utilisation dans Chromium.</translation>
diff --git a/chrome/app/resources/chromium_strings_gl.xtb b/chrome/app/resources/chromium_strings_gl.xtb index 5c9638085..b5343c6 100644 --- a/chrome/app/resources/chromium_strings_gl.xtb +++ b/chrome/app/resources/chromium_strings_gl.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Queres reiniciar Chromium?</translation> <translation id="7483335560992089831">Non se pode instalar a mesma versión de Chromium que se está executando actualmente. Pecha Chromium e téntao de novo.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium reiniciarase en 1 minuto}other{Chromium reiniciarase en # minutos}}</translation> -<translation id="7561906087460245826">Borrar tamén os datos de Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium pode facer unha estimación dos teus intereses. Máis tarde, un sitio que visites pode consultarlle a Chromium os teus intereses para personalizar os anuncios que se che mostren.</translation> <translation id="7583399374488819119">Instalador de <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium está utilizando a túa cámara e micrófono.</translation>
diff --git a/chrome/app/resources/chromium_strings_gu.xtb b/chrome/app/resources/chromium_strings_gu.xtb index 1aa17e1..9f30d70 100644 --- a/chrome/app/resources/chromium_strings_gu.xtb +++ b/chrome/app/resources/chromium_strings_gu.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chromium ફરીથી લૉન્ચ કરીએ?</translation> <translation id="7483335560992089831">હાલમાં ચાલી રહ્યું છે તેના જેવું સમાન Chromium વર્ઝન ઇન્સ્ટૉલ કરી શકાતું નથી. કૃપા કરીને Chromiumને બંધ કરો અને ફરી પ્રયાસ કરો.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 મિનિટમાં ફરીથી લૉન્ચ થશે}one{Chromium # મિનિટમાં ફરીથી લૉન્ચ થશે}other{Chromium # મિનિટમાં ફરીથી લૉન્ચ થશે}}</translation> -<translation id="7561906087460245826">Chromiumમાંથી પણ ડેટા કાઢી નાખો (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium તમારી રુચિઓનું અનુમાન લગાવી શકે છે. પછી, તમે જેની મુલાકાત લો તે સાઇટ Chromiumને તમારી રુચિઓ જોવા માટે કહી શકે છે, જેથી તમને જોવા મળતી જાહેરાતોને મનગમતી બનાવી શકાય.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ઇન્સ્ટૉલર</translation> <translation id="761356813943268536">Chromium તમારા કૅમેરા અને માઇક્રોફોનનો ઉપયોગ કરી રહ્યું છે.</translation>
diff --git a/chrome/app/resources/chromium_strings_hi.xtb b/chrome/app/resources/chromium_strings_hi.xtb index 6ba3d3a9..18f9694 100644 --- a/chrome/app/resources/chromium_strings_hi.xtb +++ b/chrome/app/resources/chromium_strings_hi.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium को फिर से लॉन्च करें?</translation> <translation id="7483335560992089831">वर्तमान में चल रहे समान क्रोमियम वर्शन को इंस्टॉल नहीं कर सकते. कृपया क्रोमियम बंद करें और फिर से प्रयास करें.</translation> <translation id="753534427205733210">{0,plural, =1{क्रोमियम 1 मिनट में फिर से लॉन्च होगा}one{क्रोमियम # मिनट में फिर से लॉन्च होगा}other{क्रोमियम # मिनट में फिर से लॉन्च होगा}}</translation> -<translation id="7561906087460245826">साथ ही, क्रोमियम (<ph name="URL" />) का डेटा साफ़ करें</translation> <translation id="7582945390259497898">Chromium आपकी पसंद के विषयों का अनुमान लगा सकता है. Chromium जब आपकी पसंद का अनुमान लगा लेता है, तब आपके किसी दूसरी साइट पर जाने पर, वह साइट Chromium से आपकी पसंद जानने की अनुमति मांग सकती है. साइट यह अनुमति इसलिए मांगती है, ताकि वह आपको आपकी पसंद के हिसाब से विज्ञापन दिखा सके.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> इंस्टॉलर</translation> <translation id="761356813943268536">Chromium आपके कैमरे और माइक्रोफ़ोन का उपयोग कर रहा है.</translation>
diff --git a/chrome/app/resources/chromium_strings_hr.xtb b/chrome/app/resources/chromium_strings_hr.xtb index fabe04c..8cb5f77 100644 --- a/chrome/app/resources/chromium_strings_hr.xtb +++ b/chrome/app/resources/chromium_strings_hr.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Ponovo pokrenuti Chromium?</translation> <translation id="7483335560992089831">Ne možete instalirati istu verziju Chromiuma koja se trenutačno izvršava. Zatvorite Chromium i pokušajte ponovo.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium će se ponovo pokrenuti za jednu minutu}one{Chromium će se ponovo pokrenuti za # min}few{Chromium će se ponovo pokrenuti za # min}other{Chromium će se ponovo pokrenuti za # min}}</translation> -<translation id="7561906087460245826">Izbriši i podatke s Chromiuma (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium može procijeniti vaše interese. Web-lokacija koju poslije posjetite može od Chromiuma tražiti podatke o vašim interesima kako bi prilagodila oglase koji će vam se prikazivati.</translation> <translation id="7583399374488819119">Program za instalaciju <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium upotrebljava vašu kameru i mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_hu.xtb b/chrome/app/resources/chromium_strings_hu.xtb index b26eeec..8aa953d 100644 --- a/chrome/app/resources/chromium_strings_hu.xtb +++ b/chrome/app/resources/chromium_strings_hu.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">Újraindítja a Chromiumot?</translation> <translation id="7483335560992089831">Nem lehet ugyanazt a Chromium-verziót telepíteni, amely jelenleg is fut. Zárja be a Chromiumot, és próbálja újra.</translation> <translation id="753534427205733210">{0,plural, =1{A Chromium 1 percen belül újraindul}other{A Chromium # percen belül újraindul}}</translation> -<translation id="7561906087460245826">Az adatokat is törölje a Chromiumból (<ph name="URL" />)</translation> <translation id="7582945390259497898">A Chromium meg tudja becsülni az Ön érdeklődési köreit. Később az Ön által felkeresett webhelyek a megjelenő hirdetések személyre szabása érdekében kérhetik a Chromiumtól az Ön érdeklődési köreinek megismerését.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-telepítő</translation> <translation id="761356813943268536">A Chromium használja a kamerát és a mikrofont.</translation>
diff --git a/chrome/app/resources/chromium_strings_hy.xtb b/chrome/app/resources/chromium_strings_hy.xtb index 72d0231..77e9e749e 100644 --- a/chrome/app/resources/chromium_strings_hy.xtb +++ b/chrome/app/resources/chromium_strings_hy.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Վերագործարկե՞լ Chromium-ը</translation> <translation id="7483335560992089831">Հնարավոր չէ տեղադրել Chromium-ի նույն տարբերակը, որն այժմ գործարկվում է: Փակեք Chromium-ը և նորից փորձեք:</translation> <translation id="753534427205733210">{0,plural, =1{Chromium-ը կվերագործարկվի 1 րոպեից}one{Chromium-ը կվերագործարկվի # րոպեից}other{Chromium-ը կվերագործարկվի # րոպեից}}</translation> -<translation id="7561906087460245826">Ջնջել նաև Chromium-ի տվյալները (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium-ը կարող է որոշել ձեր հետաքրքրությունները։ Ավելի ուշ կայքը, որն այցելում եք, կարող է Chromium-ից ձեր հետաքրքրությունները տեսնելու թույլտվություն խնդրել՝ ձեզ ցուցադրվող գովազդն անհատականացնելու նպատակով։</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-ի տեղադրիչ</translation> <translation id="761356813943268536">Chromium-ն օգտագործում է ձեր տեսախցիկն ու խոսափողը:</translation>
diff --git a/chrome/app/resources/chromium_strings_id.xtb b/chrome/app/resources/chromium_strings_id.xtb index aec68ba0..a9a460f 100644 --- a/chrome/app/resources/chromium_strings_id.xtb +++ b/chrome/app/resources/chromium_strings_id.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Luncurkan kembali Chromium?</translation> <translation id="7483335560992089831">Tidak dapat memasang Chromium versi yang sama dengan yang sedang Anda jalankan. Tutup Chromium dan coba lagi.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium akan diluncurkan ulang dalam 1 menit}other{Chromium akan diluncurkan ulang dalam # menit}}</translation> -<translation id="7561906087460245826">Hapus juga data dari Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium dapat memperkirakan minat Anda. Kemudian, situs yang Anda buka dapat meminta Chromium untuk melihat minat Anda agar dapat mempersonalisasi iklan yang Anda lihat.</translation> <translation id="7583399374488819119">Penginstal <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium menggunakan kamera dan mikrofon Anda.</translation>
diff --git a/chrome/app/resources/chromium_strings_is.xtb b/chrome/app/resources/chromium_strings_is.xtb index 93d1bc8..d16b3af 100644 --- a/chrome/app/resources/chromium_strings_is.xtb +++ b/chrome/app/resources/chromium_strings_is.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Endurræsa Chromium?</translation> <translation id="7483335560992089831">Ekki er hægt að setja upp sömu útgáfu Chromium og er nú þegar í gangi. Lokaðu Chromium og reyndu aftur.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium verður endurræst eftir 1 mínútu}one{Chromium verður endurræst eftir # mínútu}other{Chromium verður endurræst eftir # mínútur}}</translation> -<translation id="7561906087460245826">Hreinsa líka gögn úr Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium getur áætlað áhugasvið þín. Seinna getur vefsvæði sem þú opnar beðið Chromium um að sýna áhugasvið þín til að hægt sé að sérsníða auglýsingarnar sem þú sérð.</translation> <translation id="7583399374488819119">Uppsetningarforrit <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium er að nota myndavélina þína og hljóðnema.</translation>
diff --git a/chrome/app/resources/chromium_strings_it.xtb b/chrome/app/resources/chromium_strings_it.xtb index 8670545..5b8eb4c 100644 --- a/chrome/app/resources/chromium_strings_it.xtb +++ b/chrome/app/resources/chromium_strings_it.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">Vuoi riavviare Chromium?</translation> <translation id="7483335560992089831">Impossibile installare una versione di Chromium uguale a quella in esecuzione. Chiudi Chromium e riprova.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium verrà riavviato tra 1 minuto}other{Chromium verrà riavviato tra # minuti}}</translation> -<translation id="7561906087460245826">Cancella anche i dati di Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium può stimare i tuoi interessi. Dopodiché, un sito che visiti può chiedere a Chromium di conoscere i tuoi interessi per personalizzare gli annunci da mostrarti.</translation> <translation id="7583399374488819119">Programma di installazione di <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium sta utilizzando videocamera e microfono.</translation>
diff --git a/chrome/app/resources/chromium_strings_iw.xtb b/chrome/app/resources/chromium_strings_iw.xtb index 4f82593..5538963c 100644 --- a/chrome/app/resources/chromium_strings_iw.xtb +++ b/chrome/app/resources/chromium_strings_iw.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">להפעיל את Chromium מחדש?</translation> <translation id="7483335560992089831">לא ניתן להתקין את אותה גרסת Chromium שפועלת כרגע. יש לסגור את Chromium ולנסות שוב.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium יופעל מחדש בעוד דקה}one{Chromium יופעל מחדש בעוד # דקות}two{Chromium יופעל מחדש בעוד # דקות}other{Chromium יופעל מחדש בעוד # דקות}}</translation> -<translation id="7561906087460245826">הסרת נתונים גם מ-Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium יכול להעריך מהם תחומי העניין שלך. לאחר מכן, אתר שבו ביקרת יכול לשלוח בקשה ל-Chromium כדי לגלות מהם תחומי העניין שלך ולהתאים אישית את המודעות שמוצגות לך.</translation> <translation id="7583399374488819119">מנהל ההתקנה של <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium משתמש במצלמה ובמיקרופון שלך.</translation>
diff --git a/chrome/app/resources/chromium_strings_ja.xtb b/chrome/app/resources/chromium_strings_ja.xtb index ccb0983..5e5f18f 100644 --- a/chrome/app/resources/chromium_strings_ja.xtb +++ b/chrome/app/resources/chromium_strings_ja.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">Chromium を再起動しますか?</translation> <translation id="7483335560992089831">実行中の Chromium と同じバージョンをインストールすることはできません。Chromium を閉じてからもう一度お試しください。</translation> <translation id="753534427205733210">{0,plural, =1{Chromium は 1 分後に再起動されます}other{Chromium は # 分後に再起動されます}}</translation> -<translation id="7561906087460245826">Chromium のデータ(<ph name="URL" />)も消去する</translation> <translation id="7582945390259497898">Chromium はユーザーの興味 / 関心を推定する場合があります。その後、アクセスしたサイトは、表示する広告をパーソナライズするために、Chromium にユーザーの興味 / 関心を提示するよう依頼できます。</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> インストーラ</translation> <translation id="761356813943268536">Chromium がカメラとマイクを使用しています。</translation>
diff --git a/chrome/app/resources/chromium_strings_ka.xtb b/chrome/app/resources/chromium_strings_ka.xtb index 78372464..94b325c7 100644 --- a/chrome/app/resources/chromium_strings_ka.xtb +++ b/chrome/app/resources/chromium_strings_ka.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">გსურთ Chromium-ის ხელახლა გაშვება?</translation> <translation id="7483335560992089831">შეუძლებელია იმავე Chromium-ის ვერსიის დაყენება, რომელიც ამჟამად გაშვებულია. დახურეთ Chromium და ხელახლა სცადეთ.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ხელახლა გაეშვება 1 წუთში}other{Chromium ხელახლა გაეშვება # წუთში}}</translation> -<translation id="7561906087460245826">მონაცემების Chromium-იდანაც გასუფთავება (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium-ს შეუძლია თქვენი ინტერესების პროგნოზირება. მოგვიანებით, თქვენ მიერ მონახულებულ საიტს საშუალება ექნება, Chromium-ს სთხოვოს თქვენი ინტერესების ჩვენება, თქვენთვის ხილული რეკლამის პერსონალიზების მიზნით.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ინსტალატორი</translation> <translation id="761356813943268536">Chromium იყენებს თქვენს კამერას და მიკროფონს.</translation>
diff --git a/chrome/app/resources/chromium_strings_kk.xtb b/chrome/app/resources/chromium_strings_kk.xtb index f14c607..02eb8759 100644 --- a/chrome/app/resources/chromium_strings_kk.xtb +++ b/chrome/app/resources/chromium_strings_kk.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium қайта іске қосылсын ба?</translation> <translation id="7483335560992089831">Ашылып тұрғанмен бірдей Chromium нұсқасын орнату мүмкін емес. Chromium қолданбасын жауып, әрекетті қайталаңыз.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium браузері 1 минуттан кейін қайта іске қосылады}other{Chromium браузері # минуттан кейін қайта іске қосылады}}</translation> -<translation id="7561906087460245826">Chromium браузеріндегі деректер де өшірілсін (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium браузері қызығушылықтарыңызды болжай алады. Кейін сіз кірген сайт жарнамаларды жекелендіру үшін Chromium браузерінен қызығушылықтарыңыз туралы ақпаратты сұрап алады.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> орнату құралы</translation> <translation id="761356813943268536">Chromium камераңыз бен микрофоныңызды пайдалануда.</translation>
diff --git a/chrome/app/resources/chromium_strings_km.xtb b/chrome/app/resources/chromium_strings_km.xtb index bf20130..1fd8d31 100644 --- a/chrome/app/resources/chromium_strings_km.xtb +++ b/chrome/app/resources/chromium_strings_km.xtb
@@ -341,7 +341,6 @@ <translation id="7467949745582939695">ចាប់ផ្តើម Chromium ឡើងវិញឬ?</translation> <translation id="7483335560992089831">មិនអាចតំឡើងកំណែ Chromium ដែលដូចទៅនឹងកំណែដែលកំពុងដំណើរការទេ។ សូមបិទ Chromium ហើយព្យាយាមម្តងទៀត។</translation> <translation id="753534427205733210">{0,plural, =1{Chromium នឹងចាប់ផ្ដើមឡើងវិញក្នុងរយៈពេល 1 នាទីទៀត}other{Chromium នឹងចាប់ផ្ដើមឡើងវិញក្នុងរយៈពេល # នាទីទៀត}}</translation> -<translation id="7561906087460245826">សម្អាតទិន្នន័យពី Chromium (<ph name="URL" />) ផងដែរ</translation> <translation id="7582945390259497898">Chromium អាចប៉ាន់ស្មានអំពីចំណាប់អារម្មណ៍របស់អ្នក។ ក្រោយមកទៀត គេហទំព័រដែលអ្នកចូលមើលអាចស្នើសុំ Chromium មើលចំណាប់អារម្មណ៍របស់អ្នក ដើម្បីកំណត់ការផ្សាយពាណិជ្ជកម្មដែលអ្នកមើលឃើញឱ្យស្របនឹងអ្នក។</translation> <translation id="7583399374488819119">កម្មវិធីដំឡើង <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium កំពុងប្រើកាមេរ៉ា និងម៉ៃក្រូហ្វូនរបស់អ្នក។</translation>
diff --git a/chrome/app/resources/chromium_strings_kn.xtb b/chrome/app/resources/chromium_strings_kn.xtb index 54b65cba..0ffaa71 100644 --- a/chrome/app/resources/chromium_strings_kn.xtb +++ b/chrome/app/resources/chromium_strings_kn.xtb
@@ -331,7 +331,6 @@ <translation id="7467949745582939695">Chromium ಮರುಪ್ರಾರಂಭಿಸಬೇಕೆ?</translation> <translation id="7483335560992089831">ಪ್ರಸ್ತುತ ಚಾಲನೆಯಲ್ಲಿರುವ Chromium ನ ಅದೇ ಆವೃತ್ತಿಯನ್ನು ಇನ್ಸ್ಟಾಲ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. ದಯವಿಟ್ಟು Chromium ಅನ್ನು ಮುಚ್ಚಿರಿ ಮತ್ತು ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation> <translation id="753534427205733210">{0,plural, =1{1 ನಿಮಿಷದಲ್ಲಿ Chromium ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}one{# ನಿಮಿಷಗಳಲ್ಲಿ Chromium ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}other{# ನಿಮಿಷಗಳಲ್ಲಿ Chromium ಮರುಪ್ರಾರಂಭಗೊಳ್ಳುತ್ತದೆ}}</translation> -<translation id="7561906087460245826">Chromium ನಿಂದಲೂ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium ನಿಮ್ಮ ಆಸಕ್ತಿಗಳನ್ನು ಅಂದಾಜು ಮಾಡಬಲ್ಲದು. ಆನಂತರ, ನೀವು ಭೇಟಿ ನೀಡುವ ಸೈಟ್ ನಿಮಗೆ ಕಾಣಿಸುವ ಜಾಹೀರಾತುಗಳನ್ನು ವೈಯಕ್ತಿಕಗೊಳಿಸಲು ನಿಮ್ಮ ಆಸಕ್ತಿಗಳನ್ನು ತೋರಿಸುವಂತೆ Chromium ಅನ್ನು ಕೇಳಬಹುದು.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ಇನ್ಸ್ಟಾಲರ್</translation> <translation id="761356813943268536">Chromium ನಿಮ್ಮ ಕ್ಯಾಮರಾ ಮತ್ತು ಮೈಕ್ರೋಫೋನ್ ಬಳಸುತ್ತಿದೆ.</translation>
diff --git a/chrome/app/resources/chromium_strings_ko.xtb b/chrome/app/resources/chromium_strings_ko.xtb index c5705273..f1065cf8 100644 --- a/chrome/app/resources/chromium_strings_ko.xtb +++ b/chrome/app/resources/chromium_strings_ko.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chromium을 다시 시작하시겠습니까?</translation> <translation id="7483335560992089831">이미 실행 중인 Chromium과 동일한 버전을 설치할 수 없습니다. Chromium을 종료한 뒤 다시 시도하세요.</translation> <translation id="753534427205733210">{0,plural, =1{1분 후 Chromium이 다시 시작됩니다}other{#분 후 Chromium이 다시 시작됩니다}}</translation> -<translation id="7561906087460245826">Chromium(<ph name="URL" />)에서도 데이터 삭제</translation> <translation id="7582945390259497898">Chromium에서 내 관심분야를 예측할 수 있습니다. 나중에 사이트를 방문하면 사이트에서 광고 개인 최적화를 위해 내 관심분야를 알려달라고 Chromium에 요청할 수 있습니다.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> 설치 프로그램</translation> <translation id="761356813943268536">Chromium이 카메라와 마이크를 사용 중입니다.</translation>
diff --git a/chrome/app/resources/chromium_strings_ky.xtb b/chrome/app/resources/chromium_strings_ky.xtb index 2484cf62..722d21b0 100644 --- a/chrome/app/resources/chromium_strings_ky.xtb +++ b/chrome/app/resources/chromium_strings_ky.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chromium'ду кайра иштетесизби?</translation> <translation id="7483335560992089831">Chromium'дун учурда иштеп жаткан версиясы орнотулбай жатат. Chromium'ду жаап, кайра аракет кылып көрүңүз.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 мүнөттөн кийин кайра иштетилет}other{Chromium # мүнөттөн кийин кайра иштетилет}}</translation> -<translation id="7561906087460245826">Chromium'дагы дайындар да тазалансын (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium сиз кызыккан нерселерди болжолдойт. Кийинчерээк сиз баш баккан сайттар Chromium'дан кызыккан нерселериңиз тууралуу маалымат алып, ылайыктуу жарнамаларды көрсөтө алат.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> орноткучу</translation> <translation id="761356813943268536">Chromium сиздин камера менен микрофонуңузду пайдаланууда.</translation>
diff --git a/chrome/app/resources/chromium_strings_lo.xtb b/chrome/app/resources/chromium_strings_lo.xtb index 7cfbf21..98dbbcd2 100644 --- a/chrome/app/resources/chromium_strings_lo.xtb +++ b/chrome/app/resources/chromium_strings_lo.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">ເລີ່ມເປີດໃຊ້ Chromium ໃໝ່ບໍ?</translation> <translation id="7483335560992089831">ບໍ່ສາມາດຕິດຕັ້ງ Chromium ລຸ້ນດຽວກັບທີ່ກໍາລັງແລ່ນຢູ່ໃນປະຈຸບັນໄດ້. ກະລຸນາປິດ Chromium ແລະລອງໃໝ່ອີກ.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ຈະເປີດຄືນໃໝ່ໃນ 1 ນາທີ}other{Chromium ຈະເປີດຄືນໃໝ່ໃນ # ນາທີ}}</translation> -<translation id="7561906087460245826">ລຶບລ້າງຂໍ້ມູນອອກຈາກ Chromium (<ph name="URL" />) ນຳ</translation> <translation id="7582945390259497898">Chromium ສາມາດປະເມີນຄວາມສົນໃຈຂອງທ່ານໄດ້. ເວັບໄຊໃດໜຶ່ງທີ່ທ່ານເຂົ້າເບິ່ງຈະສາມາດຂໍ Chromium ເພື່ອເບິ່ງຄວາມສົນໃຈຂອງທ່ານໃນພາຍຫຼັງໄດ້ເພື່ອປັບແຕ່ງໂຄສະນາທີ່ທ່ານເຫັນໃຫ້ເປັນສ່ວນຕົວ.</translation> <translation id="7583399374488819119">ຕົວຕິດຕັ້ງ <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium ກໍາລັງໃຊ້ກ້ອງຖ່າຍຮູບ ແລະໄມໂຄຣໂຟນຂອງທ່ານ.</translation>
diff --git a/chrome/app/resources/chromium_strings_lt.xtb b/chrome/app/resources/chromium_strings_lt.xtb index 65f08a7..734dd13 100644 --- a/chrome/app/resources/chromium_strings_lt.xtb +++ b/chrome/app/resources/chromium_strings_lt.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Iš naujo paleisti „Chromium“?</translation> <translation id="7483335560992089831">Negalima įdiegti tos pačios „Chromium“ versijos, kuri šiuo metu paleista. Uždarykite „Chromium“ ir bandykite dar kartą.</translation> <translation id="753534427205733210">{0,plural, =1{„Chromium“ bus paleista iš naujo po 1 minutės}one{„Chromium“ bus paleista iš naujo po # minutės}few{„Chromium“ bus paleista iš naujo po # minučių}many{„Chromium“ bus paleista iš naujo po # minutės}other{„Chromium“ bus paleista iš naujo po # minučių}}</translation> -<translation id="7561906087460245826">Taip pat išvalyti duomenis iš „Chromium“ (<ph name="URL" />)</translation> <translation id="7582945390259497898">„Chromium“ gali numatyti jūsų pomėgius. Vėliau svetainė, kurioje lankotės, gali paprašyti „Chromium“ peržiūrėti jūsų pomėgius, kad galėtų suasmeninti jūsų matomus skelbimus.</translation> <translation id="7583399374488819119">„<ph name="COMPANY_NAME" />“ diegimo programa</translation> <translation id="761356813943268536">„Chromium“ naudoja jūsų fotoaparatą ir mikrofoną.</translation>
diff --git a/chrome/app/resources/chromium_strings_lv.xtb b/chrome/app/resources/chromium_strings_lv.xtb index 05592079..3a2ef00 100644 --- a/chrome/app/resources/chromium_strings_lv.xtb +++ b/chrome/app/resources/chromium_strings_lv.xtb
@@ -335,7 +335,6 @@ <translation id="7467949745582939695">Vai atkārtoti palaist Chromium?</translation> <translation id="7483335560992089831">Nevar instalēt to pašu Chromium versiju, kas jau šobrīd darbojas. Aizveriet Chromium un mēģiniet vēlreiz.</translation> <translation id="753534427205733210">{0,plural, =1{Pārlūks Chromium pēc 1 minūtes tiks restartēts}zero{Pārlūks Chromium pēc # minūtēm tiks restartēts}one{Pārlūks Chromium pēc # minūtes tiks restartēts}other{Pārlūks Chromium pēc # minūtēm tiks restartēts}}</translation> -<translation id="7561906087460245826">Notīrīt arī datus no Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Pārlūkā Chromium var aptuveni noteikt jūsu intereses. Vēlāk kāda jūsu apmeklēta vietne var pieprasīt pārlūkam Chromium atļauju skatīt jūsu intereses, lai personalizētu jums rādāmās reklāmas.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> instalēšanas programma</translation> <translation id="761356813943268536">Pārlūkā Chromium tiek izmantota jūsu kamera un mikrofons.</translation>
diff --git a/chrome/app/resources/chromium_strings_mk.xtb b/chrome/app/resources/chromium_strings_mk.xtb index cdb2264..49aa74b 100644 --- a/chrome/app/resources/chromium_strings_mk.xtb +++ b/chrome/app/resources/chromium_strings_mk.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Да се рестартира Chromium?</translation> <translation id="7483335560992089831">Не може да се инсталира истата верзија на Chromium што работи во моментов. Затворете го Chromium и обидете се повторно.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ќе се рестартира по 1 минута}one{Chromium ќе се рестартира по # минута}other{Chromium ќе се рестартира по # минути}}</translation> -<translation id="7561906087460245826">Избриши ги и податоците од Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium може да ги процени вашите интереси. Подоцна, сајтот што го посетувате може да побара од Chromium да ги види вашите интереси за да ги персонализира рекламите што ги гледате.</translation> <translation id="7583399374488819119">Инсталатор на <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium ги користи фотоапаратот и микрофонот.</translation>
diff --git a/chrome/app/resources/chromium_strings_ml.xtb b/chrome/app/resources/chromium_strings_ml.xtb index eb5e8ac..4be7ed3d 100644 --- a/chrome/app/resources/chromium_strings_ml.xtb +++ b/chrome/app/resources/chromium_strings_ml.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chromium വീണ്ടും ആരംഭിക്കണോ?</translation> <translation id="7483335560992089831">നിലവിൽ പ്രവർത്തിച്ചുക്കൊണ്ടിരിക്കുന്ന Chromium-ത്തിന്റെ സമാന പതിപ്പ് ഇൻസ്റ്റാൾ ചെയ്യാൻ കഴിയില്ല. Chromium അവസാനിപ്പിച്ചതിന് ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation> <translation id="753534427205733210">{0,plural, =1{ഒരു മിനിറ്റിൽ Chromium വീണ്ടും സമാരംഭിക്കും}other{# മിനിറ്റിൽ Chromium വീണ്ടും സമാരംഭിക്കും}}</translation> -<translation id="7561906087460245826">Chromium-ൽ നിന്നും ഡാറ്റ മായ്ക്കുക (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium-ന് നിങ്ങളുടെ താൽപ്പര്യങ്ങൾ നിർണ്ണയിക്കാനാകും. പിന്നീട്, കാണുന്ന പരസ്യങ്ങൾ വ്യക്തിപരമാക്കുന്നതിന് നിങ്ങളുടെ താൽപ്പര്യങ്ങൾ കാണിക്കാൻ നിങ്ങൾ സന്ദർശിക്കുന്ന സൈറ്റിന് Chromium-നോട് ആവശ്യപ്പെടാം.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ഇൻസ്റ്റാളർ</translation> <translation id="761356813943268536">Chromium നിങ്ങളുടെ ക്യാമറയും മൈക്രോഫോണും ഉപയോഗിക്കുന്നു.</translation>
diff --git a/chrome/app/resources/chromium_strings_mn.xtb b/chrome/app/resources/chromium_strings_mn.xtb index 6f0bab5..871130da5 100644 --- a/chrome/app/resources/chromium_strings_mn.xtb +++ b/chrome/app/resources/chromium_strings_mn.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">Chromium-г дахин эхлүүлэх үү?</translation> <translation id="7483335560992089831">Одоо ажиллаж байгаа Chromium-ын ижил хувилбарыг суулгаж чадахгүй байна. Chromium-аа хаагаад дахин оролдоно уу.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium-г 1 минутын дотор дахин ажиллуулна}other{Chromium-г # минутын дотор дахин ажиллуулна}}</translation> -<translation id="7561906087460245826">Chromium-н (<ph name="URL" />) өгөгдлийг мөн адил устгах</translation> <translation id="7582945390259497898">Chromium таны сонирхлыг тооцоолох боломжтой. Дараа нь таны зочилсон сайт таны хардаг зарыг хувийн болгохын тулд Chromium-с таны сонирхлыг харахыг хүсэх боломжтой.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> суулгагч</translation> <translation id="761356813943268536">Chromium нь таны камер болон микрофоныг ашиглаж байна.</translation>
diff --git a/chrome/app/resources/chromium_strings_mr.xtb b/chrome/app/resources/chromium_strings_mr.xtb index 24f738bf..c9785c0 100644 --- a/chrome/app/resources/chromium_strings_mr.xtb +++ b/chrome/app/resources/chromium_strings_mr.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium पुन्हा लाँच करायचे का?</translation> <translation id="7483335560992089831">सध्या सुरू असलेल्या सारख्याच Chromium आवृत्तीची स्थापना होऊ शकत नाही. कृपया Chromium बंद करा आणि पुन्हा प्रयत्न करा.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium एका मिनिटामध्ये पुन्हा लॉंच होईल}other{Chromium # मिनिटांमध्ये पुन्हा लाँच होईल}}</translation> -<translation id="7561906087460245826">तसेच Chromium (<ph name="URL" />) वरील डेटा साफ करा</translation> <translation id="7582945390259497898">Chromium तुमच्या स्वारस्यांबाबत अंदाज लावू शकते. त्यानंतर, तुम्ही पाहता त्या जाहिराती पर्सनलाइझ करण्यासाठी, तुम्ही भेट देता ती साइट Chromium कडे तुमची स्वारस्ये पाहण्याची अनुमती मागू शकते.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> इंस्टॉलर</translation> <translation id="761356813943268536">Chromium तुमचा कॅमेरा आणि मायक्रोफोन वापरत आहे.</translation>
diff --git a/chrome/app/resources/chromium_strings_ms.xtb b/chrome/app/resources/chromium_strings_ms.xtb index d6b3921..8d0f37f8 100644 --- a/chrome/app/resources/chromium_strings_ms.xtb +++ b/chrome/app/resources/chromium_strings_ms.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Lancarkan Semula Chromium?</translation> <translation id="7483335560992089831">Tidak boleh memasang versi Chromium yang sama dengan yang sedang dijalankan. Sila tutup Chromium dan cuba lagi.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium akan dilancarkan semula dalam masa seminit}other{Chromium akan dilancarkan semula dalam masa # minit}}</translation> -<translation id="7561906087460245826">Kosongkan data daripada Chromium (<ph name="URL" />) juga</translation> <translation id="7582945390259497898">Chromium dapat menganggarkan minat anda. Kemudian, laman yang anda lawati boleh meminta Chromium melihat minat anda untuk memeribadikan iklan yang anda lihat.</translation> <translation id="7583399374488819119">Pemasang <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium menggunakan kamera dan mikrofon anda.</translation>
diff --git a/chrome/app/resources/chromium_strings_my.xtb b/chrome/app/resources/chromium_strings_my.xtb index f6e210d..86940560 100644 --- a/chrome/app/resources/chromium_strings_my.xtb +++ b/chrome/app/resources/chromium_strings_my.xtb
@@ -342,7 +342,6 @@ <translation id="7467949745582939695">Chromium ပြန်ဖွင့်မလား။</translation> <translation id="7483335560992089831">လက်ရှိ အချိန်မှာ ဖွင့်သုံးထားသည့် Chromium ဗားရှင်းကိုပဲ တပ်ဆင်၍ မရနိုင်ပါ။ ကျေးဇူးပြုပြီး Chromium ကို ပိတ်လိုက်ကာ ထပ်စမ်းပါ။</translation> <translation id="753534427205733210">{0,plural, =1{Chromium ကို ၁ မိနစ်အကြာတွင် ပြန်လည်စတင်ပါမည်}other{Chromium ကို # မိနစ်အကြာတွင် ပြန်လည်စတင်ပါမည်}}</translation> -<translation id="7561906087460245826">Chromium (<ph name="URL" />) မှ ဒေတာများကိုလည်း ရှင်းထုတ်ရန်</translation> <translation id="7582945390259497898">Chromium သည် သင့်စိတ်ဝင်စားမှုများကို ခန့်မှန်းနိုင်သည်။ နောက်ပိုင်းတွင် မြင်တွေ့မည့် ကြော်ငြာများကို ပုဂ္ဂိုလ်ရေးသီးသန့်ပြုလုပ်ရန် သင်ဝင်ကြည့်သည့်ဝဘ်ဆိုက်က သင့်စိတ်ဝင်စားမှုများကို Chromium ထံ တောင်းဆိုနိုင်သည်။</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ထည့်သွင်းသည့်ဖိုင်</translation> <translation id="761356813943268536">Chromium သင်သည် သင်၏ ကင်မရာ နှင့် မိုက်ခရိုဖုန်းကို သုံးနေသည်။</translation>
diff --git a/chrome/app/resources/chromium_strings_ne.xtb b/chrome/app/resources/chromium_strings_ne.xtb index e30f3f99..2530054 100644 --- a/chrome/app/resources/chromium_strings_ne.xtb +++ b/chrome/app/resources/chromium_strings_ne.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Chromium बन्द गरेर फेरि खोल्ने हो?</translation> <translation id="7483335560992089831">हाल चलिरहेको समान क्रोमियम संस्करण स्थापना गर्न सकिंदैन। कृपया क्रोमियमलाई बन्द गरि पुन: प्रयास गर्नुहोस्।</translation> <translation id="753534427205733210">{0,plural, =1{Chromium १ मिनेटमा पुनः सुरु हुने छ}other{Chromium # मिनेटमा पुनः सुरु हुने छ}}</translation> -<translation id="7561906087460245826">Chromium (<ph name="URL" />) को डेटा पनि खाली गर्नुहोस्</translation> <translation id="7582945390259497898">Chromium ले तपाईंका रुचिहरू अनुमान गर्न सक्छ। तपाईंले यसपछि खोल्ने साइटले Chromium सँग तपाईंलाई देखाइने विज्ञापनहरू पर्सनलाइज गर्ने प्रयोजनका लागि तपाईंका रुचिहरू हेर्ने अनुमति माग्न सक्छ।</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> इन्स्टलर</translation> <translation id="761356813943268536">Chromium ले तपइँको क्यामेरा र माइक्रोफोन प्रयोग गर्दैछ।</translation>
diff --git a/chrome/app/resources/chromium_strings_nl.xtb b/chrome/app/resources/chromium_strings_nl.xtb index 5db4f57..a624edea 100644 --- a/chrome/app/resources/chromium_strings_nl.xtb +++ b/chrome/app/resources/chromium_strings_nl.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium opnieuw starten?</translation> <translation id="7483335560992089831">Kan niet dezelfde Chromium-versie installeren, omdat deze versie nu actief is. Sluit Chromium en probeer het opnieuw.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium wordt over één minuut opnieuw gestart}other{Chromium wordt over # minuten opnieuw gestart}}</translation> -<translation id="7561906087460245826">Ook gegevens van Chromium wissen (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium kan een schatting van je interesses maken. Later kan een site die je bezoekt Chromium vragen om je interesses te bekijken zodat de advertenties die je ziet, kunnen worden gepersonaliseerd.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-installatieprogramma</translation> <translation id="761356813943268536">Chromium gebruikt je camera en microfoon.</translation>
diff --git a/chrome/app/resources/chromium_strings_no.xtb b/chrome/app/resources/chromium_strings_no.xtb index f770a308..c3f790cb 100644 --- a/chrome/app/resources/chromium_strings_no.xtb +++ b/chrome/app/resources/chromium_strings_no.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">Vil du starte Chromium på nytt?</translation> <translation id="7483335560992089831">Kan ikke installere den samme Chromium-versjonen som kjører. Lukk Chromium og prøv på nytt.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium startes på nytt om 1 minutt}other{Chromium startes på nytt om # minutter}}</translation> -<translation id="7561906087460245826">Fjern dataene fra Chromium også (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium kan anslå interessene dine. Senere kan nettsteder du besøker, spørre Chromium om interessene dine for å kunne sette personlig preg på annonsene du ser.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" />-installasjonsprogram</translation> <translation id="761356813943268536">Chromium bruker kameraet og mikrofonen din.</translation>
diff --git a/chrome/app/resources/chromium_strings_or.xtb b/chrome/app/resources/chromium_strings_or.xtb index 82254e9..738227f 100644 --- a/chrome/app/resources/chromium_strings_or.xtb +++ b/chrome/app/resources/chromium_strings_or.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium ପୁଣି ଲଞ୍ଚ କରିବେ କି?</translation> <translation id="7483335560992089831">ବର୍ତ୍ତମାନ ଚାଲୁଥିବା Google Chromiumର ସମାନ ସଂସ୍କରଣକୁ ଇନ୍ଷ୍ଟଲ୍ କରାଯାଇପାରିବ ନାହିଁ। ଦୟାକରି Chromium ବନ୍ଦ କରନ୍ତୁ ଏବଂ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation> <translation id="753534427205733210">{0,plural, =1{1 ମିନିଟ୍ରେ Chromium ପୁଣି ଲଞ୍ଚ ହେବ}other{# ମିନିଟ୍ରେ Chromium ପୁଣି ଲଞ୍ଚ ହେବ}}</translation> -<translation id="7561906087460245826">Chromium (<ph name="URL" />)ରୁ ମଧ୍ୟ ଡାଟା ଖାଲି କରନ୍ତୁ</translation> <translation id="7582945390259497898">Chromium ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ଆକଳନ କରିପାରିବ। ପରେ, ଆପଣ ଭିଜିଟ କରୁଥିବା ଏକ ସାଇଟ ଆପଣ ଦେଖୁଥିବା ବିଜ୍ଞାପନଗୁଡ଼ିକୁ ପର୍ସନାଲାଇଜ କରିବା ପାଇଁ, Chromiumକୁ ଆପଣଙ୍କ ରୁଚିଗୁଡ଼ିକୁ ଦେଖିବା ପାଇଁ କହିପାରିବ।</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ଇନଷ୍ଟଲର</translation> <translation id="761356813943268536">Chromium ଆପଣଙ୍କର କ୍ୟାମେରା ଏବଂ ମାଇକ୍ରୋଫୋନ୍ ବ୍ୟବହାର କରୁଛି।</translation>
diff --git a/chrome/app/resources/chromium_strings_pa.xtb b/chrome/app/resources/chromium_strings_pa.xtb index 9c6cadd..45f0971 100644 --- a/chrome/app/resources/chromium_strings_pa.xtb +++ b/chrome/app/resources/chromium_strings_pa.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">ਕੀ Chromium ਨੂੰ ਮੁੜ-ਲਾਂਚ ਕਰਨਾ ਹੈ?</translation> <translation id="7483335560992089831">ਉਹ Chromium ਵਰਜਨ ਸਥਾਪਤ ਨਹੀਂ ਕੀਤਾ ਜਾ ਸਕਦਾ ਜੋ ਇਸ ਵੇਲੇ ਚੱਲ ਰਿਹਾ ਹੈ। ਕਿਰਪਾ ਕਰਕੇ Chromium ਬੰਦ ਕਰੋ ਅਤੇ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 ਮਿੰਟ ਵਿੱਚ ਮੁੜ-ਲਾਂਚ ਹੋਵੇਗਾ}one{Chromium # ਮਿੰਟ ਵਿੱਚ ਮੁੜ-ਲਾਂਚ ਹੋਵੇਗਾ}other{Chromium # ਮਿੰਟਾਂ ਵਿੱਚ ਮੁੜ-ਲਾਂਚ ਹੋਵੇਗਾ}}</translation> -<translation id="7561906087460245826">Chromium (<ph name="URL" />) ਤੋਂ ਵੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="7582945390259497898">Chromium ਤੁਹਾਡੀਆਂ ਦਿਲਚਸਪੀਆਂ ਬਾਰੇ ਅੰਦਾਜ਼ਾ ਲਗਾ ਸਕਦਾ ਹੈ। ਬਾਅਦ ਵਿੱਚ, ਤੁਸੀਂ ਜਿਹੜੀ ਸਾਈਟ 'ਤੇ ਜਾਂਦੇ ਹੋ ਉਹ Chromium ਨੂੰ ਤੁਹਾਡੇ ਵੱਲੋਂ ਦੇਖੇ ਜਾਣ ਵਾਲੇ ਵਿਗਿਆਪਨਾਂ ਨੂੰ ਵਿਅਕਤੀਗਤ ਬਣਾਉਣ ਵਾਸਤੇ ਤੁਹਾਡੀਆਂ ਦਿਲਚਸਪੀਆਂ ਨੂੰ ਦੇਖਣ ਲਈ ਕਹਿ ਸਕਦੀ ਹੈ।</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ਸਥਾਪਨਾਕਾਰ</translation> <translation id="761356813943268536">Chromium ਤੁਹਾਡਾ ਕੈਮਰਾ ਅਤੇ ਮਾਈਕ੍ਰੋਫੋਨ ਵਰਤ ਰਿਹਾ ਹੈ।</translation>
diff --git a/chrome/app/resources/chromium_strings_pl.xtb b/chrome/app/resources/chromium_strings_pl.xtb index ec0ad89..6b494bb 100644 --- a/chrome/app/resources/chromium_strings_pl.xtb +++ b/chrome/app/resources/chromium_strings_pl.xtb
@@ -335,7 +335,6 @@ <translation id="7467949745582939695">Uruchomić ponownie Chromium?</translation> <translation id="7483335560992089831">Nie można zainstalować tej samej wersji Chromium co obecnie uruchomiona. Zamknij Chromium i spróbuj ponownie.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium uruchomi się ponownie za 1 minutę}few{Chromium uruchomi się ponownie za # minuty}many{Chromium uruchomi się ponownie za # minut}other{Chromium uruchomi się ponownie za # minuty}}</translation> -<translation id="7561906087460245826">Wyczyść też dane z Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium może oszacować Twoje zainteresowania. Witryna, którą później odwiedzisz, może o nie zapytać i na tej podstawie spersonalizować wyświetlane reklamy.</translation> <translation id="7583399374488819119">Instalator <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium używa Twojej kamery i mikrofonu.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-BR.xtb b/chrome/app/resources/chromium_strings_pt-BR.xtb index 8a37ff6..8fcf39f 100644 --- a/chrome/app/resources/chromium_strings_pt-BR.xtb +++ b/chrome/app/resources/chromium_strings_pt-BR.xtb
@@ -332,7 +332,6 @@ <translation id="7467949745582939695">Reiniciar o Chromium?</translation> <translation id="7483335560992089831">Não é possível instalar a mesma versão do Chromium que está sendo executada. Feche o Chromium e tente novamente.</translation> <translation id="753534427205733210">{0,plural, =1{O Chromium será reiniciado em 1 minuto}one{O Chromium será reiniciado em # minuto}other{O Chromium será reiniciado em # minutos}}</translation> -<translation id="7561906087460245826">Remover também os dados do Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">O Chromium faz uma estimativa dos seus interesses. Sites que você visitar vão poder pedir ao Chromium para ver seus interesses e personalizar os anúncios mostrados a você.</translation> <translation id="7583399374488819119">Instalador do <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">O Chromium está usando sua câmera e seu microfone.</translation>
diff --git a/chrome/app/resources/chromium_strings_pt-PT.xtb b/chrome/app/resources/chromium_strings_pt-PT.xtb index e805c01..9293117d 100644 --- a/chrome/app/resources/chromium_strings_pt-PT.xtb +++ b/chrome/app/resources/chromium_strings_pt-PT.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Reiniciar o Chromium?</translation> <translation id="7483335560992089831">Não é possível instalar a mesma versão do Chromium que está atualmente em execução. Feche o Chromium e tente novamente.</translation> <translation id="753534427205733210">{0,plural, =1{O Chromium será reiniciado dentro de 1 minuto}other{O Chromium será reiniciado dentro de # minutos}}</translation> -<translation id="7561906087460245826">Limpar também os dados do Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">O Chromium pode estimar os seus interesses. Posteriormente, um site que visitar pode pedir ao Chromium para ver os seus interesses para personalizar os anúncios que vê.</translation> <translation id="7583399374488819119">Instalador do <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">O Chromium está a utilizar a câmara e o microfone.</translation>
diff --git a/chrome/app/resources/chromium_strings_ro.xtb b/chrome/app/resources/chromium_strings_ro.xtb index 7dc5028..dbcabc9 100644 --- a/chrome/app/resources/chromium_strings_ro.xtb +++ b/chrome/app/resources/chromium_strings_ro.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">Repornești Chromium?</translation> <translation id="7483335560992089831">Nu se poate instala aceeași versiune de Chromium care rulează în prezent. Închideți Chromium și încercați din nou.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium se va relansa într-un minut}few{Chromium se va relansa în # minute}other{Chromium se va relansa în # de minute}}</translation> -<translation id="7561906087460245826">Șterge și datele din Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium îți poate estima interesele. Ulterior, un site pe care-l accesezi poate solicita browserului Chromium să vadă interesele tale pentru a personaliza anunțurile pe care le vezi.</translation> <translation id="7583399374488819119">Program de instalare <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium utilizează camera foto și microfonul.</translation>
diff --git a/chrome/app/resources/chromium_strings_ru.xtb b/chrome/app/resources/chromium_strings_ru.xtb index d983d29..4d8ee53 100644 --- a/chrome/app/resources/chromium_strings_ru.xtb +++ b/chrome/app/resources/chromium_strings_ru.xtb
@@ -333,7 +333,6 @@ <translation id="7467949745582939695">Перезапустить Chromium?</translation> <translation id="7483335560992089831">Невозможно установить ту же версию Chromium, которая уже присутствует в системе. Закройте Chromium и повторите попытку.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium перезапустится через 1 минуту}one{Chromium перезапустится через # минуту}few{Chromium перезапустится через # минуты}many{Chromium перезапустится через # минут}other{Chromium перезапустится через # минуты}}</translation> -<translation id="7561906087460245826">Также удалить данные из Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium может предполагать, какие темы вас интересуют. Сайты, которые вы посетите в дальнейшем, могут обращаться к Chromium, чтобы получать сведения о ваших интересах и показывать вам подходящую рекламу.</translation> <translation id="7583399374488819119">Установщик <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium использует камеру и микрофон.</translation>
diff --git a/chrome/app/resources/chromium_strings_si.xtb b/chrome/app/resources/chromium_strings_si.xtb index 7cc22e1e..94b782ae 100644 --- a/chrome/app/resources/chromium_strings_si.xtb +++ b/chrome/app/resources/chromium_strings_si.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chromium යළි දියත් කරන්නද?</translation> <translation id="7483335560992089831">දැනට ධාවනය වන Chromium අනුවාදයම ස්ථාපනය කළ නොහැක. කරුණාකර Chromium වසා නැවත උත්සාහ කරන්න.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 විනාඩියකින් යළි දියත් වෙයි}one{Chromium විනාඩි # කින් යළි දියත් වෙයි}other{Chromium විනාඩි # කින් යළි දියත් වෙයි}}</translation> -<translation id="7561906087460245826">Chromium වෙතින් ද දත්ත හිස් කරන්න (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium හට ඔබගේ ලැදිකම් තක්සේරු කළ හැකිය. පසුව, ඔබ පිවිසෙන අඩවියක් ඔබ දකින වෙළඳ දැන්වීම් පුද්ගලිකකරණය කිරීම සඳහා ඔබගේ ලැදිකම් බැලීමට ඔබට Chromium වෙතින් ඉල්ලිය හැකිය.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ස්ථාපකය</translation> <translation id="761356813943268536">Chromium ඔබේ කැමරාව හා මයික්රෆෝනය භාවිත කරයි.</translation>
diff --git a/chrome/app/resources/chromium_strings_sk.xtb b/chrome/app/resources/chromium_strings_sk.xtb index f9f2865..f6226600 100644 --- a/chrome/app/resources/chromium_strings_sk.xtb +++ b/chrome/app/resources/chromium_strings_sk.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Chcete Chromium znova spustiť?</translation> <translation id="7483335560992089831">Nemôžete nainštalovať rovnakú verziu prehliadača Chromium ako je tá, ktorá je momentálne spustená. Zatvorte prehliadač Chromium a skúste to znova.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium sa reštartuje o 1 minútu}few{Chromium sa reštartuje o # minúty}many{Chromium sa reštartuje o # minúty}other{Chromium sa reštartuje o # minút}}</translation> -<translation id="7561906087460245826">Tiež vymazať údaje z prehliadača Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium môže odhadnúť vaše záujmy. Neskôr môže web, ktorý navštívite, o ne Chromium požiadať, aby mohol prispôsobiť zobrazované reklamy.</translation> <translation id="7583399374488819119">Inštalátor aplikácie <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium používa vašu kameru a mikrofón.</translation>
diff --git a/chrome/app/resources/chromium_strings_sl.xtb b/chrome/app/resources/chromium_strings_sl.xtb index 834a7a76..d1a78e2 100644 --- a/chrome/app/resources/chromium_strings_sl.xtb +++ b/chrome/app/resources/chromium_strings_sl.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Želite znova zagnati Chromium?</translation> <translation id="7483335560992089831">Ni mogoče namestiti iste različice Chromiuma, ki se trenutno izvaja. Zaprite Chromium in poskusite znova.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium se bo znova zagnal čez eno minuto}one{Chromium se bo znova zagnal čez # minuto}two{Chromium se bo znova zagnal čez # minuti}few{Chromium se bo znova zagnal čez # minute}other{Chromium se bo znova zagnal čez # minut}}</translation> -<translation id="7561906087460245826">Počisti tudi podatke iz Chromiuma (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium lahko oceni vaša zanimanja. Pozneje lahko stran, ki jo obiščete, od Chromiuma zahteva ogled vaših zanimanj zaradi osebnega prilagajanja oglasov, ki so vam prikazani.</translation> <translation id="7583399374488819119">Namestitveni program za <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium uporablja vašo kamero in mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_sq.xtb b/chrome/app/resources/chromium_strings_sq.xtb index 49d9ff26..c14c917 100644 --- a/chrome/app/resources/chromium_strings_sq.xtb +++ b/chrome/app/resources/chromium_strings_sq.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Të niset sërish Chromium?</translation> <translation id="7483335560992089831">Nuk mund të instalohet i njëjti version i Chromium që po ekzekutohet aktualisht. Mbylle Chromium dhe provo përsëri.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium do të hapet përsëri për 1 minutë}other{Chromium do të hapet përsëri për # minuta}}</translation> -<translation id="7561906087460245826">Pastro po ashtu të dhënat nga Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium mund të përllogarisë interesat e tua. Më vonë, një sajt që ti viziton mund t'i kërkojë Chromium që të shikojë interesat e tua në mënyrë që të personalizojë reklamat që shikon.</translation> <translation id="7583399374488819119">Instaluesi i <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium po përdor kamerën dhe mikrofonin tënd.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr-Latn.xtb b/chrome/app/resources/chromium_strings_sr-Latn.xtb index dcc3eab..de9edfb0 100644 --- a/chrome/app/resources/chromium_strings_sr-Latn.xtb +++ b/chrome/app/resources/chromium_strings_sr-Latn.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Želite ponovo da pokrenete Chromium?</translation> <translation id="7483335560992089831">Nije moguće instalirati istu verziju Chromium-a koja se trenutno koristi. Zatvorite Chromium i pokušajte ponovo.</translation> <translation id="753534427205733210">{0,plural, =1{Ponovo ćemo pokrenuti Chromium za 1 minut}one{Ponovo ćemo pokrenuti Chromium # minut}few{Ponovo ćemo pokrenuti Chromium # minuta}other{Ponovo ćemo pokrenuti Chromium # minuta}}</translation> -<translation id="7561906087460245826">Obriši podatke i iz Chromium-a (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium može da proceni vaša interesovanja. Sajt koji kasnije posetite može da zatraži od Chromium-a pristup vašim interesovanjima da bi personalizovao oglase koji vam se prikazuju.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> program za instalaciju</translation> <translation id="761356813943268536">Chromium koristi kameru i mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_sr.xtb b/chrome/app/resources/chromium_strings_sr.xtb index c446514..8014fd0 100644 --- a/chrome/app/resources/chromium_strings_sr.xtb +++ b/chrome/app/resources/chromium_strings_sr.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Желите поново да покренете Chromium?</translation> <translation id="7483335560992089831">Није могуће инсталирати исту верзију Chromium-а која се тренутно користи. Затворите Chromium и покушајте поново.</translation> <translation id="753534427205733210">{0,plural, =1{Поново ћемо покренути Chromium за 1 минут}one{Поново ћемо покренути Chromium # минут}few{Поново ћемо покренути Chromium # минута}other{Поново ћемо покренути Chromium # минута}}</translation> -<translation id="7561906087460245826">Обриши податке и из Chromium-а (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium може да процени ваша интересовања. Сајт који касније посетите може да затражи од Chromium-а приступ вашим интересовањима да би персонализовао огласе који вам се приказују.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> програм за инсталацију</translation> <translation id="761356813943268536">Chromium користи камеру и микрофон.</translation>
diff --git a/chrome/app/resources/chromium_strings_sv.xtb b/chrome/app/resources/chromium_strings_sv.xtb index 0d5027d6..77b8b65 100644 --- a/chrome/app/resources/chromium_strings_sv.xtb +++ b/chrome/app/resources/chromium_strings_sv.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Vill du starta om Chromium?</translation> <translation id="7483335560992089831">Det går inte att installera samma version av Chromium som den som redan körs. Stäng Chromium och försök igen.</translation> <translation id="753534427205733210">{0,plural, =1{Om en minut startas Chromium om}other{Om # minuter startas Chromium om}}</translation> -<translation id="7561906087460245826">Rensa även data från Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium kan göra en uppskattning av dina intressen. Senare kan en webbplats fråga efter dina intressen i Chromium för att anpassa vilka annonser som visas.</translation> <translation id="7583399374488819119">Installationsprogram för <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium använder din kamera och mikrofon.</translation>
diff --git a/chrome/app/resources/chromium_strings_sw.xtb b/chrome/app/resources/chromium_strings_sw.xtb index 5a8d84d..cffd09e 100644 --- a/chrome/app/resources/chromium_strings_sw.xtb +++ b/chrome/app/resources/chromium_strings_sw.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Ungependa kufungua Chromium tena?</translation> <translation id="7483335560992089831">Haiwezi kusakinisha toleo sawia la Chromium ambalo linaendeshwa hivi sasa. Tafadhali funga Chromium na ujaribu tena.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium itafunguka upya ndani ya dakika 1}other{Chromium itafunguka upya ndani ya dakika #}}</translation> -<translation id="7561906087460245826">Futa pia data kwenye Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium inaweza kukadiria mambo yanayokuvutia. Baadaye, tovuti unayoitembelea inaweza kuiomba Chromium ili ione mambo yanayokuvutia na iweze kukuonyesha matangazo kulingana na mapendeleo yako.</translation> <translation id="7583399374488819119">Kisakinishaji cha <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium inatumia kamera na maikrofoni yako.</translation>
diff --git a/chrome/app/resources/chromium_strings_ta.xtb b/chrome/app/resources/chromium_strings_ta.xtb index a32bf46..8bb1e09a 100644 --- a/chrome/app/resources/chromium_strings_ta.xtb +++ b/chrome/app/resources/chromium_strings_ta.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Chromiumமை மீண்டும் தொடங்கவா?</translation> <translation id="7483335560992089831">தற்போது இயக்கத்தில் உள்ள அதே பதிப்புள்ள Chromiumமை நிறுவ முடியாது. Chromiumமை மூடி, பின்னர் முயலவும்.</translation> <translation id="753534427205733210">{0,plural, =1{ஒரு நிமிடத்தில் Chromium மீண்டும் தொடங்கும்}other{# நிமிடங்களில் Chromium மீண்டும் தொடங்கும்}}</translation> -<translation id="7561906087460245826">Chromiumமிலிருந்தும் தரவை அழி (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium உங்கள் ஆர்வங்களை உத்தேசமாகக் கணிக்கலாம். பிரத்தியேக விளம்பரங்களை உங்களுக்கு வழங்குவதற்காக Chromium கணித்துள்ள உங்கள் ஆர்வங்களை நீங்கள் பார்வையிடும் தளம் கேட்டறியலாம்.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> நிறுவி</translation> <translation id="761356813943268536">Chromium உங்கள் கேமராவையும் மைக்ரோஃபோனையும் பயன்படுத்துகிறது.</translation>
diff --git a/chrome/app/resources/chromium_strings_te.xtb b/chrome/app/resources/chromium_strings_te.xtb index 6f1783d..8228a5a 100644 --- a/chrome/app/resources/chromium_strings_te.xtb +++ b/chrome/app/resources/chromium_strings_te.xtb
@@ -334,7 +334,6 @@ <translation id="7467949745582939695">Chromiumను రీ-లాంచ్ చేయాలా?</translation> <translation id="7483335560992089831">ప్రస్తుతం అమలు అవుతోన్న అదే Chromium వెర్షన్ను ఇన్స్టాల్ చేయలేరు. దయచేసి Chromiumను మూసివేసి, మళ్లీ ట్రై చేయండి.</translation> <translation id="753534427205733210">{0,plural, =1{1 నిమిషంలో Chromium తిరిగి ప్రారంభించబడుతుంది}other{# నిమిషాల్లో Chromium తిరిగి ప్రారంభించబడుతుంది}}</translation> -<translation id="7561906087460245826">అలాగే (<ph name="URL" />)లో ఉన్న Chromiumకి సంబంధించిన డేటాను తీసివేయండి</translation> <translation id="7582945390259497898">Chromium మీ ఆసక్తులను అంచనా వేయగలదు. తర్వాత, మీరు చూసే యాడ్లను వ్యక్తిగతీకరించడం కోసం, మీరు సందర్శించే సైట్ మీ ఆసక్తులను చూడమని Chromiumను అడగవచ్చు.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> ఇన్స్టాలర్</translation> <translation id="761356813943268536">Chromium మీ కెమెరా మరియు మైక్రోఫోన్ని ఉపయోగిస్తోంది.</translation>
diff --git a/chrome/app/resources/chromium_strings_th.xtb b/chrome/app/resources/chromium_strings_th.xtb index a8492d9..cf6f42c 100644 --- a/chrome/app/resources/chromium_strings_th.xtb +++ b/chrome/app/resources/chromium_strings_th.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">เปิด Chromium อีกครั้งใช่ไหม</translation> <translation id="7483335560992089831">ไม่สามารถติดตั้ง Chromium รุ่นเดียวกับที่กำลังใช้งานอยู่ในขณะนี้ โปรดปิด Chromium และลองอีกครั้ง</translation> <translation id="753534427205733210">{0,plural, =1{Chromium จะเปิดขึ้นมาใหม่ใน 1 นาที}other{Chromium จะเปิดขึ้นมาใหม่ใน # นาที}}</translation> -<translation id="7561906087460245826">ล้างข้อมูลจาก Chromium (<ph name="URL" />) ด้วย</translation> <translation id="7582945390259497898">Chromium สามารถคาดคะเนความสนใจของคุณได้ ภายหลัง เว็บไซต์ที่คุณเข้าชมอาจขอข้อมูลความสนใจจาก Chromium เพื่อปรับการแสดงโฆษณาให้เหมาะกับคุณ</translation> <translation id="7583399374488819119">โปรแกรมติดตั้ง <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium ใช้กล้องและไมโครโฟนของคุณอยู่</translation>
diff --git a/chrome/app/resources/chromium_strings_tr.xtb b/chrome/app/resources/chromium_strings_tr.xtb index 7a6905b..bf04f105 100644 --- a/chrome/app/resources/chromium_strings_tr.xtb +++ b/chrome/app/resources/chromium_strings_tr.xtb
@@ -335,7 +335,6 @@ <translation id="7467949745582939695">Chromium yeniden başlatılsın mı?</translation> <translation id="7483335560992089831">Şu anda çalışan aynı Chromium sürümünü yükleyemezsiniz. Lütfen Chromium'u kapatın ve yeniden deneyin.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 dakika içinde yeniden başlatılacak}other{Chromium # dakika içinde yeniden başlatılacak}}</translation> -<translation id="7561906087460245826">Chromium'daki verileri de temizle (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium, ilgi alanlarınızı tahmin edebilir. Daha sonra ziyaret ettiğiniz bir site, gördüğünüz reklamları kişiselleştirmek için Chromium'dan ilgi alanlarınızı göstermesini isteyebilir.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> Yükleyici</translation> <translation id="761356813943268536">Chromium kameranızı ve mikrofonunuzu kullanıyor.</translation>
diff --git a/chrome/app/resources/chromium_strings_uk.xtb b/chrome/app/resources/chromium_strings_uk.xtb index e19c30d2c..5d836e50 100644 --- a/chrome/app/resources/chromium_strings_uk.xtb +++ b/chrome/app/resources/chromium_strings_uk.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Перезапустити Chromium?</translation> <translation id="7483335560992089831">Неможливо встановити версію Chromium, аналогічну запущеній зараз. Закрийте Chromium і повторіть спробу.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium перезапуститься через 1 хвилину}one{Chromium перезапуститься через # хвилину}few{Chromium перезапуститься через # хвилини}many{Chromium перезапуститься через # хвилин}other{Chromium перезапуститься через # хвилини}}</translation> -<translation id="7561906087460245826">Також очистити дані Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium оцінює ваші інтереси. Коли ви пізніше відвідаєте якийсь сайт, він може запитати в Chromium про ваші інтереси, щоб персоналізувати для вас оголошення.</translation> <translation id="7583399374488819119">Програма встановлення <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium використовує вашу камеру та мікрофон.</translation>
diff --git a/chrome/app/resources/chromium_strings_ur.xtb b/chrome/app/resources/chromium_strings_ur.xtb index be0aee6..643c7f3 100644 --- a/chrome/app/resources/chromium_strings_ur.xtb +++ b/chrome/app/resources/chromium_strings_ur.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">Chromium کو بند کر کے دوبارہ چلائیں؟</translation> <translation id="7483335560992089831">Chromium کا وہی ورژن انسٹال نہیں کیا جا سکتا ہے جو فی الحال چل رہا ہے۔ براہ کرم Chromium بند کریں اور دوبارہ کوشش کریں۔</translation> <translation id="753534427205733210">{0,plural, =1{1 منٹ میں Chromium دوبارہ لانچ ہوگا}other{# منٹ میں Chromium دوبارہ لانچ ہوگا}}</translation> -<translation id="7561906087460245826">Chromium کا ڈیٹا بھی صاف کریں (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium آپ کی دلچسپیوں کا اندازہ لگا سکتا ہے۔ بعد میں، آپ کی ملاحظہ کی جانے والی سائٹ آپ کو دکھائی دینے والے اشتہارات کو ذاتی نوعیت کا بنانے کے لیے Chromium سے آپ کی دلچسپیوں کو دیکھنے کا مطالبہ کر سکتی ہے۔</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> انسٹالر</translation> <translation id="761356813943268536">Chromium آپ کا کیمرا اور مائیکروفون استعمال کر رہا ہے۔</translation>
diff --git a/chrome/app/resources/chromium_strings_uz.xtb b/chrome/app/resources/chromium_strings_uz.xtb index 01c79615..71d78ce1 100644 --- a/chrome/app/resources/chromium_strings_uz.xtb +++ b/chrome/app/resources/chromium_strings_uz.xtb
@@ -336,7 +336,6 @@ <translation id="7467949745582939695">Chromium qayta ishga tushirilsinmi?</translation> <translation id="7483335560992089831">Tizimdagi joriy versiyadagi Chromium‘ni o‘rnatib bo‘lmaydi. Chromium‘ni yoping va qaytadan urinib ko‘ring.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 1 daqiqadan keyin qayta ishga tushadi}other{Chromium # daqiqadan keyin qayta ishga tushadi}}</translation> -<translation id="7561906087460245826">Chromium maʼlumotlarini ham tozalash (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium qiziqishlaringizni taxmin qilishi mumkin. Keyinchalik sayt sizga chiqadigan reklamani moslashtirish maqsadida Chromium ilovasidan qiziqishlaringiz haqida soʻrashi mumkin.</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> oʻrnatish vositasi</translation> <translation id="761356813943268536">Chromium kamera va mikrofoningizdan foydalanmoqda.</translation>
diff --git a/chrome/app/resources/chromium_strings_vi.xtb b/chrome/app/resources/chromium_strings_vi.xtb index c16fa40..5288fbc7 100644 --- a/chrome/app/resources/chromium_strings_vi.xtb +++ b/chrome/app/resources/chromium_strings_vi.xtb
@@ -338,7 +338,6 @@ <translation id="7467949745582939695">Chạy lại Chromium?</translation> <translation id="7483335560992089831">Không thể cài đặt phiên bản Chromium giống với phiên bản hiện đang chạy. Hãy đóng Chromium và thử lại.</translation> <translation id="753534427205733210">{0,plural, =1{Chromium sẽ khởi động lại sau 1 phút}other{Chromium sẽ khởi động lại sau # phút}}</translation> -<translation id="7561906087460245826">Đồng thời xóa dữ liệu khỏi Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium có thể ước đoán các mối quan tâm của bạn. Sau đó, trang web mà bạn truy cập có thể đề nghị Chromium cung cấp mối quan tâm của bạn nhằm cá nhân hoá quảng cáo mà bạn thấy.</translation> <translation id="7583399374488819119">Trình cài đặt <ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">Chromium đang sử dụng máy ảnh và micrô của bạn.</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-CN.xtb b/chrome/app/resources/chromium_strings_zh-CN.xtb index 425ea8c..250445fe 100644 --- a/chrome/app/resources/chromium_strings_zh-CN.xtb +++ b/chrome/app/resources/chromium_strings_zh-CN.xtb
@@ -331,7 +331,6 @@ <translation id="7467949745582939695">重新启动 Chromium?</translation> <translation id="7483335560992089831">无法安装与当前运行的版本相同的 Chromium。请关闭 Chromium 并重试。</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 将在 1 分钟后重新启动}other{Chromium 将在 # 分钟后重新启动}}</translation> -<translation id="7561906087460245826">一并清除 Chromium (<ph name="URL" />) 中的数据</translation> <translation id="7582945390259497898">Chromium 可以推测出您的兴趣。之后,您访问的网站可向 Chromium 请求查看您的兴趣,以便向您展示个性化广告。</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> 安装程序</translation> <translation id="761356813943268536">Chromium 正在使用您的摄像头和麦克风。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-HK.xtb b/chrome/app/resources/chromium_strings_zh-HK.xtb index d891f7d..1d24586 100644 --- a/chrome/app/resources/chromium_strings_zh-HK.xtb +++ b/chrome/app/resources/chromium_strings_zh-HK.xtb
@@ -339,7 +339,6 @@ <translation id="7467949745582939695">要重新啟動 Chromium 嗎?</translation> <translation id="7483335560992089831">無法安裝這個版本的 Chromium,因為目前正在執行相同版本。請關閉 Chromium,然後再試一次。</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 將於 1 分鐘後重新啟動}other{Chromium 將於 # 分鐘後重新啟動}}</translation> -<translation id="7561906087460245826">一併清除 Chromium 的資料 (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium 可以推測您的興趣。您日後瀏覽的網站可向 Chromium 要求查看您的興趣,以便向您顯示個人化廣告。</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> 安裝程式</translation> <translation id="761356813943268536">Chromium 正在使用您的相機和麥克風。</translation>
diff --git a/chrome/app/resources/chromium_strings_zh-TW.xtb b/chrome/app/resources/chromium_strings_zh-TW.xtb index 02bc931..9a5e5fb 100644 --- a/chrome/app/resources/chromium_strings_zh-TW.xtb +++ b/chrome/app/resources/chromium_strings_zh-TW.xtb
@@ -337,7 +337,6 @@ <translation id="7467949745582939695">要重新啟動 Chromium 嗎?</translation> <translation id="7483335560992089831">無法安裝這個版本的 Chromium,因為目前正在執行相同版本。請關閉 Chromium,然後再試一次。</translation> <translation id="753534427205733210">{0,plural, =1{Chromium 將在 1 分鐘後重新啟動}other{Chromium 將在 # 分鐘後重新啟動}}</translation> -<translation id="7561906087460245826">一併清除 Chromium 中的資料 (<ph name="URL" />)</translation> <translation id="7582945390259497898">Chromium 可以推測你的興趣喜好。在此之後,你造訪的網站就可以要求 Chromium 查看你的興趣喜好,以便向你放送個人化廣告。</translation> <translation id="7583399374488819119"><ph name="COMPANY_NAME" /> 安裝程式</translation> <translation id="761356813943268536">Chromium 正在使用你的攝影機和麥克風。</translation>
diff --git a/chrome/app/resources/chromium_strings_zu.xtb b/chrome/app/resources/chromium_strings_zu.xtb index 1942770c..59c06c8 100644 --- a/chrome/app/resources/chromium_strings_zu.xtb +++ b/chrome/app/resources/chromium_strings_zu.xtb
@@ -340,7 +340,6 @@ <translation id="7467949745582939695">Qalisa kabusha i-Chromium?</translation> <translation id="7483335560992089831">Ayikwazi ukufaka inguqulo ye-Chromium efana nale esebenzayo okwamanje. Sicela uvale i-Chromium uphinde uzame futhi.</translation> <translation id="753534427205733210">{0,plural, =1{I-Chromium izoqalisa kabusha kuminithi elingu-1}one{I-Chromium izoqalisa kabusha emaminithini angu-#}other{I-Chromium izoqalisa kabusha emaminithini angu-#}}</translation> -<translation id="7561906087460245826">Futhi sula idatha kusuka ku-Chromium (<ph name="URL" />)</translation> <translation id="7582945390259497898">I-Chromium ingasikisela izintshisekelo zakho. Kamuva, isayithi olivakashelayo lingacela i-Chromium ukuthi ibone izintshisekelo zakho ukuze yenze izikhangiso ozibonayo ngokwezifiso zakho.</translation> <translation id="7583399374488819119">Isifaki Se-<ph name="COMPANY_NAME" /></translation> <translation id="761356813943268536">I-Chromium isebenzisa ikhamela yakho nemakrofoni.</translation>
diff --git a/chrome/app/resources/generated_resources_af.xtb b/chrome/app/resources/generated_resources_af.xtb index 1270ae3..18780c4 100644 --- a/chrome/app/resources/generated_resources_af.xtb +++ b/chrome/app/resources/generated_resources_af.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">Program: <ph name="ARC_PROCESS_NAME" /></translation> <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="2348939752188770364">Vee personaliseringdata uit …</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 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>
diff --git a/chrome/app/resources/generated_resources_am.xtb b/chrome/app/resources/generated_resources_am.xtb index 3b980a905..65580d52 100644 --- a/chrome/app/resources/generated_resources_am.xtb +++ b/chrome/app/resources/generated_resources_am.xtb
@@ -1748,7 +1748,6 @@ <translation id="2348176352564285430">መተግበሪያ፦ <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ፈቃድ ተጠይቋል፣ ምላሽ ለመስጠት Ctrl + ወደፊት ይጫኑ</translation> <translation id="234889437187286781">ውሂብ በመስቀል ላይ ስህተት አለ</translation> -<translation id="2348939752188770364">ግላዊነት የሚያላብስ ውሂብን አጽዳ...</translation> <translation id="2349610121459545414">ይህ ጣቢያ የእርስዎን አካባቢ መድረሱን እንዲቀጥል መፍቀድ ይቀጥሉ</translation> <translation id="2349896577940037438">የእርስዎ የተጨማሪ ድር እና መተግበሪያ እንቅስቃሴ ቅንብር በርቶ ከሆነ ይህ ውሂብ በGoogle መለያዎ ላይ ሊቀመጥ ይችላል። በaccount.google.com ላይ የእርስዎን ውሂብ ማየት፣ መሰረዝ እና የእርስዎን መለያ ቅንብሮች መለወጥ ይችላሉ።</translation> <translation id="2350133097354918058">ዳግም ተጭኗል</translation>
diff --git a/chrome/app/resources/generated_resources_ar.xtb b/chrome/app/resources/generated_resources_ar.xtb index 44c32824..79ee795 100644 --- a/chrome/app/resources/generated_resources_ar.xtb +++ b/chrome/app/resources/generated_resources_ar.xtb
@@ -1742,7 +1742,6 @@ <translation id="2348176352564285430">التطبيق: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - تم طلب الإذن، اضغط على Ctrl + السهم المتجه للأمام للاستجابة للطلب</translation> <translation id="234889437187286781">حدث خطأ أثناء تحميل البيانات.</translation> -<translation id="2348939752188770364">محو بيانات التخصيص...</translation> <translation id="2349610121459545414">مواصلة السماح لهذا الموقع الإلكتروني بالوصول إلى موقعك الجغرافي</translation> <translation id="2349896577940037438">في حال تفعيل إعداد "النشاط الإضافي على الويب وفي التطبيقات"، قد يتم حفظ هذه البيانات في حسابك على Google. يمكنك الاطّلاع على البيانات وحذفها، وتغيير إعدادات الحساب من خلال account.google.com.</translation> <translation id="2350133097354918058">إعادة التحميل</translation>
diff --git a/chrome/app/resources/generated_resources_as.xtb b/chrome/app/resources/generated_resources_as.xtb index dced68db..366d6f5f 100644 --- a/chrome/app/resources/generated_resources_as.xtb +++ b/chrome/app/resources/generated_resources_as.xtb
@@ -1752,7 +1752,6 @@ <translation id="2348176352564285430">এপ্: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - অনুমতিৰ বাবে অনুৰোধ জনোৱা হৈছে, সঁহাৰি জনাবলৈ ক’ণ্ট্ৰল + ফৰৱাৰ্ডত টিপক</translation> <translation id="234889437187286781">ডেটা ল’ড কৰাত আসোঁৱাহ হৈছে</translation> -<translation id="2348939752188770364">ব্যক্তিগতকৰণ বিষয়ক ডেটা পৰিষ্কাৰ কৰক...</translation> <translation id="2349610121459545414">এই ছাইটটোক আপোনাৰ অৱস্থান এক্সেছ কৰি থাকিবলৈ দিয়ক</translation> <translation id="2349896577940037438">যদি আপোনাৰ অতিৰিক্ত ৱেব আৰু এপৰ কার্যকলাপৰ ছেটিংটো অন কৰা হয় তেন্তে এই ডেটাখিনি আপোনাৰ Google একাউণ্টত ছেভ কৰা হ’ব পাৰে। আপুনি account.google.comলৈ গৈ আপোনাৰ ডেটা চাব পাৰে, সেয়া মচিব পাৰে আৰু আপোনাৰ একাউণ্ট ছেটিংসমূহ সলনি কৰিব পাৰে।</translation> <translation id="2350133097354918058">পুনৰ ল'ড কৰা হৈছে</translation>
diff --git a/chrome/app/resources/generated_resources_az.xtb b/chrome/app/resources/generated_resources_az.xtb index 4c004f3..91bb6ca 100644 --- a/chrome/app/resources/generated_resources_az.xtb +++ b/chrome/app/resources/generated_resources_az.xtb
@@ -1744,7 +1744,6 @@ <translation id="2348176352564285430">Tətbiq: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - İcazə tələb edilib, cavablandırmaq üçün Ctrl + İrəli düyməsini basın</translation> <translation id="234889437187286781">Datanı yükləyərkən xəta oldu</translation> -<translation id="2348939752188770364">Fərdiləşdirmə məlumatlarını silin...</translation> <translation id="2349610121459545414">Bu saytın məkanınıza girişinə icazə verməyə davam edin</translation> <translation id="2349896577940037438">Əlavə Veb və Tətbiq Fəaliyyəti ayarı aktiv edilərsə, bu data Google Hesabınızda yadda saxlanıla bilər. account.google.com ünvanında datanıza baxa, onları silə və hesab ayarlarınızı dəyişə bilərsiniz.</translation> <translation id="2350133097354918058">Yenidən yükləndi</translation>
diff --git a/chrome/app/resources/generated_resources_be.xtb b/chrome/app/resources/generated_resources_be.xtb index 3363da0..19d5d750 100644 --- a/chrome/app/resources/generated_resources_be.xtb +++ b/chrome/app/resources/generated_resources_be.xtb
@@ -1740,7 +1740,6 @@ <translation id="2348176352564285430">Праграма: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Запытаны дазвол. Каб адказаць, націсніце Ctrl + Forward</translation> <translation id="234889437187286781">Памылка загрузкі даных</translation> -<translation id="2348939752188770364">Выдаліць даныя персаналізацыі...</translation> <translation id="2349610121459545414">Працягваць дазваляць гэтаму сайту доступ да даных пра ваша месцазнаходжанне</translation> <translation id="2349896577940037438">Калі налада "Дадатковыя дзеянні ў інтэрнэце і праграмах" уключана, адпаведныя даныя могуць захоўвацца ва Уліковым запісе Google. Вы можаце праглядаць і выдаляць свае даныя, а таксама змяняць налады ўліковага запісу на сайце account.google.com.</translation> <translation id="2350133097354918058">Перазагружана</translation>
diff --git a/chrome/app/resources/generated_resources_bg.xtb b/chrome/app/resources/generated_resources_bg.xtb index c229de64..6b476fac 100644 --- a/chrome/app/resources/generated_resources_bg.xtb +++ b/chrome/app/resources/generated_resources_bg.xtb
@@ -1750,7 +1750,6 @@ <translation id="2348176352564285430">Приложение: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> иска разрешение. Натиснете Ctrl + бутона за преминаване напред, за да отговорите</translation> <translation id="234889437187286781">Грешка при зареждането на данните</translation> -<translation id="2348939752188770364">Изчистване на данните за персонализирането...</translation> <translation id="2349610121459545414">Този сайт да продължи да има достъп до местоположението ви</translation> <translation id="2349896577940037438">Ако настройката „Допълнителна активност в мрежата и приложенията“ е включена за вас, тези данни може да се запазват в профила ви в Google. В състояние сте да преглеждате и изтривате данните си и да променяте настройките на профила си на адрес account.google.com.</translation> <translation id="2350133097354918058">Презареждането завърши</translation>
diff --git a/chrome/app/resources/generated_resources_bn.xtb b/chrome/app/resources/generated_resources_bn.xtb index 61ce02c..e266315 100644 --- a/chrome/app/resources/generated_resources_bn.xtb +++ b/chrome/app/resources/generated_resources_bn.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">অ্যাপ্লিকেশান: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - অনুমতি চাওয়া হয়েছে, উত্তর দিতে Ctrl + 'ফরওয়ার্ড' বোতাম প্রেস করুন</translation> <translation id="234889437187286781">ডেটা লোড হওয়ার সময় কোনও সমস্যা হয়েছে</translation> -<translation id="2348939752188770364">ব্যক্তিগতকরণ ডেটা মুছে ফেলুন...</translation> <translation id="2349610121459545414">আপনার লোকেশন অ্যাক্সেস করতে দিতে, এই সাইটকে অনুমতি দিয়ে রাখুন</translation> <translation id="2349896577940037438">আপনার অতিরিক্ত 'ওয়েব ও অ্যাপ অ্যাক্টিভিটি' সেটিং চালু থাকলে, এই ডেটা আপনার Google অ্যাকাউন্টে সেভ করা হতে পারে। account.google.com লিঙ্কে গিয়ে আপনার ডেটা দেখতে, মুছে ফেলতে এবং অ্যাকাউন্ট সেটিংস পরিবর্তন করতে পারেন।</translation> <translation id="2350133097354918058">আবার লোড করা হয়েছে</translation>
diff --git a/chrome/app/resources/generated_resources_bs.xtb b/chrome/app/resources/generated_resources_bs.xtb index e9739d5..24c3953 100644 --- a/chrome/app/resources/generated_resources_bs.xtb +++ b/chrome/app/resources/generated_resources_bs.xtb
@@ -1759,7 +1759,6 @@ <translation id="2348176352564285430">Aplikacija: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Zatraženo je odobrenje. Pritisnite Ctrl + naprijed da odgovorite</translation> <translation id="234889437187286781">Greška prilikom učitavanja podataka</translation> -<translation id="2348939752188770364">Obriši podatke o personalizaciji...</translation> <translation id="2349610121459545414">Nastavi dozvoljavati ovoj web lokaciji pristup lokaciji</translation> <translation id="2349896577940037438">Ako vam je uključena postavka dodatna Aktivnost na webu i u aplikacijama, ti podaci će možda biti sačuvani na vašem Google računu. Na stranici account.google.com možete vidjeti svoje podatke, izbrisati ih te promijeniti postavke računa.</translation> <translation id="2350133097354918058">Ponovo učitano</translation>
diff --git a/chrome/app/resources/generated_resources_ca.xtb b/chrome/app/resources/generated_resources_ca.xtb index c90236f..d03f05b035 100644 --- a/chrome/app/resources/generated_resources_ca.xtb +++ b/chrome/app/resources/generated_resources_ca.xtb
@@ -1745,7 +1745,6 @@ <translation id="2348176352564285430">Aplicació: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" />. S'ha sol·licitat permís, prem Ctrl+Endavant per respondre</translation> <translation id="234889437187286781">S'ha produït un error en carregar les dades</translation> -<translation id="2348939752188770364">Esborra les dades de personalització...</translation> <translation id="2349610121459545414">Continua permetent que aquest lloc web accedeixi a la meva ubicació</translation> <translation id="2349896577940037438">Si tens activada l'opció Activitat al web i en aplicacions addicional, és possible que aquestes dades es desin al teu Compte de Google. Pots veure les teves dades, suprimir-les i modificar la configuració del teu compte a account.google.com.</translation> <translation id="2350133097354918058">S'ha tornat a carregar</translation>
diff --git a/chrome/app/resources/generated_resources_cs.xtb b/chrome/app/resources/generated_resources_cs.xtb index 72efd3f..b5c15e4 100644 --- a/chrome/app/resources/generated_resources_cs.xtb +++ b/chrome/app/resources/generated_resources_cs.xtb
@@ -1741,7 +1741,6 @@ <translation id="2348176352564285430">Aplikace: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Odpovězte na žádost o oprávnění stisknutím kláves Ctrl + Vpřed</translation> <translation id="234889437187286781">Při načítání dat došlo k chybě</translation> -<translation id="2348939752188770364">Vymazat data přizpůsobení…</translation> <translation id="2349610121459545414">Tomuto webu přístup k poloze nadále povolit</translation> <translation id="2349896577940037438">Pokud je zapnuto dodatečné nastavení Aktivita na webu a v aplikacích, mohou se tato data ukládat do vašeho účtu Google. Svá data můžete zobrazit a smazat na stránce account.google.com, kde také můžete změnit nastavení svého účtu</translation> <translation id="2350133097354918058">Znovu načteno</translation>
diff --git a/chrome/app/resources/generated_resources_cy.xtb b/chrome/app/resources/generated_resources_cy.xtb index 008c9e09c..d41b846e 100644 --- a/chrome/app/resources/generated_resources_cy.xtb +++ b/chrome/app/resources/generated_resources_cy.xtb
@@ -1757,7 +1757,6 @@ <translation id="2348176352564285430">Ap: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Gofynnwyd am ganiatâd, pwyswch Ctrl + Forward i ymateb</translation> <translation id="234889437187286781">Bu gwall wrth lwytho'r data</translation> -<translation id="2348939752188770364">Clirio data personoleiddio…</translation> <translation id="2349610121459545414">Parhau i ganiatáu i'r wefan hon gael mynediad at eich lleoliad</translation> <translation id="2349896577940037438">Os caiff eich gosodiad Gweithgarwch ar y We ac Apiau ychwanegol ei droi ymlaen, gellir cadw'r data hyn i'ch Cyfrif Google. Gallwch weld eich data, eu dileu, a newid gosodiadau eich cyfrif yn account.google.com.</translation> <translation id="2350133097354918058">Ail-lwythwyd</translation>
diff --git a/chrome/app/resources/generated_resources_da.xtb b/chrome/app/resources/generated_resources_da.xtb index 0edef27..3d5a6bb88 100644 --- a/chrome/app/resources/generated_resources_da.xtb +++ b/chrome/app/resources/generated_resources_da.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Der er anmodet om tilladelse. Tryk på Ctrl + skåstregtasten for at svare</translation> <translation id="234889437187286781">Der kunne ikke indlæses data</translation> -<translation id="2348939752188770364">Ryd personligt tilpassede data...</translation> <translation id="2349610121459545414">Tillad fortsat, at dette website kan få adgang til din lokation</translation> <translation id="2349896577940037438">Hvis indstillingen for yderligere web- og appaktivitet er aktiveret, gemmes disse data muligvis på din Google-konto. Du kan se dine data, slette dem, og ændre dine kontoindstillinger på account.google.com.</translation> <translation id="2350133097354918058">Genindlæst</translation>
diff --git a/chrome/app/resources/generated_resources_de.xtb b/chrome/app/resources/generated_resources_de.xtb index 8ee5ee1..bc21a45 100644 --- a/chrome/app/resources/generated_resources_de.xtb +++ b/chrome/app/resources/generated_resources_de.xtb
@@ -1732,7 +1732,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Berechtigung angefordert. Drücke „Ctrl + Weiter“, um zu reagieren.</translation> <translation id="234889437187286781">Fehler beim Laden der Daten</translation> -<translation id="2348939752188770364">Personalisierungsdaten löschen...</translation> <translation id="2349610121459545414">Weiterhin zulassen, dass diese Website auf deinen Standort zugreifen kann</translation> <translation id="2349896577940037438">Wenn die Einstellung "Zusätzliche Web- & App-Aktivitäten" aktiviert ist, werden diese Daten möglicherweise in deinem Google-Konto gespeichert. Unter account.google.com kannst du deine Daten sehen und löschen sowie deine Kontoeinstellungen ändern.</translation> <translation id="2350133097354918058">Neu geladen</translation>
diff --git a/chrome/app/resources/generated_resources_el.xtb b/chrome/app/resources/generated_resources_el.xtb index 1ce74248..e9528c9f 100644 --- a/chrome/app/resources/generated_resources_el.xtb +++ b/chrome/app/resources/generated_resources_el.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">Εφαρμογή: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Ζητήθηκε άδεια, πατήστε Ctrl + Εμπρός για απάντηση.</translation> <translation id="234889437187286781">Σφάλμα κατά τη φόρτωση δεδομένων</translation> -<translation id="2348939752188770364">Διαγραφή δεδομένων εξατομίκευσης…</translation> <translation id="2349610121459545414">Να συνεχίσει να επιτρέπεται σε αυτόν τον ιστότοπο η πρόσβαση στην τοποθεσία σας.</translation> <translation id="2349896577940037438">Εάν η ρύθμιση της πρόσθετης Δραστηριότητας ιστού και εφαρμογών είναι ενεργοποιημένη, αυτά τα δεδομένα μπορεί να αποθηκευτούν στον Λογαριασμό σας Google. Μπορείτε να δείτε τα δεδομένα σας, να τα διαγράψετε και να αλλάξετε τις ρυθμίσεις του λογαριασμού σας στη διεύθυνση account.google.com.</translation> <translation id="2350133097354918058">Έγινε επανάληψη φόρτωσης</translation>
diff --git a/chrome/app/resources/generated_resources_en-GB.xtb b/chrome/app/resources/generated_resources_en-GB.xtb index 6e839b9..82e6875 100644 --- a/chrome/app/resources/generated_resources_en-GB.xtb +++ b/chrome/app/resources/generated_resources_en-GB.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Permission requested, press Ctrl + Forward to respond</translation> <translation id="234889437187286781">Error loading data</translation> -<translation id="2348939752188770364">Clear personalisation data...</translation> <translation id="2349610121459545414">Continue allowing this site to access your location</translation> <translation id="2349896577940037438">If your additional Web & App Activity setting is turned on, this data may be saved to your Google Account. You can see your data, delete it and change your account settings at account.google.com.</translation> <translation id="2350133097354918058">Reloaded</translation>
diff --git a/chrome/app/resources/generated_resources_es-419.xtb b/chrome/app/resources/generated_resources_es-419.xtb index 4b62864..a509dc0 100644 --- a/chrome/app/resources/generated_resources_es-419.xtb +++ b/chrome/app/resources/generated_resources_es-419.xtb
@@ -1736,7 +1736,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Se solicitó un permiso; para responder, presiona Ctrl + flecha hacia adelante</translation> <translation id="234889437187286781">Se produjo un error al cargar los datos</translation> -<translation id="2348939752188770364">Borrar datos de personalización…</translation> <translation id="2349610121459545414">Seguir permitiendo que este sitio acceda a tu ubicación</translation> <translation id="2349896577940037438">Si habilitaste la Actividad de web y de aplicaciones adicional, es posible que se almacenen estos datos en tu Cuenta de Google. Para ver y borrar esa información, y cambiar la configuración de la cuenta, accede a account.google.com.</translation> <translation id="2350133097354918058">Se volvió a cargar</translation>
diff --git a/chrome/app/resources/generated_resources_es.xtb b/chrome/app/resources/generated_resources_es.xtb index c586d36..be5d065 100644 --- a/chrome/app/resources/generated_resources_es.xtb +++ b/chrome/app/resources/generated_resources_es.xtb
@@ -1740,7 +1740,6 @@ <translation id="2348176352564285430">Aplicación: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" />: permiso solicitado, pulsa Ctrl + Adelante para responder</translation> <translation id="234889437187286781">Error al cargar los datos</translation> -<translation id="2348939752188770364">Borrar datos de personalización...</translation> <translation id="2349610121459545414">Seguir permitiendo que este sitio web acceda a tu ubicación</translation> <translation id="2349896577940037438">Si la opción Actividad en la Web y en Aplicaciones Adicional está activada, es posible que estos datos se guarden en tu cuenta de Google. Puedes ver, eliminar y cambiar la configuración de tu cuenta en account.google.com.</translation> <translation id="2350133097354918058">Recargada</translation>
diff --git a/chrome/app/resources/generated_resources_et.xtb b/chrome/app/resources/generated_resources_et.xtb index 0a04b8f..a99fb93 100644 --- a/chrome/app/resources/generated_resources_et.xtb +++ b/chrome/app/resources/generated_resources_et.xtb
@@ -1745,7 +1745,6 @@ <translation id="2348176352564285430">Rakendus: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – taotleti luba, vastamiseks vajutage klahvikombinatsiooni Ctrl + edasinool</translation> <translation id="234889437187286781">Viga andmete laadimisel</translation> -<translation id="2348939752188770364">Isikupärastamisandmete kustutamine …</translation> <translation id="2349610121459545414">Luba selle saidi jaoks jätkuvalt juurdepääs minu asukohale</translation> <translation id="2349896577940037438">Kui täiendavad veebi- ja rakendustegevused on sisse lülitatud, võidakse need andmed salvestada teie Google'i kontole. Saidil account.google.com saate oma andmeid vaadata, neid kustutada ja konto seadeid muuta.</translation> <translation id="2350133097354918058">Uuesti laaditud</translation>
diff --git a/chrome/app/resources/generated_resources_eu.xtb b/chrome/app/resources/generated_resources_eu.xtb index fdfb03bf..a907e84 100644 --- a/chrome/app/resources/generated_resources_eu.xtb +++ b/chrome/app/resources/generated_resources_eu.xtb
@@ -1739,7 +1739,6 @@ <translation id="2348176352564285430">Aplikazioa: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" />. Baimena eskatu da. Erantzuteko, sakatu Kontrol eta Aurrera.</translation> <translation id="234889437187286781">Errore bat gertatu da datuak kargatzean</translation> -<translation id="2348939752188770364">Garbitu pertsonalizazioak…</translation> <translation id="2349610121459545414">Jarraitu baimena ematen webguneari kokapena atzitzeko</translation> <translation id="2349896577940037438">Sareko eta aplikazioetako jarduera gehigarriak ezarpena aktibatuta badago, baliteke datu horiek Google-ko kontuan gordetzea. Datuak ikusi edo ezabatzeko, edo kontuaren ezarpenak aldatzeko, joan account.google.com helbidera.</translation> <translation id="2350133097354918058">Kargatu da berriro</translation>
diff --git a/chrome/app/resources/generated_resources_fa.xtb b/chrome/app/resources/generated_resources_fa.xtb index eea709aa..15602271 100644 --- a/chrome/app/resources/generated_resources_fa.xtb +++ b/chrome/app/resources/generated_resources_fa.xtb
@@ -1751,7 +1751,6 @@ <translation id="2348176352564285430">برنامه: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - درخواست اجازه ارائه شده است؛ برای پاسخ دادن، کلید «مهار + جلو» را فشار دهید</translation> <translation id="234889437187286781">خطا در بارگیری اطلاعات</translation> -<translation id="2348939752188770364">پاک کردن اطلاعات شخصیسازی…</translation> <translation id="2349610121459545414">دسترسی این سایت به مکان شما همچنان مجاز باشد</translation> <translation id="2349896577940037438">اگر تنظیم «فعالیتها در وب و برنامه» تکمیلی روشن باشد، ممکن است این دادهها در «حساب Google» شما ذخیره شود. میتوانید در account.google.com، دادههایتان را ببینید، حذف کنید، و تنظیمات حسابتان را تغییر دهید.</translation> <translation id="2350133097354918058">بار کردن مجدد شد</translation>
diff --git a/chrome/app/resources/generated_resources_fi.xtb b/chrome/app/resources/generated_resources_fi.xtb index 7293e33..43c06e2 100644 --- a/chrome/app/resources/generated_resources_fi.xtb +++ b/chrome/app/resources/generated_resources_fi.xtb
@@ -1753,7 +1753,6 @@ <translation id="2348176352564285430">Sovellus: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Lupaa pyydetty, vastaa painamalla Ctrl + seuraava</translation> <translation id="234889437187286781">Dataa ladattaessa tapahtui virhe</translation> -<translation id="2348939752188770364">Tyhjennä personointidat…</translation> <translation id="2349610121459545414">Salli sijaintitietojen käyttö tälle sivustolle myös jatkossa</translation> <translation id="2349896577940037438">Jos olet laittanut päälle muun verkko- ja sovellustoiminnan asetuksen, tätä dataa voidaan tallentaa Google-tilillesi. Voit nähdä dataa, poistaa sitä ja muuttaa tiliasetuksia osoitteessa account.google.com.</translation> <translation id="2350133097354918058">Päivitetty</translation>
diff --git a/chrome/app/resources/generated_resources_fil.xtb b/chrome/app/resources/generated_resources_fil.xtb index 696666a..07e284c 100644 --- a/chrome/app/resources/generated_resources_fil.xtb +++ b/chrome/app/resources/generated_resources_fil.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Humiling ng pahintulot, pindutin ang Ctrl + Forward para tumugon</translation> <translation id="234889437187286781">Nagka-error sa pag-load ng data</translation> -<translation id="2348939752188770364">I-clear ang data ng pag-personalize...</translation> <translation id="2349610121459545414">Patuloy na payagan ang site na ito na i-access ang iyong lokasyon</translation> <translation id="2349896577940037438">Kung naka-on ang iyong karagdagang setting ng Aktibidad sa Web at App, posibleng ma-save ang data na ito sa Google Account mo. Puwede mong makita ang iyong data, i-delete ito, at baguhin ang mga setting ng account mo sa account.google.com.</translation> <translation id="2350133097354918058">Na-reload</translation>
diff --git a/chrome/app/resources/generated_resources_fr-CA.xtb b/chrome/app/resources/generated_resources_fr-CA.xtb index 14581b0..6e2bbf8b 100644 --- a/chrome/app/resources/generated_resources_fr-CA.xtb +++ b/chrome/app/resources/generated_resources_fr-CA.xtb
@@ -1738,7 +1738,6 @@ <translation id="2348176352564285430">Application : <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> : autorisation demandée, appuyez sur Ctrl+Suivant pour répondre</translation> <translation id="234889437187286781">Erreur lors du chargement des données</translation> -<translation id="2348939752188770364">Supprimer les données de personnalisation…</translation> <translation id="2349610121459545414">Continuer d'autoriser ce site à accéder à votre position</translation> <translation id="2349896577940037438">Si le paramètre relatif aux autres activités sur le Web et dans les applications est activé, ces données peuvent être enregistrées dans votre compte Google. Vous pouvez consulter vos données, les supprimer et modifier les paramètres de votre compte sur la page account.google.com.</translation> <translation id="2350133097354918058">Actualisée</translation>
diff --git a/chrome/app/resources/generated_resources_fr.xtb b/chrome/app/resources/generated_resources_fr.xtb index 01b0b9c..79bbd72 100644 --- a/chrome/app/resources/generated_resources_fr.xtb +++ b/chrome/app/resources/generated_resources_fr.xtb
@@ -1740,7 +1740,6 @@ <translation id="2348176352564285430">Application : <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> : autorisation demandée, appuyez sur Ctrl+Suivant pour répondre</translation> <translation id="234889437187286781">Erreur lors du chargement des données.</translation> -<translation id="2348939752188770364">Supprimer les données de personnalisation…</translation> <translation id="2349610121459545414">Continuer à autoriser l'accès à votre position pour ce site</translation> <translation id="2349896577940037438">Si vous avez activé le paramètre "Activité supplémentaire sur le Web et les applications", ces données peuvent être enregistrées dans votre compte Google. Vous pouvez consulter vos données, les supprimer et modifier les paramètres de votre compte sur la page account.google.com.</translation> <translation id="2350133097354918058">Extension actualisée</translation>
diff --git a/chrome/app/resources/generated_resources_gl.xtb b/chrome/app/resources/generated_resources_gl.xtb index d665704..4887850 100644 --- a/chrome/app/resources/generated_resources_gl.xtb +++ b/chrome/app/resources/generated_resources_gl.xtb
@@ -1738,7 +1738,6 @@ <translation id="2348176352564285430">Aplicación: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" />: permiso solicitado; preme Control + tecla de avance para responder</translation> <translation id="234889437187286781">Produciuse un erro ao cargar os datos</translation> -<translation id="2348939752188770364">Borrar datos de personalización...</translation> <translation id="2349610121459545414">Continuar permitindo que este sitio acceda á túa localización</translation> <translation id="2349896577940037438">Se está activada a opción Actividade web e das aplicacións adicional, estes datos pódense gardar na túa Conta de Google. Podes consultar a información, eliminala e cambiar as opcións de configuración en account.google.com.</translation> <translation id="2350133097354918058">Volveuse cargar a extensión</translation>
diff --git a/chrome/app/resources/generated_resources_gu.xtb b/chrome/app/resources/generated_resources_gu.xtb index 9445b01..6439813c 100644 --- a/chrome/app/resources/generated_resources_gu.xtb +++ b/chrome/app/resources/generated_resources_gu.xtb
@@ -1743,7 +1743,6 @@ <translation id="2348176352564285430">ઍપ્લિકેશન: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - પરવાનગીની વિનંતી કરવામાં આવી, જવાબ આપવા માટે Ctrl + Forward દબાવો</translation> <translation id="234889437187286781">ડેટા લોડ કરવામાં ભૂલ</translation> -<translation id="2348939752188770364">વૈયક્તિકરણનો ડેટા સાફ કરો...</translation> <translation id="2349610121459545414">આ સાઇટને તમારા સ્થાનની માહિતીનો ઍક્સેસ આપવા માટે મંજૂરી આપવાનું ચાલુ રાખો</translation> <translation id="2349896577940037438">જો તમારી વધારાની વેબ અને ઍપ પ્રવૃત્તિનું સેટિંગ ચાલુ હોય, તો આ ડેટા તમારા Google એકાઉન્ટમાં સાચવવામાં આવી શકે છે. તમે account.google.com પર તમારો ડેટા જોઈ શકો છો, તેને ડિલીટ કરી શકો છો અને તમારા એકાઉન્ટ સેટિંગ બદલી શકો છો.</translation> <translation id="2350133097354918058">ફરીથી લોડ કર્યું</translation>
diff --git a/chrome/app/resources/generated_resources_hi.xtb b/chrome/app/resources/generated_resources_hi.xtb index eb699c12..149d4eb 100644 --- a/chrome/app/resources/generated_resources_hi.xtb +++ b/chrome/app/resources/generated_resources_hi.xtb
@@ -1766,7 +1766,6 @@ <translation id="2348176352564285430">ऐप्लिकेशन: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - अनुमति मांगी गई है, जवाब देने के लिए Ctrl + Forward बटन दबाएं</translation> <translation id="234889437187286781">डेटा लोड होने में कोई गड़बड़ी हुई</translation> -<translation id="2348939752188770364">आपके हिसाब से बनाने से जुड़ा डेटा मिटाएं...</translation> <translation id="2349610121459545414">इस साइट को अपनी जगह की जानकारी का ऐक्सेस देना जारी रखें</translation> <translation id="2349896577940037438">अगर आपकी दूसरी 'वेब और ऐप्लिकेशन गतिविधि' सेटिंग चालू है, तो यह डेटा आपके Google खाते में सेव किया जा सकता है. आप account.google.com पर जाकर अपना डेटा देख सकते हैं, उसे मिटा सकते हैं, और अपने खाते की सेटिंग बदल सकते हैं.</translation> <translation id="2350133097354918058">फिर से लोड किया गया</translation>
diff --git a/chrome/app/resources/generated_resources_hr.xtb b/chrome/app/resources/generated_resources_hr.xtb index a5c05b4..a1beef2 100644 --- a/chrome/app/resources/generated_resources_hr.xtb +++ b/chrome/app/resources/generated_resources_hr.xtb
@@ -1742,7 +1742,6 @@ <translation id="2348176352564285430">Aplikacija: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Zatraženo je dopuštenje. Da biste odgovorili, pritisnite Ctrl + naprijed</translation> <translation id="234889437187286781">Pogreška prilikom učitavanja podataka</translation> -<translation id="2348939752188770364">Brisanje podataka personalizacije...</translation> <translation id="2349610121459545414">Omogućite ovoj web-lokaciji da i dalje pristupa vašoj lokaciji</translation> <translation id="2349896577940037438">Ako je uključena dodatna aktivnost na webu i u aplikacijama, ti se podaci mogu spremati na vaš Google račun. Na stranici account.google.com možete pogledati svoje podatke, izbrisati ih ili promijeniti postavke računa.</translation> <translation id="2350133097354918058">Ponovno učitano</translation>
diff --git a/chrome/app/resources/generated_resources_hu.xtb b/chrome/app/resources/generated_resources_hu.xtb index d0ccdf4..527732f0 100644 --- a/chrome/app/resources/generated_resources_hu.xtb +++ b/chrome/app/resources/generated_resources_hu.xtb
@@ -1759,7 +1759,6 @@ <translation id="2348176352564285430">Alkalmazás: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Engedély kérelmezve, a válaszhoz nyomja le a Ctrl + Előre billentyűkombinációt</translation> <translation id="234889437187286781">Hiba történt az adatok betöltése során</translation> -<translation id="2348939752188770364">Személyre szabási adatok törlése…</translation> <translation id="2349610121459545414">A webhely továbbra is hozzáférhet az Ön tartózkodási helyéhez</translation> <translation id="2349896577940037438">Ha az Internetes és alkalmazástevékenységek beállítás is be van kapcsolva, akkor a rendszer ezeket az adatokat az Ön Google-fiókjába is mentheti. Megtekintheti az adatokat, törölheti őket, továbbá megváltoztathatja a fiókbeállításait az account.google.com címen.</translation> <translation id="2350133097354918058">Újratöltve</translation>
diff --git a/chrome/app/resources/generated_resources_hy.xtb b/chrome/app/resources/generated_resources_hy.xtb index 8d224e0..7b06d49 100644 --- a/chrome/app/resources/generated_resources_hy.xtb +++ b/chrome/app/resources/generated_resources_hy.xtb
@@ -1741,7 +1741,6 @@ <translation id="2348176352564285430">Հավելված՝ <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Պահանջվում է թույլտվություն։ Արձագանքելու համար սեղմեք Ctrl + Forward։</translation> <translation id="234889437187286781">Տվյալների բեռնման սխալ</translation> -<translation id="2348939752188770364">Ջնջել անհատականացման տվյալները…</translation> <translation id="2349610121459545414">Թույլատրել այս կայքին նախկինի պես օգտագործել ձեր տեղադրության մասին տվյալները</translation> <translation id="2349896577940037438">Եթե միացնեք Վեբ որոնման և հավելվածների լրացուցիչ պատմությունը, այս տվյալները կպահվեն ձեր Google հաշվում։ Դուք կարող եք դիտել և ջնջել ձեր տվյալները, ինչպես նաև փոխել հաշվի կարգավորումները account.google.com էջում։</translation> <translation id="2350133097354918058">Կրկին բեռնվեց</translation>
diff --git a/chrome/app/resources/generated_resources_id.xtb b/chrome/app/resources/generated_resources_id.xtb index 4fb5050..959d98b 100644 --- a/chrome/app/resources/generated_resources_id.xtb +++ b/chrome/app/resources/generated_resources_id.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">Aplikasi: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Izin diminta, tekan Ctrl + Forward untuk merespons</translation> <translation id="234889437187286781">Terjadi error saat memuat data</translation> -<translation id="2348939752188770364">Hapus data personalisasi ...</translation> <translation id="2349610121459545414">Terus izinkan situs ini mengakses lokasi Anda</translation> <translation id="2349896577940037438">Jika setelan Aktivitas Web & Aplikasi tambahan Anda diaktifkan, data ini mungkin akan disimpan ke Akun Google Anda. Anda dapat melihat data, menghapusnya, dan mengubah setelan akun Anda di account.google.com.</translation> <translation id="2350133097354918058">Dimuat ulang</translation>
diff --git a/chrome/app/resources/generated_resources_is.xtb b/chrome/app/resources/generated_resources_is.xtb index f8cbc61..0b5815ae 100644 --- a/chrome/app/resources/generated_resources_is.xtb +++ b/chrome/app/resources/generated_resources_is.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">Forrit: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Heimildar óskað, ýttu á Ctrl + Áfram til að svara</translation> <translation id="234889437187286781">Villa við að hlaða gögn</translation> -<translation id="2348939752188770364">Hreinsa sérsniðsgögn...</translation> <translation id="2349610121459545414">Halda áfram að veita þessu vefsvæði aðgang að staðsetningunni þinni</translation> <translation id="2349896577940037438">Ef kveikt er á ítarlegri vef- og forritavirkni geta þessi gögn verið vistuð á Google reikningnum þínum. Þú getur skoðað gögnin þín, eytt þeim og breytt reikningsstillingunum á account.google.com.</translation> <translation id="2350133097354918058">Endurhlaðið</translation>
diff --git a/chrome/app/resources/generated_resources_it.xtb b/chrome/app/resources/generated_resources_it.xtb index 138e1f6..7a3fef0e 100644 --- a/chrome/app/resources/generated_resources_it.xtb +++ b/chrome/app/resources/generated_resources_it.xtb
@@ -1745,7 +1745,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Autorizzazione richiesta, premi Ctrl + Avanti per rispondere</translation> <translation id="234889437187286781">Errore durante il caricamento dei dati</translation> -<translation id="2348939752188770364">Cancella dati personalizzazione…</translation> <translation id="2349610121459545414">Continua a consentire a questo sito di accedere alla tua posizione</translation> <translation id="2349896577940037438">Se hai attivato l'impostazione Attività web e app aggiuntiva, queste informazioni potrebbero essere salvate nel tuo Account Google. Puoi vedere ed eliminare i tuoi dati, nonché modificare le impostazioni account all'indirizzo account.google.com.</translation> <translation id="2350133097354918058">Ricaricata</translation>
diff --git a/chrome/app/resources/generated_resources_iw.xtb b/chrome/app/resources/generated_resources_iw.xtb index 9bee72a..feea0ee 100644 --- a/chrome/app/resources/generated_resources_iw.xtb +++ b/chrome/app/resources/generated_resources_iw.xtb
@@ -1753,7 +1753,6 @@ <translation id="2348176352564285430">אפליקציה: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – נשלחה בקשת הרשאה, יש ללחוץ על Ctrl + 'קדימה' כדי להשיב</translation> <translation id="234889437187286781">אירעה שגיאה במהלך טעינת הנתונים</translation> -<translation id="2348939752188770364">ניקוי הנתונים להתאמה אישית…</translation> <translation id="2349610121459545414">לאשר – האתר ימשיך לקבל גישה למיקום שלך</translation> <translation id="2349896577940037438">אם הופעלה ההגדרה 'פעילות באפליקציות ובאתרי אינטרנט נוספים', ייתכן שהנתונים יישמרו בחשבון Google שלך. אפשר להציג את הנתונים שלך, למחוק אותם ולשנות את הגדרות החשבון בכתובת account.google.com.</translation> <translation id="2350133097354918058">נטען מחדש</translation>
diff --git a/chrome/app/resources/generated_resources_ja.xtb b/chrome/app/resources/generated_resources_ja.xtb index de2627ed..b09430d9 100644 --- a/chrome/app/resources/generated_resources_ja.xtb +++ b/chrome/app/resources/generated_resources_ja.xtb
@@ -1734,7 +1734,6 @@ <translation id="2348176352564285430">アプリ: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - 権限がリクエストされました。対応するには、Ctrl+Forward キーを押してください</translation> <translation id="234889437187286781">データの読み込み中にエラーが発生しました</translation> -<translation id="2348939752188770364">入力履歴の消去...</translation> <translation id="2349610121459545414">このサイトによる位置情報へのアクセスを引き続き許可する</translation> <translation id="2349896577940037438">[その他のウェブとアプリのアクティビティ] の設定がオンになっている場合、このデータは Google アカウントに保存されます。データの確認、削除、アカウント設定の変更は、account.google.com で行うことができます。</translation> <translation id="2350133097354918058">再読み込みされました</translation>
diff --git a/chrome/app/resources/generated_resources_ka.xtb b/chrome/app/resources/generated_resources_ka.xtb index bc4c81c..a47b5fc 100644 --- a/chrome/app/resources/generated_resources_ka.xtb +++ b/chrome/app/resources/generated_resources_ka.xtb
@@ -1739,7 +1739,6 @@ <translation id="2348176352564285430">აპი: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> — მოთხოვნილია ნებართვა, გამოხმაურებისთვის დააჭირეთ კლავიშთა კომბინაციას Ctrl + წინ</translation> <translation id="234889437187286781">შეცდომა მონაცემების ჩატვირთვისას</translation> -<translation id="2348939752188770364">პერსონალიზაციის მონაცემების გასუფთავება...</translation> <translation id="2349610121459545414">ამ საიტისთვის თქვენს მდებარეობაზე წვდომის კვლავ დაშვება</translation> <translation id="2349896577940037438">თუ ჩართული გაქვთ ვებსა და აპებში დამატებითი აქტივობის პარამეტრი, აღნიშნული მონაცემები შესაძლოა შეინახოს თქვენს Google ანგარიშში. თქვენი მონაცემების ნახვა და წაშლა, ასევე ანგარიშის პარამეტრების შეცვლა შეგიძლიათ შემდეგ მისამართზე: account.google.com.</translation> <translation id="2350133097354918058">ხელახლა ჩაიტვირთა</translation>
diff --git a/chrome/app/resources/generated_resources_kk.xtb b/chrome/app/resources/generated_resources_kk.xtb index 28f7364..24ca8e6 100644 --- a/chrome/app/resources/generated_resources_kk.xtb +++ b/chrome/app/resources/generated_resources_kk.xtb
@@ -1736,7 +1736,6 @@ <translation id="2348176352564285430">Қолданба: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – рұқсат сұралды, жауап беру үшін Ctrl + Forward пернелер тіркесімін басыңыз.</translation> <translation id="234889437187286781">Деректерді жүктеу кезінде қате шықты.</translation> -<translation id="2348939752188770364">Жекелендіру деректерін тазарту…</translation> <translation id="2349610121459545414">Осы сайтқа геодерегіңізді пайдалану рұқсатын беруді жалғастыру</translation> <translation id="2349896577940037438">Егер "Интернет пен қолданбаларды пайдаланудың қосымша тарихы" параметрі қосулы болса, бұл деректер сіздің Google аккаунтыңызға сақталуы мүмкін. Сондай-ақ account.google.com сайтында деректерді көруге, жоюға және параметрлерді өзгертуге болады.</translation> <translation id="2350133097354918058">Қайта жүктелді.</translation>
diff --git a/chrome/app/resources/generated_resources_km.xtb b/chrome/app/resources/generated_resources_km.xtb index 8a72913..1bc569d 100644 --- a/chrome/app/resources/generated_resources_km.xtb +++ b/chrome/app/resources/generated_resources_km.xtb
@@ -1760,7 +1760,6 @@ <translation id="2348176352564285430">កម្មវិធី៖ <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - បានស្នើសុំការអនុញ្ញាត, ចុច Ctrl + Forward ដើម្បីឆ្លើយតប</translation> <translation id="234889437187286781">មានបញ្ហាក្នុងការផ្ទុកទិន្នន័យ</translation> -<translation id="2348939752188770364">សម្អាតទិន្នន័យសម្រាប់ការកំណត់ឱ្យមានលក្ខណៈផ្ទាល់ខ្លួន...</translation> <translation id="2349610121459545414">បន្តដោយអនុញ្ញាតឱ្យគេហទំព័រនេះចូលប្រើទីតាំងរបស់អ្នក</translation> <translation id="2349896577940037438">ប្រសិនបើការកំណត់សកម្មភាពកម្មវិធី និងគេហទំព័របន្ថែមរបស់អ្នកត្រូវបានបើក នោះទិន្នន័យនេះអាចត្រូវបានរក្សាទុកទៅក្នុងគណនី Google របស់អ្នក។ អ្នកអាចមើលទិន្នន័យរបស់អ្នក លុបវា និងប្ដូរការកំណត់គណនីរបស់អ្នកនៅ account.google.com។</translation> <translation id="2350133097354918058">បានផ្ទុកឡើងវិញ</translation>
diff --git a/chrome/app/resources/generated_resources_kn.xtb b/chrome/app/resources/generated_resources_kn.xtb index c48c838..a3cb851 100644 --- a/chrome/app/resources/generated_resources_kn.xtb +++ b/chrome/app/resources/generated_resources_kn.xtb
@@ -1753,7 +1753,6 @@ <translation id="2348176352564285430">ಅಪ್ಲಿಕೇಶನ್: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ಅನುಮತಿಯನ್ನು ವಿನಂತಿಸಲಾಗಿದೆ, ಪ್ರತಿಕ್ರಿಯಿಸಲು Ctrl + ಫಾರ್ವರ್ಡ್ ಒತ್ತಿರಿ</translation> <translation id="234889437187286781">ಡೇಟಾ ಲೋಡ್ ಮಾಡುವಾಗ ದೋಷ ಉಂಟಾಗಿದೆ</translation> -<translation id="2348939752188770364">ವೈಯಕ್ತಿಕಗೊಳಿಸಿದ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ...</translation> <translation id="2349610121459545414">ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸಲು ಈ ಸೈಟ್ಗೆ ಅನುಮತಿಯನ್ನು ಮುಂದುವರಿಸಿ</translation> <translation id="2349896577940037438">ನಿಮ್ಮ ಹೆಚ್ಚುವರಿ ವೆಬ್ ಮತ್ತು ಆ್ಯಪ್ ಚಟುವಟಿಕೆ ಸೆಟ್ಟಿಂಗ್ ಆನ್ ಆಗಿದ್ದರೆ, ಈ ಡೇಟಾವನ್ನು ನಿಮ್ಮ Google ಖಾತೆಯಲ್ಲಿ ಉಳಿಸಬಹುದು. account.google.com ನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ನೋಡಬಹುದು, ಅಳಿಸಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಖಾತೆಯ ಸೆಟ್ಟಿಂಗ್ಗಳನ್ನು ಬದಲಾಯಿಸಬಹುದು.</translation> <translation id="2350133097354918058">ಮರುಲೋಡ್ ಮಾಡಲಾಗಿದೆ</translation>
diff --git a/chrome/app/resources/generated_resources_ko.xtb b/chrome/app/resources/generated_resources_ko.xtb index 1e44ca09..f617f47d 100644 --- a/chrome/app/resources/generated_resources_ko.xtb +++ b/chrome/app/resources/generated_resources_ko.xtb
@@ -1756,7 +1756,6 @@ <translation id="2348176352564285430">앱: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - 권한 요청됨, Ctrl 키와 앞으로를 눌러 응답</translation> <translation id="234889437187286781">데이터를 로드하는 중에 오류가 발생했습니다.</translation> -<translation id="2348939752188770364">맞춤설정 데이터 지우기…</translation> <translation id="2349610121459545414">이 사이트의 위치 액세스 계속 허용</translation> <translation id="2349896577940037438">추가 웹 및 앱 활동이 사용 설정되어 있다면 이 데이터가 Google 계정에 저장될 수 있습니다. account.google.com에서 데이터를 보고 삭제하거나 계정 설정을 변경할 수 있습니다.</translation> <translation id="2350133097354918058">새로고침 완료</translation>
diff --git a/chrome/app/resources/generated_resources_ky.xtb b/chrome/app/resources/generated_resources_ky.xtb index 4aae770..7cf791cb 100644 --- a/chrome/app/resources/generated_resources_ky.xtb +++ b/chrome/app/resources/generated_resources_ky.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">Колдонмо: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Уруксат суралды. Жооп берүү үчүн Ctrl + Алдыга баскычтарын басыңыз</translation> <translation id="234889437187286781">Маалыматты жүктөөдө ката кетти</translation> -<translation id="2348939752188770364">Жекелештирүү маалыматын тазалоо...</translation> <translation id="2349610121459545414">Бул сайтка жайгашкан жериңизди көрүүгө уруксат берилсин</translation> <translation id="2349896577940037438">Эгер кошумча Колдонмолор жана Интернеттеги аракеттериңиздин таржымалынын параметрлери күйгүзүлгөн болсо, бул маалымат Google аккаунтуңузга сакталышы мүмкүн. Маалыматты көрүп, жок кылып жана аккаунтуңуздун параметрлерин өзгөртүү үчүн төмөнкү дарекке өтүңүз: account.google.com.</translation> <translation id="2350133097354918058">Кайра жүктөлдү</translation>
diff --git a/chrome/app/resources/generated_resources_lo.xtb b/chrome/app/resources/generated_resources_lo.xtb index 65686eb..16ee00b7 100644 --- a/chrome/app/resources/generated_resources_lo.xtb +++ b/chrome/app/resources/generated_resources_lo.xtb
@@ -1759,7 +1759,6 @@ <translation id="2348176352564285430">ແອັບ: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ຂໍການອະນຸຍາດແລ້ວ, ກະລຸນາກົດ Ctrl + ໄປໜ້າເພື່ອຕອບກັບ</translation> <translation id="234889437187286781">ເກີດຂໍ້ຜິດພາດໃນການໂຫຼດຂໍ້ມູນ</translation> -<translation id="2348939752188770364">ລຶບລ້າງຂໍ້ມູນການປັບແຕ່ງເປັນແບບສ່ວນຕົວ...</translation> <translation id="2349610121459545414">ສືບຕໍ່ອະນຸຍາດໃຫ້ເວັບໄຊນີ້ເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານ</translation> <translation id="2349896577940037438">ຖ້າເປີດການຕັ້ງຄ່າການເຄື່ອນໄຫວເວັບ ແລະ ແອັບເພີ່ມເຕີມຂອງທ່ານ, ລະບົບອາດຈະບັນທຶກຂໍ້ມູນນີ້ໄວ້ໃນບັນຊີ Google ຂອງທ່ານ. ທ່ານສາມາດເຫັນຂໍ້ມູນຂອງທ່ານ, ລຶບມັນ ແລະ ປ່ຽນການຕັ້ງຄ່າບັນຊີຂອງທ່ານໄດ້ທີ່ account.google.com.</translation> <translation id="2350133097354918058">ໂຫຼດຄືນໃໝ່ແລ້ວ</translation>
diff --git a/chrome/app/resources/generated_resources_lt.xtb b/chrome/app/resources/generated_resources_lt.xtb index abe064e..e855838 100644 --- a/chrome/app/resources/generated_resources_lt.xtb +++ b/chrome/app/resources/generated_resources_lt.xtb
@@ -1757,7 +1757,6 @@ <translation id="2348176352564285430">Programa: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – pateikta užklausa dėl leidimo; paspauskite Ctrl + pirmyn, kad atsakytumėte</translation> <translation id="234889437187286781">Klaida įkeliant duomenis</translation> -<translation id="2348939752188770364">Išvalyti suasmeninimo duomenis...</translation> <translation id="2349610121459545414">Toliau leisti šiai svetainei pasiekti jūsų vietovės informaciją</translation> <translation id="2349896577940037438">Jei papildomas Žiniatinklio ir programų veiklos nustatymas įjungtas, šie duomenys gali būti išsaugoti „Google“ paskyroje. Apsilankę adresu account.google.com galite peržiūrėti savo duomenis, juos ištrinti ir keisti paskyros nustatymus.</translation> <translation id="2350133097354918058">Įkelta iš naujo</translation>
diff --git a/chrome/app/resources/generated_resources_lv.xtb b/chrome/app/resources/generated_resources_lv.xtb index 394ddf6d..34087bb 100644 --- a/chrome/app/resources/generated_resources_lv.xtb +++ b/chrome/app/resources/generated_resources_lv.xtb
@@ -1741,7 +1741,6 @@ <translation id="2348176352564285430">Lietotne: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> — pieprasīta atļauja. Lai atbildētu, nospiediet vadīšanas taustiņu un uz priekšu vērsto bultiņu.</translation> <translation id="234889437187286781">Ielādējot datus, radās kļūda.</translation> -<translation id="2348939752188770364">Notīrīt personalizācijas datus…</translation> <translation id="2349610121459545414">Arī turpmāk atļaut šai vietnei piekļūt jūsu atrašanās vietas datiem</translation> <translation id="2349896577940037438">Ja ir ieslēgts iestatījums “papildu darbības tīmeklī un lietotnēs”, šie dati var tikt saglabāti jūsu Google kontā. Lai skatītu vai dzēstu datus vai mainītu konta iestatījumus, atveriet vietni account.google.com.</translation> <translation id="2350133097354918058">Atkārtoti ielādēts</translation>
diff --git a/chrome/app/resources/generated_resources_mk.xtb b/chrome/app/resources/generated_resources_mk.xtb index ed760dd6..12627b0 100644 --- a/chrome/app/resources/generated_resources_mk.xtb +++ b/chrome/app/resources/generated_resources_mk.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">Апликација: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Побарана е дозвола. Притиснете Ctrl + „Напред“ за да одговорите</translation> <translation id="234889437187286781">Грешка при вчитувањето податоци</translation> -<translation id="2348939752188770364">Избришете ги податоците за персонализација…</translation> <translation id="2349610121459545414">Продолжи да дозволуваш сајтов да пристапува до локацијата</translation> <translation id="2349896577940037438">Ако сте ја вклучиле дополнителната поставка „Активност на интернет и апликации“, податоциве може да се зачувуваат во вашата сметка на Google. Може да ги гледате и бришете податоците, како и да ги менувате поставките за сметката на account.google.com.</translation> <translation id="2350133097354918058">Повторно вчитана</translation>
diff --git a/chrome/app/resources/generated_resources_ml.xtb b/chrome/app/resources/generated_resources_ml.xtb index 21278ce..d7b5cd0 100644 --- a/chrome/app/resources/generated_resources_ml.xtb +++ b/chrome/app/resources/generated_resources_ml.xtb
@@ -1744,7 +1744,6 @@ <translation id="2348176352564285430">ആപ്പ്: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - അനുമതി അഭ്യർത്ഥിച്ചു, പ്രതികരിക്കാൻ Ctrl + Forward അമർത്തുക</translation> <translation id="234889437187286781">ഡാറ്റ ലോഡ് ചെയ്യുന്നതിൽ പിശക്</translation> -<translation id="2348939752188770364">വ്യക്തിപരമാക്കലിനുള്ള ഡാറ്റ മായ്ക്കുക...</translation> <translation id="2349610121459545414">നിങ്ങളുടെ ലൊക്കേഷൻ ആക്സസ് ചെയ്യാൻ ഈ സൈറ്റിനെ അനുവദിക്കുന്നത് തുടരുക</translation> <translation id="2349896577940037438">നിങ്ങളുടെ അധിക വെബ്, ആപ്പ് ആക്റ്റിവിറ്റി ക്രമീകരണം ഓണാക്കിയിട്ടുണ്ടെങ്കിൽ, ഈ ഡാറ്റ നിങ്ങളുടെ Google അക്കൗണ്ടിൽ സംരക്ഷിക്കപ്പെട്ടേക്കാം. account.google.com സന്ദർശിച്ച്, ഡാറ്റ കാണുകയും ഇല്ലാതാക്കുകയും നിങ്ങളുടെ അക്കൗണ്ട് ക്രമീകരണം മാറ്റുകയും ചെയ്യാവുന്നതാണ്.</translation> <translation id="2350133097354918058">റീലോഡ് ചെയ്തു</translation>
diff --git a/chrome/app/resources/generated_resources_mn.xtb b/chrome/app/resources/generated_resources_mn.xtb index 1e2db8ba..e8c3b89 100644 --- a/chrome/app/resources/generated_resources_mn.xtb +++ b/chrome/app/resources/generated_resources_mn.xtb
@@ -1750,7 +1750,6 @@ <translation id="2348176352564285430">Апп: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Зөвшөөрлийн хүсэлт тавьсан. Хариу өгөхийн тулд Ctrl + Forward дээр дарна уу</translation> <translation id="234889437187286781">Өгөгдлийг ачаалахад алдаа гарлаа</translation> -<translation id="2348939752188770364">Хувийн тохиргооны өгөгдлийг арилгах...</translation> <translation id="2349610121459545414">Байршилд тань хандахыг энэ сайтад үргэлжлүүлэн зөвшөөрөх</translation> <translation id="2349896577940037438">Хэрэв таны Веб, аппын нэмэлт үйл ажиллагааны тохиргоо асаалттай байвал энэ өгөгдлийг таны Google Бүртгэлд хадгалж болзошгүй. Та account.google.com дээр өгөгдлөө харах, устгах болон бүртгэлийн тохиргоогоо өөрчлөх боломжтой.</translation> <translation id="2350133097354918058">Дахин ачаалсан</translation>
diff --git a/chrome/app/resources/generated_resources_mr.xtb b/chrome/app/resources/generated_resources_mr.xtb index 12e8c209..edfe2de 100644 --- a/chrome/app/resources/generated_resources_mr.xtb +++ b/chrome/app/resources/generated_resources_mr.xtb
@@ -1753,7 +1753,6 @@ <translation id="2348176352564285430">ॲप: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - परवानगीची विनंती केली आहे, प्रतिसाद देण्यासाठी Ctrl + Forward प्रेस करा</translation> <translation id="234889437187286781">डेटा लोड करताना एरर आली</translation> -<translation id="2348939752188770364">पर्सनलायझेशन डेटा साफ करा...</translation> <translation id="2349610121459545414">या साइटला तुमचे स्थान अॅक्सेस करण्याची परवानगी देणे पुढे सुरू ठेवा</translation> <translation id="2349896577940037438">तुमचे अतिरिक्त वेब आणि अॅप अॅक्टिव्हिटी सेटिंग सुरू केलेले असल्यास, हा डेटा तुमच्या Google खाते वर सेव्ह केला जाऊ शकतो. तुम्ही account.google.com येथे तुमचा डेटा पाहू शकता, तो हटवू शकता आणि तुमची खाते सेटिंग्ज बदलू शकता.</translation> <translation id="2350133097354918058">रीलोड केलेले</translation>
diff --git a/chrome/app/resources/generated_resources_ms.xtb b/chrome/app/resources/generated_resources_ms.xtb index b4d0a8e..a550394 100644 --- a/chrome/app/resources/generated_resources_ms.xtb +++ b/chrome/app/resources/generated_resources_ms.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">Apl: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Kebenaran diminta, tekan Ctrl + Maju untuk memberikan respons</translation> <translation id="234889437187286781">Ralat semasa memuatkan data</translation> -<translation id="2348939752188770364">Kosongkan data pemeribadian...</translation> <translation id="2349610121459545414">Terus membenarkan tapak ini untuk mengakses lokasi anda</translation> <translation id="2349896577940037438">Jika tetapan Aktiviti Web & Apl tambahan anda dihidupkan, data ini mungkin disimpan pada Akaun Google anda. Anda dapat melihat data anda, memadamkan data dan menukar tetapan akaun melalui account.google.com.</translation> <translation id="2350133097354918058">Dimuat semula</translation>
diff --git a/chrome/app/resources/generated_resources_my.xtb b/chrome/app/resources/generated_resources_my.xtb index 62b8e7c0..78b16aa5 100644 --- a/chrome/app/resources/generated_resources_my.xtb +++ b/chrome/app/resources/generated_resources_my.xtb
@@ -1758,7 +1758,6 @@ <translation id="2348176352564285430">အက်ပ် − <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ခွင့်ပြုချက်တောင်းထားသည်၊ တုံ့ပြန်ရန် 'Ctrl + ညာညွှန်မြား' ကို နှိပ်ပါ</translation> <translation id="234889437187286781">ဒေတာတင်မှု အမှား</translation> -<translation id="2348939752188770364">ကိုယ်ရေးအချက်အလက် ရှင်းထုတ်ရန်…</translation> <translation id="2349610121459545414">သင့်တည်နေရာသုံးခွင့်ကို ဤဝဘ်ဆိုက်အား ဆက်လက်ခွင့်ပြုရန်</translation> <translation id="2349896577940037438">သင်၏ထပ်တိုး 'ဝဘ်နှင့် အက်ပ်လုပ်ဆောင်ချက်' ကို ဖွင့်ထားသည့်အခါ ဤဒေတာကို သင့် Google အကောင့်သို့ သိမ်းသွားပါမည်။ သင်၏ ဒေတာများကို ကြည့်ခြင်း၊ ဖျက်ခြင်းနှင့် သင့်အကောင့်ဆက်တင်များ ပြောင်းခြင်းတို့ကို account.google.com တွင် လုပ်ဆောင်နိုင်သည်။</translation> <translation id="2350133097354918058">ပြန်လည် စတင်ထားသည်</translation>
diff --git a/chrome/app/resources/generated_resources_ne.xtb b/chrome/app/resources/generated_resources_ne.xtb index 6e25c2a..666e286 100644 --- a/chrome/app/resources/generated_resources_ne.xtb +++ b/chrome/app/resources/generated_resources_ne.xtb
@@ -1742,7 +1742,6 @@ <translation id="2348176352564285430">एप: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - अनुमति मागियो, यस सम्बन्धमा कारबाही गर्न Ctrl + Forward थिच्नुहोस्</translation> <translation id="234889437187286781">डेटा लोड गर्ने क्रममा त्रुटि भयो</translation> -<translation id="2348939752188770364">पर्सनलाइजेसनसम्बन्धी डेटा मेटाउनुहोस्...</translation> <translation id="2349610121459545414">यो साइटलाई आफ्नो स्थानसम्बन्धी जानकारी प्रयोग गरिरहन दिनुहोस्</translation> <translation id="2349896577940037438">तपाईंको खातामा अतिरिक्त वेब तथा एपसम्बन्धी गतिविधिको सेटिङ सक्रिय गरिएको छ भने यो डेटा तपाईंको Google खातामा सेभ गरिन सक्छ। तपाईं account.google.com मा गई आफ्नो डेटा हेर्न, त्यसलाई मेट्न र आफ्नो खातासम्बन्धी सेटिङ परिवर्तन गर्न सक्नुहुन्छ।</translation> <translation id="2350133097354918058">पुनः लोड गरियो</translation>
diff --git a/chrome/app/resources/generated_resources_nl.xtb b/chrome/app/resources/generated_resources_nl.xtb index 94fb9c9..cc21229 100644 --- a/chrome/app/resources/generated_resources_nl.xtb +++ b/chrome/app/resources/generated_resources_nl.xtb
@@ -1739,7 +1739,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" />: rechten gevraagd, druk op Ctrl + Volgende om te reageren</translation> <translation id="234889437187286781">Fout bij laden van gegevens</translation> -<translation id="2348939752188770364">Personalisatiegegevens wissen…</translation> <translation id="2349610121459545414">Toestaan dat deze site toegang tot je locatie blijft houden</translation> <translation id="2349896577940037438">Als je de instelling voor aanvullende Web- en app-activiteit hebt aangezet, kunnen deze gegevens worden opgeslagen in je Google-account. Op account.google.com kun je je gegevens bekijken en verwijderen, en je accountinstellingen wijzigen.</translation> <translation id="2350133097354918058">Opnieuw geladen</translation>
diff --git a/chrome/app/resources/generated_resources_no.xtb b/chrome/app/resources/generated_resources_no.xtb index a6e9fc8..3f80cb7 100644 --- a/chrome/app/resources/generated_resources_no.xtb +++ b/chrome/app/resources/generated_resources_no.xtb
@@ -1749,7 +1749,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> ber om tillatelse. Trykk på Ctrl + Frem for å svare</translation> <translation id="234889437187286781">Feil ved innlasting av data</translation> -<translation id="2348939752188770364">Tøm data for personlig tilpassing…</translation> <translation id="2349610121459545414">Fortsett å la dette nettstedet ha tilgang til posisjonen din</translation> <translation id="2349896577940037438">Hvis du har slått på innstillingen for annen nett- og appaktivitet, kan disse dataene bli lagret i Google-kontoen din. Du kan se og slette dataene dine samt endre kontoinnstillingene dine på account.google.com.</translation> <translation id="2350133097354918058">Lastet inn på nytt</translation>
diff --git a/chrome/app/resources/generated_resources_or.xtb b/chrome/app/resources/generated_resources_or.xtb index 8192a1e..4c2da595 100644 --- a/chrome/app/resources/generated_resources_or.xtb +++ b/chrome/app/resources/generated_resources_or.xtb
@@ -1737,7 +1737,6 @@ <translation id="2348176352564285430">ଆପ୍: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ଅନୁମତି ପାଇଁ ଅନୁରୋଧ କରାଯାଇଛି, ଉତ୍ତର ଦେବାକୁ Ctrl + Forward କୀ ଦବାନ୍ତୁ</translation> <translation id="234889437187286781">ଡାଟା ଲୋଡ୍ କରିବା ସମୟରେ ତ୍ରୁଟି</translation> -<translation id="2348939752188770364">ପର୍ସନାଲାଇଜେସନ ଡାଟାକୁ ଖାଲି କରନ୍ତୁ...</translation> <translation id="2349610121459545414">ଆପଣଙ୍କ ଲୋକେସନ୍ ଆକ୍ସେସ୍ କରିବା ପାଇଁ ଏହି ସାଇଟକୁ ଅନୁମତି ଦେବା ଜାରି ରଖନ୍ତୁ</translation> <translation id="2349896577940037438">ଯଦି ଆପଣଙ୍କର ଅତିରିକ୍ତ ୱେବ୍ ଓ ଆପ୍ କାର୍ଯ୍ୟକଳାପ ସେଟିଂ ଚାଲୁ ଅଛି, ତେବେ ଏହି ଡାଟା ଆପଣଙ୍କ Google ଆକାଉଣ୍ଟରେ ସେଭ୍ ହୋଇପାରେ। ଆପଣ ଆପଣଙ୍କ ଡାଟା ଦେଖିପାରିବେ, ଏହାକୁ ଡିଲିଟ୍ କରିପାରିବେ ଏବଂ account.google.comରେ ଆପଣଙ୍କର ଆକାଉଣ୍ଟ ସେଟିଂସ୍ ପରିବର୍ତ୍ତନ କରିପାରିବେ।</translation> <translation id="2350133097354918058">ପୁଣି ଲୋଡ୍ କରାଯାଇଛି</translation>
diff --git a/chrome/app/resources/generated_resources_pa.xtb b/chrome/app/resources/generated_resources_pa.xtb index 96ef0a4..1f47763a 100644 --- a/chrome/app/resources/generated_resources_pa.xtb +++ b/chrome/app/resources/generated_resources_pa.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">ਐਪ: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ਇਜਾਜ਼ਤ ਦੀ ਬੇਨਤੀ ਕੀਤੀ ਗਈ, ਜਵਾਬ ਦੇਣ ਲਈ Ctrl + Forward ਨੂੰ ਦਬਾਓ</translation> <translation id="234889437187286781">ਡਾਟਾ ਲੋਡ ਕਰਨ ਵਿੱਚ ਗੜਬੜ ਹੋਈ</translation> -<translation id="2348939752188770364">ਨਿੱਜੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ...</translation> <translation id="2349610121459545414">ਇਸ ਸਾਈਟ ਨੂੰ ਤੁਹਾਡੇ ਟਿਕਾਣੇ ਤੱਕ ਪਹੁੰਚ ਕਰਨ ਦੀ ਇਜਾਜ਼ਤ ਦੇਣੀ ਜਾਰੀ ਰੱਖੋ</translation> <translation id="2349896577940037438">ਜੇ ਤੁਹਾਡੀ ਵਧੀਕ 'ਵੈੱਬ ਅਤੇ ਐਪ ਸਰਗਰਮੀ' ਸੈਟਿੰਗ ਚਾਲੂ ਹੋਵੇ, ਤਾਂ ਇਹ ਡਾਟਾ ਤੁਹਾਡੇ Google ਖਾਤੇ ਵਿੱਚ ਰੱਖਿਅਤ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ। account.google.com 'ਤੇ ਤੁਸੀਂ ਆਪਣਾ ਡਾਟਾ ਦੇਖ ਸਕਦੇ ਹੋ, ਇਸਨੂੰ ਮਿਟਾ ਸਕਦੇ ਹੋ ਅਤੇ ਆਪਣੀਆਂ ਖਾਤਾ ਸੈਟਿੰਗਾਂ ਬਦਲ ਸਕਦੇ ਹੋ।</translation> <translation id="2350133097354918058">ਰੀਲੋਡ ਹੋਈ</translation>
diff --git a/chrome/app/resources/generated_resources_pl.xtb b/chrome/app/resources/generated_resources_pl.xtb index 73e4967..ddbd993 100644 --- a/chrome/app/resources/generated_resources_pl.xtb +++ b/chrome/app/resources/generated_resources_pl.xtb
@@ -1725,7 +1725,6 @@ <translation id="2348176352564285430">Aplikacja: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – zgłoszono prośbę o uprawnienia. Aby odpowiedzieć, naciśnij Ctrl + Dalej.</translation> <translation id="234889437187286781">Błąd podczas ładowania danych</translation> -<translation id="2348939752188770364">Usuń dane personalizacji…</translation> <translation id="2349610121459545414">Nadal zezwalaj tej stronie na dostęp do Twojej lokalizacji</translation> <translation id="2349896577940037438">Jeśli włączysz ustawienie Dodatkowa aktywność w internecie i aplikacjach, te dane mogą być zapisywane na Twoim koncie Google. Na account.google.com możesz je zobaczyć, usunąć oraz zmienić ustawienia konta.</translation> <translation id="2350133097354918058">Załadowano ponownie</translation>
diff --git a/chrome/app/resources/generated_resources_pt-BR.xtb b/chrome/app/resources/generated_resources_pt-BR.xtb index 6d0e205b..729168d4 100644 --- a/chrome/app/resources/generated_resources_pt-BR.xtb +++ b/chrome/app/resources/generated_resources_pt-BR.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" />: permissão solicitada; Pressione Ctrl + Avançar para responder</translation> <translation id="234889437187286781">Erro ao carregar os dados</translation> -<translation id="2348939752188770364">Remover dados de personalização…</translation> <translation id="2349610121459545414">Continuar permitindo que este site acesse sua localização</translation> <translation id="2349896577940037438">Se a configuração "Atividade na Web e de apps adicional" estiver ativada, esses dados poderão ser salvos na sua Conta do Google. Você pode ver seus dados, excluí-los e mudar as configurações da sua conta em account.google.com.</translation> <translation id="2350133097354918058">Atualizada</translation>
diff --git a/chrome/app/resources/generated_resources_pt-PT.xtb b/chrome/app/resources/generated_resources_pt-PT.xtb index 2220492..9d033d31 100644 --- a/chrome/app/resources/generated_resources_pt-PT.xtb +++ b/chrome/app/resources/generated_resources_pt-PT.xtb
@@ -1739,7 +1739,6 @@ <translation id="2348176352564285430">Aplicação: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Autorização solicitada, prima Ctrl + Avançar para responder</translation> <translation id="234889437187286781">Ocorreu um erro ao carregar os dados.</translation> -<translation id="2348939752188770364">Limpar dados de personalização…</translation> <translation id="2349610121459545414">Continuar a permitir que este site aceda à sua localização</translation> <translation id="2349896577940037438">Se a definição Atividade da Web e de apps adicional estiver ativada, estes dados podem ser guardados na sua Conta Google. Pode ver os seus dados, eliminá-los e alterar as definições da conta em account.google.com.</translation> <translation id="2350133097354918058">Atualizada.</translation>
diff --git a/chrome/app/resources/generated_resources_ro.xtb b/chrome/app/resources/generated_resources_ro.xtb index 304c740b..5bd47f9 100644 --- a/chrome/app/resources/generated_resources_ro.xtb +++ b/chrome/app/resources/generated_resources_ro.xtb
@@ -1740,7 +1740,6 @@ <translation id="2348176352564285430">Aplicație: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Permisiune necesară, apasă Ctrl + tasta Înainte pentru a răspunde</translation> <translation id="234889437187286781">Eroare la încărcarea datelor</translation> -<translation id="2348939752188770364">Șterge datele personalizate...</translation> <translation id="2349610121459545414">Permite în continuare accesul acestui site la locație</translation> <translation id="2349896577940037438">Dacă setarea Activitatea suplimentară de pe web și din aplicații este activată, aceste date pot fi salvate în Contul tău Google. Poți să consulți datele, să le ștergi și să modifici setările contului la account.google.com.</translation> <translation id="2350133097354918058">S-a reîncărcat</translation>
diff --git a/chrome/app/resources/generated_resources_ru.xtb b/chrome/app/resources/generated_resources_ru.xtb index 66b247a..62fbfcb 100644 --- a/chrome/app/resources/generated_resources_ru.xtb +++ b/chrome/app/resources/generated_resources_ru.xtb
@@ -1741,7 +1741,6 @@ <translation id="2348176352564285430">Приложение: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – требуется разрешение. Нажмите Ctrl + Косая черта, чтобы ответить.</translation> <translation id="234889437187286781">При загрузке данных произошла ошибка.</translation> -<translation id="2348939752188770364">Удаление данных для персонализации…</translation> <translation id="2349610121459545414">По-прежнему предоставлять этому сайту доступ к моим геоданным</translation> <translation id="2349896577940037438">Если запись дополнительной истории приложений и веб-поиска включена, эта информация может сохраняться в вашем аккаунте. Чтобы посмотреть или удалить данные, а также изменить настройки аккаунта, перейдите на страницу account.google.com.</translation> <translation id="2350133097354918058">Перезапущено.</translation>
diff --git a/chrome/app/resources/generated_resources_si.xtb b/chrome/app/resources/generated_resources_si.xtb index e45be72..e5373b6 100644 --- a/chrome/app/resources/generated_resources_si.xtb +++ b/chrome/app/resources/generated_resources_si.xtb
@@ -1749,7 +1749,6 @@ <translation id="2348176352564285430">යෙදුම: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - අවසරය ඉල්ලන ලදි, ප්රතිචාර දැක්වීමට Ctrl + ඉදිරියට ඔබන්න</translation> <translation id="234889437187286781">දත්ත පූරණය කිරීමේ දෝෂයකි</translation> -<translation id="2348939752188770364">පුද්ගලාරෝපණ දත්ත හිස් කරන්න...</translation> <translation id="2349610121459545414">ඔබේ ස්ථානයට පිවිසීමට මෙම අඩවියට ඉඩ දීම දිගටම කරගෙන යන්න</translation> <translation id="2349896577940037438">ඔබේ අමතර වෙබ් සහ යෙදුම් ක්රියාකාරකම් සැකසීම සක්රීය නම්, මෙම දත්ත ඔබේ Google ගිණුුමට සුරකිනු ලැබේ. account.google.com හි ඔබට ඔබේ දත්ත බැලීමට, එය වෙනස් කිරීමට සහ ඔබේ ගිණුම් සැකසීම් වෙනස් කිරීමට හැකිය.</translation> <translation id="2350133097354918058">යළි පූරණ කළා</translation>
diff --git a/chrome/app/resources/generated_resources_sk.xtb b/chrome/app/resources/generated_resources_sk.xtb index 7bc706c..9d1cc95 100644 --- a/chrome/app/resources/generated_resources_sk.xtb +++ b/chrome/app/resources/generated_resources_sk.xtb
@@ -1741,7 +1741,6 @@ <translation id="2348176352564285430">Aplikácia: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Vyžaduje sa povolenie, reagujte stlačením klávesov Ctrl + Ďalej</translation> <translation id="234889437187286781">Chyba pri načítavaní údajov</translation> -<translation id="2348939752188770364">Vymazať údaje prispôsobenia...</translation> <translation id="2349610121459545414">Naďalej umožňovať tomuto webu prístup k polohe</translation> <translation id="2349896577940037438">Ak aktivujete ďalšiu aktivitu na internete a v aplikáciách, tieto údaje sa uložia vo vašom účte Google. Môžete ich zobraziť a odstrániť na account.google.com, kde tiež môžete zmeniť nastavenia účtu.</translation> <translation id="2350133097354918058">Znovu načítané</translation>
diff --git a/chrome/app/resources/generated_resources_sl.xtb b/chrome/app/resources/generated_resources_sl.xtb index 1f7f5b2..4a53b15 100644 --- a/chrome/app/resources/generated_resources_sl.xtb +++ b/chrome/app/resources/generated_resources_sl.xtb
@@ -1757,7 +1757,6 @@ <translation id="2348176352564285430">Aplikacija: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Zahtevano je dovoljenje; pritisnite Ctrl + tipko za naprej, če se želite odzvati.</translation> <translation id="234889437187286781">Napaka pri nalaganju podatkov</translation> -<translation id="2348939752188770364">Izbriši podatke osebnega prilagajanja …</translation> <translation id="2349610121459545414">Še naprej omogoči temu spletnemu mestu dostop do lokacije</translation> <translation id="2349896577940037438">Če ste vklopili dodatno beleženje dejavnosti v spletu in aplikacijah, bodo ti podatki morda shranjeni v vašem računu Google. Na account.google.com si lahko ogledate podatke in jih izbrišete ter spremenite nastavitve računa.</translation> <translation id="2350133097354918058">Znova naložena</translation>
diff --git a/chrome/app/resources/generated_resources_sq.xtb b/chrome/app/resources/generated_resources_sq.xtb index fae99222..0cad4ed 100644 --- a/chrome/app/resources/generated_resources_sq.xtb +++ b/chrome/app/resources/generated_resources_sq.xtb
@@ -1737,7 +1737,6 @@ <translation id="2348176352564285430">Aplikacioni: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Kërkohet leje, shtyp Ctrl + Përpara për t'u përgjigjur</translation> <translation id="234889437187286781">Gabim gjatë ngarkimit të të dhënave</translation> -<translation id="2348939752188770364">Pastro të dhënat e personalizimit...</translation> <translation id="2349610121459545414">Vazhdo ta lejosh këtë sajt që të ketë qasje te vendndodhja jote</translation> <translation id="2349896577940037438">Nëse cilësimi i "Aktivitetit shtesë të uebit dhe të aplikacioneve" është i aktivizuar, këto të dhëna mund të ruhen në "Llogarinë tënde të Google". Mund t'i shikosh të dhënat, t'i fshish ato dhe të ndryshosh cilësimet e tua të llogarisë tek account.google.com.</translation> <translation id="2350133097354918058">U ringarkua</translation>
diff --git a/chrome/app/resources/generated_resources_sr-Latn.xtb b/chrome/app/resources/generated_resources_sr-Latn.xtb index 034cb4b7..ee53b16 100644 --- a/chrome/app/resources/generated_resources_sr-Latn.xtb +++ b/chrome/app/resources/generated_resources_sr-Latn.xtb
@@ -1743,7 +1743,6 @@ <translation id="2348176352564285430">Aplikacija: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Zatražena je dozvola. Pritisnite Ctrl + Forward da biste odgovorili</translation> <translation id="234889437187286781">Greška pri učitavanju podataka</translation> -<translation id="2348939752188770364">Obriši podatke za personalizaciju</translation> <translation id="2349610121459545414">Nastavi da dozvoljavaš ovom sajtu da pristupa lokaciji</translation> <translation id="2349896577940037438">Ako uključite podešavanje dodatne aktivnosti na vebu i u aplikacijama, ti podaci će se možda čuvati na Google nalogu. Podatke možete da pregledate, izbrišete i promenite na account.google.com.</translation> <translation id="2350133097354918058">Učitano ponovo</translation>
diff --git a/chrome/app/resources/generated_resources_sr.xtb b/chrome/app/resources/generated_resources_sr.xtb index bb325d3..6a70a188 100644 --- a/chrome/app/resources/generated_resources_sr.xtb +++ b/chrome/app/resources/generated_resources_sr.xtb
@@ -1743,7 +1743,6 @@ <translation id="2348176352564285430">Апликација: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Затражена је дозвола. Притисните Ctrl + Forward да бисте одговорили</translation> <translation id="234889437187286781">Грешка при учитавању података</translation> -<translation id="2348939752188770364">Обриши податке за персонализацију</translation> <translation id="2349610121459545414">Настави да дозвољаваш овом сајту да приступа локацији</translation> <translation id="2349896577940037438">Ако укључите подешавање додатне активности на вебу и у апликацијама, ти подаци ће се можда чувати на Google налогу. Податке можете да прегледате, избришете и промените на account.google.com.</translation> <translation id="2350133097354918058">Учитано поново</translation>
diff --git a/chrome/app/resources/generated_resources_sv.xtb b/chrome/app/resources/generated_resources_sv.xtb index cc1536d..ebf8116 100644 --- a/chrome/app/resources/generated_resources_sv.xtb +++ b/chrome/app/resources/generated_resources_sv.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">App: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Behörighet har begärts, tryck på Ctrl + framåt för att svara</translation> <translation id="234889437187286781">Fel vid inläsning av data</translation> -<translation id="2348939752188770364">Rensa anpassningsdata …</translation> <translation id="2349610121459545414">Fortsätt ge den här webbplatsen åtkomst till din plats</translation> <translation id="2349896577940037438">Om ytterligare webb- och appaktivitet har aktiverats kan denna data sparas i Google-kontot. Du kan visa din data, radera den och ändra inställningarna på account.google.com.</translation> <translation id="2350133097354918058">Inläst igen</translation>
diff --git a/chrome/app/resources/generated_resources_sw.xtb b/chrome/app/resources/generated_resources_sw.xtb index 77f5811..5d11b33 100644 --- a/chrome/app/resources/generated_resources_sw.xtb +++ b/chrome/app/resources/generated_resources_sw.xtb
@@ -1751,7 +1751,6 @@ <translation id="2348176352564285430">Programu: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Umeombwa ruhusa, bonyeza vitufe vya Ctrl na Forward ili ujibu</translation> <translation id="234889437187286781">Hitilafu ya kupakia data</translation> -<translation id="2348939752188770364">Futa data ya uwekaji mapendeleo...</translation> <translation id="2349610121459545414">Endelea kuruhusu tovuti hii ifikie maelezo ya mahali ulipo</translation> <translation id="2349896577940037438">Ikiwa umewasha mipangilio ya historia ya Shughuli za ziada kwenye Wavuti na Programu, huenda data hii itahifadhiwa kwenye Akaunti yako ya Google. Unaweza kuona data yako, kuifuta na kubadilisha mipangilio ya akaunti yako katika account.google.com.</translation> <translation id="2350133097354918058">Kimepakiwa upya</translation>
diff --git a/chrome/app/resources/generated_resources_ta.xtb b/chrome/app/resources/generated_resources_ta.xtb index 9b19b9be..b33f8aa 100644 --- a/chrome/app/resources/generated_resources_ta.xtb +++ b/chrome/app/resources/generated_resources_ta.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">ஆப்ஸ்: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - அனுமதி கோரப்பட்டுள்ளது பதிலளிக்க Ctrl + Forward விசைகளை அழுத்தவும்</translation> <translation id="234889437187286781">தரவை ஏற்றுவதில் பிழை</translation> -<translation id="2348939752188770364">பிரத்தியேகத் தரவை அழி...</translation> <translation id="2349610121459545414">எனது இருப்பிடத் தகவலை அணுக இந்தத் தளத்தைத் தொடர்ந்து அனுமதி</translation> <translation id="2349896577940037438">கூடுதல் ’இணையம் & ஆப்ஸ் செயல்பாடு’ அமைப்பு இயக்கப்பட்டிருந்தால், இந்தத் தரவு உங்கள் Google கணக்கில் சேமிக்கப்படக்கூடும். account.google.comமில் உங்களின் தரவைப் பார்க்கலாம், நீக்கலாம் மற்றும் மாற்றலாம்.</translation> <translation id="2350133097354918058">ரெஃப்ரெஷ் செய்யப்பட்டது</translation>
diff --git a/chrome/app/resources/generated_resources_te.xtb b/chrome/app/resources/generated_resources_te.xtb index fad28042..79a2702 100644 --- a/chrome/app/resources/generated_resources_te.xtb +++ b/chrome/app/resources/generated_resources_te.xtb
@@ -1752,7 +1752,6 @@ <translation id="2348176352564285430">యాప్: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - అనుమతి కోసం రిక్వెస్ట్ చేశారు, ప్రతిస్పందించడానికి Ctrl + Forwardను నొక్కండి</translation> <translation id="234889437187286781">డేటాను లోడ్ చేయడంలో ఎర్రర్ ఏర్పడింది</translation> -<translation id="2348939752188770364">వ్యక్తిగతీకరణ డేటాను క్లియర్ చేయండి...</translation> <translation id="2349610121459545414">మీ లొకేషన్ను యాక్సెస్ చేయడానికి ఈ సైట్కు అనుమతిని కొనసాగించండి</translation> <translation id="2349896577940037438">మీ అదనపు వెబ్ & యాప్ యాక్టివిటీ సెట్టింగ్ను ఆన్ చేసినట్లయితే, ఈ డేటా మీ Google ఖాతాలో సేవ్ చేయబడవచ్చు. మీరు account.google.comలో మీ డేటాను చూడవచ్చు, దానిని తొలగించవచ్చు, మీ ఖాతా సెట్టింగ్లను మార్చవచ్చు.</translation> <translation id="2350133097354918058">మళ్లీ లోడ్ చేయబడింది</translation>
diff --git a/chrome/app/resources/generated_resources_th.xtb b/chrome/app/resources/generated_resources_th.xtb index 8b2bd6f..f5ef967f 100644 --- a/chrome/app/resources/generated_resources_th.xtb +++ b/chrome/app/resources/generated_resources_th.xtb
@@ -1739,7 +1739,6 @@ <translation id="2348176352564285430">แอป: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - ขอสิทธิ์ กด Ctrl + ไปข้างหน้าเพื่อตอบกลับ</translation> <translation id="234889437187286781">เกิดข้อผิดพลาดขณะโหลดข้อมูล</translation> -<translation id="2348939752188770364">ล้างข้อมูลการปรับเปลี่ยนในแบบของคุณ...</translation> <translation id="2349610121459545414">อนุญาตให้เว็บไซต์นี้เข้าถึงตำแหน่งของคุณต่อไป</translation> <translation id="2349896577940037438">หากเปิดการตั้งค่ากิจกรรมเพิ่มเติมบนเว็บและแอปไว้ ระบบอาจบันทึกข้อมูลนี้ไว้ในบัญชี Google ของคุณ คุณดูและลบข้อมูล ตลอดจนเปลี่ยนแปลงการตั้งค่าบัญชีได้ที่ account.google.com</translation> <translation id="2350133097354918058">โหลดซ้ำแล้ว</translation>
diff --git a/chrome/app/resources/generated_resources_tr.xtb b/chrome/app/resources/generated_resources_tr.xtb index 938bcd7..edd24a5f 100644 --- a/chrome/app/resources/generated_resources_tr.xtb +++ b/chrome/app/resources/generated_resources_tr.xtb
@@ -1737,7 +1737,6 @@ <translation id="2348176352564285430">Uygulama: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - İzin istendi, yanıtlamak için Ctrl + İleri tuşlarına basın</translation> <translation id="234889437187286781">Veri yüklenirken hata oluştu</translation> -<translation id="2348939752188770364">Kişiselleştirme verilerini temizle...</translation> <translation id="2349610121459545414">Bu sitenin konumuma erişmesine izin vermeye devam et</translation> <translation id="2349896577940037438">Ek Web ve Uygulama Etkinliği açıksa bu veriler Google Hesabınıza kaydedilebilir. account.google.com adresinde verilerinizi görebilir, silebilir ve hesap ayarlarınızı değiştirebilirsiniz.</translation> <translation id="2350133097354918058">Yeniden yüklendi</translation>
diff --git a/chrome/app/resources/generated_resources_uk.xtb b/chrome/app/resources/generated_resources_uk.xtb index 5f05e5a..0f82aa4c 100644 --- a/chrome/app/resources/generated_resources_uk.xtb +++ b/chrome/app/resources/generated_resources_uk.xtb
@@ -1757,7 +1757,6 @@ <translation id="2348176352564285430">Додаток: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Потрібен дозвіл. Натисніть Ctrl + стрілку вперед, щоб відповісти</translation> <translation id="234889437187286781">Не вдалося завантажити дані</translation> -<translation id="2348939752188770364">Очистити дані персоналізації…</translation> <translation id="2349610121459545414">Надалі надавати цьому сайту доступ до ваших геоданих</translation> <translation id="2349896577940037438">Якщо ввімкнено також запис Історії додатків і веб-пошуку, ці дані можуть зберігатися в обліковому записі Google. На сторінці account.google.com можна переглядати й видаляти дані, а також змінювати налаштування облікового запису.</translation> <translation id="2350133097354918058">Оновлено</translation>
diff --git a/chrome/app/resources/generated_resources_ur.xtb b/chrome/app/resources/generated_resources_ur.xtb index 7e591809..d7c4cc5c 100644 --- a/chrome/app/resources/generated_resources_ur.xtb +++ b/chrome/app/resources/generated_resources_ur.xtb
@@ -1747,7 +1747,6 @@ <translation id="2348176352564285430">ایپ: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - اجازت کی درخواست کی گئی، جواب دینے کے ليے Ctrl + Forward دبائیں</translation> <translation id="234889437187286781">ڈیٹا کو لوڈ کرنے میں خرابی</translation> -<translation id="2348939752188770364">ذاتی نوعیت کا بنانے کا ڈیٹا صاف کریں...</translation> <translation id="2349610121459545414">اس سائٹ کو اپنے مقام تک رسائی کی اجازت دینا جاری رکھیں</translation> <translation id="2349896577940037438">اگر آپ کی ویب اور ایپ کی اضافی سرگرمی کی ترتیب آن ہے تو اس ڈیٹا کو آپ کے Google اکاؤنٹ میں محفوظ کیا جا سکتا ہے۔ آپ account.google.com پر اپنا ڈیٹا دیکھ سکتے ہیں، اسے حذف کر سکتے ہیں اور اپنی اکاؤنٹ کی ترتیبات تبدیل کر سکتے ہیں۔</translation> <translation id="2350133097354918058">دوبارہ لوڈ کی گئی</translation>
diff --git a/chrome/app/resources/generated_resources_uz.xtb b/chrome/app/resources/generated_resources_uz.xtb index 8ed7d31..45b5be9 100644 --- a/chrome/app/resources/generated_resources_uz.xtb +++ b/chrome/app/resources/generated_resources_uz.xtb
@@ -1741,7 +1741,6 @@ <translation id="2348176352564285430">Ilova: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Ruxsat talabi keldi, javob berish uchun Ctrl + Forward tugmalarini bosing</translation> <translation id="234889437187286781">Maʼlumotlarni yuklashda xatolik yuz berdi</translation> -<translation id="2348939752188770364">Moslashtirilgan maʼlumotlar tozalanmoqda...</translation> <translation id="2349610121459545414">Sayt joylashuvingiz axbortidan foydalanishda davom etaversin</translation> <translation id="2349896577940037438">Agar Kengaytirilgan veb-qidiruv va ilovalar tarixi yoqilsa, bu maʼlumotlar Google hisobingizda saqlanadi. Maʼlumotlaringizni account.google.com orqali koʻrish, oʻchirib tashlash va oʻzgartirish mumkin.</translation> <translation id="2350133097354918058">Qayta ishga tushirildi</translation>
diff --git a/chrome/app/resources/generated_resources_vi.xtb b/chrome/app/resources/generated_resources_vi.xtb index 976fc225..14387c74 100644 --- a/chrome/app/resources/generated_resources_vi.xtb +++ b/chrome/app/resources/generated_resources_vi.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">Ứng dụng: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> – Đã yêu cầu quyền. Hãy nhấn tổ hợp phím Ctrl + Mũi tên tiến để phản hồi</translation> <translation id="234889437187286781">Lỗi khi tải dữ liệu</translation> -<translation id="2348939752188770364">Xoá dữ liệu cá nhân hoá...</translation> <translation id="2349610121459545414">Tiếp tục cho phép trang web này truy cập thông tin vị trí của bạn</translation> <translation id="2349896577940037438">Nếu bạn bật tùy chọn cài đặt Hoạt động trên web và ứng dụng bổ sung, thì dữ liệu này có thể được lưu vào Tài khoản Google của bạn. Bạn có thể xem, xóa dữ liệu và thay đổi các tùy chọn cài đặt tài khoản của mình tại account.google.com.</translation> <translation id="2350133097354918058">Đã tải lại</translation>
diff --git a/chrome/app/resources/generated_resources_zh-CN.xtb b/chrome/app/resources/generated_resources_zh-CN.xtb index 3521907..74a0f49 100644 --- a/chrome/app/resources/generated_resources_zh-CN.xtb +++ b/chrome/app/resources/generated_resources_zh-CN.xtb
@@ -1730,7 +1730,6 @@ <translation id="2348176352564285430">应用:<ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - 收到了权限请求,按 Ctrl + 前进键即可回复</translation> <translation id="234889437187286781">加载数据时出错</translation> -<translation id="2348939752188770364">清除个性化数据…</translation> <translation id="2349610121459545414">继续允许此网站使用您的位置信息</translation> <translation id="2349896577940037438">如果您已开启“其他网络与应用活动记录”设置,这些数据可能会被保存到您的 Google 账号中。您可在 account.google.com 上查看和删除您的数据以及更改您的账号设置。</translation> <translation id="2350133097354918058">已重新加载</translation>
diff --git a/chrome/app/resources/generated_resources_zh-HK.xtb b/chrome/app/resources/generated_resources_zh-HK.xtb index c39d358d..4b92f6f 100644 --- a/chrome/app/resources/generated_resources_zh-HK.xtb +++ b/chrome/app/resources/generated_resources_zh-HK.xtb
@@ -1754,7 +1754,6 @@ <translation id="2348176352564285430">應用程式:<ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - 要求咗權限,㩒 Ctrl + Forward 就可以回覆</translation> <translation id="234889437187286781">載入資料時發生錯誤</translation> -<translation id="2348939752188770364">清除個人化資料…</translation> <translation id="2349610121459545414">繼續允許此網站存取您的位置</translation> <translation id="2349896577940037438">如果您已開啟其他「網絡及應用程式活動記錄」設定,此資料可能會儲存在您的 Google 帳戶中。您可以前往 account.google.com 查看和刪除資料,以及變更帳戶設定。</translation> <translation id="2350133097354918058">已重新載入</translation>
diff --git a/chrome/app/resources/generated_resources_zh-TW.xtb b/chrome/app/resources/generated_resources_zh-TW.xtb index ce857b0d..f54a12c 100644 --- a/chrome/app/resources/generated_resources_zh-TW.xtb +++ b/chrome/app/resources/generated_resources_zh-TW.xtb
@@ -1739,7 +1739,6 @@ <translation id="2348176352564285430">應用程式:<ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - 已要求權限,按下 Ctrl + Forward 鍵即可回覆</translation> <translation id="234889437187286781">載入資料時發生錯誤</translation> -<translation id="2348939752188770364">清除個人化資料...</translation> <translation id="2349610121459545414">繼續允許這個網站存取你的位置資訊</translation> <translation id="2349896577940037438">如果你將「其他網路和應用程式活動」設定為開啟,這些資料可能會儲存在你的 Google 帳戶中。你可以前往 account.google.com 查看、刪除資料,以及變更帳戶設定。</translation> <translation id="2350133097354918058">已重新載入</translation>
diff --git a/chrome/app/resources/generated_resources_zu.xtb b/chrome/app/resources/generated_resources_zu.xtb index ec3009c..31a22b4 100644 --- a/chrome/app/resources/generated_resources_zu.xtb +++ b/chrome/app/resources/generated_resources_zu.xtb
@@ -1755,7 +1755,6 @@ <translation id="2348176352564285430">Uhlelo lokusebenza: <ph name="ARC_PROCESS_NAME" /></translation> <translation id="2348729153658512593"><ph name="WINDOW_TITLE" /> - Imvume iceliwe, cindezela u-Ctrl + Forward ukuze uphendule</translation> <translation id="234889437187286781">Iphutha ekulayisheni idatha</translation> -<translation id="2348939752188770364">Sula idatha yokwenza ngokwezifiso...</translation> <translation id="2349610121459545414">Qhubeka nokuvumela isayithi lifinyelele indawo yakho</translation> <translation id="2349896577940037438">Uma isilungiselelo sakho esingeziwe somsebenzi wewebhu nowohlelo lokusebenza sivuliwe, le datha ingalondolozwa ku-akhawunti yakho ye-Google. Ungabona idatha yakho, uyisuse, futhi ushintshe izilungiselelo ze-akhawunti yakho kwethi account.google.com.</translation> <translation id="2350133097354918058">Kuphinde kwalayishwa</translation>
diff --git a/chrome/app/resources/google_chrome_strings_af.xtb b/chrome/app/resources/google_chrome_strings_af.xtb index dfe6924..1331950 100644 --- a/chrome/app/resources/google_chrome_strings_af.xtb +++ b/chrome/app/resources/google_chrome_strings_af.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Voeg tans by Chrome …</translation> <translation id="345171907106878721">Voeg jouself by Chrome</translation> <translation id="3453763134178591239">Chrome-bedryfstelsel se bepalings</translation> -<translation id="34857402635545079">Vee ook data van Chrome af uit (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome het toegang tot jou ligging nodig om jou ligging met hierdie werf te deel</translation> <translation id="3533694711092285624">Geen gestoorde wagwoorde nie. Chrome kan jou wagwoorde nagaan wanneer jy hulle stoor.</translation> <translation id="3541482654983822893">Chrome kan nie jou wagwoorde nagaan nie. Probeer weer ná 24 uur.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_am.xtb b/chrome/app/resources/google_chrome_strings_am.xtb index 1b411b3..0a3cb76 100644 --- a/chrome/app/resources/google_chrome_strings_am.xtb +++ b/chrome/app/resources/google_chrome_strings_am.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">ወድ Chrome በማከል ላይ...</translation> <translation id="345171907106878721">እራስዎን ወደ Chrome ያክሉ</translation> <translation id="3453763134178591239">የChromeOS ውል</translation> -<translation id="34857402635545079">በተጨማሪ ከ Chrome (<ph name="URL" />) ውሂብን አጽዳ</translation> <translation id="3503306920980160878">Chrome አካባቢዎን ለዚህ ጣቢያ ለማጋራት የአካባቢዎ መዳረሻ ያስፈልገዋል</translation> <translation id="3533694711092285624">ምንም የተቀመጡ የይለፍ ቃላት የሉም። Chrome እርስዎ ሲያስቀምጧቸው የእርስዎን የይለፍ ቃላት መፈተሽ ይችላል።</translation> <translation id="3541482654983822893">Chrome የእርስዎን የይለፍ ቃላት መፈተሽ አይችልም። ከ24 ሰዓቶች በኋላ እንደገና ይሞክሩ።</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ar.xtb b/chrome/app/resources/google_chrome_strings_ar.xtb index a2ad92fe..37f22f3 100644 --- a/chrome/app/resources/google_chrome_strings_ar.xtb +++ b/chrome/app/resources/google_chrome_strings_ar.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">جارٍ الإضافة إلى Chrome...</translation> <translation id="345171907106878721">إضافة نفسك إلى Chrome</translation> <translation id="3453763134178591239">بنود نظام التشغيل Chrome</translation> -<translation id="34857402635545079">محو البيانات من Chrome أيضًا (<ph name="URL" />)</translation> <translation id="3503306920980160878">يحتاج Chrome للوصول إلى موقعك الجغرافي لمشاركته مع الموقع الإلكتروني هذا.</translation> <translation id="3533694711092285624">ما مِن كلمات مرور محفوظة. لا يستطيع متصفّح Chrome التحقّق من كلمات المرور إلا عند حفظها.</translation> <translation id="3541482654983822893">يتعذّر على Chrome التحقُّق من كلمات المرور. يُرجى إعادة المحاولة بعد 24 ساعة.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_as.xtb b/chrome/app/resources/google_chrome_strings_as.xtb index 8d4a965..6320ed6 100644 --- a/chrome/app/resources/google_chrome_strings_as.xtb +++ b/chrome/app/resources/google_chrome_strings_as.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chromeলৈ যোগ কৰি থকা হৈছে...</translation> <translation id="345171907106878721">নিজকে Chromeত যোগ কৰক</translation> <translation id="3453763134178591239">ChromeOSৰ চৰ্তাৱলী</translation> -<translation id="34857402635545079">লগতে Chrome (<ph name="URL" />)ৰ ডেটাও মচক</translation> <translation id="3503306920980160878">এই ছাইটটোৰ সৈতে আপোনাৰ অৱস্থান শ্বেয়াৰ কৰিবলৈ Chromeএ আপোনাৰ অৱস্থান এক্সেছ কৰাটো দৰকাৰ</translation> <translation id="3533694711092285624">ছেভ কৰা কোনো পাছৱৰ্ড নাই। আপুনি আপোনাৰ পাছৱর্ডসমূহ ছেভ কৰিলে Chromeএ সেইবোৰ পৰীক্ষা কৰিব পাৰে।</translation> <translation id="3541482654983822893">Chromeএ আপোনাৰ পাছৱর্ডসমূহ পৰীক্ষা কৰিব নোৱাৰে। ২৪ ঘণ্টাৰ পাছত পুনৰ চেষ্টা কৰক।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_az.xtb b/chrome/app/resources/google_chrome_strings_az.xtb index aa9d9bb..1af12d7 100644 --- a/chrome/app/resources/google_chrome_strings_az.xtb +++ b/chrome/app/resources/google_chrome_strings_az.xtb
@@ -151,7 +151,6 @@ <translation id="3451115285585441894">Chrome'a əlavə olunur...</translation> <translation id="345171907106878721">Özünüzü Chrome'a əlavə edin</translation> <translation id="3453763134178591239">ChromeOS şərtləri</translation> -<translation id="34857402635545079">Chrome'dan datanı silin (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome məkanı bu saytla paylaşmaq üçün məkana giriş tələb edir</translation> <translation id="3533694711092285624">Yadda saxlanmış parol yoxdur. Parollarınızı yadda saxladıqda Chrome onları yoxlaya bilər.</translation> <translation id="3541482654983822893">Chrome parollarınızı yoxlaya bilmir. 24 saatdan sonra yenidən cəhd edin.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_be.xtb b/chrome/app/resources/google_chrome_strings_be.xtb index abe8710..e460127 100644 --- a/chrome/app/resources/google_chrome_strings_be.xtb +++ b/chrome/app/resources/google_chrome_strings_be.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Ідзе дадаванне ў Chrome...</translation> <translation id="345171907106878721">Дадаць мяне ў Chrome</translation> <translation id="3453763134178591239">Умовы выкарыстання Chrome OS</translation> -<translation id="34857402635545079">Таксама выдаліць даныя з Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome патрабуе доступу да вашага месцазнаходжання, каб абагуліць яго з гэтым сайтам</translation> <translation id="3533694711092285624">Няма захаваных пароляў. Chrome можа правяраць толькі захаваныя паролі.</translation> <translation id="3541482654983822893">Браўзеру Chrome не ўдаецца праверыць паролі. Паўтарыце спробу праз 24 гадзіны.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bg.xtb b/chrome/app/resources/google_chrome_strings_bg.xtb index d9d5f74..b39c263 100644 --- a/chrome/app/resources/google_chrome_strings_bg.xtb +++ b/chrome/app/resources/google_chrome_strings_bg.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">Добавя се към Chrome...</translation> <translation id="345171907106878721">Добавяне на вас към Chrome</translation> <translation id="3453763134178591239">Общи условия на Chrome OS</translation> -<translation id="34857402635545079">Да се изчистят и данните от Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome се нуждае от достъп до данните за местоположението ви, за да ги сподели с този сайт</translation> <translation id="3533694711092285624">Няма запазени пароли. Chrome може да проверява паролите ви, когато ги запазите.</translation> <translation id="3541482654983822893">Chrome не може да провери паролите ви. Опитайте отново след 24 часа.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bn.xtb b/chrome/app/resources/google_chrome_strings_bn.xtb index cf0fdd15..aedc76d 100644 --- a/chrome/app/resources/google_chrome_strings_bn.xtb +++ b/chrome/app/resources/google_chrome_strings_bn.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">Chrome-এ জোড়া হচ্ছে...</translation> <translation id="345171907106878721">Chrome এর সাথে নিজেকে যোগ করুন</translation> <translation id="3453763134178591239">ChromeOS-এর শর্তাবলী</translation> -<translation id="34857402635545079">এছাড়া, Chrome থেকেও ডেটা সরান (<ph name="URL" />)</translation> <translation id="3503306920980160878">এই সাইটটির সাথে আপনার লোকেশন শেয়ার করার জন্য Chrome কে আপনার লোকেশনের তথ্যে অ্যাক্সেস দিতে হবে</translation> <translation id="3533694711092285624">কোনও পাসওয়ার্ড সেভ করা নেই। আপনি পাসওয়ার্ড সেভ করলে Chrome সেটি চেক করতে পারবে।</translation> <translation id="3541482654983822893">Chrome আপনার পাসওয়ার্ড চেক করতে পারছে না। ২৪ ঘণ্টা পরে আবার চেষ্টা করুন।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_bs.xtb b/chrome/app/resources/google_chrome_strings_bs.xtb index f7d6f983..0eb1c2a 100644 --- a/chrome/app/resources/google_chrome_strings_bs.xtb +++ b/chrome/app/resources/google_chrome_strings_bs.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Dodavanje u Chrome...</translation> <translation id="345171907106878721">Dodajte sebe na Chrome</translation> <translation id="3453763134178591239">Uslovi korištenja ChromeOS-a</translation> -<translation id="34857402635545079">Obrišite podatke i s Chromea (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome traži pristup vašoj lokaciji da bi je podijelio s ovom web lokacijom.</translation> <translation id="3533694711092285624">Nema sačuvanih lozinki. Chrome može provjeravati vaše lozinke kada ih sačuvate.</translation> <translation id="3541482654983822893">Chrome ne može provjeravati vaše lozinke. Pokušajte ponovo za 24 sata.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ca.xtb b/chrome/app/resources/google_chrome_strings_ca.xtb index a9bfad48..98bcddb 100644 --- a/chrome/app/resources/google_chrome_strings_ca.xtb +++ b/chrome/app/resources/google_chrome_strings_ca.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">S'està afegint a Chrome...</translation> <translation id="345171907106878721">Afegeix-me a Chrome</translation> <translation id="3453763134178591239">Condicions de Chrome OS</translation> -<translation id="34857402635545079">Esborra també les dades de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome necessita accedir a la teva ubicació per compartir-la amb aquest lloc web</translation> <translation id="3533694711092285624">No hi ha cap contrasenya desada. Chrome pot comprovar les teves contrasenyes quan les deses.</translation> <translation id="3541482654983822893">Chrome no pot comprovar les teves contrasenyes. Torna-ho a provar al cap de 24 hores.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cs.xtb b/chrome/app/resources/google_chrome_strings_cs.xtb index c8bf51a..0631d11 100644 --- a/chrome/app/resources/google_chrome_strings_cs.xtb +++ b/chrome/app/resources/google_chrome_strings_cs.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Přidává se do prohlížeče Chrome...</translation> <translation id="345171907106878721">Přidejte do Chromu svůj účet</translation> <translation id="3453763134178591239">Smluvní podmínky systému ChromeOS</translation> -<translation id="34857402635545079">Vymazat také data z Chromu (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome potřebuje přístup k vaší poloze, aby ji mohl sdílet s tímto webem</translation> <translation id="3533694711092285624">Nemáte žádná uložená hesla. Chrome může hesla zkontrolovat, pouze když si je uložíte.</translation> <translation id="3541482654983822893">Chrome nemůže zkontrolovat vaše hesla. Zkuste to znovu za 24 hodin.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_cy.xtb b/chrome/app/resources/google_chrome_strings_cy.xtb index 3a2d158e..2ed37d1f 100644 --- a/chrome/app/resources/google_chrome_strings_cy.xtb +++ b/chrome/app/resources/google_chrome_strings_cy.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Wrthi'n ychwanegu at Chrome...</translation> <translation id="345171907106878721">Ychwanegu eich hun i Chrome</translation> <translation id="3453763134178591239">Telerau ChromeOS</translation> -<translation id="34857402635545079">Clirio data o Chrome hefyd (<ph name="URL" />)</translation> <translation id="3503306920980160878">Mae angen mynediad at eich lleoliad ar Chrome i rannu'ch lleoliad gyda'r wefan hon</translation> <translation id="3533694711092285624">Nid oes unrhyw gyfrineiriau sydd wedi'u cadw. Gall Chrome wirio'ch cyfrineiriau pan fyddwch yn eu cadw.</translation> <translation id="3541482654983822893">Ni all Chrome wirio'ch cyfrineiriau. Rhowch gynnig arall arni ar ôl 24 awr.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_da.xtb b/chrome/app/resources/google_chrome_strings_da.xtb index 034e7e0..a46dd5f 100644 --- a/chrome/app/resources/google_chrome_strings_da.xtb +++ b/chrome/app/resources/google_chrome_strings_da.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Føjer til Chrome...</translation> <translation id="345171907106878721">Tilføj dig selv i Chrome</translation> <translation id="3453763134178591239">Vilkår for ChromeOS</translation> -<translation id="34857402635545079">Ryd også data fra Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome skal have adgang til din lokation for at dele din lokation med dette website</translation> <translation id="3533694711092285624">Der er ingen gemte adgangskoder. Chrome kan tjekke dine adgangskoder, når du gemmer dem.</translation> <translation id="3541482654983822893">Chrome kan ikke tjekke dine adgangskoder. Prøv igen efter 24 timer.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_de.xtb b/chrome/app/resources/google_chrome_strings_de.xtb index 996f338..3dc0af8c3 100644 --- a/chrome/app/resources/google_chrome_strings_de.xtb +++ b/chrome/app/resources/google_chrome_strings_de.xtb
@@ -147,7 +147,6 @@ <translation id="3451115285585441894">Wird zu Chrome hinzugefügt...</translation> <translation id="345171907106878721">Mich zu Chrome hinzufügen</translation> <translation id="3453763134178591239">Chrome OS-Nutzungsbedingungen</translation> -<translation id="34857402635545079">Daten aus Chrome ebenfalls löschen (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome benötigt Zugriff auf deinen Standort, um ihn mit dieser Website zu teilen</translation> <translation id="3533694711092285624">Keine gespeicherten Passwörter. Chrome kann deine Passwörter prüfen, wenn du sie speicherst.</translation> <translation id="3541482654983822893">Chrome kann deine Passwörter nicht prüfen. Bitte versuche es in 24 Stunden noch einmal.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_el.xtb b/chrome/app/resources/google_chrome_strings_el.xtb index 5b57785..e6696407 100644 --- a/chrome/app/resources/google_chrome_strings_el.xtb +++ b/chrome/app/resources/google_chrome_strings_el.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">Προσθήκη στο Chrome...</translation> <translation id="345171907106878721">Προσθήκη του εαυτού σας στο Chrome</translation> <translation id="3453763134178591239">Όροι Chrome OS</translation> -<translation id="34857402635545079">Να διαγραφούν επίσης δεδομένα από το (<ph name="URL" />)</translation> <translation id="3503306920980160878">Το Chrome χρειάζεται πρόσβαση στην τοποθεσία σας, για να την κοινοποιήσει σε αυτόν τον ιστότοπο</translation> <translation id="3533694711092285624">Δεν υπάρχουν αποθηκευμένοι κωδικοί πρόσβασης. Το Chrome μπορεί να ελέγξει τους κωδικούς πρόσβασής σας όταν τους αποθηκεύσετε.</translation> <translation id="3541482654983822893">Το Chrome δεν μπορεί να ελέγξει τους κωδικούς πρόσβασής σας. Δοκιμάστε ξανά σε 24 ώρες.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_en-GB.xtb b/chrome/app/resources/google_chrome_strings_en-GB.xtb index 5553eb5..80b43c4 100644 --- a/chrome/app/resources/google_chrome_strings_en-GB.xtb +++ b/chrome/app/resources/google_chrome_strings_en-GB.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Adding to Chrome...</translation> <translation id="345171907106878721">Add yourself to Chrome</translation> <translation id="3453763134178591239">Chrome OS terms</translation> -<translation id="34857402635545079">Also clear data from Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome needs access to your location to share your location with this site</translation> <translation id="3533694711092285624">No saved passwords. Chrome can check your passwords when you save them.</translation> <translation id="3541482654983822893">Chrome can't check your passwords. Try again after 24 hours.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es-419.xtb b/chrome/app/resources/google_chrome_strings_es-419.xtb index 6cbd333..f5fd0543 100644 --- a/chrome/app/resources/google_chrome_strings_es-419.xtb +++ b/chrome/app/resources/google_chrome_strings_es-419.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Agregando a Chrome...</translation> <translation id="345171907106878721">Agrégate a Chrome</translation> <translation id="3453763134178591239">Condiciones del ChromeOS</translation> -<translation id="34857402635545079">Borrar también datos de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome necesita acceder a tu ubicación para compartirla con este sitio</translation> <translation id="3533694711092285624">No hay contraseñas guardadas. Chrome puede revisar las contraseñas cuando las guardas.</translation> <translation id="3541482654983822893">Chrome no puede revisar las contraseñas. Vuelve a intentarlo después de 24 horas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_es.xtb b/chrome/app/resources/google_chrome_strings_es.xtb index 0130631..0846b8d 100644 --- a/chrome/app/resources/google_chrome_strings_es.xtb +++ b/chrome/app/resources/google_chrome_strings_es.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Añadiendo a Chrome...</translation> <translation id="345171907106878721">Añadirte a Chrome</translation> <translation id="3453763134178591239">Términos de ChromeOS</translation> -<translation id="34857402635545079">Borrar también los datos de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome necesita acceder a tu ubicación para compartirla con este sitio web</translation> <translation id="3533694711092285624">No hay ninguna contraseña guardada. Chrome puede comprobar tus contraseñas cuando las guardas.</translation> <translation id="3541482654983822893">Chrome no puede comprobar tus contraseñas. Vuelve a intentarlo en 24 horas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_et.xtb b/chrome/app/resources/google_chrome_strings_et.xtb index 1a5caff..1cb9be5 100644 --- a/chrome/app/resources/google_chrome_strings_et.xtb +++ b/chrome/app/resources/google_chrome_strings_et.xtb
@@ -151,7 +151,6 @@ <translation id="3451115285585441894">Chrome'i lisamine ...</translation> <translation id="345171907106878721">Lisa Chrome'i</translation> <translation id="3453763134178591239">Chrome OS-i tingimused</translation> -<translation id="34857402635545079">Kustuta andmed ka Chrome'ist (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome vajab juurdepääsu teie asukohale, et seda selle saidiga jagada</translation> <translation id="3533694711092285624">Salvestatud paroole ei ole. Chrome saab teie paroole kontrollida, kui olete need salvestanud.</translation> <translation id="3541482654983822893">Chrome ei saa teie paroole kontrollida. Proovige uuesti 24 tunni pärast.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_eu.xtb b/chrome/app/resources/google_chrome_strings_eu.xtb index 5942b774..579f5d6 100644 --- a/chrome/app/resources/google_chrome_strings_eu.xtb +++ b/chrome/app/resources/google_chrome_strings_eu.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Chrome-n gehitzen…</translation> <translation id="345171907106878721">Gehitu zeure burua Chrome-n</translation> <translation id="3453763134178591239">Chrome OS-ren baldintzak</translation> -<translation id="34857402635545079">Halaber, garbitu Chrome-ko datuak (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome-k zure kokapena webgune honekin partekatzeko baimena behar du</translation> <translation id="3533694711092285624">Ez dago pasahitzik gordeta. Chrome-k pasahitzak egiazta ditzake gorde ondoren.</translation> <translation id="3541482654983822893">Chrome-k ezin ditu egiaztatu pasahitzak. Saiatu berriro 24 ordu barru.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fa.xtb b/chrome/app/resources/google_chrome_strings_fa.xtb index 3ea73ff..f75c63c 100644 --- a/chrome/app/resources/google_chrome_strings_fa.xtb +++ b/chrome/app/resources/google_chrome_strings_fa.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">افزودن به Chrome...</translation> <translation id="345171907106878721">افرودن خودتان به Chrome</translation> <translation id="3453763134178591239">شرایط ChromeOS</translation> -<translation id="34857402635545079">همچنین دادهها از Chrome پاک شود (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome برای همرسانی مکانتان با این سایت باید به مکان شما دسترسی داشته باشد</translation> <translation id="3533694711092285624">گذرواژه ذخیرهشدهای وجود ندارد. Chrome زمانی میتواند گذرواژههایتان را بررسی کند که آنها را ذخیره کرده باشید.</translation> <translation id="3541482654983822893">Chrome نمیتواند گذرواژههایتان را بررسی کند. بعد از ۲۴ ساعت دوباره امتحان کنید.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fi.xtb b/chrome/app/resources/google_chrome_strings_fi.xtb index 762e989..28b79af9 100644 --- a/chrome/app/resources/google_chrome_strings_fi.xtb +++ b/chrome/app/resources/google_chrome_strings_fi.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Lisätään Chromeen...</translation> <translation id="345171907106878721">Lisää itsesi Chromeen</translation> <translation id="3453763134178591239">Chrome-käyttöjärjestelmän käyttöehdot</translation> -<translation id="34857402635545079">Poista data myös Chromesta (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome tarvitsee oikeuden käyttää sijaintiasi, jotta se voidaan jakaa tämän sivuston kanssa.</translation> <translation id="3533694711092285624">Ei tallennettuja salasanoja. Chrome voi tarkistaa salasanasi, kun tallennat niitä.</translation> <translation id="3541482654983822893">Chrome ei voi tarkistaa salasanojasi. Yritä uudelleen 24 tunnin päästä.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fil.xtb b/chrome/app/resources/google_chrome_strings_fil.xtb index 6e2b3bc..f326261 100644 --- a/chrome/app/resources/google_chrome_strings_fil.xtb +++ b/chrome/app/resources/google_chrome_strings_fil.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Idinaragdag sa Chrome...</translation> <translation id="345171907106878721">Idagdag ang iyong sarili sa Chrome</translation> <translation id="3453763134178591239">Mga tuntunin ng ChromeOS</translation> -<translation id="34857402635545079">I-clear din ang data sa Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Kailangan ng Chrome ng access sa iyong lokasyon upang ibahagi ang lokasyon mo sa site na ito</translation> <translation id="3533694711092285624">Walang naka-save na password. Masusuri ng Chrome ang iyong mga password kapag na-save mo ang mga ito.</translation> <translation id="3541482654983822893">Hindi masuri ng Chrome ang iyong mga password. Subukan ulit pagkalipas ng 24 na oras.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr-CA.xtb b/chrome/app/resources/google_chrome_strings_fr-CA.xtb index 06a9773..c19f6d2 100644 --- a/chrome/app/resources/google_chrome_strings_fr-CA.xtb +++ b/chrome/app/resources/google_chrome_strings_fr-CA.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Ajout à Google Chrome en cours…</translation> <translation id="345171907106878721">Ajouter un utilisateur à Google Chrome</translation> <translation id="3453763134178591239">Conditions d'utilisation de Chrome OS</translation> -<translation id="34857402635545079">Effacer également les données dans Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome a besoin d'accéder à votre position afin de la partager avec ce site</translation> <translation id="3533694711092285624">Aucun mot de passe enregistré. Chrome ne peut vérifier vos mots de passe que si vous les enregistrez.</translation> <translation id="3541482654983822893">Chrome ne peut pas vérifier vos mots de passe. Réessayez dans 24 heures.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_fr.xtb b/chrome/app/resources/google_chrome_strings_fr.xtb index 070af5e..0bd96b7 100644 --- a/chrome/app/resources/google_chrome_strings_fr.xtb +++ b/chrome/app/resources/google_chrome_strings_fr.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Ajout à Google Chrome en cours…</translation> <translation id="345171907106878721">Ajouter un utilisateur à Chrome</translation> <translation id="3453763134178591239">Conditions d'utilisation de Chrome OS</translation> -<translation id="34857402635545079">Effacer également les données issues de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome a besoin d'accéder à votre position pour la partager avec ce site</translation> <translation id="3533694711092285624">Aucun mot de passe enregistré. Chrome ne peut vérifier vos mots de passe que si vous les enregistrez.</translation> <translation id="3541482654983822893">Chrome ne parvient pas à vérifier vos mots de passe. Réessayez dans 24 heures.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gl.xtb b/chrome/app/resources/google_chrome_strings_gl.xtb index b526fe3..0d4840c 100644 --- a/chrome/app/resources/google_chrome_strings_gl.xtb +++ b/chrome/app/resources/google_chrome_strings_gl.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Engadindo a Chrome...</translation> <translation id="345171907106878721">Engádete a Chrome</translation> <translation id="3453763134178591239">Condicións de Chrome OS</translation> -<translation id="34857402635545079">Borrar tamén os datos de Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome necesita acceder á túa localización para compartila con este sitio</translation> <translation id="3533694711092285624">Non hai contrasinais gardados. Chrome pode comprobar os teus contrasinais cando os gardes.</translation> <translation id="3541482654983822893">Chrome non puido comprobar os teus contrasinais. Téntao de novo dentro de 24 horas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_gu.xtb b/chrome/app/resources/google_chrome_strings_gu.xtb index 75641f9..9ddb4536 100644 --- a/chrome/app/resources/google_chrome_strings_gu.xtb +++ b/chrome/app/resources/google_chrome_strings_gu.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome માં ઉમેરી રહ્યું છે...</translation> <translation id="345171907106878721">સ્વયંને Chrome માં ઉમેરો</translation> <translation id="3453763134178591239">ChromeOSની શરતો</translation> -<translation id="34857402635545079">Chromeમાંથી પણ ડેટા કાઢી નાખો (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chromeને આ સાઇટ સાથે તમારું સ્થાન શેર કરવા માટે તમારા સ્થાનના ઍક્સેસની જરૂર પડે છે</translation> <translation id="3533694711092285624">કોઈ સાચવેલો પાસવર્ડ નથી. જ્યારે તમે તમારા પાસવર્ડ સાચવો ત્યારે Chrome તેને ચેક કરી શકે છે.</translation> <translation id="3541482654983822893">Chrome તમારા પાસવર્ડ ચેક કરી શકતું નથી. 24 કલાક પછી ફરી પ્રયાસ કરો.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hi.xtb b/chrome/app/resources/google_chrome_strings_hi.xtb index a106c18e..cdb1ee4 100644 --- a/chrome/app/resources/google_chrome_strings_hi.xtb +++ b/chrome/app/resources/google_chrome_strings_hi.xtb
@@ -147,7 +147,6 @@ <translation id="3451115285585441894">Chrome में जोड़ा जा रहा है...</translation> <translation id="345171907106878721">स्वयं को Chrome में जोड़ें</translation> <translation id="3453763134178591239">ChromeOS शर्तें</translation> -<translation id="34857402635545079">साथ ही, Chrome (<ph name="URL" />) का डेटा साफ़ करें</translation> <translation id="3503306920980160878">इस साइट से आपकी जगह की जानकारी शेयर करने के लिए Chrome को आपकी जगह की जानकारी का एक्सेस चाहिए</translation> <translation id="3533694711092285624">सेव किया हुआ कोई भी पासवर्ड नहीं है. Chrome आपके पासवर्ड की जांच तब कर सकता है, जब आप उन्हें सेव करें.</translation> <translation id="3541482654983822893">Chrome आपके पासवर्ड की जांच नहीं कर सकता. 24 घंटे बाद कोशिश करें.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hr.xtb b/chrome/app/resources/google_chrome_strings_hr.xtb index 0d58c0b..07af891 100644 --- a/chrome/app/resources/google_chrome_strings_hr.xtb +++ b/chrome/app/resources/google_chrome_strings_hr.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Dodavanje u Chrome...</translation> <translation id="345171907106878721">Dodajte sebe kao korisnika Chromea</translation> <translation id="3453763134178591239">Uvjeti za Chrome OS</translation> -<translation id="34857402635545079">Izbriši i podatke s Chromea (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome treba dopuštenje za pristup vašoj lokaciji da bi je podijelio s ovom web-lokacijom</translation> <translation id="3533694711092285624">Nema nijedne spremljene zaporke. Chrome može provjeriti vaše zaporke kad ih spremite.</translation> <translation id="3541482654983822893">Chrome ne može provjeriti vaše zaporke. Pokušajte ponovno nakon 24 sata.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hu.xtb b/chrome/app/resources/google_chrome_strings_hu.xtb index 0734df8..85335c5 100644 --- a/chrome/app/resources/google_chrome_strings_hu.xtb +++ b/chrome/app/resources/google_chrome_strings_hu.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Hozzáadás a Chrome-hoz...</translation> <translation id="345171907106878721">Adja hozzá magát a Chrome-ban</translation> <translation id="3453763134178591239">ChromeOS – Szerződési Feltételek</translation> -<translation id="34857402635545079">Az adatokat is törölje a Chrome-ból (<ph name="URL" />)</translation> <translation id="3503306920980160878">A Chrome-nak a helyadatokhoz való hozzáférésre van szüksége ahhoz, hogy megoszthassa a webhellyel az Ön tartózkodási helyét</translation> <translation id="3533694711092285624">Nincsenek mentett jelszavak. A Chrome képes a jelszavak ellenőrzésére, amikor Ön menti őket.</translation> <translation id="3541482654983822893">A Chrome nem tudja ellenőrizni a jelszavait. Próbálja újra 24 óra múlva.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_hy.xtb b/chrome/app/resources/google_chrome_strings_hy.xtb index 40e1e37..ff054a8 100644 --- a/chrome/app/resources/google_chrome_strings_hy.xtb +++ b/chrome/app/resources/google_chrome_strings_hy.xtb
@@ -151,7 +151,6 @@ <translation id="3451115285585441894">Ավելացվում է Chrome-ին…</translation> <translation id="345171907106878721">Ավելացնել Chrome-ի օգտատիրոջ</translation> <translation id="3453763134178591239">ChromeOS-ի օգտագործման պայմաններ</translation> -<translation id="34857402635545079">Մաքրել նաև Chrome-ի տվյալները (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome-ին այս կայքի համար անհրաժեշտ է ձեզ տեղորոշելու թույլտվություն</translation> <translation id="3533694711092285624">Պահված գաղտնաբառեր չկան։ Chrome-ը կարող է ստուգել ձեր գաղտնաբառերը, երբ պահում եք դրանք։</translation> <translation id="3541482654983822893">Chrome-ը չի կարող ստուգել ձեր գաղտնաբառերը։ 24 ժամ հետո նորից փորձեք։</translation>
diff --git a/chrome/app/resources/google_chrome_strings_id.xtb b/chrome/app/resources/google_chrome_strings_id.xtb index 6a5b432f..78008ef 100644 --- a/chrome/app/resources/google_chrome_strings_id.xtb +++ b/chrome/app/resources/google_chrome_strings_id.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Menambahkan ke Chrome...</translation> <translation id="345171907106878721">Tambahkan diri Anda ke Chrome</translation> <translation id="3453763134178591239">Persyaratan ChromeOS</translation> -<translation id="34857402635545079">Hapus juga data dari Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome memerlukan akses ke lokasi Anda untuk berbagi lokasi dengan situs ini</translation> <translation id="3533694711092285624">Tidak ada sandi yang tersimpan. Chrome dapat memeriksa sandi Anda saat menyimpannya.</translation> <translation id="3541482654983822893">Chrome tidak dapat memeriksa sandi Anda. Coba lagi setelah 24 jam.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_is.xtb b/chrome/app/resources/google_chrome_strings_is.xtb index bb2b64d..f06bb76f 100644 --- a/chrome/app/resources/google_chrome_strings_is.xtb +++ b/chrome/app/resources/google_chrome_strings_is.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Bætir við Chrome...</translation> <translation id="345171907106878721">Bættu þér við Chrome</translation> <translation id="3453763134178591239">Skilmálar ChromeOS</translation> -<translation id="34857402635545079">Hreinsa líka gögn úr Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome þarf staðsetningaraðgang til að deila staðsetningu þinni með þessu vefsvæði</translation> <translation id="3533694711092285624">Engin vistuð aðgangsorð. Chrome getur athugað aðgangsorðin þín þegar þú vistar þau.</translation> <translation id="3541482654983822893">Chrome getur ekki athugað aðgangsorðin þín. Reyndu aftur eftir sólarhring.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_it.xtb b/chrome/app/resources/google_chrome_strings_it.xtb index 10bdc16..811d8cc 100644 --- a/chrome/app/resources/google_chrome_strings_it.xtb +++ b/chrome/app/resources/google_chrome_strings_it.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Aggiunta a Chrome in corso...</translation> <translation id="345171907106878721">Aggiungiti a Chrome</translation> <translation id="3453763134178591239">Termini di ChromeOS</translation> -<translation id="34857402635545079">Cancella anche i dati di Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome deve poter accedere alla tua posizione per condividerla con questo sito</translation> <translation id="3533694711092285624">Nessuna password salvata. Chrome può controllare le password quando le salvi.</translation> <translation id="3541482654983822893">Chrome non può controllare le tue password. Riprova tra 24 ore.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_iw.xtb b/chrome/app/resources/google_chrome_strings_iw.xtb index 871cd53..7f89b57 100644 --- a/chrome/app/resources/google_chrome_strings_iw.xtb +++ b/chrome/app/resources/google_chrome_strings_iw.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">הוספה ל-Chrome...</translation> <translation id="345171907106878721">הוספת עצמך ל-Chrome</translation> <translation id="3453763134178591239">התנאים של ChromeOS</translation> -<translation id="34857402635545079">ניקוי נתונים גם מ-Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome זקוק לגישה למיקום שלך כדי לשתף אותו עם האתר הזה</translation> <translation id="3533694711092285624">אין סיסמאות שמורות. Chrome יכול לבדוק את הסיסמאות שלך רק אם שמרת אותן.</translation> <translation id="3541482654983822893">Chrome לא יכול לבדוק את הסיסמאות שלך. יש לנסות שוב בעוד 24 שעות.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ja.xtb b/chrome/app/resources/google_chrome_strings_ja.xtb index c2fc80d..1f64182e 100644 --- a/chrome/app/resources/google_chrome_strings_ja.xtb +++ b/chrome/app/resources/google_chrome_strings_ja.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Chrome に追加...</translation> <translation id="345171907106878721">Chrome に自分を追加</translation> <translation id="3453763134178591239">Chrome OS 利用規約</translation> -<translation id="34857402635545079">Chrome のデータ(<ph name="URL" />)も消去する</translation> <translation id="3503306920980160878">このサイトで現在地を共有するには、Chrome で位置情報の使用を許可する必要があります</translation> <translation id="3533694711092285624">保存されているパスワードがありません。パスワードを保存すると Chrome で確認できるようになります。</translation> <translation id="3541482654983822893">Chrome でパスワードを確認できません。24 時間後にもう一度お試しください。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ka.xtb b/chrome/app/resources/google_chrome_strings_ka.xtb index ccfae62..ab1b4bee 100644 --- a/chrome/app/resources/google_chrome_strings_ka.xtb +++ b/chrome/app/resources/google_chrome_strings_ka.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Chrome-ში დამატება…</translation> <translation id="345171907106878721">საკუთარი თავის დამატება Chrome-ში</translation> <translation id="3453763134178591239">ChromeOS პირობები</translation> -<translation id="34857402635545079">მონაცემების Chrome-იდანაც გასუფთავება (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome საჭიროებს თქვენს მდებარეობაზე წვდომის ნებართვას ამ საიტისთვის გასაზიარებლად</translation> <translation id="3533694711092285624">შენახული პაროლები არ არის. პაროლების შემოწმებას Chrome მოახერხებს მათი შენახვის შემდეგ.</translation> <translation id="3541482654983822893">Chrome ვერ ახერხებს პაროლების შემოწმებას. ცადეთ 24 საათში.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kk.xtb b/chrome/app/resources/google_chrome_strings_kk.xtb index 7b9ee65c..e502f414 100644 --- a/chrome/app/resources/google_chrome_strings_kk.xtb +++ b/chrome/app/resources/google_chrome_strings_kk.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Chrome жүйесіне қосылуда…</translation> <translation id="345171907106878721">Chrome жүйесіне өзіңізді қосу</translation> <translation id="3453763134178591239">ChromeOS шарттары</translation> -<translation id="34857402635545079">Chrome браузеріндегі деректер де өшірілсін (<ph name="URL" />)</translation> <translation id="3503306920980160878">Бұл сайтқа көрсету үшін Chrome браузері орналасқан жеріңізді білуі керек</translation> <translation id="3533694711092285624">Ешқандай құпия сөз сақталмаған. Құпия сөздер сақталған кезде, Chrome оларды тексере алады.</translation> <translation id="3541482654983822893">Chrome сіздің құпия сөздеріңізді тексере алмай жатыр. 24 сағаттан кейін қайталап көріңіз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_km.xtb b/chrome/app/resources/google_chrome_strings_km.xtb index 71f6661..a968ed0 100644 --- a/chrome/app/resources/google_chrome_strings_km.xtb +++ b/chrome/app/resources/google_chrome_strings_km.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">កំពុងបន្ថែមទៅ Chrome...</translation> <translation id="345171907106878721">បន្ថែមខ្លួនអ្នកទៅ Chrome</translation> <translation id="3453763134178591239">លក្ខខណ្ឌ ChromeOS</translation> -<translation id="34857402635545079">សម្អាតទិន្នន័យពី Chrome (<ph name="URL" />) ផងដែរ</translation> <translation id="3503306920980160878">Chrome ត្រូវការសិទ្ធិចូលប្រើទីតាំងរបស់អ្នក ដើម្បីចែករំលែកទីតាំងរបស់អ្នកជាមួយទំព័រនេះ</translation> <translation id="3533694711092285624">គ្មានពាក្យសម្ងាត់ដែលបានរក្សាទុកទេ។ Chrome អាចពិនិត្យពាក្យសម្ងាត់របស់អ្នក នៅពេលអ្នករក្សាទុកពាក្យសម្ងាត់ទាំងនោះ។</translation> <translation id="3541482654983822893">Chrome មិនអាចពិនិត្យពាក្យសម្ងាត់របស់អ្នកបានទេ។ សូមព្យាយាមម្ដងទៀតក្រោយរយៈពេល 24 ម៉ោង។</translation>
diff --git a/chrome/app/resources/google_chrome_strings_kn.xtb b/chrome/app/resources/google_chrome_strings_kn.xtb index 7669281..149f55f 100644 --- a/chrome/app/resources/google_chrome_strings_kn.xtb +++ b/chrome/app/resources/google_chrome_strings_kn.xtb
@@ -151,7 +151,6 @@ <translation id="3451115285585441894">Chrome ಗೆ ಸೇರಿಸಲಾಗುತ್ತಿದೆ...</translation> <translation id="345171907106878721">ನಿಮ್ಮನ್ನು Chrome ಗೆ ಸೇರಿಸಿಕೊಳ್ಳಿ</translation> <translation id="3453763134178591239">ChromeOS ನಿಯಮಗಳು</translation> -<translation id="34857402635545079">Chrome ನಿಂದಲೂ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ (<ph name="URL" />)</translation> <translation id="3503306920980160878">ಈ ಸೈಟ್ ಜೊತೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಹಂಚಿಕೊಳ್ಳಲು Chrome ಗೆ ನಿಮ್ಮ ಸ್ಥಳವನ್ನು ಪ್ರವೇಶಿಸುವ ಅಗತ್ಯವಿದೆ</translation> <translation id="3533694711092285624">ಉಳಿಸಿರುವ ಯಾವುದೇ ಪಾಸ್ವರ್ಡ್ಗಳಿಲ್ಲ. ನೀವು ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಉಳಿಸಿದಾಗ, Chrome ಅವುಗಳನ್ನು ಪರಿಶೀಲಿಸಬಹುದು.</translation> <translation id="3541482654983822893">Chrome ಗೆ ನಿಮ್ಮ ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. 24 ಗಂಟೆಗಳ ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ko.xtb b/chrome/app/resources/google_chrome_strings_ko.xtb index 8eb88b8..20871ac 100644 --- a/chrome/app/resources/google_chrome_strings_ko.xtb +++ b/chrome/app/resources/google_chrome_strings_ko.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome에 추가하는 중...</translation> <translation id="345171907106878721">Chrome에 본인 추가</translation> <translation id="3453763134178591239">ChromeOS 약관</translation> -<translation id="34857402635545079">Chrome(<ph name="URL" />)에서도 데이터 삭제</translation> <translation id="3503306920980160878">이 사이트와 위치를 공유하려면 Chrome에 내 위치 액세스 권한이 있어야 합니다</translation> <translation id="3533694711092285624">저장된 비밀번호가 없습니다. 비밀번호를 저장하면 Chrome에서 확인할 수 있습니다.</translation> <translation id="3541482654983822893">Chrome에서 비밀번호를 확인할 수 없습니다. 24시간 후 다시 시도해 보세요.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ky.xtb b/chrome/app/resources/google_chrome_strings_ky.xtb index 38434fd9..06e128f 100644 --- a/chrome/app/resources/google_chrome_strings_ky.xtb +++ b/chrome/app/resources/google_chrome_strings_ky.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome'го кошулууда…</translation> <translation id="345171907106878721">Өзүңүздү Chrome'го кошуңуз</translation> <translation id="3453763134178591239">ChromeOS шарттары</translation> -<translation id="34857402635545079">Chrome'догу дайындар да тазалансын (<ph name="URL" />)</translation> <translation id="3503306920980160878">Бул сайт менен бөлүшүү үчүн Chrome жайгашкан жериңиз тууралуу маалыматты алышы керек</translation> <translation id="3533694711092285624">Сакталган сырсөздөр жок. Сырсөздөрүңүздү сактаганда Chrome аларды текшере алат.</translation> <translation id="3541482654983822893">Chrome сырсөздөрүңүздү текшере албай жатат. 24 сааттан кийин кайра аракет кылыңыз.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lo.xtb b/chrome/app/resources/google_chrome_strings_lo.xtb index 6d809a8..1e1d8be 100644 --- a/chrome/app/resources/google_chrome_strings_lo.xtb +++ b/chrome/app/resources/google_chrome_strings_lo.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">ກໍາລັງເພີ່ມໃສ່ Chrome...</translation> <translation id="345171907106878721">ເພີ່ມທ່ານເອງໃສ່ Chrome</translation> <translation id="3453763134178591239">ຂໍ້ກຳນົດ ChromeOS</translation> -<translation id="34857402635545079">ລຶບລ້າງຂໍ້ມູນຈາກ Chrome (<ph name="URL" />) ນຳອີກ</translation> <translation id="3503306920980160878">Chrome ຕ້ອງການເຂົ້າເຖິງສະຖານທີ່ຂອງທ່ານເພື່ອແບ່ງປັນສະຖານທີ່ຂອງທ່ານກັບເວັບໄຊນີ້</translation> <translation id="3533694711092285624">ບໍ່ມີລະຫັດຜ່ານທີ່ບັນທຶກໄວ້. Chrome ສາມາດກວດເບິ່ງລະຫັດຜ່ານຂອງທ່ານເມື່ອທ່ານບັນທຶກພວກມັນໄວ້.</translation> <translation id="3541482654983822893">Chrome ບໍ່ສາມາດກວດລະຫັດຜ່ານຂອງທ່ານໄດ້. ກະລຸນາລອງໃໝ່ຫຼັງຈາກ 24 ຊົ່ວໂມງ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lt.xtb b/chrome/app/resources/google_chrome_strings_lt.xtb index d31ed6c..c19e280 100644 --- a/chrome/app/resources/google_chrome_strings_lt.xtb +++ b/chrome/app/resources/google_chrome_strings_lt.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Pridedama prie „Chrome“...</translation> <translation id="345171907106878721">Pridėkite save prie „Chrome“</translation> <translation id="3453763134178591239">„Chrome“ OS sąlygos</translation> -<translation id="34857402635545079">Taip pat išvalyti duomenis iš „Chrome“ (<ph name="URL" />)</translation> <translation id="3503306920980160878">„Chrome“ reikia leidimo, kad galėtų naudoti vietovės informaciją ir bendrinti ją su šia svetaine</translation> <translation id="3533694711092285624">Nėra išsaugotų slaptažodžių. „Chrome“ gali tikrinti jūsų slaptažodžius, kai juos išsaugote.</translation> <translation id="3541482654983822893">„Chrome“ negali patikrinti jūsų slaptažodžių. Bandykite dar kartą po 24 val.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_lv.xtb b/chrome/app/resources/google_chrome_strings_lv.xtb index 4654bba1..fe2f04e6 100644 --- a/chrome/app/resources/google_chrome_strings_lv.xtb +++ b/chrome/app/resources/google_chrome_strings_lv.xtb
@@ -151,7 +151,6 @@ <translation id="3451115285585441894">Notiek pievienošana pārlūkam Chrome...</translation> <translation id="345171907106878721">Pievienot savu kontu pārlūkā Chrome</translation> <translation id="3453763134178591239">Chrome OS noteikumi</translation> -<translation id="34857402635545079">Notīrīt arī datus no Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Pārlūkam Chrome ir nepieciešama piekļuve jūsu atrašanās vietas datiem, lai varētu tos kopīgot ar šo vietni.</translation> <translation id="3533694711092285624">Nav saglabātu paroļu. Pārlūkprogrammā Chrome var pārbaudīt jūsu paroles, ja jūs tās saglabājat.</translation> <translation id="3541482654983822893">Pārlūkprogrammā Chrome nevar pārbaudīt jūsu paroles. Mēģiniet vēlreiz pēc 24 stundām.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mk.xtb b/chrome/app/resources/google_chrome_strings_mk.xtb index f19d4f4..af7f9308 100644 --- a/chrome/app/resources/google_chrome_strings_mk.xtb +++ b/chrome/app/resources/google_chrome_strings_mk.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Се додава на Chrome...</translation> <translation id="345171907106878721">Додај се себеси на Chrome</translation> <translation id="3453763134178591239">Услови на Chrome OS</translation> -<translation id="34857402635545079">Избриши ги и податоците од Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">На Chrome му треба пристап до вашата локација за да ја сподели со сајтов</translation> <translation id="3533694711092285624">Нема зачувани лозинки. Chrome може да ги проверува вашите лозинки кога ги зачувувате.</translation> <translation id="3541482654983822893">Chrome не може да ги провери вашите лозинки. Обидете се пак по 24 часа.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ml.xtb b/chrome/app/resources/google_chrome_strings_ml.xtb index cb7dba16..e89c3b7 100644 --- a/chrome/app/resources/google_chrome_strings_ml.xtb +++ b/chrome/app/resources/google_chrome_strings_ml.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome-ലേക്ക് ചേർക്കുന്നു...</translation> <translation id="345171907106878721">Chrome-ലേക്ക് സ്വയം ചേരുക</translation> <translation id="3453763134178591239">ChromeOS നിബന്ധനകൾ</translation> -<translation id="34857402635545079">Chrome-ൽ നിന്നും ഡാറ്റ മായ്ക്കുക (<ph name="URL" />)</translation> <translation id="3503306920980160878">ഈ സൈറ്റുമായി ലൊക്കേഷൻ പങ്കിടാൻ Chrome-ന് നിങ്ങളുടെ ലൊക്കേഷനിലേക്കുള്ള ആക്സസ് ആവശ്യമാണ്</translation> <translation id="3533694711092285624">സംരക്ഷിച്ച പാസ്വേഡുകളൊന്നുമില്ല. നിങ്ങളുടെ പാസ്വേഡുകൾ സംരക്ഷിക്കുകയാണങ്കിൽ, Chrome-ന് അവ പരിശോധിക്കാനാവും.</translation> <translation id="3541482654983822893">Chrome-ന് നിങ്ങളുടെ പാസ്വേഡുകൾ പരിശോധിക്കാനാവുന്നില്ല. 24 മണിക്കൂറിന് ശേഷം വീണ്ടും ശ്രമിക്കുക.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mn.xtb b/chrome/app/resources/google_chrome_strings_mn.xtb index 09a1d815..02f31cf3 100644 --- a/chrome/app/resources/google_chrome_strings_mn.xtb +++ b/chrome/app/resources/google_chrome_strings_mn.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome руу нэмж байна...</translation> <translation id="345171907106878721">Chrome-д өөрийгөө нэмэх</translation> <translation id="3453763134178591239">ChromeOS-н нөхцөл</translation> -<translation id="34857402635545079">Chrome-н (<ph name="URL" />) өгөгдлийг мөн адил устгах</translation> <translation id="3503306920980160878">Энэ сайтаар таны байршлыг хуваалцахын тулд Chrome-д таны байршилд хандах зөвшөөрөл шаардлагатай</translation> <translation id="3533694711092285624">Хадгалсан ямар ч нууц үг байхгүй байна. Таныг нууц үгсээ хадгалах үед Chrome тэднийг шалгах боломжтой.</translation> <translation id="3541482654983822893">Chrome таны нууц үгсийг шалгах боломжгүй байна. 24 цагийн дараа дахин оролдоно уу.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_mr.xtb b/chrome/app/resources/google_chrome_strings_mr.xtb index 804ba3ce..bce4799 100644 --- a/chrome/app/resources/google_chrome_strings_mr.xtb +++ b/chrome/app/resources/google_chrome_strings_mr.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Chrome मध्ये जोडत आहे...</translation> <translation id="345171907106878721">Chrome वर आपल्या स्वतःस जोडा</translation> <translation id="3453763134178591239">ChromeOS अटी</translation> -<translation id="34857402635545079">Chrome (<ph name="URL" />) वरील डेटा देखील साफ करा</translation> <translation id="3503306920980160878">तुमचे स्थान या साइटसोबत शेअर करण्यासाठी Chrome ला तुमच्या स्थानाचा अॅक्सेस हवा आहे</translation> <translation id="3533694711092285624">सेव्ह केलेले पासवर्ड नाहीत. तुम्ही तुमचे पासवर्ड सेव्ह केल्यावर Chrome ते तपासू शकते.</translation> <translation id="3541482654983822893">Chrome तुमचे पासवर्ड तपासू शकत नाही. २४ तासांनंतर पुन्हा प्रयत्न करा.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ms.xtb b/chrome/app/resources/google_chrome_strings_ms.xtb index d45663e..ea4cc51 100644 --- a/chrome/app/resources/google_chrome_strings_ms.xtb +++ b/chrome/app/resources/google_chrome_strings_ms.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Menambahkan pada Chrome...</translation> <translation id="345171907106878721">Tambahkan diri anda kepada Chrome</translation> <translation id="3453763134178591239">Syarat Chrome OS</translation> -<translation id="34857402635545079">Kosongkan data daripada Chrome (<ph name="URL" />) juga</translation> <translation id="3503306920980160878">Chrome memerlukan akses kepada lokasi anda untuk berkongsi lokasi dengan tapak ini</translation> <translation id="3533694711092285624">Tiada kata laluan yang disimpan. Chrome boleh menyemak kata laluan anda yang disimpan.</translation> <translation id="3541482654983822893">Chrome tidak dapat menyemak kata laluan anda. Cuba lagi selepas 24 jam.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_my.xtb b/chrome/app/resources/google_chrome_strings_my.xtb index da3ba3d..9b237bb3 100644 --- a/chrome/app/resources/google_chrome_strings_my.xtb +++ b/chrome/app/resources/google_chrome_strings_my.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome သို့ ထည့်ပေးနေ...</translation> <translation id="345171907106878721">ကိုယ့်ဘာသာကိုယ် Chrome သို့ ထည့်ပေးရန်</translation> <translation id="3453763134178591239">ChromeOS စည်းမျဉ်းများ</translation> -<translation id="34857402635545079">Chrome (<ph name="URL" />) မှ ဒေတာများကိုလည်း ရှင်းထုတ်ရန်</translation> <translation id="3503306920980160878">ဤဝဘ်ဆိုက်နှင့် သင်၏တည်နေရာကို မျှဝေရန် Chrome သည် သင့်တည်နေရာကို အသုံးပြုခွင့် လိုအပ်ပါသည်</translation> <translation id="3533694711092285624">သိမ်းထားသော စကားဝှက် မရှိပါ။ သင်စကားဝှက်များကို သိမ်းသည့်အခါ Chrome က ၎င်းတို့ကို စစ်ဆေးနိုင်သည်။</translation> <translation id="3541482654983822893">Chrome က သင့်စကားဝှက်များကို စစ်ဆေး၍မရပါ။ ၂၄ နာရီအကြာတွင် ထပ်စမ်းကြည့်ပါ။</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ne.xtb b/chrome/app/resources/google_chrome_strings_ne.xtb index 390c9ce..38fb0812 100644 --- a/chrome/app/resources/google_chrome_strings_ne.xtb +++ b/chrome/app/resources/google_chrome_strings_ne.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">Chrome मा थप्दै...</translation> <translation id="345171907106878721">आफूलाई Chrome मा थप्नुहोस</translation> <translation id="3453763134178591239">ChromeOS का सर्तहरू</translation> -<translation id="34857402635545079">Chrome (<ph name="URL" />) को डेटा पनि खाली गर्नुहोस्</translation> <translation id="3503306920980160878">यो साइटसँग तपाईंको स्थान आदान प्रदान गर्न Chrome सँग तपाईंको स्थानमाथिको पहुँच हुनु पर्छ</translation> <translation id="3533694711092285624">कुनै पनि सुरक्षित गरिएको पासवर्ड छैन। तपाईंले आफ्ना पासवर्डहरू सुरक्षित गर्नुभएको छ भने मात्र Chrome ले तिनको जाँच गर्न सक्छ।</translation> <translation id="3541482654983822893">Chrome तपाईंका पासवर्डहरू जाँच्न सक्दैन। २४ घन्टापछि फेरि प्रयास गर्नुहोस्।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_nl.xtb b/chrome/app/resources/google_chrome_strings_nl.xtb index 766bfa5f..cd0119b 100644 --- a/chrome/app/resources/google_chrome_strings_nl.xtb +++ b/chrome/app/resources/google_chrome_strings_nl.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Toevoegen aan Chrome...</translation> <translation id="345171907106878721">Jezelf toevoegen aan Chrome</translation> <translation id="3453763134178591239">Voorwaarden van Chrome OS</translation> -<translation id="34857402635545079">Ook gegevens van Chrome wissen (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome heeft toegang tot je locatie nodig om je locatie met deze site te delen</translation> <translation id="3533694711092285624">Geen opgeslagen wachtwoorden. Chrome kan je wachtwoorden controleren als je deze hebt opgeslagen.</translation> <translation id="3541482654983822893">Chrome kan je wachtwoorden niet checken. Probeer het over 24 uur opnieuw.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_no.xtb b/chrome/app/resources/google_chrome_strings_no.xtb index 058d198..0ef1598 100644 --- a/chrome/app/resources/google_chrome_strings_no.xtb +++ b/chrome/app/resources/google_chrome_strings_no.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Legger til i Chrome …</translation> <translation id="345171907106878721">Legg til deg selv i Chrome</translation> <translation id="3453763134178591239">Vilkår for ChromeOS</translation> -<translation id="34857402635545079">Slett dataene fra Chrome også (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome trenger tilgang til posisjonen din for å kunne dele den med dette nettstedet</translation> <translation id="3533694711092285624">Ingen lagrede passord. Chrome kan sjekke passordene dine når du lagrer dem.</translation> <translation id="3541482654983822893">Chrome kan ikke sjekke passordene dine. Prøv på nytt når det har gått 24 timer.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_or.xtb b/chrome/app/resources/google_chrome_strings_or.xtb index 38f91b62..4c62790d 100644 --- a/chrome/app/resources/google_chrome_strings_or.xtb +++ b/chrome/app/resources/google_chrome_strings_or.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chromeକୁ ଯୋଗ କରାଯାଉଛି...</translation> <translation id="345171907106878721">ନିଜକୁ Chromeରେ ଯୋଗ କରନ୍ତୁ</translation> <translation id="3453763134178591239">ChromeOS ସର୍ତ୍ତାବଳୀ</translation> -<translation id="34857402635545079">Chromeରୁ ମଧ୍ୟ ଡାଟା ଖାଲି କରନ୍ତୁ (<ph name="URL" />)</translation> <translation id="3503306920980160878">ଏହି ସାଇଟ୍ ସହ ଆପଣଙ୍କ ଲୋକେସନ୍ ସେୟାର୍ କରିବା ପାଇଁ Chrome ଆପଣଙ୍କ ଲୋକେସନ୍କୁ ଆକ୍ସେସ୍ କରିବାକୁ ଚାହୁଁଛି</translation> <translation id="3533694711092285624">ସେଭ୍ କରାଯାଇଥିବା କୌଣସି ପାସୱାର୍ଡ ନାହିଁ। ଆପଣ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ସେଭ୍ କଲେ Chrome ସେଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିପାରିବ।</translation> <translation id="3541482654983822893">Chrome ଆପଣଙ୍କ ପାସୱାର୍ଡଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରିପାରିବ ନାହିଁ। 24 ଘଣ୍ଟା ପରେ ପୁଣି ଚେଷ୍ଟା କରନ୍ତୁ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pa.xtb b/chrome/app/resources/google_chrome_strings_pa.xtb index d5ffd0d..c5c2bd6 100644 --- a/chrome/app/resources/google_chrome_strings_pa.xtb +++ b/chrome/app/resources/google_chrome_strings_pa.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Chrome ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ...</translation> <translation id="345171907106878721">ਖੁਦ ਨੂੰ Chrome ਨਾਲ ਜੋੜੋ</translation> <translation id="3453763134178591239">ChromeOS ਦੇ ਨਿਯਮ</translation> -<translation id="34857402635545079">Chrome (<ph name="URL" />) ਤੋਂ ਵੀ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="3503306920980160878">Chrome ਨੂੰ ਇਸ ਸਾਈਟ ਨਾਲ ਤੁਹਾਡੀ ਟਿਕਾਣਾ ਜਾਣਕਾਰੀ ਸਾਂਝੀ ਕਰਨ ਲਈ ਤੁਹਾਡੇ ਟਿਕਾਣੇ 'ਤੇ ਪਹੁੰਚ ਕਰਨ ਦੀ ਲੋੜ ਹੈ</translation> <translation id="3533694711092285624">ਕੋਈ ਰੱਖਿਅਤ ਕੀਤੇ ਪਾਸਵਰਡ ਨਹੀਂ। ਤੁਹਾਡੇ ਵੱਲੋਂ ਆਪਣੇ ਪਾਸਵਰਡ ਰੱਖਿਅਤ ਕਰਨ 'ਤੇ Chrome ਉਹਨਾਂ ਦੀ ਜਾਂਚ ਕਰ ਸਕਦਾ ਹੈ।</translation> <translation id="3541482654983822893">Chrome ਤੁਹਾਡੇ ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਨਹੀਂ ਕਰ ਸਕਦਾ। 24 ਘੰਟਿਆਂ ਬਾਅਦ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ।</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pl.xtb b/chrome/app/resources/google_chrome_strings_pl.xtb index 9f3eddbe..d245061 100644 --- a/chrome/app/resources/google_chrome_strings_pl.xtb +++ b/chrome/app/resources/google_chrome_strings_pl.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Dodaję do Chrome...</translation> <translation id="345171907106878721">Dodaj siebie do Chrome</translation> <translation id="3453763134178591239">Warunki korzystania z Chrome OS</translation> -<translation id="34857402635545079">Wyczyść też dane z Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome musi mieć dostęp do Twojej lokalizacji, by udostępnić ją tej stronie</translation> <translation id="3533694711092285624">Brak zapisanych haseł. Chrome może sprawdzać Twoje hasła, gdy je zapiszesz.</translation> <translation id="3541482654983822893">Chrome nie może sprawdzić Twoich haseł. Spróbuj ponownie za 24 godziny.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-BR.xtb b/chrome/app/resources/google_chrome_strings_pt-BR.xtb index 230a7eb..2d0b1f0 100644 --- a/chrome/app/resources/google_chrome_strings_pt-BR.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-BR.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Adicionando ao Google Chrome...</translation> <translation id="345171907106878721">Cadastrar-se no Chrome</translation> <translation id="3453763134178591239">Termos do ChromeOS</translation> -<translation id="34857402635545079">Remover também dados do Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">O Chrome precisa acessar seu local para compartilhá-lo com este site</translation> <translation id="3533694711092285624">Nenhuma senha salva. O Chrome poderá verificar suas senhas quando elas forem salvas.</translation> <translation id="3541482654983822893">Não foi possível verificar suas senhas. Tente novamente em 24 horas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_pt-PT.xtb b/chrome/app/resources/google_chrome_strings_pt-PT.xtb index e0db769..5ea2260 100644 --- a/chrome/app/resources/google_chrome_strings_pt-PT.xtb +++ b/chrome/app/resources/google_chrome_strings_pt-PT.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">A adicionar ao Chrome...</translation> <translation id="345171907106878721">Adicionar-se ao Chrome</translation> <translation id="3453763134178591239">Termos do ChromeOS</translation> -<translation id="34857402635545079">Limpar também os dados do Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">O Chrome necessita de acesso à sua localização para a partilhar com este site.</translation> <translation id="3533694711092285624">Não existem palavras-passe guardadas. O Chrome consegue verificar as suas palavras-passe quando as guarda.</translation> <translation id="3541482654983822893">O Chrome não consegue verificar as suas palavras-passe. Tente novamente após 24 horas.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ro.xtb b/chrome/app/resources/google_chrome_strings_ro.xtb index 2571dec..4de1eae 100644 --- a/chrome/app/resources/google_chrome_strings_ro.xtb +++ b/chrome/app/resources/google_chrome_strings_ro.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Se adaugă la Chrome...</translation> <translation id="345171907106878721">Adăugați-vă la Chrome</translation> <translation id="3453763134178591239">Condiții pentru sistemul de operare Chrome</translation> -<translation id="34857402635545079">Șterge și datele din Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome are nevoie de acces la locația ta ca să permită accesul la locație pentru acest site</translation> <translation id="3533694711092285624">Nu există parole salvate. Chrome îți poate verifica parolele dacă le salvezi.</translation> <translation id="3541482654983822893">Chrome nu îți poate verifica parolele. Încearcă din nou după 24 de ore.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ru.xtb b/chrome/app/resources/google_chrome_strings_ru.xtb index 25c8857..e7516052 100644 --- a/chrome/app/resources/google_chrome_strings_ru.xtb +++ b/chrome/app/resources/google_chrome_strings_ru.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Установка...</translation> <translation id="345171907106878721">Добавить пользователя Chrome</translation> <translation id="3453763134178591239">Условия использования Chrome OS</translation> -<translation id="34857402635545079">Также удалить данные из Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Для этого сайта Chrome запрашивает доступ к данным о вашем местоположении.</translation> <translation id="3533694711092285624">Сохраненных паролей нет. Чтобы браузер Chrome мог проверять пароли, сохраните их.</translation> <translation id="3541482654983822893">Не удается проверить пароли в Chrome. Повторите попытку через 24 часа.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_si.xtb b/chrome/app/resources/google_chrome_strings_si.xtb index bbc7669b..a295585 100644 --- a/chrome/app/resources/google_chrome_strings_si.xtb +++ b/chrome/app/resources/google_chrome_strings_si.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Chrome වෙත එක් කරමින්...</translation> <translation id="345171907106878721">ඔබව Chromeවෙත එක් කරන්න</translation> <translation id="3453763134178591239">ChromeOS නියම</translation> -<translation id="34857402635545079">Chrome වෙතින් ද දත්ත හිස් කරන්න (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome හට මෙම අඩවිය සමඟ ඔබේ ස්ථානය බෙදා ගැනීමට ඔබේ ස්ථානයට ප්රවේශය අවශ්යයි</translation> <translation id="3533694711092285624">සුරැකි මුරපද නැත. ඔබ ඔබේ මුරපද පරීක්ෂා කරන විට Chrome හට ඒවා පරීක්ෂා කළ හැක.</translation> <translation id="3541482654983822893">Chrome හට ඔබේ මුරපද පරීක්ෂා කළ නොහැක. පැය 24-කට පසුව නැවත උත්සාහ කරන්න.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sk.xtb b/chrome/app/resources/google_chrome_strings_sk.xtb index 0eafab4..f1de3d324 100644 --- a/chrome/app/resources/google_chrome_strings_sk.xtb +++ b/chrome/app/resources/google_chrome_strings_sk.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">Prebieha pridávanie do prehliadača Chrome...</translation> <translation id="345171907106878721">Pridajte si účet do prehliadača Chrome</translation> <translation id="3453763134178591239">Zmluvné podmienky systému Chrome OS</translation> -<translation id="34857402635545079">Tiež vymazať údaje z Chromu (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome potrebuje prístup k vašej polohe, aby ju mohol zdieľať s týmto webom</translation> <translation id="3533694711092285624">Žiadne uložené heslá. Chrome môže skontrolovať heslá, keď ich uložíte.</translation> <translation id="3541482654983822893">Chrome nemôže skontrolovať heslá. Skúste to znova o 24 hodín.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sl.xtb b/chrome/app/resources/google_chrome_strings_sl.xtb index 43e07b1..8bcfb79 100644 --- a/chrome/app/resources/google_chrome_strings_sl.xtb +++ b/chrome/app/resources/google_chrome_strings_sl.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Dodajanje v Chrome ...</translation> <translation id="345171907106878721">Dodajte se v Chrome</translation> <translation id="3453763134178591239">Pogoji za Chrome OS</translation> -<translation id="34857402635545079">Počisti tudi podatke iz Chroma (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome potrebuje dostop do vaše lokacije, da jo bo lahko delil s tem spletnim mestom</translation> <translation id="3533694711092285624">Ni shranjenih gesel. Chrome lahko preveri gesla, če jih shranite.</translation> <translation id="3541482654983822893">Chrome ne more preveriti vaših gesel. Poskusite znova čez 24 ur.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sq.xtb b/chrome/app/resources/google_chrome_strings_sq.xtb index 5956bfa4..5e3509e 100644 --- a/chrome/app/resources/google_chrome_strings_sq.xtb +++ b/chrome/app/resources/google_chrome_strings_sq.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Po shton te Chrome...</translation> <translation id="345171907106878721">Shtoje veten te Chrome</translation> <translation id="3453763134178591239">Kushtet e ChromeOS</translation> -<translation id="34857402635545079">Pastro po ashtu të dhënat nga Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome ka nevojë për qasje te vendndodhja jote për të ndarë vendndodhjen me këtë sajt</translation> <translation id="3533694711092285624">Nuk ka asnjë fjalëkalim të ruajtur. Chrome mund t'i kontrollojë fjalëkalimet e tua kur ti i ruan ato.</translation> <translation id="3541482654983822893">Chrome nuk mund t'i kontrollojë fjalëkalimet e tua. Provo përsëri pas 24 orësh.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb index 5f5a177a..07435bc 100644 --- a/chrome/app/resources/google_chrome_strings_sr-Latn.xtb +++ b/chrome/app/resources/google_chrome_strings_sr-Latn.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Dodavanje u Chrome...</translation> <translation id="345171907106878721">Dodajte sebe u Chrome</translation> <translation id="3453763134178591239">Chrome OS uslovi</translation> -<translation id="34857402635545079">Obriši podatke i iz Chrome-a (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome traži pristup vašoj lokaciji da biste je delili sa ovim sajtom</translation> <translation id="3533694711092285624">Nema sačuvanih lozinki. Chrome može da proverava lozinke kada ih sačuvate.</translation> <translation id="3541482654983822893">Chrome ne može da vam proverava lozinke. Probajte ponovo za 24 sata.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sr.xtb b/chrome/app/resources/google_chrome_strings_sr.xtb index 7079eec..638f4dd 100644 --- a/chrome/app/resources/google_chrome_strings_sr.xtb +++ b/chrome/app/resources/google_chrome_strings_sr.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Додавање у Chrome...</translation> <translation id="345171907106878721">Додајте себе у Chrome</translation> <translation id="3453763134178591239">Chrome ОС услови</translation> -<translation id="34857402635545079">Обриши податке и из Chrome-а (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome тражи приступ вашој локацији да бисте је делили са овим сајтом</translation> <translation id="3533694711092285624">Нема сачуваних лозинки. Chrome може да проверава лозинке када их сачувате.</translation> <translation id="3541482654983822893">Chrome не може да вам проверава лозинке. Пробајте поново за 24 сата.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sv.xtb b/chrome/app/resources/google_chrome_strings_sv.xtb index 4fe828d..8b0eadd 100644 --- a/chrome/app/resources/google_chrome_strings_sv.xtb +++ b/chrome/app/resources/google_chrome_strings_sv.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Lägger till i Chrome ...</translation> <translation id="345171907106878721">Lägg till dig själv i Chrome</translation> <translation id="3453763134178591239">Villkor för Chrome OS</translation> -<translation id="34857402635545079">Rensa även data från Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Du behöver ge Chrome åtkomst till din plats om den ska kunna delas med webbplatsen</translation> <translation id="3533694711092285624">Det finns inga sparade lösenord. Chrome kan bara kontrollera dina lösenord om du sparar dem.</translation> <translation id="3541482654983822893">Chrome kan inte kontrollera dina lösenord. Försök igen om ett dygn.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_sw.xtb b/chrome/app/resources/google_chrome_strings_sw.xtb index 71087038..b8e7415 100644 --- a/chrome/app/resources/google_chrome_strings_sw.xtb +++ b/chrome/app/resources/google_chrome_strings_sw.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Inaongeza kwenye Chrome...</translation> <translation id="345171907106878721">Jiongeze kwenye Chrome</translation> <translation id="3453763134178591239">Sheria na masharti ya Mfumo wa Uendeshaji wa Chrome</translation> -<translation id="34857402635545079">Futa pia data kutoka Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome inahitaji kufikia maelezo ya mahali ulipo ili kuyashiriki na tovuti hii</translation> <translation id="3533694711092285624">Hakuna manenosiri yaliyohifadhiwa. Chrome inaweza kukagua manenosiri yako unapoyahifadhi.</translation> <translation id="3541482654983822893">Chrome imeshindwa kukagua manenosiri yako. Jaribu tena baada ya saa 24.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ta.xtb b/chrome/app/resources/google_chrome_strings_ta.xtb index 061716ba..1aaf597 100644 --- a/chrome/app/resources/google_chrome_strings_ta.xtb +++ b/chrome/app/resources/google_chrome_strings_ta.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Chrome இல் சேர்க்கிறது...</translation> <translation id="345171907106878721">உங்களை Chrome இல் சேர்க்கவும்</translation> <translation id="3453763134178591239">ChromeOS விதிமுறைகள்</translation> -<translation id="34857402635545079">Chromeமிலிருந்தும் தரவை அழி (<ph name="URL" />)</translation> <translation id="3503306920980160878">இந்தத் தளத்துடன் இருப்பிடத்தைப் பகிர Chromeமுக்கு உங்கள் இருப்பிடத்திற்கான அணுகல் தேவை</translation> <translation id="3533694711092285624">சேமித்த கடவுச்சொற்கள் எதுவும் இல்லை. நீங்கள் அவற்றைச் சேமிக்கும்போது Chromeமால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியும்.</translation> <translation id="3541482654983822893">Chrome உலாவியால் உங்கள் கடவுச்சொற்களைச் சரிபார்க்க முடியவில்லை. 24 மணிநேரத்திற்குப் பிறகு முயலவும்.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_te.xtb b/chrome/app/resources/google_chrome_strings_te.xtb index 3aa886c5..946b0457 100644 --- a/chrome/app/resources/google_chrome_strings_te.xtb +++ b/chrome/app/resources/google_chrome_strings_te.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Chromeకు జోడిస్తోంది...</translation> <translation id="345171907106878721">Chromeకు మిమ్మల్ని జోడించుకోండి</translation> <translation id="3453763134178591239">ChromeOS నియమాలు</translation> -<translation id="34857402635545079">అలాగే (<ph name="URL" />)లో ఉన్న Chromeకి సంబంధించిన డేటాను తీసివేయండి</translation> <translation id="3503306920980160878">ఈ సైట్తో మీ స్థానాన్ని షేర్ చేయడానికి Chromeకు మీ స్థాన యాక్సెస్ అవసరం</translation> <translation id="3533694711092285624">సేవ్ చేసిన పాస్వర్డ్లు లేవు. మీరు మీ పాస్వర్డ్లను సేవ్ చేసినప్పుడు Chrome వాటిని చెక్ చేయగలదు.</translation> <translation id="3541482654983822893">మీ పాస్వర్డ్లను Chrome చెక్ చేయలేకపోయింది. 24 గంటల తర్వాత మళ్లీ ట్రై చేయండి.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_th.xtb b/chrome/app/resources/google_chrome_strings_th.xtb index e3275f60..373b855 100644 --- a/chrome/app/resources/google_chrome_strings_th.xtb +++ b/chrome/app/resources/google_chrome_strings_th.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">กำลังเพิ่มลงใน Chrome...</translation> <translation id="345171907106878721">เพิ่มตัวคุณเองใน Chrome</translation> <translation id="3453763134178591239">ข้อกำหนดของ Chrome OS</translation> -<translation id="34857402635545079">ล้างข้อมูลจาก Chrome (<ph name="URL" />) ด้วย</translation> <translation id="3503306920980160878">Chrome ต้องการสิทธิ์เข้าถึงตำแหน่งของคุณเพื่อแชร์ตำแหน่งกับเว็บไซต์นี้</translation> <translation id="3533694711092285624">ไม่มีรหัสผ่านที่บันทึกไว้ Chrome จะตรวจสอบรหัสผ่านได้เมื่อคุณบันทึกรหัสผ่านไว้</translation> <translation id="3541482654983822893">Chrome ตรวจสอบรหัสผ่านของคุณไม่ได้ โปรดรอ 24 ชั่วโมงแล้วลองอีกครั้ง</translation>
diff --git a/chrome/app/resources/google_chrome_strings_tr.xtb b/chrome/app/resources/google_chrome_strings_tr.xtb index b6f594f..0924ac4 100644 --- a/chrome/app/resources/google_chrome_strings_tr.xtb +++ b/chrome/app/resources/google_chrome_strings_tr.xtb
@@ -149,7 +149,6 @@ <translation id="3451115285585441894">Chrome'a ekleniyor...</translation> <translation id="345171907106878721">Kendinizi Chrome'a ekleyin</translation> <translation id="3453763134178591239">ChromeOS şartları</translation> -<translation id="34857402635545079">Chrome'daki verileri de temizle (<ph name="URL" />)</translation> <translation id="3503306920980160878">Konumunuzu bu siteyle paylaşabilmek için Chrome'un konum bilgilerinize erişmesi gerekiyor</translation> <translation id="3533694711092285624">Kaydedilen şifre yok. Kaydetmeniz halinde Chrome, şifrelerinizi kontrol edebilir.</translation> <translation id="3541482654983822893">Chrome, şifrelerinizi kontrol edemiyor. 24 saat sonra tekrar deneyin.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uk.xtb b/chrome/app/resources/google_chrome_strings_uk.xtb index b6d0509d..e0288fc 100644 --- a/chrome/app/resources/google_chrome_strings_uk.xtb +++ b/chrome/app/resources/google_chrome_strings_uk.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">Додавання в Chrome...</translation> <translation id="345171907106878721">Додати себе в Chrome</translation> <translation id="3453763134178591239">Умови використання ОС Chrome</translation> -<translation id="34857402635545079">Також очистити дані Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome потрібен доступ до геоданих, щоб повідомляти цьому сайту ваше місцезнаходження</translation> <translation id="3533694711092285624">Немає збережених паролів. Chrome зможе перевірити ваші паролі, коли ви їх збережете.</translation> <translation id="3541482654983822893">Chrome не може перевірити паролі. Повторіть спробу через 24 години.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_ur.xtb b/chrome/app/resources/google_chrome_strings_ur.xtb index 0f98b13..f77c5d7 100644 --- a/chrome/app/resources/google_chrome_strings_ur.xtb +++ b/chrome/app/resources/google_chrome_strings_ur.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">Chrome میں شامل کیا جا رہا ہے…</translation> <translation id="345171907106878721">خود کو Chrome میں شامل کریں</translation> <translation id="3453763134178591239">ChromeOS کی شرائط</translation> -<translation id="34857402635545079">Chrome کا ڈیٹا بھی صاف کریں (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome کو اس سائٹ کے ساتھ آپ کے مقام کا اشتراک کرنے کیلئے آپ کے مقام تک رسائی درکار ہے</translation> <translation id="3533694711092285624">کوئی محفوظ کردہ پاس ورڈز نہیں۔ جب آپ پاس ورڈز کو محفوظ کرتے ہیں تو Chrome انہیں چیک کر سکتا ہے۔</translation> <translation id="3541482654983822893">Chrome آپ کے پاس ورڈز چیک نہیں کر سکتا ہے۔ 24 گھنٹے بعد دوبارہ کوشش کریں۔</translation>
diff --git a/chrome/app/resources/google_chrome_strings_uz.xtb b/chrome/app/resources/google_chrome_strings_uz.xtb index a4d4735..0f18e29 100644 --- a/chrome/app/resources/google_chrome_strings_uz.xtb +++ b/chrome/app/resources/google_chrome_strings_uz.xtb
@@ -151,7 +151,6 @@ <translation id="3451115285585441894">O‘rnatilmoqda...</translation> <translation id="345171907106878721">Chrome foydalanuvchisini qo‘shish</translation> <translation id="3453763134178591239">ChromeOS shartlari</translation> -<translation id="34857402635545079">Chrome maʼlumotlari ham tozalansin (<ph name="URL" />)</translation> <translation id="3503306920980160878">Bu sayt manzilingizdan foydalanishi uchun Chrome brauzeriga ruxsat berishingiz lozim</translation> <translation id="3533694711092285624">Hech qanday parol saqlanmagan. Chrome faqat saqlangan parollaringizni tekshira oladi.</translation> <translation id="3541482654983822893">Chrome parollaringizni tekshira olmadi. 24 soatdan keyin qayta urining.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_vi.xtb b/chrome/app/resources/google_chrome_strings_vi.xtb index 9d192e8..e6873d6 100644 --- a/chrome/app/resources/google_chrome_strings_vi.xtb +++ b/chrome/app/resources/google_chrome_strings_vi.xtb
@@ -152,7 +152,6 @@ <translation id="3451115285585441894">Đang thêm vào Chrome...</translation> <translation id="345171907106878721">Thêm chính bạn vào Chrome</translation> <translation id="3453763134178591239">Điều khoản của ChromeOS</translation> -<translation id="34857402635545079">Đồng thời xóa dữ liệu khỏi Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome cần quyền truy cập vào vị trí của bạn để chia sẻ thông tin vị trí với trang web này</translation> <translation id="3533694711092285624">Bạn chưa lưu mật khẩu nào. Chrome có thể kiểm tra các mật khẩu của bạn khi bạn lưu các mật khẩu đó.</translation> <translation id="3541482654983822893">Chrome không thể kiểm tra mật khẩu của bạn. Hãy thử lại sau 24 giờ.</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-CN.xtb b/chrome/app/resources/google_chrome_strings_zh-CN.xtb index f2b3a0d..d1059b4 100644 --- a/chrome/app/resources/google_chrome_strings_zh-CN.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-CN.xtb
@@ -146,7 +146,6 @@ <translation id="3451115285585441894">正在添加到 Chrome 浏览器...</translation> <translation id="345171907106878721">将您自己添加到Chrome</translation> <translation id="3453763134178591239">Chrome 操作系统条款</translation> -<translation id="34857402635545079">一并清除 Chrome (<ph name="URL" />) 中的数据</translation> <translation id="3503306920980160878">Chrome 需要获得位置权限,才能将您的位置信息共享给此网站</translation> <translation id="3533694711092285624">尚未保存任何密码。您需要先保存密码才能使用 Chrome 的密码检查功能。</translation> <translation id="3541482654983822893">Chrome 无法检查您的密码。请过 24 小时再试。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-HK.xtb b/chrome/app/resources/google_chrome_strings_zh-HK.xtb index e335a32..f61b3d6 100644 --- a/chrome/app/resources/google_chrome_strings_zh-HK.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-HK.xtb
@@ -153,7 +153,6 @@ <translation id="3451115285585441894">正在新增至 Chrome…</translation> <translation id="345171907106878721">新增為 Chrome 使用者</translation> <translation id="3453763134178591239">Chrome OS 條款</translation> -<translation id="34857402635545079">一併清除 Chrome 的資料 (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome 需要位置資訊存取權,才能與這個網站分享您的位置資訊</translation> <translation id="3533694711092285624">沒有已儲存的密碼。儲存密碼時,Chrome 可檢查您的密碼。</translation> <translation id="3541482654983822893">Chrome 無法檢查密碼,請於 24 小時後再試一次。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zh-TW.xtb b/chrome/app/resources/google_chrome_strings_zh-TW.xtb index d678f07..807a30dd 100644 --- a/chrome/app/resources/google_chrome_strings_zh-TW.xtb +++ b/chrome/app/resources/google_chrome_strings_zh-TW.xtb
@@ -150,7 +150,6 @@ <translation id="3451115285585441894">正在新增至 Chrome...</translation> <translation id="345171907106878721">新增為 Chrome 使用者</translation> <translation id="3453763134178591239">Chrome OS 條款</translation> -<translation id="34857402635545079">一併清除 Chrome 中的資料 (<ph name="URL" />)</translation> <translation id="3503306920980160878">Chrome 需要位置資訊存取權,才能與這個網站分享你的位置資訊</translation> <translation id="3533694711092285624">未儲存任何密碼。你必須先儲存密碼,才能使用 Chrome 的密碼檢查功能。</translation> <translation id="3541482654983822893">Chrome 無法檢查你的密碼,請於 24 小時後再試。</translation>
diff --git a/chrome/app/resources/google_chrome_strings_zu.xtb b/chrome/app/resources/google_chrome_strings_zu.xtb index 92374402..3271893 100644 --- a/chrome/app/resources/google_chrome_strings_zu.xtb +++ b/chrome/app/resources/google_chrome_strings_zu.xtb
@@ -154,7 +154,6 @@ <translation id="3451115285585441894">Ingeza ku-Chrome...</translation> <translation id="345171907106878721">Zingeze ngokwakho ku-Chrome</translation> <translation id="3453763134178591239">Imigomo ye-ChromeOS</translation> -<translation id="34857402635545079">Futhi sula idatha kusuka ku-Chrome (<ph name="URL" />)</translation> <translation id="3503306920980160878">I-Chrome idinga ukufinyelela kundawo yakho ukuze yabelane ngendawo yakho naleli sayithi</translation> <translation id="3533694711092285624">Awekho amaphasiwedi alondoloziwe. I-Chrome ingahlola amaphasiwedi akho uma uwalondolozile.</translation> <translation id="3541482654983822893">I-Chrome ayikwazi ukuhlola amaphasiwedi akho. Zama futhi emva kwamahora angu-24.</translation>
diff --git a/chrome/app/settings_chromium_strings.grdp b/chrome/app/settings_chromium_strings.grdp index cac9fc80..16e19aa 100644 --- a/chrome/app/settings_chromium_strings.grdp +++ b/chrome/app/settings_chromium_strings.grdp
@@ -115,16 +115,16 @@ </if> <!-- Preloading Page--> - <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO" desc="Second bullet point in the standard preloading and when on column. Informs the user about what the standard preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO" desc="Bullet point in the standard preloading and when on column. Informs the user about what the standard preloading setting does."> Chromium preloads pages you're likely to visit, so that they load more quickly when you visit them </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO" desc="Second bullet point in the extended preloading and when on column. Informs the user about what the extended preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO" desc="Bullet point in the extended preloading and when on column. Informs the user about what the extended preloading setting does."> Chromium preloads even more pages that you're likely to visit, so that they load more quickly when you visit them </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO" desc="Second bullet point in the extended preloading and things to consider column. Informs the user about what the extended preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO" desc="Bullet point in the extended preloading and things to consider column. Informs the user about what the extended preloading setting does."> When a site asks to privately preload links on their page, Chromium uses Google servers. This hides your identity from the preloaded site, but Google learns what sites get preloaded. </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE" desc="First bullet point in the things to consider column. Informs the user about what the preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE" desc="Bullet point in the things to consider column. Informs the user about what the preloading setting does."> If you allow cookies, Chromium may use them when preloading </message> @@ -260,13 +260,13 @@ </message> <!-- Safe Browsing --> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO" desc="Second bullet point under the safe browsing enhanced protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO" desc="Bullet point under the safe browsing enhanced protection mode"> Keeps you safe on Chromium and may be used to improve your security in other Google apps when you are signed in </message> - <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO" desc="First bullet point under the safe browsing standard protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO" desc="Bullet point under the safe browsing standard protection mode"> Checks URLs with a list of unsafe sites stored in Chromium. If a site tries to steal your password, or when you download a harmful file, Chromium may also send URLs, including bits of page content, to Safe Browsing. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE" desc="First bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> Warns you about dangerous sites, even ones Google didn't know about before, by analyzing more data from sites than standard protection. You can choose to skip Chromium warnings. </message> <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_LEARN_MORE_LABEL" desc="The text for a link to a help center article that gives more information about Safe Browsing.">
diff --git a/chrome/app/settings_google_chrome_strings.grdp b/chrome/app/settings_google_chrome_strings.grdp index bfb66d4..dd774343 100644 --- a/chrome/app/settings_google_chrome_strings.grdp +++ b/chrome/app/settings_google_chrome_strings.grdp
@@ -108,16 +108,16 @@ </if> <!-- Preloading Page--> - <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO" desc="Second bullet point in the standard preloading and when on column. Informs the user about what the standard preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_TWO" desc="Bullet point in the standard preloading and when on column. Informs the user about what the standard preloading setting does."> Chrome preloads pages you're likely to visit, so that they load more quickly when you visit them </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO" desc="Second bullet point in the extended preloading and when on column. Informs the user about what the extended preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_TWO" desc="Bullet point in the extended preloading and when on column. Informs the user about what the extended preloading setting does."> Chrome preloads even more pages that you're likely to visit, so that they load more quickly when you visit them </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO" desc="Second bullet point in the extended preloading and things to consider column. Informs the user about what the extended preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_THINGS_TO_CONSIDER_BULLET_TWO" desc="Bullet point in the extended preloading and things to consider column. Informs the user about what the extended preloading setting does."> When a site asks to privately preload links on their page, Chrome uses Google servers. This hides your identity from the preloaded site, but Google learns what sites get preloaded. </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE" desc="First bullet point in the things to consider column. Informs the user about what the preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_THINGS_TO_CONSIDER_BULLET_ONE" desc="Bullet point in the things to consider column. Informs the user about what the preloading setting does."> If you allow cookies, Chrome may use them when preloading </message> @@ -253,13 +253,13 @@ </message> <!-- Safe Browsing --> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO" desc="Second bullet point under the safe browsing enhanced protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_TWO" desc="Bullet point under the safe browsing enhanced protection mode"> Keeps you safe on Chrome and may be used to improve your security in other Google apps when you are signed in </message> - <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO" desc="First bullet point under the safe browsing standard protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO" desc="Bullet point under the safe browsing standard protection mode"> Checks URLs with a list of unsafe sites stored in Chrome. If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Safe Browsing. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE" desc="First bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_ONE" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> Warns you about dangerous sites, even ones Google didn't know about before, by analyzing more data from sites than standard protection. You can choose to skip Chrome warnings. </message> <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_LEARN_MORE_LABEL" desc="The text for a link to a help center article that gives more information about Safe Browsing.">
diff --git a/chrome/app/settings_strings.grdp b/chrome/app/settings_strings.grdp index c5c3c34..519a6158 100644 --- a/chrome/app/settings_strings.grdp +++ b/chrome/app/settings_strings.grdp
@@ -1331,7 +1331,7 @@ <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_SUMMARY" desc="Short explanation of what the standard preloading mode does in the Preload Pages setting."> Some of the pages you visit are preloaded </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_ONE" desc="First bullet point in the standard preloading and when on column. Informs the user about what the standard preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_STANDARD_PRELOADING_WHEN_ON_BULLET_ONE" desc="Bullet point in the standard preloading and when on column. Informs the user about what the standard preloading setting does."> Browsing and searching is faster </message> <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_TITLE" desc="Name of the extended preloading option for the Preload Pages settings page. This option enables more extensive preloading of pages that Chrome believes the user is likely to navigate to."> @@ -1340,7 +1340,7 @@ <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_SUMMARY" desc="Subtitle for Preload Pages extended preloading mode. Informs the user about which preloading setting is being described on this page."> More pages are preloaded. Pages may be preloaded through Google servers when requested by other sites. </message> - <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_ONE" desc="First bullet point in the extended preloading and when on column. Informs the user about what the extended preloading setting does."> + <message name="IDS_SETTINGS_PRELOAD_PAGES_EXTENDED_PRELOADING_WHEN_ON_BULLET_ONE" desc="Bullet point in the extended preloading and when on column. Informs the user about what the extended preloading setting does."> Browsing and searching is faster than standard preloading </message> @@ -2128,43 +2128,43 @@ <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_EXPAND_ACCESSIBILITY_LABEL" desc="Label for the button that toggles showing the detailed description of safe browsing enhanced protection. Only visible by screen reader software."> Show enhanced protection details </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_ONE" desc="First bullet point under the safe browsing enhanced protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_ONE" desc="Bullet point under the safe browsing enhanced protection mode"> Predicts and warns you about dangerous events before they happen </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_THREE" desc="Third bullet point under the safe browsing enhanced protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_THREE" desc="Bullet point under the safe browsing enhanced protection mode"> Improves security for you and everyone on the web </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FOUR" desc="Fourth bullet point under the safe browsing enhanced protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FOUR" desc="Bullet point under the safe browsing enhanced protection mode"> Warns you if passwords are exposed in a data breach </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FIVE" desc="Fourth bullet point under the safe browsing enhanced protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_BULLET_FIVE" desc="Bullet point under the safe browsing enhanced protection mode"> Sends URLs to Safe Browsing to check them. Also sends a small sample of pages, downloads, extension activity, and system information to help discover new threats. Temporarily links this data to your Google Account when you're signed in, to protect you across Google apps. </message> <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_LABEL" desc="Label of 'When on' section under the Safe Browsing enhanced protection mode"> When on </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_TWO" desc="Second bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_TWO" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> In-depth scans for suspicious downloads. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_THREE" desc="Third bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_THREE" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> When you're signed in, protects you across Google services. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FOUR" desc="Fourth bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FOUR" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> Improves security for you and everyone on the web. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FIVE" desc="Fifth bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_WHEN_ON_BULLET_FIVE" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'When on'"> Warns you if you use a password that has been compromised in a data breach. </message> <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_LABEL" desc="Label of 'Things to consider' section under the Safe Browsing enhanced protection mode"> Things to consider </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_ONE" desc="First bullet point under the Safe Browsing enhanced protection mode section titled 'Things to consider'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_ONE" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'Things to consider'"> Sends the URLs of sites you visit and a small sample of page content, downloads, extension activity, and system information to Google Safe Browsing to check if they're harmful. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_TWO" desc="Second bullet point under the Safe Browsing enhanced protection mode section titled 'Things to consider'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_TWO" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'Things to consider'"> When you're signed in, this data is linked to your Google Account to protect you across Google services, for example increasing protection in Gmail after a security incident. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_THREE" desc="Third bullet point under the Safe Browsing enhanced protection mode section titled 'Things to consider'"> + <message name="IDS_SETTINGS_SAFEBROWSING_ENHANCED_THINGS_TO_CONSIDER_BULLET_THREE" desc="Bullet point under the Safe Browsing enhanced protection mode section titled 'Things to consider'"> Doesn't noticeably slow down your browser or device. </message> <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD" desc="Label for safe browsing standard protection mode"> @@ -2180,14 +2180,14 @@ <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_DESC_UPDATED_PROXY" desc="Description for safe browsing standard protection mode"> Protects against sites, downloads, and extensions that are known to be dangerous. When you visit a site, Chrome sends an obfuscated portion of the URL to Google through a privacy server that hides your IP address. If a site does something suspicious, full URLs and bits of page content are also sent. </message> - <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO_PROXY" desc="First bullet point under the safe browsing standard protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_TWO_PROXY" desc="Bullet point under the safe browsing standard protection mode"> Sends an obfuscated portion of the URL to Google through a privacy server that hides your IP address. If a site tries to steal your password, or when you download a harmful file, Chrome may also send URLs, including bits of page content, to Google. </message> </if> <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_EXPAND_ACCESSIBILITY_LABEL" desc="Label for the button that toggles showing the detailed description of safe browsing standard protection. Only visible by screen reader software."> Show standard protection details </message> - <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_ONE" desc="First bullet point under the safe browsing standard protection mode"> + <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_BULLET_ONE" desc="Bullet point under the safe browsing standard protection mode"> Detects and warns you about dangerous events when they happen </message> <message name="IDS_SETTINGS_SAFEBROWSING_STANDARD_HELP_IMPROVE" desc="The name of the toggle to enable reporting to help improve safe browsing">
diff --git a/chrome/app/support_tool_strings.grdp b/chrome/app/support_tool_strings.grdp index c4039057..43717bf 100644 --- a/chrome/app/support_tool_strings.grdp +++ b/chrome/app/support_tool_strings.grdp
@@ -154,7 +154,7 @@ ChromeOS Chrome User Logs </message> <message name="IDS_SUPPORT_TOOL_CHROMEOS_BLUETOOTH_FLOSS" desc="Bluetooth logs if Floss is enabled on the device. Floss is the project that works on converging on a single Bluetooth stack between Android and ChromeOS."> - ChromeOS Bluetooth Floss + ChromeOS Bluetooth </message> <message name="IDS_SUPPORT_TOOL_CHROMEOS_CONNECTED_INPUT_DEVICES" desc="Information about connected input devices to a ChromeOS device."> ChromeOS Connected Input Devices @@ -174,6 +174,9 @@ <message name="IDS_SUPPORT_TOOL_SIGN_IN" desc="Sign In State."> Sign In State </message> + <message name="IDS_SUPPORT_TOOL_CHROMEOS_APP_SERVICE" desc="ChromeOS App Service gathers information from app service about installed and running apps."> + ChromeOS App Service + </message> <!-- PII type strings --> <message name="IDS_SUPPORT_TOOL_ANDROID_APP_INFO" desc="Android App informations on the device. Includes information like app storage paths etc."> Android App Information
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_ADDITIONAL_CROS_PLATFROM_LOGS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_ADDITIONAL_CROS_PLATFROM_LOGS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_ADDITIONAL_CROS_PLATFROM_LOGS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_ADDITIONAL_CROS_PLATFROM_LOGS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_APP_SERVICE.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_APP_SERVICE.png.sha1 new file mode 100644 index 0000000..6ff61e3 --- /dev/null +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_APP_SERVICE.png.sha1
@@ -0,0 +1 @@ +695ae80a600d677c4014189af5ca17608e140543 \ No newline at end of file
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_BLUETOOTH_FLOSS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_BLUETOOTH_FLOSS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_BLUETOOTH_FLOSS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_BLUETOOTH_FLOSS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CHROME_USER_LOGS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CHROME_USER_LOGS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CHROME_USER_LOGS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CHROME_USER_LOGS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CONNECTED_INPUT_DEVICES.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CONNECTED_INPUT_DEVICES.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CONNECTED_INPUT_DEVICES.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_CONNECTED_INPUT_DEVICES.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_FLEX_LOGS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_FLEX_LOGS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_FLEX_LOGS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_FLEX_LOGS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_HEALTH.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_HEALTH.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_HEALTH.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_HEALTH.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_ROUTES.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_ROUTES.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_ROUTES.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_NETWORK_ROUTES.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SHILL_LOGS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SHILL_LOGS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SHILL_LOGS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SHILL_LOGS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_LOGS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_LOGS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_LOGS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_LOGS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_STATE.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_STATE.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_STATE.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_SYSTEM_STATE.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_TRAFFIC_COUNTERS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_TRAFFIC_COUNTERS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_TRAFFIC_COUNTERS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_TRAFFIC_COUNTERS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_VIRTUAL_KEYBOARD.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_VIRTUAL_KEYBOARD.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_VIRTUAL_KEYBOARD.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROMEOS_VIRTUAL_KEYBOARD.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROME_SYSTEM_INFO.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROME_SYSTEM_INFO.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROME_SYSTEM_INFO.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CHROME_SYSTEM_INFO.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CRASH_IDS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CRASH_IDS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CRASH_IDS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_CRASH_IDS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DBUS_DETAILS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DBUS_DETAILS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DBUS_DETAILS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DBUS_DETAILS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DEVICE_EVENT.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DEVICE_EVENT.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DEVICE_EVENT.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_DEVICE_EVENT.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_INTEL_WIFI_DEBUG_DUMP.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_INTEL_WIFI_DEBUG_DUMP.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_INTEL_WIFI_DEBUG_DUMP.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_INTEL_WIFI_DEBUG_DUMP.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS_SYSTEM_INFO.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS_SYSTEM_INFO.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS_SYSTEM_INFO.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_LACROS_SYSTEM_INFO.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_MEMORY_DETAILS.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_MEMORY_DETAILS.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_MEMORY_DETAILS.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_MEMORY_DETAILS.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_PERFORMANCE.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_PERFORMANCE.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_PERFORMANCE.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_PERFORMANCE.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_POLICIES.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_POLICIES.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_POLICIES.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_POLICIES.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_SIGN_IN.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_SIGN_IN.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_SIGN_IN.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_SIGN_IN.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_UI_HIEARCHY.png.sha1 b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_UI_HIEARCHY.png.sha1 index 85a311c..d85262e 100644 --- a/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_UI_HIEARCHY.png.sha1 +++ b/chrome/app/support_tool_strings_grdp/IDS_SUPPORT_TOOL_UI_HIEARCHY.png.sha1
@@ -1 +1 @@ -5d957bd1dad3a685e7ed8744ad0552ed67c65789 +695ae80a600d677c4014189af5ca17608e140543
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index a214247..157ee5ca 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -1393,10 +1393,11 @@ "privacy/privacy_metrics_service_factory.h", "privacy_sandbox/privacy_sandbox_policy_handler.cc", "privacy_sandbox/privacy_sandbox_policy_handler.h", - "privacy_sandbox/privacy_sandbox_service.cc", "privacy_sandbox/privacy_sandbox_service.h", "privacy_sandbox/privacy_sandbox_service_factory.cc", "privacy_sandbox/privacy_sandbox_service_factory.h", + "privacy_sandbox/privacy_sandbox_service_impl.cc", + "privacy_sandbox/privacy_sandbox_service_impl.h", "privacy_sandbox/privacy_sandbox_settings_delegate.cc", "privacy_sandbox/privacy_sandbox_settings_delegate.h", "privacy_sandbox/privacy_sandbox_settings_factory.cc", @@ -2584,6 +2585,7 @@ deps += [ "//chrome/browser/companion/visual_search:flags", "//chrome/browser/manta/proto:manta_proto", + "//components/manta", "//components/user_education/common", ] } @@ -2760,6 +2762,8 @@ "android/compositor/scene_layer/overscroll_scene_layer.h", "android/compositor/scene_layer/scrolling_bottom_view_scene_layer.cc", "android/compositor/scene_layer/scrolling_bottom_view_scene_layer.h", + "android/compositor/scene_layer/solid_color_scene_layer.cc", + "android/compositor/scene_layer/solid_color_scene_layer.h", "android/compositor/scene_layer/static_tab_scene_layer.cc", "android/compositor/scene_layer/static_tab_scene_layer.h", "android/compositor/scene_layer/status_indicator_scene_layer.cc", @@ -5455,6 +5459,10 @@ "enterprise/remote_commands/job_profile_picker.h", "enterprise/remote_commands/user_remote_commands_factory.cc", "enterprise/remote_commands/user_remote_commands_factory.h", + "enterprise/remote_commands/user_remote_commands_service.cc", + "enterprise/remote_commands/user_remote_commands_service.h", + "enterprise/remote_commands/user_remote_commands_service_factory.cc", + "enterprise/remote_commands/user_remote_commands_service_factory.h", "enterprise/reporting/cloud_profile_reporting_service.cc", "enterprise/reporting/cloud_profile_reporting_service.h", "enterprise/reporting/cloud_profile_reporting_service_factory.cc", @@ -8315,6 +8323,8 @@ "notifications/notification_test_util.h", "privacy_sandbox/mock_privacy_sandbox_service.cc", "privacy_sandbox/mock_privacy_sandbox_service.h", + "privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.cc", + "privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h", "profile_resetter/profile_resetter_test_base.cc", "profile_resetter/profile_resetter_test_base.h", "sessions/app_session_service_test_helper.cc", @@ -8338,6 +8348,8 @@ ] deps += [ "//chrome/browser/apps/app_service", + "//chrome/test:test_support_ui", + "//components/privacy_sandbox/privacy_sandbox_attestations:test_support", "//components/services/app_service", ] }
diff --git a/chrome/browser/DEPS b/chrome/browser/DEPS index 3bd4041..04ef56e7 100644 --- a/chrome/browser/DEPS +++ b/chrome/browser/DEPS
@@ -197,6 +197,7 @@ "+components/media_router/browser", "+components/history_clusters", "+components/history_clusters/history_clusters_internals", + "+components/manta", "+components/media_effects", "+components/memory_pressure", "+components/messages/android",
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 9476bcb..372bffc 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -60,6 +60,7 @@ #include "chrome/browser/signin/signin_features.h" #include "chrome/browser/site_isolation/about_flags.h" #include "chrome/browser/thumbnail/cc/features.h" +#include "chrome/browser/tpcd/experiment/tpcd_experiment_features.h" #include "chrome/browser/ui/browser_navigator_params.h" #include "chrome/browser/ui/ui_features.h" #include "chrome/browser/unexpire_flags.h" @@ -109,6 +110,7 @@ #include "components/language/core/common/language_experiments.h" #include "components/lens/buildflags.h" #include "components/lens/lens_features.h" +#include "components/manta/features.h" #include "components/mirroring/service/mirroring_features.h" #include "components/nacl/common/buildflags.h" #include "components/nacl/common/nacl_switches.h" @@ -3711,6 +3713,77 @@ std::size(kPrivacySandboxSettings4ForceRestrictedUserForTesting), nullptr}, }; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingControl1[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {tpcd::experiment::kDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_control_1.1"}, + {tpcd::experiment::kVersionName, "9990"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingLabelOnly[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {tpcd::experiment::kDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_label_only_1.1"}, + {tpcd::experiment::kVersionName, "9991"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingTreatment[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {tpcd::experiment::kDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_treatment_1.1"}, + {tpcd::experiment::kVersionName, "9992"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingControl2[] = { + {tpcd::experiment::kForceEligibleForTestingName, "false"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {tpcd::experiment::kDisableAdsAPIsName, "true"}, + {features::kCookieDeprecationLabelName, "fake_control_2"}, + {tpcd::experiment::kVersionName, "9993"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingForceControl1[] = + {{tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {tpcd::experiment::kDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_control_1.1"}, + {tpcd::experiment::kVersionName, "9994"}}; +const FeatureEntry::FeatureParam + kTPCPhaseOutFacilitatedTestingForceLabelOnly[] = { + {tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "false"}, + {tpcd::experiment::kDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_label_only_1.1"}, + {tpcd::experiment::kVersionName, "9995"}}; +const FeatureEntry::FeatureParam + kTPCPhaseOutFacilitatedTestingForceTreatment[] = { + {tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {tpcd::experiment::kDisableAdsAPIsName, "false"}, + {features::kCookieDeprecationLabelName, "fake_treatment_1.1"}, + {tpcd::experiment::kVersionName, "9996"}}; +const FeatureEntry::FeatureParam kTPCPhaseOutFacilitatedTestingForceControl2[] = + {{tpcd::experiment::kForceEligibleForTestingName, "true"}, + {tpcd::experiment::kDisable3PCookiesName, "true"}, + {tpcd::experiment::kDisableAdsAPIsName, "true"}, + {features::kCookieDeprecationLabelName, "fake_control_2"}, + {tpcd::experiment::kVersionName, "9997"}}; + +const FeatureEntry::FeatureVariation + kTPCPhaseOutFacilitatedTestingVariations[] = { + {"Control 1", kTPCPhaseOutFacilitatedTestingControl1, + std::size(kTPCPhaseOutFacilitatedTestingControl1), nullptr}, + {"LabelOnly", kTPCPhaseOutFacilitatedTestingLabelOnly, + std::size(kTPCPhaseOutFacilitatedTestingLabelOnly), nullptr}, + {"Treatment", kTPCPhaseOutFacilitatedTestingTreatment, + std::size(kTPCPhaseOutFacilitatedTestingTreatment), nullptr}, + {"Control 2", kTPCPhaseOutFacilitatedTestingControl2, + std::size(kTPCPhaseOutFacilitatedTestingControl2), nullptr}, + {"Force Control 1", kTPCPhaseOutFacilitatedTestingForceControl1, + std::size(kTPCPhaseOutFacilitatedTestingForceControl1), nullptr}, + {"Force LabelOnly", kTPCPhaseOutFacilitatedTestingForceLabelOnly, + std::size(kTPCPhaseOutFacilitatedTestingForceLabelOnly), nullptr}, + {"Force Treatment", kTPCPhaseOutFacilitatedTestingForceTreatment, + std::size(kTPCPhaseOutFacilitatedTestingForceTreatment), nullptr}, + {"Force Control 2", kTPCPhaseOutFacilitatedTestingForceControl2, + std::size(kTPCPhaseOutFacilitatedTestingForceControl2), nullptr}, +}; + const FeatureEntry::FeatureParam kDIPSWithDeletion[] = { {"persist_database", "true"}, {"delete", "true"}, @@ -3912,6 +3985,41 @@ &kWebAuthnAndroidCredManGpmInCredManParam, 1, nullptr}, {"for 3rd party passkeys", &kWebAuthnAndroidCredManGpmNotInCredManParam, 1, nullptr}}; + +const FeatureEntry::FeatureParam kHubPhase1WithFab[] = { + {"floating_action_button", "true"}}; +const FeatureEntry::FeatureParam kHubPhase1WithoutFab[] = { + {"floating_action_button", "false"}}; +const FeatureEntry::FeatureParam kHubPhase2WithIcons[] = { + {"floating_action_button", "true"}, + {"supports_other_tabs", "true"}}; +const FeatureEntry::FeatureParam kHubPhase2WithText[] = { + {"floating_action_button", "true"}, + {"pane_switcher_uses_text", "true"}, + {"supports_other_tabs", "true"}}; +const FeatureEntry::FeatureParam kHubPhase3[] = { + {"floating_action_button", "true"}, + {"pane_switcher_uses_text", "true"}, + {"supports_other_tabs", "true"}, + {"supports_search", "true"}}; +const FeatureEntry::FeatureParam kHubPhase4[] = { + {"floating_action_button", "true"}, + {"pane_switcher_uses_text", "true"}, + {"supports_other_tabs", "true"}, + {"supports_search", "true"}, + {"supports_bookmarks", "true"}}; + +const FeatureEntry::FeatureVariation kAndroidHubVariations[] = { + {"Phase 1 w/ FAB", kHubPhase1WithFab, std::size(kHubPhase1WithFab), + nullptr}, + {"Phase 1 w/o FAB", kHubPhase1WithoutFab, std::size(kHubPhase1WithoutFab), + nullptr}, + {"Phase 2 w/ Icons", kHubPhase2WithIcons, std::size(kHubPhase2WithIcons), + nullptr}, + {"Phase 2 w/ Text", kHubPhase2WithText, std::size(kHubPhase2WithText), + nullptr}, + {"Phase 3", kHubPhase3, std::size(kHubPhase3), nullptr}, + {"Phase 4", kHubPhase4, std::size(kHubPhase4), nullptr}}; #endif // BUILDFLAG(IS_ANDROID) // RECORDING USER METRICS FOR FLAGS: @@ -6406,6 +6514,11 @@ flag_descriptions::kOmniboxGroupingFrameworkDescription, kOsAll, FEATURE_VALUE_TYPE(omnibox::kGroupingFrameworkForNonZPS)}, + {"omnibox-company-entity-icon-adjustment", + flag_descriptions::kOmniboxCompanyEntityIconAdjustmentName, + flag_descriptions::kOmniboxCompanyEntityIconAdjustmentDescription, + kOsDesktop, FEATURE_VALUE_TYPE(omnibox::kCompanyEntityIconAdjustment)}, + {"optimization-guide-debug-logs", flag_descriptions::kOptimizationGuideDebugLogsName, flag_descriptions::kOptimizationGuideDebugLogsDescription, kOsAll, @@ -7684,6 +7797,11 @@ flag_descriptions::kFileHandlingIconsDescription, kOsDesktop, FEATURE_VALUE_TYPE(blink::features::kFileHandlingIcons)}, + {"file-system-access-locking-scheme", + flag_descriptions::kFileSystemAccessLockingSchemeName, + flag_descriptions::kFileSystemAccessLockingSchemeDescription, kOsAll, + FEATURE_VALUE_TYPE(blink::features::kFileSystemAccessLockingScheme)}, + {"file-system-observer", flag_descriptions::kFileSystemObserverName, flag_descriptions::kFileSystemObserverDescription, kOsAll, FEATURE_VALUE_TYPE(blink::features::kFileSystemObserver)}, @@ -8359,16 +8477,6 @@ FEATURE_VALUE_TYPE( privacy_sandbox::kTrackingProtectionOnboardingForceEligibility)}, - {"tracking-protection-onboarding-reset-eligibility-for-testing", - flag_descriptions:: - kTrackingProtectionOnboardingResetEligibilityForTestingName, - flag_descriptions:: - kTrackingProtectionOnboardingResetEligibilityForTestingDescription, - kOsDesktop | kOsAndroid, - FEATURE_VALUE_TYPE( - privacy_sandbox:: - kTrackingProtectionOnboardingResetEligibilityForTesting)}, - #if BUILDFLAG(IS_CHROMEOS_ASH) {kClipboardHistoryLongpressInternalName, flag_descriptions::kClipboardHistoryLongpressName, @@ -9374,6 +9482,14 @@ flag_descriptions::kThirdPartyStoragePartitioningDescription, kOsAll, FEATURE_VALUE_TYPE(net::features::kThirdPartyStoragePartitioning)}, + {"tpc-phase-out-facilitated-testing", + flag_descriptions::kTPCPhaseOutFacilitatedTestingName, + flag_descriptions::kTPCPhaseOutFacilitatedTestingDescription, kOsAll, + FEATURE_WITH_PARAMS_VALUE_TYPE( + features::kCookieDeprecationFacilitatedTesting, + kTPCPhaseOutFacilitatedTestingVariations, + "TPCPhaseOutFacilitatedTesting")}, + {"bounce-tracking-mitigations", flag_descriptions::kDIPSName, flag_descriptions::kDIPSDescription, kOsAll, FEATURE_WITH_PARAMS_VALUE_TYPE(features::kDIPS, kDIPSVariations, "DIPS")}, @@ -9902,11 +10018,6 @@ flag_descriptions::kSafeBrowsingHashPrefixRealTimeLookupsName, flag_descriptions::kSafeBrowsingHashPrefixRealTimeLookupsDescription, kOsAndroid, FEATURE_VALUE_TYPE(safe_browsing::kHashPrefixRealTimeLookups)}, - - {"safe-mode-for-cached-flags", - flag_descriptions::kSafeModeForCachedFlagsName, - flag_descriptions::kSafeModeForCachedFlagsDescription, kOsAndroid, - FEATURE_VALUE_TYPE(chrome::android::kSafeModeForCachedFlags)}, #endif // BUILDFLAG(IS_ANDROID) #if !BUILDFLAG(IS_ANDROID) @@ -11063,7 +11174,7 @@ #if !BUILDFLAG(IS_ANDROID) {"enable-manta-service", flag_descriptions::kEnableMantaServiceName, flag_descriptions::kEnableMantaServiceDescription, kOsDesktop, - FEATURE_VALUE_TYPE(features::kMantaService)}, + FEATURE_VALUE_TYPE(manta::features::kMantaService)}, #endif // !BUILDFLAG(IS_ANDROID) #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -11118,8 +11229,7 @@ {"enable-secure-payment-confirmation-extensions", flag_descriptions::kSecurePaymentConfirmationExtensionsName, flag_descriptions::kSecurePaymentConfirmationExtensionsDescription, kOsAll, - FEATURE_VALUE_TYPE( - payments::features::kSecurePaymentConfirmationExtensions)}, + FEATURE_VALUE_TYPE(blink::features::kSecurePaymentConfirmationExtensions)}, #if BUILDFLAG(IS_CHROMEOS_ASH) {"enable-runtime-counters-telemetry", @@ -11173,6 +11283,11 @@ {"cdm-storage-database", flag_descriptions::kCdmStorageDatabaseName, flag_descriptions::kCdmStorageDatabaseDescription, kOsDesktop, FEATURE_VALUE_TYPE(features::kCdmStorageDatabase)}, + + {"cdm-storage-database-migration", + flag_descriptions::kCdmStorageDatabaseMigrationName, + flag_descriptions::kCdmStorageDatabaseMigrationDescription, kOsDesktop, + FEATURE_VALUE_TYPE(features::kCdmStorageDatabaseMigration)}, #endif // BUILDFLAG(ENABLE_LIBRARY_CDMS) #if BUILDFLAG(IS_ANDROID) @@ -11186,6 +11301,14 @@ flag_descriptions::kObservableAPIDescription, kOsAll, FEATURE_VALUE_TYPE(blink::features::kObservableAPI)}, +#if BUILDFLAG(IS_ANDROID) + {"android-hub", flag_descriptions::kAndroidHubName, + flag_descriptions::kAndroidHubDescription, kOsAndroid, + FEATURE_WITH_PARAMS_VALUE_TYPE(chrome::android::kAndroidHub, + kAndroidHubVariations, + "AndroidHub")}, +#endif // !BUILDFLAG(IS_ANDROID) + // NOTE: Adding a new flag requires adding a corresponding entry to enum // "LoginCustomFlags" in tools/metrics/histograms/enums.xml. See "Flag // Histograms" in tools/metrics/histograms/README.md (run the
diff --git a/chrome/browser/android/auxiliary_search/auxiliary_search_provider_browsertest.cc b/chrome/browser/android/auxiliary_search/auxiliary_search_provider_browsertest.cc index bead85e3..f21ab07f 100644 --- a/chrome/browser/android/auxiliary_search/auxiliary_search_provider_browsertest.cc +++ b/chrome/browser/android/auxiliary_search/auxiliary_search_provider_browsertest.cc
@@ -15,6 +15,7 @@ #include "chrome/test/base/android/android_browser_test.h" #include "chrome/test/base/chrome_test_utils.h" #include "content/public/test/browser_test.h" +#include "content/public/test/test_utils.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "url/gurl.h" @@ -33,6 +34,7 @@ auxiliary_search_provider_ = std::make_unique<AuxiliarySearchProvider>(profile()); PersistedTabDataAndroid::OnDeferredStartup(); + content::RunAllTasksUntilIdle(); } content::WebContents* web_contents() {
diff --git a/chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.cc b/chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.cc new file mode 100644 index 0000000..9c2e0035f --- /dev/null +++ b/chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.cc
@@ -0,0 +1,39 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.h" + +#include "chrome/android/chrome_jni_headers/SolidColorSceneLayer_jni.h" + +namespace android { + +SolidColorSceneLayer::SolidColorSceneLayer( + JNIEnv* env, + const base::android::JavaRef<jobject>& jobj) + : SceneLayer(env, jobj), background_color_(SK_ColorWHITE) {} + +SolidColorSceneLayer::~SolidColorSceneLayer() = default; + +bool SolidColorSceneLayer::ShouldShowBackground() { + return true; +} + +SkColor SolidColorSceneLayer::GetBackgroundColor() { + return background_color_; +} + +void SolidColorSceneLayer::SetBackgroundColor(JNIEnv* env, + jint background_color) { + background_color_ = static_cast<SkColor>(background_color); +} + +static jlong JNI_SolidColorSceneLayer_Init( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& jobj) { + // This binds to the Java jobject and gives it ownership. + SolidColorSceneLayer* scene_layer = new SolidColorSceneLayer(env, jobj); + return reinterpret_cast<intptr_t>(scene_layer); +} + +} // namespace android
diff --git a/chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.h b/chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.h new file mode 100644 index 0000000..60b772eeb --- /dev/null +++ b/chrome/browser/android/compositor/scene_layer/solid_color_scene_layer.h
@@ -0,0 +1,35 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_SOLID_COLOR_SCENE_LAYER_H_ +#define CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_SOLID_COLOR_SCENE_LAYER_H_ + +#include "base/android/scoped_java_ref.h" +#include "chrome/browser/ui/android/layouts/scene_layer.h" +#include "third_party/skia/include/core/SkColor.h" + +namespace android { + +// A SceneLayer to render a solid color. +class SolidColorSceneLayer : public SceneLayer { + public: + SolidColorSceneLayer(JNIEnv* env, + const base::android::JavaRef<jobject>& jobj); + ~SolidColorSceneLayer() override; + + SolidColorSceneLayer(const SolidColorSceneLayer&) = delete; + SolidColorSceneLayer& operator=(const SolidColorSceneLayer&) = delete; + + bool ShouldShowBackground() override; + SkColor GetBackgroundColor() override; + + void SetBackgroundColor(JNIEnv* env, jint background_color); + + private: + SkColor background_color_; +}; + +} // namespace android + +#endif // CHROME_BROWSER_ANDROID_COMPOSITOR_SCENE_LAYER_SOLID_COLOR_SCENE_LAYER_H_
diff --git a/chrome/browser/android/persisted_tab_data/persisted_tab_data_android_browsertest.cc b/chrome/browser/android/persisted_tab_data/persisted_tab_data_android_browsertest.cc index 438105c..538c0cca 100644 --- a/chrome/browser/android/persisted_tab_data/persisted_tab_data_android_browsertest.cc +++ b/chrome/browser/android/persisted_tab_data/persisted_tab_data_android_browsertest.cc
@@ -15,6 +15,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/test_utils.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" @@ -174,8 +175,12 @@ IN_PROC_BROWSER_TEST_F(PersistedTabDataAndroidBrowserTest, TestCachedCallbacks) { OnDeferredStartup(); - FooPersistedTabDataAndroid foo_persisted_tab_data_android(tab_android()); - foo_persisted_tab_data_android.SetValue(INITIAL_VALUE); + content::RunAllTasksUntilIdle(); + + FooPersistedTabDataAndroid* foo_persisted_tab_data_android = + static_cast<FooPersistedTabDataAndroid*>(tab_android()->GetUserData( + FooPersistedTabDataAndroid::UserDataKey())); + foo_persisted_tab_data_android->SetValue(INITIAL_VALUE); base::RunLoop run_loop; FooPersistedTabDataAndroid::From( @@ -214,6 +219,7 @@ another_tab_bar_persisted_tab_data_android.SetValue(false); base::RunLoop run_loop[4]; + int beginning_deferred_request_size = GetDeferredRequests()->size(); FooPersistedTabDataAndroid::From( tab_android(), base::BindOnce( [](base::OnceClosure done, @@ -229,7 +235,8 @@ }, run_loop[1].QuitClosure())); // Requests should be stored for deferred startup. - EXPECT_EQ(2u, GetDeferredRequests()->size()); + EXPECT_EQ(beginning_deferred_request_size + 2u, + GetDeferredRequests()->size()); OnDeferredStartup(); run_loop[0].Run(); run_loop[1].Run();
diff --git a/chrome/browser/android/persisted_tab_data/sensitivity_persisted_tab_data_android_browsertest.cc b/chrome/browser/android/persisted_tab_data/sensitivity_persisted_tab_data_android_browsertest.cc index 9abbc4f..ff61034 100644 --- a/chrome/browser/android/persisted_tab_data/sensitivity_persisted_tab_data_android_browsertest.cc +++ b/chrome/browser/android/persisted_tab_data/sensitivity_persisted_tab_data_android_browsertest.cc
@@ -12,6 +12,7 @@ #include "components/optimization_guide/core/page_content_annotations_common.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/test_utils.h" #include "net/dns/mock_host_resolver.h" #include "net/test/embedded_test_server/embedded_test_server.h" #include "url/gurl.h" @@ -40,6 +41,7 @@ host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(embedded_test_server()->Start()); PersistedTabDataAndroid::OnDeferredStartup(); + content::RunAllTasksUntilIdle(); } content::WebContents* web_contents() {
diff --git a/chrome/browser/android/signin/signin_manager_android.cc b/chrome/browser/android/signin/signin_manager_android.cc index 7f928a12..11397ac 100644 --- a/chrome/browser/android/signin/signin_manager_android.cc +++ b/chrome/browser/android/signin/signin_manager_android.cc
@@ -95,8 +95,9 @@ // All the Profile data has been wiped. Clear the last signed in username // as well, so that the next signin doesn't trigger the account // change dialog. - profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastGaiaId); - profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername); + profile_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastSyncingGaiaId); + profile_->GetPrefs()->ClearPref( + prefs::kGoogleServicesLastSyncingUsername); } origin_runner_->PostTask(FROM_HERE, std::move(callback_));
diff --git a/chrome/browser/ash/BUILD.gn b/chrome/browser/ash/BUILD.gn index b1d3f57..8daca868 100644 --- a/chrome/browser/ash/BUILD.gn +++ b/chrome/browser/ash/BUILD.gn
@@ -4120,6 +4120,7 @@ "//components/live_caption", "//components/live_caption:constants", "//components/live_caption:utils", + "//components/manta", "//components/metrics:serialization", "//components/metrics/structured:neutrino_logging", "//components/metrics/structured:neutrino_logging_util", @@ -5536,7 +5537,7 @@ "login/screens/reset_screen_unittest.cc", "login/screens/update_required_screen_unittest.cc", "login/screens/update_screen_unittest.cc", - "login/session/user_session_manager_test.cc", + "login/session/user_session_manager_unittest.cc", "login/signin/offline_signin_limiter_unittest.cc", "login/signin/signin_error_notifier_unittest.cc", "login/signin_partition_manager_unittest.cc",
diff --git a/chrome/browser/ash/arc/input_overlay/ui/edit_label.cc b/chrome/browser/ash/arc/input_overlay/ui/edit_label.cc index a1520bc..48fe52d9 100644 --- a/chrome/browser/ash/arc/input_overlay/ui/edit_label.cc +++ b/chrome/browser/ash/arc/input_overlay/ui/edit_label.cc
@@ -84,13 +84,8 @@ kGameControlsEditPenIcon, cros_tokens::kCrosSysHighlightShape) : ui::ImageModel()); - if (output_string.empty()) { - SetBackground(views::CreateThemedRoundedRectBackground( - cros_tokens::kCrosSysHighlightShape, - /*radius=*/8)); - } else { - SetTextLabel(output_string); - } + // Set text label by `output_string` even it is empty to clear the text label. + SetTextLabel(output_string); } void EditLabel::SetTextLabel(const std::u16string& text) {
diff --git a/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc b/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc index e6448d9..142a6984 100644 --- a/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc +++ b/chrome/browser/ash/arc/input_overlay/ui/edit_label_unittest.cc
@@ -20,6 +20,7 @@ #include "chrome/browser/ash/arc/input_overlay/ui/button_options_menu.h" #include "chrome/browser/ash/arc/input_overlay/ui/edit_label.h" #include "chrome/browser/ash/arc/input_overlay/ui/edit_labels.h" +#include "chrome/browser/ash/arc/input_overlay/ui/editing_list.h" #include "chrome/browser/ash/arc/input_overlay/ui/input_mapping_view.h" #include "chrome/browser/ash/arc/input_overlay/ui/name_tag.h" #include "ui/events/keycodes/keyboard_codes_posix.h" @@ -78,30 +79,35 @@ ButtonOptionsMenu* menu, const std::vector<ui::DomCode>& expected_code, const std::vector<std::u16string>& expected_text) { + auto* action = menu->action(); + auto* list_item = GetActionViewListItem(action); + EXPECT_TRUE(list_item); switch (action_type) { case ActionType::TAP: if (expected_code.empty()) { - EXPECT_TRUE(tap_action_->current_input()->keys().empty()); + EXPECT_TRUE(action->current_input()->keys().empty()); } else { - EXPECT_EQ(expected_code[0], tap_action_->current_input()->keys()[0]); + EXPECT_EQ(expected_code[0], action->current_input()->keys()[0]); } EXPECT_EQ(expected_text[0], - GetEditLabel(tap_action_list_item_, /*index=*/0)->GetText()); + GetEditLabel(list_item, /*index=*/0)->GetText()); EXPECT_EQ(expected_text[0], GetEditLabel(menu, /*index=*/0)->GetText()); - EXPECT_EQ(expected_text[0], - GetLabel(tap_action_->action_view(), /*index=*/0)->GetText()); + EXPECT_EQ(action->is_new() + ? (expected_text[0].empty() ? u"?" : expected_text[0]) + : expected_text[0], + GetLabel(action->action_view(), /*index=*/0)->GetText()); break; case ActionType::MOVE: for (size_t i = 0; i < kActionMoveKeysSize; i++) { - EXPECT_EQ(expected_code[i], move_action_->current_input()->keys()[i]); - EXPECT_EQ( - expected_text[i], - GetEditLabel(move_action_list_item_, /*index=*/i)->GetText()); + EXPECT_EQ(expected_code[i], action->current_input()->keys()[i]); + EXPECT_EQ(expected_text[i], + GetEditLabel(list_item, /*index=*/i)->GetText()); EXPECT_EQ(expected_text[i], GetEditLabel(menu, /*index=*/i)->GetText()); - EXPECT_EQ( - expected_text[i], - GetLabel(move_action_->action_view(), /*index=*/i)->GetText()); + EXPECT_EQ(action->is_new() + ? (expected_text[i].empty() ? u"?" : expected_text[i]) + : expected_text[i], + GetLabel(action->action_view(), /*index=*/i)->GetText()); } break; default: @@ -117,6 +123,43 @@ EXPECT_EQ(list_item_has_error, IsInErrorState(list_item)); } + void AddNewAction(ActionType action_type) { + controller_->AddNewAction(action_type); + } + + // Returns `ButtonOptionsMenu` if there is one shown. Otherwise, return + // nullptr; + ButtonOptionsMenu* GetButtonOptionsMenu() { + auto* menu_widget = controller_->button_options_widget_.get(); + if (!menu_widget) { + return nullptr; + } + return static_cast<ButtonOptionsMenu*>(menu_widget->GetContentsView()); + } + + ActionViewListItem* GetActionViewListItem(Action* action) { + views::View* scroll_content = editing_list_->scroll_content_; + DCHECK(scroll_content); + if (editing_list_->is_zero_state_) { + return nullptr; + } + for (auto* child : scroll_content->children()) { + auto* list_item = static_cast<ActionViewListItem*>(child); + if (list_item->action() == action) { + return list_item; + } + } + return nullptr; + } + + Action* GetAction(ButtonOptionsMenu* menu) { + if (!menu) { + return nullptr; + } + DCHECK(controller_); + return menu->action(); + } + private: // Checks if the name tag attached to `edit_labels` is in error state. bool IsNameTagInErrorState(EditLabels* edit_labels) { @@ -261,4 +304,34 @@ /*list_item_has_error=*/true); } +TEST_F(EditLabelTest, TestEditingNewAction) { + AddNewAction(ActionType::MOVE); + auto* menu = GetButtonOptionsMenu(); + EXPECT_TRUE(menu); + auto* action = GetAction(menu); + EXPECT_TRUE(action->is_new()); + CheckAction(ActionType::MOVE, menu, + {ui::DomCode::NONE, ui::DomCode::NONE, ui::DomCode::NONE, + ui::DomCode::NONE}, + {u"", u"", u"", u""}); + + auto* label0 = GetEditLabel(menu, /*index=*/0); + FocusOnLabel(label0); + TapKeyboardKeyOnEditLabel(label0, ui::VKEY_A); + EXPECT_TRUE(action->is_new()); + CheckAction(ActionType::MOVE, menu, + {ui::DomCode::US_A, ui::DomCode::NONE, ui::DomCode::NONE, + ui::DomCode::NONE}, + {u"a", u"", u"", u""}); + + auto* label1 = GetEditLabel(menu, /*index=*/1); + FocusOnLabel(label1); + TapKeyboardKeyOnEditLabel(label1, ui::VKEY_A); + EXPECT_TRUE(action->is_new()); + CheckAction(ActionType::MOVE, menu, + {ui::DomCode::NONE, ui::DomCode::US_A, ui::DomCode::NONE, + ui::DomCode::NONE}, + {u"", u"a", u"", u""}); +} + } // namespace arc::input_overlay
diff --git a/chrome/browser/ash/crosapi/local_printer_ash.cc b/chrome/browser/ash/crosapi/local_printer_ash.cc index b2e67ff..e1efcd5 100644 --- a/chrome/browser/ash/crosapi/local_printer_ash.cc +++ b/chrome/browser/ash/crosapi/local_printer_ash.cc
@@ -401,6 +401,18 @@ } } +void LocalPrinterAsh::OnLocalPrintersUpdated() { + CHECK(ash::features::IsLocalPrinterObservingEnabled()); + + Profile* profile = GetProfile(); + DCHECK(profile); + const std::vector<mojom::LocalDestinationInfoPtr> printers = + ConvertPrintersToMojom(GetLocalPrinters(profile)); + for (const auto& remote : local_printers_observer_remotes_) { + remote->OnLocalPrintersUpdated(mojo::Clone(printers)); + } +} + void LocalPrinterAsh::GetPrinters(GetPrintersCallback callback) { std::move(callback).Run( ConvertPrintersToMojom(GetLocalPrinters(GetProfile()))); @@ -686,6 +698,21 @@ std::move(callback).Run(); } +void LocalPrinterAsh::AddLocalPrintersObserver( + mojo::PendingRemote<mojom::LocalPrintersObserver> remote, + AddLocalPrintersObserverCallback callback) { + CHECK(ash::features::IsLocalPrinterObservingEnabled()); + + Profile* profile = GetProfile(); + DCHECK(profile); + ash::CupsPrintersManager* printers_manager = + ash::CupsPrintersManagerFactory::GetForBrowserContext(profile); + printers_manager->AddLocalPrintersObserver(this); + + local_printers_observer_remotes_.Add(std::move(remote)); + std::move(callback).Run(ConvertPrintersToMojom(GetLocalPrinters(profile))); +} + void LocalPrinterAsh::GetOAuthAccessToken( const std::string& printer_id, GetOAuthAccessTokenCallback callback) {
diff --git a/chrome/browser/ash/crosapi/local_printer_ash.h b/chrome/browser/ash/crosapi/local_printer_ash.h index 0bbd950..c4582ef 100644 --- a/chrome/browser/ash/crosapi/local_printer_ash.h +++ b/chrome/browser/ash/crosapi/local_printer_ash.h
@@ -13,6 +13,7 @@ #include "base/scoped_observation.h" #include "chrome/browser/ash/printing/cups_print_job.h" #include "chrome/browser/ash/printing/cups_print_job_manager.h" +#include "chrome/browser/ash/printing/cups_printers_manager.h" #include "chrome/browser/ash/printing/print_servers_manager.h" #include "chrome/browser/profiles/profile_manager_observer.h" #include "chromeos/crosapi/mojom/local_printer.mojom.h" @@ -44,7 +45,8 @@ class LocalPrinterAsh : public mojom::LocalPrinter, public ProfileManagerObserver, public ash::CupsPrintJobManager::Observer, - public ash::PrintServersManager::Observer { + public ash::PrintServersManager::Observer, + public ash::CupsPrintersManager::LocalPrintersObserver { public: LocalPrinterAsh(); LocalPrinterAsh(const LocalPrinterAsh&) = delete; @@ -93,6 +95,9 @@ void OnServerPrintersChanged( const std::vector<ash::PrinterDetector::DetectedPrinter>&) override; + // CupsPrintersManager::LocalPrintersObserver: + void OnLocalPrintersUpdated() override; + // crosapi::mojom::LocalPrinter: void GetPrinters(GetPrintersCallback callback) override; void GetCapability(const std::string& printer_id, @@ -120,6 +125,9 @@ void AddPrintJobObserver(mojo::PendingRemote<mojom::PrintJobObserver> remote, mojom::PrintJobSource source, AddPrintJobObserverCallback callback) override; + void AddLocalPrintersObserver( + mojo::PendingRemote<mojom::LocalPrintersObserver> remote, + AddLocalPrintersObserverCallback callback) override; void GetOAuthAccessToken(const std::string& printer_id, GetOAuthAccessTokenCallback callback) override; void GetIppClientInfo(const std::string& printer_id, @@ -154,6 +162,10 @@ // Remotes which observe only extension print jobs. mojo::RemoteSet<mojom::PrintJobObserver> extension_print_job_remotes_; + + // Remotes which observe local printer updates. + mojo::RemoteSet<mojom::LocalPrintersObserver> + local_printers_observer_remotes_; }; } // namespace crosapi
diff --git a/chrome/browser/ash/crosapi/local_printer_ash_unittest.cc b/chrome/browser/ash/crosapi/local_printer_ash_unittest.cc index 39dcebe..de20cca 100644 --- a/chrome/browser/ash/crosapi/local_printer_ash_unittest.cc +++ b/chrome/browser/ash/crosapi/local_printer_ash_unittest.cc
@@ -21,6 +21,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" +#include "base/test/test_future.h" #include "chrome/browser/ash/crosapi/test_local_printer_ash.h" #include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/browser/ash/printing/cups_printers_manager_factory.h" @@ -76,6 +77,9 @@ namespace { +using LocalPrintersCallback = base::OnceCallback<void( + std::vector<crosapi::mojom::LocalDestinationInfoPtr>)>; + constexpr char kPrinterUri[] = "http://localhost:80"; const AccountId kAffiliatedUserAccountId = AccountId::FromUserEmail("user@example.com"); @@ -180,6 +184,42 @@ ~FakePpdProvider() override = default; }; +class FakeLocalPrintersObserver : public crosapi::mojom::LocalPrintersObserver { + public: + FakeLocalPrintersObserver() = default; + ~FakeLocalPrintersObserver() override = default; + + mojo::PendingRemote<crosapi::mojom::LocalPrintersObserver> GenerateRemote() { + mojo::PendingRemote<crosapi::mojom::LocalPrintersObserver> remote; + receiver_.Bind(remote.InitWithNewPipeAndPassReceiver()); + return remote; + } + + // crosapi::mojom::LocalPrintersObserver: + void OnLocalPrintersUpdated( + std::vector<crosapi::mojom::LocalDestinationInfoPtr> printers) override { + for (const auto& printer : printers) { + crosapi::mojom::LocalDestinationInfoPtr local_printer = + crosapi::mojom::LocalDestinationInfo::New(); + local_printer->id = printer->id; + local_printers_.push_back(std::move(local_printer)); + } + + if (local_printers_callback_) { + std::move(local_printers_callback_).Run(mojo::Clone(local_printers_)); + } + } + + void GetLocalPrinters(LocalPrintersCallback callback) { + local_printers_callback_ = std::move(callback); + } + + private: + LocalPrintersCallback local_printers_callback_; + std::vector<crosapi::mojom::LocalDestinationInfoPtr> local_printers_; + mojo::Receiver<crosapi::mojom::LocalPrintersObserver> receiver_{this}; +}; + class TestLocalPrinterAshWithPrinterConfigurer : public TestLocalPrinterAsh { public: TestLocalPrinterAshWithPrinterConfigurer( @@ -233,6 +273,10 @@ // when using a service for print backend calls. virtual bool SupportFallback() = 0; + virtual std::vector<base::test::FeatureRefAndParams> FeaturesToEnable() { + return {}; + } + sync_preferences::TestingPrefServiceSyncable* GetPrefs() { return profile_.GetTestingPrefService(); } @@ -241,18 +285,22 @@ fake_user_manager_->AddUser( AccountId::FromUserEmail(TestingProfile::kDefaultProfileUserName)); + std::vector<base::test::FeatureRefAndParams> features_to_enable = + FeaturesToEnable(); + std::vector<base::test::FeatureRef> features_to_disable; #if BUILDFLAG(ENABLE_OOP_PRINTING) // Choose between running with local test runner or via a service. if (UseService()) { - feature_list_.InitAndEnableFeatureWithParameters( + features_to_enable.emplace_back(base::test::FeatureRefAndParams( features::kEnableOopPrintDrivers, {{ features::kEnableOopPrintDriversSandbox.name, - "true" }}); + "true" }})); } else { - feature_list_.InitWithFeatureState(features::kEnableOopPrintDrivers, - false); + features_to_disable.push_back(features::kEnableOopPrintDrivers); } #endif + feature_list_.InitWithFeaturesAndParameters(features_to_enable, + features_to_disable); sandboxed_test_backend_ = base::MakeRefCounted<TestPrintBackend>(); ppd_provider_ = base::MakeRefCounted<FakePpdProvider>(); @@ -371,6 +419,9 @@ return fake_user_manager_.Get(); } + protected: + FakeLocalPrintersObserver fake_local_printers_observer_; + private: user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> fake_user_manager_{std::make_unique<ash::FakeChromeUserManager>()}; @@ -410,6 +461,11 @@ bool UseService() override { return false; } bool SupportFallback() override { return false; } + + std::vector<base::test::FeatureRefAndParams> FeaturesToEnable() override { + return {base::test::FeatureRefAndParams( + ash::features::kLocalPrinterObserving, {})}; + } }; // Testing class to cover `LocalPrinterAsh` handling using either a @@ -1015,6 +1071,36 @@ EXPECT_EQ(absl::nullopt, username); } +// Verify the LocalPrintersObserver receives the full set of local printers +// when added or triggered. +TEST_F(LocalPrinterAshTest, LocalPrintersObserver) { + Printer saved_printer = + CreateTestPrinter("printer1", "saved", "description1"); + Printer enterprise_printer = + CreateEnterprisePrinter("printer2", "enterprise", "description2"); + Printer automatic_printer = + CreateTestPrinter("printer3", "automatic", "description3"); + + printers_manager().AddPrinter(saved_printer, PrinterClass::kSaved); + printers_manager().AddPrinter(enterprise_printer, PrinterClass::kEnterprise); + printers_manager().AddPrinter(automatic_printer, PrinterClass::kAutomatic); + + // Starting observation should return the 3 added printers. + local_printer_ash()->AddLocalPrintersObserver( + fake_local_printers_observer_.GenerateRemote(), + base::BindLambdaForTesting( + [&](std::vector<crosapi::mojom::LocalDestinationInfoPtr> printers) { + EXPECT_EQ(3u, printers.size()); + })); + + base::test::TestFuture<std::vector<crosapi::mojom::LocalDestinationInfoPtr>> + printers_future; + fake_local_printers_observer_.GetLocalPrinters(printers_future.GetCallback()); + + local_printer_ash()->OnLocalPrintersUpdated(); + EXPECT_EQ(3u, printers_future.Get().size()); +} + TEST(LocalPrinterAsh, ConfigToMojom) { ash::PrintServersConfig config; config.fetching_mode = crosapi::mojom::PrintServersConfig::
diff --git a/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.cc b/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.cc index 7a2c5cf7..b43a479 100644 --- a/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.cc +++ b/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.cc
@@ -8,8 +8,8 @@ namespace ash::eche_app { -EcheAppAccessibilityProviderProxy::EcheAppAccessibilityProviderProxy() = - default; +EcheAppAccessibilityProviderProxy::EcheAppAccessibilityProviderProxy() + : was_accessibility_enabled_(IsAccessibilityEnabled()) {} EcheAppAccessibilityProviderProxy::~EcheAppAccessibilityProviderProxy() = default; @@ -29,9 +29,17 @@ AccessibilityNotificationType::kToggleScreenMagnifier) { return; } - UpdateEnabledFeature(); + // Check if the state of accessibility has changed. + bool is_accessibility_enabled = IsAccessibilityEnabled(); + if (!is_accessibility_enabled == was_accessibility_enabled_) { + was_accessibility_enabled_ = is_accessibility_enabled; + if (accessibility_state_changed_callback_.has_value()) { + accessibility_state_changed_callback_->Run(is_accessibility_enabled); + } + } + if (event_details.notification_type == AccessibilityNotificationType::kToggleSpokenFeedback) { // TODO(b/265817788): Enable explore by touch on the phone so apps can @@ -68,6 +76,27 @@ return use_full_focus_mode_; } +bool EcheAppAccessibilityProviderProxy::IsAccessibilityEnabled() { + AccessibilityManager* accessibility_manager = AccessibilityManager::Get(); + + if (accessibility_manager) { + return accessibility_manager->IsFocusHighlightEnabled() || + accessibility_manager->IsSelectToSpeakEnabled() || + accessibility_manager->IsSpokenFeedbackEnabled() || + accessibility_manager->IsSwitchAccessEnabled(); + } + + const MagnificationManager* magnification_manager = + MagnificationManager::Get(); + + if (magnification_manager) { + return magnification_manager->IsDockedMagnifierEnabled() || + magnification_manager->IsMagnifierEnabled(); + } + + return false; +} + void EcheAppAccessibilityProviderProxy::OnViewTracked() { UpdateEnabledFeature(); AccessibilityManager* accessibility_manager = AccessibilityManager::Get(); @@ -79,6 +108,12 @@ } } +void EcheAppAccessibilityProviderProxy:: + SetAccessibilityEnabledStateChangedCallback( + base::RepeatingCallback<void(bool)> callback) { + accessibility_state_changed_callback_ = callback; +} + void EcheAppAccessibilityProviderProxy::UpdateEnabledFeature() { const AccessibilityManager* accessibility_manager = AccessibilityManager::Get();
diff --git a/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.h b/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.h index 996def0..5bd5569 100644 --- a/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.h +++ b/chrome/browser/ash/eche_app/eche_app_accessibility_provider_proxy.h
@@ -6,6 +6,7 @@ #define CHROME_BROWSER_ASH_ECHE_APP_ECHE_APP_ACCESSIBILITY_PROVIDER_PROXY_H_ #include "ash/webui/eche_app_ui/accessibility_provider.h" +#include "third_party/abseil-cpp//absl//types/optional.h" #include "chrome/browser/ash/accessibility/accessibility_manager.h" @@ -22,14 +23,20 @@ // Proxy Overrides bool UseFullFocusMode() override; + bool IsAccessibilityEnabled() override; ax::android::mojom::AccessibilityFilterType GetFilterType() override; void OnViewTracked() override; + void SetAccessibilityEnabledStateChangedCallback( + base::RepeatingCallback<void(bool)> callback) override; private: void UpdateEnabledFeature(); base::CallbackListSubscription accessibility_status_subscription_; bool use_full_focus_mode_ = false; + bool was_accessibility_enabled_; + absl::optional<base::RepeatingCallback<void(bool)>> + accessibility_state_changed_callback_; base::WeakPtrFactory<EcheAppAccessibilityProviderProxy> weak_ptr_factory_{ this}; };
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 index 1e50d897..34df9e3 100644 --- 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
@@ -92,10 +92,10 @@ ->FindPreference( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled) ->IsDefaultValue()); - EXPECT_TRUE( - profile->GetPrefs() - ->FindPreference(::first_party_sets::kFirstPartySetsOverrides) - ->IsDefaultValue()); + EXPECT_TRUE(profile->GetPrefs() + ->FindPreference( + ::first_party_sets::kRelatedWebsiteSetsOverrides) + ->IsDefaultValue()); loop.Quit(); return base::WrapUnique<KeyedService>( new ::first_party_sets::FirstPartySetsPolicyService(context)); @@ -121,10 +121,10 @@ ->FindPreference( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled) ->IsDefaultValue()); - EXPECT_TRUE( - profile->GetPrefs() - ->FindPreference(::first_party_sets::kFirstPartySetsOverrides) - ->IsDefaultValue()); + EXPECT_TRUE(profile->GetPrefs() + ->FindPreference( + ::first_party_sets::kRelatedWebsiteSetsOverrides) + ->IsDefaultValue()); // Check the expected value of FirstPartySetsEnabled the pref. EXPECT_EQ(profile->GetPrefs()->GetBoolean( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled), @@ -163,16 +163,16 @@ ->FindPreference( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled) ->IsDefaultValue()); - EXPECT_FALSE( - profile->GetPrefs() - ->FindPreference(::first_party_sets::kFirstPartySetsOverrides) - ->IsDefaultValue()); + EXPECT_FALSE(profile->GetPrefs() + ->FindPreference( + ::first_party_sets::kRelatedWebsiteSetsOverrides) + ->IsDefaultValue()); // Both prefs have the expected value. EXPECT_EQ(profile->GetPrefs()->GetBoolean( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled), true); EXPECT_TRUE(profile->GetPrefs()->GetDict( - ::first_party_sets::kFirstPartySetsOverrides) == + ::first_party_sets::kRelatedWebsiteSetsOverrides) == expected_overrides.GetDict()); loop.Quit(); return base::WrapUnique<KeyedService>(
diff --git a/chrome/browser/ash/input_method/editor_consent_enums.cc b/chrome/browser/ash/input_method/editor_consent_enums.cc index 1da23f2..b85302c 100644 --- a/chrome/browser/ash/input_method/editor_consent_enums.cc +++ b/chrome/browser/ash/input_method/editor_consent_enums.cc
@@ -21,7 +21,8 @@ return ConsentStatus::kPending; default: LOG(ERROR) << "Invalid consent status: " << status_value; - return ConsentStatus::kInvalid; + // For any of the invalid states, treat the consent status as unset. + return ConsentStatus::kUnset; } }
diff --git a/chrome/browser/ash/input_method/editor_consent_enums.h b/chrome/browser/ash/input_method/editor_consent_enums.h index a9131f6..60ed99f8 100644 --- a/chrome/browser/ash/input_method/editor_consent_enums.h +++ b/chrome/browser/ash/input_method/editor_consent_enums.h
@@ -25,19 +25,22 @@ // Defines the status of the consent which we ask the user to provide before // we can display the feature to them. +// Only append new entries to the end of the enum value list and do not reorder +// the enum value list to maintain compatibility with the integer values saved +// in the pref storage. enum class ConsentStatus : int { // User has agreed to consent by pressing "Yes/Agree" button to all dialogs // from the consent window. - kApproved, + kApproved = 0, // User has disagreed to consent by pressing "No/Disagree" button to any // dialog from the consent window. - kDeclined, + kDeclined = 1, // Invalid state of the consent result. - kInvalid, + kInvalid = 2, // No explicit consent to use the feature has been received yet. - kPending, + kPending = 3, // No request has been sent to users to collect their consent. - kUnset, + kUnset = 4, }; enum class EditorMode { kBlocked, kConsentNeeded, kRewrite, kWrite };
diff --git a/chrome/browser/ash/input_method/editor_text_query_provider.cc b/chrome/browser/ash/input_method/editor_text_query_provider.cc index d813b3f..bfab613f 100644 --- a/chrome/browser/ash/input_method/editor_text_query_provider.cc +++ b/chrome/browser/ash/input_method/editor_text_query_provider.cc
@@ -6,17 +6,17 @@ #include "base/notreached.h" #include "base/values.h" -#include "chrome/browser/browser_features.h" #include "chrome/browser/manta/manta_service.h" #include "chrome/browser/manta/manta_service_factory.h" #include "chrome/browser/manta/manta_status.h" #include "chromeos/ash/services/orca/public/mojom/orca_service.mojom.h" +#include "components/manta/features.h" namespace ash::input_method { namespace { std::unique_ptr<manta::OrcaProvider> CreateProvider(Profile* profile) { - if (!base::FeatureList::IsEnabled(::features::kMantaService)) { + if (!manta::features::IsMantaServiceEnabled()) { return nullptr; }
diff --git a/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc b/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc index 3486786..8ebe53e 100644 --- a/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc +++ b/chrome/browser/ash/login/app_mode/kiosk_launch_controller_unittest.cc
@@ -806,9 +806,7 @@ public: using AppState = KioskLaunchController::AppState; - KioskLaunchControllerUsingLacrosTest() - : fake_user_manager_(new FakeChromeUserManager()), - scoped_user_manager_(base::WrapUnique(fake_user_manager_.get())) { + KioskLaunchControllerUsingLacrosTest() { std::vector<base::test::FeatureRef> enabled = ash::standalone_browser::GetFeatureRefs(); enabled.push_back(::features::kWebKioskEnableLacros); @@ -822,8 +820,8 @@ profile_ = testing_profile_manager_.CreateTestingProfile("Default"); crosapi_manager_ = crosapi::CreateCrosapiManagerWithTestRegistry(); SetUpKioskAppId(); - fake_user_manager().AddWebKioskAppUser(kiosk_app_id().account_id.value()); - fake_user_manager().LoginUser(kiosk_app_id().account_id.value()); + fake_user_manager_->AddWebKioskAppUser(kiosk_app_id().account_id.value()); + fake_user_manager_->LoginUser(kiosk_app_id().account_id.value()); ASSERT_TRUE(crosapi::browser_util::IsLacrosEnabledInWebKioskSession()); keyboard_controller_client_ = @@ -920,16 +918,13 @@ return std::move(app_launcher); } - FakeChromeUserManager& fake_user_manager() { return *fake_user_manager_; } - content::BrowserTaskEnvironment task_environment_{ base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_{std::make_unique<ash::FakeChromeUserManager>()}; TestingProfileManager testing_profile_manager_{ TestingBrowserProcess::GetGlobal()}; raw_ptr<Profile, ExperimentalAsh> profile_; - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - fake_user_manager_; - user_manager::ScopedUserManager scoped_user_manager_; crosapi::FakeBrowserManager browser_manager_; std::unique_ptr<ChromeKeyboardControllerClientTestHelper>
diff --git a/chrome/browser/ash/login/demo_mode/demo_extensions_external_loader_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_extensions_external_loader_unittest.cc index e1c249bf..6e1b27a 100644 --- a/chrome/browser/ash/login/demo_mode/demo_extensions_external_loader_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_extensions_external_loader_unittest.cc
@@ -143,10 +143,10 @@ class DemoExtensionsExternalLoaderTest : public testing::Test { public: DemoExtensionsExternalLoaderTest() - : test_shared_loader_factory_( + : fake_user_manager_(std::make_unique<FakeChromeUserManager>()), + test_shared_loader_factory_( base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( - &test_url_loader_factory_)), - scoped_user_manager_(std::make_unique<FakeChromeUserManager>()) {} + &test_url_loader_factory_)) {} DemoExtensionsExternalLoaderTest(const DemoExtensionsExternalLoaderTest&) = delete; @@ -218,6 +218,9 @@ TestExternalProviderVisitor external_provider_visitor_; + user_manager::TypedScopedUserManager<FakeChromeUserManager> + fake_user_manager_; + std::unique_ptr<TestingProfile> profile_; network::TestURLLoaderFactory test_url_loader_factory_; @@ -232,8 +235,6 @@ data_decoder::test::InProcessDataDecoder in_process_data_decoder_; content::InProcessUtilityThreadHelper in_process_utility_thread_helper_; - - user_manager::ScopedUserManager scoped_user_manager_; }; TEST_F(DemoExtensionsExternalLoaderTest, NoDemoExtensionsConfig) { @@ -521,10 +522,7 @@ class ShouldCreateDemoExtensionsExternalLoaderTest : public testing::Test { public: ShouldCreateDemoExtensionsExternalLoaderTest() { - auto fake_user_manager = std::make_unique<FakeChromeUserManager>(); - user_manager_ = fake_user_manager.get(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); } ShouldCreateDemoExtensionsExternalLoaderTest( @@ -544,8 +542,8 @@ std::unique_ptr<TestingProfile> AddTestUser(const AccountId& account_id) { auto profile = std::make_unique<TestingProfile>(); profile->set_profile_name(account_id.GetUserEmail()); - user_manager_->AddUser(account_id); - user_manager_->LoginUser(account_id); + fake_user_manager_->AddUser(account_id); + fake_user_manager_->LoginUser(account_id); return profile; } @@ -554,13 +552,11 @@ demo_mode_test_helper_->InitializeSession(); } - // Owned by scoped_user_manager_. - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - user_manager_ = nullptr; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; private: content::BrowserTaskEnvironment task_environment_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; std::unique_ptr<DemoModeTestHelper> demo_mode_test_helper_; };
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 ca91e06b..619648e1 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
@@ -61,8 +61,7 @@ demo_resources_path_ = demo_mode_test_helper_->GetPreinstalledDemoResourcesPath(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::make_unique<FakeChromeUserManager>()); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); DemoModeResourcesRemover::RegisterLocalStatePrefs(local_state_.registry()); } @@ -114,38 +113,37 @@ }; void AddAndLogInUser(TestUserType type, DemoModeResourcesRemover* remover) { - FakeChromeUserManager* user_manager = - static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); user_manager::User* user = nullptr; switch (type) { case TestUserType::kRegular: - user = - user_manager->AddUser(AccountId::FromUserEmail("fake_user@test")); + user = fake_user_manager_->AddUser( + AccountId::FromUserEmail("fake_user@test")); break; case TestUserType::kRegularSecond: - user = - user_manager->AddUser(AccountId::FromUserEmail("fake_user_1@test")); + user = fake_user_manager_->AddUser( + AccountId::FromUserEmail("fake_user_1@test")); break; case TestUserType::kGuest: - user = user_manager->AddGuestUser(); + user = fake_user_manager_->AddGuestUser(); break; case TestUserType::kPublicAccount: - user = user_manager->AddPublicAccountUser( + user = fake_user_manager_->AddPublicAccountUser( AccountId::FromUserEmail("fake_user@test")); break; case TestUserType::kKiosk: - user = user_manager->AddKioskAppUser( + user = fake_user_manager_->AddKioskAppUser( AccountId::FromUserEmail("fake_user@test")); break; case TestUserType::kDerelictDemoKiosk: - user = user_manager->AddKioskAppUser(user_manager::DemoAccountId()); + user = + fake_user_manager_->AddKioskAppUser(user_manager::DemoAccountId()); break; } ASSERT_TRUE(user); - user_manager->LoginUser(user->GetAccountId()); - user_manager->SwitchActiveUser(user->GetAccountId()); + fake_user_manager_->LoginUser(user->GetAccountId()); + fake_user_manager_->SwitchActiveUser(user->GetAccountId()); remover->ActiveUserChanged(user); } @@ -172,7 +170,8 @@ private: base::FilePath demo_resources_path_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; }; class ManagedDemoModeResourcesRemoverTest
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc index 0fc5ea3..ec0eb6947 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
@@ -55,11 +55,11 @@ class DemoSessionTest : public testing::Test { public: DemoSessionTest() - : profile_manager_(std::make_unique<TestingProfileManager>( + : fake_user_manager_(std::make_unique<ash::FakeChromeUserManager>()), + profile_manager_(std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal())), browser_process_platform_part_test_api_( - g_browser_process->platform_part()), - scoped_user_manager_(std::make_unique<FakeChromeUserManager>()) { + g_browser_process->platform_part()) { cros_settings_test_helper_.InstallAttributes()->SetDemoMode(); } @@ -121,9 +121,7 @@ TestingProfile* LoginDemoUser() { const AccountId account_id( AccountId::FromUserEmailGaiaId("demo@test.com", "demo_user")); - FakeChromeUserManager* user_manager = - static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); - user_manager->AddPublicAccountUser(account_id); + fake_user_manager_->AddPublicAccountUser(account_id); auto prefs = std::make_unique<sync_preferences::TestingPrefServiceSyncable>(); @@ -132,7 +130,7 @@ account_id.GetUserEmail(), std::move(prefs), u"Test profile", /*avatar_id=*/1, TestingProfile::TestingFactories()); - user_manager->LoginUser(account_id); + fake_user_manager_->LoginUser(account_id); return profile; } @@ -142,12 +140,13 @@ std::unique_ptr<session_manager::SessionManager> session_manager_; std::unique_ptr<WallpaperControllerClientImpl> wallpaper_controller_client_; TestWallpaperController test_wallpaper_controller_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfileManager> profile_manager_; ScopedCrosSettingsTestHelper cros_settings_test_helper_; private: BrowserProcessPlatformPartTestApi browser_process_platform_part_test_api_; - user_manager::ScopedUserManager scoped_user_manager_; }; TEST_F(DemoSessionTest, StartForDeviceInDemoMode) {
diff --git a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_unittest.cc b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_unittest.cc index 6de3b88..9d1eda7 100644 --- a/chrome/browser/ash/login/easy_unlock/easy_unlock_service_unittest.cc +++ b/chrome/browser/ash/login/easy_unlock/easy_unlock_service_unittest.cc
@@ -196,6 +196,7 @@ TestingBrowserProcess::GetGlobal()->SetLocalState(&local_pref_service_); RegisterLocalState(local_pref_service_.registry()); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); auto test_other_remote_device = multidevice::RemoteDeviceRefBuilder() @@ -219,10 +220,6 @@ account_id_ = AccountId::FromUserEmail(profile_->GetProfileUserName()); - auto fake_chrome_user_manager = std::make_unique<FakeChromeUserManager>(); - fake_chrome_user_manager_ = fake_chrome_user_manager.get(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_chrome_user_manager)); SetPrimaryUserLoggedIn(); fake_lock_handler_ = std::make_unique<proximity_auth::FakeLockHandler>(); @@ -330,11 +327,10 @@ // destructed after TestingProfile. TestingPrefServiceSimple local_pref_service_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfile> profile_; AccountId account_id_; - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - fake_chrome_user_manager_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; const multidevice::RemoteDeviceRef test_local_device_; const multidevice::RemoteDeviceRef test_remote_device_smart_lock_host_; @@ -364,10 +360,10 @@ private: void SetPrimaryUserLoggedIn() { const user_manager::User* user = - fake_chrome_user_manager_->AddPublicAccountUser(account_id_); - fake_chrome_user_manager_->UserLoggedIn(account_id_, user->username_hash(), - false /* browser_restart */, - false /* is_child */); + fake_user_manager_->AddPublicAccountUser(account_id_); + fake_user_manager_->UserLoggedIn(account_id_, user->username_hash(), + false /* browser_restart */, + false /* is_child */); } }; @@ -382,7 +378,7 @@ TEST_F(EasyUnlockServiceTest, NotAllowedForEphemeralAccounts) { InitializeService(true /* should_initialize_all_dependencies */); - fake_chrome_user_manager_->set_current_user_ephemeral(true); + fake_user_manager_->set_current_user_ephemeral(true); EXPECT_FALSE(easy_unlock_service_->IsAllowed()); }
diff --git a/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc b/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc index 9540e5f..0c11905b 100644 --- a/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc +++ b/chrome/browser/ash/login/existing_user_controller_auto_login_unittest.cc
@@ -45,7 +45,7 @@ protected: ExistingUserControllerAutoLoginTest() : local_state_(TestingBrowserProcess::GetGlobal()), - scoped_user_manager_(std::make_unique<FakeChromeUserManager>()) { + fake_user_manager_(std::make_unique<FakeChromeUserManager>()) { auth_events_recorder_ = ash::AuthEventsRecorder::CreateForTesting(); } @@ -57,9 +57,7 @@ ON_CALL(*mock_login_display_host_, GetExistingUserController()) .WillByDefault(Return(existing_user_controller_.get())); - auto* user_manager = - static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); - user_manager->AddPublicAccountUser(auto_login_account_id_); + fake_user_manager_->AddPublicAccountUser(auto_login_account_id_); settings_helper_.ReplaceDeviceSettingsProviderWithStub(); @@ -143,7 +141,8 @@ // Required by ExistingUserController: FakeSessionManagerClient fake_session_manager_client_; ScopedCrosSettingsTestHelper settings_helper_; - user_manager::ScopedUserManager scoped_user_manager_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<ArcKioskAppManager> arc_kiosk_app_manager_; session_manager::SessionManager session_manager_;
diff --git a/chrome/browser/ash/login/existing_user_controller_base_test.cc b/chrome/browser/ash/login/existing_user_controller_base_test.cc index 3371315..bf84955 100644 --- a/chrome/browser/ash/login/existing_user_controller_base_test.cc +++ b/chrome/browser/ash/login/existing_user_controller_base_test.cc
@@ -4,7 +4,6 @@ #include "chrome/browser/ash/login/existing_user_controller_base_test.h" -#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/login/auth/auth_events_recorder.h" #include "components/user_manager/user_manager.h" @@ -13,13 +12,13 @@ ExistingUserControllerBaseTest::ExistingUserControllerBaseTest() : scoped_local_state_(TestingBrowserProcess::GetGlobal()), - scoped_user_manager_(std::make_unique<FakeChromeUserManager>()), + fake_user_manager_(std::make_unique<FakeChromeUserManager>()), auth_events_recorder_(ash::AuthEventsRecorder::CreateForTesting()) {} ExistingUserControllerBaseTest::~ExistingUserControllerBaseTest() = default; FakeChromeUserManager* ExistingUserControllerBaseTest::GetFakeUserManager() { - return static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); + return fake_user_manager_.Get(); } } // namespace ash
diff --git a/chrome/browser/ash/login/existing_user_controller_base_test.h b/chrome/browser/ash/login/existing_user_controller_base_test.h index 57b6393..fa1e473 100644 --- a/chrome/browser/ash/login/existing_user_controller_base_test.h +++ b/chrome/browser/ash/login/existing_user_controller_base_test.h
@@ -7,6 +7,7 @@ #include <memory> +#include "chrome/browser/ash/login/users/fake_chrome_user_manager.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "components/account_id/account_id.h" #include "components/user_manager/scoped_user_manager.h" @@ -15,7 +16,6 @@ namespace ash { -class FakeChromeUserManager; class AuthEventsRecorder; namespace { @@ -56,7 +56,8 @@ private: ScopedTestingLocalState scoped_local_state_; - const user_manager::ScopedUserManager scoped_user_manager_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<AuthEventsRecorder> auth_events_recorder_; };
diff --git a/chrome/browser/ash/login/lock/screen_locker_unittest.cc b/chrome/browser/ash/login/lock/screen_locker_unittest.cc index eb9b992a..3fcb2ba 100644 --- a/chrome/browser/ash/login/lock/screen_locker_unittest.cc +++ b/chrome/browser/ash/login/lock/screen_locker_unittest.cc
@@ -90,9 +90,7 @@ // Initialize SessionControllerClientImpl and dependencies: LoginState::Initialize(); - fake_user_manager_ = new FakeChromeUserManager; - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - base::WrapUnique(fake_user_manager_.get())); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); testing_profile_manager_ = std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal()); @@ -157,7 +155,7 @@ session_controller_client_.reset(); testing_profile_manager_.reset(); - scoped_user_manager_.reset(); + fake_user_manager_.Reset(); base::RunLoop().RunUntilIdle(); LoginState::Shutdown(); @@ -193,9 +191,8 @@ LoginScreenClientImpl login_screen_client_; // * SessionControllerClientImpl dependencies: - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - fake_user_manager_ = nullptr; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfileManager> testing_profile_manager_; raw_ptr<Profile, DanglingUntriaged | ExperimentalAsh> user_profile_ = nullptr;
diff --git a/chrome/browser/ash/login/reporting/lock_unlock_reporter_unittest.cc b/chrome/browser/ash/login/reporting/lock_unlock_reporter_unittest.cc index 4099d74..79b0ad6 100644 --- a/chrome/browser/ash/login/reporting/lock_unlock_reporter_unittest.cc +++ b/chrome/browser/ash/login/reporting/lock_unlock_reporter_unittest.cc
@@ -52,10 +52,7 @@ void Init() { chromeos::PowerManagerClient::InitializeFake(); SessionManagerClient::InitializeFake(); - auto user_manager = std::make_unique<FakeChromeUserManager>(); - user_manager_ = user_manager.get(); - user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(user_manager)); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); } void Shutdown() { chromeos::PowerManagerClient::Shutdown(); } @@ -66,13 +63,13 @@ std::unique_ptr<TestingProfile> CreateRegularUserProfile() { AccountId account_id = AccountId::FromUserEmail(kFakeEmail); - auto* const user = user_manager_->AddUser(account_id); + auto* const user = fake_user_manager_->AddUser(account_id); TestingProfile::Builder profile_builder; profile_builder.SetProfileName(user->GetAccountId().GetUserEmail()); auto profile = profile_builder.Build(); ProfileHelper::Get()->SetUserToProfileMappingForTesting(user, profile.get()); - user_manager_->LoginUser(user->GetAccountId(), true); + fake_user_manager_->LoginUser(user->GetAccountId(), true); return profile; } @@ -111,9 +108,8 @@ int GetReportCount() { return report_count_; } private: - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - user_manager_; - std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; content::BrowserTaskEnvironment task_environment_; LockUnlockRecord record_;
diff --git a/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc b/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc index fb5605f..78b30968 100644 --- a/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc +++ b/chrome/browser/ash/login/reporting/login_logout_reporter_unittest.cc
@@ -46,10 +46,7 @@ chromeos::PowerManagerClient::InitializeFake(); session_termination_manager_ = std::make_unique<SessionTerminationManager>(); - auto user_manager = std::make_unique<FakeChromeUserManager>(); - user_manager_ = user_manager.get(); - user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(user_manager)); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); } void Shutdown() { chromeos::PowerManagerClient::Shutdown(); } @@ -60,13 +57,13 @@ auto profile = profile_builder.Build(); ProfileHelper::Get()->SetUserToProfileMappingForTesting(user, profile.get()); - user_manager_->LoginUser(user->GetAccountId(), true); + fake_user_manager_->LoginUser(user->GetAccountId(), true); return profile; } std::unique_ptr<TestingProfile> CreateRegularUserProfile() { AccountId account_id = AccountId::FromUserEmail(user_email); - auto* const user = user_manager_->AddUser(account_id); + auto* const user = fake_user_manager_->AddUser(account_id); return CreateProfile(user); } @@ -74,12 +71,12 @@ AccountId account_id = AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( "managed_guest", policy::DeviceLocalAccount::TYPE_PUBLIC_SESSION)); - auto* const user = user_manager_->AddPublicAccountUser(account_id); + auto* const user = fake_user_manager_->AddPublicAccountUser(account_id); return CreateProfile(user); } std::unique_ptr<TestingProfile> CreateGuestProfile() { - auto* const user = user_manager_->AddGuestUser(); + auto* const user = fake_user_manager_->AddGuestUser(); return CreateProfile(user); } @@ -87,7 +84,7 @@ AccountId account_id = AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( "kiosk", policy::DeviceLocalAccount::TYPE_KIOSK_APP)); - auto* const user = user_manager_->AddKioskAppUser(account_id); + auto* const user = fake_user_manager_->AddKioskAppUser(account_id); return CreateProfile(user); } @@ -95,7 +92,7 @@ AccountId account_id = AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( "arc_kiosk", policy::DeviceLocalAccount::TYPE_ARC_KIOSK_APP)); - auto* const user = user_manager_->AddArcKioskAppUser(account_id); + auto* const user = fake_user_manager_->AddArcKioskAppUser(account_id); return CreateProfile(user); } @@ -103,7 +100,7 @@ AccountId account_id = AccountId::FromUserEmail(GenerateDeviceLocalAccountUserId( "webkiosk", policy::DeviceLocalAccount::TYPE_WEB_KIOSK_APP)); - auto* const user = user_manager_->AddWebKioskAppUser(account_id); + auto* const user = fake_user_manager_->AddWebKioskAppUser(account_id); return CreateProfile(user); } @@ -163,9 +160,8 @@ int GetReportCount() { return report_count_; } private: - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - user_manager_; - std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; content::BrowserTaskEnvironment task_environment_; std::unique_ptr<SessionTerminationManager> session_termination_manager_;
diff --git a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc index 32f82d5..47a89bc 100644 --- a/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc +++ b/chrome/browser/ash/login/saml/in_session_password_change_manager_unittest.cc
@@ -56,13 +56,9 @@ prefs::kSamlPasswordExpirationAdvanceWarningDays, kAdvanceWarningTime.InDays()); - std::unique_ptr<FakeChromeUserManager> fake_user_manager = - std::make_unique<FakeChromeUserManager>(); - fake_user_manager->AddUser(user_manager::StubAccountId()); - fake_user_manager->LoginUser(user_manager::StubAccountId()); - ASSERT_TRUE(fake_user_manager->GetPrimaryUser()); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + fake_user_manager_->AddUser(user_manager::StubAccountId()); + fake_user_manager_->LoginUser(user_manager::StubAccountId()); + ASSERT_TRUE(fake_user_manager_->GetPrimaryUser()); display_service_tester_ = std::make_unique<NotificationDisplayServiceTester>(profile_); @@ -99,10 +95,11 @@ content::BrowserTaskEnvironment test_environment_{ base::test::TaskEnvironment::MainThreadType::UI, base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_{std::make_unique<ash::FakeChromeUserManager>()}; TestingProfileManager profile_manager_{TestingBrowserProcess::GetGlobal()}; raw_ptr<TestingProfile, ExperimentalAsh> profile_; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; std::unique_ptr<NotificationDisplayServiceTester> display_service_tester_; std::unique_ptr<InSessionPasswordChangeManager> manager_; };
diff --git a/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc b/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc index d1d2fa3..15fd87c 100644 --- a/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc +++ b/chrome/browser/ash/login/saml/in_session_password_sync_manager_unittest.cc
@@ -64,13 +64,12 @@ content::BrowserTaskEnvironment test_environment_{ base::test::TaskEnvironment::MainThreadType::UI, base::test::TaskEnvironment::TimeSource::MOCK_TIME}; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_{std::make_unique<ash::FakeChromeUserManager>()}; TestingProfileManager profile_manager_{TestingBrowserProcess::GetGlobal()}; raw_ptr<TestingProfile, ExperimentalAsh> primary_profile_ = nullptr; raw_ptr<TestingProfile, ExperimentalAsh> secondary_profile_ = nullptr; - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - user_manager_ = nullptr; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; std::unique_ptr<MockLockHandler> lock_handler_; std::unique_ptr<InSessionPasswordSyncManager> manager_; base::test::ScopedFeatureList feature_list_; @@ -81,13 +80,6 @@ : manager_(nullptr) { UserDataAuthClient::InitializeFake(); - std::unique_ptr<FakeChromeUserManager> fake_user_manager = - std::make_unique<FakeChromeUserManager>(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); - - user_manager_ = - static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); known_user_ = std::make_unique<user_manager::KnownUser>( g_browser_process->local_state()); } @@ -102,17 +94,17 @@ primary_profile_ = profile_manager_.CreateTestingProfile("test1"); secondary_profile_ = profile_manager_.CreateTestingProfile("test2"); - user_manager_->AddUserWithAffiliationAndTypeAndProfile( + fake_user_manager_->AddUserWithAffiliationAndTypeAndProfile( saml_login_account_id1_, /* is_affiliated = */ false, user_manager::UserType::USER_TYPE_REGULAR, primary_profile_); - user_manager_->AddUserWithAffiliationAndTypeAndProfile( + fake_user_manager_->AddUserWithAffiliationAndTypeAndProfile( saml_login_account_id2_, /* is_affiliated = */ false, user_manager::UserType::USER_TYPE_REGULAR, secondary_profile_); - user_manager_->AddUser(saml_login_account_id2_); - user_manager_->LoginUser(saml_login_account_id1_); + fake_user_manager_->AddUser(saml_login_account_id2_); + fake_user_manager_->LoginUser(saml_login_account_id1_); // ActiveUser in FakeChromeUserManager needs to be set explicitly. - user_manager_->SwitchActiveUser(saml_login_account_id1_); - ASSERT_TRUE(user_manager_->GetActiveUser()); + fake_user_manager_->SwitchActiveUser(saml_login_account_id1_); + ASSERT_TRUE(fake_user_manager_->GetActiveUser()); } void InSessionPasswordSyncManagerTest::TearDown() { @@ -155,7 +147,7 @@ prefs::kLockScreenReauthenticationEnabled, true); CreateInSessionSyncManager(); UnlockScreen(); - user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); + fake_user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); manager_->MaybeForceReauthOnLockScreen( InSessionPasswordSyncManager::ReauthenticationReason::kPolicy); EXPECT_EQ(InSessionReauthReason(), @@ -167,7 +159,7 @@ prefs::kLockScreenReauthenticationEnabled, true); CreateInSessionSyncManager(); UnlockScreen(); - user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); + fake_user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); manager_->MaybeForceReauthOnLockScreen( InSessionPasswordSyncManager::ReauthenticationReason::kPolicy); manager_->MaybeForceReauthOnLockScreen( @@ -187,7 +179,7 @@ proximity_auth::mojom::AuthType::ONLINE_SIGN_IN, std::u16string())) .Times(1); - user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); + fake_user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); manager_->MaybeForceReauthOnLockScreen( InSessionPasswordSyncManager::ReauthenticationReason::kPolicy); EXPECT_EQ(InSessionReauthReason(), @@ -208,7 +200,7 @@ std::u16string())) .Times(1); EXPECT_CALL(*lock_handler_, Unlock(saml_login_account_id1_)).Times(0); - user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); + fake_user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); manager_->MaybeForceReauthOnLockScreen( InSessionPasswordSyncManager::ReauthenticationReason::kPolicy); EXPECT_EQ(InSessionReauthReason(), @@ -238,7 +230,7 @@ std::u16string())) .Times(1); EXPECT_CALL(*lock_handler_, Unlock(saml_login_account_id1_)).Times(1); - user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); + fake_user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); test_environment_.FastForwardBy(kSamlOnlineShortDelay); manager_->MaybeForceReauthOnLockScreen( InSessionPasswordSyncManager::ReauthenticationReason::kPolicy); @@ -264,7 +256,7 @@ std::u16string())) .Times(1); EXPECT_CALL(*lock_handler_, Unlock(saml_login_account_id1_)).Times(1); - user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); + fake_user_manager_->SaveForceOnlineSignin(saml_login_account_id1_, true); manager_->MaybeForceReauthOnLockScreen( InSessionPasswordSyncManager::ReauthenticationReason::kInvalidToken); EXPECT_EQ(
diff --git a/chrome/browser/ash/login/saml/password_sync_token_login_checker_unittest.cc b/chrome/browser/ash/login/saml/password_sync_token_login_checker_unittest.cc index fc2d711c..c362eaed 100644 --- a/chrome/browser/ash/login/saml/password_sync_token_login_checker_unittest.cc +++ b/chrome/browser/ash/login/saml/password_sync_token_login_checker_unittest.cc
@@ -43,24 +43,19 @@ ScopedTestingLocalState scoped_local_state_; std::unique_ptr<net::BackoffEntry> sync_token_retry_backoff_; - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - user_manager_ = nullptr; - std::unique_ptr<user_manager::ScopedUserManager> scoped_user_manager_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<PasswordSyncTokenLoginChecker> checker_; }; PasswordSyncTokenLoginCheckerTest::PasswordSyncTokenLoginCheckerTest() : scoped_local_state_(TestingBrowserProcess::GetGlobal()) { - auto fake_user_manager = std::make_unique<FakeChromeUserManager>(); - scoped_user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); sync_token_retry_backoff_ = std::make_unique<net::BackoffEntry>( &PasswordSyncTokenCheckersCollection::kFetchTokenRetryBackoffPolicy); - user_manager_ = - static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); - user_manager_->AddUser(saml_login_account_id_); - user_manager_->SwitchActiveUser(saml_login_account_id_); + fake_user_manager_->AddUser(saml_login_account_id_); + fake_user_manager_->SwitchActiveUser(saml_login_account_id_); } void PasswordSyncTokenLoginCheckerTest::CreatePasswordSyncTokenLoginChecker() { @@ -81,8 +76,8 @@ CreatePasswordSyncTokenLoginChecker(); checker_->CheckForPasswordNotInSync(); OnTokenVerified(true); - EXPECT_FALSE( - user_manager_->FindUser(saml_login_account_id_)->force_online_signin()); + EXPECT_FALSE(fake_user_manager_->FindUser(saml_login_account_id_) + ->force_online_signin()); test_environment_.FastForwardBy(kSamlTokenDelay); EXPECT_TRUE(checker_->IsCheckPending()); } @@ -91,8 +86,8 @@ CreatePasswordSyncTokenLoginChecker(); checker_->CheckForPasswordNotInSync(); OnTokenVerified(false); - EXPECT_TRUE( - user_manager_->FindUser(saml_login_account_id_)->force_online_signin()); + EXPECT_TRUE(fake_user_manager_->FindUser(saml_login_account_id_) + ->force_online_signin()); test_environment_.FastForwardBy(kSamlTokenDelay); EXPECT_FALSE(checker_->IsCheckPending()); }
diff --git a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc index 2ad4e641..9fd5ffd 100644 --- a/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc +++ b/chrome/browser/ash/login/screens/arc_vm_data_migration_screen_unittest.cc
@@ -176,6 +176,8 @@ wizard_context_ = std::make_unique<WizardContext>(); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); + // Set up a primary profile. profile_manager_ = std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal()); @@ -183,11 +185,8 @@ profile_ = profile_manager_->CreateTestingProfile(kProfileName); const AccountId account_id = AccountId::FromUserEmailGaiaId(profile_->GetProfileUserName(), kGaiaId); - auto fake_user_manager = std::make_unique<FakeChromeUserManager>(); - fake_user_manager->AddUser(account_id); - fake_user_manager->LoginUser(account_id); - user_manager_ = std::make_unique<user_manager::ScopedUserManager>( - std::move(fake_user_manager)); + fake_user_manager_->AddUser(account_id); + fake_user_manager_->LoginUser(account_id); DCHECK(ash::ProfileHelper::IsPrimaryProfile(profile_)); // Set the default states. They can be overwritten by individual test cases. @@ -215,11 +214,12 @@ screen_.reset(); view_.reset(); - user_manager_.reset(); profile_manager_->DeleteTestingProfile(kProfileName); profile_ = nullptr; profile_manager_.reset(); + fake_user_manager_.Reset(); + wizard_context_.reset(); ArcVmDataMigratorClient::Shutdown(); @@ -288,10 +288,11 @@ base::SimpleTestTickClock tick_clock_; std::unique_ptr<WizardContext> wizard_context_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfileManager> profile_manager_; raw_ptr<TestingProfile, DanglingUntriaged | ExperimentalAsh> profile_ = nullptr; // Owned by |profile_manager_|. - std::unique_ptr<user_manager::ScopedUserManager> user_manager_; std::unique_ptr<TestArcVmDataMigrationScreen> screen_; std::unique_ptr<FakeArcVmDataMigrationScreenView> view_;
diff --git a/chrome/browser/ash/login/screens/network_screen.cc b/chrome/browser/ash/login/screens/network_screen.cc index 768b23f2..506670a6 100644 --- a/chrome/browser/ash/login/screens/network_screen.cc +++ b/chrome/browser/ash/login/screens/network_screen.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" #include "chrome/browser/ash/login/helper.h" #include "chrome/browser/ash/login/oobe_screen.h" +#include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ash/login/wizard_context.h" #include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ui/webui/ash/login/network_screen_handler.h" @@ -18,6 +19,7 @@ #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/network/network_handler.h" #include "chromeos/ash/components/network/network_state_handler.h" +#include "chromeos/ash/components/network/technology_state_controller.h" #include "ui/base/l10n/l10n_util.h" namespace ash { @@ -64,10 +66,19 @@ } void NetworkScreen::ShowImpl() { - Refresh(); - if (view_) - view_->Show(); + if (!view_) { + return; + } + // In OOBE all physical network technologies should be enabled, so the user is + // able to select any of the available networks on the device. Enabled + // technologies should not be changed if network screen is shown outside of + // OOBE. Right now NetworkScreen is only used in the beginning of OOBE. + TechnologyStateController* controller = + NetworkHandler::Get()->technology_state_controller(); + controller->SetTechnologiesEnabled(NetworkTypePattern::Physical(), true, + network_handler::ErrorCallback()); + Refresh(); // QuickStart should not be enabled for Demo mode or OS Install flows if (features::IsOobeQuickStartEnabled() && !DemoSetupController::IsOobeDemoSetupFlowInProgress() && @@ -79,6 +90,7 @@ base::BindOnce(&NetworkScreen::SetQuickStartButtonVisibility, weak_ptr_factory_.GetWeakPtr())); } + view_->Show(); } void NetworkScreen::HideImpl() { @@ -148,28 +160,30 @@ } void NetworkScreen::OnConnectionTimeout() { - StopWaitingForConnection(network_id_); if (!network_state_helper_->IsConnected() && view_) { // Show error bubble. view_->ShowError(l10n_util::GetStringFUTF16( IDS_NETWORK_SELECTION_ERROR, l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_OS_NAME), network_id_)); } + StopWaitingForConnection(network_id_); } void NetworkScreen::UpdateStatus() { bool is_connected = network_state_helper_->IsConnected(); - if (view_ && is_connected) + if (view_ && is_connected) { view_->ClearErrors(); + } std::u16string network_name = network_state_helper_->GetCurrentNetworkName(); - if (is_connected) + if (is_connected) { StopWaitingForConnection(network_name); - else if (network_state_helper_->IsConnecting()) + } else if (network_state_helper_->IsConnecting()) { WaitForConnection(network_name); - else + } else { StopWaitingForConnection(network_id_); + } } void NetworkScreen::StopWaitingForConnection(const std::u16string& network_id) { @@ -185,8 +199,9 @@ // Automatically continue if the device is connected to Ethernet for the first // time in this session. - if (UpdateStatusIfConnectedToEthernet()) + if (UpdateStatusIfConnectedToEthernet()) { return; + } // Automatically continue if we are using Zero-Touch Hands-Off Enrollment. if (is_connected && continue_attempts_ == 0 && @@ -206,16 +221,18 @@ } void NetworkScreen::OnBackButtonClicked() { - if (view_) + if (view_) { view_->ClearErrors(); + } exit_callback_.Run(Result::BACK); } void NetworkScreen::OnContinueButtonClicked() { ++continue_attempts_; - if (view_) + if (view_) { view_->ClearErrors(); + } if (network_state_helper_->IsConnected()) { NotifyOnConnection();
diff --git a/chrome/browser/ash/login/screens/network_screen_browsertest.cc b/chrome/browser/ash/login/screens/network_screen_browsertest.cc index 2c01454..0e8145c6 100644 --- a/chrome/browser/ash/login/screens/network_screen_browsertest.cc +++ b/chrome/browser/ash/login/screens/network_screen_browsertest.cc
@@ -9,6 +9,7 @@ #include "ash/constants/ash_switches.h" #include "base/command_line.h" #include "base/memory/raw_ptr.h" +#include "base/strings/utf_string_conversions.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" #include "chrome/browser/ash/login/helper.h" @@ -19,6 +20,8 @@ #include "chrome/browser/ash/login/test/oobe_screen_waiter.h" #include "chrome/browser/ash/login/wizard_controller.h" #include "chrome/browser/ui/webui/ash/login/network_screen_handler.h" +#include "chrome/grit/branded_strings.h" +#include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/network/network_state_test_helper.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" @@ -27,11 +30,13 @@ #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/cros_system_api/dbus/service_constants.h" +#include "ui/base/l10n/l10n_util.h" namespace ash { using ::testing::ElementsAre; +constexpr char kWifiNetworkName[] = "wifi-test-network"; constexpr char kCancelButton[] = "cancelButton"; constexpr char kLoadingDialog[] = "loadingDialog"; constexpr char kQuickStartButton[] = "quick-start-network-button"; @@ -44,8 +49,7 @@ constexpr test::UIPath kNextNetworkButtonPath = { NetworkScreenView::kScreenId.name /*"network-selection"*/, kNextButton}; const test::UIPath kNetworkScreenErrorSubtitile = { - NetworkScreenView::kScreenId.name /*"network-selection"*/, - "errorSubtitleText"}; + NetworkScreenView::kScreenId.name /*"network-selection"*/, "subtitleText"}; class NetworkScreenTest : public OobeBaseTest { public: @@ -80,12 +84,12 @@ network_helper_->device_test()->AddDevice( "/device/stub_wifi_device", shill::kTypeWifi, "stub_wifi_device"); network_helper_->service_test()->AddService( - "stub_wifi", "wifi_guid", "wifi-test-network", shill::kTypeWifi, + "stub_wifi", "wifi_guid", kWifiNetworkName, shill::kTypeWifi, shill::kStateIdle, true); network_helper_->service_test()->SetServiceProperty( "stub_wifi", shill::kConnectableProperty, base::Value(true)); network_helper_->profile_test()->AddService( - ShillProfileClient::GetSharedProfilePath(), "wifi-test-network"); + ShillProfileClient::GetSharedProfilePath(), kWifiNetworkName); // Network modification notifications are posted asynchronously. Wait until // idle to ensure observers are notified. @@ -99,12 +103,12 @@ network_helper_->device_test()->AddDevice( "/device/stub_wifi_device", shill::kTypeWifi, "stub_wifi_device"); network_helper_->service_test()->AddService( - "stub_wifi", "wifi_guid", "wifi-test-network", shill::kTypeWifi, + "stub_wifi", "wifi_guid", kWifiNetworkName, shill::kTypeWifi, shill::kStateAssociation, true); network_helper_->service_test()->SetServiceProperty( "stub_wifi", shill::kConnectableProperty, base::Value(true)); network_helper_->profile_test()->AddService( - ShillProfileClient::GetSharedProfilePath(), "wifi-test-network"); + ShillProfileClient::GetSharedProfilePath(), kWifiNetworkName); // Network modification notifications are posted asynchronously. Wait until // idle to ensure observers are notified. @@ -148,9 +152,13 @@ NetworkScreen* network_screen() { return network_screen_; } void WaitForErrorMessageToBeShown() { + auto expected_subtitle_text = l10n_util::GetStringFUTF8( + IDS_NETWORK_SELECTION_ERROR, + l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_OS_NAME), + base::UTF8ToUTF16(base::StringPiece(kWifiNetworkName))); test::OobeJS() - .CreateVisibilityWaiter(/*visibility=*/true, - kNetworkScreenErrorSubtitile) + .CreateElementTextContentWaiter(expected_subtitle_text, + kNetworkScreenErrorSubtitile) ->Wait(); } @@ -247,9 +255,9 @@ OobeScreenWaiter(NetworkScreenView::kScreenId).Wait(); SetUpDisconnectedWifiNetwork(); test::OobeJS() - .CreateWaiter(NetworkElementSelector("wifi-test-network") + " != null") + .CreateWaiter(NetworkElementSelector(kWifiNetworkName) + " != null") ->Wait(); - ClickOnWifiNetwork("wifi-test-network"); + ClickOnWifiNetwork(kWifiNetworkName); EXPECT_EQ(WaitForScreenExitResult(), NetworkScreen::Result::CONNECTED); }
diff --git a/chrome/browser/ash/login/session/user_session_manager_test.cc b/chrome/browser/ash/login/session/user_session_manager_unittest.cc similarity index 96% rename from chrome/browser/ash/login/session/user_session_manager_test.cc rename to chrome/browser/ash/login/session/user_session_manager_unittest.cc index b4d0f883..672d33c5 100644 --- a/chrome/browser/ash/login/session/user_session_manager_test.cc +++ b/chrome/browser/ash/login/session/user_session_manager_unittest.cc
@@ -42,7 +42,8 @@ class UserSessionManagerTest : public testing::Test { public: UserSessionManagerTest() - : profile_manager_(std::make_unique<TestingProfileManager>( + : fake_user_manager_(std::make_unique<FakeChromeUserManager>()), + profile_manager_(std::make_unique<TestingProfileManager>( TestingBrowserProcess::GetGlobal())) { static_assert( static_cast<int>( @@ -85,9 +86,7 @@ TestingProfile* LoginTestUser() { const AccountId account_id( AccountId::FromUserEmailGaiaId("demo@test.com", "demo_user")); - FakeChromeUserManager* user_manager = - static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); - test_user_ = user_manager->AddPublicAccountUser(account_id); + test_user_ = fake_user_manager_->AddPublicAccountUser(account_id); auto prefs = std::make_unique<sync_preferences::TestingPrefServiceSyncable>(); @@ -96,7 +95,7 @@ account_id.GetUserEmail(), std::move(prefs), u"Test profile", /*avatar_id=*/1, TestingProfile::TestingFactories()); - user_manager->LoginUser(account_id); + fake_user_manager_->LoginUser(account_id); return profile; } @@ -106,8 +105,8 @@ // constructor. content::BrowserTaskEnvironment task_environment_; - user_manager::ScopedUserManager scoped_user_manager_{ - std::make_unique<user_manager::FakeUserManager>()}; + user_manager::TypedScopedUserManager<FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfileManager> profile_manager_; raw_ptr<user_manager::User, ExperimentalAsh> test_user_;
diff --git a/chrome/browser/ash/login/signin/offline_signin_limiter_unittest.cc b/chrome/browser/ash/login/signin/offline_signin_limiter_unittest.cc index e6da57b..97184c59 100644 --- a/chrome/browser/ash/login/signin/offline_signin_limiter_unittest.cc +++ b/chrome/browser/ash/login/signin/offline_signin_limiter_unittest.cc
@@ -75,8 +75,8 @@ extensions::QuotaService::ScopedDisablePurgeForTesting disable_purge_for_testing_; - user_manager::ScopedUserManager scoped_user_manager_{ - std::make_unique<FakeChromeUserManager>()}; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfile> profile_; @@ -117,6 +117,7 @@ } void OfflineSigninLimiterTest::SetUp() { + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); profile_ = std::make_unique<TestingProfile>(); known_user_ = std::make_unique<user_manager::KnownUser>(local_state_.Get()); } @@ -127,24 +128,24 @@ } FakeChromeUserManager* OfflineSigninLimiterTest::GetFakeChromeUserManager() { - return static_cast<FakeChromeUserManager*>(user_manager::UserManager::Get()); + return fake_user_manager_.Get(); } user_manager::User* OfflineSigninLimiterTest::AddGaiaUser() { - auto* user_manager = GetFakeChromeUserManager(); - auto* user = user_manager->AddUser(test_gaia_account_id_); + auto* user = fake_user_manager_->AddUser(test_gaia_account_id_); profile_->set_profile_name(kTestGaiaUser); - user_manager->UserLoggedIn(user->GetAccountId(), user->username_hash(), - /*browser_restart=*/false, /*is_child=*/false); + fake_user_manager_->UserLoggedIn(user->GetAccountId(), user->username_hash(), + /*browser_restart=*/false, + /*is_child=*/false); return user; } user_manager::User* OfflineSigninLimiterTest::AddSAMLUser() { - auto* user_manager = GetFakeChromeUserManager(); - auto* user = user_manager->AddSamlUser(test_saml_account_id_); + auto* user = fake_user_manager_->AddSamlUser(test_saml_account_id_); profile_->set_profile_name(kTestSAMLUser); - user_manager->UserLoggedIn(user->GetAccountId(), user->username_hash(), - /*browser_restart=*/false, /*is_child=*/false); + fake_user_manager_->UserLoggedIn(user->GetAccountId(), user->username_hash(), + /*browser_restart=*/false, + /*is_child=*/false); return user; }
diff --git a/chrome/browser/ash/login/signin/signin_error_notifier_unittest.cc b/chrome/browser/ash/login/signin/signin_error_notifier_unittest.cc index d99ee48..838489c 100644 --- a/chrome/browser/ash/login/signin/signin_error_notifier_unittest.cc +++ b/chrome/browser/ash/login/signin/signin_error_notifier_unittest.cc
@@ -54,8 +54,7 @@ // Required to initialize TokenHandleUtil. ash::UserDataAuthClient::InitializeFake(); - user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( - std::make_unique<FakeChromeUserManager>()); + fake_user_manager_.Reset(std::make_unique<ash::FakeChromeUserManager>()); SigninErrorNotifierFactory::GetForProfile(GetProfile()); display_service_ = @@ -91,7 +90,8 @@ protected: std::unique_ptr<NotificationDisplayServiceTester> display_service_; - std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<IdentityTestEnvironmentProfileAdaptor> identity_test_env_profile_adaptor_; };
diff --git a/chrome/browser/ash/login/test/local_state_mixin.cc b/chrome/browser/ash/login/test/local_state_mixin.cc index fc0f63b..c9455c8 100644 --- a/chrome/browser/ash/login/test/local_state_mixin.cc +++ b/chrome/browser/ash/login/test/local_state_mixin.cc
@@ -29,9 +29,10 @@ // be updated, and do ephemeral user checks. // Given that user manager does not exist yet (by design), create a // temporary fake user manager instance. - auto user_manager = std::make_unique<user_manager::FakeUserManager>( - g_browser_process->local_state()); - user_manager::ScopedUserManager scoper(std::move(user_manager)); + auto scoped_user_manager = + user_manager::TypedScopedUserManager<user_manager::FakeUserManager>( + std::make_unique<user_manager::FakeUserManager>( + g_browser_process->local_state())); delegate_->SetUpLocalStateBase(); }
diff --git a/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc b/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc index 87dd531..689c0963 100644 --- a/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc +++ b/chrome/browser/ash/login/users/multi_profile_user_controller_unittest.cc
@@ -131,8 +131,7 @@ class MultiProfileUserControllerTest : public testing::Test { public: MultiProfileUserControllerTest() - : fake_user_manager_(new FakeChromeUserManager), - user_manager_enabler_(base::WrapUnique(fake_user_manager_.get())) { + : fake_user_manager_(std::make_unique<ash::FakeChromeUserManager>()) { for (size_t i = 0; i < std::size(kUsers); ++i) { test_users_.push_back(AccountId::FromUserEmail(kUsers[i])); } @@ -150,7 +149,8 @@ TestingBrowserProcess::GetGlobal()); ASSERT_TRUE(profile_manager_->SetUp()); controller_ = std::make_unique<MultiProfileUserController>( - TestingBrowserProcess::GetGlobal()->local_state(), fake_user_manager_); + TestingBrowserProcess::GetGlobal()->local_state(), + fake_user_manager_.Get()); for (const auto& account_id : test_users_) { fake_user_manager_->AddUser(account_id); @@ -208,10 +208,9 @@ TestingProfile* profile(int index) { return user_profiles_[index]; } content::BrowserTaskEnvironment task_environment_; + user_manager::TypedScopedUserManager<ash::FakeChromeUserManager> + fake_user_manager_; std::unique_ptr<TestingProfileManager> profile_manager_; - raw_ptr<FakeChromeUserManager, DanglingUntriaged | ExperimentalAsh> - fake_user_manager_; // Not owned - user_manager::ScopedUserManager user_manager_enabler_; std::unique_ptr<MultiProfileUserController> controller_; @@ -275,7 +274,7 @@ base::ScopedObservation<user_manager::UserManager, user_manager::UserManager::Observer> observation(&mock_observer); - observation.Observe(fake_user_manager_); + observation.Observe(fake_user_manager_.Get()); SetPrefBehavior(0, MultiUserSignInPolicy::kPrimaryOnly); SetCachedBehavior(0, MultiUserSignInPolicy::kUnrestricted); @@ -321,7 +320,7 @@ base::ScopedObservation<user_manager::UserManager, user_manager::UserManager::Observer> observation(&mock_observer); - observation.Observe(fake_user_manager_); + observation.Observe(fake_user_manager_.Get()); EXPECT_CALL(mock_observer, OnUserNotAllowed(testing::_)) .Times(testing::AnyNumber()); LoginUser(0);
diff --git a/chrome/browser/ash/login/users/user_manager_unittest.cc b/chrome/browser/ash/login/users/user_manager_unittest.cc index 6b51f9f..218cb91 100644 --- a/chrome/browser/ash/login/users/user_manager_unittest.cc +++ b/chrome/browser/ash/login/users/user_manager_unittest.cc
@@ -148,10 +148,17 @@ TestingBrowserProcess::GetGlobal()->SetProfileManager( std::make_unique<FakeProfileManager>(temp_dir_.GetPath())); - ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr); - + // TODO(crbug.com/1466777): UserManager must be initialized before + // ProfileManager to align with the production behavior, but it currently + // cannot do so since ProfileManager is initialized by ChromeUserManagerImpl + // constroctor if ProfileManager is not initialized yet so + // FakeProfileManager set in this test will be not reflected to UserManager. + // For now reset UserManager after ProfileManager until ProfileHelper + // related refactor is completed. ResetUserManager(); + ConciergeClient::InitializeFake(/*fake_cicerone_client=*/nullptr); + wallpaper_controller_client_ = std::make_unique< WallpaperControllerClientImpl>( std::make_unique<wallpaper_handlers::TestWallpaperFetcherDelegate>()); @@ -173,8 +180,7 @@ } ChromeUserManagerImpl* GetChromeUserManager() const { - return static_cast<ChromeUserManagerImpl*>( - user_manager::UserManager::Get()); + return static_cast<ChromeUserManagerImpl*>(user_manager_.Get()); } bool IsEphemeralAccountId(const AccountId& account_id) const { @@ -196,12 +202,9 @@ } void ResetUserManager() { - // Reset the UserManager singleton. - user_manager_enabler_.reset(); // Initialize the UserManager singleton to a fresh ChromeUserManagerImpl // instance. - user_manager_enabler_ = std::make_unique<user_manager::ScopedUserManager>( - ChromeUserManagerImpl::CreateChromeUserManager()); + user_manager_.Reset(ChromeUserManagerImpl::CreateChromeUserManager()); // ChromeUserManagerImpl ctor posts a task to reload policies. // Also ensure that all existing ongoing user manager tasks are completed. @@ -279,7 +282,7 @@ // local_state_ should be destructed after ProfileManager. std::unique_ptr<ScopedTestingLocalState> local_state_; - std::unique_ptr<user_manager::ScopedUserManager> user_manager_enabler_; + user_manager::TypedScopedUserManager<ChromeUserManager> user_manager_; base::ScopedTempDir temp_dir_; };
diff --git a/chrome/browser/ash/login/wizard_controller_browsertest.cc b/chrome/browser/ash/login/wizard_controller_browsertest.cc index 6667c0e..4ca8e57 100644 --- a/chrome/browser/ash/login/wizard_controller_browsertest.cc +++ b/chrome/browser/ash/login/wizard_controller_browsertest.cc
@@ -520,14 +520,14 @@ EXPECT_STREQ("en", icu::Locale::getDefault().getLanguage()); EXPECT_FALSE(base::i18n::IsRTL()); const std::u16string en_str = - l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE); + l10n_util::GetStringUTF16(IDS_UPDATE_STATUS_TITLE); RunSwitchLanguageTest("fr", "fr", true); EXPECT_EQ("fr", g_browser_process->GetApplicationLocale()); EXPECT_STREQ("fr", icu::Locale::getDefault().getLanguage()); EXPECT_FALSE(base::i18n::IsRTL()); const std::u16string fr_str = - l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE); + l10n_util::GetStringUTF16(IDS_UPDATE_STATUS_TITLE); EXPECT_NE(en_str, fr_str); @@ -536,7 +536,7 @@ EXPECT_STREQ("ar", icu::Locale::getDefault().getLanguage()); EXPECT_TRUE(base::i18n::IsRTL()); const std::u16string ar_str = - l10n_util::GetStringUTF16(IDS_NETWORK_SELECTION_TITLE); + l10n_util::GetStringUTF16(IDS_UPDATE_STATUS_TITLE); EXPECT_NE(fr_str, ar_str); }
diff --git a/chrome/browser/ash/login/wizard_controller_unittest.cc b/chrome/browser/ash/login/wizard_controller_unittest.cc index 9d7eeee..f24b14a 100644 --- a/chrome/browser/ash/login/wizard_controller_unittest.cc +++ b/chrome/browser/ash/login/wizard_controller_unittest.cc
@@ -270,6 +270,8 @@ base::test::TaskEnvironment::ThreadingMode::MULTIPLE_THREADS, base::test::TaskEnvironment::TimeSource::MOCK_TIME); + user_manager::TypedScopedUserManager<user_manager::FakeUserManager> + fake_user_manager_{std::make_unique<user_manager::FakeUserManager>()}; std::unique_ptr<TestingProfileManager> profile_manager_; raw_ptr<Profile> profile_ = nullptr; std::unique_ptr<ui::TestContextFactories> test_context_factories_; @@ -281,8 +283,6 @@ std::unique_ptr<NetworkHandlerTestHelper> network_handler_test_helper_; std::unique_ptr<ChromeKeyboardControllerClientTestHelper> chrome_keyboard_controller_client_test_helper_; - user_manager::ScopedUserManager user_manager_{ - std::make_unique<user_manager::FakeUserManager>()}; ScopedTestingCrosSettings settings_; KioskAppManager kiosk_app_manager_; ScopedStubInstallAttributes scoped_stub_install_attributes_;
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder.cc b/chrome/browser/ash/policy/core/device_policy_decoder.cc index 3e111e6..8543516 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder.cc
@@ -2324,6 +2324,17 @@ SetDeviceDlcPredownloadListPolicy( policy.device_dlc_predownload_list().value().entries(), policies); } + + if (policy.has_extended_fkeys_modifier()) { + const em::ExtendedFkeysModifierProto& container( + policy.extended_fkeys_modifier()); + if (container.has_modifier()) { + policies->Set(policy::key::kDeviceExtendedFkeysModifier, + POLICY_LEVEL_RECOMMENDED, POLICY_SCOPE_MACHINE, + POLICY_SOURCE_CLOUD, base::Value(container.modifier()), + nullptr); + } + } } } // namespace
diff --git a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc index dba7a6a..d9ef838 100644 --- a/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc +++ b/chrome/browser/ash/policy/core/device_policy_decoder_unittest.cc
@@ -708,4 +708,19 @@ /*expected_value=*/base::Value(true)); } +TEST_F(DevicePolicyDecoderTest, DeviceFkeysPolicy) { + em::ChromeDeviceSettingsProto device_policy; + + DecodeUnsetDevicePolicyTestHelper(device_policy, + key::kDeviceExtendedFkeysModifier); + + base::Value device_extended_fkeys_modifier(1); + device_policy.mutable_extended_fkeys_modifier()->set_modifier( + static_cast<em::ExtendedFkeysModifierProto::ExtendedFkeysModifier>( + device_extended_fkeys_modifier.GetInt())); + + DecodeDevicePolicyTestHelper(device_policy, key::kDeviceExtendedFkeysModifier, + std::move(device_extended_fkeys_modifier)); +} + } // namespace policy
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 b1e2ec2..e5d508e 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
@@ -3043,7 +3043,7 @@ em::DisplayInfo* display_info = fakeGraphicsStatus.add_displays(); display_info->set_resolution_width(1920 * i); display_info->set_resolution_height(1080 * i); - display_info->set_refresh_rate(60.0f * i); + display_info->set_refresh_rate(60 * i); display_info->set_is_internal(i == 1); }
diff --git a/chrome/browser/ash/preferences.cc b/chrome/browser/ash/preferences.cc index e9d7304..46d8334a 100644 --- a/chrome/browser/ash/preferences.cc +++ b/chrome/browser/ash/preferences.cc
@@ -81,6 +81,8 @@ #include "ui/base/ime/ash/extension_ime_util.h" #include "ui/base/ime/ash/ime_keyboard.h" #include "ui/base/ime/ash/input_method_manager.h" +#include "ui/events/ash/mojom/extended_fkeys_modifier.mojom-shared.h" +#include "ui/events/ash/mojom/extended_fkeys_modifier.mojom.h" #include "ui/events/ash/mojom/modifier_key.mojom.h" #include "ui/events/ash/pref_names.h" #include "ui/events/event_constants.h" @@ -345,6 +347,9 @@ // depending on whether an external keyboard is attached to a particular // device. registry->RegisterBooleanPref(prefs::kSendFunctionKeys, false); + registry->RegisterIntegerPref( + prefs::kExtendedFkeysModifier, + static_cast<int>(ui::mojom::ExtendedFkeysModifier::kDisabled)); registry->RegisterIntegerPref(prefs::kAltEventRemappedToRightClick, 0); registry->RegisterIntegerPref(prefs::kSearchEventRemappedToRightClick, 0);
diff --git a/chrome/browser/ash/scanning/lorgnette_scanner_manager_unittest.cc b/chrome/browser/ash/scanning/lorgnette_scanner_manager_unittest.cc index 46fd4aa..204e746a 100644 --- a/chrome/browser/ash/scanning/lorgnette_scanner_manager_unittest.cc +++ b/chrome/browser/ash/scanning/lorgnette_scanner_manager_unittest.cc
@@ -76,9 +76,9 @@ // Returns a zeroconf Scanner with the device name marked as |usable|. Scanner CreateZeroconfScanner(bool usable = true) { - return CreateSaneScanner("Test MX3100", - ZeroconfScannerDetector::kEsclsServiceType, "", - net::IPAddress(192, 168, 0, 3), 5, usable) + return CreateSaneScanner( + "Test MX3100", ZeroconfScannerDetector::kEsclsServiceType, "Test", + "MX3100", /*rs=*/"", net::IPAddress(192, 168, 0, 3), 5, usable) .value(); } @@ -87,16 +87,17 @@ Scanner CreateNonEsclEpsonZeroconfScanner(bool usable = true) { return CreateSaneScanner("EPSON TEST", ZeroconfScannerDetector::kGenericScannerServiceType, - "", net::IPAddress(192, 168, 0, 3), 5, usable) + "EPSON", "TEST", /*rs=*/"", + net::IPAddress(192, 168, 0, 3), 5, usable) .value(); } // Returns a zeroconf Scanner with an Epson name but ESCLs Service marked as // |usable|. Scanner CreateEsclEpsonZeroconfScanner(bool usable = true) { - return CreateSaneScanner("EPSON TEST", - ZeroconfScannerDetector::kEsclsServiceType, "", - net::IPAddress(192, 168, 0, 3), 5, usable) + return CreateSaneScanner( + "EPSON TEST", ZeroconfScannerDetector::kEsclsServiceType, "EPSON", + "TEST", /*rs=*/"", net::IPAddress(192, 168, 0, 3), 5, usable) .value(); } @@ -105,7 +106,8 @@ Scanner CreateScannerCustomName(const std::string& scanner_name, bool usable = true) { return CreateSaneScanner(scanner_name, - ZeroconfScannerDetector::kEsclsServiceType, "", + ZeroconfScannerDetector::kEsclsServiceType, + "Manufacturer", "Model", /*rs=*/"", net::IPAddress(192, 168, 0, 3), 5, usable) .value(); } @@ -405,7 +407,8 @@ // a scanner if it is not an Epson. TEST_F(LorgnetteScannerManagerTest, NonEsclNonEpsonZeroconfScanner) { absl::optional<Scanner> scanner = CreateSaneScanner( - "Test MX3100", ZeroconfScannerDetector::kGenericScannerServiceType, "", + "Test MX3100", ZeroconfScannerDetector::kGenericScannerServiceType, + /*manufacturer=*/"", /*model=*/"", /*rs=*/"", net::IPAddress(192, 168, 0, 3), 5, true); EXPECT_FALSE(scanner.has_value()); }
diff --git a/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc b/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc index 5a8da17f..a12f373 100644 --- a/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc +++ b/chrome/browser/ash/scanning/zeroconf_scanner_detector.cc
@@ -51,6 +51,9 @@ class ParsedMetadata { public: explicit ParsedMetadata(const ServiceDescription& service_description) { + // Preference is to use mfg/mdl for the manufacturer and model. If those + // are not present in the metadata, attempt to set them using ty. + std::string ty; for (const std::string& entry : service_description.metadata) { const base::StringPiece key_value(entry); const size_t equal_pos = key_value.find("="); @@ -59,19 +62,49 @@ const base::StringPiece key = key_value.substr(0, equal_pos); const base::StringPiece value = key_value.substr(equal_pos + 1); - if (key == "rs") + if (key == "rs") { rs_ = std::string(value); + } else if (key == "usb_MFG" || key == "mfg") { + manufacturer_ = value; + } else if (key == "usb_MDL" || key == "mdl") { + model_ = value; + } else if (key == "ty") { + ty = value; + } } + + // Both are already populated - nothing more needs to be done. + if (!manufacturer_.empty() && !model_.empty()) { + return; + } + + if (ty.empty()) { + return; + } + + // If either |manufacturer_| or |model_| are not provided, use |ty| to + // populate both. In this case, assume the first word in |ty| is the + // manufacturer and the rest is the model. + auto space = ty.find(" "); + manufacturer_ = ty.substr(0, space); + model_ = (space == std::string::npos) ? "" : ty.substr(space + 1); + // Trim whitespace here in case there are multiple spaces between + // manufacturer and model. + base::TrimWhitespaceASCII(model_, base::TRIM_ALL, &model_); } ParsedMetadata(const ParsedMetadata&) = delete; ParsedMetadata& operator=(const ParsedMetadata&) = delete; ~ParsedMetadata() = default; const absl::optional<std::string>& rs() const { return rs_; } + const std::string& manufacturer() const { return manufacturer_; } + const std::string& model() const { return model_; } private: // Used to construct the path for a device name URL. absl::optional<std::string> rs_; + std::string manufacturer_; + std::string model_; }; // Attempts to create a Scanner using the information in |service_description| @@ -96,6 +129,7 @@ << " scanner: " << service_description.instance_name(); return CreateSaneScanner(service_description.instance_name(), service_type, + metadata.manufacturer(), metadata.model(), metadata.rs(), service_description.ip_address, service_description.address.port()); }
diff --git a/chrome/browser/ash/scanning/zeroconf_scanner_detector_unittest.cc b/chrome/browser/ash/scanning/zeroconf_scanner_detector_unittest.cc index 7534fd3..73f1f50c 100644 --- a/chrome/browser/ash/scanning/zeroconf_scanner_detector_unittest.cc +++ b/chrome/browser/ash/scanning/zeroconf_scanner_detector_unittest.cc
@@ -35,6 +35,8 @@ MATCHER_P(ScannerIsEqual, expected_scanner, "") { return arg.display_name == expected_scanner.display_name && + arg.manufacturer == expected_scanner.manufacturer && + arg.model == expected_scanner.model && arg.device_names == expected_scanner.device_names && arg.ip_addresses == expected_scanner.ip_addresses; } @@ -87,6 +89,21 @@ return (std::hash<std::string>()(name) % 1000) + 1; } +// Similar to MakeExpectedScanner below except this allows the caller to specify +// a manufacturer and model. This can be used with MakeServiceDescription when +// the metadata is expected to contain a manufacturer and/or model. +Scanner MakeExpectedScanner(const std::string& name, + const std::string& service_type, + const std::string& manufacturer, + const std::string& model, + const absl::optional<std::string>& rs) { + const net::IPAddress ip_address = GetIPAddressFor(name); + const int port = GetPortFor(name); + auto scanner = CreateSaneScanner(name, service_type, manufacturer, model, rs, + ip_address, port); + return scanner.value(); +} + // This corresponds to MakeServiceDescription() below. Given the same name and // correct service type, this generates the expected Scanner that the // ZeroconfScannerDetector should create when it gets the ServiceDescription @@ -95,10 +112,8 @@ Scanner MakeExpectedScanner(const std::string& name, const std::string& service_type, const absl::optional<std::string>& rs) { - const net::IPAddress ip_address = GetIPAddressFor(name); - const int port = GetPortFor(name); - auto scanner = CreateSaneScanner(name, service_type, rs, ip_address, port); - return scanner.value(); + return MakeExpectedScanner(name, service_type, /*manufacturer=*/"", + /*model=*/"", rs); } // Merges all of the Scanners in |scanners| into a single Scanner. Used to @@ -119,6 +134,20 @@ return merged_scanner; } +// Similar to MakeServiceDescription below except the caller can add arbitrary +// |metadata|. +ServiceDescription MakeServiceDescription(const std::string& name, + const std::string& service_type, + std::vector<std::string> metadata) { + ServiceDescription service_description; + service_description.service_name = base::StrCat({name, ".", service_type}); + service_description.address.set_host(base::StrCat({name, ".local"})); + service_description.address.set_port(GetPortFor(name)); + service_description.ip_address = GetIPAddressFor(name); + service_description.metadata = std::move(metadata); + return service_description; +} + // Creates a deterministic ServiceDescription based on the service name and // type. See the note on MakeExpectedScanner() above. This must be kept in sync // with MakeExpectedScanner(). @@ -126,15 +155,11 @@ const std::string& name, const std::string& service_type, const absl::optional<std::string>& rs) { - ServiceDescription service_description; - service_description.service_name = base::StrCat({name, ".", service_type}); - service_description.address.set_host(base::StrCat({name, ".local"})); - service_description.address.set_port(GetPortFor(name)); - service_description.ip_address = GetIPAddressFor(name); + std::vector<std::string> metadata; if (rs.has_value()) { - service_description.metadata.push_back(base::StrCat({"rs=", rs.value()})); + metadata.push_back(base::StrCat({"rs=", rs.value()})); } - return service_description; + return MakeServiceDescription(name, service_type, std::move(metadata)); } } // namespace @@ -419,6 +444,136 @@ EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); } +// Test that metadata with just ty works. +TEST_F(ZeroconfScannerDetectorTest, MetadataTy) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + std::vector<std::string>{"ty=Manufacturer Model 123 "})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = { + MakeExpectedScanner("Scanner1", ZeroconfScannerDetector::kEsclServiceType, + "Manufacturer", "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Test that metadata with just mfg and mdl works. +TEST_F(ZeroconfScannerDetectorTest, MetadataMfgMdl) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"mfg=Real Manufacturer", "mdl=Model 123"})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = {MakeExpectedScanner( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + "Real Manufacturer", "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Test that metadata with ty and mfg works. Since both mfg and mdl are not +// present, mfg will not be used and ty will be used. +TEST_F(ZeroconfScannerDetectorTest, MetadataTyMfg) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"ty=Maker Model 123", "mfg=Bad-Manufacturer"})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = { + MakeExpectedScanner("Scanner1", ZeroconfScannerDetector::kEsclServiceType, + "Maker", "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Test that metadata with ty and mdl works. Since both mfg and mdl are not +// present, mdl will not be used and ty will be used. +TEST_F(ZeroconfScannerDetectorTest, MetadataTyMdl) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"ty=The Manufacturer Model 123", "mdl=Bad-Model"})); + CreateDetector(); + CompleteTasks(); + // Note that if manufacturer in the ty string contains a space, only the first + // word is stripped out for the manufacturer entry. That's why mfg/mdl are + // preferred when they are both present. + std::vector<Scanner> expected_scanners = {MakeExpectedScanner( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, "The", + "Manufacturer Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Tests that metadata with ty, mfg, and mdl works. mfg and mdl should be used +// instead of the ty info. +TEST_F(ZeroconfScannerDetectorTest, MetadataTyMfgMdl) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"ty=Bad-Manufacturer Bad-Model", "mfg=Manufacturer", "mdl=Model 123"})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = { + MakeExpectedScanner("Scanner1", ZeroconfScannerDetector::kEsclServiceType, + "Manufacturer", "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Test that metadata with just usb_MFG and usb_MDL works. +TEST_F(ZeroconfScannerDetectorTest, MetadataUsbMfgMdl) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"usb_MFG=Real Manufacturer", "usb_MDL=Model 123"})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = {MakeExpectedScanner( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + "Real Manufacturer", "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Test that metadata with ty and usb_MFG works. Since both usb_MFG and usb_MDL +// are not present, usb_MFG will not be used and ty will be used. +TEST_F(ZeroconfScannerDetectorTest, MetadataUsbTyMfg) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"ty=Maker Model 123", "usb_MFG=Bad-Manufacturer"})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = { + MakeExpectedScanner("Scanner1", ZeroconfScannerDetector::kEsclServiceType, + "Maker", "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Test that metadata with ty and usb_MDL works. Since both usb_MFG and usb_MDL +// are not present, usb_MDL will not be used and ty will be used. +TEST_F(ZeroconfScannerDetectorTest, MetadataUsbTyMdl) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"ty=The Manufacturer Model 123", "usb_MDL=Bad Model"})); + CreateDetector(); + CompleteTasks(); + // Note that if manufacturer in the ty string contains a space, only the first + // word is stripped out for the manufacturer entry. That's why + // usb_MFG/usb_MDL are preferred when they are both present. + std::vector<Scanner> expected_scanners = {MakeExpectedScanner( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, "The", + "Manufacturer Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + +// Tests that metadata with ty, usb_MFG, and usb_MDL works. usb_MFG and usb_MDL +// should be used instead of the ty info. +TEST_F(ZeroconfScannerDetectorTest, MetadataUsbTyMfgMdl) { + escl_lister_->Announce(MakeServiceDescription( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, + {"ty=Bad-Manufacturer Bad-Model", "usb_MFG=The Manufacturer", + "usb_MDL=Model 123"})); + CreateDetector(); + CompleteTasks(); + std::vector<Scanner> expected_scanners = {MakeExpectedScanner( + "Scanner1", ZeroconfScannerDetector::kEsclServiceType, "The Manufacturer", + "Model 123", /*rs=*/absl::nullopt)}; + EXPECT_THAT(scanners_, ScannersAreEqual(expected_scanners)); +} + // Test that a detected scanner can be removed. TEST_F(ZeroconfScannerDetectorTest, RemoveAddedScanner) { escl_lister_->Announce(MakeServiceDescription(
diff --git a/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.cc b/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.cc index eac283ee..57dd2978 100644 --- a/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.cc +++ b/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.cc
@@ -80,6 +80,8 @@ absl::optional<Scanner> CreateSaneScanner(const std::string& name, const std::string& service_type, + const std::string& manufacturer, + const std::string& model, const absl::optional<std::string>& rs, const net::IPAddress& ip_address, int port, @@ -105,6 +107,8 @@ Scanner scanner; scanner.display_name = name; + scanner.manufacturer = manufacturer; + scanner.model = model; scanner.device_names[protocol].emplace( ScannerDeviceName(device_name, usable)); scanner.ip_addresses.insert(ip_address);
diff --git a/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.h b/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.h index 4633a7f..5b28d51 100644 --- a/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.h +++ b/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils.h
@@ -24,6 +24,8 @@ // more details. absl::optional<Scanner> CreateSaneScanner(const std::string& name, const std::string& service_type, + const std::string& manufacturer, + const std::string& model, const absl::optional<std::string>& rs, const net::IPAddress& ip_address, int port,
diff --git a/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils_unittest.cc b/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils_unittest.cc index 5c753582..4267fee 100644 --- a/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils_unittest.cc +++ b/chrome/browser/ash/scanning/zeroconf_scanner_detector_utils_unittest.cc
@@ -51,13 +51,16 @@ TEST_P(CreateSaneScannerServiceTypeTest, SupportedServiceType) { net::IPAddress ip_address = IpAddressFromString("101.102.103.104"); - absl::optional<Scanner> maybe_scanner = CreateSaneScanner( - "EPSON scanner", params().service_type, "eSCL", ip_address, 8080); + absl::optional<Scanner> maybe_scanner = + CreateSaneScanner("EPSON scanner", params().service_type, "EPSON", + "Model", "eSCL", ip_address, 8080); ASSERT_TRUE(maybe_scanner.has_value()); auto scanner = maybe_scanner.value(); EXPECT_EQ(scanner.display_name, "EPSON scanner"); + EXPECT_EQ(scanner.manufacturer, "EPSON"); + EXPECT_EQ(scanner.model, "Model"); auto device_names = scanner.device_names[params().protocol]; ASSERT_TRUE(device_names.size() > 0); @@ -103,9 +106,9 @@ // Test that the correct scanner name is constructed for scanners which report // rs values with slashes. TEST_P(CreateSaneScannerSlashTest, DropsSlash) { - absl::optional<Scanner> maybe_scanner = - CreateSaneScanner("name", ZeroconfScannerDetector::kEsclServiceType, rs(), - IpAddressFromString("101.102.103.104"), 8080); + absl::optional<Scanner> maybe_scanner = CreateSaneScanner( + "name", ZeroconfScannerDetector::kEsclServiceType, "Manufacturer", + "Model", rs(), IpAddressFromString("101.102.103.104"), 8080); ASSERT_TRUE(maybe_scanner.has_value()); @@ -121,25 +124,30 @@ CreateSaneScannerSlashTest, testing::Values("/eSCL", "eSCL/", "/eSCL/")); -// Test that CreateSaneScanner handles scanners which don't report an rs value. +// Test that CreateSaneScanner handles scanners which don't report an rs value, +// manufacturer value, nor model value. TEST(CreateSaneScanner, NoRsValue) { absl::optional<Scanner> maybe_scanner = CreateSaneScanner( - "name", ZeroconfScannerDetector::kEsclServiceType, absl::nullopt, - IpAddressFromString("101.102.103.104"), 8080); + "name", ZeroconfScannerDetector::kEsclServiceType, /*manufacturer=*/"", + /*model=*/"", absl::nullopt, IpAddressFromString("101.102.103.104"), + 8080); ASSERT_TRUE(maybe_scanner.has_value()); - auto device_names = maybe_scanner.value().device_names[ScanProtocol::kEscl]; + auto scanner = maybe_scanner.value(); + auto device_names = scanner.device_names[ScanProtocol::kEscl]; ASSERT_TRUE(device_names.size() > 0); EXPECT_EQ(device_names.begin()->device_name, "airscan:escl:name:http://101.102.103.104:8080/eSCL/"); + EXPECT_TRUE(scanner.manufacturer.empty()); + EXPECT_TRUE(scanner.model.empty()); } // Test that CreateSaneScanner fails when an invalid IP address is passed in. TEST(CreateSaneScanner, InvalidIpAddress) { - absl::optional<Scanner> maybe_scanner = - CreateSaneScanner("name", ZeroconfScannerDetector::kEsclServiceType, - "eSCL", net::IPAddress(), 8080); + absl::optional<Scanner> maybe_scanner = CreateSaneScanner( + "name", ZeroconfScannerDetector::kEsclServiceType, "Manufacturer", + "Model", "eSCL", net::IPAddress(), 8080); EXPECT_FALSE(maybe_scanner.has_value()); } @@ -148,7 +156,8 @@ TEST(CreateSaneScanner, GenericNonEpsonScanner) { absl::optional<Scanner> maybe_scanner = CreateSaneScanner( "name", ZeroconfScannerDetector::kGenericScannerServiceType, - absl::nullopt, IpAddressFromString("101.102.103.104"), 8080); + "Manufacturer", "Model", absl::nullopt, + IpAddressFromString("101.102.103.104"), 8080); EXPECT_FALSE(maybe_scanner.has_value()); }
diff --git a/chrome/browser/ash/shimless_rma/chrome_shimless_rma_delegate_unittest.cc b/chrome/browser/ash/shimless_rma/chrome_shimless_rma_delegate_unittest.cc index d8b58ba3..f8795cf 100644 --- a/chrome/browser/ash/shimless_rma/chrome_shimless_rma_delegate_unittest.cc +++ b/chrome/browser/ash/shimless_rma/chrome_shimless_rma_delegate_unittest.cc
@@ -164,7 +164,7 @@ } const web_app::WebApp* GetWebAppById( - const web_app::AppId& app_id, + const webapps::AppId& app_id, content::BrowserContext* browser_context) override { return &web_app_; }
diff --git a/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc b/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc index 7df758f..0ff5aed 100644 --- a/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc +++ b/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.cc
@@ -27,12 +27,12 @@ #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h" #include "chrome/browser/web_applications/web_app.h" #include "chrome/browser/web_applications/web_app_command_scheduler.h" -#include "chrome/browser/web_applications/web_app_id.h" #include "chrome/browser/web_applications/web_app_provider.h" #include "chrome/common/chromeos/extensions/chromeos_system_extension_info.h" #include "chrome/common/pref_names.h" #include "chromeos/ash/components/browser_context_helper/browser_context_helper.h" #include "components/web_package/signed_web_bundles/signed_web_bundle_id.h" +#include "components/webapps/common/web_app_id.h" #include "content/public/browser/service_worker_context.h" #include "extensions/browser/crx_file_info.h" #include "extensions/browser/extension_registry.h" @@ -383,7 +383,7 @@ } const web_app::WebApp* DiagnosticsAppProfileHelperDelegate::GetWebAppById( - const web_app::AppId& app_id, + const webapps::AppId& app_id, content::BrowserContext* browser_context) { auto* web_app_provider = web_app::WebAppProvider::GetForWebApps( Profile::FromBrowserContext(browser_context));
diff --git a/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.h b/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.h index 831786c..f6dda9f 100644 --- a/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.h +++ b/chrome/browser/ash/shimless_rma/diagnostics_app_profile_helper.h
@@ -7,7 +7,7 @@ #include "ash/webui/shimless_rma/backend/shimless_rma_delegate.h" #include "base/files/file_path.h" -#include "chrome/browser/web_applications/web_app_id.h" +#include "components/webapps/common/web_app_id.h" #include "extensions/common/extension_id.h" namespace content { @@ -38,7 +38,7 @@ content::BrowserContext* browser_context); virtual const web_app::WebApp* GetWebAppById( - const web_app::AppId& app_id, + const webapps::AppId& app_id, content::BrowserContext* browser_context); };
diff --git a/chrome/browser/assist_ranker/assist_ranker_service_factory.cc b/chrome/browser/assist_ranker/assist_ranker_service_factory.cc index ac7290a..cb11d67 100644 --- a/chrome/browser/assist_ranker/assist_ranker_service_factory.cc +++ b/chrome/browser/assist_ranker/assist_ranker_service_factory.cc
@@ -38,9 +38,10 @@ AssistRankerServiceFactory::~AssistRankerServiceFactory() = default; -KeyedService* AssistRankerServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AssistRankerServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* browser_context) const { - return new AssistRankerServiceImpl( + return std::make_unique<AssistRankerServiceImpl>( browser_context->GetPath(), g_browser_process->system_network_context_manager() ->GetSharedURLLoaderFactory());
diff --git a/chrome/browser/assist_ranker/assist_ranker_service_factory.h b/chrome/browser/assist_ranker/assist_ranker_service_factory.h index 05c604c..bd262f2d 100644 --- a/chrome/browser/assist_ranker/assist_ranker_service_factory.h +++ b/chrome/browser/assist_ranker/assist_ranker_service_factory.h
@@ -35,7 +35,7 @@ ~AssistRankerServiceFactory() override; // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const override; };
diff --git a/chrome/browser/autofill/DEPS b/chrome/browser/autofill/DEPS index 24cd311..2a88263 100644 --- a/chrome/browser/autofill/DEPS +++ b/chrome/browser/autofill/DEPS
@@ -1,6 +1,7 @@ include_rules = [ '+third_party/libaddressinput/chromium/chrome_metadata_source.h', '+third_party/libaddressinput/chromium/chrome_storage_impl.h', + '+components/browser_ui/device_lock/android', ] specific_include_rules = {
diff --git a/chrome/browser/autofill/autofill_optimization_guide_factory.cc b/chrome/browser/autofill/autofill_optimization_guide_factory.cc index b538351..68deda96 100644 --- a/chrome/browser/autofill/autofill_optimization_guide_factory.cc +++ b/chrome/browser/autofill/autofill_optimization_guide_factory.cc
@@ -47,8 +47,17 @@ KeyedService* AutofillOptimizationGuideFactory::BuildServiceInstanceFor( content::BrowserContext* context) const { Profile* profile = Profile::FromBrowserContext(context); - return new AutofillOptimizationGuide( - OptimizationGuideKeyedServiceFactory::GetForProfile(profile)); + OptimizationGuideKeyedService* optimization_service = + OptimizationGuideKeyedServiceFactory::GetForProfile(profile); + + // AutofillOptimizationGuide depends on the optimization guide keyed + // service, so make sure it is available before creating an + // AutofillOptimizationGuide. + if (!optimization_service) { + return nullptr; + } + + return new AutofillOptimizationGuide(/*decider=*/optimization_service); } } // namespace autofill
diff --git a/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc b/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc index e6097a8..43c9a40f 100644 --- a/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc +++ b/chrome/browser/autofill/autofill_save_card_infobar_delegate_mobile_unittest.cc
@@ -12,17 +12,32 @@ #include "base/test/metrics/histogram_tester.h" #include "build/branding_buildflags.h" #include "chrome/browser/autofill/personal_data_manager_factory.h" +#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "chrome/test/base/testing_profile.h" #include "components/autofill/core/browser/autofill_test_utils.h" #include "components/autofill/core/browser/metrics/payments/credit_card_save_metrics.h" #include "components/autofill/core/browser/personal_data_manager.h" #include "components/autofill/core/browser/test_personal_data_manager.h" +#include "components/browser_ui/device_lock/android/device_lock_bridge.h" #include "components/infobars/core/confirm_infobar_delegate.h" #include "testing/gtest/include/gtest/gtest.h" using testing::_; +namespace { + +class TestDeviceLockBridge : public DeviceLockBridge { + public: + TestDeviceLockBridge() = default; + TestDeviceLockBridge(const TestDeviceLockBridge&) = delete; + TestDeviceLockBridge& operator=(const TestDeviceLockBridge&) = delete; + + bool ShouldShowDeviceLockUi() override { return false; } +}; + +} // namespace + namespace autofill { class AutofillSaveCardInfoBarDelegateMobileTest @@ -66,6 +81,7 @@ std::string legal_message_string, AutofillClient::SaveCreditCardOptions options, CreditCard credit_card = CreditCard()); + void CheckInfobarAcceptReturnValue(ConfirmInfoBarDelegate* infobar_delegate); std::unique_ptr<TestPersonalDataManager> personal_data_; @@ -124,11 +140,19 @@ ui_info.description_text = options.description_text; ui_info.is_google_pay_branding_enabled = options.is_google_pay_branding_enabled; +#if BUILDFLAG(IS_ANDROID) + auto save_card_delegate = std::make_unique<AutofillSaveCardDelegateAndroid>( + (AutofillClient::LocalSaveCardPromptCallback)base::DoNothing(), + AutofillClient::SaveCreditCardOptions(), web_contents()); + save_card_delegate->SetDeviceLockBridgeForTesting( + std::make_unique<TestDeviceLockBridge>()); +#else + auto save_card_delegate = std::make_unique<AutofillSaveCardDelegate>( + (AutofillClient::LocalSaveCardPromptCallback)base::DoNothing(), + AutofillClient::SaveCreditCardOptions()); +#endif return std::make_unique<AutofillSaveCardInfoBarDelegateMobile>( - std::move(ui_info), - std::make_unique<AutofillSaveCardDelegate>( - (AutofillClient::LocalSaveCardPromptCallback)base::DoNothing(), - AutofillClient::SaveCreditCardOptions())); + std::move(ui_info), std::move(save_card_delegate)); } std::unique_ptr<AutofillSaveCardInfoBarDelegateMobile> @@ -156,25 +180,46 @@ LegalMessageLine::Parse(value->GetDict(), &legal_message_lines, /*escape_apostrophes=*/true); } + credit_card_to_save_ = credit_card; + absl::variant<AutofillClient::LocalSaveCardPromptCallback, + AutofillClient::UploadSaveCardPromptCallback> + save_card_callback; + AutofillSaveCardUiInfo ui_info; if (is_uploading) { - return std::make_unique<AutofillSaveCardInfoBarDelegateMobile>( - AutofillSaveCardUiInfo::CreateForUploadSave( - options, credit_card, legal_message_lines, AccountInfo()), - std::make_unique<AutofillSaveCardDelegate>( - base::BindOnce(&AutofillSaveCardInfoBarDelegateMobileTest:: - UploadSaveCardPromptCallback, - base::Unretained(this)), - options)); + ui_info = AutofillSaveCardUiInfo::CreateForUploadSave( + options, credit_card, legal_message_lines, AccountInfo()); + save_card_callback = + base::BindOnce(&AutofillSaveCardInfoBarDelegateMobileTest:: + UploadSaveCardPromptCallback, + base::Unretained(this)); } else { - return std::make_unique<AutofillSaveCardInfoBarDelegateMobile>( - AutofillSaveCardUiInfo::CreateForLocalSave(options, credit_card), - std::make_unique<AutofillSaveCardDelegate>( - base::BindOnce(&AutofillSaveCardInfoBarDelegateMobileTest:: - LocalSaveCardPromptCallback, - base::Unretained(this)), - options)); + ui_info = AutofillSaveCardUiInfo::CreateForLocalSave(options, credit_card); + save_card_callback = base::BindOnce( + &AutofillSaveCardInfoBarDelegateMobileTest::LocalSaveCardPromptCallback, + base::Unretained(this)); } + +#if BUILDFLAG(IS_ANDROID) + auto save_card_delegate = std::make_unique<AutofillSaveCardDelegateAndroid>( + std::move(save_card_callback), options, web_contents()); + save_card_delegate->SetDeviceLockBridgeForTesting( + std::make_unique<TestDeviceLockBridge>()); +#else + auto save_card_delegate = std::make_unique<AutofillSaveCardDelegate>( + std::move(save_card_callback), options); +#endif + return std::make_unique<AutofillSaveCardInfoBarDelegateMobile>( + std::move(ui_info), std::move(save_card_delegate)); +} + +void AutofillSaveCardInfoBarDelegateMobileTest::CheckInfobarAcceptReturnValue( + ConfirmInfoBarDelegate* infobar_delegate) { +#if BUILDFLAG(IS_ANDROID) + EXPECT_FALSE(infobar_delegate->Accept()); +#else + EXPECT_TRUE(infobar_delegate->Accept()); +#endif } // Test that local credit card save infobar metrics are logged correctly. @@ -198,7 +243,8 @@ /* is_uploading= */ false)); base::HistogramTester histogram_tester; - EXPECT_TRUE(infobar->Accept()); + + CheckInfobarAcceptReturnValue(infobar.get()); ASSERT_EQ(1U, personal_data_->GetCreditCards().size()); histogram_tester.ExpectUniqueSample("Autofill.CreditCardInfoBar.Local", AutofillMetrics::INFOBAR_ACCEPTED, 1); @@ -274,7 +320,7 @@ /* is_uploading= */ true)); base::HistogramTester histogram_tester; - EXPECT_TRUE(infobar->Accept()); + CheckInfobarAcceptReturnValue(infobar.get()); ASSERT_EQ(1U, personal_data_->GetCreditCards().size()); histogram_tester.ExpectUniqueSample("Autofill.CreditCardInfoBar.Server", AutofillMetrics::INFOBAR_ACCEPTED, 1); @@ -293,7 +339,7 @@ .with_should_request_expiration_date_from_user(true))); base::HistogramTester histogram_tester; - EXPECT_TRUE(infobar->Accept()); + CheckInfobarAcceptReturnValue(infobar.get()); ASSERT_EQ(1U, personal_data_->GetCreditCards().size()); histogram_tester.ExpectUniqueSample("Autofill.CreditCardInfoBar.Server", AutofillMetrics::INFOBAR_ACCEPTED, 1); @@ -320,7 +366,7 @@ .with_should_request_name_from_user(true))); base::HistogramTester histogram_tester; - EXPECT_TRUE(infobar->Accept()); + CheckInfobarAcceptReturnValue(infobar.get()); ASSERT_EQ(1U, personal_data_->GetCreditCards().size()); histogram_tester.ExpectUniqueSample("Autofill.CreditCardInfoBar.Server", AutofillMetrics::INFOBAR_ACCEPTED, 1);
diff --git a/chrome/browser/browser_features.cc b/chrome/browser/browser_features.cc index b7dd3cf5..34e7d89 100644 --- a/chrome/browser/browser_features.cc +++ b/chrome/browser/browser_features.cc
@@ -310,8 +310,4 @@ "OmniboxTriggerForNoStatePrefetch", base::FEATURE_DISABLED_BY_DEFAULT); -#if !BUILDFLAG(IS_ANDROID) -BASE_FEATURE(kMantaService, "MantaService", base::FEATURE_DISABLED_BY_DEFAULT); -#endif - } // namespace features
diff --git a/chrome/browser/browser_features.h b/chrome/browser/browser_features.h index 9637e2c..b29449f8 100644 --- a/chrome/browser/browser_features.h +++ b/chrome/browser/browser_features.h
@@ -131,12 +131,6 @@ BASE_DECLARE_FEATURE(kOmniboxTriggerForNoStatePrefetch); -#if !BUILDFLAG(IS_ANDROID) -// This flag is used for enabling the Manta Service, a profile keyed service for -// the google chrome Manta project. -BASE_DECLARE_FEATURE(kMantaService); -#endif - } // namespace features #endif // CHROME_BROWSER_BROWSER_FEATURES_H_
diff --git a/chrome/browser/browsing_data/browsing_data_model_browsertest.cc b/chrome/browser/browsing_data/browsing_data_model_browsertest.cc index 69a9ff1..6eb96cb 100644 --- a/chrome/browser/browsing_data/browsing_data_model_browsertest.cc +++ b/chrome/browser/browsing_data/browsing_data_model_browsertest.cc
@@ -17,6 +17,7 @@ #include "base/threading/platform_thread.h" #include "chrome/browser/browsing_data/chrome_browsing_data_model_delegate.h" #include "chrome/browser/media/clear_key_cdm_test_helper.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" @@ -24,7 +25,7 @@ #include "chrome/browser/web_applications/isolated_web_apps/isolated_web_app_url_info.h" #include "chrome/common/chrome_features.h" #include "chrome/test/base/chrome_test_utils.h" -#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/browsing_data/content/browsing_data_model.h" #include "components/browsing_data/content/browsing_data_model_test_util.h" @@ -34,7 +35,6 @@ #include "components/content_settings/browser/page_specific_content_settings.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h" -#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" #include "components/privacy_sandbox/privacy_sandbox_settings.h" #include "components/services/storage/public/mojom/local_storage_control.mojom.h" #include "components/services/storage/public/mojom/storage_usage_info.mojom.h" @@ -247,7 +247,7 @@ using browsing_data_test_util::SetDataForType; class BrowsingDataModelBrowserTest - : public InProcessBrowserTest, + : public MixinBasedInProcessBrowserTest, public ::testing::WithParamInterface<bool> { public: BrowsingDataModelBrowserTest() { @@ -299,9 +299,6 @@ void SetUpOnMainThread() override { PrivacySandboxSettingsFactory::GetForProfile(browser()->profile()) ->SetAllPrivacySandboxAllowedForTesting(); - scoped_attestations_ = - std::make_unique<privacy_sandbox::ScopedPrivacySandboxAttestations>( - privacy_sandbox::PrivacySandboxAttestations::CreateForTesting()); // Mark all Privacy Sandbox APIs as attested since the test cases are // testing behaviors not related to attestations. privacy_sandbox::PrivacySandboxAttestations::GetInstance() @@ -375,8 +372,8 @@ base::test::ScopedFeatureList feature_list_; std::unique_ptr<net::EmbeddedTestServer> https_server_; - std::unique_ptr<privacy_sandbox::ScopedPrivacySandboxAttestations> - scoped_attestations_; + privacy_sandbox::PrivacySandboxAttestationsMixin + privacy_sandbox_attestations_mixin_{&mixin_host_}; }; IN_PROC_BROWSER_TEST_P(BrowsingDataModelBrowserTest,
diff --git a/chrome/browser/browsing_data/counters/browsing_data_counter_utils.cc b/chrome/browser/browsing_data/counters/browsing_data_counter_utils.cc index 42e6a73..dd48fb4 100644 --- a/chrome/browser/browsing_data/counters/browsing_data_counter_utils.cc +++ b/chrome/browser/browsing_data/counters/browsing_data_counter_utils.cc
@@ -23,6 +23,10 @@ #include "ui/base/l10n/l10n_util.h" #include "ui/base/text/bytes_formatting.h" +#if BUILDFLAG(IS_ANDROID) +#include "chrome/browser/flags/android/chrome_feature_list.h" +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) #include "base/numerics/safe_conversions.h" #include "base/strings/string_util.h" @@ -90,15 +94,41 @@ if (cache_size_bytes >= kBytesInAMegabyte) { std::u16string formatted_size = FormatBytesMBOrHigher(cache_size_bytes); if (!is_upper_limit) { +#if BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled( + chrome::android::kQuickDeleteForAndroid) && + !is_basic_tab) { + return l10n_util::GetStringFUTF16( + IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED, formatted_size); + } +#endif return is_basic_tab ? l10n_util::GetStringFUTF16( IDS_DEL_CACHE_COUNTER_BASIC, formatted_size) : formatted_size; } + +#if BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled( + chrome::android::kQuickDeleteForAndroid) && + !is_basic_tab) { + return l10n_util::GetStringFUTF16( + IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_UPPER_ESTIMATE, + formatted_size); + } +#endif return l10n_util::GetStringFUTF16( is_basic_tab ? IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE_BASIC : IDS_DEL_CACHE_COUNTER_UPPER_ESTIMATE, formatted_size); } + +#if BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled(chrome::android::kQuickDeleteForAndroid) && + !is_basic_tab) { + return l10n_util::GetStringUTF16( + IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_ALMOST_EMPTY); + } +#endif return l10n_util::GetStringUTF16( is_basic_tab ? IDS_DEL_CACHE_COUNTER_ALMOST_EMPTY_BASIC : IDS_DEL_CACHE_COUNTER_ALMOST_EMPTY); @@ -113,6 +143,13 @@ static_cast<const BrowsingDataCounter::FinishedResult*>(result) ->Value(); +#if BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled(chrome::android::kQuickDeleteForAndroid)) { + return l10n_util::GetPluralStringFUTF16( + IDS_ANDROID_DEL_COOKIES_COUNTER_ADVANCED, origins); + } +#endif + // Determines whether or not to show the count with exception message. int del_cookie_counter_msg_id = ShouldShowCookieException(profile)
diff --git a/chrome/browser/browsing_data/counters/browsing_data_counter_utils_unittest.cc b/chrome/browser/browsing_data/counters/browsing_data_counter_utils_unittest.cc index 0a44e77..1196f5a 100644 --- a/chrome/browser/browsing_data/counters/browsing_data_counter_utils_unittest.cc +++ b/chrome/browser/browsing_data/counters/browsing_data_counter_utils_unittest.cc
@@ -21,6 +21,10 @@ #include "extensions/buildflags/buildflags.h" #include "testing/gtest/include/gtest/gtest.h" +#if BUILDFLAG(IS_ANDROID) +#include "chrome/browser/flags/android/chrome_feature_list.h" +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) #include "base/strings/string_split.h" #include "chrome/browser/browsing_data/counters/hosted_apps_counter.h" @@ -34,12 +38,19 @@ TestingProfile* GetProfile() { return &profile_; } + base::test::ScopedFeatureList scoped_feature_list_; + private: content::BrowserTaskEnvironment task_environment_; TestingProfile profile_; }; TEST_F(BrowsingDataCounterUtilsTest, CacheCounterResult) { +#if BUILDFLAG(IS_ANDROID) + scoped_feature_list_.InitAndDisableFeature( + chrome::android::kQuickDeleteForAndroid); +#endif + // This test assumes that the strings are served exactly as defined, // i.e. that the locale is set to the default "en". ASSERT_EQ("en", TestingBrowserProcess::GetGlobal()->GetApplicationLocale()); @@ -88,6 +99,51 @@ } } +#if BUILDFLAG(IS_ANDROID) +// Tests the output of the hosted apps counter. +TEST_F(BrowsingDataCounterUtilsTest, QuickDeleteAdvancedCacheCounterResult) { + scoped_feature_list_.InitAndEnableFeature( + chrome::android::kQuickDeleteForAndroid); + + // This test assumes that the strings are served exactly as defined, + // i.e. that the locale is set to the default "en". + ASSERT_EQ("en", TestingBrowserProcess::GetGlobal()->GetApplicationLocale()); + const int kBytesInAMegabyte = 1024 * 1024; + + // Test the output for various forms of CacheResults. + const struct TestCase { + int bytes; + bool is_upper_limit; + std::string expected_output; + } kTestCases[] = { + {42, false, + "Less than 1 MB. Some sites may load more slowly on your next " + "visit."}, + {static_cast<int>(2.312 * kBytesInAMegabyte), false, + "2.3 MB. Some sites may load more slowly on your next " + "visit."}, + {static_cast<int>(2.312 * kBytesInAMegabyte), true, + "Less than 2.3 MB. Some sites may load more slowly on your next " + "visit."}}; + + for (const TestCase& test_case : kTestCases) { + CacheCounter counter(GetProfile()); + browsing_data::ClearBrowsingDataTab tab = + browsing_data::ClearBrowsingDataTab::ADVANCED; + counter.Init(GetProfile()->GetPrefs(), tab, + browsing_data::BrowsingDataCounter::ResultCallback()); + CacheCounter::CacheResult result(&counter, test_case.bytes, + test_case.is_upper_limit); + SCOPED_TRACE(base::StringPrintf("Test params: %d bytes, %d is_upper_limit", + test_case.bytes, test_case.is_upper_limit)); + + std::u16string output = + GetChromeCounterTextFromResult(&result, GetProfile()); + EXPECT_EQ(output, base::ASCIIToUTF16(test_case.expected_output)); + } +} +#endif + #if BUILDFLAG(ENABLE_EXTENSIONS) // Tests the complex output of the hosted apps counter. TEST_F(BrowsingDataCounterUtilsTest, HostedAppsCounterResult) {
diff --git a/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc b/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc index 0e38ace..8b56e4f 100644 --- a/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc +++ b/chrome/browser/browsing_topics/browsing_topics_service_browsertest.cc
@@ -14,10 +14,11 @@ #include "chrome/browser/optimization_guide/browser_test_util.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" -#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/browsing_topics/browsing_topics_service.h" #include "components/browsing_topics/browsing_topics_service_impl.h" @@ -31,7 +32,6 @@ #include "components/optimization_guide/core/test_optimization_guide_model_provider.h" #include "components/optimization_guide/proto/page_topics_model_metadata.pb.h" #include "components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h" -#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "components/privacy_sandbox/privacy_sandbox_settings.h" #include "components/ukm/test_ukm_recorder.h" @@ -177,16 +177,10 @@ base::OnceClosure calculation_finish_callback_; }; -class BrowsingTopicsBrowserTestBase : public InProcessBrowserTest { +class BrowsingTopicsBrowserTestBase : public MixinBasedInProcessBrowserTest { public: void SetUpOnMainThread() override { host_resolver()->AddRule("*", "127.0.0.1"); - // `PrivacySandboxAttestations` has a member of type - // `scoped_refptr<base::SequencedTaskRunner>`, its initialization must be - // done after a browser process is created. - scoped_attestations_ = - std::make_unique<privacy_sandbox::ScopedPrivacySandboxAttestations>( - privacy_sandbox::PrivacySandboxAttestations::CreateForTesting()); // Mark all Privacy Sandbox APIs as attested since the test cases are // testing behaviors not related to attestations. privacy_sandbox::PrivacySandboxAttestations::GetInstance() @@ -273,8 +267,8 @@ // Mapping of request paths to the topics header they were requested with. std::map<std::string, std::string> request_path_topics_map_; - std::unique_ptr<privacy_sandbox::ScopedPrivacySandboxAttestations> - scoped_attestations_; + privacy_sandbox::PrivacySandboxAttestationsMixin + privacy_sandbox_attestations_mixin_{&mixin_host_}; }; class BrowsingTopicsDisabledBrowserTest : public BrowsingTopicsBrowserTestBase {
diff --git a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc index b83856e..aa6eedaa 100644 --- a/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc +++ b/chrome/browser/chromeos/extensions/wm/wm_desks_private_apitest.cc
@@ -83,6 +83,8 @@ if (ash::DesksController::Get()->AreDesksBeingModified()) { remove_waiter.Wait(); } + histogram_tester.ExpectUniqueSample("Ash.DeskApi.RemoveDeskType", + ash::DeskCloseType::kCloseAllWindows, 1); } // Tests launch and removal of a desk. Makes sure desk cannot be undone after @@ -190,9 +192,13 @@ } histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 1, 1); + histogram_tester.ExpectUniqueSample( + "Ash.DeskApi.RemoveDeskType", ash::DeskCloseType::kCloseAllWindowsAndWait, + 1); EXPECT_TRUE(ash::DesksTestApi::DesksControllerCanUndoDeskRemoval()); ash::DesksController::Get()->MaybeCancelDeskRemoval(); + histogram_tester.ExpectTotalCount("Ash.DeskApi.CloseAllUndo", 1); EXPECT_FALSE(ash::DesksTestApi::DesksControllerCanUndoDeskRemoval()); EXPECT_EQ(2, ash::DesksController::Get()->GetNumberOfDesks()); } @@ -238,6 +244,8 @@ } histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 1, 1); + histogram_tester.ExpectUniqueSample("Ash.DeskApi.RemoveDeskType", + ash::DeskCloseType::kCombineDesks, 1); EXPECT_FALSE(ash::DesksTestApi::DesksControllerCanUndoDeskRemoval()); EXPECT_EQ(1, ash::DesksController::Get()->GetNumberOfDesks()); } @@ -282,6 +290,8 @@ } histogram_tester.ExpectBucketCount("Ash.DeskApi.RemoveDesk.Result", 1, 1); + histogram_tester.ExpectUniqueSample("Ash.DeskApi.RemoveDeskType", + ash::DeskCloseType::kCombineDesks, 1); EXPECT_EQ(1, ash::DesksController::Get()->GetNumberOfDesks()); }
diff --git a/chrome/browser/chromeos/policy/default_notifications_setting_browsertest.cc b/chrome/browser/chromeos/policy/default_notifications_setting_browsertest.cc index 67f2b24b..85b783b2 100644 --- a/chrome/browser/chromeos/policy/default_notifications_setting_browsertest.cc +++ b/chrome/browser/chromeos/policy/default_notifications_setting_browsertest.cc
@@ -9,6 +9,7 @@ #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/permissions/features.h" #include "components/policy/policy_constants.h" #include "content/public/test/browser_test.h" #include "testing/gtest/include/gtest/gtest.h" @@ -30,6 +31,8 @@ public testing::WithParamInterface<int> { public: void SetUpInProcessBrowserTestFixture() override { + feature_list_.InitAndDisableFeature( + permissions::features::kPermissionDedicatedCpssSetting); policy::PolicyTest::SetUpInProcessBrowserTestFixture(); // Use param 0 to test the policy unset case. @@ -40,6 +43,9 @@ UpdateProviderPolicy(policy_map); } } + + private: + base::test::ScopedFeatureList feature_list_; }; INSTANTIATE_TEST_SUITE_P(IntPolicy,
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc index bc28120..0067703 100644 --- a/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/chrome/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -31,6 +31,7 @@ #include "chrome/browser/extensions/extension_util.h" #include "chrome/browser/extensions/unpacked_installer.h" #include "chrome/browser/preloading/preloading_prefs.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" #include "chrome/common/chrome_paths.h" @@ -43,7 +44,6 @@ #include "components/infobars/core/infobar.h" #include "components/infobars/core/infobar_delegate.h" #include "components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h" -#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" #include "content/public/browser/navigation_entry.h" #include "content/public/browser/ssl_status.h" #include "content/public/browser/web_contents.h" @@ -1185,19 +1185,9 @@ public: PrivacySandboxAttestationsOverrideTest() = default; - void SetUpOnMainThread() override { - // `PrivacySandboxAttestations` has a member of type - // `scoped_refptr<base::SequencedTaskRunner>`, its initialization must be - // done after a browser process is created. - DevToolsProtocolTest::SetUpOnMainThread(); - scoped_attestations_ = - std::make_unique<privacy_sandbox::ScopedPrivacySandboxAttestations>( - privacy_sandbox::PrivacySandboxAttestations::CreateForTesting()); - } - private: - std::unique_ptr<privacy_sandbox::ScopedPrivacySandboxAttestations> - scoped_attestations_; + privacy_sandbox::PrivacySandboxAttestationsMixin + privacy_sandbox_attestations_mixin_{&mixin_host_}; }; IN_PROC_BROWSER_TEST_F(PrivacySandboxAttestationsOverrideTest,
diff --git a/chrome/browser/devtools/protocol/devtools_protocol_test_support.h b/chrome/browser/devtools/protocol/devtools_protocol_test_support.h index 7b30e9dd..2de6b8b 100644 --- a/chrome/browser/devtools/protocol/devtools_protocol_test_support.h +++ b/chrome/browser/devtools/protocol/devtools_protocol_test_support.h
@@ -5,10 +5,10 @@ #ifndef CHROME_BROWSER_DEVTOOLS_PROTOCOL_DEVTOOLS_PROTOCOL_TEST_SUPPORT_H_ #define CHROME_BROWSER_DEVTOOLS_PROTOCOL_DEVTOOLS_PROTOCOL_TEST_SUPPORT_H_ -#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "content/public/test/test_devtools_protocol_client.h" -class DevToolsProtocolTestBase : public InProcessBrowserTest, +class DevToolsProtocolTestBase : public MixinBasedInProcessBrowserTest, public content::TestDevToolsProtocolClient { public: DevToolsProtocolTestBase();
diff --git a/chrome/browser/dips/BUILD.gn b/chrome/browser/dips/BUILD.gn index 21c8bb7..fd60924 100644 --- a/chrome/browser/dips/BUILD.gn +++ b/chrome/browser/dips/BUILD.gn
@@ -39,6 +39,7 @@ "//chrome/test/data/dips/v1.sql", "//chrome/test/data/dips/v2.sql", "//chrome/test/data/dips/v3.sql", + "//chrome/test/data/dips/v4.sql", ] outputs = [ "{{bundle_resources_dir}}/" + "{{source_root_relative_dir}}/{{source_file_part}}" ]
diff --git a/chrome/browser/dips/dips_database.cc b/chrome/browser/dips/dips_database.cc index 3189b75..4fa8a20 100644 --- a/chrome/browser/dips/dips_database.cc +++ b/chrome/browser/dips/dips_database.cc
@@ -83,11 +83,11 @@ // Version number of the database. // NOTE: When changing the version, add a new golden file for the new version // and a test to verify that Init() works with it. -const int kCurrentVersionNumber = 4; +const int kCurrentVersionNumber = 5; // This number represents the min database version number with which this chrome // code will be compatible with. -const int kCompatibleVersionNumber = 4; +const int kCompatibleVersionNumber = 5; } // namespace // See comments at declaration of these variables in dips_database.h @@ -188,6 +188,7 @@ "popup_site TEXT NOT NULL," "access_id INT64," "last_popup_time INTEGER," + "is_current_interaction BOOLEAN," "PRIMARY KEY (`opener_site`,`popup_site`)" ")"; // clang-format on @@ -345,6 +346,16 @@ return db_->Execute(kCreatePopupsTableSql) && meta_table_.SetVersionNumber(4); } +bool DIPSDatabase::MigrateToVersion5() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(db_->HasActiveTransactions()); + + return db_->Execute( + "ALTER TABLE popups ADD COLUMN is_current_interaction " + "BOOLEAN DEFAULT NULL") && + meta_table_.SetVersionNumber(5); +} + bool DIPSDatabase::MigrateAsNeeded() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -378,6 +389,15 @@ return false; } break; + case 5: + if (!MigrateToVersion5()) { + return false; + } + if (!meta_table_.SetCompatibleVersionNumber( + std::min(next_version, kCompatibleVersionNumber))) { + return false; + } + break; } } return true; @@ -549,7 +569,8 @@ bool DIPSDatabase::WritePopup(const std::string& opener_site, const std::string& popup_site, const uint64_t access_id, - const base::Time& popup_time) { + const base::Time& popup_time, + bool is_current_interaction) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!CheckDBInit()) { return false; @@ -560,8 +581,9 @@ "opener_site," "popup_site," "access_id," - "last_popup_time" - ") VALUES(?,?,?,?)"; + "last_popup_time," + "is_current_interaction" + ") VALUES(?,?,?,?,?)"; // clang-format on DCHECK(db_->IsSQLValid(kWriteSql)); @@ -570,6 +592,7 @@ statement.BindString(1, popup_site); statement.BindInt64(2, access_id); statement.BindTime(3, popup_time); + statement.BindBool(4, is_current_interaction); return statement.Run(); } @@ -687,7 +710,8 @@ "SELECT opener_site," "popup_site," "access_id," - "last_popup_time " + "last_popup_time, " + "is_current_interaction " "FROM popups " "WHERE opener_site=? AND popup_site=?"; // clang-format on @@ -706,8 +730,10 @@ if (!popup_time.has_value()) { return absl::nullopt; } + bool is_current_interaction = statement.ColumnBool(4); - return PopupsStateValue{access_id, popup_time.value()}; + return PopupsStateValue{access_id, popup_time.value(), + is_current_interaction}; } std::vector<std::string> DIPSDatabase::GetAllSitesForTesting(
diff --git a/chrome/browser/dips/dips_database.h b/chrome/browser/dips/dips_database.h index cb97e80..02788c2d 100644 --- a/chrome/browser/dips/dips_database.h +++ b/chrome/browser/dips/dips_database.h
@@ -56,8 +56,16 @@ // extra columns for recording the first and last time a web authn assertion // was called. bool MigrateToVersion3(); + + // Migrates from v2 to v3 of the DIPS database schema. This migration adds a + // Popups table for recording popupts with a current or prior user + // interaction. bool MigrateToVersion4(); + // Migrates from v2 to v3 of the DIPS database schema. This migration adds an + // `is_current_interaction` field to the Popups table. + bool MigrateToVersion5(); + // DIPS Bounce table functions ----------------------------------------------- bool Write(const std::string& site, const TimestampRange& storage_times, @@ -69,7 +77,8 @@ bool WritePopup(const std::string& opener_site, const std::string& popup_site, const uint64_t access_id, - const base::Time& popup_time); + const base::Time& popup_time, + bool is_current_interaction); // This is implicitly `inline`. Don't move its definition to the .cc file. bool HasExpired(absl::optional<base::Time> time) {
diff --git a/chrome/browser/dips/dips_database_unittest.cc b/chrome/browser/dips/dips_database_unittest.cc index 2cc9581..eb9b87f 100644 --- a/chrome/browser/dips/dips_database_unittest.cc +++ b/chrome/browser/dips/dips_database_unittest.cc
@@ -38,8 +38,8 @@ namespace { -const int kCurrentVersionNumber = 4; -const int kCompatibleVersionNumber = 4; +const int kCurrentVersionNumber = 5; +const int kCompatibleVersionNumber = 5; class TestDatabase : public DIPSDatabase { public: @@ -392,13 +392,17 @@ GetSiteForDIPS(GURL("http://www.doubleclick.net/")); uint64_t access_id = 123; base::Time popup_time = Time::FromDoubleT(1); + bool is_current_interaction = true; - EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, access_id, popup_time)); + EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, access_id, popup_time, + is_current_interaction)); auto popups_state_value = db_->ReadPopup(opener_site, popup_site); ASSERT_TRUE(popups_state_value.has_value()); EXPECT_EQ(popups_state_value.value().access_id, access_id); EXPECT_EQ(popups_state_value.value().last_popup_time, popup_time); + EXPECT_EQ(popups_state_value.value().is_current_interaction, + is_current_interaction); } // Test updating entries in the `popups` table of the DIPSDatabase. @@ -414,7 +418,8 @@ // Write the initial entry and verify it was added to the db. EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, first_access_id, - first_popup_time)); + first_popup_time, + /*is_current_interaction=*/true)); EXPECT_EQ(db_->ReadPopup(opener_site, popup_site) .value_or(PopupsStateValue()) .last_popup_time, @@ -422,13 +427,15 @@ // Update the entry with a new popup time of t = 2. EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, second_access_id, - second_popup_time)); + second_popup_time, + /*is_current_interaction=*/false)); // Verify the new entry. auto popups_state_value = db_->ReadPopup(opener_site, popup_site); ASSERT_TRUE(popups_state_value.has_value()); EXPECT_EQ(popups_state_value.value().access_id, second_access_id); EXPECT_EQ(popups_state_value.value().last_popup_time, second_popup_time); + EXPECT_EQ(popups_state_value.value().is_current_interaction, false); } // Test deleting an entry from the `popups` table of the DIPSDatabase. An entry @@ -443,7 +450,8 @@ base::Time popup_time = Time::FromDoubleT(1); // Write the popup to db, and verify. - EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, access_id, popup_time)); + EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, access_id, popup_time, + /*is_current_interaction=*/true)); EXPECT_TRUE(db_->ReadPopup(opener_site, popup_site).has_value()); // Delete the entry in db by opener_site, and verify. @@ -451,7 +459,8 @@ EXPECT_FALSE(db_->ReadPopup(opener_site, popup_site).has_value()); // Write the popup to db, and verify. - EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, access_id, popup_time)); + EXPECT_TRUE(db_->WritePopup(opener_site, popup_site, access_id, popup_time, + /*is_current_interaction=*/true)); EXPECT_TRUE(db_->ReadPopup(opener_site, popup_site).has_value()); // Delete the entry in db by popup_site, and verify. @@ -469,9 +478,11 @@ const std::string popup_site = GetSiteForDIPS(GURL("http://www.doubleclick.net/")); EXPECT_TRUE(db_->WritePopup(opener_site_1, popup_site, - /*access_id=*/123, Time::FromDoubleT(1))); + /*access_id=*/123, Time::FromDoubleT(1), + /*is_current_interaction=*/true)); EXPECT_TRUE(db_->WritePopup(opener_site_2, popup_site, - /*access_id=*/456, Time::FromDoubleT(2))); + /*access_id=*/456, Time::FromDoubleT(2), + /*is_current_interaction=*/true)); // Verify that both sites are in the `popups` table. EXPECT_TRUE(db_->ReadPopup(opener_site_1, popup_site).has_value()); @@ -660,9 +671,11 @@ const base::Time second_popup_time = Time::FromDoubleT(2); EXPECT_TRUE(db_->WritePopup(opener_site_1, popup_site, - /*access_id=*/123, first_popup_time)); + /*access_id=*/123, first_popup_time, + /*is_current_interaction=*/true)); EXPECT_TRUE(db_->WritePopup(opener_site_2, popup_site, - /*access_id=*/456, second_popup_time)); + /*access_id=*/456, second_popup_time, + /*is_current_interaction=*/true)); // Advance to just before the first popup expires. AdvanceTimeTo(first_popup_time + DIPSDatabase::kPopupTtl - tiny_delta); @@ -1133,7 +1146,8 @@ waa_times)); } else { ASSERT_TRUE(db_->WritePopup(site, "doubleclick.net", /*access_id=*/123, - interaction_times->second)); + interaction_times->second, + /*is_current_interaction=*/true)); } } @@ -1165,7 +1179,8 @@ } else { ASSERT_TRUE(db_->WritePopup(base::StringPrintf("entry%d.test", 7 - i), "doubleclick.net", /*access_id=*/123, - times[(i + 1) % 3])); + times[(i + 1) % 3], + /*is_current_interaction=*/true)); } for (auto& time : times) { time += tiny_delta * 3; @@ -1180,7 +1195,8 @@ } else { ASSERT_TRUE(db_->WritePopup(base::StringPrintf("entry%d.test", 7 - i), "doubleclick.net", /*access_id=*/123, - times[(i + 1) % 3])); + times[(i + 1) % 3], + /*is_current_interaction=*/true)); } for (auto& time : times) { time += tiny_delta * 3; @@ -1524,11 +1540,16 @@ ASSERT_TRUE(sql::test::CreateDatabaseFromSQL(db_path(), file_path)); } - std::string DbToString(sql::Database* db) { + std::string DbBouncesToString(sql::Database* db) { return sql::test::ExecuteWithResults( db, "SELECT * FROM bounces ORDER BY site", "|", "\n"); } + std::string DbPopupsToString(sql::Database* db) { + return sql::test::ExecuteWithResults( + db, "SELECT * FROM popups ORDER BY opener_site", "|", "\n"); + } + private: base::test::ScopedFeatureList features_; std::unique_ptr<TestDatabase> db_; @@ -1607,7 +1628,7 @@ kCurrentVersionNumber + tiny_increment); // These values are all set in v2.sql. - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|||4|4|1|4|2|6\n" "stateful-bounce.test|||4|4|1|1||\n" "stateless-bounce.test|||4|4|||1|1\n" @@ -1634,7 +1655,7 @@ EXPECT_TRUE(db.DoesColumnExist("bounces", "last_web_authn_assertion_time")); // As expected the database is razed after migration. - EXPECT_EQ(DbToString(&db), ""); + EXPECT_EQ(DbBouncesToString(&db), ""); } } @@ -1660,7 +1681,7 @@ db.DoesColumnExist("bounces", "last_web_authn_assertion_time")); // These values are all set in v1.sql. - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|0|0|4|4|1|4|2|6\n" "stateful-bounce.test|0|0|4|4|1|1|0|0\n" "stateless-bounce.test|0|0|4|4|0|0|1|1\n" @@ -1729,7 +1750,7 @@ // Notably: // - All zeros are transformed to NULL, and // - Four extra columns were added. - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|||4|4|1|4|1|6||\n" "stateful-bounce.test|||4|4|1|1|1|1||\n" "stateless-bounce.test|||4|4|||1|1||\n" @@ -1791,7 +1812,7 @@ EXPECT_FALSE( db.DoesColumnExist("bounces", "last_web_authn_assertion_time")); - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|||4|4|1|4|2|6\n" "stateful-bounce.test|||4|4|1|1||\n" "stateless-bounce.test|||4|4|||1|1\n" @@ -1816,7 +1837,7 @@ db.DoesColumnExist("bounces", "first_web_authn_assertion_time")); EXPECT_TRUE(db.DoesColumnExist("bounces", "last_web_authn_assertion_time")); - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|||4|4|1|4|2|6||\n" "stateful-bounce.test|||4|4|1|1||||\n" "stateless-bounce.test|||4|4|||1|1||\n" @@ -1838,7 +1859,7 @@ EXPECT_FALSE(db.DoesTableExist("popups")); - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|||4|4|1|4|2|6||\n" "stateful-bounce.test|||4|4|1|1||||\n" "stateless-bounce.test|||4|4|||1|1||\n" @@ -1863,10 +1884,53 @@ EXPECT_TRUE(db.DoesColumnExist("popups", "access_id")); EXPECT_TRUE(db.DoesColumnExist("popups", "last_popup_time")); - EXPECT_EQ(DbToString(&db), + EXPECT_EQ(DbBouncesToString(&db), "both-bounce-kinds.test|||4|4|1|4|2|6||\n" "stateful-bounce.test|||4|4|1|1||||\n" "stateless-bounce.test|||4|4|||1|1||\n" "storage.test|1|1|4|4||||||"); } } + +TEST_F(DIPSDatabaseMigrationTest, MigrateV4ToCurrentVersion) { + ASSERT_NO_FATAL_FAILURE(LoadDatabase("v4.sql")); + + // Verify pre migration conditions. + { + sql::Database db; + ASSERT_TRUE(db.Open(db_path())); + + EXPECT_EQ(GetDatabaseVersion(&db), 4); + EXPECT_EQ(GetDatabaseLastCompatibleVersion(&db), 4); + EXPECT_EQ(GetDatabasePrepopulated(&db), 1); + + EXPECT_TRUE(db.DoesColumnExist("popups", "opener_site")); + EXPECT_TRUE(db.DoesColumnExist("popups", "popup_site")); + EXPECT_TRUE(db.DoesColumnExist("popups", "access_id")); + EXPECT_TRUE(db.DoesColumnExist("popups", "last_popup_time")); + + EXPECT_EQ(DbPopupsToString(&db), + "site1.com|3p-site.com|123|2023-10-01 12:00:00\n" + "site2.com|3p-site.com|456|2023-10-02 12:00:00"); + } + + MigrateDatabase(); + + // Verify post migration conditions. + { + sql::Database db; + ASSERT_TRUE(db.Open(db_path())); + + EXPECT_EQ(GetDatabaseVersion(&db), kCurrentVersionNumber); + EXPECT_EQ(GetDatabaseLastCompatibleVersion(&db), kCompatibleVersionNumber); + EXPECT_EQ(GetDatabasePrepopulated(&db), 1); + + ASSERT_TRUE(db.DoesTableExist("bounces")); + ASSERT_TRUE(db.DoesTableExist("popups")); + EXPECT_TRUE(db.DoesColumnExist("popups", "is_current_interaction")); + + EXPECT_EQ(DbPopupsToString(&db), + "site1.com|3p-site.com|123|2023-10-01 12:00:00|\n" + "site2.com|3p-site.com|456|2023-10-02 12:00:00|"); + } +}
diff --git a/chrome/browser/dips/dips_storage.cc b/chrome/browser/dips/dips_storage.cc index 640eabb..459195f 100644 --- a/chrome/browser/dips/dips_storage.cc +++ b/chrome/browser/dips/dips_storage.cc
@@ -116,12 +116,13 @@ bool DIPSStorage::WritePopup(const std::string& first_party_site, const std::string& tracking_site, const uint64_t access_id, - const base::Time& popup_time) { + const base::Time& popup_time, + bool is_current_interaction) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(db_); - return db_->WritePopup(first_party_site, tracking_site, access_id, - popup_time); + return db_->WritePopup(first_party_site, tracking_site, access_id, popup_time, + is_current_interaction); } void DIPSStorage::RemoveEvents(base::Time delete_begin,
diff --git a/chrome/browser/dips/dips_storage.h b/chrome/browser/dips/dips_storage.h index a1e2fda4..f94f248 100644 --- a/chrome/browser/dips/dips_storage.h +++ b/chrome/browser/dips/dips_storage.h
@@ -38,7 +38,8 @@ bool WritePopup(const std::string& first_party_site, const std::string& tracking_site, const uint64_t access_id, - const base::Time& popup_time); + const base::Time& popup_time, + bool is_current_interaction); void RemoveEvents(base::Time delete_begin, base::Time delete_end,
diff --git a/chrome/browser/dips/dips_storage_unittest.cc b/chrome/browser/dips/dips_storage_unittest.cc index 07ca5fd..433a1811 100644 --- a/chrome/browser/dips/dips_storage_unittest.cc +++ b/chrome/browser/dips/dips_storage_unittest.cc
@@ -644,11 +644,14 @@ base::Time delete_end = base::Time::FromDoubleT(5); ASSERT_TRUE(storage_.WritePopup(site1, site2, /*access_id=*/1u, - base::Time::FromDoubleT(2))); + base::Time::FromDoubleT(2), + /*is_current_interaction=*/true)); ASSERT_TRUE(storage_.WritePopup(site1, site3, /*access_id=*/2u, - base::Time::FromDoubleT(4))); + base::Time::FromDoubleT(4), + /*is_current_interaction=*/true)); ASSERT_TRUE(storage_.WritePopup(site2, site3, /*access_id=*/3u, - base::Time::FromDoubleT(6))); + base::Time::FromDoubleT(6), + /*is_current_interaction=*/false)); storage_.RemoveEvents(delete_begin, delete_end, nullptr, DIPSEventRemovalType::kHistory); @@ -659,6 +662,7 @@ ASSERT_TRUE(popup1.has_value()); EXPECT_EQ(popup1.value().access_id, 1u); EXPECT_EQ(popup1.value().last_popup_time, base::Time::FromDoubleT(2)); + EXPECT_TRUE(popup1.value().is_current_interaction); absl::optional<PopupsStateValue> popup2 = storage_.ReadPopup(site1, site3); ASSERT_FALSE(popup2.has_value()); @@ -667,6 +671,7 @@ ASSERT_TRUE(popup3.has_value()); EXPECT_EQ(popup3.value().access_id, 3u); EXPECT_EQ(popup3.value().last_popup_time, base::Time::FromDoubleT(6)); + EXPECT_FALSE(popup3.value().is_current_interaction); } TEST_F(DIPSStorageTest, RemoveByTimeBounces) {
diff --git a/chrome/browser/dips/dips_utils.h b/chrome/browser/dips/dips_utils.h index 41f39ada..0c2c4ae 100644 --- a/chrome/browser/dips/dips_utils.h +++ b/chrome/browser/dips/dips_utils.h
@@ -147,6 +147,7 @@ struct PopupsStateValue { uint64_t access_id; base::Time last_popup_time; + bool is_current_interaction; }; inline bool operator==(const StateValue& lhs, const StateValue& rhs) {
diff --git a/chrome/browser/download/bubble/download_bubble_update_service.cc b/chrome/browser/download/bubble/download_bubble_update_service.cc index 4e6278a..b6dfd32 100644 --- a/chrome/browser/download/bubble/download_bubble_update_service.cc +++ b/chrome/browser/download/bubble/download_bubble_update_service.cc
@@ -140,6 +140,12 @@ return true; } +// For GetAllModelsToDisplay()'s iteration over the merged caches, don't stop +// until all models have been processed. +bool NeverStop() { + return false; +} + void UpdateInfoForModel(const DownloadUIModel& model, base::Time cutoff_time, DownloadBubbleDisplayInfo& info) { @@ -198,6 +204,12 @@ return !(*this == other || *this < other); } +// static +DownloadBubbleUpdateService::ItemSortKey +DownloadBubbleUpdateService::ItemSortKey::Min() { + return ItemSortKey{kInProgressActive, base::Time::Max()}; +} + DownloadBubbleUpdateService::CacheManager::CacheManager( DownloadBubbleUpdateService* update_service) : update_service_(update_service) { @@ -386,36 +398,17 @@ // criteria for pruning requires the model, to avoid unnecessary creation and // destruction of models, we collect the models to return and prune items in // the same loop iteration. - auto download_item_it = download_items_.begin(); - auto offline_item_it = offline_items_.begin(); - while (download_item_it != download_items_.end() || - offline_item_it != offline_items_.end()) { - // If the current download item sorts before the current offline item (or we - // are out of offline items), take the download item. - if (download_item_it != download_items_.end() && - (offline_item_it == offline_items_.end() || - download_item_it->first < offline_item_it->first)) { - if (!MaybeAddDownloadItemModel(download_item_it->second, cutoff_time, - models)) { - download_item_it = RemoveItemFromCacheByIter( - download_item_it, download_items_, download_items_iter_map_); - download_item_pruned = true; - } else { - ++download_item_it; - } - } else { - // Else, the current offline item sorts before the current download item - // (or we are out of download items), so take the offline item. - if (!MaybeAddOfflineItemModel(offline_item_it->second, cutoff_time, - models)) { - offline_item_it = RemoveItemFromCacheByIter( - offline_item_it, offline_items_, offline_items_iter_map_); - offline_item_pruned = true; - } else { - ++offline_item_it; - } - } - } + IterateOverMergedCaches( + base::BindRepeating(&DownloadBubbleUpdateService::CacheManager:: + GetDownloadItemModelToDisplayOrPrune, + base::Unretained(this), cutoff_time, std::ref(models), + std::ref(download_item_pruned)), + base::BindRepeating(&DownloadBubbleUpdateService::CacheManager:: + GetOfflineItemModelToDisplayOrPrune, + base::Unretained(this), cutoff_time, std::ref(models), + std::ref(offline_item_pruned)), + base::BindRepeating(&NeverStop)); + CHECK_LE(models.size(), GetMaxNumItemsToShow()); bool download_items_need_backfill = @@ -425,8 +418,7 @@ if (download_items_need_backfill) { // A key that will sort before any other key. - ItemSortKey last_download_item_key{ItemSortKey::kInProgressActive, - base::Time::Now()}; + ItemSortKey last_download_item_key = ItemSortKey::Min(); if (!download_items_.empty()) { last_download_item_key = GetLastIter(download_items_)->first; } @@ -443,8 +435,7 @@ if (offline_items_need_backfill) { // A key that will sort before any other key. - ItemSortKey last_offline_item_key{ItemSortKey::kInProgressActive, - base::Time::Now()}; + ItemSortKey last_offline_item_key = ItemSortKey::Min(); if (!offline_items_.empty()) { last_offline_item_key = GetLastIter(offline_items_)->first; } @@ -458,6 +449,37 @@ !(download_items_need_backfill || offline_items_need_backfill); } +void DownloadBubbleUpdateService::CacheManager:: + GetDownloadItemModelToDisplayOrPrune( + base::Time cutoff_time, + std::vector<DownloadUIModel::DownloadUIModelPtr>& models, + bool& download_item_pruned, + SortedDownloadItems::iterator& download_item_it) { + if (!MaybeAddDownloadItemModel(download_item_it->second, cutoff_time, + models)) { + download_item_it = RemoveItemFromCacheByIter( + download_item_it, download_items_, download_items_iter_map_); + download_item_pruned = true; + } else { + ++download_item_it; + } +} + +void DownloadBubbleUpdateService::CacheManager:: + GetOfflineItemModelToDisplayOrPrune( + base::Time cutoff_time, + std::vector<DownloadUIModel::DownloadUIModelPtr>& models, + bool& offline_item_pruned, + SortedOfflineItems::iterator& offline_item_it) { + if (!MaybeAddOfflineItemModel(offline_item_it->second, cutoff_time, models)) { + offline_item_it = RemoveItemFromCacheByIter(offline_item_it, offline_items_, + offline_items_iter_map_); + offline_item_pruned = true; + } else { + ++offline_item_it; + } +} + bool DownloadBubbleUpdateService::GetAllModelsToDisplay( std::vector<DownloadUIModelPtr>& models, const webapps::AppId* web_app_id, @@ -487,11 +509,12 @@ return DownloadBubbleDisplayInfo::EmptyInfo(); } -void DownloadBubbleUpdateService::CacheManager::UpdateAllModelsInfo() { +void DownloadBubbleUpdateService::CacheManager::UpdateDisplayInfo() { #if DCHECK_IS_ON() ConsistencyCheckCaches(); #endif // DCHECK_IS_ON() + // A new info is constructed from scratch based on the current cache contents. DownloadBubbleDisplayInfo info; base::Time cutoff_time = GetCutoffTime(); @@ -499,6 +522,54 @@ // combined/merged sorted order. This is done in the same way as in // GetAllItemsToDisplay() to ensure that the info most accurately represents // the list of items that would be returned from that method. + IterateOverMergedCaches( + base::BindRepeating(&DownloadBubbleUpdateService::CacheManager:: + UpdateDisplayInfoForDownloadItem, + base::Unretained(this), cutoff_time, std::ref(info)), + base::BindRepeating(&DownloadBubbleUpdateService::CacheManager:: + UpdateDisplayInfoForOfflineItem, + base::Unretained(this), cutoff_time, std::ref(info)), + base::BindRepeating(&DownloadBubbleUpdateService::CacheManager:: + ShouldStopUpdatingDisplayInfo, + base::Unretained(this), std::ref(info))); + + display_info_ = info; +} + +void DownloadBubbleUpdateService::CacheManager:: + UpdateDisplayInfoForDownloadItem( + base::Time cutoff_time, + DownloadBubbleDisplayInfo& info, + SortedDownloadItems::iterator& download_item_it) { + DownloadItemModel model( + download_item_it->second, + std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()); + UpdateInfoForModel(model, cutoff_time, info); + ++download_item_it; +} + +void DownloadBubbleUpdateService::CacheManager::UpdateDisplayInfoForOfflineItem( + base::Time cutoff_time, + DownloadBubbleDisplayInfo& info, + SortedOfflineItems::iterator& offline_item_it) { + OfflineItemModel model( + update_service_->GetOfflineManager(), offline_item_it->second, + std::make_unique<DownloadUIModel::BubbleStatusTextBuilder>()); + UpdateInfoForModel(model, cutoff_time, info); + ++offline_item_it; +} + +bool DownloadBubbleUpdateService::CacheManager::ShouldStopUpdatingDisplayInfo( + const DownloadBubbleDisplayInfo& info) { + return info.all_models_size >= GetMaxNumItemsToShow(); +} + +void DownloadBubbleUpdateService::CacheManager::IterateOverMergedCaches( + base::RepeatingCallback<void(SortedDownloadItems::iterator&)> + download_item_action, + base::RepeatingCallback<void(SortedOfflineItems::iterator&)> + offline_item_action, + base::RepeatingCallback<bool()> should_stop) { auto download_item_it = download_items_.begin(); auto offline_item_it = offline_items_.begin(); while (download_item_it != download_items_.end() || @@ -508,23 +579,16 @@ if (download_item_it != download_items_.end() && (offline_item_it == offline_items_.end() || download_item_it->first < offline_item_it->first)) { - DownloadItemModel model(download_item_it->second); - UpdateInfoForModel(model, cutoff_time, info); - ++download_item_it; + download_item_action.Run(download_item_it); } else { // Else, the current offline item sorts before the current download item // (or we are out of download items), so take the offline item. - OfflineItemModel model(update_service_->GetOfflineManager(), - offline_item_it->second); - UpdateInfoForModel(model, cutoff_time, info); - ++offline_item_it; + offline_item_action.Run(offline_item_it); } - if (info.all_models_size >= GetMaxNumItemsToShow()) { + if (should_stop.Run()) { break; } } - - display_info_ = info; } ProgressInfo DownloadBubbleUpdateService::CacheManager::GetProgressInfo() @@ -926,7 +990,7 @@ cache.erase(to_remove); } - UpdateAllModelsInfo(); + UpdateDisplayInfo(); CHECK(!cache.empty()); auto last_it = GetLastIter(cache); @@ -958,7 +1022,7 @@ cache.erase(iter_map_it->second); iter_map.erase(iter_map_it); - UpdateAllModelsInfo(); + UpdateDisplayInfo(); CHECK(cache.size() < GetNumItemsToCache()); return true; @@ -975,7 +1039,7 @@ iter_map.erase(GetItemId(iter->second)); cache.erase(iter); - UpdateAllModelsInfo(); + UpdateDisplayInfo(); return next_iter; } @@ -1168,7 +1232,7 @@ return; } - GetCacheForItem(item).UpdateAllModelsInfo(); + GetCacheForItem(item).UpdateDisplayInfo(); auto* web_app_data = DownloadItemWebAppData::Get(item); for (Browser* browser : chrome::FindAllBrowsersWithProfile(profile_)) {
diff --git a/chrome/browser/download/bubble/download_bubble_update_service.h b/chrome/browser/download/bubble/download_bubble_update_service.h index 906e0125..ca49839 100644 --- a/chrome/browser/download/bubble/download_bubble_update_service.h +++ b/chrome/browser/download/bubble/download_bubble_update_service.h
@@ -54,6 +54,9 @@ bool operator!=(const ItemSortKey& other) const; bool operator>(const ItemSortKey& other) const; + // Returns a key that sorts before any other. + static ItemSortKey Min(); + // Active in-progress items come before paused items, which come before // not-in-progress items. State state; @@ -233,12 +236,29 @@ bool IsDownloadItemCacheAtMax() const; bool IsOfflineItemCacheAtMax() const; - // See comments on the public DownloadBubbleUpdateService methods of the + // See comments on the public DownloadBubbleUpdateService method of the // same name. bool GetAllModelsToDisplay( std::vector<DownloadUIModel::DownloadUIModelPtr>& models, bool force_backfill_download_items = false); + // Implements the above. + void GetDownloadItemModelToDisplayOrPrune( + base::Time cutoff_time, + std::vector<DownloadUIModel::DownloadUIModelPtr>& models, + bool& download_item_pruned, + SortedDownloadItems::iterator& download_item_it); + void GetOfflineItemModelToDisplayOrPrune( + base::Time cutoff_time, + std::vector<DownloadUIModel::DownloadUIModelPtr>& models, + bool& offline_item_pruned, + SortedOfflineItems::iterator& offline_item_it); + + // See comments on the public DownloadBubbleUpdateService method of the + // same name. const DownloadBubbleDisplayInfo& GetDisplayInfo() const; + + // See comments on the public DownloadBubbleUpdateService method of the + // same name. DownloadDisplay::ProgressInfo GetProgressInfo() const; // Adds an item to the cache if it is recent enough and meets other criteria @@ -272,9 +292,19 @@ bool RemoveOfflineItemFromCache( const offline_items_collection::ContentId& id); - // Updates |all_models_info_| based on the current contents of the cache. + // Updates |display_info_| based on the current contents of the cache. // This is kept updated as items are added or removed from the cache. - void UpdateAllModelsInfo(); + void UpdateDisplayInfo(); + // Implements the above. + void UpdateDisplayInfoForDownloadItem( + base::Time cutoff_time, + DownloadBubbleDisplayInfo& info, + SortedDownloadItems::iterator& download_item_it); + void UpdateDisplayInfoForOfflineItem( + base::Time cutoff_time, + DownloadBubbleDisplayInfo& info, + SortedOfflineItems::iterator& offline_item_it); + bool ShouldStopUpdatingDisplayInfo(const DownloadBubbleDisplayInfo& info); // Clears the cache. void DropAllDownloadItems(); @@ -285,6 +315,18 @@ size_t GetMaxNumItemsToShow() const; size_t GetNumItemsToCache() const; + // Implements the loop that iterates over the download item and offline item + // caches and merges them, running `download_item_action` if we take a + // download item and running `offline_item_action` if we take an offline + // action (these should also advance the corresponding iterator). Iterates + // until `should_stop` returns true or all items have been processed. + void IterateOverMergedCaches( + base::RepeatingCallback<void(SortedDownloadItems::iterator&)> + download_item_action, + base::RepeatingCallback<void(SortedOfflineItems::iterator&)> + offline_item_action, + base::RepeatingCallback<bool()> should_stop); + template <typename Id, typename Item> bool AddItemToCacheImpl(Item item, SortedItems<Item>& cache,
diff --git a/chrome/browser/enterprise/remote_commands/user_remote_commands_service.cc b/chrome/browser/enterprise/remote_commands/user_remote_commands_service.cc new file mode 100644 index 0000000..d9cd4b0 --- /dev/null +++ b/chrome/browser/enterprise/remote_commands/user_remote_commands_service.cc
@@ -0,0 +1,31 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service.h" + +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_factory.h" +#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "components/policy/core/common/cloud/user_cloud_policy_manager.h" + +namespace enterprise_commands { + +UserRemoteCommandsService::UserRemoteCommandsService(Profile* profile) + : policy::UserRemoteCommandsServiceBase( + profile->GetUserCloudPolicyManager()->core()), + profile_(profile) {} +UserRemoteCommandsService::~UserRemoteCommandsService() = default; + +invalidation::ProfileInvalidationProvider* +UserRemoteCommandsService::GetInvalidationProvider() { + return invalidation::ProfileInvalidationProviderFactory::GetForProfile( + profile_); +} + +std::unique_ptr<policy::RemoteCommandsFactory> +UserRemoteCommandsService::GetFactory() { + return std::make_unique<UserRemoteCommandsFactory>(profile_); +} + +} // namespace enterprise_commands
diff --git a/chrome/browser/enterprise/remote_commands/user_remote_commands_service.h b/chrome/browser/enterprise/remote_commands/user_remote_commands_service.h new file mode 100644 index 0000000..a1069af --- /dev/null +++ b/chrome/browser/enterprise/remote_commands/user_remote_commands_service.h
@@ -0,0 +1,34 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/policy/core/browser/remote_commands/user_remote_commands_service_base.h" + +#include "base/memory/raw_ptr.h" + +#ifndef CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_H_ +#define CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_H_ + +class Profile; + +namespace enterprise_commands { + +class UserRemoteCommandsService : public policy::UserRemoteCommandsServiceBase { + public: + explicit UserRemoteCommandsService(Profile* profile); + UserRemoteCommandsService(const UserRemoteCommandsService&) = delete; + UserRemoteCommandsService& operator=(const UserRemoteCommandsService&) = + delete; + ~UserRemoteCommandsService() override; + + private: + // policy::UserRemoteCommandsServiceBase + invalidation::ProfileInvalidationProvider* GetInvalidationProvider() override; + std::unique_ptr<policy::RemoteCommandsFactory> GetFactory() override; + + raw_ptr<Profile> profile_; +}; + +} // namespace enterprise_commands + +#endif // CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_H_
diff --git a/chrome/browser/enterprise/remote_commands/user_remote_commands_service_browsertest.cc b/chrome/browser/enterprise/remote_commands/user_remote_commands_service_browsertest.cc new file mode 100644 index 0000000..5af4f15 --- /dev/null +++ b/chrome/browser/enterprise/remote_commands/user_remote_commands_service_browsertest.cc
@@ -0,0 +1,263 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "base/command_line.h" +#include "base/memory/raw_ptr.h" +#include "base/test/test_future.h" +#include "build/build_config.h" +#include "build/chromeos_buildflags.h" +#include "chrome/browser/browser_process.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h" +#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" +#include "chrome/browser/policy/chrome_browser_policy_connector.h" +#include "chrome/browser/policy/cloud/cloud_policy_test_utils.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_manager.h" +#include "chrome/browser/signin/identity_manager_factory.h" +#include "chrome/test/base/chrome_test_utils.h" +#include "components/invalidation/impl/fake_invalidation_service.h" +#include "components/invalidation/impl/profile_invalidation_provider.h" +#include "components/policy/core/browser/cloud/user_policy_signin_service_base.h" +#include "components/policy/core/common/cloud/cloud_policy_client.h" +#include "components/policy/core/common/cloud/cloud_policy_refresh_scheduler.h" +#include "components/policy/core/common/cloud/cloud_policy_store.h" +#include "components/policy/core/common/cloud/mock_cloud_policy_client.h" +#include "components/policy/core/common/cloud/user_cloud_policy_manager.h" +#include "components/policy/core/common/policy_switches.h" +#include "components/policy/proto/device_management_backend.pb.h" +#include "components/policy/test_support/embedded_policy_test_server.h" +#include "components/policy/test_support/policy_storage.h" +#include "components/policy/test_support/remote_commands_result_waiter.h" +#include "components/policy/test_support/remote_commands_state.h" +#include "components/policy/test_support/signature_provider.h" +#include "components/prefs/pref_service.h" +#include "components/signin/public/identity_manager/identity_manager.h" +#include "components/signin/public/identity_manager/identity_test_environment.h" +#include "components/signin/public/identity_manager/identity_test_utils.h" +#include "content/public/test/browser_test.h" +#include "content/public/test/test_utils.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +#if BUILDFLAG(IS_ANDROID) +#include "chrome/test/base/android/android_browser_test.h" +#else +#include "chrome/test/base/in_process_browser_test.h" +#endif + +using ::testing::_; +using ::testing::InvokeWithoutArgs; + +namespace em = enterprise_management; + +namespace enterprise_commands { + +namespace { + +constexpr char kTestUser[] = "test@example.com"; +constexpr int kCommandId = 1; + +std::unique_ptr<invalidation::InvalidationService> +CreateInvalidationServiceForSenderId(const std::string& fcm_sender_id) { + return std::make_unique<invalidation::FakeInvalidationService>(); +} + +std::unique_ptr<KeyedService> BuildFakeProfileInvalidationProvider( + content::BrowserContext* context) { + Profile* profile = Profile::FromBrowserContext(context); + return std::make_unique<invalidation::ProfileInvalidationProvider>( + std::make_unique<invalidation::ProfileIdentityProvider>( + IdentityManagerFactory::GetForProfile(profile)), + base::BindRepeating(&CreateInvalidationServiceForSenderId)); +} + +} // namespace + +class UserRemoteCommandsServiceTest : public PlatformBrowserTest { + public: + UserRemoteCommandsServiceTest() = default; + ~UserRemoteCommandsServiceTest() override = default; + + void SetUpInProcessBrowserTestFixture() override { + PlatformBrowserTest::SetUpOnMainThread(); + + test_server_ = std::make_unique<policy::EmbeddedPolicyTestServer>(); + ASSERT_TRUE(test_server_->Start()); + + test_server_->policy_storage()->add_managed_user("*"); + test_server_->policy_storage()->set_policy_user(kTestUser); + test_server_->policy_storage() + ->signature_provider() + ->SetUniversalSigningKeys(); + + base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + command_line->AppendSwitchASCII(policy::switches::kDeviceManagementUrl, + test_server_->GetServiceURL().spec()); + policy::ChromeBrowserPolicyConnector::EnableCommandLineSupportForTesting(); + } + + void CreatedBrowserMainParts( + content::BrowserMainParts* browser_main_parts) override { + PlatformBrowserTest::CreatedBrowserMainParts(browser_main_parts); + invalidation::ProfileInvalidationProviderFactory::GetInstance() + ->RegisterTestingFactory( + base::BindRepeating(&BuildFakeProfileInvalidationProvider)); + } + + // Mock a signed-in user. This is used by the UserCloudPolicyStore to pass + // the username to the UserCloudPolicyValidator. + void CreateIdentityTestEnv() { + identity_test_env_ = std::make_unique<signin::IdentityTestEnvironment>(); + identity_test_env_->MakePrimaryAccountAvailable( + kTestUser, signin::ConsentLevel::kSync); + } + + policy::UserCloudPolicyManager* InitCloudPolicyManager() { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + base::FilePath dest_path = + g_browser_process->profile_manager()->user_data_dir(); + profile_ = Profile::CreateProfile( + dest_path.Append(FILE_PATH_LITERAL("New Profile 1")), + /*delegate=*/nullptr, Profile::CreateMode::CREATE_MODE_SYNCHRONOUS); +#else + profile_ = chrome_test_utils::GetProfile(this); +#endif + policy::UserCloudPolicyManager* policy_manager = + profile()->GetUserCloudPolicyManager(); + policy_manager->Connect( + g_browser_process->local_state(), + policy::UserPolicySigninServiceBase::CreateCloudPolicyClient( + g_browser_process->browser_policy_connector() + ->device_management_service(), + g_browser_process->shared_url_loader_factory())); + + return policy_manager; + } + + // Register the user with fake DM Server. + void RegisterUser(policy::CloudPolicyClient* client) { + base::test::TestFuture<void> registered_signal; + policy::MockCloudPolicyClientObserver observer; + EXPECT_CALL(observer, OnRegistrationStateChanged(_)) + .WillOnce(InvokeWithoutArgs( + [®istered_signal]() { registered_signal.SetValue(); })); + client->AddObserver(&observer); + + ASSERT_FALSE(client->is_registered()); + policy::CloudPolicyClient::RegistrationParameters parameters( + em::DeviceRegisterRequest::BROWSER, + em::DeviceRegisterRequest::FLAVOR_USER_REGISTRATION); + client->Register(parameters, std::string(), "oauth_token_unused"); + EXPECT_TRUE(registered_signal.Wait()); + + ::testing::Mock::VerifyAndClearExpectations(&observer); + + client->RemoveObserver(&observer); + EXPECT_TRUE(client->is_registered()); + } + + // Remote command needs to verify the command with signing key and client id + // that is received with policy fetch. Here as we skipped the policy fetch + // in `SetUpOnMainThread`, those information are set directly. + void SetUpFakePolicyData(policy::UserCloudPolicyManager* policy_manager) { + auto* store = policy_manager->core()->store(); + auto fake_policy_data = std::make_unique<em::PolicyData>(); + fake_policy_data->set_device_id( + policy_manager->core()->client()->client_id()); + store->set_policy_data_for_testing(std::move(fake_policy_data)); + store->set_policy_signature_public_key_for_testing( + test_server_->policy_storage() + ->signature_provider() + ->GetCurrentKey() + ->public_key()); + } + + void SetUpOnMainThread() override { + policy::BrowserPolicyConnector* connector = + g_browser_process->browser_policy_connector(); + connector->ScheduleServiceInitialization(0); + + CreateIdentityTestEnv(); + + policy::UserCloudPolicyManager* policy_manager = InitCloudPolicyManager(); + + // Prevent auto policy fetch after register as we don't need to test that. + policy_manager->core()->client()->RemoveObserver( + policy_manager->core()->refresh_scheduler()); + + RegisterUser(policy_manager->core()->client()); + SetUpFakePolicyData(policy_manager); + } + + void TearDownOnMainThread() override { + identity_test_env_.reset(); +#if BUILDFLAG(IS_CHROMEOS_LACROS) + profile_.reset(); +#else + profile_ = nullptr; +#endif + } + + invalidation::FakeInvalidationService* GetInvalidationServiceForSenderId( + std::string sender_id) { + return static_cast<invalidation::FakeInvalidationService*>( + static_cast<invalidation::ProfileInvalidationProvider*>( + invalidation::ProfileInvalidationProviderFactory::GetInstance() + ->GetForProfile(profile())) + ->GetInvalidationServiceForCustomSender(sender_id)); + } + + void AddPendingRemoteCommand(const em::RemoteCommand& command) { + test_server_->remote_commands_state()->AddPendingRemoteCommand(command); + } + + em::RemoteCommandResult WaitForResult(int command_id) { + return policy::RemoteCommandsResultWaiter( + test_server_->remote_commands_state(), command_id) + .WaitAndGetResult(); + } + + Profile* profile() { +#if BUILDFLAG(IS_CHROMEOS_LACROS) + return profile_.get(); +#else + return profile_; +#endif + } + + private: +#if BUILDFLAG(IS_CHROMEOS_LACROS) + // For Lacros use non-main profile in these tests. + std::unique_ptr<Profile> profile_; +#else + raw_ptr<Profile> profile_; +#endif + + std::unique_ptr<policy::EmbeddedPolicyTestServer> test_server_; + std::unique_ptr<signin::IdentityTestEnvironment> identity_test_env_; +}; + +IN_PROC_BROWSER_TEST_F(UserRemoteCommandsServiceTest, Success) { + em::RemoteCommand command; + command.set_type(em::RemoteCommand_Type_BROWSER_CLEAR_BROWSING_DATA); + command.set_command_id(kCommandId); + command.set_payload("{}"); + AddPendingRemoteCommand(command); + + // Initial the `RemoteCommandService`. In real life, this part is handled + // by UserPolicySigninService which triggered by a real signin process. + // The initialization will automatically pull pending commands in the end. + auto* remote_command_service = + enterprise_commands::UserRemoteCommandsServiceFactory::GetForProfile( + profile()); + remote_command_service->Init(); + + em::RemoteCommandResult result = WaitForResult(kCommandId); + + EXPECT_EQ(em::RemoteCommandResult_ResultType_RESULT_SUCCESS, result.result()); +} + +} // namespace enterprise_commands
diff --git a/chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.cc b/chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.cc new file mode 100644 index 0000000..8bc2e05 --- /dev/null +++ b/chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.cc
@@ -0,0 +1,49 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h" + +#include "base/no_destructor.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service.h" +#include "chrome/browser/invalidation/profile_invalidation_provider_factory.h" +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/profiles/profile_selections.h" + +namespace enterprise_commands { + +// static +UserRemoteCommandsServiceFactory* +UserRemoteCommandsServiceFactory::GetInstance() { + static base::NoDestructor<UserRemoteCommandsServiceFactory> instance; + return instance.get(); +} + +// static +UserRemoteCommandsService* UserRemoteCommandsServiceFactory::GetForProfile( + Profile* profile) { + return static_cast<UserRemoteCommandsService*>( + GetInstance()->GetServiceForBrowserContext(profile, /*create=*/true)); +} +std::unique_ptr<KeyedService> +UserRemoteCommandsServiceFactory::BuildServiceInstanceForBrowserContext( + content::BrowserContext* context) const { + Profile* profile = Profile::FromBrowserContext(context); + // UserCloudPolicyManager doesn't exist for Lacros main profile or in some + // test environments. In those cases, we skip the creation of KeyedService + // here. + if (!profile->GetUserCloudPolicyManager()) { + return nullptr; + } + return std::make_unique<UserRemoteCommandsService>(profile); +} + +UserRemoteCommandsServiceFactory::UserRemoteCommandsServiceFactory() + : ProfileKeyedServiceFactory( + "UserRemoteCommands", + ProfileSelections::BuildRedirectedInIncognito()) { + DependsOn(invalidation::ProfileInvalidationProviderFactory::GetInstance()); +} +UserRemoteCommandsServiceFactory::~UserRemoteCommandsServiceFactory() = default; + +} // namespace enterprise_commands
diff --git a/chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h b/chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h new file mode 100644 index 0000000..f238b75 --- /dev/null +++ b/chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h
@@ -0,0 +1,38 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_FACTORY_H_ +#define CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_FACTORY_H_ + +#include "base/no_destructor.h" +#include "chrome/browser/profiles/profile_keyed_service_factory.h" + +namespace enterprise_commands { + +class UserRemoteCommandsService; + +class UserRemoteCommandsServiceFactory : public ProfileKeyedServiceFactory { + public: + static UserRemoteCommandsServiceFactory* GetInstance(); + static UserRemoteCommandsService* GetForProfile(Profile* profile); + + UserRemoteCommandsServiceFactory(const UserRemoteCommandsServiceFactory&) = + delete; + UserRemoteCommandsServiceFactory& operator=( + const UserRemoteCommandsServiceFactory&) = delete; + ~UserRemoteCommandsServiceFactory() override; + + private: + friend base::NoDestructor<UserRemoteCommandsServiceFactory>; + + // BrowserContextKeyedServiceFactory: + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( + content::BrowserContext* context) const override; + + UserRemoteCommandsServiceFactory(); +}; + +} // namespace enterprise_commands + +#endif // CHROME_BROWSER_ENTERPRISE_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_FACTORY_H_
diff --git a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc index 3ee59fc..1e9442a 100644 --- a/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc +++ b/chrome/browser/extensions/api/declarative_net_request/declarative_net_request_unittest.cc
@@ -1518,7 +1518,8 @@ const RulesMonitorService* service = RulesMonitorService::Get(browser_context()); - RuleCounts expected_count(100 /* rule_count */, 0 /* regex_rule_count */); + RuleCounts expected_count(/*rule_count=*/100, /*unsafe_rule_count=*/0, + /*regex_rule_count=*/0); EXPECT_EQ(expected_count, service->GetRuleCounts(extension()->id(), kDynamicRulesetID)); EXPECT_EQ(expected_count, @@ -1549,18 +1550,19 @@ session_rules.push_back(CreateGenericRule(rule_id++)); ASSERT_NO_FATAL_FAILURE( - RunUpdateRulesFunction(*extension(), {} /* rule_ids_to_remove */, + RunUpdateRulesFunction(*extension(), /*rule_ids_to_remove=*/{}, session_rules, RulesetScope::kSession)); // Add the same number of dynamic rules, it should succeed as well. std::vector<TestRule> dynamic_rules = session_rules; ASSERT_NO_FATAL_FAILURE( - RunUpdateRulesFunction(*extension(), {} /* rule_ids_to_remove */, + RunUpdateRulesFunction(*extension(), /*rule_ids_to_remove=*/{}, dynamic_rules, RulesetScope::kDynamic)); const RulesMonitorService* service = RulesMonitorService::Get(browser_context()); - RuleCounts expected_count(60 /* rule_count */, 50 /* regex_rule_count */); + RuleCounts expected_count(/*rule_count=*/60, /*unsafe_rule_count=*/0, + /*regex_rule_count=*/50); EXPECT_EQ(expected_count, service->GetRuleCounts(extension()->id(), kDynamicRulesetID)); EXPECT_EQ(expected_count, @@ -1569,20 +1571,20 @@ // Adding more regex based dynamic or session rules should fail. std::string expected_error = kDynamicRegexRuleCountExceeded; ASSERT_NO_FATAL_FAILURE(RunUpdateRulesFunction( - *extension(), {} /* rule_ids_to_remove */, {CreateRegexRule(rule_id++)}, + *extension(), /*rule_ids_to_remove=*/{}, {CreateRegexRule(rule_id++)}, RulesetScope::kDynamic, &expected_error)); expected_error = kSessionRegexRuleCountExceeded; ASSERT_NO_FATAL_FAILURE(RunUpdateRulesFunction( - *extension(), {} /* rule_ids_to_remove */, {CreateRegexRule(rule_id++)}, + *extension(), /*rule_ids_to_remove=*/{}, {CreateRegexRule(rule_id++)}, RulesetScope::kSession, &expected_error)); // Adding non-regex dynamic or session rules should still succeed. ASSERT_NO_FATAL_FAILURE(RunUpdateRulesFunction( - *extension(), {} /* rule_ids_to_remove */, - {CreateGenericRule(rule_id++)}, RulesetScope::kDynamic)); + *extension(), /*rule_ids_to_remove=*/{}, {CreateGenericRule(rule_id++)}, + RulesetScope::kDynamic)); ASSERT_NO_FATAL_FAILURE(RunUpdateRulesFunction( - *extension(), {} /* rule_ids_to_remove */, - {CreateGenericRule(rule_id++)}, RulesetScope::kSession)); + *extension(), /*rule_ids_to_remove=*/{}, {CreateGenericRule(rule_id++)}, + RulesetScope::kSession)); expected_count.rule_count++; EXPECT_EQ(expected_count,
diff --git a/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc b/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc index 2e1268e6..0bbbf4ae 100644 --- a/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc +++ b/chrome/browser/extensions/api/messaging/native_messaging_apitest.cc
@@ -89,8 +89,9 @@ NativeMessagingLaunchExeTest, testing::Bool()); +// DISABLED due to missing executable; crbug.com/1487674 IN_PROC_BROWSER_TEST_P(NativeMessagingLaunchExeTest, - UserLevelSendNativeMessageWinExe) { + DISABLED_UserLevelSendNativeMessageWinExe) { ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestExeHost( "native_messaging_test_echo_host.exe", /*user_level=*/true)); @@ -106,16 +107,17 @@ ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestExeHost( "native_messaging_test_echo_&_host.exe", /*user_level=*/false)); - ASSERT(RunExtensionTest("native_messaging_send_native_message_exe")); + ASSERT_TRUE(RunExtensionTest("native_messaging_send_native_message_exe")); } // Make sure that a filename with a space is supported. +// DISABLED due to missing executable; crbug.com/1487674 IN_PROC_BROWSER_TEST_P(NativeMessagingLaunchExeTest, - SendNativeMessageWinExeSpace) { + DISABLED_SendNativeMessageWinExeSpace) { ASSERT_NO_FATAL_FAILURE(test_host_.RegisterTestExeHost( "native_messaging_test_echo_ _host.exe", /*user_level=*/false)); - ASSERT(RunExtensionTest("native_messaging_send_native_message_exe")); + ASSERT_TRUE(RunExtensionTest("native_messaging_send_native_message_exe")); } #endif
diff --git a/chrome/browser/extensions/api/scripting/scripting_api.cc b/chrome/browser/extensions/api/scripting/scripting_api.cc index 5ce36df..859fbae 100644 --- a/chrome/browser/extensions/api/scripting/scripting_api.cc +++ b/chrome/browser/extensions/api/scripting/scripting_api.cc
@@ -1144,14 +1144,14 @@ api::scripting::UpdateContentScripts::Params::Create(args()); EXTENSION_FUNCTION_VALIDATE(params); - std::vector<api::scripting::RegisteredContentScript>& scripts = + std::vector<api::scripting::RegisteredContentScript>& scripts_to_update = params->scripts; std::string error; - // Add the prefix for dynamic content scripts onto the IDs of all scripts in - // `scripts` before continuing. + // Add the prefix for dynamic content scripts onto the IDs of all + // `scripts_to_update` before continuing. std::set<std::string> ids_to_update = scripting::CreateDynamicScriptIds( - scripts, UserScript::Source::kDynamicContentScript, + scripts_to_update, UserScript::Source::kDynamicContentScript, std::set<std::string>(), &error); if (!error.empty()) { @@ -1164,85 +1164,17 @@ ->user_script_manager() ->GetUserScriptLoaderForExtension(extension()->id()); - std::map<std::string, api::scripting::RegisteredContentScript> - loaded_scripts_metadata; - const UserScriptList& dynamic_scripts = loader->GetLoadedDynamicScripts(); - for (const std::unique_ptr<UserScript>& script : dynamic_scripts) { - if (script->GetSource() == UserScript::Source::kDynamicContentScript) { - loaded_scripts_metadata.emplace( - script->id(), CreateRegisteredContentScriptInfo(*script)); - } - } - - for (const auto& script : scripts) { - std::string error_script_id = UserScript::TrimPrefixFromScriptID(script.id); - if (loaded_scripts_metadata.find(script.id) == - loaded_scripts_metadata.end()) { - return RespondNow( - Error(base::StringPrintf("Script with ID '%s' does not exist " - "or is not fully registered", - error_script_id.c_str()))); - } - } - - std::u16string parse_error; - auto parsed_scripts = std::make_unique<UserScriptList>(); - const int valid_schemes = UserScript::ValidUserScriptSchemes( - scripting::kScriptsCanExecuteEverywhere); - std::set<std::string> updated_script_ids_to_persist; - std::set<std::string> persistent_script_ids = - loader->GetPersistentDynamicScriptIDs(); + std::unique_ptr<UserScriptList> parsed_scripts = scripting::UpdateScripts( + scripts_to_update, UserScript::Source::kDynamicContentScript, *loader, + base::BindRepeating(&CreateRegisteredContentScriptInfo), + base::BindRepeating(&ScriptingUpdateContentScriptsFunction::ApplyUpdate, + this, &updated_script_ids_to_persist), + &error); - parsed_scripts->reserve(scripts.size()); - for (size_t i = 0; i < scripts.size(); ++i) { - api::scripting::RegisteredContentScript& update_delta = scripts[i]; - DCHECK(base::Contains(loaded_scripts_metadata, update_delta.id)); - - api::scripting::RegisteredContentScript& updated_script = - loaded_scripts_metadata[update_delta.id]; - - if (update_delta.matches) - updated_script.matches = std::move(update_delta.matches); - - if (update_delta.exclude_matches) - updated_script.exclude_matches = std::move(update_delta.exclude_matches); - - if (update_delta.js) - updated_script.js = std::move(update_delta.js); - - if (update_delta.css) - updated_script.css = std::move(update_delta.css); - - if (update_delta.all_frames) - *updated_script.all_frames = *update_delta.all_frames; - - if (update_delta.match_origin_as_fallback) { - *updated_script.match_origin_as_fallback = - *update_delta.match_origin_as_fallback; - } - - if (update_delta.run_at != api::extension_types::RunAt::kNone) { - updated_script.run_at = update_delta.run_at; - } - - // Parse/Create user script. - std::unique_ptr<UserScript> user_script = - ParseUserScript(browser_context(), *extension(), updated_script, i, - valid_schemes, &parse_error); - if (!user_script) - return RespondNow(Error(base::UTF16ToASCII(parse_error))); - - // Persist the updated script if the flag is specified as true, or if the - // original script is persisted and the flag is not specified. - if ((update_delta.persist_across_sessions && - *update_delta.persist_across_sessions) || - (!update_delta.persist_across_sessions && - base::Contains(persistent_script_ids, update_delta.id))) { - updated_script_ids_to_persist.insert(update_delta.id); - } - - parsed_scripts->push_back(std::move(user_script)); + if (!error.empty()) { + CHECK(!parsed_scripts); + return RespondNow(Error(std::move(error))); } // Add new script IDs now in case another call with the same script IDs is @@ -1264,6 +1196,62 @@ return RespondLater(); } +std::unique_ptr<UserScript> ScriptingUpdateContentScriptsFunction::ApplyUpdate( + std::set<std::string>* script_ids_to_persist, + api::scripting::RegisteredContentScript& new_script, + api::scripting::RegisteredContentScript& original_script, + int definition_index, + std::u16string* parse_error) { + if (new_script.matches) { + original_script.matches = std::move(new_script.matches); + } + + if (new_script.exclude_matches) { + original_script.exclude_matches = std::move(new_script.exclude_matches); + } + + if (new_script.js) { + original_script.js = std::move(new_script.js); + } + + if (new_script.css) { + original_script.css = std::move(new_script.css); + } + + if (new_script.all_frames) { + *original_script.all_frames = *new_script.all_frames; + } + + if (new_script.match_origin_as_fallback) { + *original_script.match_origin_as_fallback = + *new_script.match_origin_as_fallback; + } + + if (new_script.run_at != api::extension_types::RunAt::kNone) { + original_script.run_at = new_script.run_at; + } + + // Parse content script. + const int valid_schemes = UserScript::ValidUserScriptSchemes( + scripting::kScriptsCanExecuteEverywhere); + std::unique_ptr<UserScript> parsed_script = + ParseUserScript(browser_context(), *extension(), original_script, + definition_index, valid_schemes, parse_error); + if (!parsed_script) { + return nullptr; + } + + // Persist the updated script if the flag is specified as true, or if the + // original script is persisted and the flag is not specified. + if (new_script.persist_across_sessions.value_or(false) || + (!new_script.persist_across_sessions && + base::Contains(*script_ids_to_persist, new_script.id))) { + script_ids_to_persist->insert(new_script.id); + } + + return parsed_script; +} + void ScriptingUpdateContentScriptsFunction::OnContentScriptFilesValidated( std::set<std::string> persistent_script_ids, scripting::ValidateScriptsResult result) { @@ -1292,18 +1280,9 @@ return; } - // To guarantee that scripts are updated, they need to be removed then added - // again. It should be guaranteed that the new scripts are added after the old - // ones are removed. - loader->RemoveDynamicScripts(script_ids, /*callback=*/base::DoNothing()); - - // Since RemoveDynamicScripts will remove pending script IDs, but - // AddDynamicScripts will only add scripts that are marked as pending, we must - // mark `script_ids` as pending again here. - loader->AddPendingDynamicScriptIDs(std::move(script_ids)); - - loader->AddDynamicScripts( - std::move(scripts), std::move(persistent_script_ids), + loader->UpdateDynamicScripts( + std::move(scripts), std::move(script_ids), + std::move(persistent_script_ids), base::BindOnce( &ScriptingUpdateContentScriptsFunction::OnContentScriptsUpdated, this));
diff --git a/chrome/browser/extensions/api/scripting/scripting_api.h b/chrome/browser/extensions/api/scripting/scripting_api.h index a9db6bc8..85ba09a 100644 --- a/chrome/browser/extensions/api/scripting/scripting_api.h +++ b/chrome/browser/extensions/api/scripting/scripting_api.h
@@ -191,6 +191,17 @@ private: ~ScriptingUpdateContentScriptsFunction() override; + // Returns a UserScript object by updating the `original_script` with the + // `new_script` given delta. If the updated script cannot be parsed, populates + // `parse_error` and returns nullptr. `definition_index` may be used for the + // error message. + std::unique_ptr<UserScript> ApplyUpdate( + std::set<std::string>* script_ids_to_persist, + api::scripting::RegisteredContentScript& new_script, + api::scripting::RegisteredContentScript& original_script, + int definition_index, + std::u16string* parse_error); + // Called when script files have been checked. void OnContentScriptFilesValidated( std::set<std::string> persistent_script_ids,
diff --git a/chrome/browser/extensions/api/user_scripts/user_scripts_apitest.cc b/chrome/browser/extensions/api/user_scripts/user_scripts_apitest.cc index c67b4f38..3c6287a 100644 --- a/chrome/browser/extensions/api/user_scripts/user_scripts_apitest.cc +++ b/chrome/browser/extensions/api/user_scripts/user_scripts_apitest.cc
@@ -51,6 +51,10 @@ ASSERT_TRUE(RunExtensionTest("user_scripts/unregister")) << message_; } +IN_PROC_BROWSER_TEST_F(UserScriptsAPITest, UpdateUserScripts) { + ASSERT_TRUE(RunExtensionTest("user_scripts/update")) << message_; +} + // Base test fixture for tests spanning multiple sessions where a custom arg is // set before the test is run. class PersistentUserScriptsAPITest : public UserScriptsAPITest {
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc index 5e59a73..c1f0b2d 100644 --- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc +++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.cc
@@ -246,9 +246,10 @@ ->GetServiceForBrowserContext(context, true)); } -KeyedService* WebAuthenticationProxyRegistrarFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +WebAuthenticationProxyRegistrarFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { - return new WebAuthenticationProxyRegistrar( + return std::make_unique<WebAuthenticationProxyRegistrar>( Profile::FromBrowserContext(context)); }
diff --git a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h index f36ed15..2899627a6 100644 --- a/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h +++ b/chrome/browser/extensions/api/web_authentication_proxy/web_authentication_proxy_service.h
@@ -42,6 +42,9 @@ public ExtensionRegistryObserver, public ProfileObserver { public: + explicit WebAuthenticationProxyRegistrar(Profile* profile); + ~WebAuthenticationProxyRegistrar() override; + // Sets the active request proxy. `profile` must be associated with this // instance (i.e. the regular profile or an associated off-the-record // profile). `extension` must be an enabled extension. @@ -80,10 +83,6 @@ using PassKey = base::PassKey<WebAuthenticationProxyRegistrar>; friend class WebAuthenticationProxyRegistrarFactory; - explicit WebAuthenticationProxyRegistrar(Profile* profile); - - ~WebAuthenticationProxyRegistrar() override; - // ExtensionRegistryObserver: void OnExtensionUnloaded(content::BrowserContext* browser_context, const Extension* extension, @@ -131,7 +130,7 @@ ~WebAuthenticationProxyRegistrarFactory() override; // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const override; };
diff --git a/chrome/browser/extensions/api/web_request/web_request_apitest.cc b/chrome/browser/extensions/api/web_request/web_request_apitest.cc index 1839565..a28c74f0 100644 --- a/chrome/browser/extensions/api/web_request/web_request_apitest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_apitest.cc
@@ -5595,7 +5595,6 @@ EXPECT_EQ(net::OK, nav_observer.last_net_error_code()); } - base::HistogramTester histogram_tester; // Now, navigate to block.example. This navigation should be blocked. { content::TestNavigationObserver nav_observer(web_contents); @@ -5604,16 +5603,6 @@ embedded_test_server()->GetURL("block.example", "/simple.html"))); EXPECT_EQ(net::ERR_BLOCKED_BY_CLIENT, nav_observer.last_net_error_code()); } - - // TODO(crbug.com/1441221): Create more targeted tests to confirm when metrics - // should be firing or not. - // Web request API events should not have metrics emitted for SW/MV3. - histogram_tester.ExpectTotalCount( - "Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2", - /*expected_count=*/0); - histogram_tester.ExpectTotalCount( - "Extensions.Events.DispatchToAckLongTime.ExtensionServiceWorker2", - /*expected_count=*/0); } // Tests a service worker-based extension registering multiple webRequest events
diff --git a/chrome/browser/extensions/event_metrics_browsertest.cc b/chrome/browser/extensions/event_metrics_browsertest.cc new file mode 100644 index 0000000..8ea2412 --- /dev/null +++ b/chrome/browser/extensions/event_metrics_browsertest.cc
@@ -0,0 +1,134 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/extensions/extension_browsertest.h" +#include "chrome/test/base/ui_test_utils.h" +#include "content/public/test/browser_test.h" +#include "extensions/test/extension_test_message_listener.h" +#include "testing/gtest/include/gtest/gtest.h" +namespace extensions { + +namespace { +// TODO(crbug.com/1441221): Create test cases where we test "failures" like +// events not acking. + +using EventMetricsBrowserTest = ExtensionBrowserTest; + +// Tests that the only the dispatch time histogram provided to the test is +// emitted with a sane value, and that other provided metrics are not emitted. +IN_PROC_BROWSER_TEST_F(EventMetricsBrowserTest, DispatchMetricTest) { + ASSERT_TRUE(embedded_test_server()->Start()); + struct { + const std::string event_metric_emitted; + ContextType context_type; + const std::vector<std::string> event_metrics_not_emitted; + } test_cases[] = { + // DispatchToAckTime + {"Extensions.Events.DispatchToAckTime.ExtensionEventPage2", + ContextType::kFromManifest, // event page + {"Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2"}}, + {"Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2", + ContextType::kServiceWorker, + {"Extensions.Events.DispatchToAckTime.ExtensionEventPage2"}}, + // TODO(crbug.com/1441221): Add `event_metrics_not_emitted` when other + // versions are created. + // DispatchToAckLongTime + {"Extensions.Events.DispatchToAckLongTime.ExtensionServiceWorker2", + ContextType::kServiceWorker, + {}}, + // DidDispatchToAckSucceed + {"Extensions.Events.DidDispatchToAckSucceed.ExtensionServiceWorker", + ContextType::kServiceWorker, + {}}, + }; + + for (const auto& test_case : test_cases) { + ExtensionTestMessageListener extension_oninstall_listener_fired( + "installed listener fired"); + // Load the extension for the particular context type. The manifest + // file is for a legacy event page-based extension. LoadExtension will + // modify the extension for the kServiceWorker case. + scoped_refptr<const Extension> extension = LoadExtension( + test_data_dir_.AppendASCII("events/metrics/web_navigation"), + {.context_type = test_case.context_type}); + ASSERT_TRUE(extension); + // This ensures that we wait until the the browser receives the ack from the + // renderer. This prevents unexpected histogram emits later. + ASSERT_TRUE(extension_oninstall_listener_fired.WaitUntilSatisfied()); + + base::HistogramTester histogram_tester; + ExtensionTestMessageListener test_event_listener_fired("listener fired"); + // Navigate somewhere to trigger the webNavigation.onBeforeRequest event to + // the extension listener. + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL("example.com", "/simple.html"))); + ASSERT_TRUE(test_event_listener_fired.WaitUntilSatisfied()); + + // Call to webNavigation.onCompleted expected. + histogram_tester.ExpectTotalCount(test_case.event_metric_emitted, + /*expected_count=*/1); + + // Verify that the recorded values are sane -- that is, that they are less + // than the maximum bucket. + histogram_tester.ExpectBucketCount( + test_case.event_metric_emitted, + /*sample=*/base::Minutes(5).InMicroseconds(), /*expected_count=*/0); + // Verify other extension context types are not logged. + for (const auto& event_metric_not_emitted : + test_case.event_metrics_not_emitted) { + SCOPED_TRACE(event_metric_not_emitted); + histogram_tester.ExpectTotalCount(event_metric_not_emitted, + /*expected_count=*/0); + } + + // Prevent extensions persisting across test cases and emitting extra + // metrics for events. + UninstallExtension(extension->id()); + } +} + +// TODO(crbug.com/1441221): Add persistent background page test case. This is +// just for service workers. +// Tests that the we do not emit event dispatch time metrics for webRequest +// events with active listeners. +IN_PROC_BROWSER_TEST_F(EventMetricsBrowserTest, DispatchToSenderMetricTest) { + ASSERT_TRUE(embedded_test_server()->Start()); + // Load an extension that listens for webRequest events. + ExtensionTestMessageListener extension_oninstall_listener_fired( + "installed listener fired"); + const Extension* extension = + LoadExtension(test_data_dir_.AppendASCII("events/metrics/web_request")); + ASSERT_TRUE(extension); + // This ensures that we wait until the the browser receives the ack from the + // renderer. This prevents unexpected histogram emits later. + ASSERT_TRUE(extension_oninstall_listener_fired.WaitUntilSatisfied()); + + base::HistogramTester histogram_tester; + ExtensionTestMessageListener test_event_listener_fired("listener fired"); + // Navigate somewhere to trigger webRequest.onBeforeRequest event to the + // extension listener. + ASSERT_TRUE(ui_test_utils::NavigateToURL( + browser(), + embedded_test_server()->GetURL("example.com", "/simple.html"))); + EXPECT_TRUE(test_event_listener_fired.WaitUntilSatisfied()); + + // We do not emit any dispatch histograms for webRequest events to active + // listeners. + histogram_tester.ExpectTotalCount( + "Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2", + /*expected_count=*/0); + histogram_tester.ExpectTotalCount( + "Extensions.Events.DispatchToAckLongTime.ExtensionServiceWorker2", + /*expected_count=*/0); + // TODO(crbug.com/1441221): Uncomment after fixing and incrementing this + // metric. + // histogram_tester.ExpectTotalCount( + // "Extensions.Events.DidDispatchToAckSucceed.ExtensionServiceWorker", + // /*expected_count=*/0); +} + +} // namespace + +} // namespace extensions
diff --git a/chrome/browser/extensions/lazy_background_page_apitest.cc b/chrome/browser/extensions/lazy_background_page_apitest.cc index a664cf9..62c03f4 100644 --- a/chrome/browser/extensions/lazy_background_page_apitest.cc +++ b/chrome/browser/extensions/lazy_background_page_apitest.cc
@@ -718,7 +718,6 @@ // Tests that both a regular page and an event page will receive events when // the event page is not loaded. IN_PROC_BROWSER_TEST_F(LazyBackgroundPageApiTest, EventDispatchToTab) { - base::HistogramTester histogram_tester; ResultCatcher catcher; catcher.RestrictToBrowserContext(browser()->profile()); @@ -747,10 +746,6 @@ page_ready.Reply("go"); EXPECT_TRUE(catcher.GetNextResult()) << catcher.message(); - // Call to runtime.onInstalled and bookmarks.onCreated are expected. - histogram_tester.ExpectTotalCount( - "Extensions.Events.DispatchToAckTime.ExtensionEventPage2", - /*expected_count=*/2); } // Tests that the lazy background page will be unloaded if the onSuspend event
diff --git a/chrome/browser/extensions/service_worker_apitest.cc b/chrome/browser/extensions/service_worker_apitest.cc index d2da0d56..630c960 100644 --- a/chrome/browser/extensions/service_worker_apitest.cc +++ b/chrome/browser/extensions/service_worker_apitest.cc
@@ -285,7 +285,6 @@ // an event listener for tabs.onCreated event. The step also verifies that tab // creation correctly fires the listener. IN_PROC_BROWSER_TEST_F(ServiceWorkerBasedBackgroundTest, PRE_Basic) { - base::HistogramTester histogram_tester; ExtensionTestMessageListener newtab_listener("CREATED"); newtab_listener.set_failure_message("CREATE_FAILED"); ExtensionTestMessageListener worker_listener("WORKER_RUNNING"); @@ -304,31 +303,6 @@ // Service Worker extension does not have ExtensionHost. EXPECT_FALSE(process_manager()->GetBackgroundHostForExtension(extension_id)); - - // Call to runtime.onInstalled and tabs.onCreated are expected. - histogram_tester.ExpectTotalCount( - "Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2", - /*expected_count=*/2); - histogram_tester.ExpectTotalCount( - "Extensions.Events.DispatchToAckLongTime.ExtensionServiceWorker2", - /*expected_count=*/2); - histogram_tester.ExpectTotalCount( - "Extensions.Events.DidDispatchToAckSucceed.ExtensionServiceWorker", - /*expected_count=*/2); - - // Verify that the recorded values are sane -- that is, that they are less - // than the maximum bucket. - // This is the best we can do, since the other buckets are determined - // by the histogram, rather than by us. - histogram_tester.ExpectBucketCount( - "Extensions.Events.DispatchToAckTime.ExtensionServiceWorker2", - /*sample=*/base::Minutes(5).InMicroseconds(), /*expected_count=*/0); - histogram_tester.ExpectBucketCount( - "Extensions.Events.DispatchToAckLongTime.ExtensionServiceWorker2", - /*sample=*/base::Days(1).InMilliseconds(), /*expected_count=*/0); - histogram_tester.ExpectBucketCount( - "Extensions.Events.DidDispatchToAckSucceed.ExtensionServiceWorker", - /*sample=*/false, /*expected_count=*/0); } // After browser restarts, this test step ensures that opening a tab fires
diff --git a/chrome/browser/feed/android/BUILD.gn b/chrome/browser/feed/android/BUILD.gn index 182eba0..c3d6b2d 100644 --- a/chrome/browser/feed/android/BUILD.gn +++ b/chrome/browser/feed/android/BUILD.gn
@@ -170,8 +170,10 @@ "java/res/drawable/creator_content_unavailable_error_illustration.xml", "java/res/drawable/creator_general_error_illustration.xml", "java/res/drawable/header_title_section_tab_background.xml", + "java/res/drawable/header_title_section_tab_background_polished.xml", "java/res/drawable/header_title_tab_selected_background.xml", "java/res/drawable/header_title_tab_selected_background_polished.xml", + "java/res/drawable/header_title_tab_selected_ripple.xml", "java/res/drawable/rounded_corners.xml", "java/res/drawable/web_feed_post_follow_illustration.xml", "java/res/layout/back_to_top_bubble.xml",
diff --git a/chrome/browser/feed/android/java/res/drawable-night/header_title_tab_selected_background_polished.xml b/chrome/browser/feed/android/java/res/drawable-night/header_title_tab_selected_background_polished.xml index 407eca9..80d5469 100644 --- a/chrome/browser/feed/android/java/res/drawable-night/header_title_tab_selected_background_polished.xml +++ b/chrome/browser/feed/android/java/res/drawable-night/header_title_tab_selected_background_polished.xml
@@ -7,18 +7,19 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item android:state_selected="false"> - <org.chromium.components.browser_ui.widget.SurfaceColorDrawable - android:shape="rectangle" - app:surfaceElevation="@dimen/default_elevation_2"> - <corners android:radius="@dimen/feed_header_background_corner_radius_polished"/> - </org.chromium.components.browser_ui.widget.SurfaceColorDrawable> + <item android:state_selected="false" > + <shape android:shape="rectangle"> + <!-- This will show the main background color. --> + <solid android:color="@android:color/transparent"/> + </shape> </item> - <item android:state_selected="true"> + <item android:state_selected="true"> <org.chromium.components.browser_ui.widget.SurfaceColorDrawable android:shape="rectangle" app:surfaceElevation="@dimen/default_elevation_5"> <corners android:radius="@dimen/feed_header_background_corner_radius_polished"/> + <!-- The stroke will show the main background color. --> + <stroke android:width="8dp" android:color="@android:color/transparent"/> </org.chromium.components.browser_ui.widget.SurfaceColorDrawable> </item> </selector> \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background.xml b/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background.xml index 7655a85..8254883 100644 --- a/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background.xml +++ b/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background.xml
@@ -7,13 +7,6 @@ <selector xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"> - <item android:state_enabled="false"> - <org.chromium.components.browser_ui.widget.SurfaceColorDrawable - android:shape="rectangle" - app:surfaceElevation="@dimen/default_elevation_1"> - <corners android:radius="@dimen/feed_header_background_corner_radius"/> - </org.chromium.components.browser_ui.widget.SurfaceColorDrawable> - </item> <item android:state_enabled="true"> <org.chromium.components.browser_ui.widget.SurfaceColorDrawable android:shape="rectangle"
diff --git a/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background_polished.xml b/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background_polished.xml new file mode 100644 index 0000000..190ffee --- /dev/null +++ b/chrome/browser/feed/android/java/res/drawable/header_title_section_tab_background_polished.xml
@@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> +<selector xmlns:android="http://schemas.android.com/apk/res/android" +xmlns:app="http://schemas.android.com/apk/res-auto"> + <item android:state_enabled="true"> + <org.chromium.components.browser_ui.widget.SurfaceColorDrawable + android:shape="rectangle" + app:surfaceElevation="@dimen/home_surface_ui_background_color_elevation"> + <corners android:radius="@dimen/feed_header_background_outer_corner_radius_polished"/> + </org.chromium.components.browser_ui.widget.SurfaceColorDrawable> + </item> +</selector> \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background.xml b/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background.xml index eac6080..39d3bcd 100644 --- a/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background.xml +++ b/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background.xml
@@ -5,12 +5,20 @@ found in the LICENSE file. --> -<org.chromium.components.browser_ui.widget.SurfaceColorDrawable - xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto" - android:shape="rectangle" - app:surfaceElevation="@dimen/feed_header_tab_selected_bg_elevation"> - <corners android:radius="@dimen/feed_header_background_corner_radius"/> - <!-- The stroke will show the main background color. --> - <stroke android:width="2dp" android:color="@android:color/transparent" /> -</org.chromium.components.browser_ui.widget.SurfaceColorDrawable> \ No newline at end of file +<selector xmlns:android="http://schemas.android.com/apk/res/android" + xmlns:app="http://schemas.android.com/apk/res-auto"> + <item android:state_selected="false" > + <shape android:shape="rectangle"> + <solid android:color="@android:color/transparent"/> + </shape> + </item> + <item android:state_selected="true" > + <org.chromium.components.browser_ui.widget.SurfaceColorDrawable + android:shape="rectangle" + app:surfaceElevation="@dimen/feed_header_tab_selected_bg_elevation"> + <corners android:radius="@dimen/feed_header_background_corner_radius"/> + <!-- The stroke will show the main background color. --> + <stroke android:width="2dp" android:color="@android:color/transparent" /> + </org.chromium.components.browser_ui.widget.SurfaceColorDrawable> + </item> +</selector> \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background_polished.xml b/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background_polished.xml index 8dad48f..362a0c8 100644 --- a/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background_polished.xml +++ b/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_background_polished.xml
@@ -6,19 +6,19 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android" -xmlns:app="http://schemas.android.com/apk/res-auto"> -<item android:state_selected="false"> - <org.chromium.components.browser_ui.widget.SurfaceColorDrawable - android:shape="rectangle" - app:surfaceElevation="@dimen/default_elevation_0"> - <corners android:radius="@dimen/feed_header_background_corner_radius_polished"/> - </org.chromium.components.browser_ui.widget.SurfaceColorDrawable> -</item> -<item android:state_selected="true"> - <shape android:shape="rectangle"> - <corners android:radius="@dimen/feed_header_background_corner_radius_polished" /> - <solid android:color="@color/color_primary_with_alpha_15"/> - </shape> -</item> -</selector> - + xmlns:app="http://schemas.android.com/apk/res-auto"> + <item android:state_selected="false" > + <shape android:shape="rectangle"> + <!-- This will show the main background color. --> + <solid android:color="@android:color/transparent"/> + </shape> + </item> + <item android:state_selected="true" > + <shape android:shape="rectangle"> + <!-- The stroke will show the main background color. --> + <stroke android:width="8dp" android:color="@android:color/transparent"/> + <solid android:color="@color/color_primary_with_alpha_15"/> + <corners android:radius="@dimen/feed_header_background_corner_radius_polished"/> + </shape> + </item> +</selector> \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_ripple.xml b/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_ripple.xml new file mode 100644 index 0000000..fbda3c43 --- /dev/null +++ b/chrome/browser/feed/android/java/res/drawable/header_title_tab_selected_ripple.xml
@@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<ripple xmlns:android="http://schemas.android.com/apk/res/android" + android:color="?android:attr/colorControlHighlight"> + <item android:id="@android:id/mask" + android:drawable="@drawable/header_title_tab_selected_background_polished" /> +</ripple> \ No newline at end of file
diff --git a/chrome/browser/feed/android/java/res/values/dimens.xml b/chrome/browser/feed/android/java/res/values/dimens.xml index d42ee27..3508971 100644 --- a/chrome/browser/feed/android/java/res/values/dimens.xml +++ b/chrome/browser/feed/android/java/res/values/dimens.xml
@@ -55,11 +55,11 @@ <dimen name="feed_header_tab_extra_margin_right">7dp</dimen> <dimen name="feed_header_background_corner_radius">60dp</dimen> <dimen name="feed_header_background_corner_radius_polished">8dp</dimen> - <dimen name="feed_header_tab_layout_height_polished">36dp</dimen> + <dimen name="feed_header_background_outer_corner_radius_polished">12dp</dimen> <dimen name="feed_header_tab_layout_width_max">165dp</dimen> + <dimen name="feed_header_tab_layout_lateral_margin">8dp</dimen> <dimen name="feed_header_menu_width_polished">24dp</dimen> <dimen name="feed_header_menu_end_margin">20dp</dimen> - <dimen name="feed_header_tab_end_margin">8dp</dimen> <dimen name="feed_header_top_margin">16dp</dimen> <dimen name="feed_header_title_view_margin_start">4dp</dimen>
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java index 4219c6d4..152a0b8 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java
@@ -56,10 +56,6 @@ @Override public void onTabSelected(TabLayout.Tab tab) { - if (!mIsSurfacePolishEnabled) { - tab.view.setBackground(ResourcesCompat.getDrawable(getResources(), - R.drawable.header_title_tab_selected_background, getContext().getTheme())); - } if (mListener != null) { mListener.onSectionHeaderSelected(tab.getPosition()); } @@ -67,10 +63,6 @@ @Override public void onTabUnselected(TabLayout.Tab tab) { - if (!mIsSurfacePolishEnabled) { - tab.view.setBackground(null); - } - if (mListener != null) { mListener.onSectionHeaderUnselected(tab.getPosition()); } @@ -201,8 +193,6 @@ mTabLayout.addOnTabSelectedListener(mTabListener); if (mIsSurfacePolishEnabled) { ViewGroup.LayoutParams layoutParams = mTabLayout.getLayoutParams(); - layoutParams.height = getResources().getDimensionPixelSize( - R.dimen.feed_header_tab_layout_height_polished); if (!mIsTablet) { layoutParams.width = LayoutParams.MATCH_PARENT; } else { @@ -211,7 +201,8 @@ * 2; } mTabLayout.setTabGravity(TabLayout.GRAVITY_FILL); - mTabLayout.setBackground(null); + mTabLayout.setBackgroundResource( + R.drawable.header_title_section_tab_background_polished); } } @@ -230,13 +221,22 @@ (MarginLayoutParams) mMenuView.getLayoutParams(); marginLayoutParams.width = getResources().getDimensionPixelSize(R.dimen.feed_header_menu_width_polished); + int tabLayoutLateralMargin = getResources().getDimensionPixelSize( + R.dimen.feed_header_tab_layout_lateral_margin); marginLayoutParams.setMarginStart( - getResources().getDimensionPixelSize(R.dimen.feed_header_tab_end_margin)); + marginLayoutParams.getMarginStart() + tabLayoutLateralMargin); MarginLayoutParams titleViewMarginLayoutParams = (MarginLayoutParams) mTitleView.getLayoutParams(); titleViewMarginLayoutParams.setMarginStart(getResources().getDimensionPixelSize( R.dimen.feed_header_title_view_margin_start)); + + if (mLeadingStatusIndicator != null) { + MarginLayoutParams indicatorViewMarginLayoutParams = + (MarginLayoutParams) mLeadingStatusIndicator.getLayoutParams(); + indicatorViewMarginLayoutParams.setMarginEnd( + indicatorViewMarginLayoutParams.getMarginEnd() + tabLayoutLateralMargin); + } } // #getHitRect() will not be valid until the first layout pass completes. Additionally, if @@ -266,15 +266,15 @@ tab.view.setClipToPadding(false); tab.view.setClipChildren(false); if (mIsSurfacePolishEnabled) { - ViewGroup.MarginLayoutParams marginLayoutParams = - (ViewGroup.MarginLayoutParams) tab.view.getLayoutParams(); - marginLayoutParams.setMargins(0, 0, - getResources().getDimensionPixelSize(R.dimen.feed_header_tab_end_margin), - 0); + tab.view.setForeground(ResourcesCompat.getDrawable(getResources(), + R.drawable.header_title_tab_selected_ripple, getContext().getTheme())); tab.view.setBackground(ResourcesCompat.getDrawable(getResources(), R.drawable.header_title_tab_selected_background_polished, getContext().getTheme())); + } else { + tab.view.setBackground(ResourcesCompat.getDrawable(getResources(), + R.drawable.header_title_tab_selected_background, getContext().getTheme())); } } }
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc index b3c03a8..b417eb0 100644 --- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc +++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.cc
@@ -42,6 +42,7 @@ #include "components/content_settings/core/browser/host_content_settings_map.h" #include "components/content_settings/core/common/content_settings.h" #include "components/permissions/features.h" +#include "components/permissions/object_permission_context_base.h" #include "components/permissions/permission_decision_auto_blocker.h" #include "components/permissions/permission_util.h" #include "components/safe_browsing/buildflags.h" @@ -86,6 +87,9 @@ namespace { +using FileRequestData = + FileSystemAccessPermissionRequestManager::FileRequestData; +using RequestAccess = FileSystemAccessPermissionRequestManager::Access; using HandleType = content::FileSystemAccessPermissionContext::HandleType; using GrantStatus = ChromeFileSystemAccessPermissionContext::GrantStatus; using GrantType = ChromeFileSystemAccessPermissionContext::GrantType; @@ -684,25 +688,26 @@ if (context_->IsEligibleToUpgradePermissionRequestToRestorePrompt( origin_, path_, handle_type_, user_action_, type_)) { - // TODO(crbug.com/1011533): Implement triggering the restore prompt, - // then update active / persisted grants based on response. - RunCallbackAndRecordPermissionRequestOutcome( - std::move(callback), - PermissionRequestOutcome::kGrantedByRestorePrompt); + std::vector<FileRequestData> request_data_list = + context_->GetFileRequestDataForRestorePermissionPrompt(origin_); + request_manager->AddRequest( + {FileSystemAccessPermissionRequestManager::RequestType:: + kRestorePermissions, + origin_, request_data_list}, + base::BindOnce(&PermissionGrantImpl::OnRestorePermissionRequestResult, + this, std::move(callback)), + std::move(fullscreen_block)); return; } - FileSystemAccessPermissionRequestManager::Access access = - type_ == GrantType::kRead - ? FileSystemAccessPermissionRequestManager::Access::kRead - : FileSystemAccessPermissionRequestManager::Access::kWrite; - // If a website wants both read and write access, code in content will // request those as two separate requests. The |request_manager| will then // detect this and combine the two requests into one prompt. As such this // code does not have to have any way to request Access::kReadWrite. - FileSystemAccessPermissionRequestManager::FileRequestData - file_request_data = {path_, handle_type_, access}; + FileRequestData file_request_data = {path_, handle_type_, + type_ == GrantType::kRead + ? RequestAccess::kRead + : RequestAccess::kWrite}; request_manager->AddRequest( {FileSystemAccessPermissionRequestManager::RequestType::kNewPermission, origin_, @@ -879,6 +884,54 @@ } } + void OnRestorePermissionRequestResult( + base::OnceCallback<void(PermissionRequestOutcome)> callback, + PermissionAction result) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // TODO(crbug.com/1011533): Record UMA metric once defined. Consider adding + // more `PermissionRequestOutcome` types to account for "restore every time" + // case and invalid state case. + + if (context_->GetPersistedGrantType(origin_) != + PersistedGrantType::kDormant) { + // User may have enabled the extended permission, or the grant status + // is changed while the prompt is shown. + std::move(callback).Run(PermissionRequestOutcome::kRequestAborted); + return; + } + + switch (result) { + case PermissionAction::GRANTED: + context_->OnRestorePermissionAllowedEveryTime(origin_); + std::move(callback).Run( + PermissionRequestOutcome::kGrantedByRestorePrompt); + break; + case PermissionAction::GRANTED_ONCE: + context_->OnRestorePermissionAllowedOnce(origin_); + std::move(callback).Run( + PermissionRequestOutcome::kGrantedByRestorePrompt); + break; + case PermissionAction::DENIED: + context_->OnRestorePermissionDeniedOrDismissed(origin_); + std::move(callback).Run(PermissionRequestOutcome::kUserDenied); + break; + case PermissionAction::DISMISSED: + context_->OnRestorePermissionDeniedOrDismissed(origin_); + std::move(callback).Run(PermissionRequestOutcome::kUserDismissed); + break; + case PermissionAction::IGNORED: + // TODO(crbug.com/1011533): Figure out if this action is detectable on + // UI-side, and update `PermissionRequestOutcome` type. + context_->OnRestorePermissionIgnored(origin_); + std::move(callback).Run(PermissionRequestOutcome::kRequestAborted); + break; + case PermissionAction::REVOKED: + case PermissionAction::NUM: + NOTREACHED(); + break; + } + } + void RunCallbackAndRecordPermissionRequestOutcome( base::OnceCallback<void(PermissionRequestOutcome)> callback, PermissionRequestOutcome outcome) { @@ -1878,19 +1931,16 @@ if (!base::FeatureList::IsEnabled( features::kFileSystemAccessPersistentPermissions) || !base::FeatureList::IsEnabled( - permissions::features::kOneTimePermission)) { + permissions::features::kOneTimePermission) || + expiry_type != BackgroundExpiryType::kLongTimeout) { return; } - auto origin_it = active_permissions_map_.find(origin); - if (origin_it != active_permissions_map_.end()) { - OriginState& origin_state = origin_it->second; - origin_state.grant_status = GrantStatus::kBackgrounded; - if (RevokeActiveGrants(origin)) { - // TODO(crbug.com/1011533): Add `RecordOneTimePermissionEvent` UMA - // histogram logging when active grants are revoked as a result of tab - // backgrounding. - ScheduleUsageIconUpdate(); - } + SetGrantStatus(origin, GrantStatus::kBackgrounded); + if (RevokeActiveGrants(origin)) { + // TODO(crbug.com/1011533): Add `RecordOneTimePermissionEvent` UMA + // histogram logging when active grants are revoked as a result of tab + // backgrounding. + ScheduleUsageIconUpdate(); } } @@ -1968,59 +2018,50 @@ #endif } -void ChromeFileSystemAccessPermissionContext::OnRestorePromptAllowEveryTime( - const url::Origin& origin) { - UpdateGrantsOnRestorePromptAllow(origin); +void ChromeFileSystemAccessPermissionContext:: + OnRestorePermissionAllowedEveryTime(const url::Origin& origin) { + UpdateGrantsOnRestorePermissionAllowed(origin); extended_permissions_settings_map_[origin] = ContentSetting::CONTENT_SETTING_ALLOW; } -void ChromeFileSystemAccessPermissionContext::OnRestorePromptAllowThisTime( +void ChromeFileSystemAccessPermissionContext::OnRestorePermissionAllowedOnce( const url::Origin& origin) { - UpdateGrantsOnRestorePromptAllow(origin); + UpdateGrantsOnRestorePermissionAllowed(origin); } -void ChromeFileSystemAccessPermissionContext::UpdateGrantsOnRestorePromptAllow( - const url::Origin& origin) { - if (OriginHasExtendedPermission(origin)) { - // TODO(crbug.com/1011533): In this code path, the user has enabled - // Extended Permission via the page info UI, while the restore prompt is - // shown. Update this logic to grant the requested handle by hooking into - // the restore prompt callback function, once implemented. +void ChromeFileSystemAccessPermissionContext:: + UpdateGrantsOnRestorePermissionAllowed(const url::Origin& origin) { + // Set `GrantStatus::kCurrent` so that Persisted grants are now updated from + // dormant grants to extended/shadow grants. + SetGrantStatus(origin, GrantStatus::kCurrent); + + auto it = active_permissions_map_.find(origin); + if (it == active_permissions_map_.end()) { return; } - auto origin_it = active_permissions_map_.find(origin); - if (origin_it != active_permissions_map_.end()) { - OriginState& origin_state = origin_it->second; - if (origin_state.grant_status == GrantStatus::kCurrent) { - // TODO(crbug.com/1011533): In this code path, a new permission has been - // granted while the restore prompt is being shown to the user. This is - // an invalid state, and should return - // `PermissionRequestOutcome::kRequestAborted` via the restore prompt - // callback function, once implemented. - return; - } - origin_state.grant_status = GrantStatus::kCurrent; - // Persisted grants are now updated from dormant grants to extended/shadow - // grants. Use the persisted grants to find the matching active permission, - // and set it to `granted`. - auto persisted_grants = ConvertObjectsToGrants( - ObjectPermissionContextBase::GetGrantedObjects(origin)); - for (auto& read_grant : origin_state.read_grants) { - if (base::Contains(persisted_grants.file_read_grants, read_grant.first) || - base::Contains(persisted_grants.directory_read_grants, - read_grant.first)) { - read_grant.second->SetStatus( + // Use the persisted grants to find the matching active permission, and + // set it to `granted`. + for (auto& dormant_grant : + ObjectPermissionContextBase::GetGrantedObjects(origin)) { + base::Value::Dict& object_dict = dormant_grant->value; + base::FilePath path = + base::ValueToFilePath(object_dict.Find(kPermissionPathKey)).value(); + auto handle_type = object_dict.FindBool(kPermissionIsDirectoryKey).value() + ? HandleType::kDirectory + : HandleType::kFile; + if (object_dict.FindBool(kPermissionReadableKey).value_or(false)) { + auto*& read_grant = it->second.read_grants[path]; + if (read_grant && read_grant->handle_type() == handle_type) { + read_grant->SetStatus( PermissionStatus::GRANTED, PersistedPermissionOptions::kDoNotUpdatePersistedPermission); } } - for (auto& write_grant : origin_state.write_grants) { - if (base::Contains(persisted_grants.file_write_grants, - write_grant.first) || - base::Contains(persisted_grants.directory_write_grants, - write_grant.first)) { - write_grant.second->SetStatus( + if (object_dict.FindBool(kPermissionWritableKey).value_or(false)) { + auto*& write_grant = it->second.write_grants[path]; + if (write_grant && write_grant->handle_type() == handle_type) { + write_grant->SetStatus( PermissionStatus::GRANTED, PersistedPermissionOptions::kDoNotUpdatePersistedPermission); } @@ -2028,33 +2069,29 @@ } } -void ChromeFileSystemAccessPermissionContext::OnDontAllowRestorePrompt( - const url::Origin& origin) { +void ChromeFileSystemAccessPermissionContext:: + OnRestorePermissionDeniedOrDismissed(const url::Origin& origin) { // Both denying and dismissing the restore prompt count as a `dismiss` // action, for embargo purposes. PermissionDecisionAutoBlockerFactory::GetForProfile( Profile::FromBrowserContext(profile())) ->RecordDismissAndEmbargo( origin.GetURL(), ContentSettingsType::FILE_SYSTEM_WRITE_GUARD, false); - OnRestorePermissionNotAllowed(origin); + UpdateGrantsOnRestorePermissionNotAllowed(origin); } -void ChromeFileSystemAccessPermissionContext::OnIgnoreRestorePrompt( +void ChromeFileSystemAccessPermissionContext::OnRestorePermissionIgnored( const url::Origin& origin) { PermissionDecisionAutoBlockerFactory::GetForProfile( Profile::FromBrowserContext(profile())) ->RecordIgnoreAndEmbargo( origin.GetURL(), ContentSettingsType::FILE_SYSTEM_WRITE_GUARD, false); - OnRestorePermissionNotAllowed(origin); + UpdateGrantsOnRestorePermissionNotAllowed(origin); } -void ChromeFileSystemAccessPermissionContext::OnRestorePermissionNotAllowed( - const url::Origin& origin) { - auto origin_it = active_permissions_map_.find(origin); - if (origin_it != active_permissions_map_.end()) { - OriginState& origin_state = origin_it->second; - origin_state.grant_status = GrantStatus::kCurrent; - } +void ChromeFileSystemAccessPermissionContext:: + UpdateGrantsOnRestorePermissionNotAllowed(const url::Origin& origin) { + SetGrantStatus(origin, GrantStatus::kCurrent); // Revoke all of the persistent permissions for the given origin. if (!OriginHasExtendedPermission(origin)) { ObjectPermissionContextBase::RevokeObjectPermissions(origin); @@ -2106,7 +2143,6 @@ features::kFileSystemAccessPersistentPermissions)) { return false; } - const bool origin_is_embargoed = PermissionDecisionAutoBlockerFactory::GetForProfile( Profile::FromBrowserContext(profile())) @@ -2115,7 +2151,6 @@ if (origin_is_embargoed) { return false; } - if (GetPersistedGrantType(origin) != PersistedGrantType::kDormant) { return false; } @@ -2125,7 +2160,6 @@ // permissions map if it does not exist, in order to cover cases of shutdown // or page navigation. auto& origin_state = active_permissions_map_[origin]; - // If an origin's grants have been revoked from being backgrounded, or // the permission request is on a handle retrieved from IndexedDB, then // the restore prompt may be eligible if requesting a permission on a handle, @@ -2139,6 +2173,28 @@ #endif // BUILDFLAG(IS_ANDROID) } +std::vector<FileRequestData> ChromeFileSystemAccessPermissionContext:: + GetFileRequestDataForRestorePermissionPrompt(const url::Origin& origin) { + std::vector<FileRequestData> file_request_data_list; + auto dormant_grants = ObjectPermissionContextBase::GetGrantedObjects(origin); + for (auto& dormant_grant : dormant_grants) { + if (!IsValidObject(dormant_grant->value)) { + continue; + } + const base::Value::Dict& object_dict = dormant_grant->value; + FileRequestData file_request_data = { + base::ValueToFilePath(object_dict.Find(kPermissionPathKey)).value(), + object_dict.FindBool(kPermissionIsDirectoryKey).value_or(false) + ? HandleType::kDirectory + : HandleType::kFile, + object_dict.FindBool(kPermissionWritableKey).value_or(false) + ? RequestAccess::kWrite + : RequestAccess::kRead}; + file_request_data_list.push_back(file_request_data); + } + return file_request_data_list; +} + bool ChromeFileSystemAccessPermissionContext::HasPersistedGrantObject( const url::Origin& origin, const base::FilePath& file_path, @@ -2296,20 +2352,32 @@ return PersistedGrantType::kExtended; } + switch (GetGrantStatus(origin)) { + case GrantStatus::kBackgrounded: + case GrantStatus::kLoaded: + return PersistedGrantType::kDormant; + case GrantStatus::kCurrent: + return PersistedGrantType::kShadow; + } +} + +GrantStatus ChromeFileSystemAccessPermissionContext::GetGrantStatus( + const url::Origin& origin) const { auto origin_it = active_permissions_map_.find(origin); if (origin_it != active_permissions_map_.end()) { - switch (origin_it->second.grant_status) { - case GrantStatus::kBackgrounded: - case GrantStatus::kLoaded: - return PersistedGrantType::kDormant; - case GrantStatus::kCurrent: - return PersistedGrantType::kShadow; - } + return origin_it->second.grant_status; } + // Return the default grant status in the case that the origin is not found + // in the active permissions map. + return GrantStatus::kLoaded; +} - // If OriginState is not found, the default GrantStatus::kCurrent is used, - // meaning dormant grants. - return PersistedGrantType::kDormant; +void ChromeFileSystemAccessPermissionContext::SetGrantStatus( + const url::Origin& origin, + GrantStatus grant_status) { + // Insert the origin into the permissions map if it does not exist. + auto& origin_state = active_permissions_map_[origin]; + origin_state.grant_status = grant_status; } void ChromeFileSystemAccessPermissionContext::PermissionGrantDestroyed(
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h index e2dc7be..af4c8f6d 100644 --- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h +++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context.h
@@ -15,6 +15,7 @@ #include "base/sequence_checker.h" #include "base/time/clock.h" #include "base/time/default_clock.h" +#include "chrome/browser/file_system_access/file_system_access_permission_request_manager.h" #include "components/permissions/object_permission_context_base.h" #include "content/public/browser/file_system_access_permission_context.h" #include "third_party/blink/public/mojom/file_system_access/file_system_access_manager.mojom-forward.h" @@ -178,34 +179,6 @@ extended_permissions_settings_map_[origin] = ContentSetting::CONTENT_SETTING_ALLOW; } - // This method may only be called when the Persistent Permissions feature - // flag is enabled. - void OnDontAllowRestorePromptForTesting(const url::Origin& origin) { - CHECK(base::FeatureList::IsEnabled( - features::kFileSystemAccessPersistentPermissions)); - OnDontAllowRestorePrompt(origin); - } - // This method may only be called when the Persistent Permissions feature - // flag is enabled. - void OnIgnoreRestorePromptForTesting(const url::Origin& origin) { - CHECK(base::FeatureList::IsEnabled( - features::kFileSystemAccessPersistentPermissions)); - OnIgnoreRestorePrompt(origin); - } - // This method may only be called when the Persistent Permissions feature - // flag is enabled. - void OnRestorePromptAllowEveryTimeForTesting(const url::Origin& origin) { - CHECK(base::FeatureList::IsEnabled( - features::kFileSystemAccessPersistentPermissions)); - OnRestorePromptAllowEveryTime(origin); - } - // This method may only be called when the Persistent Permissions feature - // flag is enabled. - void OnRestorePromptAllowThisTimeForTesting(const url::Origin& origin) { - CHECK(base::FeatureList::IsEnabled( - features::kFileSystemAccessPersistentPermissions)); - OnRestorePromptAllowThisTime(origin); - } bool RevokeActiveGrantsForTesting( const url::Origin& origin, base::FilePath file_path = base::FilePath()) { @@ -303,9 +276,6 @@ kUpdatePersistedPermission, }; - // Retrieve the persisted grant type for a given origin. - PersistedGrantType GetPersistedGrantType(const url::Origin& origin) const; - void PermissionGrantDestroyed(PermissionGrantImpl* grant); // Checks whether the file or directory at `path` corresponds to a directory @@ -344,30 +314,6 @@ // permissions for that origin. void MaybeCleanupActivePermissions(const url::Origin& origin); - // Called when the restore prompt is accepted as a result of the user - // selecting the 'Allow every time' option. - void OnRestorePromptAllowEveryTime(const url::Origin& origin); - - // Called when the restore prompt is accepted as a result of the user - // selecting the 'Allow this time' option. - void OnRestorePromptAllowThisTime(const url::Origin& origin); - - // Updates the grant status and the active / persistent permissions grant sets - // when the user selects either the 'Allow this time' or 'Allow every time' - // option from the restore prompt. - void UpdateGrantsOnRestorePromptAllow(const url::Origin& origin); - - // Called when the restore prompt is dismissed or denied. - void OnDontAllowRestorePrompt(const url::Origin& origin); - - // Records restore prompt ignore with `PermissionDecisionAutoblocker`. - void OnIgnoreRestorePrompt(const url::Origin& origin); - - // Updates the `grant_status` and / or the persisted grants for a given - // origin, in the case that either the restore prompt is denied, dismissed, - // or ignored by the user. - void OnRestorePermissionNotAllowed(const url::Origin& origin); - bool AncestorHasActivePermission(const url::Origin& origin, const base::FilePath& path, GrantType grant_type) const; @@ -389,6 +335,39 @@ UserAction user_action, GrantType grant_type); + // Builds a list of `FileRequestData` from persisted grants, which is used + // to show the restore permission prompt. Expects that the persisted grants + // are dormant grants eligible to be restored. + std::vector<FileSystemAccessPermissionRequestManager::FileRequestData> + GetFileRequestDataForRestorePermissionPrompt(const url::Origin& origin); + + // Called when the restore permission prompt is accepted as a result of the + // user selecting the 'Allow on every visit' option. + void OnRestorePermissionAllowedEveryTime(const url::Origin& origin); + + // Called when the restore permission prompt is accepted as a result of the + // user selecting the 'Allow this time' option. + void OnRestorePermissionAllowedOnce(const url::Origin& origin); + + // Called when the restore permission prompt is dismissed or denied. + void OnRestorePermissionDeniedOrDismissed(const url::Origin& origin); + + // Records restore permission prompt ignore with + // `PermissionDecisionAutoblocker`. + void OnRestorePermissionIgnored(const url::Origin& origin); + + // Updates the grant status and the active / persistent permissions grant sets + // when the user selects either the 'Allow this time' or + // 'Allow on every visit' option from the restore permission prompt. + // Assumes that persisted grants are still dormant type. + void UpdateGrantsOnRestorePermissionAllowed(const url::Origin& origin); + + // Updates the `grant_status` and / or the persisted grants for a given + // origin, in the case that either the restore permission prompt is denied, + // dismissed, or ignored by the user. Assumes that persisted grants are still + // dormant type. + void UpdateGrantsOnRestorePermissionNotAllowed(const url::Origin& origin); + // Returns whether a matching persisted grant object exists. bool HasPersistedGrantObject(const url::Origin& origin, const base::FilePath& file_path, @@ -400,10 +379,17 @@ const base::FilePath& path, HandleType handle_type, GrantType grant_type); + // Returns whether the origin has extended permission enabled via user // opt-in or by having an actively installed PWA. bool OriginHasExtendedPermission(const url::Origin& origin) const; + // Retrieve the persisted grant type for a given origin. + PersistedGrantType GetPersistedGrantType(const url::Origin& origin) const; + + GrantStatus GetGrantStatus(const url::Origin& origin) const; + void SetGrantStatus(const url::Origin& origin, GrantStatus grant_status); + // Similar to GetGrantedObjects() but returns only extended grants. std::vector<std::unique_ptr<Object>> GetExtendedPersistedObjects( const url::Origin& origin);
diff --git a/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc b/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc index 138a063b..c46b4e4 100644 --- a/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc +++ b/chrome/browser/file_system_access/chrome_file_system_access_permission_context_unittest.cc
@@ -154,6 +154,45 @@ origin.GetURL(), origin.GetURL(), type, value); } +#if !BUILDFLAG(IS_ANDROID) + // Triggers the Restore permission prompt from two dormant grants (`kTestPath` + // and `kTestPath2`). Note that the scoped references to active grants are + // gone after this call, and the active grants may not exist in permission + // context. + PermissionRequestOutcome TriggerRestorePermissionPromptAfterBeingBackgrounded( + const url::Origin& origin) { + auto grant1 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kFile, UserAction::kOpen); + auto grant2 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kOpen); + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::GRANTED); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::GRANTED); + + // Dormant grants exist after tabs being backgrounded for the amount of time + // specified by the extended permissions policy. + permission_context()->OnAllTabsInBackgroundTimerExpired( + kTestOrigin, + OneTimePermissionsTrackerObserver::BackgroundExpiryType::kLongTimeout); + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::ASK); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::ASK); + + // Restore Permission prompt is triggered by calling + // `requestPermission()` on the handle of an existing dormant grant. + base::test::TestFuture<PermissionRequestOutcome> future; + grant1->RequestPermission(frame_id(), UserActivationState::kNotRequired, + future.GetCallback()); + auto result = future.Get(); + if (result == PermissionRequestOutcome::kGrantedByRestorePrompt) { + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::GRANTED); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::GRANTED); + } else { + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::ASK); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::ASK); + } + return result; + } +#endif // !BUILDFLAG(IS_ANDROID) + ChromeFileSystemAccessPermissionContext* permission_context() { return permission_context_.get(); } @@ -1201,60 +1240,147 @@ EXPECT_EQ(granted_objects.size(), 1UL); } -TEST_F(ChromeFileSystemAccessPermissionContextTest, ShowRestorePrompt) { - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kLoadFromStorage); - base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); - EXPECT_EQ(PermissionRequestOutcome::kGrantedByRestorePrompt, future.Get()); - - permission_context()->RevokeGrants(kTestOrigin); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - - // The permission request is not granted via the restore prompt after grants - // are revoked. - base::test::TestFuture<PermissionRequestOutcome> future2; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future2.GetCallback()); - auto permission_request_outcome = future2.Get(); - EXPECT_NE(PermissionRequestOutcome::kGrantedByRestorePrompt, - permission_request_outcome); +TEST_F(ChromeFileSystemAccessPermissionContextTest, + RestorePermissionPrompt_Triggered_AfterTabBackgrounded) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); + auto result = + TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kGrantedByRestorePrompt); } TEST_F(ChromeFileSystemAccessPermissionContextTest, - DoNotShowRestorePrompt_NoDormatGrants) { - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); + RestorePermissionPrompt_Triggered_HandleLoadedFromStorage) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); + + // Create dormant grants, eligible to be restored. + // Use a directory handle, which is not auto-granted, so that later it can be + // demonstrated that a directory handle is not able to trigger the restore + // prompt, but the single-file permission prompt. + auto grant1 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen); + base::test::TestFuture<PermissionRequestOutcome> grant1_future; + grant1->RequestPermission(frame_id(), UserActivationState::kNotRequired, + grant1_future.GetCallback()); + EXPECT_EQ(grant1_future.Get(), PermissionRequestOutcome::kUserGranted); + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::GRANTED); + + auto grant2 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath2, HandleType::kDirectory, UserAction::kOpen); + base::test::TestFuture<PermissionRequestOutcome> grant2_future; + grant2->RequestPermission(frame_id(), UserActivationState::kNotRequired, + grant2_future.GetCallback()); + EXPECT_EQ(grant2_future.Get(), PermissionRequestOutcome::kUserGranted); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::GRANTED); + + // TODO(crbug.com/1011533): Update this test to navigate away from the page, + // instead of manually resetting the grant. + permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); + grant1.reset(); + grant2.reset(); + + // Get the handles from the storage (i.e. IndexedDB). + auto grant1_from_storage = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kDirectory, + UserAction::kLoadFromStorage); + auto grant2_from_storage = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath2, HandleType::kDirectory, + UserAction::kLoadFromStorage); + EXPECT_EQ(grant1_from_storage->GetStatus(), PermissionStatus::ASK); + EXPECT_EQ(grant2_from_storage->GetStatus(), PermissionStatus::ASK); + + // `requestPermission()` on a handle from IndxedDB triggers the restore + // permission prompt. + base::test::TestFuture<PermissionRequestOutcome> future; + grant1_from_storage->RequestPermission( + frame_id(), UserActivationState::kNotRequired, future.GetCallback()); + EXPECT_EQ(future.Get(), PermissionRequestOutcome::kGrantedByRestorePrompt); + EXPECT_EQ(grant1_from_storage->GetStatus(), PermissionStatus::GRANTED); + EXPECT_EQ(grant2_from_storage->GetStatus(), PermissionStatus::GRANTED); +} + +TEST_F(ChromeFileSystemAccessPermissionContextTest, + RestorePermissionPrompt_NotTriggered_HandleNotLoadedFromStorage) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); + + // Create dormant grants, eligible to be restored. + // Use a directory handle, which is not auto-granted, so that later it can be + // demonstrated that a directory handle is not able to trigger the restore + // prompt, but only the single-file permission flow. + auto grant1 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen); + base::test::TestFuture<PermissionRequestOutcome> grant1_future; + grant1->RequestPermission(frame_id(), UserActivationState::kNotRequired, + grant1_future.GetCallback()); + EXPECT_EQ(grant1_future.Get(), PermissionRequestOutcome::kUserGranted); + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::GRANTED); + + auto grant2 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath2, HandleType::kDirectory, UserAction::kOpen); + base::test::TestFuture<PermissionRequestOutcome> grant2_future; + grant2->RequestPermission(frame_id(), UserActivationState::kNotRequired, + grant2_future.GetCallback()); + EXPECT_EQ(grant2_future.Get(), PermissionRequestOutcome::kUserGranted); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::GRANTED); + + // TODO(crbug.com/1011533): Update this test to navigate away from the page, + // instead of manually resetting the grant. + permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); + grant1.reset(); + grant2.reset(); + + // Get the handles from the directory picker. + auto grant1_not_from_storage = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen); + auto grant2_not_from_storage = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath2, HandleType::kDirectory, UserAction::kOpen); + EXPECT_EQ(grant1_not_from_storage->GetStatus(), PermissionStatus::ASK); + EXPECT_EQ(grant2_not_from_storage->GetStatus(), PermissionStatus::ASK); + + // Calling `requestPermission()` on a handle not loaded from IndexedDB will + // not trigger the restore permission prompt. Only the requested handle is + // granted permission. + base::test::TestFuture<PermissionRequestOutcome> future; + grant1_not_from_storage->RequestPermission( + frame_id(), UserActivationState::kNotRequired, future.GetCallback()); + EXPECT_NE(future.Get(), PermissionRequestOutcome::kGrantedByRestorePrompt); + EXPECT_EQ(grant1_not_from_storage->GetStatus(), PermissionStatus::GRANTED); + EXPECT_EQ(grant2_not_from_storage->GetStatus(), PermissionStatus::ASK); +} + +TEST_F(ChromeFileSystemAccessPermissionContextTest, + RestorePermissionPrompt_NotTriggered_WhenNoDormatGrants) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); + auto grant = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kDirectory, UserAction::kOpen); + EXPECT_EQ(grant->GetStatus(), PermissionStatus::ASK); // The origin only has active grants, and no dormant grants. Therefore, the // origin should not grant permission via the restore prompt. base::test::TestFuture<PermissionRequestOutcome> future; grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, future.GetCallback()); auto permission_request_outcome = future.Get(); - EXPECT_NE(PermissionRequestOutcome::kGrantedByRestorePrompt, - permission_request_outcome); + EXPECT_NE(permission_request_outcome, + PermissionRequestOutcome::kGrantedByRestorePrompt); } -TEST_F(ChromeFileSystemAccessPermissionContextTest, - DoNotShowRestorePrompt_RequestWriteAccessToReadGrant) { +TEST_F( + ChromeFileSystemAccessPermissionContextTest, + RestorePermissionPrompt_NotTriggered_WhenRequestingWriteAccessToReadGrant) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); auto grant = permission_context()->GetReadPermissionGrant( kTestOrigin, kTestPath, HandleType::kFile, UserAction::kOpen); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); + EXPECT_EQ(grant->GetStatus(), PermissionStatus::GRANTED); + + // Dormant grants exist after tabs being backgrounded for a while. + permission_context()->OnAllTabsInBackgroundTimerExpired( + kTestOrigin, + OneTimePermissionsTrackerObserver::BackgroundExpiryType::kLongTimeout); + EXPECT_EQ(grant->GetStatus(), PermissionStatus::ASK); // The origin is not eligible to request permission via the restore prompt if // requesting write access to a file which previously had read access. @@ -1264,87 +1390,47 @@ grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, future.GetCallback()); auto permission_request_outcome = future.Get(); - EXPECT_NE(PermissionRequestOutcome::kGrantedByRestorePrompt, - permission_request_outcome); + EXPECT_NE(permission_request_outcome, + PermissionRequestOutcome::kGrantedByRestorePrompt); } TEST_F(ChromeFileSystemAccessPermissionContextTest, - DoNotShowRestorePrompt_RequestAccessToNewFile) { - auto kTestPath2 = base::FilePath(FILE_PATH_LITERAL("/baz/bar")); + RestorePermissionPrompt_NotTriggered_WhenRequestAccessToNewFile) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); auto grant = permission_context()->GetWritePermissionGrant( kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); + EXPECT_EQ(grant->GetStatus(), PermissionStatus::GRANTED); + + // Dormant grants exist after tabs being backgrounded for a while. + permission_context()->OnAllTabsInBackgroundTimerExpired( + kTestOrigin, + OneTimePermissionsTrackerObserver::BackgroundExpiryType::kLongTimeout); + EXPECT_EQ(grant->GetStatus(), PermissionStatus::ASK); // The origin is not eligible to request permission via the restore prompt if - // requesting access to a new file. - grant = permission_context()->GetWritePermissionGrant( + // requesting access to a new file (`kTestPath2`). + auto grant2 = permission_context()->GetWritePermissionGrant( kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kLoadFromStorage); base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); + grant2->RequestPermission(frame_id(), UserActivationState::kNotRequired, + future.GetCallback()); auto permission_request_outcome = future.Get(); - EXPECT_NE(PermissionRequestOutcome::kGrantedByRestorePrompt, - permission_request_outcome); + EXPECT_NE(permission_request_outcome, + PermissionRequestOutcome::kGrantedByRestorePrompt); } TEST_F(ChromeFileSystemAccessPermissionContextTest, - DoNotShowRestorePrompt_FileNotLoadedFromStorage) { - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); + RestorePermissionPrompt_AllowEveryTime) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED); + auto result = + TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kGrantedByRestorePrompt); - // The origin is not eligible to request permission via the restore prompt if - // the file was not loaded from storage. - grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kOpen); - base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); - auto permission_request_outcome = future.Get(); - EXPECT_NE(PermissionRequestOutcome::kGrantedByRestorePrompt, - permission_request_outcome); -} - -TEST_F(ChromeFileSystemAccessPermissionContextTest, - AcceptRestorePrompt_AllowEveryTime) { - const base::FilePath kTestPath2 = base::FilePath(FILE_PATH_LITERAL("/a/b")); - auto read_grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - auto write_grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - auto read_grant2 = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kSave); - auto write_grant2 = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kSave); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grants. - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - EXPECT_EQ(PermissionStatus::ASK, read_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::ASK, write_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::ASK, read_grant2->GetStatus()); - EXPECT_EQ(PermissionStatus::ASK, write_grant2->GetStatus()); - - // TODO(crbug.com/1011533): Trigger the restore prompt via by calling into - // `RequestPermission` once implementation is ready, and remove the - // `*ForTesting` method in this test. - // Select 'Allow every time' from the restore prompt options. - permission_context()->OnRestorePromptAllowEveryTimeForTesting(kTestOrigin); - - // The permission grant status is now `GRANTED` the dormant grants are now - // extended grants. - EXPECT_EQ(PermissionStatus::GRANTED, read_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::GRANTED, write_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::GRANTED, read_grant2->GetStatus()); - EXPECT_EQ(PermissionStatus::GRANTED, write_grant2->GetStatus()); - EXPECT_EQ(2UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); + // The dormant grants are now extended grants, which can be returned from + // `GetGrantedObjects()`. + EXPECT_EQ(permission_context()->GetGrantedObjects(kTestOrigin).size(), 2UL); // TODO(crbug.com/1011533): Update this test to navigate away from the page, // instead of manually resetting the grants. @@ -1354,71 +1440,53 @@ // instead of manually resetting the grants. // The granted permission objects remain, even after navigating away from the // page. - EXPECT_EQ(2UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); + EXPECT_EQ(permission_context()->GetGrantedObjects(kTestOrigin).size(), 2UL); } TEST_F(ChromeFileSystemAccessPermissionContextTest, - AcceptRestorePrompt_AllowThisTime) { - const base::FilePath kTestPath2 = base::FilePath(FILE_PATH_LITERAL("/a/b")); - auto read_grant = permission_context()->GetReadPermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - auto write_grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - auto read_grant2 = permission_context()->GetReadPermissionGrant( - kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kSave); - auto write_grant2 = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kSave); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grants. - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - EXPECT_EQ(PermissionStatus::ASK, read_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::ASK, write_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::ASK, read_grant2->GetStatus()); - EXPECT_EQ(PermissionStatus::ASK, write_grant2->GetStatus()); + RestorePermissionPrompt_AllowOnce) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::GRANTED_ONCE); + auto grant1 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath, HandleType::kFile, UserAction::kOpen); + auto grant2 = permission_context()->GetReadPermissionGrant( + kTestOrigin, kTestPath2, HandleType::kFile, UserAction::kOpen); + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::GRANTED); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::GRANTED); - // TODO(crbug.com/1011533): Trigger the restore prompt via by calling into - // `RequestPermission` once implementation is ready, and remove the - // `*ForTesting` method in this test. - // Select 'Allow this time' from the restore prompt options. - permission_context()->OnRestorePromptAllowThisTimeForTesting(kTestOrigin); + // Dormant grants exist after tabs being backgrounded for a while. + permission_context()->OnAllTabsInBackgroundTimerExpired( + kTestOrigin, + OneTimePermissionsTrackerObserver::BackgroundExpiryType::kLongTimeout); + EXPECT_EQ(grant1->GetStatus(), PermissionStatus::ASK); + EXPECT_EQ(grant2->GetStatus(), PermissionStatus::ASK); - // The permission grant status for all dormant grants is now `GRANTED`. - EXPECT_EQ(PermissionStatus::GRANTED, read_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::GRANTED, write_grant->GetStatus()); - EXPECT_EQ(PermissionStatus::GRANTED, read_grant2->GetStatus()); - EXPECT_EQ(PermissionStatus::GRANTED, write_grant2->GetStatus()); - EXPECT_EQ(2UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); + // Restore Permission prompt is triggered by calling + // `requestPermission()` on the handle of an existing dormant grant. + base::test::TestFuture<PermissionRequestOutcome> future; + grant1->RequestPermission(frame_id(), UserActivationState::kNotRequired, + future.GetCallback()); + EXPECT_EQ(future.Get(), PermissionRequestOutcome::kGrantedByRestorePrompt); + EXPECT_EQ(permission_context()->GetGrantedObjects(kTestOrigin).size(), 2UL); // TODO(crbug.com/1011533): Update this test to navigate away from the page, // instead of manually resetting the grants. permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grants. // The granted permissions are cleared after navigating away from the page. - EXPECT_EQ(0UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); + EXPECT_EQ(permission_context()->GetGrantedObjects(kTestOrigin).size(), 0UL); } -TEST_F(ChromeFileSystemAccessPermissionContextTest, RejectRestorePrompt) { - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); +TEST_F(ChromeFileSystemAccessPermissionContextTest, + RestorePermissionPrompt_Denied) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::DENIED); + auto result = + TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kUserDenied); - // Trigger the restore prompt. - grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kLoadFromStorage); - base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); - - // Persistent grants are cleared as a result of restore prompt + // Persisted grants are cleared as a result of restore prompt // rejection, when Extended Permissions is not enabled. - // The origin is not embargoed, when the restore prompt is rejected - // one time. - permission_context()->OnDontAllowRestorePromptForTesting(kTestOrigin); + // The origin is not embargoed, when the restore prompt is rejected one time. EXPECT_EQ(0UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); auto origin_is_embargoed = PermissionDecisionAutoBlockerFactory::GetForProfile( @@ -1429,7 +1497,8 @@ // Check that origin is placed under embargo after being ignored // `kDefaultDismissalsBeforeBlock` times. - permission_context()->OnDontAllowRestorePromptForTesting(kTestOrigin); + result = TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kUserDenied); // The origin is not embargoed after being ignored 2 times, when the // limit set by `kDefaultDismissalsBeforeBlock` is 3. auto origin_is_embargoed_updated = @@ -1440,7 +1509,8 @@ EXPECT_FALSE(origin_is_embargoed_updated); // The origin is embargoed, after reaching the ignore limit set by // `kDefaultDismissalsBeforeBlock`. - permission_context()->OnDontAllowRestorePromptForTesting(kTestOrigin); + result = TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kUserDenied); auto origin_is_embargoed_after_rejection_limit = PermissionDecisionAutoBlockerFactory::GetForProfile( Profile::FromBrowserContext(profile())) @@ -1450,49 +1520,16 @@ } TEST_F(ChromeFileSystemAccessPermissionContextTest, - RejectRestorePrompt_ExtendedPermissionsEnabled) { - permission_context()->SetOriginHasExtendedPermissionForTesting(kTestOrigin); - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - - // Trigger the restore prompt. - grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kLoadFromStorage); - base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); - - // Persisted grants are NOT cleared by restore prompt rejection when Extended - // Permissions is enabled, and the origin is not embargoed after only being - // rejected one time. - permission_context()->OnDontAllowRestorePromptForTesting(kTestOrigin); - EXPECT_EQ(1UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); -} - -TEST_F(ChromeFileSystemAccessPermissionContextTest, OnIgnoreRestorePrompt) { - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - // TODO(crbug.com/1011533): Update this test to navigate away from the page, - // instead of manually resetting the grant. - grant.reset(); - permission_context()->RevokeActiveGrantsForTesting(kTestOrigin); - - // Trigger the restore prompt. - grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kLoadFromStorage); - base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); + RestorePermissionPrompt_Ignored) { + FileSystemAccessPermissionRequestManager::FromWebContents(web_contents()) + ->set_auto_response_for_test(PermissionAction::IGNORED); + auto result = + TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kRequestAborted); // Persisted grants are cleared by ignoring the restore prompt. // The origin is not embargoed on first ignore. - permission_context()->OnIgnoreRestorePromptForTesting(kTestOrigin); - EXPECT_EQ(0UL, permission_context()->GetGrantedObjects(kTestOrigin).size()); - + EXPECT_EQ(permission_context()->GetGrantedObjects(kTestOrigin).size(), 0UL); auto origin_is_embargoed = PermissionDecisionAutoBlockerFactory::GetForProfile( Profile::FromBrowserContext(profile())) @@ -1502,8 +1539,10 @@ // The origin is placed under embargo after being ignored // `kDefaultIgnoresBeforeBlock` times. - permission_context()->OnIgnoreRestorePromptForTesting(kTestOrigin); - permission_context()->OnIgnoreRestorePromptForTesting(kTestOrigin); + result = TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kRequestAborted); + result = TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kRequestAborted); // The origin is not embargoed after being ignored 3 times, when the // limit set by `kDefaultIgnoresBeforeBlock` is 4. auto origin_is_embargoed_updated = @@ -1515,7 +1554,8 @@ // The origin is embargoed, after reaching the ignore limit set by // `kDefaultIgnoresBeforeBlock`. - permission_context()->OnIgnoreRestorePromptForTesting(kTestOrigin); + result = TriggerRestorePermissionPromptAfterBeingBackgrounded(kTestOrigin); + EXPECT_EQ(result, PermissionRequestOutcome::kRequestAborted); auto origin_is_embargoed_after_ignore_limit = PermissionDecisionAutoBlockerFactory::GetForProfile( Profile::FromBrowserContext(profile())) @@ -1524,32 +1564,6 @@ EXPECT_TRUE(origin_is_embargoed_after_ignore_limit); } -TEST_F(ChromeFileSystemAccessPermissionContextTest, - ShowRestorePrompt_RequestPermissionAfterTabsBackgrounded) { - auto grant = permission_context()->GetWritePermissionGrant( - kTestOrigin, kTestPath, HandleType::kFile, UserAction::kSave); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); - base::test::TestFuture<PermissionRequestOutcome> future; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future.GetCallback()); - auto permisison_request_outcome = future.Get(); - EXPECT_FALSE(PermissionRequestOutcome::kGrantedByRestorePrompt == - permisison_request_outcome); - EXPECT_EQ(PermissionStatus::GRANTED, grant->GetStatus()); - - // Active grants are set to `ASK` state, as a result of tab backgrounding. - permission_context()->OnAllTabsInBackgroundTimerExpired( - kTestOrigin, - OneTimePermissionsTrackerObserver::BackgroundExpiryType::kLongTimeout); - EXPECT_EQ(PermissionStatus::ASK, grant->GetStatus()); - - // The origin is now eligible to show the restore prompt. - base::test::TestFuture<PermissionRequestOutcome> future2; - grant->RequestPermission(frame_id(), UserActivationState::kNotRequired, - future2.GetCallback()); - EXPECT_EQ(PermissionRequestOutcome::kGrantedByRestorePrompt, future2.Get()); -} - TEST_F( ChromeFileSystemAccessPermissionContextNoPersistenceTest, GetWritePermissionGrant_GrantIsRevokedWhenNoLongerUsed_GlobalGuardBlockedAfterNewGrant_NoPersistentPermissions) {
diff --git a/chrome/browser/first_party_sets/first_party_sets_overrides_policy_handler.cc b/chrome/browser/first_party_sets/first_party_sets_overrides_policy_handler.cc index 5246555..2232e3fa 100644 --- a/chrome/browser/first_party_sets/first_party_sets_overrides_policy_handler.cc +++ b/chrome/browser/first_party_sets/first_party_sets_overrides_policy_handler.cc
@@ -109,7 +109,7 @@ std::unique_ptr<base::Value> value; policy::SchemaValidatingPolicyHandler::CheckAndGetValue(policies, nullptr, &value); - prefs->SetValue(first_party_sets::kFirstPartySetsOverrides, + prefs->SetValue(first_party_sets::kRelatedWebsiteSetsOverrides, base::Value::FromUniquePtrValue(std::move(value))); }
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service.cc index e4114893..d5233eb 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service.cc
@@ -43,7 +43,7 @@ const base::Value::Dict* GetOverridesPolicyForProfile( const PrefService* prefs) { - return prefs ? &prefs->GetDict(first_party_sets::kFirstPartySetsOverrides) + return prefs ? &prefs->GetDict(first_party_sets::kRelatedWebsiteSetsOverrides) : nullptr; }
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 011ba1c..4295bee 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
@@ -81,7 +81,7 @@ void FirstPartySetsPolicyServiceFactory::RegisterProfilePrefs( user_prefs::PrefRegistrySyncable* registry) { - registry->RegisterDictionaryPref(kFirstPartySetsOverrides); + registry->RegisterDictionaryPref(kRelatedWebsiteSetsOverrides); } } // namespace first_party_sets
diff --git a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc index 9198acc..8e9fe7cd 100644 --- a/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc +++ b/chrome/browser/first_party_sets/first_party_sets_policy_service_factory_unittest.cc
@@ -55,12 +55,12 @@ disabled_profile->GetPrefs()->SetBoolean( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, false); disabled_profile->GetPrefs()->SetDict( - first_party_sets::kFirstPartySetsOverrides, + first_party_sets::kRelatedWebsiteSetsOverrides, std::move(empty_lists.Clone().GetDict())); enabled_profile->GetPrefs()->SetBoolean( prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, true); enabled_profile->GetPrefs()->SetDict( - first_party_sets::kFirstPartySetsOverrides, + first_party_sets::kRelatedWebsiteSetsOverrides, std::move(empty_lists.GetDict())); // Ensure that the Service creation isn't reliant on the enabled pref.
diff --git a/chrome/browser/first_party_sets/first_party_sets_pref_names.cc b/chrome/browser/first_party_sets/first_party_sets_pref_names.cc index 80c2b56..787a68d 100644 --- a/chrome/browser/first_party_sets/first_party_sets_pref_names.cc +++ b/chrome/browser/first_party_sets/first_party_sets_pref_names.cc
@@ -11,6 +11,8 @@ // A dictionary pref that can contain up to two lists of First-Party Sets that // enterprises can use to override the list of First-Party Sets by either // replacing or adding to the existing list. -const char kFirstPartySetsOverrides[] = "first_party_sets.overrides"; +// "first_party_sets" in the string name is kept for historic reasons to avoid +// migration of a service Pref. +const char kRelatedWebsiteSetsOverrides[] = "first_party_sets.overrides"; } // namespace first_party_sets
diff --git a/chrome/browser/first_party_sets/first_party_sets_pref_names.h b/chrome/browser/first_party_sets/first_party_sets_pref_names.h index cfaea87..9924b7a 100644 --- a/chrome/browser/first_party_sets/first_party_sets_pref_names.h +++ b/chrome/browser/first_party_sets/first_party_sets_pref_names.h
@@ -8,7 +8,7 @@ namespace first_party_sets { // Add Profile prefs below. -extern const char kFirstPartySetsOverrides[]; +extern const char kRelatedWebsiteSetsOverrides[]; } // namespace first_party_sets
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 7bdadb7..81b0a5b 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -192,6 +192,11 @@ "expiry_milestone": 124 }, { + "name": "android-hub", + "owners": [ "clank-hub-dev@google.com" ], + "expiry_milestone": 130 + }, + { "name": "android-improved-bookmarks", "owners": ["wylieb", "skym", "bttk"], "expiry_milestone": 120 @@ -1149,6 +1154,11 @@ "expiry_milestone": 125 }, { + "name": "cdm-storage-database-migration", + "owners": ["vpasupathy@google.com", "alcatraz-eng@google.com", "chrome-owp-storage@google.com"], + "expiry_milestone": 125 + }, + { "name": "cellular-bypass-esim-installation-connectivity-check", "owners": [ "azeemarshad", "khorimoto", "jiajunz", "cros-connectivity@google.com" ], // This flag does not expire because it allows some test cases that host a local SM-DP+ server @@ -1617,7 +1627,7 @@ { "name": "default-browser-refactoring-promo-manager", "owners": [ "cheickcisse@google.com", "bling-flags@google.com" ], - "expiry_milestone": 120 + "expiry_milestone": 125 }, { "name": "default-browser-video-in-settings", "owners": [ "gayane@google.com", "bling-flags@google.com" ], @@ -1626,7 +1636,7 @@ { "name": "default-browser-video-promo", "owners": [ "cheickcisse@google.com", "bling-flags@google.com" ], - "expiry_milestone": 121 + "expiry_milestone": 125 }, { "name": "default-viewport-is-device-width", @@ -4468,6 +4478,11 @@ "expiry_milestone": 110 }, { + "name": "file-system-access-locking-scheme", + "owners": [ "memmott", "chrome-owp-storage@google.com" ], + "expiry_milestone": 120 + }, + { "name": "file-system-observer", "owners": [ "asully", "chrome-owp-storage@google.com" ], "expiry_milestone": 120 @@ -6042,6 +6057,11 @@ "expiry_milestone": 125 }, { + "name": "omnibox-company-entity-icon-adjustment", + "owners": ["jennserrano@google.com", "khalidpeer", "chrome-omnibox-team@google.com"], + "expiry_milestone": 125 + }, + { "name": "omnibox-consumes-ime-insets", "owners": ["pnoland", "chrome-omnibox-team@google.com"], "expiry_milestone": 120 @@ -6341,6 +6361,11 @@ "expiry_milestone": 120 }, { + "name": "omnibox-shortcuts-database-ios", + "owners": [ "christianxu", "chrome-omnibox-team@google.com" ], + "expiry_milestone": 125 + }, + { "name": "omnibox-square-suggest-icons", "owners": [ "manukh", "chrome-omnibox-team@google.com" @@ -8076,6 +8101,11 @@ "expiry_milestone": 99 }, { + "name":"tpc-phase-out-facilitated-testing", + "owners": ["//chrome/browser/tpcd/experiment/OWNERS"], + "expiry_milestone": 133 + }, + { "name": "tracking-protection-3pcd", "owners": ["fmacintosh@google.com", "koilos@google.com"], "expiry_milestone": 133 @@ -8086,14 +8116,6 @@ "expiry_milestone": 125 }, { - "name": "tracking-protection-onboarding-reset-eligibility-for-testing", - "owners": [ - "boujane@google.com", - "koilos@google.com" - ], - "expiry_milestone": 125 - }, - { "name": "traffic-counters", "owners": ["khorimoto", "cros-connectivity@google.com"], "expiry_milestone": 120
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 783513f..be2f5cd 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -127,7 +127,15 @@ const char kCdmStorageDatabaseName[] = "Cdm Storage Database"; const char kCdmStorageDatabaseDescription[] = - "Use the Cdm Storage Database over the MediaLicenseDatabase"; + "Start to use the CdmStorageDatabase to store data alongside the " + "MediaLicenseDatabase. If disabled, we will not use CdmStorage* at all, " + "even in MediaLicense* code."; + +const char kCdmStorageDatabaseMigrationName[] = + "Cdm Storage Database Migration"; +const char kCdmStorageDatabaseMigrationDescription[] = + "Use the Cdm Storage Database over the MediaLicenseDatabase for Cdm " + "storage operations."; const char kClickToCallName[] = "Click-To-Call"; const char kClickToCallDescription[] = "Enable the click-to-call feature."; @@ -1699,6 +1707,13 @@ "icons. See https://github.com/WICG/file-handling/blob/main/explainer.md " "for more information."; +const char kFileSystemAccessLockingSchemeName[] = "File system lock modes"; +const char kFileSystemAccessLockingSchemeDescription[] = + "Allows the creation of FileSystemSyncAccessHandle and " + "FileSystemWritableFileStream in new locking modes. See " + "https://github.com/whatwg/fs/blob/main/proposals/" + "MultipleReadersWriters.md for more information."; + const char kFileSystemObserverName[] = "FileSystemObserver"; const char kFileSystemObserverDescription[] = "Enables the FileSystemObserver interface, which allows websites to be " @@ -2291,6 +2306,12 @@ const char kOmniboxCalcProviderDescription[] = "When enabled, suggests recent calculator results in the omnibox."; +const char kOmniboxCompanyEntityIconAdjustmentName[] = + "Omnibox Company Entity Icon Adjustment"; +const char kOmniboxCompanyEntityIconAdjustmentDescription[] = + "When enabled, company entity icons may be replaced based on the search " + "suggestions and their corresponding order."; + const char kOmniboxCR23ActionChipsName[] = "Omnibox CR 2023 Action Chips"; const char kOmniboxCR23ActionChipsDescription[] = "Updates Omnibox Action Chips to comply with CR23 shape guidelines."; @@ -3415,6 +3436,12 @@ "Enables IPv4 to IPv6 address translation for IPv4 literals when chrome is " "on an IPv6 only network"; +const char kTPCPhaseOutFacilitatedTestingName[] = + "Third-party Cookie Phase Out Facilitated Testing"; +const char kTPCPhaseOutFacilitatedTestingDescription[] = + "Enables third-party cookie phase out for facilitated testing described in " + "https://developer.chrome.com/en/docs/privacy-sandbox/chrome-testing/"; + const char kTrackingProtection3pcdName[] = "Tracking Protection for 3PCD"; const char kTrackingProtection3pcdDescription[] = "Enables the tracking protection UI + prefs that will be used for the 3PCD " @@ -3425,12 +3452,6 @@ const char kTrackingProtectionOnboardingForceEligibilityDescription[] = "Enables the onboarding flow for Tracking Protections"; -const char kTrackingProtectionOnboardingResetEligibilityForTestingName[] = - "Reset Tracking Protection Onboarding"; -const char - kTrackingProtectionOnboardingResetEligibilityForTestingDescription[] = - "Resets the tracking protection onboarding profile data on startup"; - const char kUserBypassUIName[] = "User Bypass UI"; const char kUserBypassUIDescription[] = "Enables the User Bypass UI. "; @@ -3798,6 +3819,11 @@ const char kAndroidHatsRefactorDescription[] = "Enables survey structure refactor."; +const char kAndroidHubName[] = "Android Hub"; +const char kAndroidHubDescription[] = + "Replaces the Tab Switcher with a UI surface containing more types of " + "data."; + const char kAnimatedImageDragShadowName[] = "Enable animated image drag shadow on Android."; const char kAnimatedImageDragShadowDescription[] = @@ -4343,11 +4369,6 @@ "Enable checking URLs through Safe Browsing hash-prefix real time " "protocol."; -const char kSafeModeForCachedFlagsName[] = "Safe Mode for Cached Flags"; -const char kSafeModeForCachedFlagsDescription[] = - "Attempts recovery from startup crash loops caused by a bad field trial " - "by rolling back to previous known safe flag values."; - const char kSafeSitesFilterBehaviorPolicyAndroidName[] = "Allow SafeSitesFilterBehavior policy on Android"; const char kSafeSitesFilterBehaviorPolicyAndroidDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index ae58a5fc..2c8e0ae 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -110,6 +110,9 @@ extern const char kCdmStorageDatabaseName[]; extern const char kCdmStorageDatabaseDescription[]; +extern const char kCdmStorageDatabaseMigrationName[]; +extern const char kCdmStorageDatabaseMigrationDescription[]; + extern const char kChromeRootStoreEnabledName[]; extern const char kChromeRootStoreEnabledDescription[]; @@ -958,6 +961,9 @@ extern const char kFileHandlingIconsName[]; extern const char kFileHandlingIconsDescription[]; +extern const char kFileSystemAccessLockingSchemeName[]; +extern const char kFileSystemAccessLockingSchemeDescription[]; + extern const char kFileSystemObserverName[]; extern const char kFileSystemObserverDescription[]; @@ -1307,6 +1313,9 @@ extern const char kOmniboxCalcProviderName[]; extern const char kOmniboxCalcProviderDescription[]; +extern const char kOmniboxCompanyEntityIconAdjustmentName[]; +extern const char kOmniboxCompanyEntityIconAdjustmentDescription[]; + extern const char kOmniboxConsumesImeInsetsName[]; extern const char kOmniboxConsumesImeInsetsDescription[]; @@ -1969,16 +1978,15 @@ extern const char kTailoredSecurityRetryForSyncUsersName[]; extern const char kTailoredSecurityRetryForSyncUsersDescription[]; +extern const char kTPCPhaseOutFacilitatedTestingName[]; +extern const char kTPCPhaseOutFacilitatedTestingDescription[]; + extern const char kTrackingProtection3pcdName[]; extern const char kTrackingProtection3pcdDescription[]; extern const char kTrackingProtectionOnboardingForceEligibilityName[]; extern const char kTrackingProtectionOnboardingForceEligibilityDescription[]; -extern const char kTrackingProtectionOnboardingResetEligibilityForTestingName[]; -extern const char - kTrackingProtectionOnboardingResetEligibilityForTestingDescription[]; - extern const char kUnifiedPasswordManagerAndroidName[]; extern const char kUnifiedPasswordManagerAndroidDescription[]; @@ -2221,6 +2229,9 @@ extern const char kAndroidHatsRefactorName[]; extern const char kAndroidHatsRefactorDescription[]; +extern const char kAndroidHubName[]; +extern const char kAndroidHubDescription[]; + extern const char kAutofillUseMobileLabelDisambiguationName[]; extern const char kAutofillUseMobileLabelDisambiguationDescription[]; @@ -2554,9 +2565,6 @@ extern const char kSafeBrowsingHashPrefixRealTimeLookupsName[]; extern const char kSafeBrowsingHashPrefixRealTimeLookupsDescription[]; -extern const char kSafeModeForCachedFlagsName[]; -extern const char kSafeModeForCachedFlagsDescription[]; - extern const char kSafeSitesFilterBehaviorPolicyAndroidName[]; extern const char kSafeSitesFilterBehaviorPolicyAndroidDescription[];
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 956f2da..42d488b 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -172,6 +172,7 @@ &kAndroidAppIntegration, &kAndroidAppIntegrationSafeSearch, &kAndroidHatsRefactor, + &kAndroidHub, &kAndroidSearchEngineChoiceNotification, &kAndroidImprovedBookmarks, &kAndroidNoVisibleHintForTablets, @@ -248,6 +249,7 @@ &kDrawEdgeToEdge, &kDrawNativeEdgeToEdge, &kDrawWebEdgeToEdge, + &kEarlyInitializeStartupMetrics, &kEmptyStates, &kExperimentsForAgsa, &kExploreSites, @@ -303,7 +305,6 @@ &kRequestDesktopSiteDefaultsDowngrade, &kRequestDesktopSiteDefaultsLogging, &kRestoreTabsOnFRE, - &kSafeModeForCachedFlags, &kSearchEnginesPromoV3, &kShowScrollableMVTOnNTPAndroid, &kFeedPositionAndroid, @@ -482,6 +483,8 @@ "AndroidHatsRefactor", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kAndroidHub, "AndroidHub", base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kAndroidSearchEngineChoiceNotification, "AndroidSearchEngineChoiceNotification", base::FEATURE_ENABLED_BY_DEFAULT); @@ -783,6 +786,10 @@ "DrawWebEdgeToEdge", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kEarlyInitializeStartupMetrics, + "EarlyInitializeStartupMetrics", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kEmptyStates, "EmptyStates", base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kExperimentsForAgsa, @@ -995,10 +1002,6 @@ "RestoreTabsOnFRE", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kSafeModeForCachedFlags, - "SafeModeForCachedFlags", - base::FEATURE_ENABLED_BY_DEFAULT); - BASE_FEATURE(kScrollToTLDOptimization, "ScrollToTLDOptimization", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/browser/flags/android/chrome_feature_list.h b/chrome/browser/flags/android/chrome_feature_list.h index 5ebcb89..82650a6 100644 --- a/chrome/browser/flags/android/chrome_feature_list.h +++ b/chrome/browser/flags/android/chrome_feature_list.h
@@ -24,6 +24,7 @@ BASE_DECLARE_FEATURE(kAndroidAppIntegration); BASE_DECLARE_FEATURE(kAndroidAppIntegrationSafeSearch); BASE_DECLARE_FEATURE(kAndroidHatsRefactor); +BASE_DECLARE_FEATURE(kAndroidHub); BASE_DECLARE_FEATURE(kAndroidSearchEngineChoiceNotification); BASE_DECLARE_FEATURE(kAndroidImprovedBookmarks); BASE_DECLARE_FEATURE(kAndroidNoVisibleHintForTablets); @@ -106,6 +107,7 @@ BASE_DECLARE_FEATURE(kDrawNativeEdgeToEdge); BASE_DECLARE_FEATURE(kDrawWebEdgeToEdge); BASE_DECLARE_FEATURE(kDragDropIntoOmnibox); +BASE_DECLARE_FEATURE(kEarlyInitializeStartupMetrics); BASE_DECLARE_FEATURE(kEmptyStates); BASE_DECLARE_FEATURE(kExperimentsForAgsa); BASE_DECLARE_FEATURE(kExploreSites); @@ -170,7 +172,6 @@ BASE_DECLARE_FEATURE(kSharingHubLinkToggle); BASE_DECLARE_FEATURE(kShowScrollableMVTOnNTPAndroid); BASE_DECLARE_FEATURE(kFeedPositionAndroid); -BASE_DECLARE_FEATURE(kSafeModeForCachedFlags); BASE_DECLARE_FEATURE(kScrollToTLDOptimization); BASE_DECLARE_FEATURE(kSearchResumptionModuleAndroid); BASE_DECLARE_FEATURE(kShouldIgnoreIntentSkipInternalCheck);
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java index 6ca1557..f517006 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFeatureFlagsSafeModeUnitTest.java
@@ -68,13 +68,12 @@ @Before public void setUp() { - CachedFlagsSafeMode.getInstance().setExperimentEnabledForTesting(true); + CachedFlagsSafeMode.getInstance().enableForTesting(); clearMemory(); } @After public void tearDown() { - CachedFlagsSafeMode.getInstance().setExperimentEnabledForTesting(null); FeatureList.setTestFeatures(null); clearMemory(); }
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java index 1a1ad821..531c3f31 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/CachedFlagsSafeMode.java
@@ -4,7 +4,6 @@ package org.chromium.chrome.browser.flags; -import android.annotation.SuppressLint; import android.content.Context; import android.content.SharedPreferences; @@ -45,7 +44,6 @@ static final String PREF_SAFE_VALUES_VERSION = "Chrome.Flags.SafeValuesVersion"; private Boolean mSafeModeExperimentForcedForTesting; - private Boolean mSafeModeExperimentEnabled; // These values are persisted to logs. Entries should not be renumbered and numeric values // should never be reused. @@ -283,8 +281,6 @@ } Boolean isEnabled(String featureName, String preferenceName, boolean defaultValue) { - if (!isSafeModeExperimentEnabled()) return null; - switch (mBehavior.get()) { case Behavior.NOT_ENGAGED_BELOW_THRESHOLD: return null; @@ -304,8 +300,6 @@ } Boolean getBooleanFieldTrialParam(String preferenceName, boolean defaultValue) { - if (!isSafeModeExperimentEnabled()) return null; - switch (mBehavior.get()) { case Behavior.NOT_ENGAGED_BELOW_THRESHOLD: return null; @@ -325,8 +319,6 @@ } Integer getIntFieldTrialParam(String preferenceName, int defaultValue) { - if (!isSafeModeExperimentEnabled()) return null; - switch (mBehavior.get()) { case Behavior.NOT_ENGAGED_BELOW_THRESHOLD: return null; @@ -346,8 +338,6 @@ } Double getDoubleFieldTrialParam(String preferenceName, double defaultValue) { - if (!isSafeModeExperimentEnabled()) return null; - switch (mBehavior.get()) { case Behavior.NOT_ENGAGED_BELOW_THRESHOLD: return null; @@ -368,8 +358,6 @@ } String getStringFieldTrialParam(String preferenceName, String defaultValue) { - if (!isSafeModeExperimentEnabled()) return null; - switch (mBehavior.get()) { case Behavior.NOT_ENGAGED_BELOW_THRESHOLD: return null; @@ -388,25 +376,6 @@ } } - public static void cacheSafeModeForCachedFlagsEnabled() { - SharedPreferencesManager.getInstance().writeBoolean( - ChromePreferenceKeys.FLAGS_SAFE_MODE_ENABLED, - ChromeFeatureList.isEnabled(ChromeFeatureList.SAFE_MODE_FOR_CACHED_FLAGS)); - } - - private boolean isSafeModeExperimentEnabled() { - if (mSafeModeExperimentForcedForTesting != null) { - return mSafeModeExperimentForcedForTesting; - } - - if (mSafeModeExperimentEnabled == null) { - mSafeModeExperimentEnabled = SharedPreferencesManager.getInstance().readBoolean( - ChromePreferenceKeys.FLAGS_SAFE_MODE_ENABLED, true); - } - - return mSafeModeExperimentEnabled; - } - @Behavior int getBehaviorForTesting() { return mBehavior.get(); @@ -416,16 +385,10 @@ mBehavior.set(Behavior.UNKNOWN); mStartCheckpointWritten.set(false); mEndCheckpointWritten.set(false); - mSafeModeExperimentEnabled = null; } - @SuppressLint({"ApplySharedPref"}) - static void clearDiskForTesting() { - getSafeValuePreferences().edit().clear().commit(); - } - - void setExperimentEnabledForTesting(Boolean value) { - mSafeModeExperimentForcedForTesting = value; + void enableForTesting() { + mSafeModeExperimentForcedForTesting = true; ResettersForTesting.register(() -> mSafeModeExperimentForcedForTesting = null); } }
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 951dd45..69cfdd1 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
@@ -114,6 +114,7 @@ public static final String ANDROID_APP_INTEGRATION_SAFE_SEARCH = "AndroidAppIntegrationSafeSearch"; public static final String ANDROID_HATS_REFACTOR = "AndroidHatsRefactor"; + public static final String ANDROID_HUB = "AndroidHub"; public static final String ANDROID_SEARCH_ENGINE_CHOICE_NOTIFICATION = "AndroidSearchEngineChoiceNotification"; public static final String ANDROID_IMPROVED_BOOKMARKS = "AndroidImprovedBookmarks"; @@ -262,6 +263,7 @@ public static final String DRAW_EDGE_TO_EDGE = "DrawEdgeToEdge"; public static final String DRAW_NATIVE_EDGE_TO_EDGE = "DrawNativeEdgeToEdge"; public static final String DRAW_WEB_EDGE_TO_EDGE = "DrawWebEdgeToEdge"; + public static final String EARLY_INITIALIZE_STARTUP_METRICS = "EarlyInitializeStartupMetrics"; public static final String ENABLE_PROTO_API_FOR_CLASSIFY_URL = "EnableProtoApiForClassifyUrl"; public static final String EXPERIMENTS_FOR_AGSA = "ExperimentsForAgsa"; public static final String EMPTY_STATES = "EmptyStates"; @@ -412,7 +414,6 @@ public static final String REQUEST_DESKTOP_SITE_OPT_IN_SYNTHETIC = "RequestDesktopSiteOptInSynthetic"; public static final String SAFE_BROWSING_DELAYED_WARNINGS = "SafeBrowsingDelayedWarnings"; - public static final String SAFE_MODE_FOR_CACHED_FLAGS = "SafeModeForCachedFlags"; public static final String SCREENSHOTS_FOR_ANDROID_V2 = "ScreenshotsForAndroidV2"; public static final String SCROLL_TO_TLD_OPTIMIZATION = "ScrollToTLDOptimization"; public static final String SEARCH_ENGINES_PROMO_V3 = "SearchEnginesPromoV3"; @@ -495,6 +496,7 @@ /* Alphabetical: */ public static final CachedFlag sAndroidAppIntegration = new CachedFlag(ANDROID_APP_INTEGRATION, false); + public static final CachedFlag sAndroidHub = new CachedFlag(ANDROID_HUB, false); public static final CachedFlag sAppMenuMobileSiteOption = new CachedFlag(APP_MENU_MOBILE_SITE_OPTION, false); public static final CachedFlag sBackGestureActivityTabProvider = @@ -555,6 +557,8 @@ new CachedFlag(DRAW_NATIVE_EDGE_TO_EDGE, false); public static final CachedFlag sDrawWebEdgeToEdge = new CachedFlag(DRAW_WEB_EDGE_TO_EDGE, false); + public static final CachedFlag sEarlyInitializeStartupMetrics = + new CachedFlag(EARLY_INITIALIZE_STARTUP_METRICS, false); public static final CachedFlag sEmptyStates = new CachedFlag(EMPTY_STATES, true); public static final CachedFlag sExperimentsForAgsa = new CachedFlag(EXPERIMENTS_FOR_AGSA, true); public static final CachedFlag sFeedLoadingPlaceholder = @@ -634,6 +638,7 @@ public static final List<CachedFlag> sFlagsCachedFullBrowser = List.of( // clang-format off sAndroidAppIntegration, + sAndroidHub, sAppMenuMobileSiteOption, sBackGestureActivityTabProvider, sBackGestureRefactorActivityAndroid, @@ -666,6 +671,7 @@ sDrawEdgeToEdge, sDrawNativeEdgeToEdge, sDrawWebEdgeToEdge, + sEarlyInitializeStartupMetrics, sEmptyStates, sFeedLoadingPlaceholder, sFriendlierSafeBrowsingSettingsEnhancedProtection,
diff --git a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc index 1e30b697..b2bbf416 100644 --- a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc +++ b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.cc
@@ -39,7 +39,8 @@ HeavyAdServiceFactory::~HeavyAdServiceFactory() {} -KeyedService* HeavyAdServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +HeavyAdServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { - return new heavy_ad_intervention::HeavyAdService(); + return std::make_unique<heavy_ad_intervention::HeavyAdService>(); }
diff --git a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h index 4408219..69cec06 100644 --- a/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h +++ b/chrome/browser/heavy_ad_intervention/heavy_ad_service_factory.h
@@ -37,7 +37,7 @@ ~HeavyAdServiceFactory() override; // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const override; };
diff --git a/chrome/browser/hid/chrome_hid_delegate_unittest.cc b/chrome/browser/hid/chrome_hid_delegate_unittest.cc index d13f160..b70be120 100644 --- a/chrome/browser/hid/chrome_hid_delegate_unittest.cc +++ b/chrome/browser/hid/chrome_hid_delegate_unittest.cc
@@ -1006,6 +1006,9 @@ auto worker_url = GURL(base::StringPrintf("%s/worker.js", origin_url_.spec().c_str())); CreateAndStartWorker(origin_url_, worker_url); + + // Wait until tasks triggered by ServiceWorkerHidDelegateObserver settle. + base::RunLoop().RunUntilIdle(); } void StopWorker() { StopAndResetWorker(); }
diff --git a/chrome/browser/hub/BUILD.gn b/chrome/browser/hub/BUILD.gn index 8dc2796d..1926618 100644 --- a/chrome/browser/hub/BUILD.gn +++ b/chrome/browser/hub/BUILD.gn
@@ -8,6 +8,7 @@ android_library("java") { sources = [ "android/java/src/org/chromium/chrome/browser/hub/DefaultPaneOrderController.java", + "android/java/src/org/chromium/chrome/browser/hub/HubFieldTrial.java", "android/java/src/org/chromium/chrome/browser/hub/Pane.java", "android/java/src/org/chromium/chrome/browser/hub/PaneId.java", "android/java/src/org/chromium/chrome/browser/hub/PaneListBuilder.java", @@ -17,6 +18,7 @@ deps = [ "//base:base_java", + "//chrome/browser/flags:java", "//components/browser_ui/widget/android:java", "//third_party/android_deps:guava_android_java", "//third_party/androidx:androidx_annotation_annotation_java", @@ -30,13 +32,17 @@ } robolectric_library("junit") { - sources = [ "android/java/src/org/chromium/chrome/browser/hub/PaneListBuilderUnitTest.java" ] + sources = [ + "android/java/src/org/chromium/chrome/browser/hub/HubFieldTrialTest.java", + "android/java/src/org/chromium/chrome/browser/hub/PaneListBuilderUnitTest.java", + ] deps = [ ":java", "//base:base_java", "//base:base_java_test_support", "//base:base_junit_test_support", + "//chrome/browser/flags:java", "//chrome/test/android:chrome_java_unit_test_support", "//components/browser_ui/widget/android:java", "//third_party/android_deps:guava_android_java",
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubFieldTrial.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubFieldTrial.java new file mode 100644 index 0000000..9c34329 --- /dev/null +++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubFieldTrial.java
@@ -0,0 +1,69 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.hub; + +import org.chromium.chrome.browser.flags.BooleanCachedFieldTrialParameter; +import org.chromium.chrome.browser.flags.ChromeFeatureList; + +/** Common hub feature utils for public use. */ +public class HubFieldTrial { + private static final String FLOATING_ACTION_BUTTON_PARAM = "floating_action_button"; + public static final BooleanCachedFieldTrialParameter FLOATING_ACTION_BUTTON = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.ANDROID_HUB, FLOATING_ACTION_BUTTON_PARAM, false); + + private static final String PANE_SWITCHER_USES_TEXT_PARAM = "pane_switcher_uses_text"; + public static final BooleanCachedFieldTrialParameter PANE_SWITCHER_USES_TEXT = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.ANDROID_HUB, PANE_SWITCHER_USES_TEXT_PARAM, false); + + private static final String SUPPORTS_OTHER_TABS_PARAM = "supports_other_tabs"; + public static final BooleanCachedFieldTrialParameter SUPPORTS_OTHER_TABS = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.ANDROID_HUB, SUPPORTS_OTHER_TABS_PARAM, false); + + private static final String SUPPORTS_BOOKMARKS_PARAM = "supports_bookmarks"; + public static final BooleanCachedFieldTrialParameter SUPPORTS_BOOKMARKS = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.ANDROID_HUB, SUPPORTS_BOOKMARKS_PARAM, false); + + private static final String SUPPORTS_SEARCH_PARAM = "supports_search"; + public static final BooleanCachedFieldTrialParameter SUPPORTS_SEARCH = + new BooleanCachedFieldTrialParameter( + ChromeFeatureList.ANDROID_HUB, SUPPORTS_SEARCH_PARAM, false); + + /** Returns whether the hub is enabled. */ + public static boolean isHubEnabled() { + return ChromeFeatureList.sAndroidHub.isEnabled(); + } + + /** + * Returns whether the primary action on a pane should be shown in a floating action button. + * When false the button will be in part of the toolbar. + */ + public static boolean usesFloatActionButton() { + return FLOATING_ACTION_BUTTON.getValue(); + } + + /** Returns whether the UI to switch between panes is using text names or icons. */ + public static boolean doesPaneSwitcherUseText() { + return PANE_SWITCHER_USES_TEXT.getValue(); + } + + /** Returns whether the hub should display an tabs from other devices pane. */ + public static boolean supportsOtherTabs() { + return SUPPORTS_OTHER_TABS.getValue(); + } + + /** Returns whether the hub should display a bookmarks pane. */ + public static boolean supportsBookmarks() { + return SUPPORTS_BOOKMARKS.getValue(); + } + + /** Returns whether the hub has a search for content across all panes. */ + public static boolean supportsSearch() { + return SUPPORTS_SEARCH.getValue(); + } +}
diff --git a/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubFieldTrialTest.java b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubFieldTrialTest.java new file mode 100644 index 0000000..9789c11 --- /dev/null +++ b/chrome/browser/hub/android/java/src/org/chromium/chrome/browser/hub/HubFieldTrialTest.java
@@ -0,0 +1,84 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.hub; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import androidx.test.filters.SmallTest; + +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.TestRule; +import org.junit.runner.RunWith; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.test.util.browser.Features; + +/** Unit tests for {@link HubFieldTrial}. */ +@RunWith(BaseRobolectricTestRunner.class) +public class HubFieldTrialTest { + @Rule + public TestRule mProcessor = new Features.JUnitProcessor(); + + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.ANDROID_HUB}) + public void testHubEnabled() { + assertTrue(HubFieldTrial.isHubEnabled()); + } + + @Test + @SmallTest + public void testHubDisabled() { + assertFalse(HubFieldTrial.isHubEnabled()); + } + + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.ANDROID_HUB}) + public void testUsesFloatActionButton() { + assertFalse(HubFieldTrial.usesFloatActionButton()); + HubFieldTrial.FLOATING_ACTION_BUTTON.setForTesting(true); + assertTrue(HubFieldTrial.usesFloatActionButton()); + } + + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.ANDROID_HUB}) + public void testDoesPaneSwitcherUseText() { + assertFalse(HubFieldTrial.doesPaneSwitcherUseText()); + HubFieldTrial.PANE_SWITCHER_USES_TEXT.setForTesting(true); + assertTrue(HubFieldTrial.doesPaneSwitcherUseText()); + } + + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.ANDROID_HUB}) + public void testSupportsOtherTabs() { + assertFalse(HubFieldTrial.supportsOtherTabs()); + HubFieldTrial.SUPPORTS_OTHER_TABS.setForTesting(true); + assertTrue(HubFieldTrial.supportsOtherTabs()); + } + + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.ANDROID_HUB}) + public void testSupportsBookmarks() { + assertFalse(HubFieldTrial.supportsBookmarks()); + HubFieldTrial.SUPPORTS_BOOKMARKS.setForTesting(true); + assertTrue(HubFieldTrial.supportsBookmarks()); + } + + @Test + @SmallTest + @Features.EnableFeatures({ChromeFeatureList.ANDROID_HUB}) + public void testSupportsSearch() { + assertFalse(HubFieldTrial.supportsSearch()); + HubFieldTrial.SUPPORTS_SEARCH.setForTesting(true); + assertTrue(HubFieldTrial.supportsSearch()); + } +}
diff --git a/chrome/browser/interest_group/interest_group_permissions_browsertest.cc b/chrome/browser/interest_group/interest_group_permissions_browsertest.cc index eee02118..6dd38722 100644 --- a/chrome/browser/interest_group/interest_group_permissions_browsertest.cc +++ b/chrome/browser/interest_group/interest_group_permissions_browsertest.cc
@@ -7,17 +7,17 @@ #include "base/test/bind.h" #include "base/test/test_timeouts.h" #include "chrome/browser/content_settings/cookie_settings_factory.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" -#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" #include "components/content_settings/core/browser/cookie_settings.h" #include "components/content_settings/core/common/content_settings.h" #include "components/content_settings/core/common/pref_names.h" #include "components/prefs/pref_service.h" #include "components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h" -#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "components/privacy_sandbox/privacy_sandbox_settings.h" #include "content/public/common/content_features.h" @@ -28,7 +28,8 @@ namespace interest_group { -class InterestGroupPermissionsBrowserTest : public InProcessBrowserTest { +class InterestGroupPermissionsBrowserTest + : public MixinBasedInProcessBrowserTest { public: InterestGroupPermissionsBrowserTest() { scoped_feature_list_.InitWithFeatures( @@ -44,12 +45,6 @@ void SetUpOnMainThread() override { InProcessBrowserTest::SetUpOnMainThread(); - // `PrivacySandboxAttestations` has a member of type - // `scoped_refptr<base::SequencedTaskRunner>`, its initialization must be - // done after a browser process is created. - scoped_attestations_ = - std::make_unique<privacy_sandbox::ScopedPrivacySandboxAttestations>( - privacy_sandbox::PrivacySandboxAttestations::CreateForTesting()); // Mark all Privacy Sandbox APIs as attested since the test cases are // testing behaviors not related to attestations. privacy_sandbox::PrivacySandboxAttestations::GetInstance() @@ -215,8 +210,8 @@ protected: base::test::ScopedFeatureList scoped_feature_list_; std::unique_ptr<net::EmbeddedTestServer> https_server_; - std::unique_ptr<privacy_sandbox::ScopedPrivacySandboxAttestations> - scoped_attestations_; + privacy_sandbox::PrivacySandboxAttestationsMixin + privacy_sandbox_attestations_mixin_{&mixin_host_}; }; class InterestGroupOffBrowserTest : public InterestGroupPermissionsBrowserTest {
diff --git a/chrome/browser/manta/OWNERS b/chrome/browser/manta/OWNERS index e58458c..b3c8aaf17 100644 --- a/chrome/browser/manta/OWNERS +++ b/chrome/browser/manta/OWNERS
@@ -1,5 +1 @@ -alanlxl@chromium.org -amoylan@chromium.org -mcrouse@chromium.org -# sanjeetnd@google.com - not a committer yet -sophiechang@chromium.org +file://components/manta/OWNERS
diff --git a/chrome/browser/manta/manta_service_factory.cc b/chrome/browser/manta/manta_service_factory.cc index d54dad2e..cd10e735 100644 --- a/chrome/browser/manta/manta_service_factory.cc +++ b/chrome/browser/manta/manta_service_factory.cc
@@ -6,11 +6,11 @@ #include <memory> -#include "chrome/browser/browser_features.h" #include "chrome/browser/manta/manta_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_selections.h" #include "chrome/browser/signin/identity_manager_factory.h" +#include "components/manta/features.h" #include "content/public/browser/browser_context.h" namespace manta { @@ -43,7 +43,7 @@ } bool MantaServiceFactory::ServiceIsCreatedWithBrowserContext() const { - return base::FeatureList::IsEnabled(features::kMantaService); + return features::IsMantaServiceEnabled(); } } // namespace manta
diff --git a/chrome/browser/net/chrome_network_delegate.cc b/chrome/browser/net/chrome_network_delegate.cc index 61d6cff..88937d7 100644 --- a/chrome/browser/net/chrome_network_delegate.cc +++ b/chrome/browser/net/chrome_network_delegate.cc
@@ -16,6 +16,10 @@ #include "chrome/common/chrome_paths.h" #endif +#if BUILDFLAG(IS_CHROMEOS_ASH) +#include "ash/constants/ambient_time_of_day_constants.h" +#endif + #if BUILDFLAG(IS_ANDROID) #include "base/android/build_info.h" #include "base/android/path_utils.h" @@ -78,7 +82,6 @@ "/media", "/opt/oem", "/run/arc/sdcard/write/emulated/0", - "/run/imageloader", "/usr/share/chromeos-assets", "/var/log", }; @@ -110,6 +113,10 @@ if (base::PathService::Get(chrome::DIR_DEFAULT_DOWNLOADS, &downloads_dir)) allowlist.push_back(downloads_dir); } + // /run/imageloader is the root directory for all DLC packages. The "timeofday" package + // specifically contains assets required for one of ash's screen saver themes. + allowlist.push_back( + base::FilePath("/run/imageloader").Append(ash::kTimeOfDayDlcId)); #else // Lacros uses the system-level documents directory and downloads directory // under /home/chronos/u-<hash>, which are provided via PathService. Since
diff --git a/chrome/browser/net/profile_network_context_service.cc b/chrome/browser/net/profile_network_context_service.cc index 1d6a86f..1200475 100644 --- a/chrome/browser/net/profile_network_context_service.cc +++ b/chrome/browser/net/profile_network_context_service.cc
@@ -1066,6 +1066,14 @@ network_context_params->ip_protection_config_getter .InitWithNewPipeAndPassReceiver()); } + + network_context_params->afp_block_list_experiment_enabled = + (!profile_->IsOffTheRecord() && + base::FeatureList::IsEnabled( + features::kEnableNetworkServiceResourceBlockList)) || + (profile_->IsOffTheRecord() && + base::FeatureList::IsEnabled( + features::kEnableNetworkServiceResourceBlockListInOtrSessions)); } base::FilePath ProfileNetworkContextService::GetPartitionPath(
diff --git a/chrome/browser/new_tab_page/customize_chrome/customize_chrome_feature_promo_helper_unittest.cc b/chrome/browser/new_tab_page/customize_chrome/customize_chrome_feature_promo_helper_unittest.cc index 43c903b..0c923c58 100644 --- a/chrome/browser/new_tab_page/customize_chrome/customize_chrome_feature_promo_helper_unittest.cc +++ b/chrome/browser/new_tab_page/customize_chrome/customize_chrome_feature_promo_helper_unittest.cc
@@ -105,11 +105,9 @@ TEST_F(CustomizeChromeFeaturePromoHelperTest, MaybeShowCustomizeChromeFeaturePromoHelper) { - EXPECT_CALL( - *mock_promo_controller(), - MaybeShowPromo( - testing::Ref(feature_engagement::kIPHDesktopCustomizeChromeFeature), - testing::_, testing::_, testing::_)) + EXPECT_CALL(*mock_promo_controller(), + MaybeShowPromo(user_education::test::MatchFeaturePromoParams( + feature_engagement::kIPHDesktopCustomizeChromeFeature))) .Times(1) .WillOnce(testing::Return(user_education::FeaturePromoResult::Success())); helper()->SetDefaultSearchProviderIsGoogleForTesting(true); @@ -118,9 +116,7 @@ TEST_F(CustomizeChromeFeaturePromoHelperTest, MaybeShowCustomizeChromeFeaturePromoHelperNonGoogle) { - EXPECT_CALL(*mock_promo_controller(), - MaybeShowPromo(testing::_, testing::_, testing::_, testing::_)) - .Times(0); + EXPECT_CALL(*mock_promo_controller(), MaybeShowPromo(testing::_)).Times(0); helper()->SetDefaultSearchProviderIsGoogleForTesting(false); helper()->MaybeShowCustomizeChromeFeaturePromo(tab()); } @@ -142,10 +138,8 @@ SetChromeRefresh2023(); EXPECT_CALL( *mock_promo_controller(), - MaybeShowPromo( - testing::Ref( - feature_engagement::kIPHDesktopCustomizeChromeRefreshFeature), - testing::_, testing::_, testing::_)) + MaybeShowPromo(user_education::test::MatchFeaturePromoParams( + feature_engagement::kIPHDesktopCustomizeChromeRefreshFeature))) .Times(1) .WillOnce(testing::Return(user_education::FeaturePromoResult::Success())); helper()->SetDefaultSearchProviderIsGoogleForTesting(true); @@ -155,9 +149,7 @@ TEST_F(CustomizeChromeFeaturePromoHelperTest, MaybeShowCustomizeChromeRefreshFeaturePromoHelperNonGoogle) { SetChromeRefresh2023(); - EXPECT_CALL(*mock_promo_controller(), - MaybeShowPromo(testing::_, testing::_, testing::_, testing::_)) - .Times(0); + EXPECT_CALL(*mock_promo_controller(), MaybeShowPromo(testing::_)).Times(0); helper()->SetDefaultSearchProviderIsGoogleForTesting(false); helper()->MaybeShowCustomizeChromeFeaturePromo(tab()); }
diff --git a/chrome/browser/page_info/about_this_site_service_factory.cc b/chrome/browser/page_info/about_this_site_service_factory.cc index f5e3ba17..d77f7b8 100644 --- a/chrome/browser/page_info/about_this_site_service_factory.cc +++ b/chrome/browser/page_info/about_this_site_service_factory.cc
@@ -45,7 +45,8 @@ AboutThisSiteServiceFactory::~AboutThisSiteServiceFactory() = default; // BrowserContextKeyedServiceFactory: -KeyedService* AboutThisSiteServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AboutThisSiteServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* browser_context) const { if (!page_info::IsAboutThisSiteFeatureEnabled( g_browser_process->GetApplicationLocale())) @@ -53,7 +54,7 @@ Profile* profile = Profile::FromBrowserContext(browser_context); - return new page_info::AboutThisSiteService( + return std::make_unique<page_info::AboutThisSiteService>( std::make_unique<ChromeAboutThisSiteServiceClient>( OptimizationGuideKeyedServiceFactory::GetForProfile(profile), profile->IsOffTheRecord(), profile->GetPrefs()),
diff --git a/chrome/browser/page_info/about_this_site_service_factory.h b/chrome/browser/page_info/about_this_site_service_factory.h index cd1af42..b266cc1 100644 --- a/chrome/browser/page_info/about_this_site_service_factory.h +++ b/chrome/browser/page_info/about_this_site_service_factory.h
@@ -32,7 +32,7 @@ ~AboutThisSiteServiceFactory() override; // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* profile) const override; bool ServiceIsCreatedWithBrowserContext() const override;
diff --git a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.cc b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.cc index 95307059..c87b8a4e 100644 --- a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.cc +++ b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.cc
@@ -32,9 +32,10 @@ HttpsEngagementServiceFactory::~HttpsEngagementServiceFactory() = default; -KeyedService* HttpsEngagementServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +HttpsEngagementServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { - return new HttpsEngagementService(); + return std::make_unique<HttpsEngagementService>(); } bool HttpsEngagementServiceFactory::ServiceIsCreatedWithBrowserContext() const {
diff --git a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.h b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.h index cafdc8f..3d577d73 100644 --- a/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.h +++ b/chrome/browser/page_load_metrics/observers/https_engagement_metrics/https_engagement_service_factory.h
@@ -37,7 +37,7 @@ ~HttpsEngagementServiceFactory() override; // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const override; bool ServiceIsCreatedWithBrowserContext() const override; };
diff --git a/chrome/browser/password_manager/android/local_passwords_migration_warning_util.cc b/chrome/browser/password_manager/android/local_passwords_migration_warning_util.cc index 92f00f39..ed59f8d 100644 --- a/chrome/browser/password_manager/android/local_passwords_migration_warning_util.cc +++ b/chrome/browser/password_manager/android/local_passwords_migration_warning_util.cc
@@ -10,7 +10,7 @@ #include "chrome/android/chrome_jni_headers/PasswordMigrationWarningBridge_jni.h" #include "chrome/browser/profiles/profile_android.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "components/password_manager/core/browser/password_bubble_experiment.h" +#include "components/password_manager/core/browser/password_sync_util.h" #include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" @@ -101,7 +101,7 @@ return false; } - if (password_bubble_experiment::HasChosenToSyncPasswords( + if (password_manager::sync_util::IsPasswordSyncEnabled( SyncServiceFactory::GetForProfile(profile))) { return false; }
diff --git a/chrome/browser/password_manager/android/password_infobar_utils.cc b/chrome/browser/password_manager/android/password_infobar_utils.cc index 82291f0..ecaab06 100644 --- a/chrome/browser/password_manager/android/password_infobar_utils.cc +++ b/chrome/browser/password_manager/android/password_infobar_utils.cc
@@ -7,7 +7,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/signin/identity_manager_factory.h" #include "chrome/browser/sync/sync_service_factory.h" -#include "components/password_manager/core/browser/password_bubble_experiment.h" +#include "components/password_manager/core/browser/password_sync_util.h" #include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/identity_manager.h" #include "content/public/browser/web_contents.h" @@ -17,7 +17,7 @@ AccountInfo GetAccountInfoForPasswordMessages(Profile* profile) { DCHECK(profile); - if (!password_bubble_experiment::HasChosenToSyncPasswords( + if (!sync_util::IsPasswordSyncEnabled( SyncServiceFactory::GetForProfile(profile))) { return AccountInfo(); }
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc index e5728a7..81e7192 100644 --- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc +++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl.cc
@@ -311,8 +311,8 @@ CHECK(bridge_helper_); for (PasswordManagerSetting setting : kAllPasswordSettings) { bridge_helper_->GetPasswordSettingValue( - SyncingAccount( - pref_service_->GetString(::prefs::kGoogleServicesLastUsername)), + SyncingAccount(pref_service_->GetString( + ::prefs::kGoogleServicesLastSyncingUsername)), setting); } }
diff --git a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc index df25966a..6ffcf4d 100644 --- a/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc +++ b/chrome/browser/password_manager/android/password_manager_settings_service_android_impl_unittest.cc
@@ -205,7 +205,7 @@ test_pref_service_.registry()->RegisterBooleanPref( password_manager::prefs::kAutoSignInEnabledGMS, true); test_pref_service_.registry()->RegisterStringPref( - ::prefs::kGoogleServicesLastUsername, kTestAccount); + ::prefs::kGoogleServicesLastSyncingUsername, kTestAccount); test_pref_service_.registry()->RegisterBooleanPref( password_manager::prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false);
diff --git a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc index 1730e30..7a27aec9 100644 --- a/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc +++ b/chrome/browser/password_manager/chrome_password_manager_client_unittest.cc
@@ -140,7 +140,7 @@ field.name = u"password-element"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = FieldRendererId(123); form_data.fields.push_back(field);
diff --git a/chrome/browser/password_manager/password_manager_browsertest.cc b/chrome/browser/password_manager/password_manager_browsertest.cc index 0693896..848ad5e 100644 --- a/chrome/browser/password_manager/password_manager_browsertest.cc +++ b/chrome/browser/password_manager/password_manager_browsertest.cc
@@ -1177,7 +1177,7 @@ form_data.url = signin_form.url; // Username autofill::FormFieldData username_field; - username_field.form_control_type = autofill::StringToFormControlType("text"); + username_field.form_control_type = autofill::FormControlType::kInputText; username_field.id_attribute = u"username_field"; username_field.name = username_field.id_attribute; username_field.value = u"example@example.com"; @@ -1186,8 +1186,7 @@ form_data.fields.push_back(username_field); // Password autofill::FormFieldData password_field; - password_field.form_control_type = - autofill::StringToFormControlType("password"); + password_field.form_control_type = autofill::FormControlType::kInputPassword; password_field.id_attribute = u"password_field"; password_field.name = password_field.id_attribute; password_field.value = u"htmlPass";
diff --git a/chrome/browser/performance_manager/metrics/page_timeline_monitor.cc b/chrome/browser/performance_manager/metrics/page_timeline_monitor.cc index df6d79f8d..eb49719 100644 --- a/chrome/browser/performance_manager/metrics/page_timeline_monitor.cc +++ b/chrome/browser/performance_manager/metrics/page_timeline_monitor.cc
@@ -14,8 +14,10 @@ #include "base/containers/contains.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/metrics/histogram_functions.h" #include "base/notreached.h" #include "base/rand_util.h" +#include "base/system/sys_info.h" #include "base/time/time.h" #include "base/timer/timer.h" #include "components/content_settings/core/common/content_settings_types.h" @@ -25,6 +27,7 @@ #include "services/metrics/public/cpp/metrics_utils.h" #include "services/metrics/public/cpp/ukm_builders.h" #include "services/metrics/public/cpp/ukm_recorder.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #if !BUILDFLAG(IS_ANDROID) #include "chrome/browser/performance_manager/policies/heuristic_memory_saver_policy.h" @@ -38,6 +41,8 @@ using PageMeasurementBackgroundState = PageTimelineMonitor::PageMeasurementBackgroundState; +using PageCPUUsageVector = std::vector<std::pair<const PageNode*, double>>; + // CPU usage metrics are provided as a double in the [0.0, number of cores * // 100.0] range. The CPU usage is usually below 1%, so the UKM is // reported out of 10,000 instead of out of 100 to make analyzing the data @@ -107,19 +112,10 @@ } void PageTimelineMonitor::CollectPageResourceUsage() { - const PageTimelineCPUMonitor::CPUUsageMap cpu_usage_map = - cpu_monitor_.UpdateCPUMeasurements(); - // Calculate the overall CPU usage. double total_cpu_usage = 0; - std::vector<std::pair<const PageNode*, double>> page_cpu_usage; - page_cpu_usage.reserve(page_node_info_map_.size()); - for (const auto& [tab_handle, info_ptr] : page_node_info_map_) { - const PageNode* page_node = tab_handle->page_node(); - CheckPageState(page_node, *info_ptr); - double cpu_usage = - PageTimelineCPUMonitor::EstimatePageCPUUsage(page_node, cpu_usage_map); - page_cpu_usage.emplace_back(page_node, cpu_usage); + const PageCPUUsageVector page_cpu_usage = CalculatePageCPUUsage(); + for (const auto& [page_node, cpu_usage] : page_cpu_usage) { total_cpu_usage += cpu_usage; } @@ -137,6 +133,39 @@ .Record(ukm::UkmRecorder::Get()); } time_of_last_resource_usage_ = now; + +#if !BUILDFLAG(IS_ANDROID) + if (base::FeatureList::IsEnabled( + performance_manager::features::kCPUInterventionEvaluationLogging)) { + bool is_cpu_over_threshold = + (100 * total_cpu_usage / base::SysInfo::NumberOfProcessors() > + performance_manager::features::kThresholdChromeCPUPercent.Get()); + if (!time_of_last_cpu_threshold_exceeded_.has_value()) { + CHECK(!log_cpu_on_delay_timer_.IsRunning()); + if (is_cpu_over_threshold) { + time_of_last_cpu_threshold_exceeded_ = now; + LogCPUInterventionMetrics(page_cpu_usage, now, "Immediate"); + + // Only logged delayed metrics when using the new CPU monitor. + if (performance_manager::features::kUseResourceAttributionCPUMonitor + .Get()) { + log_cpu_on_delay_timer_.Start( + FROM_HERE, + performance_manager::features::kDelayBeforeLogging.Get(), this, + &PageTimelineMonitor::CheckDelayedCPUInterventionMetrics); + } + } + } else if (!is_cpu_over_threshold) { + base::UmaHistogramCustomTimes( + "PerformanceManager.PerformanceInterventions.CPU." + "DurationOverThreshold", + now - time_of_last_cpu_threshold_exceeded_.value(), base::Minutes(2), + base::Hours(24), 50); + log_cpu_on_delay_timer_.AbandonAndStop(); + time_of_last_cpu_threshold_exceeded_ = absl::nullopt; + } + } +#endif } void PageTimelineMonitor::CollectSlice() { @@ -247,9 +276,67 @@ return base::RandInt(0, 19) == 1; } +void PageTimelineMonitor::CheckDelayedCPUInterventionMetrics() { + CHECK(performance_manager::features::kUseResourceAttributionCPUMonitor.Get()); + + double total_cpu_usage = 0; + auto page_cpu_usage = CalculatePageCPUUsage(); + for (const auto& [page_node, cpu_usage] : page_cpu_usage) { + total_cpu_usage += cpu_usage; + } + + if (100 * total_cpu_usage / base::SysInfo::NumberOfProcessors() > + performance_manager::features::kThresholdChromeCPUPercent.Get()) { + // Still over the threshold so we should log .Delayed UMA metrics. + LogCPUInterventionMetrics(page_cpu_usage, base::TimeTicks::Now(), + "Delayed"); + } +} + +void PageTimelineMonitor::LogCPUInterventionMetrics( + const PageCPUUsageVector page_cpu_usage, + const base::TimeTicks now, + const std::string& suffix) { + double total_background_cpu_usage = 0; + + for (const auto& [page_node, cpu_usage] : page_cpu_usage) { + if (GetBackgroundStateForMeasurementPeriod( + page_node, now - time_of_last_resource_usage_) != + PageMeasurementBackgroundState::kForeground) { + total_background_cpu_usage += cpu_usage; + } + } + + base::UmaHistogramPercentage( + "PerformanceManager.PerformanceInterventions.CPU." + "TotalBackgroundCPU." + + suffix, + total_background_cpu_usage * 100 / base::SysInfo::NumberOfProcessors()); +} + +PageCPUUsageVector PageTimelineMonitor::CalculatePageCPUUsage() { + const PageTimelineCPUMonitor::CPUUsageMap cpu_usage_map = + cpu_monitor_.UpdateCPUMeasurements(); + + // Calculate the overall CPU usage. + PageCPUUsageVector page_cpu_usage; + page_cpu_usage.reserve(page_node_info_map_.size()); + + for (const auto& [tab_handle, info_ptr] : page_node_info_map_) { + const PageNode* page_node = tab_handle->page_node(); + CheckPageState(page_node, *info_ptr); + double cpu_usage = + PageTimelineCPUMonitor::EstimatePageCPUUsage(page_node, cpu_usage_map); + page_cpu_usage.emplace_back(page_node, cpu_usage); + } + + return page_cpu_usage; +} + void PageTimelineMonitor::SetTriggerCollectionManuallyForTesting() { collect_slice_timer_.Stop(); collect_page_resource_usage_timer_.Stop(); + log_cpu_on_delay_timer_.Stop(); } void PageTimelineMonitor::SetShouldCollectSliceCallbackForTesting(
diff --git a/chrome/browser/performance_manager/metrics/page_timeline_monitor.h b/chrome/browser/performance_manager/metrics/page_timeline_monitor.h index cbcee21..74753b56 100644 --- a/chrome/browser/performance_manager/metrics/page_timeline_monitor.h +++ b/chrome/browser/performance_manager/metrics/page_timeline_monitor.h
@@ -18,6 +18,7 @@ #include "components/performance_manager/public/graph/graph.h" #include "components/performance_manager/public/graph/graph_registered.h" #include "components/performance_manager/public/graph/page_node.h" +#include "third_party/abseil-cpp/absl/types/optional.h" namespace performance_manager::metrics { @@ -124,6 +125,18 @@ bool ShouldCollectSlice() const; + // Check if the CPU metrics are still above the threshold after a delay. + void CheckDelayedCPUInterventionMetrics(); + + // Log CPU intervention metrics with the provided suffix. + void LogCPUInterventionMetrics( + const std::vector<std::pair<const PageNode*, double>> page_cpu_usage, + const base::TimeTicks now, + const std::string& suffix); + + // Calculate per-PageNode CPU usage and return the results as a vector. + std::vector<std::pair<const PageNode*, double>> CalculatePageCPUUsage(); + // If this is called, CollectSlice() and CollectPageResourceUsage() will not // be called on a timer. Tests can call them manually. void SetTriggerCollectionManuallyForTesting(); @@ -150,6 +163,13 @@ // Timer which is used to trigger CollectPageResourceUsage(). base::RepeatingTimer collect_page_resource_usage_timer_; + // Timer which handles logging high CPU after a potential delay. + base::OneShotTimer log_cpu_on_delay_timer_; + + // Keeps track of whether the browser has exceeded the CPU threshold. + absl::optional<base::TimeTicks> time_of_last_cpu_threshold_exceeded_ = + absl::nullopt; + // Pointer to this process' graph. raw_ptr<Graph> graph_ = nullptr;
diff --git a/chrome/browser/performance_manager/metrics/page_timeline_monitor_unittest.cc b/chrome/browser/performance_manager/metrics/page_timeline_monitor_unittest.cc index f3d90fb..c4f76a66 100644 --- a/chrome/browser/performance_manager/metrics/page_timeline_monitor_unittest.cc +++ b/chrome/browser/performance_manager/metrics/page_timeline_monitor_unittest.cc
@@ -11,6 +11,9 @@ #include "base/containers/fixed_flat_map.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" +#include "base/strings/string_number_conversions.h" +#include "base/system/sys_info.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/time/time.h" @@ -42,7 +45,8 @@ using PageMeasurementBackgroundState = PageTimelineMonitor::PageMeasurementBackgroundState; -// A class that returns constant 50% CPU used since it was created. +// A class that returns defaults to returning 50% CPU used since it was created, +// but the divisor for what proportion of a CPU is being used is configurable. class FixedCPUMeasurementDelegate final : public PageTimelineCPUMonitor::CPUMeasurementDelegate { public: @@ -50,17 +54,24 @@ ~FixedCPUMeasurementDelegate() final = default; base::TimeDelta GetCumulativeCPUUsage() final { - return (base::TimeTicks::Now() - creation_time_) / 2; + return (base::TimeTicks::Now() - creation_time_) / cpu_divisor_; } static std::unique_ptr<CPUMeasurementDelegate> Create(const ProcessNode*) { return std::make_unique<FixedCPUMeasurementDelegate>(); } + static void SetCPUDivisor(int divisor) { + FixedCPUMeasurementDelegate::cpu_divisor_ = divisor; + } + private: base::TimeTicks creation_time_ = base::TimeTicks::Now(); + static int cpu_divisor_; }; +int FixedCPUMeasurementDelegate::cpu_divisor_ = 2; + } // namespace class PageTimelineMonitorUnitTest : public GraphTestHarness { @@ -98,6 +109,8 @@ // To allow tests to call its methods and view its state. raw_ptr<PageTimelineMonitor> monitor_; + base::HistogramTester histogram_tester_; + protected: ukm::TestUkmRecorder* test_ukm_recorder() { return test_ukm_recorder_.get(); } PageTimelineMonitor* monitor() { return monitor_; } @@ -144,10 +157,15 @@ public ::testing::WithParamInterface<bool> { public: PageTimelineMonitorWithFeatureTest() { - scoped_feature_list_.InitAndEnableFeatureWithParameters( - features::kPageTimelineMonitor, - {{"use_resource_attribution_cpu_monitor", - GetParam() ? "true" : "false"}}); + scoped_feature_list_.InitWithFeaturesAndParameters( + {{features::kPageTimelineMonitor, + {{"use_resource_attribution_cpu_monitor", + GetParam() ? "true" : "false"}}}, + {performance_manager::features::kCPUInterventionEvaluationLogging, + {{"threshold_chrome_cpu_percent", + base::NumberToString( + int(100 / base::SysInfo::NumberOfProcessors() / 2))}}}}, + {}); } void SetUp() override { @@ -680,4 +698,47 @@ PageMeasurementBackgroundState::kMixedForegroundBackground}}); } +#if !BUILDFLAG(IS_ANDROID) +TEST_P(PageTimelineMonitorWithFeatureTest, TestCPUInterventionMetrics) { + MockMultiplePagesWithMultipleProcessesGraph mock_graph(graph()); + const ukm::SourceId mock_source_id = ukm::AssignNewSourceId(); + mock_graph.page->SetType(performance_manager::PageType::kTab); + mock_graph.page->SetUkmSourceId(mock_source_id); + mock_graph.page->SetIsVisible(true); + + const ukm::SourceId mock_source_id2 = ukm::AssignNewSourceId(); + mock_graph.other_page->SetType(performance_manager::PageType::kTab); + mock_graph.other_page->SetUkmSourceId(mock_source_id2); + + // Let an arbitrary amount of time pass so there's some CPU usage to measure. + task_env().FastForwardBy(base::Minutes(1)); + TriggerCollectPageResourceUsage(); + + histogram_tester_.ExpectUniqueSample( + "PerformanceManager.PerformanceInterventions.CPU.TotalBackgroundCPU." + "Immediate", + 0.75 * 100 / base::SysInfo::NumberOfProcessors(), 1); + + // Fast forward for Delayed UMA to be logged. + task_env().FastForwardBy(base::Minutes(1)); + + if (GetParam()) { + histogram_tester_.ExpectUniqueSample( + "PerformanceManager.PerformanceInterventions.CPU.TotalBackgroundCPU." + "Delayed", + 0.75 * 100 / base::SysInfo::NumberOfProcessors(), 1); + } + + // Lower CPU measurement so the duration is logged. + FixedCPUMeasurementDelegate::SetCPUDivisor(6); + task_env().FastForwardBy(base::Minutes(1)); + TriggerCollectPageResourceUsage(); + + histogram_tester_.ExpectUniqueSample( + "PerformanceManager.PerformanceInterventions.CPU." + "DurationOverThreshold", + base::Minutes(2).InMilliseconds(), 1); +} +#endif + } // namespace performance_manager::metrics
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.cc b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.cc index e027a20..92065cb 100644 --- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.cc +++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.cc
@@ -54,9 +54,10 @@ SiteDataCacheFacadeFactory::~SiteDataCacheFacadeFactory() = default; -KeyedService* SiteDataCacheFacadeFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +SiteDataCacheFacadeFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { - return new SiteDataCacheFacade(context); + return std::make_unique<SiteDataCacheFacade>(context); } bool SiteDataCacheFacadeFactory::ServiceIsCreatedWithBrowserContext() const {
diff --git a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.h b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.h index 4d2788b6..c3db169 100644 --- a/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.h +++ b/chrome/browser/performance_manager/persistence/site_data/site_data_cache_facade_factory.h
@@ -80,7 +80,7 @@ private: // BrowserContextKeyedServiceFactory: - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const override; bool ServiceIsCreatedWithBrowserContext() const override; bool ServiceIsNULLWhileTesting() const override;
diff --git a/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc b/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc index d81ee01..5b394e1 100644 --- a/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc +++ b/chrome/browser/permissions/chrome_permission_request_manager_unittest.cc
@@ -325,7 +325,7 @@ "true"}, {QuietNotificationPermissionUiConfig::kEnableAdaptiveActivationDryRun, "true"}}}}, - {features::kPermissionPredictions}); + {}); ASSERT_TRUE( QuietNotificationPermissionUiConfig::IsAdaptiveActivationDryRunEnabled()); @@ -410,7 +410,7 @@ {QuietNotificationPermissionUiConfig:: kAdaptiveActivationActionWindowSizeInDays, "7"}}}}, - {features::kPermissionPredictions}); + {}); ASSERT_EQ( base::Days(7), @@ -456,8 +456,7 @@ {{features::kQuietNotificationPrompts, {{QuietNotificationPermissionUiConfig::kEnableAdaptiveActivation, "true"}}}}, - {permissions::features::kBlockRepeatedNotificationPermissionPrompts, - features::kPermissionPredictions}); + {permissions::features::kBlockRepeatedNotificationPermissionPrompts}); EXPECT_FALSE(profile()->GetPrefs()->GetBoolean( prefs::kEnableQuietNotificationPermissionUi)); @@ -652,7 +651,7 @@ {{features::kQuietNotificationPrompts, {{QuietNotificationPermissionUiConfig::kEnableAdaptiveActivation, "true"}}}}, - {features::kPermissionPredictions}); + {}); } protected:
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc index 2f42237..704fdc67 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.cc
@@ -28,6 +28,7 @@ #include "components/permissions/request_type.h" #include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/unified_consent/pref_names.h" #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) #include "chrome/browser/permissions/prediction_model_handler_provider_factory.h" @@ -90,8 +91,9 @@ auto mock_likelihood = ParsePredictionServiceMockLikelihood( base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kPredictionServiceMockLikelihood)); - if (mock_likelihood.has_value()) + if (mock_likelihood.has_value()) { set_likelihood_override(mock_likelihood.value()); + } } } @@ -140,9 +142,24 @@ DCHECK(!request_); + if (prediction_source == PredictionSource::USE_SERVER_SIDE) { + permissions::PredictionService* service = + PredictionServiceFactory::GetForProfile(profile_); + + VLOG(1) << "[CPSS] Starting prediction service request"; + permissions::PermissionUmaUtil::RecordPermissionPredictionSource( + permissions::PermissionPredictionSource::SERVER_SIDE); + request_ = std::make_unique<PredictionServiceRequest>( + service, features, + base::BindOnce( + &PredictionBasedPermissionUiSelector::LookupResponseReceived, + base::Unretained(this), /*is_on_device=*/false, + request->request_type())); + return; + } + #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) - if (prediction_source == PredictionSource::USE_ANY || - prediction_source == PredictionSource::USE_ONDEVICE) { + if (prediction_source == PredictionSource::USE_ONDEVICE) { permissions::PredictionModelHandlerProvider* prediction_model_handler_provider = PredictionModelHandlerProviderFactory::GetForBrowserContext( @@ -167,31 +184,19 @@ /*lookup_succesful=*/true, /*response_from_cache=*/false), std::move(proto_request)); return; - } else if (prediction_source == PredictionSource::USE_ONDEVICE) { - VLOG(1) << "[CPSS] Model is not available and cannot fall back to server " - "side execution"; + } else { + VLOG(1) << "[CPSS] On device model unavailable"; std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); return; } } -#endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) - - if (prediction_source == PredictionSource::USE_ANY || - prediction_source == PredictionSource::USE_SERVER_SIDE) { - permissions::PredictionService* service = - PredictionServiceFactory::GetForProfile(profile_); - - VLOG(1) << "[CPSS] Starting prediction service request"; - permissions::PermissionUmaUtil::RecordPermissionPredictionSource( - permissions::PermissionPredictionSource::SERVER_SIDE); - request_ = std::make_unique<PredictionServiceRequest>( - service, features, - base::BindOnce( - &PredictionBasedPermissionUiSelector::LookupResponseReceived, - base::Unretained(this), /*is_on_device=*/false, - request->request_type())); +#else + if (prediction_source == PredictionSource::USE_ONDEVICE) { + VLOG(1) << "[CPSS] Client doesnt support tflite"; + std::move(callback_).Run(Decision::UseNormalUiAndShowNoWarning()); return; } +#endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) NOTREACHED(); } @@ -222,6 +227,10 @@ permissions::PredictionRequestFeatures features; features.gesture = request->GetGestureType(); features.type = request->request_type(); + if (base::FeatureList::IsEnabled( + permissions::features::kPermissionPredictionsV2)) { + features.url = request->requesting_origin().GetWithEmptyPath(); + } base::Time cutoff = base::Time::Now() - kPermissionActionCutoffAge; @@ -291,6 +300,8 @@ bool PredictionBasedPermissionUiSelector::ShouldHoldBack( bool is_on_device, permissions::RequestType request_type) { + DCHECK(request_type == permissions::RequestType::kNotifications || + request_type == permissions::RequestType::kGeolocation); // Different holdback threshold for the different experiments. const double on_device_geolocation_holdback_threshold = permissions::feature_params:: @@ -298,10 +309,8 @@ const double on_device_notification_holdback_threshold = permissions::feature_params:: kPermissionOnDeviceNotificationPredictionsHoldbackChance.Get(); - const double server_side_notification_holdback_threshold = - features::kPermissionPredictionsHoldbackChance.Get(); - const double server_side_geolocation_holdback_threshold = - features::kPermissionGeolocationPredictionsHoldbackChance.Get(); + const double server_side_holdback_threshold = + permissions::feature_params::kPermissionPredictionsV2HoldbackChance.Get(); // Holdback probability for this request. const double holdback_chance = base::RandDouble(); @@ -317,15 +326,7 @@ NOTREACHED(); } } else { - if (request_type == permissions::RequestType::kNotifications) { - should_holdback = - holdback_chance < server_side_notification_holdback_threshold; - } else if (request_type == permissions::RequestType::kGeolocation) { - should_holdback = - holdback_chance < server_side_geolocation_holdback_threshold; - } else { - NOTREACHED(); - } + should_holdback = holdback_chance < server_side_holdback_threshold; } permissions::PermissionUmaUtil::RecordPermissionPredictionServiceHoldback( request_type, is_on_device, should_holdback); @@ -334,61 +335,48 @@ PredictionSource PredictionBasedPermissionUiSelector::GetPredictionTypeToUse( permissions::RequestType request_type) { - if (base::FeatureList::IsEnabled( - permissions::features::kPermissionDedicatedCpssSetting)) { - if (request_type == permissions::RequestType::kNotifications && - !profile_->GetPrefs()->GetBoolean(prefs::kEnableNotificationCPSS)) { - return PredictionSource::USE_NONE; - } - if (request_type == permissions::RequestType::kGeolocation && - !profile_->GetPrefs()->GetBoolean(prefs::kEnableGeolocationCPSS)) { - return PredictionSource::USE_NONE; - } - } else { - if (!safe_browsing::IsSafeBrowsingEnabled(*(profile_->GetPrefs()))) { - return PredictionSource::USE_NONE; - } + const bool is_msbb_enabled = profile_->GetPrefs()->GetBoolean( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled); + + const bool is_notification_cpss_enabled = + profile_->GetPrefs()->GetBoolean(prefs::kEnableNotificationCPSS) && + (base::FeatureList::IsEnabled(features::kQuietNotificationPrompts) || + base::FeatureList::IsEnabled( + permissions::features::kPermissionQuietChip)); + + const bool is_geolocation_cpss_enabled = + profile_->GetPrefs()->GetBoolean(prefs::kEnableGeolocationCPSS) && + base::FeatureList::IsEnabled(permissions::features::kPermissionQuietChip); + + if (request_type == permissions::RequestType::kNotifications && + !is_notification_cpss_enabled) { + return PredictionSource::USE_NONE; } - bool is_server_side_prediction_enabled = false; - bool is_ondevice_prediction_enabled = false; + + if (request_type == permissions::RequestType::kGeolocation && + !is_geolocation_cpss_enabled) { + return PredictionSource::USE_NONE; + } bool is_tflite_available = false; #if BUILDFLAG(BUILD_WITH_TFLITE_LIB) is_tflite_available = true; #endif // BUILDFLAG(BUILD_WITH_TFLITE_LIB) - // Notification supports both flavours of the quiet prompt - if (request_type == permissions::RequestType::kNotifications && - (base::FeatureList::IsEnabled(features::kQuietNotificationPrompts) || - base::FeatureList::IsEnabled( - permissions::features::kPermissionQuietChip))) { - is_server_side_prediction_enabled = - base::FeatureList::IsEnabled(features::kPermissionPredictions); + bool is_on_device_enabled = false; - is_ondevice_prediction_enabled = - is_tflite_available && - base::FeatureList::IsEnabled( - permissions::features::kPermissionOnDeviceNotificationPredictions); + if (request_type == permissions::RequestType::kNotifications) { + is_on_device_enabled = base::FeatureList::IsEnabled( + permissions::features::kPermissionOnDeviceNotificationPredictions); + } else if (request_type == permissions::RequestType::kGeolocation) { + is_on_device_enabled = base::FeatureList::IsEnabled( + permissions::features::kPermissionOnDeviceGeolocationPredictions); } - // Geolocation supports only the quiet chip ui - if (request_type == permissions::RequestType::kGeolocation && - base::FeatureList::IsEnabled( - permissions::features::kPermissionQuietChip)) { - is_server_side_prediction_enabled = base::FeatureList::IsEnabled( - features::kPermissionGeolocationPredictions); - - is_ondevice_prediction_enabled = - is_tflite_available && - base::FeatureList::IsEnabled( - permissions::features::kPermissionOnDeviceGeolocationPredictions); - } - - if (is_server_side_prediction_enabled && is_ondevice_prediction_enabled) { - return PredictionSource::USE_ANY; - } else if (is_server_side_prediction_enabled) { + if (is_msbb_enabled && base::FeatureList::IsEnabled( + permissions::features::kPermissionPredictionsV2)) { return PredictionSource::USE_SERVER_SIDE; - } else if (is_ondevice_prediction_enabled) { + } else if (is_tflite_available && is_on_device_enabled) { return PredictionSource::USE_ONDEVICE; } else { return PredictionSource::USE_NONE;
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector.h b/chrome/browser/permissions/prediction_based_permission_ui_selector.h index 28bf4ee..545eb870 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector.h +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector.h
@@ -29,9 +29,8 @@ : public permissions::PermissionUiSelector { public: enum class PredictionSource { - USE_SERVER_SIDE, - USE_ONDEVICE, - USE_ANY, + USE_SERVER_SIDE, // url based cpss v2 + USE_ONDEVICE, // on device cpss v1 USE_NONE, }; using PredictionGrantLikelihood =
diff --git a/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc b/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc index 6efafe1..0dce9e5b 100644 --- a/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc +++ b/chrome/browser/permissions/prediction_based_permission_ui_selector_unittest.cc
@@ -14,12 +14,15 @@ #include "chrome/browser/permissions/permission_actions_history_factory.h" #include "chrome/common/chrome_features.h" #include "chrome/test/base/testing_profile.h" +#include "components/content_settings/core/common/pref_names.h" #include "components/permissions/features.h" #include "components/permissions/permission_uma_util.h" #include "components/permissions/permission_util.h" #include "components/permissions/request_type.h" #include "components/permissions/test/mock_permission_request.h" +#include "components/prefs/pref_service.h" #include "components/safe_browsing/core/common/safe_browsing_prefs.h" +#include "components/unified_consent/pref_names.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,9 +39,15 @@ void SetUp() override { InitFeatureList(); - safe_browsing::SetSafeBrowsingState( - testing_profile_->GetPrefs(), - safe_browsing::SafeBrowsingState::STANDARD_PROTECTION); + // enable msbb + testing_profile_->GetPrefs()->SetBoolean( + unified_consent::prefs::kUrlKeyedAnonymizedDataCollectionEnabled, true); + + // enable cpss for both notification and geolocation + testing_profile_->GetPrefs()->SetBoolean(prefs::kEnableNotificationCPSS, + true); + testing_profile_->GetPrefs()->SetBoolean(prefs::kEnableGeolocationCPSS, + true); } void InitFeatureList(const std::string holdback_chance_string = "0") { @@ -47,11 +56,9 @@ feature_list_ = std::make_unique<base::test::ScopedFeatureList>(); feature_list_->InitWithFeaturesAndParameters( {{features::kQuietNotificationPrompts, {}}, - {features::kPermissionPredictions, - {{features::kPermissionPredictionsHoldbackChance.name, - holdback_chance_string}}}, - {features::kPermissionGeolocationPredictions, - {{features::kPermissionGeolocationPredictionsHoldbackChance.name, + {permissions::features::kPermissionPredictionsV2, + {{permissions::feature_params::kPermissionPredictionsV2HoldbackChance + .name, holdback_chance_string}}}, {permissions::features::kPermissionQuietChip, {}}}, {} /* disabled_features */); @@ -246,8 +253,7 @@ feature_list_->Reset(); feature_list_->InitWithFeatures( { - features::kPermissionPredictions, - features::kPermissionGeolocationPredictions, + permissions::features::kPermissionPredictionsV2, permissions::features::kPermissionOnDeviceNotificationPredictions, permissions::features::kPermissionOnDeviceGeolocationPredictions, }, @@ -266,8 +272,7 @@ feature_list_->Reset(); feature_list_->InitWithFeatures( { - features::kPermissionPredictions, - features::kPermissionGeolocationPredictions, + permissions::features::kPermissionPredictionsV2, permissions::features::kPermissionOnDeviceNotificationPredictions, permissions::features::kPermissionOnDeviceGeolocationPredictions, features::kQuietNotificationPrompts, @@ -275,7 +280,7 @@ { permissions::features::kPermissionQuietChip, }); - EXPECT_EQ(PredictionSource::USE_ANY, + EXPECT_EQ(PredictionSource::USE_SERVER_SIDE, prediction_selector.GetPredictionTypeToUse( permissions::RequestType::kNotifications)); EXPECT_EQ(PredictionSource::USE_NONE, @@ -286,19 +291,17 @@ feature_list_->Reset(); feature_list_->InitWithFeatures( { - features::kPermissionPredictions, - features::kPermissionGeolocationPredictions, + permissions::features::kPermissionPredictionsV2, permissions::features::kPermissionOnDeviceNotificationPredictions, permissions::features::kPermissionOnDeviceGeolocationPredictions, features::kQuietNotificationPrompts, permissions::features::kPermissionQuietChip, }, {}); - EXPECT_EQ(PredictionSource::USE_ANY, + EXPECT_EQ(PredictionSource::USE_SERVER_SIDE, prediction_selector.GetPredictionTypeToUse( permissions::RequestType::kNotifications)); - // On device only works for notification permission request. - EXPECT_EQ(PredictionSource::USE_ANY, + EXPECT_EQ(PredictionSource::USE_SERVER_SIDE, prediction_selector.GetPredictionTypeToUse( permissions::RequestType::kGeolocation)); @@ -312,8 +315,7 @@ permissions::features::kPermissionQuietChip, }, { - features::kPermissionPredictions, - features::kPermissionGeolocationPredictions, + permissions::features::kPermissionPredictionsV2, }); EXPECT_EQ(PredictionSource::USE_ONDEVICE, prediction_selector.GetPredictionTypeToUse( @@ -326,15 +328,35 @@ feature_list_->Reset(); feature_list_->InitWithFeatures( { + permissions::features::kPermissionPredictionsV2, features::kQuietNotificationPrompts, - features::kPermissionGeolocationPredictions, - features::kPermissionPredictions, + permissions::features::kPermissionQuietChip, + permissions::features::kPermissionOnDeviceNotificationPredictions, + permissions::features::kPermissionOnDeviceGeolocationPredictions, + }, + {}); + EXPECT_EQ(PredictionSource::USE_SERVER_SIDE, + prediction_selector.GetPredictionTypeToUse( + permissions::RequestType::kNotifications)); + EXPECT_EQ(PredictionSource::USE_SERVER_SIDE, + prediction_selector.GetPredictionTypeToUse( + permissions::RequestType::kGeolocation)); + + // Features enabled but CPSS settings disabled + feature_list_->Reset(); + feature_list_->InitWithFeatures( + { + permissions::features::kPermissionPredictionsV2, + features::kQuietNotificationPrompts, permissions::features::kPermissionQuietChip, }, { permissions::features::kPermissionOnDeviceNotificationPredictions, permissions::features::kPermissionOnDeviceGeolocationPredictions, }); + // enable cpss for both notification and geolocation + profile()->GetPrefs()->SetBoolean(prefs::kEnableNotificationCPSS, true); + profile()->GetPrefs()->SetBoolean(prefs::kEnableGeolocationCPSS, true); EXPECT_EQ(PredictionSource::USE_SERVER_SIDE, prediction_selector.GetPredictionTypeToUse( permissions::RequestType::kNotifications)); @@ -351,10 +373,9 @@ feature_list_->Reset(); feature_list_->InitWithFeaturesAndParameters( { - {features::kPermissionPredictions, - {{features::kPermissionPredictionsHoldbackChance.name, "0"}}}, - {features::kPermissionGeolocationPredictions, - {{features::kPermissionGeolocationPredictionsHoldbackChance.name, + {permissions::features::kPermissionPredictionsV2, + {{permissions::feature_params::kPermissionPredictionsV2HoldbackChance + .name, "0"}}}, {permissions::features::kPermissionOnDeviceNotificationPredictions, {{permissions::feature_params:: @@ -405,10 +426,9 @@ feature_list_->Reset(); feature_list_->InitWithFeaturesAndParameters( { - {features::kPermissionPredictions, - {{features::kPermissionPredictionsHoldbackChance.name, "1"}}}, - {features::kPermissionGeolocationPredictions, - {{features::kPermissionGeolocationPredictionsHoldbackChance.name, + {permissions::features::kPermissionPredictionsV2, + {{permissions::feature_params::kPermissionPredictionsV2HoldbackChance + .name, "1"}}}, {permissions::features::kPermissionOnDeviceNotificationPredictions, {{permissions::feature_params::
diff --git a/chrome/browser/permissions/prediction_service_browsertest.cc b/chrome/browser/permissions/prediction_service_browsertest.cc index 8c40631..6d1da8c 100644 --- a/chrome/browser/permissions/prediction_service_browsertest.cc +++ b/chrome/browser/permissions/prediction_service_browsertest.cc
@@ -18,6 +18,7 @@ #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/content_settings/core/common/pref_names.h" #include "components/metrics/content/subprocess_metrics_provider.h" #include "components/optimization_guide/core/model_util.h" #include "components/optimization_guide/core/optimization_guide_features.h" @@ -32,6 +33,7 @@ #include "components/permissions/request_type.h" #include "components/permissions/test/mock_permission_prompt_factory.h" #include "components/permissions/test/mock_permission_request.h" +#include "components/prefs/pref_service.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" #include "net/dns/mock_host_resolver.h" @@ -65,6 +67,10 @@ mock_permission_prompt_factory_ = std::make_unique<MockPermissionPromptFactory>(manager); host_resolver()->AddRule("*", "127.0.0.1"); + browser()->profile()->GetPrefs()->SetBoolean(prefs::kEnableNotificationCPSS, + true); + browser()->profile()->GetPrefs()->SetBoolean(prefs::kEnableGeolocationCPSS, + true); } void TearDownOnMainThread() override {
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service.cc b/chrome/browser/policy/cloud/user_policy_signin_service.cc index 5a93e72..d8f03f1 100644 --- a/chrome/browser/policy/cloud/user_policy_signin_service.cc +++ b/chrome/browser/policy/cloud/user_policy_signin_service.cc
@@ -13,6 +13,8 @@ #include "base/functional/callback_helpers.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/chrome_notification_types.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h" #include "chrome/browser/enterprise/util/managed_browser_utils.h" #include "chrome/browser/policy/cloud/user_policy_signin_service_internal.h" #include "chrome/browser/policy/cloud/user_policy_signin_service_util.h" @@ -153,6 +155,13 @@ manager->SetSigninAccountId(account_id); UserPolicySigninServiceBase::InitializeCloudPolicyManager(account_id, std::move(client)); + // Triggers the initialization of user remote commands service. + auto* remote_command_service = + enterprise_commands::UserRemoteCommandsServiceFactory::GetForProfile( + profile_); + if (remote_command_service) { + remote_command_service->Init(); + } ProhibitSignoutIfNeeded(); } @@ -163,6 +172,12 @@ } void UserPolicySigninService::ShutdownCloudPolicyManager() { + auto* remote_command_service = + enterprise_commands::UserRemoteCommandsServiceFactory::GetForProfile( + profile_); + if (remote_command_service) { + remote_command_service->Shutdown(); + } UserPolicySigninServiceBase::ShutdownCloudPolicyManager(); }
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_mobile.cc b/chrome/browser/policy/cloud/user_policy_signin_service_mobile.cc index 55c99b8..1532e527 100644 --- a/chrome/browser/policy/cloud/user_policy_signin_service_mobile.cc +++ b/chrome/browser/policy/cloud/user_policy_signin_service_mobile.cc
@@ -15,6 +15,8 @@ #include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h" #include "chrome/browser/enterprise/util/managed_browser_utils.h" #include "chrome/browser/policy/cloud/user_policy_signin_service_util.h" #include "chrome/browser/profiles/profile.h" @@ -64,6 +66,12 @@ void UserPolicySigninService::ShutdownCloudPolicyManager() { CancelPendingRegistration(); + auto* remote_command_service = + enterprise_commands::UserRemoteCommandsServiceFactory::GetForProfile( + profile_); + if (remote_command_service) { + remote_command_service->Shutdown(); + } UserPolicySigninServiceBase::ShutdownCloudPolicyManager(); } @@ -132,6 +140,20 @@ chrome::enterprise_util::ProfileCanBeManaged(profile_)); } +void UserPolicySigninService::InitializeCloudPolicyManager( + const AccountId& account_id, + std::unique_ptr<CloudPolicyClient> client) { + UserPolicySigninServiceBase::InitializeCloudPolicyManager(account_id, + std::move(client)); + // Triggers the initialization of user remote commands service. + auto* remote_command_service = + enterprise_commands::UserRemoteCommandsServiceFactory::GetForProfile( + profile_); + if (remote_command_service) { + remote_command_service->Init(); + } +} + base::TimeDelta UserPolicySigninService::GetTryRegistrationDelay() { net::NetworkChangeNotifier::ConnectionType connection_type = net::NetworkChangeNotifier::GetConnectionType();
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_mobile.h b/chrome/browser/policy/cloud/user_policy_signin_service_mobile.h index 9a97bd08a..b1eb0f7 100644 --- a/chrome/browser/policy/cloud/user_policy_signin_service_mobile.h +++ b/chrome/browser/policy/cloud/user_policy_signin_service_mobile.h
@@ -68,6 +68,9 @@ void UpdateLastPolicyCheckTime() override; signin::ConsentLevel GetConsentLevelForRegistration() override; bool CanApplyPolicies(bool check_for_refresh_token) override; + void InitializeCloudPolicyManager( + const AccountId& account_id, + std::unique_ptr<CloudPolicyClient> client) override; // Initializes the UserPolicySigninService once its owning Profile becomes // ready. If the Profile has a signed-in account associated with it at startup
diff --git a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc index bb9b674..6928024 100644 --- a/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc +++ b/chrome/browser/policy/cloud/user_policy_signin_service_unittest.cc
@@ -537,24 +537,31 @@ data->set_device_id("fake client id"); mock_store_->set_policy_data_for_testing(std::move(data)); - // Complete initialization of the store. - mock_store_->NotifyStoreLoaded(); - // Since there is a signed-in user expect a policy fetch to be started to // refresh the policy for the user. - DeviceManagementService::JobConfiguration::JobType job_type = + DeviceManagementService::JobConfiguration::JobType job_type_1 = + DeviceManagementService::JobConfiguration::TYPE_INVALID; + DeviceManagementService::JobConfiguration::JobType job_type_2 = DeviceManagementService::JobConfiguration::TYPE_INVALID; DeviceManagementService::JobForTesting job; EXPECT_CALL(job_creation_handler_, OnJobCreation) - .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type), + .Times(2) + .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type_1), + SaveArg<0>(&job))) + .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type_2), SaveArg<0>(&job))); + // Complete initialization of the store. + mock_store_->NotifyStoreLoaded(); + // Client registration should not be in progress since the client should be // already registered. ASSERT_TRUE(manager_->IsClientRegistered()); ASSERT_FALSE(IsRequestActive()); + EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_REMOTE_COMMANDS, + job_type_1); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, - job_type); + job_type_2); } // Tests that the explicit policy registration can coexist with registration @@ -684,22 +691,31 @@ data->set_request_token("fake token"); data->set_device_id("fake client id"); mock_store_->set_policy_data_for_testing(std::move(data)); - mock_store_->NotifyStoreLoaded(); - // The client should be registered. - ASSERT_TRUE(manager_->IsClientRegistered()); + // Since there is a signed-in user expect a policy fetch to be started to // refresh the policy for the user. - DeviceManagementService::JobConfiguration::JobType job_type = + DeviceManagementService::JobConfiguration::JobType job_type_1 = + DeviceManagementService::JobConfiguration::TYPE_INVALID; + DeviceManagementService::JobConfiguration::JobType job_type_2 = DeviceManagementService::JobConfiguration::TYPE_INVALID; DeviceManagementService::JobForTesting job; EXPECT_CALL(job_creation_handler_, OnJobCreation) - .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type), + .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type_1), + SaveArg<0>(&job))) + .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type_2), SaveArg<0>(&job))); // A task to trigger policy fetch should have been posted to the task queue. + + mock_store_->NotifyStoreLoaded(); + // The client should be registered. + ASSERT_TRUE(manager_->IsClientRegistered()); + base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(&job_creation_handler_); + EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_REMOTE_COMMANDS, + job_type_1); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, - job_type); + job_type_2); EXPECT_CALL(*mock_store_, Store(_)); // Complete the policy fetch request. @@ -879,11 +895,15 @@ // `FetchPolicyForSignedInUser()` will create a new registered client and // fetch policies with it. - DeviceManagementService::JobConfiguration::JobType job_type = + DeviceManagementService::JobConfiguration::JobType job_type_1 = + DeviceManagementService::JobConfiguration::TYPE_INVALID; + DeviceManagementService::JobConfiguration::JobType job_type_2 = DeviceManagementService::JobConfiguration::TYPE_INVALID; DeviceManagementService::JobForTesting job; EXPECT_CALL(job_creation_handler_, OnJobCreation) - .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type), + .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type_1), + SaveArg<0>(&job))) + .WillOnce(DoAll(device_management_service_.CaptureJobType(&job_type_2), SaveArg<0>(&job))); UserPolicySigninService* signin_service = UserPolicySigninServiceFactory::GetForProfile(profile_.get()); @@ -899,8 +919,10 @@ // Let it execute. base::RunLoop().RunUntilIdle(); Mock::VerifyAndClearExpectations(&job_creation_handler_); + EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_REMOTE_COMMANDS, + job_type_1); EXPECT_EQ(DeviceManagementService::JobConfiguration::TYPE_POLICY_FETCH, - job_type); + job_type_2); // Complete the policy fetch request. EXPECT_CALL(*mock_store_, Store(_));
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 7c9ea752..398dea3 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -1538,6 +1538,9 @@ { key::kDeviceSwitchFunctionKeysBehaviorEnabled, ash::prefs::kDeviceSwitchFunctionKeysBehaviorEnabled, base::Value::Type::BOOLEAN }, + { key::kDeviceExtendedFkeysModifier, + ash::prefs::kExtendedFkeysModifier, + base::Value::Type::INTEGER }, #endif // BUILDFLAG(IS_CHROMEOS_ASH) #if BUILDFLAG(IS_LINUX)
diff --git a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc index 40fee24..1d4bdee8 100644 --- a/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc +++ b/chrome/browser/policy/messaging_layer/upload/record_handler_impl.cc
@@ -243,14 +243,19 @@ config_file.set_version(config_file_version.value()); // Handle the signature. - const std::string* config_file_signature = + const std::string* config_file_signature_str = file.FindString("configFileSignature"); - if (config_file_signature->empty()) { + if (!config_file_signature_str || config_file_signature_str->empty()) { return Status( error::INVALID_ARGUMENT, "Field configFileSignature is missing from configurationFile"); } - config_file.set_config_file_signature(*config_file_signature); + std::string config_file_signature; + if (!base::Base64Decode(*config_file_signature_str, &config_file_signature)) { + return Status(error::INVALID_ARGUMENT, + "Unable to decode configFileSignature"); + } + config_file.set_config_file_signature(config_file_signature); auto* const event_config_result = file.FindList("blockedEventConfigs"); if (!event_config_result) {
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java index ce80322..47c361d 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/ChromePreferenceKeys.java
@@ -302,11 +302,6 @@ "Chrome.Flags.CrashStreakBeforeCache"; /** - * Cached value of the native SafeModeForCachedFlags feature flag. - */ - public static final String FLAGS_SAFE_MODE_ENABLED = "Chrome.Flags.SafeModeEnabled"; - - /** * How many runs of Safe Mode for Cached Flags are left before trying a normal run. */ public static final String FLAGS_SAFE_MODE_RUNS_LEFT = "Chrome.Flags.SafeModeRunsLeft"; @@ -1022,7 +1017,6 @@ FLAGS_CRASH_STREAK_BEFORE_CACHE, FLAGS_FIELD_TRIAL_PARAM_CACHED.pattern(), FLAGS_LAST_CACHED_MINIMAL_BROWSER_FLAGS_TIME_MILLIS, - FLAGS_SAFE_MODE_ENABLED, FLAGS_SAFE_MODE_RUNS_LEFT, HOMEPAGE_CUSTOM_GURL, HOMEPAGE_LOCATION_POLICY_GURL,
diff --git a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java index aac12ed..9f6bc67 100644 --- a/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java +++ b/chrome/browser/preferences/android/java/src/org/chromium/chrome/browser/preferences/DeprecatedChromePreferenceKeys.java
@@ -35,6 +35,7 @@ "Chrome.Flags.SafeBool.*", "Chrome.Flags.SafeDouble.*", "Chrome.Flags.SafeInt.*", + "Chrome.Flags.SafeModeEnabled", "Chrome.Flags.SafeString.*", "Chrome.Flags.SafeValuesVersion", "Chrome.OfflineMeasurements.HttpProbeResultsList",
diff --git a/chrome/browser/prefs/browser_prefs.cc b/chrome/browser/prefs/browser_prefs.cc index 769d4b2..fc8d276 100644 --- a/chrome/browser/prefs/browser_prefs.cc +++ b/chrome/browser/prefs/browser_prefs.cc
@@ -2282,15 +2282,17 @@ profile_prefs->ClearPref(kOriginTrialPrefKey); // Once this migration is complete, the tracked preference - // `kGoogleServicesLastAccountIdDeprecated` can be removed. + // `kGoogleServicesLastSyncingAccountIdDeprecated` can be removed. if (profile_prefs->HasPrefPath( - prefs::kGoogleServicesLastAccountIdDeprecated)) { - std::string account_id = - profile_prefs->GetString(prefs::kGoogleServicesLastAccountIdDeprecated); - profile_prefs->ClearPref(prefs::kGoogleServicesLastAccountIdDeprecated); + prefs::kGoogleServicesLastSyncingAccountIdDeprecated)) { + std::string account_id = profile_prefs->GetString( + prefs::kGoogleServicesLastSyncingAccountIdDeprecated); + profile_prefs->ClearPref( + prefs::kGoogleServicesLastSyncingAccountIdDeprecated); bool is_email = account_id.find('@') != std::string::npos; if (!is_email && !account_id.empty()) { - profile_prefs->SetString(prefs::kGoogleServicesLastGaiaId, account_id); + profile_prefs->SetString(prefs::kGoogleServicesLastSyncingGaiaId, + account_id); } }
diff --git a/chrome/browser/prefs/chrome_pref_service_factory.cc b/chrome/browser/prefs/chrome_pref_service_factory.cc index 71d0b4b0..57c96ce 100644 --- a/chrome/browser/prefs/chrome_pref_service_factory.cc +++ b/chrome/browser/prefs/chrome_pref_service_factory.cc
@@ -126,8 +126,9 @@ {5, extensions::pref_names::kExtensions, EnforcementLevel::NO_ENFORCEMENT, PrefTrackingStrategy::SPLIT, ValueType::IMPERSONAL}, #endif - {6, prefs::kGoogleServicesLastUsername, EnforcementLevel::ENFORCE_ON_LOAD, - PrefTrackingStrategy::ATOMIC, ValueType::PERSONAL}, + {6, prefs::kGoogleServicesLastSyncingUsername, + EnforcementLevel::ENFORCE_ON_LOAD, PrefTrackingStrategy::ATOMIC, + ValueType::PERSONAL}, {7, prefs::kSearchProviderOverrides, EnforcementLevel::ENFORCE_ON_LOAD, PrefTrackingStrategy::ATOMIC, ValueType::IMPERSONAL}, #if !BUILDFLAG(IS_ANDROID) @@ -155,10 +156,10 @@ PrefTrackingStrategy::ATOMIC, ValueType::IMPERSONAL}, {23, prefs::kGoogleServicesAccountId, EnforcementLevel::ENFORCE_ON_LOAD, PrefTrackingStrategy::ATOMIC, ValueType::PERSONAL}, - // This is being migrated to `kGoogleServicesLastGaiaId` since 2022/10, and - // should move to `CleanupDeprecatedTrackedPreferences()` in + // This is being migrated to `kGoogleServicesLastSyncingGaiaId` since + // 2022/10, and should move to `CleanupDeprecatedTrackedPreferences()` in // pref_hash_filter.cc when that migration completes. - {24, prefs::kGoogleServicesLastAccountIdDeprecated, + {24, prefs::kGoogleServicesLastSyncingAccountIdDeprecated, EnforcementLevel::ENFORCE_ON_LOAD, PrefTrackingStrategy::ATOMIC, ValueType::PERSONAL}, {29, prefs::kMediaStorageIdSalt, EnforcementLevel::ENFORCE_ON_LOAD,
diff --git a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h index d72c623c..d864c02 100644 --- a/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h +++ b/chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service.h
@@ -220,8 +220,6 @@ base::OnceClosure streaming_url_loader_destruction_callback); private: - friend class PrerenderOmniboxSearchSuggestionBrowserTest; - // Returns whether the prefetch started or not. bool MaybePrefetchURL(const GURL& url, bool navigation_prefetch,
diff --git a/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc b/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc index ff8df38..9cb27ed 100644 --- a/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc +++ b/chrome/browser/preloading/prerender/omnibox_prerender_browsertest.cc
@@ -15,8 +15,6 @@ #include "chrome/browser/predictors/autocomplete_action_predictor_factory.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_service.h" -#include "chrome/browser/preloading/prefetch/search_prefetch/search_prefetch_service_factory.h" #include "chrome/browser/preloading/preloading_prefs.h" #include "chrome/browser/preloading/prerender/prerender_manager.h" #include "chrome/browser/profiles/profile.h" @@ -57,8 +55,6 @@ using UkmEntry = ukm::TestUkmRecorder::HumanReadableUkmEntry; using ukm::builders::Preloading_Attempt; -} // namespace - class OmniboxPrerenderBrowserTest : public PlatformBrowserTest { public: OmniboxPrerenderBrowserTest() @@ -229,7 +225,7 @@ feature_list_.InitWithFeaturesAndParameters( {{features::kSupportSearchSuggestionForPrerender2, { - {"implementation_type", "use_prefetch"}, + {"implementation_type", "ignore_prefetch"}, }}}, {}); } @@ -265,24 +261,23 @@ return canonical_search_url; } - void PrerenderQuery(const std::string& search_terms) { - auto* search_prefetch_service = - SearchPrefetchServiceFactory::GetForProfile(GetProfile()); + int PrerenderQuery(const std::string& search_terms, + const GURL& expected_prerender_url) { AutocompleteMatch match = CreateSearchSuggestionMatch(search_terms); - auto* template_url_service = - TemplateURLServiceFactory::GetForProfile(GetProfile()); - search_prefetch_service->CoordinatePrefetchWithPrerender( - match, GetActiveWebContents(), template_url_service, - GetCanonicalSearchURL(match.destination_url)); + prerender_manager_->StartPrerenderSearchSuggestion( + match, GetCanonicalSearchURL(match.destination_url)); + int host_id = prerender_helper().GetHostForUrl(expected_prerender_url); + EXPECT_NE(host_id, content::RenderFrameHost::kNoFrameTreeNodeId); + return host_id; } GURL GetSearchSuggestionUrl(const std::string& search_terms, - bool with_parameter) { + bool is_prerender) { std::string url_template = prerender_page_target_ + "?q=$1$2&type=test"; return search_engine_server_.GetURL( kSearchDomain, base::ReplaceStringPlaceholders( - url_template, {search_terms, with_parameter ? "&pf=cs" : ""}, + url_template, {search_terms, is_prerender ? "&pf=cs" : ""}, nullptr)); } @@ -305,14 +300,32 @@ observer.Wait(); } - void PrerenderAndActivate(const std::string& search_terms) { - PrerenderQuery(search_terms); - GURL prerendered_url = - GetSearchSuggestionUrl(search_terms, /*with_parameter=*/false); + void PrerenderAndActivate(const std::string& search_terms, + bool update_history_before_activation) { + GURL expected_prerender_url = + GetSearchSuggestionUrl(search_terms, /*is_prerender=*/true); + int host_id = PrerenderQuery(search_terms, expected_prerender_url); prerender_helper().WaitForPrerenderLoadCompletion(*GetActiveWebContents(), - prerendered_url); - NavigateToPrerenderedResult(prerendered_url); - EXPECT_EQ(GetActiveWebContents()->GetLastCommittedURL(), prerendered_url); + expected_prerender_url); + + std::string script = R"( + const url = new URL(document.URL); + url.searchParams.delete('pf'); + history.replaceState(null, "", url.toString()); + )"; + GURL expected_activated_url = + GetSearchSuggestionUrl(search_terms, /*is_prerender=*/false); + content::RenderFrameHost* prerender_frame_host = + prerender_helper().GetPrerenderedMainFrameHost(host_id); + if (update_history_before_activation) { + ASSERT_EQ(true, content::ExecJs(prerender_frame_host, script)); + } + NavigateToPrerenderedResult(expected_prerender_url); + if (!update_history_before_activation) { + ASSERT_EQ(true, content::ExecJs(prerender_frame_host, script)); + } + EXPECT_EQ(GetActiveWebContents()->GetLastCommittedURL(), + expected_activated_url); } PrerenderManager* prerender_manager() { return prerender_manager_; } @@ -325,7 +338,7 @@ base::UTF8ToUTF16(search_terms)); match.search_terms_args->original_query = base::UTF8ToUTF16(search_terms); match.destination_url = - GetSearchSuggestionUrl(search_terms, /*with_parameter=*/true); + GetSearchSuggestionUrl(search_terms, /*is_prerender=*/false); match.keyword = base::UTF8ToUTF16(search_terms); match.RecordAdditionalInfo("should_prerender", "true"); return match; @@ -361,24 +374,32 @@ }; class PrerenderOmniboxSearchSuggestionReloadBrowserTest - : public PrerenderOmniboxSearchSuggestionBrowserTest { + : public testing::WithParamInterface<bool>, + public PrerenderOmniboxSearchSuggestionBrowserTest { public: PrerenderOmniboxSearchSuggestionReloadBrowserTest() { feature_list_.InitWithFeaturesAndParameters( {{features::kSupportSearchSuggestionForPrerender2, { - {"implementation_type", "use_prefetch"}, + {"implementation_type", "ignore_prefetch"}, }}}, // Disable BFCache, to test the HTTP Cache path. {features::kBackForwardCache}); } + protected: + bool UpdateHistoryBeforeActivation() const { return GetParam(); } + private: base::test::ScopedFeatureList feature_list_; }; +INSTANTIATE_TEST_SUITE_P(All, + PrerenderOmniboxSearchSuggestionReloadBrowserTest, + testing::Bool()); + // Test back or forward navigations can use the HTTP Cache. -IN_PROC_BROWSER_TEST_F(PrerenderOmniboxSearchSuggestionReloadBrowserTest, +IN_PROC_BROWSER_TEST_P(PrerenderOmniboxSearchSuggestionReloadBrowserTest, BackNavigationHitsHttpCache) { base::HistogramTester histogram_tester; const GURL kInitialUrl = embedded_test_server()->GetURL("/empty.html"); @@ -388,23 +409,23 @@ // 1. Prerender the first page. std::string search_terms_1 = "prerender2222"; - GURL expected_prefetched_url_1 = - GetSearchSuggestionUrl(search_terms_1, /*with_parameter=*/true); + GURL expected_prerender_url_1 = + GetSearchSuggestionUrl(search_terms_1, /*is_prerender=*/true); GURL expected_activated_url_1 = - GetSearchSuggestionUrl(search_terms_1, /*with_parameter=*/false); - PrerenderAndActivate(search_terms_1); + GetSearchSuggestionUrl(search_terms_1, /*is_prerender=*/false); + PrerenderAndActivate(search_terms_1, UpdateHistoryBeforeActivation()); EXPECT_EQ(0, prerender_helper().GetRequestCount(expected_activated_url_1)); - EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetched_url_1)); + EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prerender_url_1)); // 2. Prerender and activate another page. std::string search_terms_2 = "prefetch233"; - GURL expected_prefetched_url_2 = - GetSearchSuggestionUrl(search_terms_2, /*with_parameter=*/true); + GURL expected_prerender_url_2 = + GetSearchSuggestionUrl(search_terms_2, /*is_prerender=*/true); GURL expected_activated_url_2 = - GetSearchSuggestionUrl(search_terms_2, /*with_parameter=*/false); - PrerenderAndActivate(search_terms_2); + GetSearchSuggestionUrl(search_terms_2, /*is_prerender=*/false); + PrerenderAndActivate(search_terms_2, UpdateHistoryBeforeActivation()); EXPECT_EQ(0, prerender_helper().GetRequestCount(expected_activated_url_2)); - EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetched_url_2)); + EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prerender_url_2)); // 3. Navigate back. Chrome is supposed to read the response from the cache, // instead of sending another request. @@ -414,7 +435,7 @@ EXPECT_EQ(expected_activated_url_1, GetActiveWebContents()->GetLastCommittedURL()); EXPECT_EQ(0, prerender_helper().GetRequestCount(expected_activated_url_1)); - EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prefetched_url_1)); + EXPECT_EQ(1, prerender_helper().GetRequestCount(expected_prerender_url_1)); } class PrerenderOmniboxSearchSuggestionExpiryBrowserTest @@ -424,30 +445,25 @@ feature_list_.InitWithFeaturesAndParameters( {{features::kSupportSearchSuggestionForPrerender2, { - {"implementation_type", "use_prefetch"}, + {"implementation_type", "ignore_prefetch"}, }}, - {kSearchPrefetchServicePrefetching, {}}}, + {kSearchPrefetchServicePrefetching, + { + {"prefetch_caching_limit_ms", "10"}, + }}}, {}); } protected: - void PrerenderQueryAndWaitForExpiring(const std::string& search_terms) { - content::test::PrerenderHostRegistryObserver registry_observer( - *GetActiveWebContents()); - PrerenderQuery(search_terms); - GURL prerendered_url = - GetSearchSuggestionUrl(search_terms, /*with_parameter=*/false); - registry_observer.WaitForTrigger(prerendered_url); + void PrerenderQueryAndWaitForExpiring(const std::string& search_terms, + const GURL& expected_prerender_url) { + int host_id = PrerenderQuery(search_terms, expected_prerender_url); - int host_id = prerender_helper().GetHostForUrl(prerendered_url); - ASSERT_NE(host_id, content::RenderFrameHost::kNoFrameTreeNodeId); content::test::PrerenderHostObserver prerender_observer( *GetActiveWebContents(), host_id); - // The prerender will be destroyed automatically for expiry. - auto* search_prefetch_service = - SearchPrefetchServiceFactory::GetForProfile(GetProfile()); - search_prefetch_service->FireAllExpiryTimerForTesting(); + // The prerender will be destroyed automatically soon, since the duration is + // set to 10ms. prerender_observer.WaitForDestroyed(); } @@ -466,35 +482,36 @@ InitializePrerenderManager(); std::string search_query = "prerender2"; - PrerenderQueryAndWaitForExpiring("prerender222"); + GURL expected_prerender_url = + GetSearchSuggestionUrl("prerender222", /*is_prerender=*/true); + PrerenderQueryAndWaitForExpiring("prerender222", expected_prerender_url); histogram_tester.ExpectUniqueSample( "Prerender.Experimental.PrerenderHostFinalStatus.Embedder_" "DefaultSearchEngine", /*PrerenderFinalStatus::kTriggerDestroyed*/ 16, 1); - // The prediction should be treated as cancelled. - histogram_tester.ExpectUniqueSample( - internal::kHistogramPrerenderPredictionStatusDefaultSearchEngine, - PrerenderPredictionStatus::kCancelled, 1); - // Select the prerender hint. The prerendered result has been deleted, so // browser loads the search result over again. content::TestNavigationObserver observer(GetActiveWebContents()); GetActiveWebContents()->OpenURL(content::OpenURLParams( - GetSearchSuggestionUrl("prerender222", /*with_parameter=*/false), - content::Referrer(), WindowOpenDisposition::CURRENT_TAB, + expected_prerender_url, content::Referrer(), + WindowOpenDisposition::CURRENT_TAB, ui::PageTransitionFromInt(ui::PAGE_TRANSITION_GENERATED | ui::PAGE_TRANSITION_FROM_ADDRESS_BAR), /*is_renderer_initiated=*/false)); observer.Wait(); - // This metric is recorded only when prerendering is alive on primary page - // changed. - histogram_tester.ExpectTotalCount( + // The prediction is correct, so kHitFinished should be recorded. + histogram_tester.ExpectUniqueSample( + internal::kHistogramPrerenderPredictionStatusDefaultSearchEngine, + PrerenderPredictionStatus::kHitFinished, 1); + // Since the prerendered page ran out of time, the timing metric should + // record `prefetch_caching_limit_ms`. + histogram_tester.ExpectUniqueTimeSample( "Prerender.Experimental.Search." "FirstCorrectPrerenderHintReceivedToRealSearchNavigationStartedDuration", - 0); + base::Milliseconds(10), 1); } // Tests that kCanceled is correctly recorded in the case that PrerenderManager @@ -509,21 +526,39 @@ ASSERT_TRUE(content::NavigateToURL(GetActiveWebContents(), kInitialUrl)); InitializePrerenderManager(); + GURL expected_prerender_url = + GetSearchSuggestionUrl("prerender222", /*is_prerender=*/true); // Prerender the first query, and wait for it to be deleted. - PrerenderQueryAndWaitForExpiring("prerender222"); + PrerenderQueryAndWaitForExpiring("prerender222", expected_prerender_url); histogram_tester.ExpectUniqueSample( "Prerender.Experimental.PrerenderHostFinalStatus.Embedder_" "DefaultSearchEngine", /*PrerenderFinalStatus::kTriggerDestroyed*/ 16, 1); - // The prediction should be treated as cancelled. + // Nothing should be recorded. Because there is no new navigation nor new + // search suggestion. + histogram_tester.ExpectTotalCount( + internal::kHistogramPrerenderPredictionStatusDefaultSearchEngine, 0); + + // Suggest to prerender another term. + GURL prerender_url_2 = + GetSearchSuggestionUrl("prerender233", /*is_prerender=*/true); + PrerenderQuery("prerender233", prerender_url_2); + + // PrerenderPredictionStatus::kCancelled should be recorded for the prediction + // of "prerender222". histogram_tester.ExpectUniqueSample( internal::kHistogramPrerenderPredictionStatusDefaultSearchEngine, PrerenderPredictionStatus::kCancelled, 1); - // Prerender another term and activate it. - PrerenderAndActivate("prerender233"); + content::TestNavigationObserver observer(GetActiveWebContents()); + GetActiveWebContents()->OpenURL(content::OpenURLParams( + prerender_url_2, content::Referrer(), WindowOpenDisposition::CURRENT_TAB, + ui::PageTransitionFromInt(ui::PAGE_TRANSITION_GENERATED | + ui::PAGE_TRANSITION_FROM_ADDRESS_BAR), + /*is_renderer_initiated=*/false)); + observer.Wait(); // The prediction is correct, so kHitFinished should be recorded. histogram_tester.ExpectBucketCount( @@ -534,3 +569,5 @@ histogram_tester.ExpectTotalCount( internal::kHistogramPrerenderPredictionStatusDefaultSearchEngine, 2); } + +} // namespace
diff --git a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h index acd00ed3..390104cf 100644 --- a/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h +++ b/chrome/browser/privacy_sandbox/mock_privacy_sandbox_service.h
@@ -25,6 +25,10 @@ MockPrivacySandboxService(); ~MockPrivacySandboxService() override; + MOCK_METHOD(PrivacySandboxService::PromptType, + GetRequiredPromptType, + (), + (override)); MOCK_METHOD(void, PromptActionOccurred, (PrivacySandboxService::PromptAction), @@ -37,30 +41,33 @@ MOCK_METHOD(void, PromptClosedForBrowser, (Browser*), (override)); MOCK_METHOD(bool, IsPromptOpenForBrowser, (Browser*), (override)); #endif // !BUILDFLAG(IS_ANDROID) + MOCK_METHOD(void, ForceChromeBuildForTests, (bool), (override)); + MOCK_METHOD(void, SetPrivacySandboxEnabled, (bool), (override)); + MOCK_METHOD(bool, IsPrivacySandboxEnabled, (), (override)); + MOCK_METHOD(bool, IsPrivacySandboxManaged, (), (override)); // Mock this method to enable opening the settings page in tests. MOCK_METHOD(bool, IsPrivacySandboxRestricted, (), (override)); + MOCK_METHOD(void, OnPrivacySandboxV2PrefChanged, (), (override)); MOCK_METHOD(bool, IsRestrictedNoticeEnabled, (), (override)); + MOCK_METHOD(void, SetFirstPartySetsDataAccessEnabled, (bool), (override)); + MOCK_METHOD(bool, IsFirstPartySetsDataAccessEnabled, (), (const, override)); + MOCK_METHOD(bool, IsFirstPartySetsDataAccessManaged, (), (const, override)); MOCK_METHOD((base::flat_map<net::SchemefulSite, net::SchemefulSite>), GetSampleFirstPartySets, (), - (override, const)); + (const, override)); MOCK_METHOD(absl::optional<net::SchemefulSite>, GetFirstPartySetOwner, (const GURL& site_url), - (override, const)); + (const, override)); MOCK_METHOD(absl::optional<std::u16string>, GetFirstPartySetOwnerForDisplay, (const GURL& site_url), - (override, const)); - MOCK_METHOD(PrivacySandboxService::PromptType, - GetRequiredPromptType, - (), - (override)); + (const, override)); MOCK_METHOD(bool, IsPartOfManagedFirstPartySet, (const net::SchemefulSite& site), - (override, const)); - MOCK_METHOD(bool, IsFirstPartySetsDataAccessManaged, (), (override, const)); + (const, override)); MOCK_METHOD(void, GetFledgeJoiningEtldPlusOneForDisplay, (base::OnceCallback<void(std::vector<std::string>)>), @@ -68,24 +75,32 @@ MOCK_METHOD(std::vector<std::string>, GetBlockedFledgeJoiningTopFramesForDisplay, (), - (const override)); + (const, override)); MOCK_METHOD(void, SetFledgeJoiningAllowed, ((const std::string&), bool), - (const override)); + (const, override)); MOCK_METHOD(std::vector<privacy_sandbox::CanonicalTopic>, GetCurrentTopTopics, (), - (const override)); + (const, override)); MOCK_METHOD(std::vector<privacy_sandbox::CanonicalTopic>, GetBlockedTopics, (), - (const override)); + (const, override)); MOCK_METHOD(void, SetTopicAllowed, (privacy_sandbox::CanonicalTopic, bool), (override)); - MOCK_METHOD(void, TopicsToggleChanged, (bool), (const override)); + MOCK_METHOD(void, TopicsToggleChanged, (bool), (const, override)); + MOCK_METHOD(bool, TopicsConsentRequired, (), (const, override)); + MOCK_METHOD(bool, TopicsHasActiveConsent, (), (const, override)); + MOCK_METHOD(privacy_sandbox::TopicsConsentUpdateSource, + TopicsConsentLastUpdateSource, + (), + (const, override)); + MOCK_METHOD(base::Time, TopicsConsentLastUpdateTime, (), (const, override)); + MOCK_METHOD(std::string, TopicsConsentLastUpdateText, (), (const, override)); }; std::unique_ptr<KeyedService> BuildMockPrivacySandboxService(
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/OWNERS b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/OWNERS new file mode 100644 index 0000000..1d67fe6d --- /dev/null +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/OWNERS
@@ -0,0 +1,2 @@ +shivanisha@chromium.org +xiaochenzh@chromium.org \ No newline at end of file
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_attestations_component_installer_browsertest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_component_installer_browsertest.cc similarity index 93% rename from chrome/browser/privacy_sandbox/privacy_sandbox_attestations_component_installer_browsertest.cc rename to chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_component_installer_browsertest.cc index b6a18878..9ad0e9f7 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_attestations_component_installer_browsertest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_component_installer_browsertest.cc
@@ -2,7 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <memory> #include <string> #include "base/files/file_path.h" @@ -15,27 +14,20 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/privacy_sandbox_attestations_component_installer.h" #include "chrome/browser/component_updater/privacy_sandbox_attestations_component_installer_test_util.h" -#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "components/component_updater/component_updater_paths.h" #include "components/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations.h" #include "components/privacy_sandbox/privacy_sandbox_attestations/proto/privacy_sandbox_attestations.pb.h" -#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "content/public/test/browser_test.h" namespace privacy_sandbox { -class PrivacySandboxAttestationsBrowserTest : public InProcessBrowserTest { +class PrivacySandboxAttestationsBrowserTest + : public MixinBasedInProcessBrowserTest { public: PrivacySandboxAttestationsBrowserTest() = default; - void SetUpOnMainThread() override { - // `PrivacySandboxAttestations` has a member of type - // `scoped_refptr<base::SequencedTaskRunner>`, its initialization must be - // done after a browser process is created. - scoped_attestations_ = std::make_unique<ScopedPrivacySandboxAttestations>( - PrivacySandboxAttestations::CreateForTesting()); - } - void TearDown() override { // Delete the privacy sandbox attestations installation directory. base::FilePath component_updater_dir; @@ -51,8 +43,9 @@ component_updater::PrivacySandboxAttestationsComponentInstallerPolicy; private: - std::unique_ptr<ScopedPrivacySandboxAttestations> scoped_attestations_; base::test::ScopedFeatureList attestations_feature_; + PrivacySandboxAttestationsMixin privacy_sandbox_attestations_mixin_{ + &mixin_host_}; }; IN_PROC_BROWSER_TEST_F(
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.cc new file mode 100644 index 0000000..954f30c --- /dev/null +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.cc
@@ -0,0 +1,27 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" + +#include <memory> + +#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" + +namespace privacy_sandbox { + +PrivacySandboxAttestationsMixin::PrivacySandboxAttestationsMixin( + InProcessBrowserTestMixinHost* host) + : InProcessBrowserTestMixin(host) {} + +PrivacySandboxAttestationsMixin::~PrivacySandboxAttestationsMixin() = default; + +void PrivacySandboxAttestationsMixin::SetUpOnMainThread() { + // `PrivacySandboxAttestations` has a member of type + // `scoped_refptr<base::SequencedTaskRunner>`, so it must be initialized after + // a browser process is created. + scoped_attestations_ = std::make_unique<ScopedPrivacySandboxAttestations>( + PrivacySandboxAttestations::CreateForTesting()); +} + +} // namespace privacy_sandbox
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h new file mode 100644 index 0000000..369d826 --- /dev/null +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h
@@ -0,0 +1,33 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_ATTESTATIONS_PRIVACY_SANDBOX_ATTESTATIONS_MIXIN_H_ +#define CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_ATTESTATIONS_PRIVACY_SANDBOX_ATTESTATIONS_MIXIN_H_ + +#include "chrome/test/base/mixin_based_in_process_browser_test.h" + +#include <memory> + +#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" + +namespace privacy_sandbox { + +// Browser tests that use privacy sandbox attestations feature should inherit +// publicly from `MixinBasedInProcessBrowserTest` and initialize a +// `PrivacySandboxAttestationsMixin` member to create a scoped attestations +// instance. +class PrivacySandboxAttestationsMixin : public InProcessBrowserTestMixin { + public: + explicit PrivacySandboxAttestationsMixin(InProcessBrowserTestMixinHost* host); + ~PrivacySandboxAttestationsMixin() override; + + void SetUpOnMainThread() override; + + private: + std::unique_ptr<ScopedPrivacySandboxAttestations> scoped_attestations_; +}; + +} // namespace privacy_sandbox + +#endif // CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_ATTESTATIONS_PRIVACY_SANDBOX_ATTESTATIONS_MIXIN_H_
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h index b7f613e7..22af958 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.h +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service.h
@@ -21,22 +21,6 @@ #include "net/base/schemeful_site.h" class Browser; -class PrefService; -#if !BUILDFLAG(IS_ANDROID) -class TrustSafetySentimentService; -#endif - -namespace content { -class BrowsingDataRemover; -} - -namespace content_settings { -class CookieSettings; -} - -namespace browsing_topics { -class BrowsingTopicsService; -} namespace views { class Widget; @@ -138,57 +122,10 @@ kMaxValue = kNoticeShownToGuardian, }; - PrivacySandboxService( - privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, - scoped_refptr<content_settings::CookieSettings> cookie_settings, - PrefService* pref_service, - content::InterestGroupManager* interest_group_manager, - profile_metrics::BrowserProfileType profile_type, - content::BrowsingDataRemover* browsing_data_remover, - HostContentSettingsMap* host_content_settings_map, -#if !BUILDFLAG(IS_ANDROID) - TrustSafetySentimentService* sentiment_service, -#endif - browsing_topics::BrowsingTopicsService* browsing_topics_service, - first_party_sets::FirstPartySetsPolicyService* first_party_sets_service); - - ~PrivacySandboxService() override; - - // Returns the prompt type that should be shown to the user. This consults - // previous consent / notice information stored in preferences, the current - // state of the Privacy Sandbox settings, and the current location of the - // user, to determine the appropriate type. This is expected to be called by - // UI code locations determining whether a prompt should be shown on startup. - // Virtual to allow mocking in tests. - virtual PromptType GetRequiredPromptType(); - - // Informs the service that |action| occurred with the prompt. This allows - // the service to record this information in preferences such that future - // calls to GetRequiredPromptType() are correct. This is expected to be - // called appropriately by all locations showing the prompt. Metrics shared - // between platforms will also be recorded. - // This method is virtual for mocking in tests. - virtual void PromptActionOccurred(PromptAction action); - // Returns whether |url| is suitable to display the Privacy Sandbox prompt // over. Only about:blank and certain chrome:// URLs are considered suitable. static bool IsUrlSuitableForPrompt(const GURL& url); - // Functions for coordinating the display of the Privacy Sandbox prompts - // across multiple browser windows. Only relevant for Desktop. - -#if !BUILDFLAG(IS_ANDROID) - // Informs the service that a Privacy Sandbox prompt has been opened - // or closed for |browser|. - // Virtual to allow mocking in tests. - virtual void PromptOpenedForBrowser(Browser* browser, views::Widget* widget); - virtual void PromptClosedForBrowser(Browser* browser); - - // Returns whether a Privacy Sandbox prompt is currently open for |browser|. - // Virtual to allow mocking in tests. - virtual bool IsPromptOpenForBrowser(Browser* browser); -#endif // !BUILDFLAG(IS_ANDROID) - // Disables the display of the Privacy Sandbox prompt for testing. When // |disabled| is true, GetRequiredPromptType() will only ever return that no // prompt is required. @@ -197,14 +134,42 @@ // ensure it is reset at the end of your test. static void SetPromptDisabledForTests(bool disabled); + // Returns the prompt type that should be shown to the user. This consults + // previous consent / notice information stored in preferences, the current + // state of the Privacy Sandbox settings, and the current location of the + // user, to determine the appropriate type. This is expected to be called by + // UI code locations determining whether a prompt should be shown on startup. + virtual PromptType GetRequiredPromptType() = 0; + + // Informs the service that |action| occurred with the prompt. This allows + // the service to record this information in preferences such that future + // calls to GetRequiredPromptType() are correct. This is expected to be + // called appropriately by all locations showing the prompt. Metrics shared + // between platforms will also be recorded. + virtual void PromptActionOccurred(PromptAction action) = 0; + + // Functions for coordinating the display of the Privacy Sandbox prompts + // across multiple browser windows. Only relevant for Desktop. + +#if !BUILDFLAG(IS_ANDROID) + // Informs the service that a Privacy Sandbox prompt has been opened + // or closed for |browser|. + virtual void PromptOpenedForBrowser(Browser* browser, + views::Widget* widget) = 0; + virtual void PromptClosedForBrowser(Browser* browser) = 0; + + // Returns whether a Privacy Sandbox prompt is currently open for |browser|. + virtual bool IsPromptOpenForBrowser(Browser* browser) = 0; +#endif // !BUILDFLAG(IS_ANDROID) + // If set to true, this treats the testing environment as that of a branded // Chrome build. - void ForceChromeBuildForTests(bool force_chrome_build); + virtual void ForceChromeBuildForTests(bool force_chrome_build) = 0; // Disables the Privacy Sandbox completely if |enabled| is false. If |enabled| // is true, context specific as well as restriction checks will still be // performed to determine if specific APIs are available in specific contexts. - void SetPrivacySandboxEnabled(bool enabled); + virtual void SetPrivacySandboxEnabled(bool enabled) = 0; // Used by the UI to check if the API is enabled. This is a UI function ONLY. // Checks the primary pref directly, and _only_ the primary pref. There are @@ -212,75 +177,37 @@ // this function. All decisions for allowing access to APIs should be routed // through the PrivacySandboxSettings class. // TODO(crbug.com/1310157): Rename this function to better reflect this. - bool IsPrivacySandboxEnabled(); + virtual bool IsPrivacySandboxEnabled() = 0; // Returns whether the state of the API is managed. - bool IsPrivacySandboxManaged(); + virtual bool IsPrivacySandboxManaged() = 0; // Returns whether the Privacy Sandbox is currently restricted for the // profile. UI code should consult this to ensure that when restricted, // Privacy Sandbox related UI is updated appropriately. - virtual bool IsPrivacySandboxRestricted(); + virtual bool IsPrivacySandboxRestricted() = 0; + + // Called when the V2 Privacy Sandbox preference is changed. + virtual void OnPrivacySandboxV2PrefChanged() = 0; // Returns whether the Privacy Sandbox is configured to show a restricted // notice. - virtual bool IsRestrictedNoticeEnabled(); - - // Called when the V2 Privacy Sandbox preference is changed. - void OnPrivacySandboxV2PrefChanged(); - - // Returns whether the RelatedWebsiteSets preference is enabled. - bool IsFirstPartySetsDataAccessEnabled() const; - - // Returns whether the RelatedWebsiteSets preference is managed. - virtual bool IsFirstPartySetsDataAccessManaged() const; + virtual bool IsRestrictedNoticeEnabled() = 0; // Toggles the RelatedWebsiteSets preference. - void SetFirstPartySetsDataAccessEnabled(bool enabled); + virtual void SetFirstPartySetsDataAccessEnabled(bool enabled) = 0; - // Returns the set of eTLD + 1's on which the user was joined to a FLEDGE - // interest group. Consults with the InterestGroupManager associated with - // |profile_| and formats the returned data for direct display to the user. - // Virtual to allow mocking in tests. - virtual void GetFledgeJoiningEtldPlusOneForDisplay( - base::OnceCallback<void(std::vector<std::string>)> callback); + // Returns whether the RelatedWebsiteSets preference is enabled. + virtual bool IsFirstPartySetsDataAccessEnabled() const = 0; - // Returns the set of top frames which are blocked from joining the profile to - // an interest group. Virtual to allow mocking in tests. - virtual std::vector<std::string> GetBlockedFledgeJoiningTopFramesForDisplay() - const; - - // Sets Fledge interest group joining to |allowed| for |top_frame_etld_plus1|. - // Forwards the setting to the PrivacySandboxSettings service, but also - // removes any Fledge data for the |top_frame_etld_plus1| if |allowed| is - // false. - // Virtual to allow mocking in tests. - virtual void SetFledgeJoiningAllowed(const std::string& top_frame_etld_plus1, - bool allowed) const; - - // Returns the top topics for the previous N epochs. - // Virtual for mocking in tests. - virtual std::vector<privacy_sandbox::CanonicalTopic> GetCurrentTopTopics() - const; - - // Returns the set of topics which have been blocked by the user. - // Virtual for mocking in tests. - virtual std::vector<privacy_sandbox::CanonicalTopic> GetBlockedTopics() const; - - // Sets a |topic_id|, as both a top topic and topic provided to the web, to be - // allowed/blocked based on the value of |allowed|. This is stored to - // preferences and made available to the Topics API via the - // PrivacySandboxSettings class. This function expects that |topic| will have - // previously been provided by one of the above functions. Virtual for mocking - // in tests. - virtual void SetTopicAllowed(privacy_sandbox::CanonicalTopic topic, - bool allowed); + // Returns whether the RelatedWebsiteSets preference is managed. + virtual bool IsFirstPartySetsDataAccessManaged() const = 0; // DEPRECATED - Do not use in new code. It will be replaced with queries to // the First-Party Sets that are in the browser-process. // Virtual for mocking in tests. virtual base::flat_map<net::SchemefulSite, net::SchemefulSite> - GetSampleFirstPartySets() const; + GetSampleFirstPartySets() const = 0; // Returns the owner domain of the first party set that `site_url` is a member // of, or absl::nullopt if `site_url` is not recognised as a member of an FPS. @@ -288,11 +215,11 @@ // should not, absl::nullopt is always returned. // Virtual for mocking in tests. virtual absl::optional<net::SchemefulSite> GetFirstPartySetOwner( - const GURL& site_url) const; + const GURL& site_url) const = 0; // Same as GetFirstPartySetOwner but returns a formatted string. virtual absl::optional<std::u16string> GetFirstPartySetOwnerForDisplay( - const GURL& site_url) const; + const GURL& site_url) const = 0; // Returns true if `site`'s membership in an FPS is being managed by policy or // if FirstPartySets preference is managed. Virtual for mocking in tests. @@ -302,337 +229,65 @@ // if `site` is being added into a First-Party Set since there's no UI use for // whether `site` is being removed by an enterprise yet. virtual bool IsPartOfManagedFirstPartySet( - const net::SchemefulSite& site) const; + const net::SchemefulSite& site) const = 0; + + // Returns the set of eTLD + 1's on which the user was joined to a FLEDGE + // interest group. Consults with the InterestGroupManager associated with + // |profile_| and formats the returned data for direct display to the user. + virtual void GetFledgeJoiningEtldPlusOneForDisplay( + base::OnceCallback<void(std::vector<std::string>)> callback) = 0; + + // Returns the set of top frames which are blocked from joining the profile to + // an interest group. + virtual std::vector<std::string> GetBlockedFledgeJoiningTopFramesForDisplay() + const = 0; + + // Sets Fledge interest group joining to |allowed| for |top_frame_etld_plus1|. + // Forwards the setting to the PrivacySandboxSettings service, but also + // removes any Fledge data for the |top_frame_etld_plus1| if |allowed| is + // false. + virtual void SetFledgeJoiningAllowed(const std::string& top_frame_etld_plus1, + bool allowed) const = 0; + + // Returns the top topics for the previous N epochs. + // Virtual for mocking in tests. + virtual std::vector<privacy_sandbox::CanonicalTopic> GetCurrentTopTopics() + const = 0; + + // Returns the set of topics which have been blocked by the user. + // Virtual for mocking in tests. + virtual std::vector<privacy_sandbox::CanonicalTopic> GetBlockedTopics() + const = 0; + + // Sets a |topic_id|, as both a top topic and topic provided to the web, to be + // allowed/blocked based on the value of |allowed|. This is stored to + // preferences and made available to the Topics API via the + // PrivacySandboxSettings class. This function expects that |topic| will have + // previously been provided by one of the above functions. Virtual for mocking + // in tests. + virtual void SetTopicAllowed(privacy_sandbox::CanonicalTopic topic, + bool allowed) = 0; // Inform the service that the user changed the Topics toggle in settings, // so that the current topics consent information can be updated. // TODO (crbug.com/1378703): Determine whether changes to the preference, // such as by policy or extensions, should also call here. // Virtual for mocking in tests. - virtual void TopicsToggleChanged(bool new_value) const; + virtual void TopicsToggleChanged(bool new_value) const = 0; // Whether the current profile requires consent for Topics to operate. - bool TopicsConsentRequired() const; + virtual bool TopicsConsentRequired() const = 0; // Whether there is an active consent for Topics currently recorded. - bool TopicsHasActiveConsent() const; + virtual bool TopicsHasActiveConsent() const = 0; // Functions which returns the details of the currently recorded Topics // consent. // TODO (crbug.com/1378703): Display the output of these functions in WebUI. - privacy_sandbox::TopicsConsentUpdateSource TopicsConsentLastUpdateSource() - const; - base::Time TopicsConsentLastUpdateTime() const; - std::string TopicsConsentLastUpdateText() const; - - protected: - friend class PrivacySandboxServiceTest; - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - MetricsLoggingOccursCorrectly); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTestNonRegularProfile, - NoMetricsRecorded); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, RestrictedPrompt); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, ManagedNoPrompt); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, - ManuallyControlledNoPrompt); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, NoParamNoPrompt); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceDeathTest, - GetRequiredPromptType); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxPromptNoticeWaiting); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxPromptConsentWaiting); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxV1OffEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxV1OffDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxConsentEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxConsentDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxNoticeEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxNoticeDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandbox3PCOffEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandbox3PCOffDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxManagedEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxManagedDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxManuallyControlledEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxManuallyControlledDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxNoPromptDisabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - PrivacySandboxNoPromptEnabled); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, PrivacySandboxRestricted); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - FirstPartySetsNotRelevantMetricAllowedCookies); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - FirstPartySetsNotRelevantMetricBlockedCookies); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - FirstPartySetsEnabledMetric); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, - FirstPartySetsDisabledMetric); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1Test, - RecordPrivacySandbox4StartupMetrics_PromptSuppressed_Explicitly); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1Test, - RecordPrivacySandbox4StartupMetrics_PromptSuppressed_Implicitly); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1Test, - RecordPrivacySandbox4StartupMetrics_PromptNotSuppressed_EEA); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1Test, - RecordPrivacySandbox4StartupMetrics_PromptNotSuppressed_ROW); - FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceM1Test, - RecordPrivacySandbox4StartupMetrics_APIs); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1RestrictedNoticePromptTest, - RecordPrivacySandbox4StartupMetrics_PromptNotSuppressed); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1RestrictedNoticeUserCurrentlyUnrestricted, - RecordPrivacySandbox4StartupMetrics_GraduationFlow); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1RestrictedNoticeUserCurrentlyRestricted, - RecordPrivacySandbox4StartupMetrics_GraduationFlow); - FRIEND_TEST_ALL_PREFIXES( - PrivacySandboxServiceM1RestrictedNoticeUserCurrentlyUnrestricted, - RecordPrivacySandbox4StartupMetrics_GraduationFlowWhenNoticeShownToGuardian); - - // Should be used only for tests when mocking the service. - PrivacySandboxService(); - - // Contains all possible privacy sandbox states, recorded on startup. - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - // Must be kept in sync with the SettingsPrivacySandboxEnabled enum in - // histograms/enums.xml. - enum class SettingsPrivacySandboxEnabled { - kPSEnabledAllowAll = 0, - kPSEnabledBlock3P = 1, - kPSEnabledBlockAll = 2, - kPSDisabledAllowAll = 3, - kPSDisabledBlock3P = 4, - kPSDisabledBlockAll = 5, - kPSDisabledPolicyBlock3P = 6, - kPSDisabledPolicyBlockAll = 7, - // DEPRECATED - kPSEnabledFlocDisabledAllowAll = 8, - // DEPRECATED - kPSEnabledFlocDisabledBlock3P = 9, - // DEPRECATED - kPSEnabledFlocDisabledBlockAll = 10, - // Add values above this line with a corresponding label in - // tools/metrics/histograms/enums.xml - kMaxValue = kPSEnabledFlocDisabledBlockAll, - }; - - // Contains all possible states of first party sets preference. - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - // Must be kept in sync with the FirstPartySetsState enum in - // histograms/enums.xml. - enum class FirstPartySetsState { - // The user allows all cookies, or blocks all cookies. - kFpsNotRelevant = 0, - // The user blocks third-party cookies, and has FPS enabled. - kFpsEnabled = 1, - // The user blocks third-party cookies, and has FPS disabled. - kFpsDisabled = 2, - kMaxValue = kFpsDisabled, - }; - - // Contains the possible states of a users Privacy Sandbox overall settings. - // Must be kept in sync with SettingsPrivacySandboxStartupStates in - // histograms/enums.xml - enum class PSStartupStates { - kPromptWaiting = 0, - kPromptOffV1OffEnabled = 1, - kPromptOffV1OffDisabled = 2, - kConsentShownEnabled = 3, - kConsentShownDisabled = 4, - kNoticeShownEnabled = 5, - kNoticeShownDisabled = 6, - kPromptOff3PCOffEnabled = 7, - kPromptOff3PCOffDisabled = 8, - kPromptOffManagedEnabled = 9, - kPromptOffManagedDisabled = 10, - kPromptOffRestricted = 11, - kPromptOffManuallyControlledEnabled = 12, - kPromptOffManuallyControlledDisabled = 13, - kNoPromptRequiredEnabled = 14, - kNoPromptRequiredDisabled = 15, - - // Add values above this line with a corresponding label in - // tools/metrics/histograms/enums.xml - kMaxValue = kNoPromptRequiredDisabled, - }; - - // Contains the possible states of the prompt start up states for m1. - // Must be kept in sync with SettingsPrivacySandboxPromptStartupState in - // histograms/enums.xml - enum class PromptStartupState { - kEEAConsentPromptWaiting = 0, - kEEANoticePromptWaiting = 1, - kROWNoticePromptWaiting = 2, - kEEAFlowCompletedWithTopicsAccepted = 3, - kEEAFlowCompletedWithTopicsDeclined = 4, - kROWNoticeFlowCompleted = 5, - kPromptNotShownDueToPrivacySandboxRestricted = 6, - kPromptNotShownDueTo3PCBlocked = 7, - kPromptNotShownDueToTrialConsentDeclined = 8, - kPromptNotShownDueToTrialsDisabledAfterNoticeShown = 9, - kPromptNotShownDueToManagedState = 10, - kRestrictedNoticeNotShownDueToNoticeShownToGuardian = 11, - kRestrictedNoticePromptWaiting = 12, - kRestrictedNoticeFlowCompleted = 13, - kRestrictedNoticeNotShownDueToFullNoticeAcknowledged = 14, - kWaitingForGraduationRestrictedNoticeFlowNotCompleted = 15, - kWaitingForGraduationRestrictedNoticeFlowCompleted = 16, - - // Add values above this line with a corresponding label in - // tools/metrics/histograms/enums.xml - kMaxValue = kWaitingForGraduationRestrictedNoticeFlowCompleted, - }; - - // Helper function to log first party sets state. - void RecordFirstPartySetsStateHistogram(FirstPartySetsState state); - - // Helper function to actually make the metrics call for - // LogPrivacySandboxState. - void RecordPrivacySandboxHistogram(SettingsPrivacySandboxEnabled state); - - // Logs the state of the privacy sandbox and cookie settings. Called once per - // profile startup. - void LogPrivacySandboxState(); - - // Logs the state of privacy sandbox 3 in regards to prompts. Called once per - // profile startup. - void RecordPrivacySandbox3StartupMetrics(); - - // Logs the state of privacy sandbox 4 in regards to prompts. Called once per - // profile startup. - void RecordPrivacySandbox4StartupMetrics(); - - // Converts the provided list of |top_frames| into eTLD+1s for display, and - // provides those to |callback|. - void ConvertInterestGroupDataKeysForDisplay( - base::OnceCallback<void(std::vector<std::string>)> callback, - std::vector<content::InterestGroupManager::InterestGroupDataKey> - data_keys); - - // Contains the logic which powers GetRequiredPromptType(). Static to allow - // EXPECT_DCHECK_DEATH testing, which does not work well with many of the - // other dependencies of this service. It is also for this reason the 3P - // cookie block state is passed in, as CookieSettings cannot be used in - // death tests. - static PrivacySandboxService::PromptType GetRequiredPromptTypeInternal( - PrefService* pref_service, - profile_metrics::BrowserProfileType profile_type, - privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, - bool third_party_cookies_blocked); - - // Equivalent of PrivacySandboxService::GetRequiredPromptTypeInternal, but for - // PrivacySandboxSettings4. - static PrivacySandboxService::PromptType GetRequiredPromptTypeInternalM1( - PrefService* pref_service, - profile_metrics::BrowserProfileType profile_type, - privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, - bool third_party_cookies_blocked, - bool is_chrome_build); - - // Checks to see if initialization of the user's FPS pref is required, and if - // so, sets the default value based on the user's current cookie settings. - void MaybeInitializeFirstPartySetsPref(); - - // Checks to see if initialization of the user's anti-abuse content setting is - // required, and if so, sets the default value based on the user's current - // cookie settings. - void MaybeInitializeAntiAbuseContentSetting(); - - // Updates the preferences which store the current Topics consent information. - void RecordUpdatedTopicsConsent( - privacy_sandbox::TopicsConsentUpdateSource source, - bool did_consent) const; - -#if !BUILDFLAG(IS_ANDROID) - // If appropriate based on feature state, closes all currently open Privacy - // Sandbox prompts. - void MaybeCloseOpenPrompts(); -#endif // !BUILDFLAG(IS_ANDROID) - - private: - raw_ptr<privacy_sandbox::PrivacySandboxSettings, DanglingUntriaged> - privacy_sandbox_settings_; - scoped_refptr<content_settings::CookieSettings> cookie_settings_; - raw_ptr<PrefService> pref_service_; - raw_ptr<content::InterestGroupManager> interest_group_manager_; - profile_metrics::BrowserProfileType profile_type_; - raw_ptr<content::BrowsingDataRemover> browsing_data_remover_; - raw_ptr<HostContentSettingsMap> host_content_settings_map_; -#if !BUILDFLAG(IS_ANDROID) - raw_ptr<TrustSafetySentimentService, DanglingUntriaged> sentiment_service_; -#endif - raw_ptr<browsing_topics::BrowsingTopicsService> browsing_topics_service_; - raw_ptr<first_party_sets::FirstPartySetsPolicyService> - first_party_sets_policy_service_; - - PrefChangeRegistrar user_prefs_registrar_; - -#if !BUILDFLAG(IS_ANDROID) - // A map of Browser windows which have an open Privacy Sandbox prompt, - // to the Widget for that prompt. - std::map<Browser*, views::Widget*> browsers_to_open_prompts_; -#endif - - // Fake implementation for current and blocked topics. - static constexpr int kFakeTaxonomyVersion = 1; - std::set<privacy_sandbox::CanonicalTopic> fake_current_topics_ = { - {browsing_topics::Topic(1), kFakeTaxonomyVersion}, - {browsing_topics::Topic(2), kFakeTaxonomyVersion}}; - std::set<privacy_sandbox::CanonicalTopic> fake_blocked_topics_ = { - {browsing_topics::Topic(3), kFakeTaxonomyVersion}, - {browsing_topics::Topic(4), kFakeTaxonomyVersion}}; - - // Informs the TrustSafetySentimentService, if it exists, that a - // Privacy Sandbox 3 interaction for an area has occurred The area is - // determined by |action|. Only a subset of actions has a corresponding area. - void InformSentimentService(PrivacySandboxService::PromptAction action); - - // Equivalent of PrivacySandboxService::InformSentimentService, but for - // PrivacySandboxSettings4. - void InformSentimentServiceM1(PrivacySandboxService::PromptAction action); - - // Implementation of PrivacySandboxService::PromptActionOccurred, but for - // PrivacySandboxSettings4. - virtual void PromptActionOccurredM1(PromptAction action); - - // Record user action metrics based on the |action|. - void RecordPromptActionMetrics(PrivacySandboxService::PromptAction action); - - // Called when the Topics preference is changed. - void OnTopicsPrefChanged(); - - // Called when the Fledge preference is changed. - void OnFledgePrefChanged(); - - // Called when the Ad measurement preference is changed. - void OnAdMeasurementPrefChanged(); - - // Returns true if _any_ of the k-API prefs are disabled via policy or - // the prompt was suppressed via policy. - static bool IsM1PrivacySandboxEffectivelyManaged(PrefService* pref_service); - - bool force_chrome_build_for_tests_ = false; - - base::WeakPtrFactory<PrivacySandboxService> weak_factory_{this}; + virtual privacy_sandbox::TopicsConsentUpdateSource + TopicsConsentLastUpdateSource() const = 0; + virtual base::Time TopicsConsentLastUpdateTime() const = 0; + virtual std::string TopicsConsentLastUpdateText() const = 0; }; #endif // CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_SERVICE_H_
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc index 4710c8c..1b17c22 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_factory.cc
@@ -9,7 +9,7 @@ #include "chrome/browser/content_settings/cookie_settings_factory.h" #include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/first_party_sets/first_party_sets_policy_service_factory.h" -#include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/tpcd/experiment/eligibility_service_factory.h" @@ -88,7 +88,7 @@ PrivacySandboxServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { Profile* profile = Profile::FromBrowserContext(context); - return std::make_unique<PrivacySandboxService>( + return std::make_unique<PrivacySandboxServiceImpl>( PrivacySandboxSettingsFactory::GetForProfile(profile), CookieSettingsFactory::GetForProfile(profile), profile->GetPrefs(), profile->GetDefaultStoragePartition()->GetInterestGroupManager(),
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc similarity index 90% rename from chrome/browser/privacy_sandbox/privacy_sandbox_service.cc rename to chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc index 1f311e3..f9ee96e 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.cc
@@ -1,8 +1,8 @@ -// Copyright 2021 The Chromium Authors +// Copyright 2023 The Chromium Authors // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h" #include <algorithm> #include <iterator> @@ -192,9 +192,39 @@ } // namespace -PrivacySandboxService::PrivacySandboxService() = default; +// static +bool PrivacySandboxService::IsUrlSuitableForPrompt(const GURL& url) { + // The prompt should be shown on a limited list of pages: -PrivacySandboxService::PrivacySandboxService( + // about:blank is valid. + if (url.IsAboutBlank()) { + return true; + } + // Chrome settings page is valid. The subpages aren't as most of them are not + // related to the prompt. + if (url == GURL(chrome::kChromeUISettingsURL)) { + return true; + } + // Chrome history is valid as the prompt mentions history. + if (url == GURL(chrome::kChromeUIHistoryURL)) { + return true; + } + // Only a Chrome controlled New Tab Page is valid. Third party NTP is still + // Chrome controlled, but is without Google branding. + if (url == GURL(chrome::kChromeUINewTabPageURL) || + url == GURL(chrome::kChromeUINewTabPageThirdPartyURL)) { + return true; + } + + return false; +} + +// static +void PrivacySandboxService::SetPromptDisabledForTests(bool disabled) { + g_prompt_disabled_for_tests = disabled; +} + +PrivacySandboxServiceImpl::PrivacySandboxServiceImpl( privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, scoped_refptr<content_settings::CookieSettings> cookie_settings, PrefService* pref_service, @@ -227,21 +257,23 @@ user_prefs_registrar_.Init(pref_service_); user_prefs_registrar_.Add( prefs::kPrivacySandboxApisEnabledV2, - base::BindRepeating(&PrivacySandboxService::OnPrivacySandboxV2PrefChanged, - base::Unretained(this))); + base::BindRepeating( + &PrivacySandboxServiceImpl::OnPrivacySandboxV2PrefChanged, + base::Unretained(this))); user_prefs_registrar_.Add( prefs::kPrivacySandboxM1TopicsEnabled, - base::BindRepeating(&PrivacySandboxService::OnTopicsPrefChanged, + base::BindRepeating(&PrivacySandboxServiceImpl::OnTopicsPrefChanged, base::Unretained(this))); user_prefs_registrar_.Add( prefs::kPrivacySandboxM1FledgeEnabled, - base::BindRepeating(&PrivacySandboxService::OnFledgePrefChanged, + base::BindRepeating(&PrivacySandboxServiceImpl::OnFledgePrefChanged, base::Unretained(this))); user_prefs_registrar_.Add( prefs::kPrivacySandboxM1AdMeasurementEnabled, - base::BindRepeating(&PrivacySandboxService::OnAdMeasurementPrefChanged, - base::Unretained(this))); + base::BindRepeating( + &PrivacySandboxServiceImpl::OnAdMeasurementPrefChanged, + base::Unretained(this))); // If the Sandbox is currently restricted, disable it and reset any consent // information. The user must manually enable the sandbox if they stop being @@ -289,10 +321,10 @@ LogPrivacySandboxState(); } -PrivacySandboxService::~PrivacySandboxService() = default; +PrivacySandboxServiceImpl::~PrivacySandboxServiceImpl() = default; PrivacySandboxService::PromptType -PrivacySandboxService::GetRequiredPromptType() { +PrivacySandboxServiceImpl::GetRequiredPromptType() { const auto third_party_cookies_blocked = AreThirdPartyCookiesBlocked(cookie_settings_.get()); if (base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4)) { @@ -306,8 +338,7 @@ third_party_cookies_blocked); } -void PrivacySandboxService::PromptActionOccurred( - PrivacySandboxService::PromptAction action) { +void PrivacySandboxServiceImpl::PromptActionOccurred(PromptAction action) { RecordPromptActionMetrics(action); if (base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4)) { @@ -332,8 +363,7 @@ } } -void PrivacySandboxService::PromptActionOccurredM1( - PrivacySandboxService::PromptAction action) { +void PrivacySandboxServiceImpl::PromptActionOccurredM1(PromptAction action) { DCHECK( base::FeatureList::IsEnabled(privacy_sandbox::kPrivacySandboxSettings4)); @@ -363,7 +393,7 @@ } #if !BUILDFLAG(IS_ANDROID) MaybeCloseOpenPrompts(); -#endif // !BUILDFLAG(IS_ANDROID) +#endif // !BUILDFLAG(IS_ANDROID) } else if (PromptAction::kConsentAccepted == action) { DCHECK(privacy_sandbox::kPrivacySandboxSettings4ConsentRequired.Get()); pref_service_->SetBoolean(prefs::kPrivacySandboxM1ConsentDecisionMade, @@ -387,85 +417,51 @@ true); #if !BUILDFLAG(IS_ANDROID) MaybeCloseOpenPrompts(); -#endif // !BUILDFLAG(IS_ANDROID) +#endif // !BUILDFLAG(IS_ANDROID) } } -// static -bool PrivacySandboxService::IsUrlSuitableForPrompt(const GURL& url) { - // The prompt should be shown on a limited list of pages: - - // about:blank is valid. - if (url.IsAboutBlank()) { - return true; - } - // Chrome settings page is valid. The subpages aren't as most of them are not - // related to the prompt. - if (url == GURL(chrome::kChromeUISettingsURL)) { - return true; - } - // Chrome history is valid as the prompt mentions history. - if (url == GURL(chrome::kChromeUIHistoryURL)) { - return true; - } - // Only a Chrome controlled New Tab Page is valid. Third party NTP is still - // Chrome controlled, but is without Google branding. - if (url == GURL(chrome::kChromeUINewTabPageURL) || - url == GURL(chrome::kChromeUINewTabPageThirdPartyURL)) { - return true; - } - - return false; -} - #if !BUILDFLAG(IS_ANDROID) -void PrivacySandboxService::PromptOpenedForBrowser(Browser* browser, - views::Widget* widget) { +void PrivacySandboxServiceImpl::PromptOpenedForBrowser(Browser* browser, + views::Widget* widget) { DCHECK(!browsers_to_open_prompts_.count(browser)); browsers_to_open_prompts_[browser] = widget; } -void PrivacySandboxService::PromptClosedForBrowser(Browser* browser) { +void PrivacySandboxServiceImpl::PromptClosedForBrowser(Browser* browser) { DCHECK(browsers_to_open_prompts_.count(browser)); browsers_to_open_prompts_.erase(browser); } -bool PrivacySandboxService::IsPromptOpenForBrowser(Browser* browser) { +bool PrivacySandboxServiceImpl::IsPromptOpenForBrowser(Browser* browser) { return browsers_to_open_prompts_.count(browser); } #endif // !BUILDFLAG(IS_ANDROID) -void PrivacySandboxService::SetPromptDisabledForTests(bool disabled) { - g_prompt_disabled_for_tests = disabled; -} - -void PrivacySandboxService::ForceChromeBuildForTests(bool force_chrome_build) { +void PrivacySandboxServiceImpl::ForceChromeBuildForTests( + bool force_chrome_build) { force_chrome_build_for_tests_ = force_chrome_build; } -bool PrivacySandboxService::IsPrivacySandboxEnabled() { - return pref_service_->GetBoolean(prefs::kPrivacySandboxApisEnabledV2); -} - -bool PrivacySandboxService::IsPrivacySandboxManaged() { - return pref_service_->IsManagedPreference( - prefs::kPrivacySandboxApisEnabledV2); -} - -bool PrivacySandboxService::IsPrivacySandboxRestricted() { - return privacy_sandbox_settings_->IsPrivacySandboxRestricted(); -} - -bool PrivacySandboxService::IsRestrictedNoticeEnabled() { - return privacy_sandbox_settings_->IsRestrictedNoticeEnabled(); -} - -void PrivacySandboxService::SetPrivacySandboxEnabled(bool enabled) { +void PrivacySandboxServiceImpl::SetPrivacySandboxEnabled(bool enabled) { pref_service_->SetBoolean(prefs::kPrivacySandboxManuallyControlledV2, true); privacy_sandbox_settings_->SetPrivacySandboxEnabled(enabled); } -void PrivacySandboxService::OnPrivacySandboxV2PrefChanged() { +bool PrivacySandboxServiceImpl::IsPrivacySandboxEnabled() { + return pref_service_->GetBoolean(prefs::kPrivacySandboxApisEnabledV2); +} + +bool PrivacySandboxServiceImpl::IsPrivacySandboxManaged() { + return pref_service_->IsManagedPreference( + prefs::kPrivacySandboxApisEnabledV2); +} + +bool PrivacySandboxServiceImpl::IsPrivacySandboxRestricted() { + return privacy_sandbox_settings_->IsPrivacySandboxRestricted(); +} + +void PrivacySandboxServiceImpl::OnPrivacySandboxV2PrefChanged() { // If the user has disabled the Privacy Sandbox, any data stored should be // cleared. if (pref_service_->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)) { @@ -484,21 +480,107 @@ } } -bool PrivacySandboxService::IsFirstPartySetsDataAccessEnabled() const { - return privacy_sandbox_settings_->AreRelatedWebsiteSetsEnabled(); +bool PrivacySandboxServiceImpl::IsRestrictedNoticeEnabled() { + return privacy_sandbox_settings_->IsRestrictedNoticeEnabled(); } -bool PrivacySandboxService::IsFirstPartySetsDataAccessManaged() const { - return pref_service_->IsManagedPreference( - prefs::kPrivacySandboxRelatedWebsiteSetsEnabled); -} - -void PrivacySandboxService::SetFirstPartySetsDataAccessEnabled(bool enabled) { +void PrivacySandboxServiceImpl::SetFirstPartySetsDataAccessEnabled( + bool enabled) { pref_service_->SetBoolean(prefs::kPrivacySandboxRelatedWebsiteSetsEnabled, enabled); } -void PrivacySandboxService::GetFledgeJoiningEtldPlusOneForDisplay( +bool PrivacySandboxServiceImpl::IsFirstPartySetsDataAccessEnabled() const { + return privacy_sandbox_settings_->AreRelatedWebsiteSetsEnabled(); +} + +bool PrivacySandboxServiceImpl::IsFirstPartySetsDataAccessManaged() const { + return pref_service_->IsManagedPreference( + prefs::kPrivacySandboxRelatedWebsiteSetsEnabled); +} + +base::flat_map<net::SchemefulSite, net::SchemefulSite> +PrivacySandboxServiceImpl::GetSampleFirstPartySets() const { + if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get() && + IsFirstPartySetsDataAccessEnabled()) { + return {{net::SchemefulSite(GURL("https://youtube.com")), + net::SchemefulSite(GURL("https://google.com"))}, + {net::SchemefulSite(GURL("https://google.com")), + net::SchemefulSite(GURL("https://google.com"))}, + {net::SchemefulSite(GURL("https://google.com.au")), + net::SchemefulSite(GURL("https://google.com"))}, + {net::SchemefulSite(GURL("https://google.de")), + net::SchemefulSite(GURL("https://google.com"))}, + {net::SchemefulSite(GURL("https://chromium.org")), + net::SchemefulSite(GURL("https://chromium.org"))}, + {net::SchemefulSite(GURL("https://googlesource.com")), + net::SchemefulSite(GURL("https://chromium.org"))}, + {net::SchemefulSite(GURL("https://muenchen.de")), + net::SchemefulSite(GURL("https://xn--mnchen-3ya.de"))}}; + } + + return {}; +} + +absl::optional<net::SchemefulSite> +PrivacySandboxServiceImpl::GetFirstPartySetOwner(const GURL& site_url) const { + // If FPS is not affecting cookie access, then there are effectively no + // first party sets. + if (!(cookie_settings_->ShouldBlockThirdPartyCookies() && + cookie_settings_->GetDefaultCookieSetting() != CONTENT_SETTING_BLOCK && + base::FeatureList::IsEnabled( + privacy_sandbox::kPrivacySandboxFirstPartySetsUI))) { + return absl::nullopt; + } + + // Return the owner according to the sample sets if they're provided. + if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { + const base::flat_map<net::SchemefulSite, net::SchemefulSite> sets = + GetSampleFirstPartySets(); + net::SchemefulSite schemeful_site(site_url); + + base::flat_map<net::SchemefulSite, net::SchemefulSite>::const_iterator + site_entry = sets.find(schemeful_site); + if (site_entry == sets.end()) { + return absl::nullopt; + } + + return site_entry->second; + } + + absl::optional<net::FirstPartySetEntry> site_entry = + first_party_sets_policy_service_->FindEntry(net::SchemefulSite(site_url)); + if (!site_entry.has_value()) { + return absl::nullopt; + } + + return site_entry->primary(); +} + +absl::optional<std::u16string> +PrivacySandboxServiceImpl::GetFirstPartySetOwnerForDisplay( + const GURL& site_url) const { + absl::optional<net::SchemefulSite> site_owner = + GetFirstPartySetOwner(site_url); + if (!site_owner.has_value()) { + return absl::nullopt; + } + + return url_formatter::IDNToUnicode(site_owner->GetURL().host()); +} + +bool PrivacySandboxServiceImpl::IsPartOfManagedFirstPartySet( + const net::SchemefulSite& site) const { + if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { + return IsFirstPartySetsDataAccessManaged() || + GetSampleFirstPartySets()[site] == + net::SchemefulSite(GURL("https://chromium.org")); + } + + return first_party_sets_policy_service_->IsSiteInManagedSet(site); +} + +void PrivacySandboxServiceImpl::GetFledgeJoiningEtldPlusOneForDisplay( base::OnceCallback<void(std::vector<std::string>)> callback) { if (!interest_group_manager_) { std::move(callback).Run({}); @@ -506,12 +588,12 @@ } interest_group_manager_->GetAllInterestGroupDataKeys(base::BindOnce( - &PrivacySandboxService::ConvertInterestGroupDataKeysForDisplay, + &PrivacySandboxServiceImpl::ConvertInterestGroupDataKeysForDisplay, weak_factory_.GetWeakPtr(), std::move(callback))); } std::vector<std::string> -PrivacySandboxService::GetBlockedFledgeJoiningTopFramesForDisplay() const { +PrivacySandboxServiceImpl::GetBlockedFledgeJoiningTopFramesForDisplay() const { const base::Value::Dict& pref_value = pref_service_->GetDict(prefs::kPrivacySandboxFledgeJoinBlocked); @@ -527,7 +609,7 @@ return blocked_top_frames; } -void PrivacySandboxService::SetFledgeJoiningAllowed( +void PrivacySandboxServiceImpl::SetFledgeJoiningAllowed( const std::string& top_frame_etld_plus1, bool allowed) const { privacy_sandbox_settings_->SetFledgeJoiningAllowed(top_frame_etld_plus1, @@ -546,17 +628,17 @@ } } -void PrivacySandboxService::RecordFirstPartySetsStateHistogram( - PrivacySandboxService::FirstPartySetsState state) { +void PrivacySandboxServiceImpl::RecordFirstPartySetsStateHistogram( + FirstPartySetsState state) { base::UmaHistogramEnumeration("Settings.FirstPartySets.State", state); } -void PrivacySandboxService::RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled state) { +void PrivacySandboxServiceImpl::RecordPrivacySandboxHistogram( + SettingsPrivacySandboxEnabled state) { base::UmaHistogramEnumeration("Settings.PrivacySandbox.Enabled", state); } -void PrivacySandboxService::RecordPrivacySandbox3StartupMetrics() { +void PrivacySandboxServiceImpl::RecordPrivacySandbox3StartupMetrics() { const std::string privacy_sandbox_startup_histogram = "Settings.PrivacySandbox.StartupState"; const bool sandbox_v2_enabled = @@ -634,7 +716,7 @@ } } -void PrivacySandboxService::RecordPrivacySandbox4StartupMetrics() { +void PrivacySandboxServiceImpl::RecordPrivacySandbox4StartupMetrics() { // Record the status of the APIs. const bool topics_enabled = pref_service_->GetBoolean(prefs::kPrivacySandboxM1TopicsEnabled); @@ -813,7 +895,7 @@ } else { base::UmaHistogramEnumeration( privacy_sandbox_prompt_startup_histogram, - PrivacySandboxService::PromptStartupState::kEEANoticePromptWaiting); + PromptStartupState::kEEANoticePromptWaiting); } return; } @@ -828,7 +910,7 @@ } } -void PrivacySandboxService::LogPrivacySandboxState() { +void PrivacySandboxServiceImpl::LogPrivacySandboxState() { // Do not record metrics for non-regular profiles. if (!IsRegularProfile(profile_type_)) { return; @@ -863,8 +945,7 @@ content_settings::SettingSource::SETTING_SOURCE_POLICY && default_cookie_setting == ContentSetting::CONTENT_SETTING_BLOCK) { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledPolicyBlockAll); + SettingsPrivacySandboxEnabled::kPSDisabledPolicyBlockAll); return; } @@ -878,45 +959,38 @@ cookie_controls_mode_value == content_settings::CookieControlsMode::kBlockThirdParty) { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledPolicyBlock3P); + SettingsPrivacySandboxEnabled::kPSDisabledPolicyBlock3P); return; } if (privacy_sandbox_settings_->IsPrivacySandboxEnabled()) { if (default_cookie_setting == ContentSetting::CONTENT_SETTING_BLOCK) { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSEnabledBlockAll); + SettingsPrivacySandboxEnabled::kPSEnabledBlockAll); } else if (cookie_controls_mode_value == content_settings::CookieControlsMode::kBlockThirdParty) { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSEnabledBlock3P); + SettingsPrivacySandboxEnabled::kPSEnabledBlock3P); } else { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSEnabledAllowAll); + SettingsPrivacySandboxEnabled::kPSEnabledAllowAll); } } else { if (default_cookie_setting == ContentSetting::CONTENT_SETTING_BLOCK) { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledBlockAll); + SettingsPrivacySandboxEnabled::kPSDisabledBlockAll); } else if (cookie_controls_mode_value == content_settings::CookieControlsMode::kBlockThirdParty) { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledBlock3P); + SettingsPrivacySandboxEnabled::kPSDisabledBlock3P); } else { RecordPrivacySandboxHistogram( - PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledAllowAll); + SettingsPrivacySandboxEnabled::kPSDisabledAllowAll); } } } -void PrivacySandboxService::ConvertInterestGroupDataKeysForDisplay( +void PrivacySandboxServiceImpl::ConvertInterestGroupDataKeysForDisplay( base::OnceCallback<void(std::vector<std::string>)> callback, std::vector<content::InterestGroupManager::InterestGroupDataKey> data_keys) { @@ -952,7 +1026,7 @@ } std::vector<privacy_sandbox::CanonicalTopic> -PrivacySandboxService::GetCurrentTopTopics() const { +PrivacySandboxServiceImpl::GetCurrentTopTopics() const { if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get() || (pref_service_->GetBoolean(prefs::kPrivacySandboxM1TopicsEnabled) && privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting @@ -971,7 +1045,7 @@ } std::vector<privacy_sandbox::CanonicalTopic> -PrivacySandboxService::GetBlockedTopics() const { +PrivacySandboxServiceImpl::GetBlockedTopics() const { if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get() || privacy_sandbox::kPrivacySandboxSettings4ShowSampleDataForTesting.Get()) { return {fake_blocked_topics_.begin(), fake_blocked_topics_.end()}; @@ -993,7 +1067,7 @@ return blocked_topics; } -void PrivacySandboxService::SetTopicAllowed( +void PrivacySandboxServiceImpl::SetTopicAllowed( privacy_sandbox::CanonicalTopic topic, bool allowed) { if (privacy_sandbox::kPrivacySandboxSettings3ShowSampleDataForTesting.Get() || @@ -1015,119 +1089,39 @@ privacy_sandbox_settings_->SetTopicAllowed(topic, allowed); } -base::flat_map<net::SchemefulSite, net::SchemefulSite> -PrivacySandboxService::GetSampleFirstPartySets() const { - if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get() && - IsFirstPartySetsDataAccessEnabled()) { - return {{net::SchemefulSite(GURL("https://youtube.com")), - net::SchemefulSite(GURL("https://google.com"))}, - {net::SchemefulSite(GURL("https://google.com")), - net::SchemefulSite(GURL("https://google.com"))}, - {net::SchemefulSite(GURL("https://google.com.au")), - net::SchemefulSite(GURL("https://google.com"))}, - {net::SchemefulSite(GURL("https://google.de")), - net::SchemefulSite(GURL("https://google.com"))}, - {net::SchemefulSite(GURL("https://chromium.org")), - net::SchemefulSite(GURL("https://chromium.org"))}, - {net::SchemefulSite(GURL("https://googlesource.com")), - net::SchemefulSite(GURL("https://chromium.org"))}, - {net::SchemefulSite(GURL("https://muenchen.de")), - net::SchemefulSite(GURL("https://xn--mnchen-3ya.de"))}}; - } - - return {}; -} - -absl::optional<net::SchemefulSite> PrivacySandboxService::GetFirstPartySetOwner( - const GURL& site_url) const { - // If FPS is not affecting cookie access, then there are effectively no - // first party sets. - if (!(cookie_settings_->ShouldBlockThirdPartyCookies() && - cookie_settings_->GetDefaultCookieSetting() != CONTENT_SETTING_BLOCK && - base::FeatureList::IsEnabled( - privacy_sandbox::kPrivacySandboxFirstPartySetsUI))) { - return absl::nullopt; - } - - // Return the owner according to the sample sets if they're provided. - if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { - const base::flat_map<net::SchemefulSite, net::SchemefulSite> sets = - GetSampleFirstPartySets(); - net::SchemefulSite schemeful_site(site_url); - - base::flat_map<net::SchemefulSite, net::SchemefulSite>::const_iterator - site_entry = sets.find(schemeful_site); - if (site_entry == sets.end()) { - return absl::nullopt; - } - - return site_entry->second; - } - - absl::optional<net::FirstPartySetEntry> site_entry = - first_party_sets_policy_service_->FindEntry(net::SchemefulSite(site_url)); - if (!site_entry.has_value()) { - return absl::nullopt; - } - - return site_entry->primary(); -} - -absl::optional<std::u16string> -PrivacySandboxService::GetFirstPartySetOwnerForDisplay( - const GURL& site_url) const { - absl::optional<net::SchemefulSite> site_owner = - GetFirstPartySetOwner(site_url); - if (!site_owner.has_value()) { - return absl::nullopt; - } - - return url_formatter::IDNToUnicode(site_owner->GetURL().host()); -} - -bool PrivacySandboxService::IsPartOfManagedFirstPartySet( - const net::SchemefulSite& site) const { - if (privacy_sandbox::kPrivacySandboxFirstPartySetsUISampleSets.Get()) { - return IsFirstPartySetsDataAccessManaged() || - GetSampleFirstPartySets()[site] == - net::SchemefulSite(GURL("https://chromium.org")); - } - - return first_party_sets_policy_service_->IsSiteInManagedSet(site); -} - -void PrivacySandboxService::TopicsToggleChanged(bool new_value) const { +void PrivacySandboxServiceImpl::TopicsToggleChanged(bool new_value) const { RecordUpdatedTopicsConsent( privacy_sandbox::TopicsConsentUpdateSource::kSettings, new_value); } -bool PrivacySandboxService::TopicsConsentRequired() const { +bool PrivacySandboxServiceImpl::TopicsConsentRequired() const { return privacy_sandbox::kPrivacySandboxSettings4ConsentRequired.Get(); } -bool PrivacySandboxService::TopicsHasActiveConsent() const { +bool PrivacySandboxServiceImpl::TopicsHasActiveConsent() const { return pref_service_->GetBoolean(prefs::kPrivacySandboxTopicsConsentGiven); } privacy_sandbox::TopicsConsentUpdateSource -PrivacySandboxService::TopicsConsentLastUpdateSource() const { +PrivacySandboxServiceImpl::TopicsConsentLastUpdateSource() const { return static_cast<privacy_sandbox::TopicsConsentUpdateSource>( pref_service_->GetInteger( prefs::kPrivacySandboxTopicsConsentLastUpdateReason)); } -base::Time PrivacySandboxService::TopicsConsentLastUpdateTime() const { +base::Time PrivacySandboxServiceImpl::TopicsConsentLastUpdateTime() const { return pref_service_->GetTime( prefs::kPrivacySandboxTopicsConsentLastUpdateTime); } -std::string PrivacySandboxService::TopicsConsentLastUpdateText() const { +std::string PrivacySandboxServiceImpl::TopicsConsentLastUpdateText() const { return pref_service_->GetString( prefs::kPrivacySandboxTopicsConsentTextAtLastUpdate); } -/*static*/ PrivacySandboxService::PromptType -PrivacySandboxService::GetRequiredPromptTypeInternal( +// static +PrivacySandboxService::PromptType +PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( PrefService* pref_service, profile_metrics::BrowserProfileType profile_type, privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, @@ -1315,8 +1309,9 @@ return PromptType::kNotice; } -/*static*/ PrivacySandboxService::PromptType -PrivacySandboxService::GetRequiredPromptTypeInternalM1( +// static +PrivacySandboxService::PromptType +PrivacySandboxServiceImpl::GetRequiredPromptTypeInternalM1( PrefService* pref_service, profile_metrics::BrowserProfileType profile_type, privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, @@ -1505,7 +1500,7 @@ } } -void PrivacySandboxService::MaybeInitializeFirstPartySetsPref() { +void PrivacySandboxServiceImpl::MaybeInitializeFirstPartySetsPref() { // If initialization has already run, it is not required. if (pref_service_->GetBoolean( prefs::kPrivacySandboxFirstPartySetsDataAccessAllowedInitialized)) { @@ -1533,7 +1528,7 @@ prefs::kPrivacySandboxFirstPartySetsDataAccessAllowedInitialized, true); } -void PrivacySandboxService::MaybeInitializeAntiAbuseContentSetting() { +void PrivacySandboxServiceImpl::MaybeInitializeAntiAbuseContentSetting() { // If initialization has already run, it is not required. if (pref_service_->GetBoolean(prefs::kPrivacySandboxAntiAbuseInitialized)) { return; @@ -1553,20 +1548,20 @@ pref_service_->SetBoolean(prefs::kPrivacySandboxAntiAbuseInitialized, true); } -void PrivacySandboxService::RecordUpdatedTopicsConsent( +void PrivacySandboxServiceImpl::RecordUpdatedTopicsConsent( privacy_sandbox::TopicsConsentUpdateSource source, bool did_consent) const { std::string consent_text; switch (source) { - case (privacy_sandbox::TopicsConsentUpdateSource::kDefaultValue): { + case privacy_sandbox::TopicsConsentUpdateSource::kDefaultValue: { NOTREACHED(); break; } - case (privacy_sandbox::TopicsConsentUpdateSource::kConfirmation): { + case privacy_sandbox::TopicsConsentUpdateSource::kConfirmation: { consent_text = GetTopicsConfirmationText(); break; } - case (privacy_sandbox::TopicsConsentUpdateSource::kSettings): { + case privacy_sandbox::TopicsConsentUpdateSource::kSettings: { int current_topics_count = GetCurrentTopTopics().size(); int blocked_topics_count = GetBlockedTopics().size(); consent_text = GetTopicsSettingsText( @@ -1588,7 +1583,7 @@ } #if !BUILDFLAG(IS_ANDROID) -void PrivacySandboxService::MaybeCloseOpenPrompts() { +void PrivacySandboxServiceImpl::MaybeCloseOpenPrompts() { if (!privacy_sandbox::kPrivacySandboxSettings4CloseAllPrompts.Get()) { return; } @@ -1608,8 +1603,7 @@ } #endif -void PrivacySandboxService::InformSentimentService( - PrivacySandboxService::PromptAction action) { +void PrivacySandboxServiceImpl::InformSentimentService(PromptAction action) { #if !BUILDFLAG(IS_ANDROID) if (!sentiment_service_) { return; @@ -1648,8 +1642,7 @@ #endif } -void PrivacySandboxService::InformSentimentServiceM1( - PrivacySandboxService::PromptAction action) { +void PrivacySandboxServiceImpl::InformSentimentServiceM1(PromptAction action) { #if !BUILDFLAG(IS_ANDROID) if (!sentiment_service_) { return; @@ -1680,110 +1673,109 @@ #endif } -void PrivacySandboxService::RecordPromptActionMetrics( - PrivacySandboxService::PromptAction action) { +void PrivacySandboxServiceImpl::RecordPromptActionMetrics(PromptAction action) { switch (action) { - case (PromptAction::kNoticeShown): { + case PromptAction::kNoticeShown: { base::RecordAction( base::UserMetricsAction("Settings.PrivacySandbox.Notice.Shown")); break; } - case (PromptAction::kNoticeOpenSettings): { + case PromptAction::kNoticeOpenSettings: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Notice.OpenedSettings")); break; } - case (PromptAction::kNoticeAcknowledge): { + case PromptAction::kNoticeAcknowledge: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Notice.Acknowledged")); break; } - case (PromptAction::kNoticeDismiss): { + case PromptAction::kNoticeDismiss: { base::RecordAction( base::UserMetricsAction("Settings.PrivacySandbox.Notice.Dismissed")); break; } - case (PromptAction::kNoticeClosedNoInteraction): { + case PromptAction::kNoticeClosedNoInteraction: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Notice.ClosedNoInteraction")); break; } - case (PromptAction::kConsentShown): { + case PromptAction::kConsentShown: { base::RecordAction( base::UserMetricsAction("Settings.PrivacySandbox.Consent.Shown")); break; } - case (PromptAction::kConsentAccepted): { + case PromptAction::kConsentAccepted: { base::RecordAction( base::UserMetricsAction("Settings.PrivacySandbox.Consent.Accepted")); break; } - case (PromptAction::kConsentDeclined): { + case PromptAction::kConsentDeclined: { base::RecordAction( base::UserMetricsAction("Settings.PrivacySandbox.Consent.Declined")); break; } - case (PromptAction::kConsentMoreInfoOpened): { + case PromptAction::kConsentMoreInfoOpened: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Consent.LearnMoreExpanded")); break; } - case (PromptAction::kConsentMoreInfoClosed): { + case PromptAction::kConsentMoreInfoClosed: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Consent.LearnMoreClosed")); break; } - case (PromptAction::kConsentClosedNoDecision): { + case PromptAction::kConsentClosedNoDecision: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Consent.ClosedNoInteraction")); break; } - case (PromptAction::kNoticeLearnMore): { + case PromptAction::kNoticeLearnMore: { base::RecordAction( base::UserMetricsAction("Settings.PrivacySandbox.Notice.LearnMore")); break; } - case (PromptAction::kNoticeMoreInfoOpened): { + case PromptAction::kNoticeMoreInfoOpened: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Notice.LearnMoreExpanded")); break; } - case (PromptAction::kNoticeMoreInfoClosed): { + case PromptAction::kNoticeMoreInfoClosed: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Notice.LearnMoreClosed")); break; } - case (PromptAction::kConsentMoreButtonClicked): { + case PromptAction::kConsentMoreButtonClicked: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Consent.MoreButtonClicked")); break; } - case (PromptAction::kNoticeMoreButtonClicked): { + case PromptAction::kNoticeMoreButtonClicked: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.Notice.MoreButtonClicked")); break; } - case (PromptAction::kRestrictedNoticeAcknowledge): { + case PromptAction::kRestrictedNoticeAcknowledge: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.RestrictedNotice.Acknowledged")); break; } - case (PromptAction::kRestrictedNoticeOpenSettings): { + case PromptAction::kRestrictedNoticeOpenSettings: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.RestrictedNotice.OpenedSettings")); break; } - case (PromptAction::kRestrictedNoticeShown): { + case PromptAction::kRestrictedNoticeShown: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.RestrictedNotice.Shown")); break; } - case (PromptAction::kRestrictedNoticeClosedNoInteraction): { + case PromptAction::kRestrictedNoticeClosedNoInteraction: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.RestrictedNotice.ClosedNoInteraction")); break; } - case (PromptAction::kRestrictedNoticeMoreButtonClicked): { + case PromptAction::kRestrictedNoticeMoreButtonClicked: { base::RecordAction(base::UserMetricsAction( "Settings.PrivacySandbox.RestrictedNotice.MoreButtonClicked")); break; @@ -1791,7 +1783,7 @@ } } -void PrivacySandboxService::OnTopicsPrefChanged() { +void PrivacySandboxServiceImpl::OnTopicsPrefChanged() { // If the user has disabled the preference, any related data stored should be // cleared. if (pref_service_->GetBoolean(prefs::kPrivacySandboxM1TopicsEnabled)) { @@ -1803,7 +1795,7 @@ } } -void PrivacySandboxService::OnFledgePrefChanged() { +void PrivacySandboxServiceImpl::OnFledgePrefChanged() { // If the user has disabled the preference, any related data stored should be // cleared. if (pref_service_->GetBoolean(prefs::kPrivacySandboxM1FledgeEnabled)) { @@ -1820,7 +1812,7 @@ } } -void PrivacySandboxService::OnAdMeasurementPrefChanged() { +void PrivacySandboxServiceImpl::OnAdMeasurementPrefChanged() { // If the user has disabled the preference, any related data stored should be // cleared. if (pref_service_->GetBoolean(prefs::kPrivacySandboxM1AdMeasurementEnabled)) { @@ -1839,13 +1831,12 @@ } // static -bool PrivacySandboxService::IsM1PrivacySandboxEffectivelyManaged( +bool PrivacySandboxServiceImpl::IsM1PrivacySandboxEffectivelyManaged( PrefService* pref_service) { bool is_prompt_suppressed_by_policy = pref_service->IsManagedPreference( prefs::kPrivacySandboxM1PromptSuppressed) && - static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kPolicy) == + static_cast<int>(PromptSuppressedReason::kPolicy) == pref_service->GetInteger(prefs::kPrivacySandboxM1PromptSuppressed); return is_prompt_suppressed_by_policy ||
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h new file mode 100644 index 0000000..876d0558 --- /dev/null +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h
@@ -0,0 +1,417 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_SERVICE_IMPL_H_ +#define CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_SERVICE_IMPL_H_ + +#include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" + +#include <set> + +#include "base/gtest_prod_util.h" +#include "base/memory/raw_ptr.h" +#include "chrome/browser/first_party_sets/first_party_sets_policy_service.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/prefs/pref_change_registrar.h" +#include "components/privacy_sandbox/canonical_topic.h" +#include "components/privacy_sandbox/privacy_sandbox_prefs.h" +#include "components/privacy_sandbox/privacy_sandbox_settings.h" +#include "components/profile_metrics/browser_profile_type.h" +#include "content/public/browser/interest_group_manager.h" +#include "net/base/schemeful_site.h" + +class Browser; +class PrefService; +#if !BUILDFLAG(IS_ANDROID) +class TrustSafetySentimentService; +#endif + +namespace content { +class BrowsingDataRemover; +} + +namespace content_settings { +class CookieSettings; +} + +namespace browsing_topics { +class BrowsingTopicsService; +} + +namespace views { +class Widget; +} + +class PrivacySandboxServiceImpl : public PrivacySandboxService { + public: + PrivacySandboxServiceImpl( + privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, + scoped_refptr<content_settings::CookieSettings> cookie_settings, + PrefService* pref_service, + content::InterestGroupManager* interest_group_manager, + profile_metrics::BrowserProfileType profile_type, + content::BrowsingDataRemover* browsing_data_remover, + HostContentSettingsMap* host_content_settings_map, +#if !BUILDFLAG(IS_ANDROID) + TrustSafetySentimentService* sentiment_service, +#endif + browsing_topics::BrowsingTopicsService* browsing_topics_service, + first_party_sets::FirstPartySetsPolicyService* first_party_sets_service); + + ~PrivacySandboxServiceImpl() override; + + // PrivacySandboxService: + PromptType GetRequiredPromptType() override; + void PromptActionOccurred(PromptAction action) override; +#if !BUILDFLAG(IS_ANDROID) + void PromptOpenedForBrowser(Browser* browser, views::Widget* widget) override; + void PromptClosedForBrowser(Browser* browser) override; + bool IsPromptOpenForBrowser(Browser* browser) override; +#endif // !BUILDFLAG(IS_ANDROID) + void ForceChromeBuildForTests(bool force_chrome_build) override; + void SetPrivacySandboxEnabled(bool enabled) override; + bool IsPrivacySandboxEnabled() override; + bool IsPrivacySandboxManaged() override; + bool IsPrivacySandboxRestricted() override; + void OnPrivacySandboxV2PrefChanged() override; + bool IsRestrictedNoticeEnabled() override; + void SetFirstPartySetsDataAccessEnabled(bool enabled) override; + bool IsFirstPartySetsDataAccessEnabled() const override; + bool IsFirstPartySetsDataAccessManaged() const override; + base::flat_map<net::SchemefulSite, net::SchemefulSite> + GetSampleFirstPartySets() const override; + absl::optional<net::SchemefulSite> GetFirstPartySetOwner( + const GURL& site_url) const override; + absl::optional<std::u16string> GetFirstPartySetOwnerForDisplay( + const GURL& site_url) const override; + bool IsPartOfManagedFirstPartySet( + const net::SchemefulSite& site) const override; + void GetFledgeJoiningEtldPlusOneForDisplay( + base::OnceCallback<void(std::vector<std::string>)> callback) override; + std::vector<std::string> GetBlockedFledgeJoiningTopFramesForDisplay() + const override; + void SetFledgeJoiningAllowed(const std::string& top_frame_etld_plus1, + bool allowed) const override; + std::vector<privacy_sandbox::CanonicalTopic> GetCurrentTopTopics() + const override; + std::vector<privacy_sandbox::CanonicalTopic> GetBlockedTopics() + const override; + void SetTopicAllowed(privacy_sandbox::CanonicalTopic topic, + bool allowed) override; + void TopicsToggleChanged(bool new_value) const override; + bool TopicsConsentRequired() const override; + bool TopicsHasActiveConsent() const override; + privacy_sandbox::TopicsConsentUpdateSource TopicsConsentLastUpdateSource() + const override; + base::Time TopicsConsentLastUpdateTime() const override; + std::string TopicsConsentLastUpdateText() const override; + + protected: + friend class PrivacySandboxServiceTest; + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + MetricsLoggingOccursCorrectly); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTestNonRegularProfile, + NoMetricsRecorded); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, RestrictedPrompt); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, ManagedNoPrompt); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, + ManuallyControlledNoPrompt); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServicePromptTest, NoParamNoPrompt); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceDeathTest, + GetRequiredPromptType); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxPromptNoticeWaiting); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxPromptConsentWaiting); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxV1OffEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxV1OffDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxConsentEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxConsentDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxNoticeEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxNoticeDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandbox3PCOffEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandbox3PCOffDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxManagedEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxManagedDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxManuallyControlledEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxManuallyControlledDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxNoPromptDisabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + PrivacySandboxNoPromptEnabled); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, PrivacySandboxRestricted); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + FirstPartySetsNotRelevantMetricAllowedCookies); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + FirstPartySetsNotRelevantMetricBlockedCookies); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + FirstPartySetsEnabledMetric); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceTest, + FirstPartySetsDisabledMetric); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1Test, + RecordPrivacySandbox4StartupMetrics_PromptSuppressed_Explicitly); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1Test, + RecordPrivacySandbox4StartupMetrics_PromptSuppressed_Implicitly); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1Test, + RecordPrivacySandbox4StartupMetrics_PromptNotSuppressed_EEA); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1Test, + RecordPrivacySandbox4StartupMetrics_PromptNotSuppressed_ROW); + FRIEND_TEST_ALL_PREFIXES(PrivacySandboxServiceM1Test, + RecordPrivacySandbox4StartupMetrics_APIs); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1RestrictedNoticePromptTest, + RecordPrivacySandbox4StartupMetrics_PromptNotSuppressed); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1RestrictedNoticeUserCurrentlyUnrestricted, + RecordPrivacySandbox4StartupMetrics_GraduationFlow); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1RestrictedNoticeUserCurrentlyRestricted, + RecordPrivacySandbox4StartupMetrics_GraduationFlow); + FRIEND_TEST_ALL_PREFIXES( + PrivacySandboxServiceM1RestrictedNoticeUserCurrentlyUnrestricted, + RecordPrivacySandbox4StartupMetrics_GraduationFlowWhenNoticeShownToGuardian); + + // Contains all possible privacy sandbox states, recorded on startup. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // Must be kept in sync with the SettingsPrivacySandboxEnabled enum in + // histograms/enums.xml. + enum class SettingsPrivacySandboxEnabled { + kPSEnabledAllowAll = 0, + kPSEnabledBlock3P = 1, + kPSEnabledBlockAll = 2, + kPSDisabledAllowAll = 3, + kPSDisabledBlock3P = 4, + kPSDisabledBlockAll = 5, + kPSDisabledPolicyBlock3P = 6, + kPSDisabledPolicyBlockAll = 7, + // DEPRECATED + kPSEnabledFlocDisabledAllowAll = 8, + // DEPRECATED + kPSEnabledFlocDisabledBlock3P = 9, + // DEPRECATED + kPSEnabledFlocDisabledBlockAll = 10, + // Add values above this line with a corresponding label in + // tools/metrics/histograms/enums.xml + kMaxValue = kPSEnabledFlocDisabledBlockAll, + }; + + // Contains all possible states of first party sets preference. + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + // Must be kept in sync with the FirstPartySetsState enum in + // histograms/enums.xml. + enum class FirstPartySetsState { + // The user allows all cookies, or blocks all cookies. + kFpsNotRelevant = 0, + // The user blocks third-party cookies, and has FPS enabled. + kFpsEnabled = 1, + // The user blocks third-party cookies, and has FPS disabled. + kFpsDisabled = 2, + kMaxValue = kFpsDisabled, + }; + + // Contains the possible states of a users Privacy Sandbox overall settings. + // Must be kept in sync with SettingsPrivacySandboxStartupStates in + // histograms/enums.xml + enum class PSStartupStates { + kPromptWaiting = 0, + kPromptOffV1OffEnabled = 1, + kPromptOffV1OffDisabled = 2, + kConsentShownEnabled = 3, + kConsentShownDisabled = 4, + kNoticeShownEnabled = 5, + kNoticeShownDisabled = 6, + kPromptOff3PCOffEnabled = 7, + kPromptOff3PCOffDisabled = 8, + kPromptOffManagedEnabled = 9, + kPromptOffManagedDisabled = 10, + kPromptOffRestricted = 11, + kPromptOffManuallyControlledEnabled = 12, + kPromptOffManuallyControlledDisabled = 13, + kNoPromptRequiredEnabled = 14, + kNoPromptRequiredDisabled = 15, + + // Add values above this line with a corresponding label in + // tools/metrics/histograms/enums.xml + kMaxValue = kNoPromptRequiredDisabled, + }; + + // Contains the possible states of the prompt start up states for m1. + // Must be kept in sync with SettingsPrivacySandboxPromptStartupState in + // histograms/enums.xml + enum class PromptStartupState { + kEEAConsentPromptWaiting = 0, + kEEANoticePromptWaiting = 1, + kROWNoticePromptWaiting = 2, + kEEAFlowCompletedWithTopicsAccepted = 3, + kEEAFlowCompletedWithTopicsDeclined = 4, + kROWNoticeFlowCompleted = 5, + kPromptNotShownDueToPrivacySandboxRestricted = 6, + kPromptNotShownDueTo3PCBlocked = 7, + kPromptNotShownDueToTrialConsentDeclined = 8, + kPromptNotShownDueToTrialsDisabledAfterNoticeShown = 9, + kPromptNotShownDueToManagedState = 10, + kRestrictedNoticeNotShownDueToNoticeShownToGuardian = 11, + kRestrictedNoticePromptWaiting = 12, + kRestrictedNoticeFlowCompleted = 13, + kRestrictedNoticeNotShownDueToFullNoticeAcknowledged = 14, + kWaitingForGraduationRestrictedNoticeFlowNotCompleted = 15, + kWaitingForGraduationRestrictedNoticeFlowCompleted = 16, + + // Add values above this line with a corresponding label in + // tools/metrics/histograms/enums.xml + kMaxValue = kWaitingForGraduationRestrictedNoticeFlowCompleted, + }; + + // Helper function to log first party sets state. + void RecordFirstPartySetsStateHistogram(FirstPartySetsState state); + + // Helper function to actually make the metrics call for + // LogPrivacySandboxState. + void RecordPrivacySandboxHistogram(SettingsPrivacySandboxEnabled state); + + // Logs the state of the privacy sandbox and cookie settings. Called once per + // profile startup. + void LogPrivacySandboxState(); + + // Logs the state of privacy sandbox 3 in regards to prompts. Called once per + // profile startup. + void RecordPrivacySandbox3StartupMetrics(); + + // Logs the state of privacy sandbox 4 in regards to prompts. Called once per + // profile startup. + void RecordPrivacySandbox4StartupMetrics(); + + // Converts the provided list of |top_frames| into eTLD+1s for display, and + // provides those to |callback|. + void ConvertInterestGroupDataKeysForDisplay( + base::OnceCallback<void(std::vector<std::string>)> callback, + std::vector<content::InterestGroupManager::InterestGroupDataKey> + data_keys); + + // Contains the logic which powers GetRequiredPromptType(). Static to allow + // EXPECT_DCHECK_DEATH testing, which does not work well with many of the + // other dependencies of this service. It is also for this reason the 3P + // cookie block state is passed in, as CookieSettings cannot be used in + // death tests. + static PrivacySandboxService::PromptType GetRequiredPromptTypeInternal( + PrefService* pref_service, + profile_metrics::BrowserProfileType profile_type, + privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, + bool third_party_cookies_blocked); + + // Equivalent of PrivacySandboxService::GetRequiredPromptTypeInternal, but for + // PrivacySandboxSettings4. + static PrivacySandboxService::PromptType GetRequiredPromptTypeInternalM1( + PrefService* pref_service, + profile_metrics::BrowserProfileType profile_type, + privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings, + bool third_party_cookies_blocked, + bool is_chrome_build); + + // Checks to see if initialization of the user's FPS pref is required, and if + // so, sets the default value based on the user's current cookie settings. + void MaybeInitializeFirstPartySetsPref(); + + // Checks to see if initialization of the user's anti-abuse content setting is + // required, and if so, sets the default value based on the user's current + // cookie settings. + void MaybeInitializeAntiAbuseContentSetting(); + + // Updates the preferences which store the current Topics consent information. + void RecordUpdatedTopicsConsent( + privacy_sandbox::TopicsConsentUpdateSource source, + bool did_consent) const; + +#if !BUILDFLAG(IS_ANDROID) + // If appropriate based on feature state, closes all currently open Privacy + // Sandbox prompts. + void MaybeCloseOpenPrompts(); +#endif // !BUILDFLAG(IS_ANDROID) + + private: + raw_ptr<privacy_sandbox::PrivacySandboxSettings, DanglingUntriaged> + privacy_sandbox_settings_; + scoped_refptr<content_settings::CookieSettings> cookie_settings_; + raw_ptr<PrefService> pref_service_; + raw_ptr<content::InterestGroupManager> interest_group_manager_; + profile_metrics::BrowserProfileType profile_type_; + raw_ptr<content::BrowsingDataRemover> browsing_data_remover_; + raw_ptr<HostContentSettingsMap> host_content_settings_map_; +#if !BUILDFLAG(IS_ANDROID) + raw_ptr<TrustSafetySentimentService, DanglingUntriaged> sentiment_service_; +#endif + raw_ptr<browsing_topics::BrowsingTopicsService> browsing_topics_service_; + raw_ptr<first_party_sets::FirstPartySetsPolicyService> + first_party_sets_policy_service_; + + PrefChangeRegistrar user_prefs_registrar_; + +#if !BUILDFLAG(IS_ANDROID) + // A map of Browser windows which have an open Privacy Sandbox prompt, + // to the Widget for that prompt. + std::map<Browser*, views::Widget*> browsers_to_open_prompts_; +#endif + + // Fake implementation for current and blocked topics. + static constexpr int kFakeTaxonomyVersion = 1; + std::set<privacy_sandbox::CanonicalTopic> fake_current_topics_ = { + {browsing_topics::Topic(1), kFakeTaxonomyVersion}, + {browsing_topics::Topic(2), kFakeTaxonomyVersion}}; + std::set<privacy_sandbox::CanonicalTopic> fake_blocked_topics_ = { + {browsing_topics::Topic(3), kFakeTaxonomyVersion}, + {browsing_topics::Topic(4), kFakeTaxonomyVersion}}; + + // Informs the TrustSafetySentimentService, if it exists, that a + // Privacy Sandbox 3 interaction for an area has occurred The area is + // determined by |action|. Only a subset of actions has a corresponding area. + void InformSentimentService(PrivacySandboxService::PromptAction action); + + // Equivalent of PrivacySandboxService::InformSentimentService, but for + // PrivacySandboxSettings4. + void InformSentimentServiceM1(PrivacySandboxService::PromptAction action); + + // Implementation of PrivacySandboxService::PromptActionOccurred, but for + // PrivacySandboxSettings4. + virtual void PromptActionOccurredM1(PromptAction action); + + // Record user action metrics based on the |action|. + void RecordPromptActionMetrics(PrivacySandboxService::PromptAction action); + + // Called when the Topics preference is changed. + void OnTopicsPrefChanged(); + + // Called when the Fledge preference is changed. + void OnFledgePrefChanged(); + + // Called when the Ad measurement preference is changed. + void OnAdMeasurementPrefChanged(); + + // Returns true if _any_ of the k-API prefs are disabled via policy or + // the prompt was suppressed via policy. + static bool IsM1PrivacySandboxEffectivelyManaged(PrefService* pref_service); + + bool force_chrome_build_for_tests_ = false; + + base::WeakPtrFactory<PrivacySandboxServiceImpl> weak_factory_{this}; +}; + +#endif // CHROME_BROWSER_PRIVACY_SANDBOX_PRIVACY_SANDBOX_SERVICE_IMPL_H_
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc similarity index 91% rename from chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc rename to chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc index ab804e78..9a8a03c 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_service_unittest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include "chrome/browser/privacy_sandbox/privacy_sandbox_service.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_service_impl.h" #include "base/feature_list.h" #include "base/memory/raw_ptr.h" @@ -218,7 +218,7 @@ struct ExpectedPromptOutput { bool dcheck_failure; - PrivacySandboxService::PromptType prompt_type; + PromptType prompt_type; bool new_api_pref; }; @@ -233,7 +233,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -241,7 +241,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -249,7 +249,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNotice, + /*prompt_type=*/PromptType::kNotice, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -257,7 +257,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kConsent, + /*prompt_type=*/PromptType::kConsent, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -265,7 +265,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -273,7 +273,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -281,7 +281,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNotice, + /*prompt_type=*/PromptType::kNotice, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -289,7 +289,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kConsent, + /*prompt_type=*/PromptType::kConsent, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -297,7 +297,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -305,7 +305,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -313,7 +313,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -321,7 +321,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -329,7 +329,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -337,7 +337,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kConsent, + /*prompt_type=*/PromptType::kConsent, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -345,7 +345,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -353,7 +353,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kConsent, + /*prompt_type=*/PromptType::kConsent, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -361,7 +361,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -369,7 +369,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -377,7 +377,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -385,7 +385,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -393,7 +393,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -401,7 +401,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -409,7 +409,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -417,7 +417,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -425,7 +425,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -433,7 +433,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -441,7 +441,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -449,7 +449,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -457,7 +457,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -465,7 +465,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -473,7 +473,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -481,7 +481,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/false}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -489,7 +489,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -497,7 +497,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -505,7 +505,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -513,7 +513,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -521,7 +521,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -529,7 +529,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -537,7 +537,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -545,7 +545,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -553,7 +553,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -561,7 +561,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -569,7 +569,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -577,7 +577,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -585,7 +585,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -593,7 +593,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -601,7 +601,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -609,7 +609,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/false, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -617,7 +617,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -625,7 +625,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -633,7 +633,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -641,7 +641,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -649,7 +649,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -657,7 +657,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -665,7 +665,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -673,7 +673,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -681,7 +681,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -689,7 +689,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -697,7 +697,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -705,7 +705,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/false}}, {{/*consent_required=*/false, /*old_api_pref=*/false, @@ -713,7 +713,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/false, @@ -721,7 +721,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/false, /*old_api_pref=*/true, @@ -729,7 +729,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, {{/*consent_required=*/true, /*old_api_pref=*/true, @@ -737,7 +737,7 @@ /*notice_displayed=*/true, /*consent_decision_made=*/true, /*confirmation_not_shown=*/true}, {/*dcheck_failure=*/false, - /*prompt_type=*/PrivacySandboxService::PromptType::kNone, + /*prompt_type=*/PromptType::kNone, /*new_api_pref=*/true}}, }; @@ -948,7 +948,7 @@ std::make_unique<::testing::NiceMock<MockTrustSafetySentimentService>>( profile()); #endif - privacy_sandbox_service_ = std::make_unique<PrivacySandboxService>( + privacy_sandbox_service_ = std::make_unique<PrivacySandboxServiceImpl>( privacy_sandbox_settings(), cookie_settings(), profile()->GetPrefs(), test_interest_group_manager(), GetProfileType(), browsing_data_remover(), host_content_settings_map(), @@ -962,15 +962,14 @@ return profile_metrics::BrowserProfileType::kRegular; } - void ConfirmRequiredPromptType( - PrivacySandboxService::PromptType prompt_type) { + void ConfirmRequiredPromptType(PromptType prompt_type) { // The required prompt type should never change between successive calls to // GetRequiredPromptType. EXPECT_EQ(prompt_type, privacy_sandbox_service()->GetRequiredPromptType()); } TestingProfile* profile() { return &profile_; } - PrivacySandboxService* privacy_sandbox_service() { + PrivacySandboxServiceImpl* privacy_sandbox_service() { return privacy_sandbox_service_.get(); } privacy_sandbox::PrivacySandboxSettings* privacy_sandbox_settings() { @@ -1044,7 +1043,7 @@ privacy_sandbox_settings_; privacy_sandbox::ScopedPrivacySandboxAttestations scoped_attestations_; - std::unique_ptr<PrivacySandboxService> privacy_sandbox_service_; + std::unique_ptr<PrivacySandboxServiceImpl> privacy_sandbox_service_; }; TEST_F(PrivacySandboxServiceTest, GetFledgeJoiningEtldPlusOne) { @@ -1153,14 +1152,14 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); - EXPECT_EQ(PrivacySandboxService::PromptType::kConsent, + EXPECT_EQ(PromptType::kConsent, privacy_sandbox_service()->GetRequiredPromptType()); EXPECT_FALSE(prefs()->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentAccepted); + PromptAction::kConsentAccepted); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); EXPECT_TRUE(prefs()->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)); EXPECT_TRUE(prefs()->GetBoolean(prefs::kPrivacySandboxConsentDecisionMade)); @@ -1173,14 +1172,14 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); - EXPECT_EQ(PrivacySandboxService::PromptType::kConsent, + EXPECT_EQ(PromptType::kConsent, privacy_sandbox_service()->GetRequiredPromptType()); EXPECT_FALSE(prefs()->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentDeclined); + PromptAction::kConsentDeclined); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); EXPECT_FALSE(prefs()->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)); EXPECT_TRUE(prefs()->GetBoolean(prefs::kPrivacySandboxConsentDecisionMade)); @@ -1193,14 +1192,13 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); - EXPECT_EQ(PrivacySandboxService::PromptType::kNotice, + EXPECT_EQ(PromptType::kNotice, privacy_sandbox_service()->GetRequiredPromptType()); EXPECT_FALSE(prefs()->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)); - privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeShown); + privacy_sandbox_service()->PromptActionOccurred(PromptAction::kNoticeShown); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); EXPECT_TRUE(prefs()->GetBoolean(prefs::kPrivacySandboxApisEnabledV2)); EXPECT_TRUE(prefs()->GetBoolean(prefs::kPrivacySandboxNoticeDisplayed)); @@ -1209,110 +1207,106 @@ TEST_F(PrivacySandboxServiceTest, PromptActionsUMAActions) { base::UserActionTester user_action_tester; - privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeShown); + privacy_sandbox_service()->PromptActionOccurred(PromptAction::kNoticeShown); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.Shown")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeOpenSettings); + PromptAction::kNoticeOpenSettings); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.OpenedSettings")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeAcknowledge); + PromptAction::kNoticeAcknowledge); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.Acknowledged")); - privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeDismiss); + privacy_sandbox_service()->PromptActionOccurred(PromptAction::kNoticeDismiss); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.Dismissed")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeClosedNoInteraction); + PromptAction::kNoticeClosedNoInteraction); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.ClosedNoInteraction")); - privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentShown); + privacy_sandbox_service()->PromptActionOccurred(PromptAction::kConsentShown); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.Shown")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentAccepted); + PromptAction::kConsentAccepted); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.Accepted")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentDeclined); + PromptAction::kConsentDeclined); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.Declined")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentMoreInfoOpened); + PromptAction::kConsentMoreInfoOpened); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.LearnMoreExpanded")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentMoreInfoClosed); + PromptAction::kConsentMoreInfoClosed); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.LearnMoreClosed")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentClosedNoDecision); + PromptAction::kConsentClosedNoDecision); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.ClosedNoInteraction")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeLearnMore); + PromptAction::kNoticeLearnMore); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.LearnMore")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeMoreInfoOpened); + PromptAction::kNoticeMoreInfoOpened); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.LearnMoreExpanded")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeMoreInfoClosed); + PromptAction::kNoticeMoreInfoClosed); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.LearnMoreClosed")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentMoreButtonClicked); + PromptAction::kConsentMoreButtonClicked); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Consent.MoreButtonClicked")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeMoreButtonClicked); + PromptAction::kNoticeMoreButtonClicked); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.Notice.MoreButtonClicked")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kRestrictedNoticeOpenSettings); + PromptAction::kRestrictedNoticeOpenSettings); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.RestrictedNotice.OpenedSettings")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kRestrictedNoticeAcknowledge); + PromptAction::kRestrictedNoticeAcknowledge); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.RestrictedNotice.Acknowledged")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kRestrictedNoticeShown); + PromptAction::kRestrictedNoticeShown); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.RestrictedNotice.Shown")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction:: - kRestrictedNoticeClosedNoInteraction); + PromptAction::kRestrictedNoticeClosedNoInteraction); EXPECT_EQ( 1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.RestrictedNotice.ClosedNoInteraction")); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kRestrictedNoticeMoreButtonClicked); + PromptAction::kRestrictedNoticeMoreButtonClicked); EXPECT_EQ(1, user_action_tester.GetActionCount( "Settings.PrivacySandbox.RestrictedNotice.MoreButtonClicked")); @@ -1331,8 +1325,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); - privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeShown); + privacy_sandbox_service()->PromptActionOccurred(PromptAction::kNoticeShown); } { EXPECT_CALL( @@ -1348,7 +1341,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeOpenSettings); + PromptAction::kNoticeOpenSettings); } { EXPECT_CALL( @@ -1364,7 +1357,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeAcknowledge); + PromptAction::kNoticeAcknowledge); } { EXPECT_CALL( @@ -1380,7 +1373,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeDismiss); + PromptAction::kNoticeDismiss); } { EXPECT_CALL(*mock_sentiment_service(), @@ -1394,7 +1387,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeClosedNoInteraction); + PromptAction::kNoticeClosedNoInteraction); } { EXPECT_CALL( @@ -1410,7 +1403,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kNoticeLearnMore); + PromptAction::kNoticeLearnMore); } { EXPECT_CALL(*mock_sentiment_service(), @@ -1424,7 +1417,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentShown); + PromptAction::kConsentShown); } { EXPECT_CALL( @@ -1440,7 +1433,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentAccepted); + PromptAction::kConsentAccepted); } { EXPECT_CALL( @@ -1456,7 +1449,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentDeclined); + PromptAction::kConsentDeclined); } { EXPECT_CALL(*mock_sentiment_service(), @@ -1470,7 +1463,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentMoreInfoOpened); + PromptAction::kConsentMoreInfoOpened); } { EXPECT_CALL(*mock_sentiment_service(), @@ -1484,7 +1477,7 @@ /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); privacy_sandbox_service()->PromptActionOccurred( - PrivacySandboxService::PromptAction::kConsentClosedNoDecision); + PromptAction::kConsentClosedNoDecision); } } #endif @@ -1495,26 +1488,26 @@ prefs::kCookieControlsMode, std::make_unique<base::Value>(static_cast<int>( content_settings::CookieControlsMode::kBlockThirdParty))); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); // This should persist even if 3P cookies become allowed. prefs()->SetUserPref(prefs::kCookieControlsMode, std::make_unique<base::Value>(static_cast<int>( content_settings::CookieControlsMode::kOff))); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); } TEST_F(PrivacySandboxServiceTest, BlockAllCookiesNoPrompt) { // Confirm that when all cookies are blocked, that no prompt is shown. cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_BLOCK); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); // This should persist even if cookies become allowed. cookie_settings()->SetDefaultCookieSetting(CONTENT_SETTING_ALLOW); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); } @@ -1710,7 +1703,7 @@ init_params->session_type = crosapi::mojom::SessionType::kPublicSession; chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params)); #endif - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); // A prompt should be shown for a regular user. @@ -1723,12 +1716,12 @@ init_params->session_type = crosapi::mojom::SessionType::kRegularSession; chromeos::BrowserInitParams::SetInitParamsForTests(std::move(init_params)); #endif - EXPECT_EQ(PrivacySandboxService::PromptType::kConsent, + EXPECT_EQ(PromptType::kConsent, privacy_sandbox_service()->GetRequiredPromptType()); // No prompt should be shown for a web kiosk account. chromeos::SetUpFakeKioskSession(); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); } #endif // BUILDFLAG(IS_CHROMEOS) @@ -1828,7 +1821,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptWaiting, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptWaiting, 1); } TEST_F(PrivacySandboxServiceTest, @@ -1848,7 +1841,7 @@ histogram_tester.ExpectUniqueSample( kFirstPartySetsStateHistogram, - PrivacySandboxService::FirstPartySetsState::kFpsNotRelevant, 1); + PrivacySandboxServiceImpl::FirstPartySetsState::kFpsNotRelevant, 1); } TEST_F(PrivacySandboxServiceTest, @@ -1868,7 +1861,7 @@ histogram_tester.ExpectUniqueSample( kFirstPartySetsStateHistogram, - PrivacySandboxService::FirstPartySetsState::kFpsNotRelevant, 1); + PrivacySandboxServiceImpl::FirstPartySetsState::kFpsNotRelevant, 1); } TEST_F(PrivacySandboxServiceTest, FirstPartySetsEnabledMetric) { @@ -1887,7 +1880,7 @@ histogram_tester.ExpectUniqueSample( kFirstPartySetsStateHistogram, - PrivacySandboxService::FirstPartySetsState::kFpsEnabled, 1); + PrivacySandboxServiceImpl::FirstPartySetsState::kFpsEnabled, 1); } TEST_F(PrivacySandboxServiceTest, FirstPartySetsDisabledMetric) { @@ -1906,7 +1899,7 @@ histogram_tester.ExpectUniqueSample( kFirstPartySetsStateHistogram, - PrivacySandboxService::FirstPartySetsState::kFpsDisabled, 1); + PrivacySandboxServiceImpl::FirstPartySetsState::kFpsDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxPromptConsentWaiting) { @@ -1932,7 +1925,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptWaiting, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptWaiting, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxV1OffDisabled) { @@ -1958,7 +1951,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOffV1OffDisabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOffV1OffDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxV1OffEnabled) { @@ -1984,7 +1977,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOffV1OffEnabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOffV1OffEnabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxRestricted) { @@ -2008,7 +2001,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOffRestricted, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOffRestricted, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxManagedEnabled) { @@ -2034,7 +2027,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOffManagedEnabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOffManagedEnabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxManagedDisabled) { @@ -2060,7 +2053,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOffManagedDisabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOffManagedDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandbox3PCOffEnabled) { @@ -2087,7 +2080,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOff3PCOffEnabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOff3PCOffEnabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandbox3PCOffDisabled) { @@ -2114,7 +2107,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kPromptOff3PCOffDisabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kPromptOff3PCOffDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxConsentEnabled) { @@ -2142,7 +2135,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kConsentShownEnabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kConsentShownEnabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxConsentDisabled) { @@ -2170,7 +2163,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kConsentShownDisabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kConsentShownDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxNoticeEnabled) { @@ -2198,7 +2191,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kNoticeShownEnabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kNoticeShownEnabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxNoticeDisabled) { @@ -2226,7 +2219,7 @@ histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kNoticeShownDisabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kNoticeShownDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxManuallyControlledEnabled) { @@ -2236,10 +2229,11 @@ prefs()->SetUserPref(prefs::kPrivacySandboxNoConfirmationManuallyControlled, std::make_unique<base::Value>(true)); CreateService(); - histogram_tester.ExpectUniqueSample(kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates:: - kPromptOffManuallyControlledEnabled, - 1); + histogram_tester.ExpectUniqueSample( + kPrivacySandboxStartupHistogram, + PrivacySandboxServiceImpl::PSStartupStates:: + kPromptOffManuallyControlledEnabled, + 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxManuallyControlledDisabled) { @@ -2249,10 +2243,11 @@ prefs()->SetUserPref(prefs::kPrivacySandboxNoConfirmationManuallyControlled, std::make_unique<base::Value>(true)); CreateService(); - histogram_tester.ExpectUniqueSample(kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates:: - kPromptOffManuallyControlledDisabled, - 1); + histogram_tester.ExpectUniqueSample( + kPrivacySandboxStartupHistogram, + PrivacySandboxServiceImpl::PSStartupStates:: + kPromptOffManuallyControlledDisabled, + 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxNoPromptDisabled) { @@ -2262,7 +2257,7 @@ CreateService(); histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kNoPromptRequiredDisabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kNoPromptRequiredDisabled, 1); } TEST_F(PrivacySandboxServiceTest, PrivacySandboxNoPromptEnabled) { @@ -2272,7 +2267,7 @@ CreateService(); histogram_tester.ExpectUniqueSample( kPrivacySandboxStartupHistogram, - PrivacySandboxService::PSStartupStates::kNoPromptRequiredEnabled, 1); + PrivacySandboxServiceImpl::PSStartupStates::kNoPromptRequiredEnabled, 1); } TEST_F(PrivacySandboxServiceTest, MetricsLoggingOccursCorrectly) { @@ -2296,8 +2291,8 @@ histograms.ExpectTotalCount(histogram_name, 1); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSEnabledAllowAll), + static_cast<int>(PrivacySandboxServiceImpl:: + SettingsPrivacySandboxEnabled::kPSEnabledAllowAll), 1); privacy_sandbox_test_util::SetupTestState( @@ -2314,8 +2309,8 @@ histograms.ExpectTotalCount(histogram_name, 2); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSEnabledBlock3P), + static_cast<int>(PrivacySandboxServiceImpl:: + SettingsPrivacySandboxEnabled::kPSEnabledBlock3P), 1); privacy_sandbox_test_util::SetupTestState( @@ -2332,8 +2327,8 @@ histograms.ExpectTotalCount(histogram_name, 3); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSEnabledBlockAll), + static_cast<int>(PrivacySandboxServiceImpl:: + SettingsPrivacySandboxEnabled::kPSEnabledBlockAll), 1); privacy_sandbox_test_util::SetupTestState( @@ -2350,8 +2345,8 @@ histograms.ExpectTotalCount(histogram_name, 4); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledAllowAll), + static_cast<int>(PrivacySandboxServiceImpl:: + SettingsPrivacySandboxEnabled::kPSDisabledAllowAll), 1); privacy_sandbox_test_util::SetupTestState( @@ -2368,8 +2363,8 @@ histograms.ExpectTotalCount(histogram_name, 5); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledBlock3P), + static_cast<int>(PrivacySandboxServiceImpl:: + SettingsPrivacySandboxEnabled::kPSDisabledBlock3P), 1); privacy_sandbox_test_util::SetupTestState( @@ -2386,7 +2381,7 @@ histograms.ExpectTotalCount(histogram_name, 6); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::PrivacySandboxService:: + static_cast<int>(PrivacySandboxServiceImpl:: SettingsPrivacySandboxEnabled::kPSDisabledBlockAll), 1); @@ -2404,8 +2399,9 @@ histograms.ExpectTotalCount(histogram_name, 7); histograms.ExpectBucketCount( histogram_name, - static_cast<int>(PrivacySandboxService::SettingsPrivacySandboxEnabled:: - kPSDisabledPolicyBlockAll), + static_cast<int>( + PrivacySandboxServiceImpl::SettingsPrivacySandboxEnabled:: + kPSDisabledPolicyBlockAll), 1); } @@ -2993,7 +2989,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); SetupPromptTestState(feature_list(), prefs(), @@ -3003,7 +2999,7 @@ /*notice_displayed=*/false, /*consent_decision_made=*/false, /*confirmation_not_shown=*/false}); - EXPECT_EQ(PrivacySandboxService::PromptType::kNone, + EXPECT_EQ(PromptType::kNone, privacy_sandbox_service()->GetRequiredPromptType()); } @@ -3076,8 +3072,8 @@ .Times(1) .WillOnce(testing::Return(true)); EXPECT_EQ( - PrivacySandboxService::PromptType::kNone, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PromptType::kNone, + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); @@ -3087,8 +3083,8 @@ EXPECT_CALL(*privacy_sandbox_settings(), IsPrivacySandboxRestricted()) .Times(0); EXPECT_EQ( - PrivacySandboxService::PromptType::kNone, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PromptType::kNone, + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); } @@ -3107,16 +3103,16 @@ prefs()->SetManagedPref(prefs::kPrivacySandboxApisEnabledV2, base::Value(true)); EXPECT_EQ( - PrivacySandboxService::PromptType::kNone, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PromptType::kNone, + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); // This should persist even if the preference becomes unmanaged. prefs()->RemoveManagedPref(prefs::kPrivacySandboxApisEnabledV2); EXPECT_EQ( - PrivacySandboxService::PromptType::kNone, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PromptType::kNone, + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); } @@ -3134,8 +3130,8 @@ prefs()->SetUserPref(prefs::kPrivacySandboxManuallyControlledV2, base::Value(true)); EXPECT_EQ( - PrivacySandboxService::PromptType::kNone, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PromptType::kNone, + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); } @@ -3144,8 +3140,8 @@ // Confirm that if neither the consent or notice parameter is set, no prompt // is required. EXPECT_EQ( - PrivacySandboxService::PromptType::kNone, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PromptType::kNone, + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); } @@ -3179,7 +3175,7 @@ SetupPromptTestState(feature_list(), prefs(), test_case.test_setup); if (test_case.expected_output.dcheck_failure) { EXPECT_DCHECK_DEATH( - PrivacySandboxService::GetRequiredPromptTypeInternal( + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false); @@ -3190,12 +3186,12 @@ // Returned prompt type should never change between successive calls. EXPECT_EQ( test_case.expected_output.prompt_type, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); EXPECT_EQ( test_case.expected_output.prompt_type, - PrivacySandboxService::GetRequiredPromptTypeInternal( + PrivacySandboxServiceImpl::GetRequiredPromptTypeInternal( prefs(), profile_metrics::BrowserProfileType::kRegular, privacy_sandbox_settings(), /*third_party_cookies_blocked=*/false)); @@ -3267,8 +3263,7 @@ void DisablePrivacySandboxPromptEnabledPolicy() { prefs()->SetManagedPref( prefs::kPrivacySandboxM1PromptSuppressed, - base::Value(static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kPolicy))); + base::Value(static_cast<int>(PromptSuppressedReason::kPolicy))); } }; @@ -3418,68 +3413,61 @@ const std::string privacy_sandbox_prompt_startup_histogram = "Settings.PrivacySandbox.PromptStartupState"; - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kRestricted)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kRestricted)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kPromptNotShownDueToPrivacySandboxRestricted), /*expected_count=*/1); prefs()->SetInteger( prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason:: - kThirdPartyCookiesBlocked)); + static_cast<int>(PromptSuppressedReason::kThirdPartyCookiesBlocked)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kPromptNotShownDueTo3PCBlocked), /*expected_count=*/1); prefs()->SetInteger( prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason:: - kTrialsConsentDeclined)); + static_cast<int>(PromptSuppressedReason::kTrialsConsentDeclined)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kPromptNotShownDueToTrialConsentDeclined), /*expected_count=*/1); prefs()->SetInteger( prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason:: - kTrialsDisabledAfterNotice)); + static_cast<int>(PromptSuppressedReason::kTrialsDisabledAfterNotice)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kPromptNotShownDueToTrialsDisabledAfterNoticeShown), /*expected_count=*/1); - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kPolicy)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kPolicy)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kPromptNotShownDueToManagedState), /*expected_count=*/1); prefs()->SetInteger( prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason:: - kNoticeShownToGuardian)); + static_cast<int>(PromptSuppressedReason::kNoticeShownToGuardian)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticeNotShownDueToNoticeShownToGuardian), /*expected_count=*/1); } @@ -3491,9 +3479,8 @@ "Settings.PrivacySandbox.PromptStartupState"; // Ensure prompt not suppressed. - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kNone)); // Disable one of the K-APIs. prefs()->SetManagedPref(prefs::kPrivacySandboxM1TopicsEnabled, @@ -3501,7 +3488,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kPromptNotShownDueToManagedState), /*expected_count=*/1); } @@ -3513,9 +3500,8 @@ "Settings.PrivacySandbox.PromptStartupState"; // Ensure prompt not suppressed. - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kNone)); base::test::ScopedFeatureList feature_list_consent_required; std::map<std::string, std::string> consent_required_feature_param = { @@ -3533,8 +3519,8 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>( - PrivacySandboxService::PromptStartupState::kEEAConsentPromptWaiting), + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: + kEEAConsentPromptWaiting), /*expected_count=*/1); // Consent decision made and notice acknowledged. @@ -3546,7 +3532,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kEEAFlowCompletedWithTopicsAccepted), /*expected_count=*/1); @@ -3555,7 +3541,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kEEAFlowCompletedWithTopicsDeclined), /*expected_count=*/1); @@ -3564,8 +3550,8 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>( - PrivacySandboxService::PromptStartupState::kEEANoticePromptWaiting), + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: + kEEANoticePromptWaiting), /*expected_count=*/1); } @@ -3576,9 +3562,8 @@ "Settings.PrivacySandbox.PromptStartupState"; // Ensure prompt not suppressed. - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kNone)); base::test::ScopedFeatureList feature_list_notice_required; std::map<std::string, std::string> notice_required_feature_param = { @@ -3595,8 +3580,8 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>( - PrivacySandboxService::PromptStartupState::kROWNoticePromptWaiting), + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: + kROWNoticePromptWaiting), /*expected_count=*/1); // Notice flow completed. @@ -3604,8 +3589,8 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>( - PrivacySandboxService::PromptStartupState::kROWNoticeFlowCompleted), + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: + kROWNoticeFlowCompleted), /*expected_count=*/1); } @@ -3740,16 +3725,13 @@ privacy_sandbox::kPrivacySandboxSettings4, {{"restricted-notice", "true"}}); - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kRestricted)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kRestricted)); CreateService(); - EXPECT_EQ( - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone), - prefs()->GetValue(prefs::kPrivacySandboxM1PromptSuppressed)); + EXPECT_EQ(static_cast<int>(PromptSuppressedReason::kNone), + prefs()->GetValue(prefs::kPrivacySandboxM1PromptSuppressed)); } TEST_F(PrivacySandboxServiceM1DelayCreation, @@ -3758,15 +3740,12 @@ privacy_sandbox::kPrivacySandboxSettings4, {{"restricted-notice", "false"}}); - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kRestricted)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kRestricted)); CreateService(); - EXPECT_EQ(static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kRestricted), + EXPECT_EQ(static_cast<int>(PromptSuppressedReason::kRestricted), prefs()->GetValue(prefs::kPrivacySandboxM1PromptSuppressed)); } @@ -3906,8 +3885,7 @@ static_cast<int>(PromptSuppressedReason::kNone)}, {StateKey::kIsRestrictedAccount, true}}, TestInput{{InputKey::kForceChromeBuild, true}}, - TestOutput{{OutputKey::kPromptType, - static_cast<int>(PrivacySandboxService::PromptType::kNone)}, + TestOutput{{OutputKey::kPromptType, static_cast<int>(PromptType::kNone)}, {OutputKey::kM1PromptSuppressedReason, static_cast<int>(PromptSuppressedReason::kRestricted)}}); @@ -3919,8 +3897,7 @@ static_cast<int>(PromptSuppressedReason::kRestricted)}, {StateKey::kIsRestrictedAccount, false}}, TestInput{{InputKey::kForceChromeBuild, true}}, - TestOutput{{OutputKey::kPromptType, - static_cast<int>(PrivacySandboxService::PromptType::kNone)}, + TestOutput{{OutputKey::kPromptType, static_cast<int>(PromptType::kNone)}, {OutputKey::kM1PromptSuppressedReason, static_cast<int>(PromptSuppressedReason::kRestricted)}}); } @@ -4273,13 +4250,11 @@ TEST_F(PrivacySandboxServiceM1Test, DisablePrivacySandboxPromptPolicy) { // Disable the prompt via policy and check the returned prompt type is kNone. - RunTestCase( - TestState{{StateKey::kM1PromptDisabledByPolicy, - static_cast<int>( - PrivacySandboxService::PromptSuppressedReason::kPolicy)}}, - TestInput{{InputKey::kForceChromeBuild, true}}, - TestOutput{ - {OutputKey::kPromptType, static_cast<int>(PromptType::kNone)}}); + RunTestCase(TestState{{StateKey::kM1PromptDisabledByPolicy, + static_cast<int>(PromptSuppressedReason::kPolicy)}}, + TestInput{{InputKey::kForceChromeBuild, true}}, + TestOutput{{OutputKey::kPromptType, + static_cast<int>(PromptType::kNone)}}); } TEST_F(PrivacySandboxServiceM1Test, DisablePrivacySandboxTopicsPolicy) { @@ -4416,9 +4391,8 @@ "Settings.PrivacySandbox.PromptStartupState"; // Ensure prompt not suppressed. - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kNone)); base::test::ScopedFeatureList feature_list_notice_required; std::map<std::string, std::string> notice_required_feature_param = { @@ -4436,7 +4410,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticePromptWaiting), /*expected_count=*/1); @@ -4446,7 +4420,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticeFlowCompleted), /*expected_count=*/1); @@ -4458,7 +4432,7 @@ histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, static_cast<int>( - PrivacySandboxService::PromptStartupState:: + PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticeNotShownDueToFullNoticeAcknowledged), /*expected_count=*/1); @@ -4470,7 +4444,7 @@ histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, static_cast<int>( - PrivacySandboxService::PromptStartupState:: + PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticeNotShownDueToFullNoticeAcknowledged), // One when the ROW notice acknowledged pref was set, plus the latest // call. @@ -4506,9 +4480,8 @@ "Settings.PrivacySandbox.PromptStartupState"; // Ensure prompt not suppressed. - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kNone)); // Restricted Notice flow NOT completed { @@ -4522,7 +4495,7 @@ histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, static_cast<int>( - PrivacySandboxService::PromptStartupState:: + PrivacySandboxServiceImpl::PromptStartupState:: kWaitingForGraduationRestrictedNoticeFlowNotCompleted), /*expected_count=*/1); } @@ -4540,7 +4513,7 @@ histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, static_cast<int>( - PrivacySandboxService::PromptStartupState:: + PrivacySandboxServiceImpl::PromptStartupState:: kWaitingForGraduationRestrictedNoticeFlowCompleted), /*expected_count=*/1); } @@ -4560,14 +4533,13 @@ // Prompt is suppressed because direct notice was shown to guardian prefs()->SetInteger( prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason:: - kNoticeShownToGuardian)); + static_cast<int>(PromptSuppressedReason::kNoticeShownToGuardian)); privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, static_cast<int>( - PrivacySandboxService::PromptStartupState:: + PrivacySandboxServiceImpl::PromptStartupState:: kWaitingForGraduationRestrictedNoticeFlowNotCompleted), /*expected_count=*/1); } @@ -4601,9 +4573,8 @@ "Settings.PrivacySandbox.PromptStartupState"; // Ensure prompt not suppressed. - prefs()->SetInteger( - prefs::kPrivacySandboxM1PromptSuppressed, - static_cast<int>(PrivacySandboxService::PromptSuppressedReason::kNone)); + prefs()->SetInteger(prefs::kPrivacySandboxM1PromptSuppressed, + static_cast<int>(PromptSuppressedReason::kNone)); // Restricted Notice flow completed { @@ -4616,7 +4587,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticeFlowCompleted), /*expected_count=*/1); } @@ -4632,7 +4603,7 @@ privacy_sandbox_service()->RecordPrivacySandbox4StartupMetrics(); histogram_tester.ExpectBucketCount( privacy_sandbox_prompt_startup_histogram, - static_cast<int>(PrivacySandboxService::PromptStartupState:: + static_cast<int>(PrivacySandboxServiceImpl::PromptStartupState:: kRestrictedNoticePromptWaiting), /*expected_count=*/1); } @@ -4648,8 +4619,7 @@ {StateKey::kM1RestrictedNoticeAcknowledged, true}, {StateKey::kM1AdMeasurementEnabledUserPrefValue, false}}, TestInput{{InputKey::kForceChromeBuild, true}}, - TestOutput{{OutputKey::kPromptType, - static_cast<int>(PrivacySandboxService::PromptType::kNone)}, + TestOutput{{OutputKey::kPromptType, static_cast<int>(PromptType::kNone)}, {OutputKey::kM1AdMeasurementEnabled, false}, {OutputKey::kM1PromptSuppressedReason, static_cast<int>(PromptSuppressedReason::kNone)}}); @@ -4704,8 +4674,7 @@ {StateKey::kM1AdMeasurementEnabledUserPrefValue, false}}, TestInput{{InputKey::kForceChromeBuild, true}}, TestOutput{ - {OutputKey::kPromptType, - static_cast<int>(PrivacySandboxService::PromptType::kNone)}, + {OutputKey::kPromptType, static_cast<int>(PromptType::kNone)}, {OutputKey::kM1AdMeasurementEnabled, false}, {OutputKey::kM1PromptSuppressedReason, static_cast<int>(PromptSuppressedReason::kNoticeShownToGuardian)}});
diff --git a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc index ac443eaf..0754745 100644 --- a/chrome/browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc +++ b/chrome/browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc
@@ -13,12 +13,12 @@ #include "base/test/bind.h" #include "base/test/metrics/histogram_tester.h" #include "chrome/browser/browsing_data/chrome_browsing_data_remover_constants.h" +#include "chrome/browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_mixin.h" #include "chrome/browser/privacy_sandbox/privacy_sandbox_settings_factory.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" -#include "chrome/test/base/in_process_browser_test.h" +#include "chrome/test/base/mixin_based_in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" -#include "components/privacy_sandbox/privacy_sandbox_attestations/scoped_privacy_sandbox_attestations.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "components/privacy_sandbox/privacy_sandbox_settings.h" #include "components/privacy_sandbox/privacy_sandbox_test_util.h" @@ -51,7 +51,8 @@ } // namespace -class PrivacySandboxSettingsBrowserTest : public InProcessBrowserTest { +class PrivacySandboxSettingsBrowserTest + : public MixinBasedInProcessBrowserTest { public: void SetUpOnMainThread() override { host_resolver()->AddRule("*", "127.0.0.1"); @@ -192,16 +193,6 @@ public: PrivacySandboxSettingsAttestationsBrowserTestBase() = default; - void SetUpOnMainThread() override { - // `PrivacySandboxAttestations` has a member of type - // `scoped_refptr<base::SequencedTaskRunner>`, its initialization must be - // done after a browser process is created. - PrivacySandboxSettingsBrowserTest::SetUpOnMainThread(); - scoped_attestations_ = - std::make_unique<privacy_sandbox::ScopedPrivacySandboxAttestations>( - privacy_sandbox::PrivacySandboxAttestations::CreateForTesting()); - } - content::test::FencedFrameTestHelper& fenced_frame_test_helper() { return fenced_frame_test_helper_; } @@ -292,8 +283,8 @@ } private: - std::unique_ptr<privacy_sandbox::ScopedPrivacySandboxAttestations> - scoped_attestations_; + privacy_sandbox::PrivacySandboxAttestationsMixin + privacy_sandbox_attestations_mixin_{&mixin_host_}; content::test::FencedFrameTestHelper fenced_frame_test_helper_; };
diff --git a/chrome/browser/privacy_sandbox/tracking_protection_notice_service.cc b/chrome/browser/privacy_sandbox/tracking_protection_notice_service.cc index 79791e7c..c034a5e1 100644 --- a/chrome/browser/privacy_sandbox/tracking_protection_notice_service.cc +++ b/chrome/browser/privacy_sandbox/tracking_protection_notice_service.cc
@@ -167,12 +167,12 @@ } base::Time shown_when = base::Time::Now(); - auto is_notice_shown = browser->window()->MaybeShowFeaturePromo( - feature_engagement::kIPHTrackingProtectionOnboardingFeature, - base::BindOnce(&TrackingProtectionNoticeService::OnNoticeClosed, - base::Unretained(this), shown_when, - browser->window()->GetFeaturePromoController())); - if (is_notice_shown) { + user_education::FeaturePromoParams params( + feature_engagement::kIPHTrackingProtectionOnboardingFeature); + params.close_callback = base::BindOnce( + &TrackingProtectionNoticeService::OnNoticeClosed, base::Unretained(this), + shown_when, browser->window()->GetFeaturePromoController()); + if (browser->window()->MaybeShowFeaturePromo(std::move(params))) { onboarding_service_->NoticeShown(); // TODO(b/302008359) Emit metrics } else {
diff --git a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc index 94b6515..bb6b415 100644 --- a/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc +++ b/chrome/browser/profiles/chrome_browser_main_extra_parts_profiles.cc
@@ -30,7 +30,6 @@ #include "chrome/browser/bluetooth/bluetooth_chooser_context_factory.h" #include "chrome/browser/bookmarks/bookmark_model_factory.h" #include "chrome/browser/breadcrumbs/breadcrumb_manager_keyed_service_factory.h" -#include "chrome/browser/browser_features.h" #include "chrome/browser/browsing_data/access_context_audit_service_factory.h" #include "chrome/browser/browsing_data/browsing_data_history_observer_service.h" #include "chrome/browser/browsing_data/chrome_browsing_data_lifetime_manager_factory.h" @@ -56,6 +55,7 @@ #include "chrome/browser/engagement/site_engagement_service_factory.h" #include "chrome/browser/enterprise/browser_management/management_service_factory.h" #include "chrome/browser/enterprise/identifiers/profile_id_service_factory.h" +#include "chrome/browser/enterprise/remote_commands/user_remote_commands_service_factory.h" #include "chrome/browser/enterprise/reporting/cloud_profile_reporting_service_factory.h" #include "chrome/browser/enterprise/reporting/legacy_tech/legacy_tech_service.h" #include "chrome/browser/enterprise/signin/enterprise_signin_service_factory.h" @@ -457,6 +457,7 @@ #include "chrome/browser/ui/tabs/organization/tab_organization_service_factory.h" #include "chrome/browser/usb/usb_connection_tracker_factory.h" #include "chrome/browser/user_notes/user_note_service_factory.h" +#include "components/manta/features.h" #endif #if BUILDFLAG(ENABLE_SCREEN_AI_SERVICE) @@ -702,6 +703,9 @@ DriveServiceFactory::GetInstance(); #endif enterprise::ProfileIdServiceFactory::GetInstance(); +#if !BUILDFLAG(IS_CHROMEOS_ASH) + enterprise_commands::UserRemoteCommandsServiceFactory::GetInstance(); +#endif #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) || \ BUILDFLAG(IS_CHROMEOS_ASH) enterprise_connectors::DeviceTrustConnectorServiceFactory::GetInstance(); @@ -797,7 +801,7 @@ ManagedConfigurationAPIFactory::GetInstance(); #endif #if !BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled(features::kMantaService)) { + if (manta::features::IsMantaServiceEnabled()) { manta::MantaServiceFactory::GetInstance(); } #endif
diff --git a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc index c662b203..ceb760a 100644 --- a/chrome/browser/resource_coordinator/tab_manager_browsertest.cc +++ b/chrome/browser/resource_coordinator/tab_manager_browsertest.cc
@@ -417,6 +417,8 @@ #if !BUILDFLAG(IS_CHROMEOS_ASH) // Makes sure that recently opened or used tabs are protected. +// These protections only apply on non-Ash desktop platforms. Check +// TabLifecycleUnit::CanDiscard for more details. IN_PROC_BROWSER_TEST_F(TabManagerTest, ProtectRecentlyUsedTabsFromUrgentDiscarding) { TabManager* tab_manager = g_browser_process->GetTabManager(); @@ -985,8 +987,15 @@ // On ChromeOS, active tabs are discarded if their window is non-visible. On // other platforms, they are never discarded. #if BUILDFLAG(IS_CHROMEOS_ASH) - EXPECT_TRUE( - IsTabDiscarded(browser()->tab_strip_model()->GetWebContentsAt(0))); + if (base::FeatureList::IsEnabled( + performance_manager::features:: + kAshUrgentDiscardingFromPerformanceManager)) { + EXPECT_FALSE( + IsTabDiscarded(browser()->tab_strip_model()->GetWebContentsAt(0))); + } else { + EXPECT_TRUE( + IsTabDiscarded(browser()->tab_strip_model()->GetWebContentsAt(0))); + } #else EXPECT_FALSE( IsTabDiscarded(browser()->tab_strip_model()->GetWebContentsAt(0)));
diff --git a/chrome/browser/resources/BUILD.gn b/chrome/browser/resources/BUILD.gn index 08ab8d94..a77c38f 100644 --- a/chrome/browser/resources/BUILD.gn +++ b/chrome/browser/resources/BUILD.gn
@@ -29,6 +29,7 @@ "app_service_internals:resources", "bookmarks:resources", "commander:resources", + "compose:resources", "downloads:resources", "feed:resources", "feedback:resources",
diff --git a/chrome/browser/resources/ash/settings/BUILD.gn b/chrome/browser/resources/ash/settings/BUILD.gn index c32695d..50ccd0f4 100644 --- a/chrome/browser/resources/ash/settings/BUILD.gn +++ b/chrome/browser/resources/ash/settings/BUILD.gn
@@ -257,6 +257,7 @@ "os_languages_page/os_japanese_manage_user_dictionary_page.ts", "os_languages_page/os_languages_page_v2.ts", "os_languages_page/os_languages_section.ts", + "os_people_page/account_manager_settings_card.ts", "os_people_page/account_manager_subpage.ts", "os_people_page/add_user_dialog.ts", "os_people_page/fingerprint_list_subpage.ts",
diff --git a/chrome/browser/resources/ash/settings/device_page/device_page.html b/chrome/browser/resources/ash/settings/device_page/device_page.html index b8369e11..6f7e2d6 100644 --- a/chrome/browser/resources/ash/settings/device_page/device_page.html +++ b/chrome/browser/resources/ash/settings/device_page/device_page.html
@@ -212,6 +212,7 @@ <span>$i18n{keyboardRemapRestoreDefaultsLabel}</span> </cr-button> <settings-per-device-keyboard-remap-keys keyboards="[[keyboards]]" + keyboard-policies="[[keyboardPolicies]]" id="remap-keys"> </settings-per-device-keyboard-remap-keys> </os-settings-subpage>
diff --git a/chrome/browser/resources/ash/settings/device_page/input_device_settings_types.ts b/chrome/browser/resources/ash/settings/device_page/input_device_settings_types.ts index 8d5fca3..b32b633 100644 --- a/chrome/browser/resources/ash/settings/device_page/input_device_settings_types.ts +++ b/chrome/browser/resources/ash/settings/device_page/input_device_settings_types.ts
@@ -104,6 +104,10 @@ export type InputDeviceSettingsPolicy = InputDeviceSettingsTypes.InputDeviceSettingsPolicy; + +export type InputDeviceSettingsFkeyPolicy = + InputDeviceSettingsTypes.InputDeviceSettingsFkeyPolicy; + export type KeyboardPolicies = InputDeviceSettingsTypes.KeyboardPolicies; export type MousePolicies = InputDeviceSettingsTypes.MousePolicies;
diff --git a/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_remap_keys.ts b/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_remap_keys.ts index 9b8a94d..fe29dc1 100644 --- a/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_remap_keys.ts +++ b/chrome/browser/resources/ash/settings/device_page/per_device_keyboard_remap_keys.ts
@@ -27,9 +27,36 @@ import {Route, Router, routes} from '../router.js'; import {getInputDeviceSettingsProvider} from './input_device_mojo_interface_provider.js'; -import {ExtendedFkeysModifier, InputDeviceSettingsProviderInterface, Keyboard, MetaKey, ModifierKey, SixPackKey, SixPackKeyInfo, SixPackShortcutModifier} from './input_device_settings_types.js'; +import {ExtendedFkeysModifier, InputDeviceSettingsFkeyPolicy, InputDeviceSettingsProviderInterface, Keyboard, KeyboardPolicies, MetaKey, ModifierKey, PolicyStatus, SixPackKey, SixPackKeyInfo, SixPackShortcutModifier} from './input_device_settings_types.js'; import {getTemplate} from './per_device_keyboard_remap_keys.html.js'; +interface FkeyPrefPolicyFields { + controlledBy?: chrome.settingsPrivate.ControlledBy; + enforcement?: chrome.settingsPrivate.Enforcement; + recommendedValue?: ExtendedFkeysModifier; +} + +function getFkeyPrefPolicyFields(policy?: InputDeviceSettingsFkeyPolicy): + FkeyPrefPolicyFields { + if (policy) { + const enforcement = policy.policyStatus === PolicyStatus.kManaged ? + chrome.settingsPrivate.Enforcement.ENFORCED : + chrome.settingsPrivate.Enforcement.RECOMMENDED; + return { + controlledBy: chrome.settingsPrivate.ControlledBy.USER_POLICY, + enforcement, + recommendedValue: policy.value, + }; + } + // These fields must be set back to undefined so the html badge is properly + // removed from the UI. + return { + controlledBy: undefined, + enforcement: undefined, + recommendedValue: undefined, + }; +} + const SettingsPerDeviceKeyboardRemapKeysElementBase = RouteObserverMixin(I18nMixin(PolymerElement)) as { new (): PolymerElement & I18nMixinInterface & RouteObserverMixinInterface, @@ -273,6 +300,10 @@ }, readOnly: true, }, + + keyboardPolicies: { + type: Object, + }, }; } @@ -294,6 +325,7 @@ 'f12KeyPref.value,' + 'fakeCapsLockPref.value)', 'onKeyboardListUpdated(keyboards.*)', + 'onPoliciesChanged(keyboardPolicies)', ]; } @@ -302,6 +334,7 @@ } keyboard: Keyboard; + protected keyboardPolicies: KeyboardPolicies; isAltClickAndSixPackCustomizationEnabled: boolean; areF11andF12KeyShortcutsEnabled: boolean; private keyboards: Keyboard[]; @@ -399,6 +432,14 @@ if (this.shouldShowFkeys()) { this.set('f11KeyPref.value', searchedKeyboard.settings?.f11); this.set('f12KeyPref.value', searchedKeyboard.settings?.f12); + this.f11KeyPref = { + ...this.f11KeyPref, + ...getFkeyPrefPolicyFields(this.keyboardPolicies.extendedFkeysPolicy), + }; + this.f12KeyPref = { + ...this.f12KeyPref, + ...getFkeyPrefPolicyFields(this.keyboardPolicies.extendedFkeysPolicy), + }; } this.isInitialized = true; @@ -615,8 +656,21 @@ protected shouldShowFkeys(): boolean { return this.areF11andF12KeyShortcutsEnabled && - (this.keyboard.settings?.f11 != null && - this.keyboard.settings?.f12 != null); + (this.keyboard?.settings?.f11 != null && + this.keyboard?.settings?.f12 != null); + } + + private onPoliciesChanged(): void { + if (this.shouldShowFkeys()) { + this.f11KeyPref = { + ...this.f11KeyPref, + ...getFkeyPrefPolicyFields(this.keyboardPolicies.extendedFkeysPolicy), + }; + this.f12KeyPref = { + ...this.f12KeyPref, + ...getFkeyPrefPolicyFields(this.keyboardPolicies.extendedFkeysPolicy), + }; + } } }
diff --git a/chrome/browser/resources/ash/settings/internet_page/hotspot_subpage.ts b/chrome/browser/resources/ash/settings/internet_page/hotspot_subpage.ts index cc0e824..4e0a20b 100644 --- a/chrome/browser/resources/ash/settings/internet_page/hotspot_subpage.ts +++ b/chrome/browser/resources/ash/settings/internet_page/hotspot_subpage.ts
@@ -119,8 +119,7 @@ if (this.hotspotInfo.allowStatus !== HotspotAllowStatus.kAllowed) { return true; } - return this.hotspotInfo.state === HotspotState.kEnabling || - this.hotspotInfo.state === HotspotState.kDisabling; + return this.hotspotInfo.state === HotspotState.kDisabling; } private getOnOffString_(): string {
diff --git a/chrome/browser/resources/ash/settings/os_people_page/account_manager_settings_card.html b/chrome/browser/resources/ash/settings/os_people_page/account_manager_settings_card.html new file mode 100644 index 0000000..deb6701 --- /dev/null +++ b/chrome/browser/resources/ash/settings/os_people_page/account_manager_settings_card.html
@@ -0,0 +1,128 @@ +<style include="settings-shared"> + .account-manager-description { + color: var(--cr-secondary-text-color); + display: block; + max-width: 560px; + padding-top: 8px; + padding-bottom: 8px; + } + + .account-manager-description.full-width { + max-width: none; + } + + .profile-icon { + --profile-icon-size: 40px; + background: center / cover no-repeat; + border-radius: 50%; + flex-shrink: 0; + height: var(--profile-icon-size); + width: var(--profile-icon-size); + } + + .profile-icon.device-account-icon { + --profile-icon-size: 60px; + margin-top: 8px; + } + + .device-account-container { + align-items: center; + display: flex; + flex-direction: column; + margin-bottom: 16px; + } + + .device-account-container .primary { + font-weight: 500; + margin-top: 8px; + } + + .managed-badge { + --badge-offset: calc(100% - var(--badge-size) + - 2 * var(--padding-size)); + --badge-size: 10px; + --padding-size: 4px; + background: var(--cros-icon-color-prominent); + border-radius: 50%; + height: var(--badge-size); + left: var(--badge-offset); + padding: var(--padding-size); + position: relative; + top: var(--badge-offset); + width: var(--badge-size); + } + + .managed-badge > iron-icon { + --iron-icon-fill-color: var(--cros-bg-color-elevation-1); + --iron-icon-height: var(--badge-size); + --iron-icon-width: var(--badge-size); + display: block; + } + + .managed-message { + color: var(--cr-secondary-text-color); + justify-content: center; + margin-top: 16px; + } + + .managed-message > iron-icon, + .managed-message > cr-icon-button { + margin-inline-end: 5px; + } + + :host-context([dir='rtl']) .managed-badge { + left: auto; + right: var(--badge-offset); + } +</style> + +<settings-card header-text="$i18n{accountManagerPageTitle}"> + <div class="settings-box first account-manager-description full-width"> + <localized-link + localized-string="[[getAccountManagerDescription_()]]" + link-url="$i18nRaw{accountManagerLearnMoreUrl}"> + </localized-link> + </div> + + <!-- Managed account badge and message --> + <template is="dom-if" if="[[isDeviceAccountManaged_]]"> + <div class="settings-box managed-message"> + <template is="dom-if" if="[[!isChildUser_]]"> + <iron-icon icon="cr20:domain"></iron-icon> + </template> + <template is="dom-if" if="[[isChildUser_]]"> + <cr-icon-button iron-icon="cr20:kite" + on-click="onManagedIconClick_"> + </cr-icon-button> + </template> + <localized-link + localized-string= + "[[getManagementDescription_(isChildUser_, deviceAccount_)]]" + link-url="$i18nRaw{accountManagerChromeUIManagementURL}"> + </localized-link> + </div> + </template> + + <!-- Primary account icon, name and email --> + <div class="device-account-container hr" + aria-labelledby="deviceAccountFullName" + aria-describedby="deviceAccountEmail"> + <div class="profile-icon device-account-icon" + aria-hidden="true" + style="background-image: [[getIconImageSet_(deviceAccount_.pic)]]"> + <template is="dom-if" + if="[[shouldShowManagedBadge_(isDeviceAccountManaged_, + isChildUser_)]]"> + <div class="managed-badge"> + <iron-icon icon="cr:work"></iron-icon> + </div> + </template> + </div> + <span id="deviceAccountFullName" class="primary" aria-hidden="true"> + [[deviceAccount_.fullName]] + </span> + <span id="deviceAccountEmail" class="secondary" aria-hidden="true"> + [[deviceAccount_.email]] + </span> + </div> +</settings-card>
diff --git a/chrome/browser/resources/ash/settings/os_people_page/account_manager_settings_card.ts b/chrome/browser/resources/ash/settings/os_people_page/account_manager_settings_card.ts new file mode 100644 index 0000000..e742042 --- /dev/null +++ b/chrome/browser/resources/ash/settings/os_people_page/account_manager_settings_card.ts
@@ -0,0 +1,166 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +/** + * @fileoverview + * 'account-manager-settings-card' is the card element containing the account + * information. + */ + +import '../os_settings_page/settings_card.js'; +import '../settings_shared.css.js'; +import 'chrome://resources/cr_components/localized_link/localized_link.js'; +import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js'; +import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js'; + +import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; +import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {getImage} from 'chrome://resources/js/icon.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {assertExists} from '../assert_extras.js'; +import {isChild} from '../common/load_time_booleans.js'; + +import {Account, AccountManagerBrowserProxy, AccountManagerBrowserProxyImpl} from './account_manager_browser_proxy.js'; +import {getTemplate} from './account_manager_settings_card.html.js'; + +const AccountManagerSettingsCardElementBase = + WebUiListenerMixin(I18nMixin(PolymerElement)); + +export class AccountManagerSettingsCardElement extends + AccountManagerSettingsCardElementBase { + static get is() { + return 'account-manager-settings-card' as const; + } + + static get template() { + return getTemplate(); + } + + static get properties() { + return { + /** + * Primary / Device account. + */ + deviceAccount_: Object, + + isChildUser_: { + type: Boolean, + value() { + return isChild(); + }, + readOnly: true, + }, + + isDeviceAccountManaged_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('isDeviceAccountManaged'); + }, + readOnly: true, + }, + + /** + * True if secondary account sign-ins are allowed, false otherwise. + */ + isSecondaryGoogleAccountSigninAllowed_: { + type: Boolean, + value() { + return loadTimeData.getBoolean('secondaryGoogleAccountSigninAllowed'); + }, + readOnly: true, + }, + + }; + } + + private browserProxy_: AccountManagerBrowserProxy; + private deviceAccount_: Account|null; + private isChildUser_: boolean; + private isDeviceAccountManaged_: boolean; + private isSecondaryGoogleAccountSigninAllowed_: boolean; + + constructor() { + super(); + + this.browserProxy_ = AccountManagerBrowserProxyImpl.getInstance(); + } + + override connectedCallback(): void { + super.connectedCallback(); + + this.addWebUiListener('accounts-changed', this.refreshAccounts_.bind(this)); + } + + override ready(): void { + super.ready(); + this.refreshAccounts_(); + } + + private async refreshAccounts_(): Promise<void> { + const accounts = await this.browserProxy_.getAccounts(); + this.set('accounts_', accounts); + const deviceAccount = accounts.find(account => account.isDeviceAccount); + if (!deviceAccount) { + console.error('Cannot find device account.'); + return; + } + this.deviceAccount_ = deviceAccount; + } + + private getAccountManagerDescription_(): string { + if (this.isChildUser_ && this.isSecondaryGoogleAccountSigninAllowed_) { + return this.i18n('accountManagerChildDescription'); + } + return this.i18n('accountManagerDescription'); + } + + private getManagementDescription_(): string { + if (this.isChildUser_) { + return this.i18n('accountManagerManagementDescription'); + } + if (!this.deviceAccount_) { + return ''; + } + assertExists(this.deviceAccount_.organization); + if (!this.deviceAccount_.organization) { + if (this.isDeviceAccountManaged_) { + console.error( + 'The device account is managed, but the organization is not set.'); + } + return ''; + } + // Format: 'This account is managed by + // <a target="_blank" href="chrome://management">google.com</a>'. + // Where href will be set by <localized-link>. + return this.i18n( + 'accountManagerManagementDescription', + this.deviceAccount_.organization); + } + + /** + * @return true if managed badge should be shown next to the device + * account picture. + */ + private shouldShowManagedBadge_(): boolean { + return this.isDeviceAccountManaged_ && !this.isChildUser_; + } + + /** + * @return a CSS image-set for multiple scale factors. + */ + private getIconImageSet_(iconUrl: string): string { + return getImage(iconUrl); + } +} + +declare global { + interface HTMLElementTagNameMap { + [AccountManagerSettingsCardElement.is]: AccountManagerSettingsCardElement; + } +} + +customElements.define( + AccountManagerSettingsCardElement.is, AccountManagerSettingsCardElement);
diff --git a/chrome/browser/resources/ash/settings/os_people_page/os_people_page.html b/chrome/browser/resources/ash/settings/os_people_page/os_people_page.html index 496b484..b54ff34 100644 --- a/chrome/browser/resources/ash/settings/os_people_page/os_people_page.html +++ b/chrome/browser/resources/ash/settings/os_people_page/os_people_page.html
@@ -40,74 +40,86 @@ width: 40px; } </style> -<os-settings-animated-pages id="pages" section="[[section_]]"> - <div route-path="default"> - <settings-card header-text="$i18n{osPeoplePageTitle}"> - <div class="settings-box first two-line"> - <template is="dom-if" if="[[syncStatus]]"> - <!-- Does not use <cr-link-row> due to custom aria label. --> - <div id="profile-icon" - style="background-image: [[getIconImageSet_(profileIconUrl_)]]" - on-click="onAccountManagerClick_" - actionable$="[[isAccountManagerEnabled_]]"> - </div> - <div class="middle two-line no-min-width" - id="profile-row" - on-click="onAccountManagerClick_" - actionable$="[[isAccountManagerEnabled_]]"> - <div class="flex text-elide settings-box-text"> - <span id="profile-name" aria-hidden="true"> - [[getProfileName_(profileName_)]] - </span> - <div id="profile-label" class="secondary" - aria-hidden="true"> - [[profileLabel_]] - </div> - </div> - <cr-icon-button class="subpage-arrow" - hidden="[[!isAccountManagerEnabled_]]" - id="accountManagerSubpageTrigger" - aria-label="$i18n{accountManagerSubMenuLabel}" - aria-describedby="profile-name profile-label" - aria-roledescription="$i18n{subpageArrowRoleDescription}"> - </cr-icon-button> - </div> - </template> - </div> - <cr-link-row id="syncSetupRow" - start-icon="cr:sync" - label="$i18n{syncAndNonPersonalizedServices}" - sub-label="[[getSyncAndGoogleServicesSubtext_(syncStatus)]]" - on-click="onSyncClick_" - role-description="$i18n{subpageArrowRoleDescription}"> - </cr-link-row> - <template is="dom-if" if="[[showParentalControls_]]"> - <settings-parental-controls-page> - </settings-parental-controls-page> - </template> - </settings-card> - </div> - <template is="dom-if" route-path="/osSyncSetup"> - <os-settings-subpage - page-title="$i18n{syncPageTitle}" - learn-more-url="$i18n{syncAndGoogleServicesLearnMoreURL}"> - <os-settings-sync-subpage - sync-status="[[syncStatus]]" prefs="{{prefs}}"> - </os-settings-sync-subpage> - </os-settings-subpage> +<os-settings-animated-pages id="pages" section="[[section_]]"> + <!-- Show settings card is RavampWayfinding is enabled. --> + <template is="dom-if" if="[[isRevampWayfindingEnabled_]]"> + <div route-path="default"> + <account-manager-settings-card + prefs="{{prefs}}"> + </account-manager-settings-card> + </div> </template> - <template is="dom-if" route-path="/osSync"> - <os-settings-subpage page-title="[[getSyncAdvancedTitle_()]]" - learn-more-url="$i18n{syncAndGoogleServicesLearnMoreURL}"> - <os-sync-controls-subpage> - </os-sync-controls-subpage> - </os-settings-subpage> - </template> - <template is="dom-if" route-path="/accountManager"> - <os-settings-subpage page-title="$i18n{accountManagerPageTitle}"> - <settings-account-manager-subpage prefs="[[prefs]]"> - </settings-account-manager-subpage> - </os-settings-subpage> + + <template is="dom-if" if="[[!isRevampWayfindingEnabled_]]"> + <div route-path="default"> + <settings-card header-text="$i18n{osPeoplePageTitle}"> + <div class="settings-box first two-line"> + <template is="dom-if" if="[[syncStatus]]"> + <!-- Does not use <cr-link-row> due to custom aria label. --> + <div id="profile-icon" + style="background-image: [[getIconImageSet_(profileIconUrl_)]]" + on-click="onAccountManagerClick_" + actionable$="[[isAccountManagerEnabled_]]"> + </div> + <div class="middle two-line no-min-width" + id="profile-row" + on-click="onAccountManagerClick_" + actionable$="[[isAccountManagerEnabled_]]"> + <div class="flex text-elide settings-box-text"> + <span id="profile-name" aria-hidden="true"> + [[getProfileName_(profileName_)]] + </span> + <div id="profile-label" class="secondary" + aria-hidden="true"> + [[profileLabel_]] + </div> + </div> + <cr-icon-button class="subpage-arrow" + hidden="[[!isAccountManagerEnabled_]]" + id="accountManagerSubpageTrigger" + aria-label="$i18n{accountManagerSubMenuLabel}" + aria-describedby="profile-name profile-label" + aria-roledescription="$i18n{subpageArrowRoleDescription}"> + </cr-icon-button> + </div> + </template> + </div> + <cr-link-row id="syncSetupRow" + start-icon="cr:sync" + label="$i18n{syncAndNonPersonalizedServices}" + sub-label="[[getSyncAndGoogleServicesSubtext_(syncStatus)]]" + on-click="onSyncClick_" + role-description="$i18n{subpageArrowRoleDescription}"> + </cr-link-row> + <template is="dom-if" if="[[showParentalControls_]]"> + <settings-parental-controls-page> + </settings-parental-controls-page> + </template> + </settings-card> + </div> + + <template is="dom-if" route-path="/osSyncSetup"> + <os-settings-subpage + page-title="$i18n{syncPageTitle}" + learn-more-url="$i18n{syncAndGoogleServicesLearnMoreURL}"> + <os-settings-sync-subpage + sync-status="[[syncStatus]]" prefs="{{prefs}}"> + </os-settings-sync-subpage> + </os-settings-subpage> + </template> + <template is="dom-if" route-path="/osSync"> + <os-settings-subpage page-title="[[getSyncAdvancedTitle_()]]" + learn-more-url="$i18n{syncAndGoogleServicesLearnMoreURL}"> + <os-sync-controls-subpage> + </os-sync-controls-subpage> + </os-settings-subpage> + </template> + <template is="dom-if" route-path="/accountManager"> + <os-settings-subpage page-title="$i18n{accountManagerPageTitle}"> + <settings-account-manager-subpage prefs="[[prefs]]"> + </settings-account-manager-subpage> + </os-settings-subpage> + </template> </template> </os-settings-animated-pages>
diff --git a/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts b/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts index 83112af9..b7f22e4 100644 --- a/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts +++ b/chrome/browser/resources/ash/settings/os_people_page/os_people_page.ts
@@ -18,6 +18,7 @@ import '../os_settings_page/os_settings_subpage.js'; import '../os_settings_page/settings_card.js'; import '../parental_controls_page/parental_controls_page.js'; +import './account_manager_settings_card.js'; import {ProfileInfo, ProfileInfoBrowserProxyImpl} from '/shared/settings/people_page/profile_info_browser_proxy.js'; import {SyncBrowserProxy, SyncBrowserProxyImpl, SyncStatus} from '/shared/settings/people_page/sync_browser_proxy.js'; @@ -27,7 +28,7 @@ import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {afterNextRender, flush, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {isAccountManagerEnabled} from '../common/load_time_booleans.js'; +import {isAccountManagerEnabled, isRevampWayfindingEnabled} from '../common/load_time_booleans.js'; import {DeepLinkingMixin} from '../deep_linking_mixin.js'; import {LockStateMixin} from '../lock_state_mixin.js'; import {Section} from '../mojom-webui/routes.mojom-webui.js'; @@ -100,6 +101,14 @@ readOnly: true, }, + isRevampWayfindingEnabled_: { + type: Boolean, + value: () => { + return isRevampWayfindingEnabled(); + }, + readOnly: true, + }, + showParentalControls_: { type: Boolean, value() { @@ -151,6 +160,7 @@ private profileLabel_: string; private fingerprintUnlockEnabled_: boolean; private isAccountManagerEnabled_: boolean; + private isRevampWayfindingEnabled_: boolean; private showParentalControls_: boolean; private section_: Section; private showPasswordPromptDialog_: boolean;
diff --git a/chrome/browser/resources/ash/settings/os_settings.ts b/chrome/browser/resources/ash/settings/os_settings.ts index 8b9b610..d0363b3 100644 --- a/chrome/browser/resources/ash/settings/os_settings.ts +++ b/chrome/browser/resources/ash/settings/os_settings.ts
@@ -206,6 +206,7 @@ export {ConfirmationDialogType, SettingsGoogleDriveSubpageElement} from './os_files_page/google_drive_subpage.js'; export {OneDriveBrowserProxy, OneDrivePageCallbackRouter, OneDrivePageHandlerRemote, OneDrivePageRemote} from './os_files_page/one_drive_browser_proxy.js'; export {createPageAvailability as createPageAvailabilityForTesting, OsPageAvailability} from './os_page_availability.js'; +export {AccountManagerSettingsCardElement} from './os_people_page/account_manager_settings_card.js'; export {OsSettingsPeoplePageElement} from './os_people_page/os_people_page.js'; export {MetricsConsentBrowserProxy, MetricsConsentBrowserProxyImpl, MetricsConsentState} from './os_privacy_page/metrics_consent_browser_proxy.js'; export {OsSettingsPrivacyPageElement} from './os_privacy_page/os_privacy_page.js';
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html index a0ec95e..8db1a5b 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html +++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.html
@@ -11,24 +11,21 @@ <h1 slot="title"> [[i18nDynamic(locale, 'networkSectionTitle')]] </h1> - <div slot="subtitle" hidden$="[[isDemoModeSetup]]"> - [[i18nDynamic(locale, 'networkSectionHint')]] - </div> - <div slot="subtitle" id="errorSubtitleText" hidden$="[[!errorMessage_]]"> - [[errorMessage_]] + <div slot="subtitle" id="subtitleText"> + [[getSubtitleMessage_(locale, errorMessage_)]] </div> <div slot="content" class="layout vertical"> <network-select-login id="networkSelectLogin" enable-wifi-scans="[[enableWifiScans_]]" - on-selected-network-connected="onNetworkConnected_" + on-selected-network-connected="onContinue_" is-network-connected="{{isConnected_}}"> </network-select-login> </div> <div slot="back-navigation"> - <oobe-back-button id="backButton" - on-click="onBackClicked_"></oobe-back-button> + <oobe-back-button id="backButton" on-click="onBackClicked_"> + </oobe-back-button> </div> - <div slot="bottom-buttons" class="flex layout horizontal"> + <div slot="bottom-buttons" class="flex layout horizontal end-justified"> <quick-start-entry-point id="quick-start-network-button" on-click="onQuickStartClicked_" @@ -38,8 +35,7 @@ <oobe-next-button id="nextButton" disabled="[[!isConnected_]]" - on-click="onNextClicked_" - > + on-click="onContinue_"> </oobe-next-button> </div> </oobe-adaptive-dialog>
diff --git a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js index 008c566..d83303b 100644 --- a/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js +++ b/chrome/browser/resources/chromeos/login/screens/oobe/oobe_network.js
@@ -59,17 +59,6 @@ static get properties() { return { /** - * Whether network dialog is shown as a part of demo mode setup flow. - * Additional custom elements can be displayed on network list in demo - * mode setup. - * @type {boolean} - */ - isDemoModeSetup: { - type: Boolean, - value: false, - }, - - /** * Network error message. * @type {string} * @private @@ -124,10 +113,6 @@ /** Called when dialog is shown. */ onBeforeShow(data) { - var isDemoModeSetupKey = 'isDemoModeSetup'; - var isDemoModeSetup = - data && isDemoModeSetupKey in data && data[isDemoModeSetupKey]; - this.isDemoModeSetup = isDemoModeSetup; this.enableWifiScans_ = true; this.errorMessage_ = ''; this.$.networkSelectLogin.onBeforeShow(); @@ -162,6 +147,20 @@ } /** + * Returns subtitle of the network dialog. + * @param {string} locale + * @param {string} errorMessage + * @return {string} + * @private + */ + getSubtitleMessage_(locale, errorMessage) { + if (errorMessage) { + return errorMessage; + } + return this.i18n('networkSectionSubtitle'); + } + + /** * Sets the network error message. * @param {string} message Message to be shown. */ @@ -216,19 +215,11 @@ } /** - * Next button click handler. - * @private - */ - onNextClicked_() { - chrome.send('login.NetworkScreen.userActed', ['continue']); - } - - /** * Quick start button click handler. * @private */ onQuickStartClicked_() { - chrome.send('login.NetworkScreen.userActed', ['activateQuickStart']); + this.userActed('activateQuickStart'); } /** @@ -236,15 +227,17 @@ * @private */ onBackClicked_() { - chrome.send('login.NetworkScreen.userActed', ['back']); + this.userActed('back'); } /** - * This is called when network setup is done. + * Called when the network setup is completed. Either by clicking on + * already connected network in the list or by directly clicking on the + * next button in the bottom of the screen. * @private */ - onNetworkConnected_() { - chrome.send('login.NetworkScreen.userActed', ['continue']); + onContinue_() { + this.userActed('continue'); } }
diff --git a/chrome/browser/resources/compose/BUILD.gn b/chrome/browser/resources/compose/BUILD.gn new file mode 100644 index 0000000..3803838 --- /dev/null +++ b/chrome/browser/resources/compose/BUILD.gn
@@ -0,0 +1,12 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//ui/webui/resources/tools/build_webui.gni") + +build_webui("build") { + grd_prefix = "compose" + static_files = [ "compose.html" ] + web_component_files = [ "app.ts" ] + ts_deps = [ "//third_party/polymer/v3_0:library" ] +}
diff --git a/chrome/browser/resources/compose/DIR_METADATA b/chrome/browser/resources/compose/DIR_METADATA new file mode 100644 index 0000000..71922be --- /dev/null +++ b/chrome/browser/resources/compose/DIR_METADATA
@@ -0,0 +1 @@ +mixins: "//components/compose/COMMON_METADATA"
diff --git a/chrome/browser/resources/compose/OWNERS b/chrome/browser/resources/compose/OWNERS new file mode 100644 index 0000000..48a4b667 --- /dev/null +++ b/chrome/browser/resources/compose/OWNERS
@@ -0,0 +1 @@ +file://components/compose/OWNERS
diff --git a/chrome/browser/resources/compose/app.html b/chrome/browser/resources/compose/app.html new file mode 100644 index 0000000..b80f0bd --- /dev/null +++ b/chrome/browser/resources/compose/app.html
@@ -0,0 +1 @@ +app
diff --git a/chrome/browser/resources/compose/app.ts b/chrome/browser/resources/compose/app.ts new file mode 100644 index 0000000..4522ce19 --- /dev/null +++ b/chrome/browser/resources/compose/app.ts
@@ -0,0 +1,25 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './app.html.js'; + +export class ComposeAppElement extends PolymerElement { + static get is() { + return 'compose-app'; + } + + static get template() { + return getTemplate(); + } +} + +declare global { + interface HTMLElementTagNameMap { + 'compose-app': ComposeAppElement; + } +} + +customElements.define(ComposeAppElement.is, ComposeAppElement);
diff --git a/chrome/browser/resources/compose/compose.html b/chrome/browser/resources/compose/compose.html new file mode 100644 index 0000000..a6468e8 --- /dev/null +++ b/chrome/browser/resources/compose/compose.html
@@ -0,0 +1,13 @@ +<!DOCTYPE html> +<html dir="$i18n{textdirection}" lang="$i18n{language}" + $i18n{chromeRefresh2023Attribute}> + <head> + <meta charset="utf-8"> + <title>Compose</title> + <link rel="stylesheet" href="chrome://resources/css/text_defaults_md.css"> + </head> + <body> + <script type="module" src="app.js"></script> + <compose-app></compose-app> + </body> +</html>
diff --git a/chrome/browser/resources/nearby_internals/cross_device_internals.js b/chrome/browser/resources/nearby_internals/cross_device_internals.js index cf9e769..583baee6 100644 --- a/chrome/browser/resources/nearby_internals/cross_device_internals.js +++ b/chrome/browser/resources/nearby_internals/cross_device_internals.js
@@ -362,11 +362,11 @@ let blob; if (filtered) { blob = new Blob( - this.filteredLogList_.map(logToSavedString_).reverse(), + this.filteredLogList_.map(logToSavedString_), {type: 'text/plain;charset=utf-8'}); } else { blob = new Blob( - this.logList_.map(logToSavedString_).reverse(), + this.logList_.map(logToSavedString_), {type: 'text/plain;charset=utf-8'}); } const url = URL.createObjectURL(blob);
diff --git a/chrome/browser/resources/nearby_internals/shared_style.css b/chrome/browser/resources/nearby_internals/shared_style.css index 0237dc2..f3e58cdf 100644 --- a/chrome/browser/resources/nearby_internals/shared_style.css +++ b/chrome/browser/resources/nearby_internals/shared_style.css
@@ -31,7 +31,7 @@ height: 100%; margin: 0; padding: 0; - overflow: hidden; + overflow: scroll; font-family: "Roboto", sans-serif; display: flex; flex-direction: row; @@ -76,6 +76,8 @@ display: flex; flex-direction: column; height: 100%; + min-width: 550px; + overflow-x: scroll; } .logo { @@ -84,9 +86,11 @@ } .controls-panel { - padding: 40px; + padding: 20px; padding-top: 10px; padding-bottom: 10px; + min-width: 500px; + overflow-x: scroll; } .control { @@ -122,10 +126,11 @@ #logsPanel { width: 60%; height: 100%; - overflow: hidden; + overflow: scroll; display: flex; flex-direction: column; border-left: 1px solid rgba(0,0,0,0.12); + min-width: 450px; } #devicesSection {
diff --git a/chrome/browser/resources/search_engine_choice/app.html b/chrome/browser/resources/search_engine_choice/app.html index 9fecbdc..c2640ba 100644 --- a/chrome/browser/resources/search_engine_choice/app.html +++ b/chrome/browser/resources/search_engine_choice/app.html
@@ -134,7 +134,7 @@ } .choice-title { - font-family: Roboto; + font-family: Roboto, Arial; font-size: 0.875rem; font-weight: 400; line-height: 20px; @@ -199,7 +199,7 @@ } cr-dialog p { - font-family: Roboto; + font-family: Roboto, Arial; font-size: 0.875rem; font-weight: 400; line-height: 20px;
diff --git a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts index 577c937d..0d9387d 100644 --- a/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts +++ b/chrome/browser/resources/settings/site_settings_page/site_settings_page.ts
@@ -41,11 +41,9 @@ if (categoryItemMap !== null) { return categoryItemMap; } - const is3pcdRedesignEnabled = - loadTimeData.getBoolean('is3pcdCookieSettingsRedesignEnabled'); // The following list is ordered alphabetically by |id|. The order in which // these appear in the UI is determined elsewhere in this file. - const categoryList = [ + const categoryList: CategoryListItem[] = [ { route: routes.SITE_SETTINGS_ADS, id: Id.ADS, @@ -137,20 +135,6 @@ disabledLabel: 'siteSettingsClipboardBlocked', }, { - route: routes.COOKIES, - id: Id.COOKIES, - label: is3pcdRedesignEnabled ? - 'trackingProtectionLinkRowLabel' : - (loadTimeData.getBoolean('isPrivacySandboxSettings4') ? - 'thirdPartyCookiesLinkRowLabel' : - 'siteSettingsCookies'), - icon: is3pcdRedesignEnabled ? 'settings:visibility-off' : - 'settings:cookie', - enabledLabel: 'siteSettingsCookiesAllowed', - disabledLabel: 'siteSettingsBlocked', - otherLabel: 'cookiePageClearOnExit', - }, - { route: routes.SITE_SETTINGS_LOCATION, id: Id.GEOLOCATION, label: 'siteSettingsLocation', @@ -360,7 +344,29 @@ icon: 'settings:zoom-in', }, ]; - + if (loadTimeData.getBoolean('is3pcdCookieSettingsRedesignEnabled')) { + categoryList.push({ + route: routes.TRACKING_PROTECTION, + id: Id.COOKIES, + label: 'trackingProtectionLinkRowLabel', + icon: 'settings:visibility-off', + enabledLabel: 'siteSettingsCookiesAllowed', + disabledLabel: 'siteSettingsBlocked', + otherLabel: 'cookiePageClearOnExit', + }); + } else { + categoryList.push({ + route: routes.COOKIES, + id: Id.COOKIES, + label: + (loadTimeData.getBoolean('isPrivacySandboxSettings4') ? + 'thirdPartyCookiesLinkRowLabel' : + 'siteSettingsCookies'), + icon: 'settings:cookie', + enabledLabel: 'trackingProtectionLinkRowSubLabel', + disabledLabel: 'trackingProtectionLinkRowSubLabel', + }); + } categoryItemMap = new Map(categoryList.map(item => [item.id, item])); return categoryItemMap; }
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts index 64996c4..b3c90b9 100644 --- a/chrome/browser/resources/side_panel/read_anything/app.ts +++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -333,8 +333,10 @@ loadTimeData.getString('readAnythingLoadingMessage'); this.emptyStateSubheading_ = ''; this.hasContent_ = false; - this.synth.cancel(); - this.onSpeechStopped(); + if (this.isReadAloudEnabled_) { + this.synth.cancel(); + this.onSpeechStopped(); + } } // TODO(crbug.com/1474951): Handle focus changes for speech, including
diff --git a/chrome/browser/resources/side_panel/read_anything/icons.html b/chrome/browser/resources/side_panel/read_anything/icons.html index de5b0d3..6af9f45 100644 --- a/chrome/browser/resources/side_panel/read_anything/icons.html +++ b/chrome/browser/resources/side_panel/read_anything/icons.html
@@ -10,6 +10,12 @@ <g id="font-size-decrease" viewBox="0 0 10 2"> <path d="M0.733334 1.7V0.299999H9.26667V1.7H0.733334Z"></path> </g> + <g id="font-size-increase-old" viewBox="0 0 14 8"> + <path d="M0.383333 8L3.46667 -9.53674e-07H5.06667L8.13333 8H6.53333L5.83333 6.01667H2.66667L1.93333 8H0.383333ZM3.08333 4.8H5.4L4.28333 1.58333H4.21667L3.08333 4.8ZM10.3833 6.46667V4.66667H8.58333V3.33333H10.3833V1.53333H11.7V3.33333H13.5V4.66667H11.7V6.46667H10.3833Z"></path> + </g> + <g id="font-size-decrease-old" viewBox="0 0 14 8"> + <path d="M0.383333 8L3.46667 -9.53674e-07H5.06667L8.13333 8H6.53333L5.83333 6.01667H2.66667L1.93333 8H0.383333ZM3.08333 4.8H5.4L4.28333 1.58333H4.21667L3.08333 4.8ZM8.61667 4.66667V3.33333H13.5V4.66667H8.61667Z"></path> + </g> <g id="font"> <path fill-rule="evenodd" clip-rule="evenodd" d="M2.66683 1.33301H13.3335C14.0668 1.33301 14.6668 1.93301 14.6668 2.66634V13.333C14.6668 14.0663 14.0668 14.6663 13.3335 14.6663H2.66683C1.9335 14.6663 1.3335 14.0663 1.3335 13.333V2.66634C1.3335 1.93301 1.9335 1.33301 2.66683 1.33301ZM2.66683 13.333H13.3335V2.66634H2.66683V13.333ZM7.12683 3.99967H8.86016L11.8668 11.9997H10.2002L9.52683 10.0863H6.46683L5.80016 11.9997H4.1335L7.12683 3.99967ZM8.3335 6.69301L9.04016 8.70634H6.9535L7.66683 6.69301L7.96016 5.73301H8.04683L8.3335 6.69301Z"></path> </g>
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html index f02205d9..b803593 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html +++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.html
@@ -1,11 +1,12 @@ -<style include="cr-icons"> +<style include="cr-icons md-select"> iron-icon { --icon-size: 16px; height: var(--icon-size); width: var(--icon-size); - padding: 0 8px 0 0; } cr-icon-button { + --cr-icon-button-icon-size: 16px; + --cr-icon-button-size: 24px; margin: 10px 4px; } :host-context([chrome-refresh-2023]) #play-pause { @@ -14,8 +15,6 @@ color: var(--color-side-panel-entry-icon); } :host-context([chrome-refresh-2023]) cr-icon-button { - --cr-icon-button-icon-size: 16px; - --cr-icon-button-size: 24px; color: var(--color-sys-on-surface-subtle); } :host-context([chrome-refresh-2023]) .dropdown-item:focus { @@ -72,11 +71,28 @@ #toolbar-container { overflow: visible; white-space: nowrap; - max-height: 50px; + max-height: 60px; } #more, cr-icon-button#moreOptionsMenu { display: none; } + .separator { + display: inline; + width: 20px; + height: 0px; + transform: rotate(-90deg); + margin: 10px 4px; + } + .md-select { + --md-select-width: fit-content; + margin: 10px 8px; + } + :host-context([chrome-refresh-2023]) .md-select { + --md-select-text-color: var(--cr-primary-text-color); + } + :host-context([chrome-refresh-2023]) .md-select option { + --md-select-option-bg-color: var(--color-sys-base-container-elevated); + } </style> <div id="toolbar-container" class="toolbar-container"> <span id="read-aloud-container" hidden="[[!isReadAloudEnabled_]]"> @@ -118,6 +134,31 @@ on-click="onHighlightClick_"> </cr-icon-button> </span> + + <template is="dom-if" if="[[!isReadAloudEnabled_]]"> + <select id="font-select" class="md-select" + on-change="onFontSelectValueChange_"> + <template id="fontTemplate" is="dom-repeat" items="[[fontOptions_]]"> + <option value="[[item]]">[[item]]</option> + </template> + </select> + <hr class="separator"> + <cr-icon-button + id="font-size-decrease-old" + class="toolbar-button" + iron-icon="read-anything:font-size-decrease-old" + on-click="onFontSizeDecreaseClick_"> + </cr-icon-button> + <cr-icon-button + id="font-size-increase-old" + class="toolbar-button" + iron-icon="read-anything:font-size-increase-old" + on-click="onFontSizeIncreaseClick_"> + </cr-icon-button> + </template> + + <hr class="separator"> + <template is="dom-repeat" items="[[textStyleOptions_]]"> <cr-icon-button class="toolbar-button"
diff --git a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts index 0303edd..e5e98ce 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_anything_toolbar.ts
@@ -7,6 +7,7 @@ import '//resources/cr_elements/cr_icons.css.js'; import '//resources/cr_elements/icons.html.js'; import '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; +import '//resources/cr_elements/md_select.css.js'; import './icons.html.js'; import {AnchorAlignment, CrActionMenuElement, ShowAtPositionConfig} from '//resources/cr_elements/cr_action_menu/cr_action_menu.js'; @@ -242,16 +243,6 @@ private textStyleOptions_: MenuButton[] = [ { - id: 'font-size', - icon: 'read-anything:font-size', - menuToOpen: () => this.$.fontSizeMenu, - }, - { - id: 'font', - icon: 'read-anything:font', - menuToOpen: () => this.$.fontMenu, - }, - { id: 'color', icon: 'read-anything:color', menuToOpen: () => this.$.colorMenu, @@ -283,14 +274,28 @@ override connectedCallback() { super.connectedCallback(); this.isReadAloudEnabled_ = chrome.readingMode.isReadAloudEnabled; + if (this.isReadAloudEnabled_) { + this.textStyleOptions_.unshift( + { + id: 'font-size', + icon: 'read-anything:font-size', + menuToOpen: () => this.$.fontSizeMenu, + }, + { + id: 'font', + icon: 'read-anything:font', + menuToOpen: () => this.$.fontMenu, + }, + ); + + const shadowRoot = this.shadowRoot; + assert(shadowRoot); + const toolbar = shadowRoot.getElementById('toolbar-container'); + assert(toolbar); + new ResizeObserver(this.onToolbarResize_).observe(toolbar); + } this.updateFonts(); - - const shadowRoot = this.shadowRoot; - assert(shadowRoot); - const toolbar = shadowRoot.getElementById('toolbar-container'); - assert(toolbar); - new ResizeObserver(this.onToolbarResize_).observe(toolbar); } private onToolbarResize_(entries: ResizeObserverEntry[]) { @@ -299,17 +304,31 @@ ReadAnythingToolbar.maybeUpdateMoreOptions(toolbar); } - restoreSettingsFromPrefs(colorSuffix?: string) { - const fontNodes = Array.from(this.$.fontMenu.children); - fontNodes.forEach((element) => { - if (element instanceof HTMLButtonElement) { - if (!element.innerText) { - return; - } - // Update the font of each button to be the same as the font text. - element.style.fontFamily = element.innerText; + private setFontForFontOptions_() { + let fontOptions: Element[]; + if (this.isReadAloudEnabled_) { + fontOptions = Array.from(this.$.fontMenu.children); + } else { + const shadowRoot = this.shadowRoot; + assert(shadowRoot); + const select = + shadowRoot.getElementById('font-select') as HTMLSelectElement; + assert(select); + fontOptions = Array.from(select.options); + } + + fontOptions.forEach(element => { + assert(element instanceof HTMLElement); + if (!element.innerText) { + return; } + // Update the font of each button to be the same as the font text. + element.style.fontFamily = element.innerText; }); + } + + restoreSettingsFromPrefs(colorSuffix?: string) { + this.setFontForFontOptions_(); if (this.isReadAloudEnabled_) { const speechRate = parseFloat(chrome.readingMode.speechRate.toFixed(1)); @@ -609,6 +628,14 @@ this.closeMenus_(); } + private onFontSelectValueChange_(event: Event) { + const fontName = (event.target as HTMLSelectElement).value; + chrome.readingMode.onFontChange(fontName); + if (this.contentPage) { + this.contentPage.updateFont(fontName); + } + } + private onRateClick_(event: DomRepeatEvent<number>) { chrome.readingMode.onSpeechRateChange(event.model.item); if (this.contentPage) {
diff --git a/chrome/browser/resources/tab_search/tab_search_page.html b/chrome/browser/resources/tab_search/tab_search_page.html index e457605..23b0870 100644 --- a/chrome/browser/resources/tab_search/tab_search_page.html +++ b/chrome/browser/resources/tab_search/tab_search_page.html
@@ -144,11 +144,11 @@ </style> <div id="searchField" on-keydown="onSearchKeyDown_" - clear-label="$i18n{clearSearch}" label="$i18n{searchTabs}"> + clear-label="$i18n{clearSearch}"> <iron-icon id="searchIcon" icon="mwb16:search"></iron-icon> <div id="searchWrapper"> <label id="searchLabel" for="searchInput" aria-hidden="true"> - <span>[[label]]</span> + <span>$i18n{searchTabs}</span> <span>[[shortcut_]]</span> <span id="searchResultText">[[searchResultText_]]</span> </label>
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc b/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc index 6060a71..59b9be7a 100644 --- a/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc +++ b/chrome/browser/search_engine_choice/search_engine_choice_browsertest.cc
@@ -55,7 +55,6 @@ namespace { const std::string kCustomSearchEngineDomain = "bar.com"; -const int kCustomSearchEnginePrepopulateId = 0; // Class that mocks `SearchEngineChoiceService`. class MockSearchEngineChoiceService : public SearchEngineChoiceService { public: @@ -100,7 +99,6 @@ void SetUserSelectedDefaultSearchProvider( TemplateURLService* template_url_service) { TemplateURLData data; - data.prepopulate_id = kCustomSearchEnginePrepopulateId; data.SetShortName(base::UTF8ToUTF16(kCustomSearchEngineDomain)); data.SetKeyword(base::UTF8ToUTF16(kCustomSearchEngineDomain)); data.SetURL("https://" + kCustomSearchEngineDomain + "url?bar={searchTerms}"); @@ -210,6 +208,13 @@ search_engines::SearchEngineChoiceScreenEvents::kDefaultWasSet, 1); } + void CheckNavigationConditionRecorded( + search_engines::SearchEngineChoiceScreenConditions condition) { + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenNavigationConditionsHistogram, + condition, 1); + } + private: base::AutoReset<bool> scoped_chrome_build_override_ = SearchEngineChoiceServiceFactory::ScopedChromeBuildOverrideForTesting( @@ -433,6 +438,9 @@ EXPECT_TRUE(service->IsShowingDialog(browser())); + CheckNavigationConditionRecorded( + search_engines::SearchEngineChoiceScreenConditions::kEligible); + // Set the pref and simulate a dialog closing event. service->NotifyChoiceMade(/*prepopulate_id=*/1); EXPECT_FALSE(service->IsShowingDialog(browser())); @@ -482,8 +490,7 @@ WindowOpenDisposition::CURRENT_TAB, ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP)); - search_engine_choice_service->NotifyChoiceMade( - kCustomSearchEnginePrepopulateId); + search_engine_choice_service->NotifyChoiceMade(/*prepopulate_id=*/0); const TemplateURL* default_search_provider = template_url_service->GetDefaultSearchProvider(); EXPECT_EQ(default_search_provider->short_name(), @@ -491,25 +498,6 @@ } IN_PROC_BROWSER_TEST_F(SearchEngineChoiceBrowserTest, - DialogNotDisplayedForUsersWithCustomSearchEngines) { - TemplateURLService* template_url_service = - TemplateURLServiceFactory::GetForProfile(browser()->profile()); - SetUserSelectedDefaultSearchProvider(template_url_service); - auto* search_engine_choice_service = - static_cast<MockSearchEngineChoiceService*>( - SearchEngineChoiceServiceFactory::GetForProfile( - browser()->profile())); - - // Navigate to a URL to display the dialog. - ASSERT_TRUE(ui_test_utils::NavigateToURLWithDisposition( - browser(), GURL(chrome::kChromeUINewTabPageURL), - WindowOpenDisposition::CURRENT_TAB, - ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP)); - - EXPECT_FALSE(search_engine_choice_service->IsShowingDialog(browser())); -} - -IN_PROC_BROWSER_TEST_F(SearchEngineChoiceBrowserTest, DialogDoesNotShowWithExtensionEnabledThatOverridesDSE) { Profile* profile = browser()->profile(); auto* search_engine_choice_service = @@ -530,6 +518,9 @@ ui_test_utils::BROWSER_TEST_WAIT_FOR_LOAD_STOP)); EXPECT_FALSE(search_engine_choice_service->IsShowingDialog(browser())); + + CheckNavigationConditionRecorded( + search_engines::SearchEngineChoiceScreenConditions::kExtensionContolled); } IN_PROC_BROWSER_TEST_F(SearchEngineChoiceBrowserTest,
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_service.cc b/chrome/browser/search_engine_choice/search_engine_choice_service.cc index 6b653c3..fbe1b36e 100644 --- a/chrome/browser/search_engine_choice/search_engine_choice_service.cc +++ b/chrome/browser/search_engine_choice/search_engine_choice_service.cc
@@ -6,8 +6,10 @@ #include "base/check_is_test.h" #include "base/containers/contains.h" +#include "base/metrics/histogram_functions.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/profiles/profile.h" +#include "chrome/browser/search_engines/template_url_service_factory.h" #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/startup/first_run_service.h" #include "chrome/browser/ui/web_applications/app_browser_controller.h" @@ -23,8 +25,6 @@ namespace { bool g_dialog_disabled_for_testing = false; -// A custom search engine would have a `prepopulate_id` of 0. -const int kCustomSearchEngineId = 0; // Checks that the profile is the first profile that sees the search engine // choice dialog. @@ -45,6 +45,14 @@ return profile.GetBaseName() == local_state->GetFilePath(prefs::kSearchEnginesChoiceProfile); } + +void RecordChoiceScreenNavigationCondition( + search_engines::SearchEngineChoiceScreenConditions condition) { + base::UmaHistogramEnumeration( + search_engines::kSearchEngineChoiceScreenNavigationConditionsHistogram, + condition); +} + } // namespace SearchEngineChoiceService::BrowserObserver::BrowserObserver( @@ -78,9 +86,11 @@ prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp, base::Time::Now().ToDeltaSinceWindowsEpoch().InSeconds()); + // A custom search engine would have a `prepopulate_id` of 0. // Having a custom search engine displayed on the choice screen would mean // that it is already the default search engine so we don't need to change // anything. + const int kCustomSearchEngineId = 0; if (prepopulate_id != kCustomSearchEngineId) { std::unique_ptr<TemplateURLData> search_engine = TemplateURLPrepopulateData::GetPrepopulatedEngine(pref_service, @@ -155,14 +165,24 @@ std::vector<std::unique_ptr<TemplateURLData>> SearchEngineChoiceService::GetSearchEngines() { - auto* pref_service = profile_->GetPrefs(); - return TemplateURLPrepopulateData::GetPrepopulatedEnginesForChoiceScreen( - pref_service); + // We call `GetPrepopulatedEngines` instead of + // `GetSearchProvidersUsingLoadedEngines` because the latter will return the + // list of search engines that might have been modified by the user (by + // changing the engine's keyword in settings for example). + PrefService* pref_service = profile_->GetPrefs(); + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(&profile_.get()); + return TemplateURLPrepopulateData::GetPrepopulatedEngines( + pref_service, + /*default_search_provider_index=*/nullptr, + /*include_current_default=*/true, template_url_service); } bool SearchEngineChoiceService::CanShowDialog(Browser& browser) { if (!IsSelectedChoiceProfile(profile_.get(), g_browser_process->local_state())) { + RecordChoiceScreenNavigationCondition( + search_engines::SearchEngineChoiceScreenConditions::kProfileOutOfScope); return false; } @@ -181,21 +201,26 @@ // Don't show the dialog if the default search engine is set by an extension. if (template_url_service_->IsExtensionControlledDefaultSearch()) { + RecordChoiceScreenNavigationCondition( + search_engines::SearchEngineChoiceScreenConditions:: + kExtensionContolled); return false; } - // Don't show the dialog for users who set a custom search engine as default. - const TemplateURL* default_search_engine = - template_url_service_->GetDefaultSearchProvider(); - CHECK(default_search_engine); - if (default_search_engine->prepopulate_id() == kCustomSearchEngineId) { + if (HasUserMadeChoice()) { + RecordChoiceScreenNavigationCondition( + search_engines::SearchEngineChoiceScreenConditions::kAlreadyCompleted); return false; } - // Dialog should not be shown if it is currently displayed or if the user - // already made a choice. - return !HasUserMadeChoice() && !IsShowingDialog(&browser) && - !g_dialog_disabled_for_testing; + // Dialog should not be shown if it is currently displayed + if (g_dialog_disabled_for_testing || IsShowingDialog(&browser)) { + return false; + } + + RecordChoiceScreenNavigationCondition( + search_engines::SearchEngineChoiceScreenConditions::kEligible); + return true; } bool SearchEngineChoiceService::HasUserMadeChoice() const {
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_service.h b/chrome/browser/search_engine_choice/search_engine_choice_service.h index b905c64..d850643 100644 --- a/chrome/browser/search_engine_choice/search_engine_choice_service.h +++ b/chrome/browser/search_engine_choice/search_engine_choice_service.h
@@ -69,6 +69,9 @@ bool WasChoiceMadeInFRE() const; // Returns the list of search engines. + // The search engine details returned by this function will be the canonical + // ones and will not be affected by changes in search engine details from the + // settings page. // Virtual to be able to mock in tests. virtual std::vector<std::unique_ptr<TemplateURLData>> GetSearchEngines();
diff --git a/chrome/browser/search_engine_choice/search_engine_choice_service_factory.cc b/chrome/browser/search_engine_choice/search_engine_choice_service_factory.cc index 2f59c21..4369bcf 100644 --- a/chrome/browser/search_engine_choice/search_engine_choice_service_factory.cc +++ b/chrome/browser/search_engine_choice/search_engine_choice_service_factory.cc
@@ -80,10 +80,14 @@ is_regular_profile &= !profile.IsGuestSession(); #endif + TemplateURLService* template_url_service = + TemplateURLServiceFactory::GetForProfile(&profile); return search_engines::ShouldShowChoiceScreen( policy_service, - /*profile_properties=*/{.is_regular_profile = is_regular_profile, - .pref_service = profile.GetPrefs()}); + /*profile_properties=*/ + {.is_regular_profile = is_regular_profile, + .pref_service = profile.GetPrefs()}, + template_url_service); } std::unique_ptr<KeyedService>
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/OWNERS b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/OWNERS new file mode 100644 index 0000000..17451040 --- /dev/null +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/send_tab_to_self/OWNERS
@@ -0,0 +1 @@ +file://components/send_tab_to_self/OWNERS
diff --git a/chrome/browser/shell_integration_win.cc b/chrome/browser/shell_integration_win.cc index 0d7ee6d8..a340a97 100644 --- a/chrome/browser/shell_integration_win.cc +++ b/chrome/browser/shell_integration_win.cc
@@ -18,7 +18,6 @@ #include <vector> #include "base/command_line.h" -#include "base/feature_list.h" #include "base/files/file_enumerator.h" #include "base/files/file_util.h" #include "base/functional/bind.h" @@ -59,14 +58,6 @@ namespace { -BASE_FEATURE(kWin10UnattendedDefaultExportDerived, - "Win10UnattendedDefaultExportDerived", - base::FEATURE_DISABLED_BY_DEFAULT); - -bool CanSetAsDefaultDirectly() { - return base::FeatureList::IsEnabled(kWin10UnattendedDefaultExportDerived); -} - // Helper function for GetAppId to generates profile id // from profile path. "profile_id" is composed of sanitized basenames of // user data dir and profile dir joined by a ".". @@ -653,12 +644,8 @@ } // From UI currently we only allow setting default browser for current user. - if (!(CanSetAsDefaultDirectly() - ? ShellUtil::MakeChromeDefaultDirectly( - ShellUtil::CURRENT_USER, chrome_exe, - true /* elevate_if_not_admin */) - : ShellUtil::MakeChromeDefault(ShellUtil::CURRENT_USER, chrome_exe, - true /* elevate_if_not_admin */))) { + if (!ShellUtil::MakeChromeDefault(ShellUtil::CURRENT_USER, chrome_exe, + true /* elevate_if_not_admin */)) { LOG(ERROR) << "Chrome could not be set as default browser."; return false; } @@ -745,10 +732,6 @@ if (ShellUtil::CanMakeChromeDefaultUnattended()) { return SET_DEFAULT_UNATTENDED; } - if (method == WebClientSetMethod::kDefaultBrowser && - CanSetAsDefaultDirectly()) { - return SET_DEFAULT_UNATTENDED; - } // Setting the default web client generally requires user interaction in // Windows 8+ with permitted exceptions above. return SET_DEFAULT_INTERACTIVE;
diff --git a/chrome/browser/sync/bookmark_sync_service_factory.cc b/chrome/browser/sync/bookmark_sync_service_factory.cc index 1b157d6..576f40f9 100644 --- a/chrome/browser/sync/bookmark_sync_service_factory.cc +++ b/chrome/browser/sync/bookmark_sync_service_factory.cc
@@ -27,8 +27,12 @@ "BookmarkSyncServiceFactory", ProfileSelections::Builder() .WithRegular(ProfileSelection::kRedirectedToOriginal) - // TODO(crbug.com/1418376): Check if this service is needed in - // Guest mode. + // Bookmarks can be enabled in Guest sessions under some + // enterprise policies, see BookmarkModelFactory. Sync + // isn't used it guest, but as a dependency for + // BookmarkModelFactory it is necessary to instantiate + // BookmarkSyncService too (although it doesn't do anything + // useful). .WithGuest(ProfileSelection::kRedirectedToOriginal) .Build()) { DependsOn(BookmarkUndoServiceFactory::GetInstance());
diff --git a/chrome/browser/sync/test/integration/two_client_history_sync_test.cc b/chrome/browser/sync/test/integration/two_client_history_sync_test.cc index 4f279572..ed4f346 100644 --- a/chrome/browser/sync/test/integration/two_client_history_sync_test.cc +++ b/chrome/browser/sync/test/integration/two_client_history_sync_test.cc
@@ -157,17 +157,10 @@ base::Uuid::GenerateRandomV4().AsLowercaseString().c_str())); ASSERT_TRUE(SetupSync()) << "SetupSync() failed."; - size_t initial_count = typed_urls_helper::GetTypedUrlsFromClient(0).size(); - // Populate one client with a URL, wait for it to sync to the other. GURL new_url(kHistoryUrl); typed_urls_helper::AddUrlToHistory(0, new_url); - ASSERT_TRUE(ProfilesHaveSameTypedURLsChecker().Wait()); - - // Verify that the second client has the correct new URL. - history::URLRows urls = typed_urls_helper::GetTypedUrlsFromClient(1); - ASSERT_EQ(initial_count + 1, urls.size()); - EXPECT_EQ(new_url, urls.back().url()); + EXPECT_TRUE(WaitForLocalHistory(1, {{new_url, SizeIs(1)}})); } IN_PROC_BROWSER_TEST_F(TwoClientHistorySyncTest, SyncsVisitForBookmarkedUrl) { @@ -191,11 +184,8 @@ // should not cause a crash. typed_urls_helper::AddUrlToHistory(0, bookmark_url); - ASSERT_TRUE(ProfilesHaveSameTypedURLsChecker().Wait()); - history::URLRows urls = typed_urls_helper::GetTypedUrlsFromClient(0); - EXPECT_EQ(1U, urls.size()); - EXPECT_EQ(bookmark_url, urls[0].url()); - EXPECT_EQ(1, urls[0].visit_count()); + ASSERT_TRUE(WaitForLocalHistory(0, {{bookmark_url, SizeIs(1)}})); + EXPECT_TRUE(WaitForLocalHistory(1, {{bookmark_url, SizeIs(1)}})); } IN_PROC_BROWSER_TEST_F(TwoClientHistorySyncTest, SyncsUrlDeletion) {
diff --git a/chrome/browser/sync/test/integration/typed_urls_helper.cc b/chrome/browser/sync/test/integration/typed_urls_helper.cc index 7ac3f34..9b3344b4 100644 --- a/chrome/browser/sync/test/integration/typed_urls_helper.cc +++ b/chrome/browser/sync/test/integration/typed_urls_helper.cc
@@ -7,10 +7,8 @@ #include <stddef.h> #include <memory> -#include <sstream> #include "base/memory/raw_ptr.h" -#include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/task/cancelable_task_tracker.h" #include "base/time/time.h" @@ -46,28 +44,6 @@ const raw_ptr<base::WaitableEvent> wait_event_; }; -class GetTypedUrlsTask : public history::HistoryDBTask { - public: - GetTypedUrlsTask(history::URLRows* rows, base::WaitableEvent* event) - : rows_(rows), wait_event_(event) {} - - bool RunOnDBThread(history::HistoryBackend* backend, - history::HistoryDatabase* db) override { - // Fetch the typed URLs. - backend->GetAllTypedURLs(rows_); - wait_event_->Signal(); - return true; - } - - void DoneRunOnMainThread() override {} - - private: - ~GetTypedUrlsTask() override = default; - - const raw_ptr<history::URLRows> rows_; - const raw_ptr<base::WaitableEvent> wait_event_; -}; - class GetUrlTask : public history::HistoryDBTask { public: GetUrlTask(const GURL& url, @@ -230,21 +206,6 @@ source, /*did_replace_entry=*/false); } -history::URLRows GetTypedUrlsFromHistoryService( - history::HistoryService* service) { - base::CancelableTaskTracker tracker; - history::URLRows rows; - base::WaitableEvent wait_event( - base::WaitableEvent::ResetPolicy::MANUAL, - base::WaitableEvent::InitialState::NOT_SIGNALED); - service->ScheduleDBTask(FROM_HERE, - std::unique_ptr<history::HistoryDBTask>( - new GetTypedUrlsTask(&rows, &wait_event)), - &tracker); - wait_event.Wait(); - return rows; -} - bool GetUrlFromHistoryService(history::HistoryService* service, const GURL& url, history::URLRow* row) { @@ -348,93 +309,10 @@ return original; } -std::string PrintUrlRows(const history::URLRows& rows, - const std::string& label) { - std::ostringstream os; - os << "Typed URLs for client " << label << ":"; - for (size_t i = 0; i < rows.size(); ++i) { - const history::URLRow& row = rows[i]; - os << "[" << i << "] " << row.url() << " " << row.visit_count() << " " - << row.typed_count() << " " << row.last_visit() << " " << row.hidden(); - } - return os.str(); -} - -bool CheckURLRowsAreEqualForTypedURLs(const history::URLRow& left, - const history::URLRow& right) { - if (left.url() != right.url() || left.title() != right.title() || - left.hidden() != right.hidden() || - left.typed_count() != right.typed_count()) { - return false; - } - // (Non-typed) visit counts can differ and by this also the time of the last - // visit but these two quantities have the same order. - if (left.visit_count() == right.visit_count()) { - return left.last_visit() == right.last_visit(); - } else if (left.visit_count() > right.visit_count()) { - return left.last_visit() >= right.last_visit(); - } else { - return left.last_visit() <= right.last_visit(); - } -} - -bool CheckURLRowVectorsAreEqualForTypedURLs(const history::URLRows& left, - const history::URLRows& right) { - if (left.size() != right.size()) { - return false; - } - for (const history::URLRow& left_url_row : left) { - // URLs could be out-of-order, so look for a matching URL in the second - // array. - bool found = false; - for (const history::URLRow& right_url_row : right) { - if (left_url_row.url() == right_url_row.url()) { - if (CheckURLRowsAreEqualForTypedURLs(left_url_row, right_url_row)) { - found = true; - break; - } - } - } - if (!found) { - return false; - } - } - return true; -} - -bool CheckAllProfilesHaveSameTypedURLs() { - history::URLRows golden_urls; - if (test()->UseVerifier()) { - history::HistoryService* verifier_service = - HistoryServiceFactory::GetForProfile( - test()->verifier(), ServiceAccessType::IMPLICIT_ACCESS); - golden_urls = GetTypedUrlsFromHistoryService(verifier_service); - } else { - golden_urls = typed_urls_helper::GetTypedUrlsFromClient(0); - } - for (int i = 0; i < test()->num_clients(); ++i) { - history::URLRows urls = typed_urls_helper::GetTypedUrlsFromClient(i); - if (!CheckURLRowVectorsAreEqualForTypedURLs(golden_urls, urls)) { - DVLOG(1) << "Found no match in typed URLs between two profiles"; - DVLOG(1) << PrintUrlRows(golden_urls, - test()->UseVerifier() ? "verifier" : "client 0"); - DVLOG(1) << PrintUrlRows(urls, base::StringPrintf("client %i", i)); - return false; - } - } - return true; -} - } // namespace namespace typed_urls_helper { -history::URLRows GetTypedUrlsFromClient(int index) { - history::HistoryService* service = GetHistoryServiceFromClient(index); - - return GetTypedUrlsFromHistoryService(service); -} - bool GetUrlFromClient(int index, const GURL& url, history::URLRow* row) { history::HistoryService* service = GetHistoryServiceFromClient(index); return GetUrlFromHistoryService(service, url, row); @@ -514,13 +392,3 @@ } } // namespace typed_urls_helper - -ProfilesHaveSameTypedURLsChecker::ProfilesHaveSameTypedURLsChecker() - : MultiClientStatusChangeChecker( - sync_datatype_helper::test()->GetSyncServices()) {} - -bool ProfilesHaveSameTypedURLsChecker::IsExitConditionSatisfied( - std::ostream* os) { - *os << "Waiting for matching typed urls profiles"; - return CheckAllProfilesHaveSameTypedURLs(); -}
diff --git a/chrome/browser/sync/test/integration/typed_urls_helper.h b/chrome/browser/sync/test/integration/typed_urls_helper.h index 4a3118c..98b992dc 100644 --- a/chrome/browser/sync/test/integration/typed_urls_helper.h +++ b/chrome/browser/sync/test/integration/typed_urls_helper.h
@@ -7,7 +7,6 @@ #include <vector> -#include "chrome/browser/sync/test/integration/multi_client_status_change_checker.h" #include "components/history/core/browser/history_types.h" #include "ui/base/page_transition_types.h" @@ -18,9 +17,6 @@ // TODO(crbug.com/1365291): Rename this to history_helper. namespace typed_urls_helper { -// Gets the typed URLs from a specific sync profile. -history::URLRows GetTypedUrlsFromClient(int index); - // Gets the URLRow for a specific URL from a specific sync profile. Returns // false if the URL was not found in the history DB. bool GetUrlFromClient(int index, const GURL& url, history::URLRow* row); @@ -69,13 +65,4 @@ } // namespace typed_urls_helper -// Checker that blocks until all clients have the same Typed URLs. -class ProfilesHaveSameTypedURLsChecker : public MultiClientStatusChangeChecker { - public: - ProfilesHaveSameTypedURLsChecker(); - - // Implementation of StatusChangeChecker. - bool IsExitConditionSatisfied(std::ostream* os) override; -}; - #endif // CHROME_BROWSER_SYNC_TEST_INTEGRATION_TYPED_URLS_HELPER_H_
diff --git a/chrome/browser/tpcd/experiment/tpcd_experiment_features.cc b/chrome/browser/tpcd/experiment/tpcd_experiment_features.cc index fa7ada3..9daa61f10 100644 --- a/chrome/browser/tpcd/experiment/tpcd_experiment_features.cc +++ b/chrome/browser/tpcd/experiment/tpcd_experiment_features.cc
@@ -10,22 +10,27 @@ namespace tpcd::experiment { +const char kVersionName[] = "version"; +const char kDisable3PCookiesName[] = "disable_3p_cookies"; +const char kDisableAdsAPIsName[] = "disable_ads_apis"; +const char kForceEligibleForTestingName[] = "force_eligible"; + // Set the version of the experiment finch config. const base::FeatureParam<int> kVersion{ - &features::kCookieDeprecationFacilitatedTesting, /*name=*/"version", + &features::kCookieDeprecationFacilitatedTesting, /*name=*/kVersionName, /*default_value=*/0}; // True IFF third-party cookies are disabled. // Distinguishes between "Mode A" and "Mode B" cohorts. const base::FeatureParam<bool> kDisable3PCookies{ &features::kCookieDeprecationFacilitatedTesting, - /*name=*/"disable_3p_cookies", + /*name=*/kDisable3PCookiesName, /*default_value=*/false}; // Whether Ads APIs should be disabled. const base::FeatureParam<bool> kDisableAdsAPIs{ &features::kCookieDeprecationFacilitatedTesting, - /*name=*/"disable_ads_apis", + /*name=*/kDisableAdsAPIsName, /*default_value=*/false}; extern const base::FeatureParam<base::TimeDelta> kDecisionDelayTime{ @@ -36,7 +41,7 @@ // Set whether to force client being eligible for manual testing. const base::FeatureParam<bool> kForceEligibleForTesting{ &features::kCookieDeprecationFacilitatedTesting, - /*name=*/"force_eligible", + /*name=*/kForceEligibleForTestingName, /*default_value=*/false}; } // namespace tpcd::experiment
diff --git a/chrome/browser/tpcd/experiment/tpcd_experiment_features.h b/chrome/browser/tpcd/experiment/tpcd_experiment_features.h index 782fa790..29bf977c 100644 --- a/chrome/browser/tpcd/experiment/tpcd_experiment_features.h +++ b/chrome/browser/tpcd/experiment/tpcd_experiment_features.h
@@ -10,6 +10,12 @@ namespace tpcd::experiment { +extern const char kVersionName[]; +extern const char kDisable3PCookiesName[]; +extern const char kDisableAdsAPIsName[]; +extern const char kDecisionDelayTimeName[]; +extern const char kForceEligibleForTestingName[]; + extern const base::FeatureParam<int> kVersion; extern const base::FeatureParam<bool> kDisable3PCookies; extern const base::FeatureParam<bool> kDisableAdsAPIs;
diff --git a/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.cc b/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.cc index f27cc076..41c2c18 100644 --- a/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.cc +++ b/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.cc
@@ -175,7 +175,7 @@ .SetPopupId(popup_id_) .Record(ukm::UkmRecorder::Get()); - EmitTopLevel(initial_url_, has_iframe); + EmitTopLevel(initial_url_, has_iframe, /*is_current_interaction=*/false); } void OpenerHeuristicTabHelper::PopupObserver::DidFinishNavigation( @@ -239,7 +239,8 @@ interaction_reported_ = true; - EmitTopLevel(render_frame_host->GetLastCommittedURL(), has_iframe); + EmitTopLevel(render_frame_host->GetLastCommittedURL(), has_iframe, + /*is_current_interaction=*/true); } void OpenerHeuristicTabHelper::OnCookiesAccessed( @@ -302,7 +303,8 @@ void OpenerHeuristicTabHelper::PopupObserver::EmitTopLevel( const GURL& popup_url, - OptionalBool has_iframe) { + OptionalBool has_iframe, + bool is_current_interaction) { if (toplevel_reported_) { return; } @@ -329,7 +331,7 @@ ->AsyncCall(&DIPSStorage::WritePopup) .WithArgs(GetSiteForDIPS(opener_url_), GetSiteForDIPS(popup_url), access_id, - /*popup_time=*/GetClock()->Now()) + /*popup_time=*/GetClock()->Now(), is_current_interaction) .Then(base::BindOnce([](bool succeeded) { DCHECK(succeeded); })); }
diff --git a/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.h b/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.h index 9bf47d2..2a9ab4e 100644 --- a/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.h +++ b/chrome/browser/tpcd/heuristics/opener_heuristic_tab_helper.h
@@ -53,7 +53,9 @@ // the necessary information. void EmitPastInteractionIfReady(); // Emit the OpenerHeuristic.TopLevel UKM event. - void EmitTopLevel(const GURL& tracker_url, OptionalBool has_iframe); + void EmitTopLevel(const GURL& tracker_url, + OptionalBool has_iframe, + bool is_current_interaction); // See if the opener page has an iframe from the same site. OptionalBool GetOpenerHasSameSiteIframe(const GURL& popup_url);
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index 76a31809..eca90c3 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -773,6 +773,8 @@ "android/autofill/autofill_progress_dialog_view_android.h", "android/autofill/autofill_save_card_bottom_sheet_bridge.cc", "android/autofill/autofill_save_card_bottom_sheet_bridge.h", + "android/autofill/autofill_save_card_delegate_android.cc", + "android/autofill/autofill_save_card_delegate_android.h", "android/autofill/autofill_vcn_enroll_bottom_sheet_bridge.cc", "android/autofill/autofill_vcn_enroll_bottom_sheet_bridge.h", "android/autofill/card_expiration_date_fix_flow_view_android.cc", @@ -954,6 +956,7 @@ "//components/autofill/android:payments_jni_headers", "//components/browser_ui/accessibility/android", "//components/browser_ui/client_certificate/android", + "//components/browser_ui/device_lock/android", "//components/browser_ui/share/android", "//components/browser_ui/util/android", "//components/embedder_support/android:context_menu", @@ -1112,6 +1115,7 @@ "content_settings/content_setting_image_model.h", "content_settings/content_setting_image_model_states.cc", "content_settings/content_setting_image_model_states.h", + "download/download_display.cc", "download/download_display.h", "download/download_item_mode.cc", "download/download_item_mode.h", @@ -1590,6 +1594,8 @@ "webui/commerce/shopping_list_context_menu_controller.h", "webui/commerce/shopping_ui_handler_delegate.cc", "webui/commerce/shopping_ui_handler_delegate.h", + "webui/compose/compose_ui.cc", + "webui/compose/compose_ui.h", "webui/cr_components/customize_color_scheme_mode/customize_color_scheme_mode_handler.cc", "webui/cr_components/customize_color_scheme_mode/customize_color_scheme_mode_handler.h", "webui/cr_components/history_clusters/history_clusters_util.cc", @@ -1960,11 +1966,13 @@ "//components/commerce/core:shopping_service", "//components/commerce/core/mojom:mojo_bindings", "//components/commerce/core/webui", + "//components/compose/core/browser:features", "//components/endpoint_fetcher:endpoint_fetcher", "//components/enterprise/common:files_scan_data", "//components/feedback/proto", "//components/headless/policy", "//components/keep_alive_registry", + "//components/manta", "//components/media_router/common/mojom:media_router", "//components/network_session_configurator/common", "//components/omnibox/browser:mojo_bindings",
diff --git a/chrome/browser/ui/DEPS b/chrome/browser/ui/DEPS index 13b1434..9f4370db 100644 --- a/chrome/browser/ui/DEPS +++ b/chrome/browser/ui/DEPS
@@ -4,6 +4,7 @@ "-chrome/browser/ui/views", "+chrome/updater", "+components/browser_ui/client_certificate", + "+components/browser_ui/device_lock/android", "+components/browser_ui/util/android/url_constants.h", "+components/country_codes", "+components/endpoint_fetcher",
diff --git a/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.cc b/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.cc index 0f0f8fb..4c73e0d9 100644 --- a/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.cc +++ b/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.cc
@@ -11,6 +11,7 @@ #include "base/android/scoped_java_ref.h" #include "chrome/android/chrome_jni_headers/AutofillSaveCardBottomSheetBridge_jni.h" #include "chrome/browser/android/resource_mapper.h" +#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h" #include "chrome/browser/ui/android/tab_model/tab_model.h" #include "components/autofill/android/payments/legal_message_line_android.h" #include "components/autofill/android/payments_jni_headers/AutofillSaveCardUiInfo_jni.h" @@ -67,7 +68,7 @@ void AutofillSaveCardBottomSheetBridge::RequestShowContent( const AutofillSaveCardUiInfo& ui_info, - std::unique_ptr<AutofillSaveCardDelegate> delegate) { + std::unique_ptr<AutofillSaveCardDelegateAndroid> delegate) { JNIEnv* env = base::android::AttachCurrentThread(); save_card_delegate_ = std::move(delegate); Java_AutofillSaveCardBottomSheetBridge_requestShowContent( @@ -89,22 +90,28 @@ void AutofillSaveCardBottomSheetBridge::OnUiAccepted(JNIEnv* env) { if (save_card_delegate_) { - save_card_delegate_->OnUiAccepted(); + save_card_delegate_->OnUiAccepted(base::BindOnce( + &AutofillSaveCardBottomSheetBridge::ResetSaveCardDelegate, + base::Unretained(this))); } - save_card_delegate_.reset(nullptr); + ResetSaveCardDelegate(); } void AutofillSaveCardBottomSheetBridge::OnUiCanceled(JNIEnv* env) { if (save_card_delegate_) { save_card_delegate_->OnUiCanceled(); } - save_card_delegate_.reset(nullptr); + ResetSaveCardDelegate(); } void AutofillSaveCardBottomSheetBridge::OnUiIgnored(JNIEnv* env) { if (save_card_delegate_) { save_card_delegate_->OnUiIgnored(); } + ResetSaveCardDelegate(); +} + +void AutofillSaveCardBottomSheetBridge::ResetSaveCardDelegate() { save_card_delegate_.reset(nullptr); }
diff --git a/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h b/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h index aefa696d..42f41d6f 100644 --- a/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h +++ b/chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h
@@ -17,7 +17,7 @@ namespace autofill { -class AutofillSaveCardDelegate; +class AutofillSaveCardDelegateAndroid; struct AutofillSaveCardUiInfo; // Bridge class owned by ChromeAutofillClient providing an entry point @@ -39,7 +39,7 @@ // Overridden in tests. virtual void RequestShowContent( const AutofillSaveCardUiInfo& ui_info, - std::unique_ptr<AutofillSaveCardDelegate> delegate); + std::unique_ptr<AutofillSaveCardDelegateAndroid> delegate); // -- JNI calls bridged to AutofillSaveCardDelegate -- // Called when the UI is shown. @@ -58,9 +58,11 @@ java_autofill_save_card_bottom_sheet_bridge); private: + void ResetSaveCardDelegate(); + base::android::ScopedJavaGlobalRef<jobject> java_autofill_save_card_bottom_sheet_bridge_; - std::unique_ptr<AutofillSaveCardDelegate> save_card_delegate_; + std::unique_ptr<AutofillSaveCardDelegateAndroid> save_card_delegate_; }; } // namespace autofill
diff --git a/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.cc b/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.cc new file mode 100644 index 0000000..588d100 --- /dev/null +++ b/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.cc
@@ -0,0 +1,66 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h" + +#include "components/browser_ui/device_lock/android/device_lock_bridge.h" +#include "content/public/browser/web_contents.h" +#include "ui/android/window_android.h" + +namespace autofill { + +AutofillSaveCardDelegateAndroid::AutofillSaveCardDelegateAndroid( + absl::variant<AutofillClient::LocalSaveCardPromptCallback, + AutofillClient::UploadSaveCardPromptCallback> callback, + AutofillClient::SaveCreditCardOptions options, + content::WebContents* web_contents) + : AutofillSaveCardDelegate(std::move(callback), options) { + device_lock_bridge_ = std::make_unique<DeviceLockBridge>(); + web_contents_ = web_contents; +} + +void AutofillSaveCardDelegateAndroid::SetDeviceLockBridgeForTesting( + std::unique_ptr<DeviceLockBridge> device_lock_bridge) { + device_lock_bridge_ = std::move(device_lock_bridge); +} + +AutofillSaveCardDelegateAndroid::~AutofillSaveCardDelegateAndroid() = default; + +void AutofillSaveCardDelegateAndroid::GatherAdditionalConsentIfApplicable( + AutofillClient::UserProvidedCardDetails user_provided_details) { + if (device_lock_bridge_->ShouldShowDeviceLockUi()) { + PromptUserToSetDeviceLock(user_provided_details); + } else { + OnFinishedGatheringConsent( + AutofillClient::SaveCardOfferUserDecision::kAccepted, + user_provided_details); + } +} + +void AutofillSaveCardDelegateAndroid::PromptUserToSetDeviceLock( + AutofillClient::UserProvidedCardDetails user_provided_details) { + if (auto* window = web_contents_->GetNativeView()->GetWindowAndroid()) { + device_lock_bridge_->LaunchDeviceLockUiBeforeRunningCallback( + window, + base::BindOnce(&AutofillSaveCardDelegateAndroid::OnAfterDeviceLockUi, + weak_ptr_factory_.GetWeakPtr(), user_provided_details)); + } else { + OnFinishedGatheringConsent( + AutofillClient::SaveCardOfferUserDecision::kIgnored, + /*user_provided_details=*/{}); + } +} + +void AutofillSaveCardDelegateAndroid::OnAfterDeviceLockUi( + AutofillClient::UserProvidedCardDetails user_provided_details, + bool is_device_lock_set) { + OnFinishedGatheringConsent( + /*user_decision=*/is_device_lock_set + ? AutofillClient::SaveCardOfferUserDecision::kAccepted + : AutofillClient::SaveCardOfferUserDecision::kIgnored, + is_device_lock_set ? user_provided_details + : AutofillClient::UserProvidedCardDetails()); +} + +} // namespace autofill
diff --git a/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h b/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h new file mode 100644 index 0000000..fb98eb2 --- /dev/null +++ b/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h
@@ -0,0 +1,65 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_ANDROID_AUTOFILL_AUTOFILL_SAVE_CARD_DELEGATE_ANDROID_H_ +#define CHROME_BROWSER_UI_ANDROID_AUTOFILL_AUTOFILL_SAVE_CARD_DELEGATE_ANDROID_H_ + +#include "components/autofill/core/browser/payments/autofill_save_card_delegate.h" + +class DeviceLockBridge; + +namespace content { +class WebContents; +} + +namespace autofill { + +// Android implementation of AutofillSaveCardDelegate which prompts user to +// setup device lock for data privacy prior to saving autofill payment methods. +class AutofillSaveCardDelegateAndroid : public AutofillSaveCardDelegate { + public: + AutofillSaveCardDelegateAndroid( + absl::variant<AutofillClient::LocalSaveCardPromptCallback, + AutofillClient::UploadSaveCardPromptCallback> callback, + AutofillClient::SaveCreditCardOptions options, + content::WebContents* web_contents); + + void SetDeviceLockBridgeForTesting( + std::unique_ptr<DeviceLockBridge> device_lock_bridge); + + AutofillSaveCardDelegateAndroid(const AutofillSaveCardDelegateAndroid&) = + delete; + AutofillSaveCardDelegateAndroid& operator=( + const AutofillSaveCardDelegateAndroid&) = delete; + ~AutofillSaveCardDelegateAndroid() override; + + private: + // Show users an explainer dialog describing why they need to set a device + // lock and then redirects them to the Android OS device lock set up flow. + void PromptUserToSetDeviceLock( + AutofillClient::UserProvidedCardDetails user_provided_details); + + // Attempt to save card if user successfully sets a device lock, and runs + // appropriate callbacks such as cleaning up pointers to this delegate that + // have their lifecycle extended. + void OnAfterDeviceLockUi( + AutofillClient::UserProvidedCardDetails user_provided_details, + bool is_device_lock_set); + + // AutofillSaveCardDelegate: + void GatherAdditionalConsentIfApplicable( + AutofillClient::UserProvidedCardDetails user_provided_details) override; + + raw_ptr<content::WebContents> web_contents_; + + // This JNI bridge helper class launches the device lock setup flow in + // Android. `device_lock_bridge_` is created in the constructor. + std::unique_ptr<DeviceLockBridge> device_lock_bridge_; + + base::WeakPtrFactory<AutofillSaveCardDelegateAndroid> weak_ptr_factory_{this}; +}; + +} // namespace autofill + +#endif // CHROME_BROWSER_UI_ANDROID_AUTOFILL_AUTOFILL_SAVE_CARD_DELEGATE_ANDROID_H_
diff --git a/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android_unittest.cc b/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android_unittest.cc new file mode 100644 index 0000000..a19df2a --- /dev/null +++ b/chrome/browser/ui/android/autofill/autofill_save_card_delegate_android_unittest.cc
@@ -0,0 +1,163 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h" + +#include "autofill_save_card_delegate_android.h" +#include "base/logging.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/browser_ui/device_lock/android/device_lock_bridge.h" +#include "content/public/browser/web_contents.h" +#include "testing/gmock/include/gmock/gmock-matchers.h" +#include "ui/android/window_android.h" + +namespace { + +class TestDeviceLockBridge : public DeviceLockBridge { + public: + TestDeviceLockBridge() = default; + TestDeviceLockBridge(const TestDeviceLockBridge&) = delete; + TestDeviceLockBridge& operator=(const TestDeviceLockBridge&) = delete; + + bool ShouldShowDeviceLockUi() override { return should_show_device_lock_ui_; } + + bool RequiresDeviceLock() override { return should_show_device_lock_ui_; } + + void LaunchDeviceLockUiBeforeRunningCallback( + ui::WindowAndroid* window_android, + DeviceLockConfirmedCallback callback) override { + callback_ = std::move(callback); + device_lock_ui_shown_count_++; + } + + void SimulateDeviceLockComplete(bool is_device_lock_set) { + std::move(callback_).Run(is_device_lock_set); + } + + void SetShouldShowDeviceLockUi(bool should_show_device_lock_ui) { + should_show_device_lock_ui_ = should_show_device_lock_ui; + } + + int device_lock_ui_shown_count() { return device_lock_ui_shown_count_; } + + private: + bool should_show_device_lock_ui_ = false; + int device_lock_ui_shown_count_ = 0; + DeviceLockConfirmedCallback callback_; +}; + +} // namespace + +namespace autofill { + +class AutofillSaveCardDelegateAndroidTest + : public ChromeRenderViewHostTestHarness { + protected: + void SetUp() override { + ChromeRenderViewHostTestHarness::SetUp(); + + delegate_ = std::make_unique<AutofillSaveCardDelegateAndroid>( + CreateSaveCardCallback(), AutofillClient::SaveCreditCardOptions(), + web_contents()); + auto bridge = std::make_unique<TestDeviceLockBridge>(); + test_bridge_ = bridge.get(); + delegate_->SetDeviceLockBridgeForTesting(std::move(bridge)); + + // Create a scoped window so that + // WebContents::GetNativeView()->GetWindowAndroid() does not return null. + window_ = ui::WindowAndroid::CreateForTesting(); + window_.get()->get()->AddChild(web_contents()->GetNativeView()); + } + + std::unique_ptr<AutofillSaveCardDelegateAndroid> delegate_; + raw_ptr<TestDeviceLockBridge> test_bridge_; + std::unique_ptr<ui::WindowAndroid::ScopedWindowAndroidForTesting> window_; + std::vector<AutofillClient::SaveCardOfferUserDecision> save_card_decisions_; + + private: + void SaveCardCallback(AutofillClient::SaveCardOfferUserDecision decision) { + save_card_decisions_.push_back(decision); + } + + AutofillClient::LocalSaveCardPromptCallback CreateSaveCardCallback() { + return base::BindOnce( + &AutofillSaveCardDelegateAndroidTest::SaveCardCallback, + base::Unretained( + this)); // Test function does not outlive test fixture. + } +}; + +// Tests that card is saved if device lock UI is shown and device lock is set. +TEST_F(AutofillSaveCardDelegateAndroidTest, DeviceLockUiShown_DeviceLockSet) { + // Simulate user clicking save card button and not having previously set up a + // device lock. + test_bridge_->SetShouldShowDeviceLockUi(true); + delegate_->OnUiAccepted(); + + // Verify that device lock UI is shown but card is not saved yet. + EXPECT_EQ(1, test_bridge_->device_lock_ui_shown_count()); + EXPECT_TRUE(save_card_decisions_.empty()); + + // Verify that card is saved after user sets a device lock. + test_bridge_->SimulateDeviceLockComplete(true); + EXPECT_THAT(save_card_decisions_, + testing::ElementsAre( + AutofillClient::SaveCardOfferUserDecision::kAccepted)); +} + +// Tests that card is not saved if device lock UI is shown but device lock is +// not set. +TEST_F(AutofillSaveCardDelegateAndroidTest, + DeviceLockUiShown_DeviceLockNotSet) { + // Simulate user clicking save card button and not having previously set up a + // device lock. + test_bridge_->SetShouldShowDeviceLockUi(true); + delegate_->OnUiAccepted(); + + // Verify that device lock UI is shown but card is not saved yet. + EXPECT_EQ(1, test_bridge_->device_lock_ui_shown_count()); + EXPECT_TRUE(save_card_decisions_.empty()); + + // Verify that card not saved because user didn't set a device lock. + test_bridge_->SimulateDeviceLockComplete(false); + EXPECT_THAT(save_card_decisions_, + testing::ElementsAre( + AutofillClient::SaveCardOfferUserDecision::kIgnored)); +} + +// Tests that card is not saved if device lock UI is not shown because +// WindowAndroid is null. +TEST_F(AutofillSaveCardDelegateAndroidTest, + DeviceLockUiNotShown_WindowAndroidIsNull) { + // Set WindowAndroid to null. + window_.reset(nullptr); + + // Simulate user clicking save card button and getting prompted to set a + // device lock. + test_bridge_->SetShouldShowDeviceLockUi(true); + delegate_->OnUiAccepted(); + + // Verify that device lock UI is not shown and card is not saved. + EXPECT_EQ(0, test_bridge_->device_lock_ui_shown_count()); + EXPECT_THAT(save_card_decisions_, + testing::ElementsAre( + AutofillClient::SaveCardOfferUserDecision::kIgnored)); +} + +// Tests that card is saved right away if device lock is already set. +TEST_F(AutofillSaveCardDelegateAndroidTest, + DeviceLockUiNotShown_DeviceLockAlreadySet) { + // Simulate user clicking save card button and having previously set up a + // device lock. + test_bridge_->SetShouldShowDeviceLockUi(false); + delegate_->OnUiAccepted(); + + // Verify that device lock UI is not shown and card is saved. + EXPECT_EQ(0, test_bridge_->device_lock_ui_shown_count()); + EXPECT_THAT(save_card_decisions_, + testing::ElementsAre( + AutofillClient::SaveCardOfferUserDecision::kAccepted)); +} + +} // namespace autofill
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn b/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn index 1bac8b32..af1ff97 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn +++ b/chrome/browser/ui/android/edge_to_edge/internal/BUILD.gn
@@ -13,6 +13,8 @@ sources = [ "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java", "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java", + "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapper.java", + "java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapperImpl.java", ] deps = [ "//base:base_java", @@ -36,6 +38,9 @@ "//chrome/browser/flags:java", "//chrome/browser/tab:java", "//third_party/androidx:androidx_appcompat_appcompat_java", + "//third_party/androidx:androidx_core_core_java", + "//third_party/hamcrest:hamcrest_core_java", + "//third_party/hamcrest:hamcrest_library_java", "//third_party/junit", "//third_party/mockito:mockito_java", ]
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java index 0b7ccab..a8cf4583 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java
@@ -28,7 +28,7 @@ */ public static EdgeToEdgeController create( Activity activity, @NonNull ObservableSupplier<Tab> tabObservableSupplier) { - return new EdgeToEdgeControllerImpl(activity, tabObservableSupplier); + return new EdgeToEdgeControllerImpl(activity, tabObservableSupplier, null); } /** @Return whether the feature is enabled or not. */
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java index 8b11e9a..f068119 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
@@ -17,8 +17,6 @@ import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.Insets; -import androidx.core.view.ViewCompat; -import androidx.core.view.WindowCompat; import org.chromium.base.Log; import org.chromium.base.supplier.ObservableSupplier; @@ -39,6 +37,7 @@ private final Activity mActivity; private final @NonNull TabSupplierObserver mTabSupplierObserver; + private final @NonNull EdgeToEdgeOSWrapper mEdgeToEdgeOSWrapper; private boolean mToEdge; @@ -48,10 +47,14 @@ * @param activity The activity to update to allow drawing under System Bars. * @param tabObservableSupplier A supplier for Tab changes so this implementation can adjust * whether to draw under or not for each page. + * @param edgeToEdgeOSWrapper An optional wrapper for OS calls for testing etc. */ - public EdgeToEdgeControllerImpl( - Activity activity, ObservableSupplier<Tab> tabObservableSupplier) { + public EdgeToEdgeControllerImpl(Activity activity, + ObservableSupplier<Tab> tabObservableSupplier, + @Nullable EdgeToEdgeOSWrapper edgeToEdgeOSWrapper) { mActivity = activity; + mEdgeToEdgeOSWrapper = + edgeToEdgeOSWrapper == null ? new EdgeToEdgeOSWrapperImpl() : edgeToEdgeOSWrapper; mTabSupplierObserver = new TabSupplierObserver(tabObservableSupplier) { @Override protected void onObservingDifferentTab(Tab tab) { @@ -88,7 +91,8 @@ // Note that fitInsideSystemWindows == true means we do NOT draw under the Bars, rather // we fit within them. So a value of false is needed to activate ToEdge. boolean fitInsideSystemWindows = !toEdge; - WindowCompat.setDecorFitsSystemWindows(mActivity.getWindow(), fitInsideSystemWindows); + mEdgeToEdgeOSWrapper.setDecorFitsSystemWindows( + mActivity.getWindow(), fitInsideSystemWindows); // We only make the Nav Bar transparent because it's the only thing we want to draw // underneath. @@ -96,7 +100,7 @@ // For the web we may need to call Blink or some system background color API. @ColorInt int navBarColor = toEdge ? Color.TRANSPARENT : Color.BLACK; - mActivity.getWindow().setNavigationBarColor(navBarColor); + mEdgeToEdgeOSWrapper.setNavigationBarColor(mActivity.getWindow(), navBarColor); // Now fix all the edges other than the bottom Gesture Nav Bar by insetting with padding, or // cancelling the previous padding when we adjust back ToNormal. This keeps the @@ -104,11 +108,12 @@ // (e.g. Status Bar). When moving back ToNormal we need to clear the padding that we added // to prevent drawing under the Status Bar otherwise we'll be inset too much at the top of // the screen. - ViewCompat.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> { + mEdgeToEdgeOSWrapper.setOnApplyWindowInsetsListener(rootView, (view, windowInsets) -> { Insets systemInsets = windowInsets.getInsets(WindowInsets.Type.systemBars()); int bottomInset = toEdge ? 0 : systemInsets.bottom; // Restore the drawing to normal on all edges, except for the bottom (Nav Bar). - view.setPadding(systemInsets.left, systemInsets.top, systemInsets.right, bottomInset); + mEdgeToEdgeOSWrapper.setPadding( + view, systemInsets.left, systemInsets.top, systemInsets.right, bottomInset); return windowInsets; }); } @@ -134,6 +139,11 @@ return mToEdge; } + @VisibleForTesting + void setToEdge(boolean toEdge) { + mToEdge = toEdge; + } + @CallSuper @Override public void destroy() {
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java index f39b885..bf11f295 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
@@ -4,20 +4,41 @@ package org.chromium.chrome.browser.ui.edge_to_edge; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotEquals; +import static org.junit.Assert.assertTrue; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyInt; +import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.verifyNoInteractions; import static org.mockito.Mockito.when; +import static org.mockito.hamcrest.MockitoHamcrest.intThat; +import android.annotation.SuppressLint; +import android.app.Activity; +import android.graphics.Color; import android.os.Build.VERSION_CODES; +import android.view.View; import androidx.appcompat.app.AppCompatActivity; +import androidx.core.graphics.Insets; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.WindowInsetsCompat; +import org.hamcrest.Matchers; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.ArgumentCaptor; +import org.mockito.Captor; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import org.robolectric.Robolectric; @@ -37,6 +58,11 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(sdk = VERSION_CODES.R, manifest = Config.NONE) public class EdgeToEdgeControllerTest { + @SuppressLint("NewApi") + private static final Insets SYSTEM_INSETS = Insets.of(0, 113, 0, 59); // Typical. + private static final int SYSTEM_BARS = 519; // Actual value of WindowInsets.Type.systemBars(). + + private Activity mActivity; private EdgeToEdgeControllerImpl mEdgeToEdgeControllerImpl; private ObservableSupplierImpl mObservableSupplierImpl; @@ -44,18 +70,41 @@ @Mock private Tab mTab; + @Mock + private EdgeToEdgeOSWrapper mOsWrapper; + + @Captor + private ArgumentCaptor<OnApplyWindowInsetsListener> mWindowInsetsListenerCaptor; + + @Mock + private View mViewMock; + + @Mock + private WindowInsetsCompat mWindowInsetsMock; + @Before public void setUp() { ChromeFeatureList.sDrawEdgeToEdge.setForTesting(true); ChromeFeatureList.sDrawNativeEdgeToEdge.setForTesting(false); ChromeFeatureList.sDrawWebEdgeToEdge.setForTesting(false); - var activity = Robolectric.buildActivity(AppCompatActivity.class).setup().get(); - mObservableSupplierImpl = new ObservableSupplierImpl(); - mEdgeToEdgeControllerImpl = (EdgeToEdgeControllerImpl) EdgeToEdgeControllerFactory.create( - activity, mObservableSupplierImpl); - Assert.assertNotNull(mEdgeToEdgeControllerImpl); + MockitoAnnotations.openMocks(this); + + mActivity = Robolectric.buildActivity(AppCompatActivity.class).setup().get(); + mObservableSupplierImpl = new ObservableSupplierImpl(); + mEdgeToEdgeControllerImpl = + new EdgeToEdgeControllerImpl(mActivity, mObservableSupplierImpl, mOsWrapper); + Assert.assertNotNull(mEdgeToEdgeControllerImpl); doNothing().when(mTab).addObserver(any()); + + doNothing().when(mOsWrapper).setDecorFitsSystemWindows(any(), anyBoolean()); + doNothing().when(mOsWrapper).setPadding(any(), anyInt(), anyInt(), anyInt(), anyInt()); + doNothing().when(mOsWrapper).setNavigationBarColor(any(), anyInt()); + doNothing() + .when(mOsWrapper) + .setOnApplyWindowInsetsListener(any(), mWindowInsetsListenerCaptor.capture()); + + doReturn(SYSTEM_INSETS).when(mWindowInsetsMock).getInsets(anyInt()); } @After @@ -82,12 +131,16 @@ AssertionError.class, () -> mEdgeToEdgeControllerImpl.drawToEdge(badId, true)); } + /** + * Test nothing is done when the Feature is not enabled. + */ @Test public void onObservingDifferentTab_default() { when(mTab.isNativePage()).thenReturn(false); mObservableSupplierImpl.set(mTab); verify(mTab).isNativePage(); - Assert.assertFalse(mEdgeToEdgeControllerImpl.isToEdge()); + assertFalse(mEdgeToEdgeControllerImpl.isToEdge()); + assertNoChangeExpectations(); } @Test @@ -96,7 +149,8 @@ when(mTab.isNativePage()).thenReturn(true); mObservableSupplierImpl.set(mTab); verify(mTab).isNativePage(); - Assert.assertTrue(mEdgeToEdgeControllerImpl.isToEdge()); + assertTrue(mEdgeToEdgeControllerImpl.isToEdge()); + assertToEdgeExpectations(); } @Test @@ -108,17 +162,91 @@ verify(mTab).isNativePage(); Tab nullForTabSwitcher = null; mObservableSupplierImpl.set(nullForTabSwitcher); - Assert.assertTrue(mEdgeToEdgeControllerImpl.isToEdge()); + assertTrue(mEdgeToEdgeControllerImpl.isToEdge()); + assertToEdgeExpectations(); } @Test - public void onObservingDifferentTab_changeToWeb() { + @SuppressLint("NewApi") + public void onObservingDifferentTab_changeToWebDisabled() { + // First go ToEdge by invoking the changeToTabSwitcher test logic. + mEdgeToEdgeControllerImpl.setToEdge(true); + + // Now test that a Web page causes a transition ToNormal (when Web forcing is disabled). + ChromeFeatureList.sDrawWebEdgeToEdge.setForTesting(false); + when(mTab.isNativePage()).thenReturn(false); + mObservableSupplierImpl.set(mTab); + verify(mTab).isNativePage(); // Verify it was false. + assertFalse(mEdgeToEdgeControllerImpl.isToEdge()); + assertToNormalExpectations(); + } + + @Test + public void onObservingDifferentTab_changeToWebEnabled() { ChromeFeatureList.sDrawWebEdgeToEdge.setForTesting(true); when(mTab.isNativePage()).thenReturn(false); mObservableSupplierImpl.set(mTab); verify(mTab).isNativePage(); - Assert.assertTrue(mEdgeToEdgeControllerImpl.isToEdge()); + assertTrue(mEdgeToEdgeControllerImpl.isToEdge()); + assertToEdgeExpectations(); } - // TODO: Verify inset or drawn under + /** Test the OSWrapper implementation without mocking it. Native ToEdge. */ + @Test + public void onObservingDifferentTab_osWrapperImpl() { + ChromeFeatureList.sDrawNativeEdgeToEdge.setForTesting(true); + EdgeToEdgeControllerImpl liveController = + (EdgeToEdgeControllerImpl) EdgeToEdgeControllerFactory.create( + mActivity, mObservableSupplierImpl); + Assert.assertNotNull(liveController); + when(mTab.isNativePage()).thenReturn(true); + mObservableSupplierImpl.set(mTab); + verify(mTab, times(2)).isNativePage(); + assertTrue(liveController.isToEdge()); + // Check the Navigation Bar color, as an indicator that we really changed the window. + assertEquals(Color.TRANSPARENT, mActivity.getWindow().getNavigationBarColor()); + } + + /** Test the OSWrapper implementation without mocking it. Native ToNormal. */ + @Test + public void onObservingDifferentTab_osWrapperImplToNormal() { + ChromeFeatureList.sDrawNativeEdgeToEdge.setForTesting(false); + EdgeToEdgeControllerImpl liveController = + (EdgeToEdgeControllerImpl) EdgeToEdgeControllerFactory.create( + mActivity, mObservableSupplierImpl); + Assert.assertNotNull(liveController); + when(mTab.isNativePage()).thenReturn(true); + mObservableSupplierImpl.set(mTab); + verify(mTab, times(2)).isNativePage(); + assertFalse(liveController.isToEdge()); + // Check the Navigation Bar color, as an indicator that we really changed the window. + assertNotEquals(Color.TRANSPARENT, mActivity.getWindow().getNavigationBarColor()); + } + + void assertToEdgeExpectations() { + verify(mOsWrapper).setNavigationBarColor(any(), eq(Color.TRANSPARENT)); + verify(mOsWrapper).setDecorFitsSystemWindows(any(), eq(false)); + verify(mOsWrapper).setOnApplyWindowInsetsListener(any(), any()); + mWindowInsetsListenerCaptor.getValue().onApplyWindowInsets(mViewMock, mWindowInsetsMock); + // Pad the top only, bottom is ToEdge. + verify(mOsWrapper).setPadding(any(), eq(0), intThat(Matchers.greaterThan(0)), eq(0), eq(0)); + } + + void assertToNormalExpectations() { + verify(mOsWrapper).setNavigationBarColor(any(), eq(Color.BLACK)); + verify(mOsWrapper).setDecorFitsSystemWindows(any(), eq(true)); + verify(mOsWrapper).setOnApplyWindowInsetsListener(any(), any()); + mWindowInsetsListenerCaptor.getValue().onApplyWindowInsets(mViewMock, mWindowInsetsMock); + // Pad the top and the bottom to keep it all normal. + verify(mOsWrapper) + .setPadding(any(), eq(0), intThat(Matchers.greaterThan(0)), eq(0), + intThat(Matchers.greaterThan(0))); + } + + void assertNoChangeExpectations() { + verifyNoInteractions(mOsWrapper); + } + + // TODO: Verify that the value of the updated insets returned from the + // OnApplyWindowInsetsListener is correct. }
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapper.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapper.java new file mode 100644 index 0000000..1ef9c77 --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapper.java
@@ -0,0 +1,67 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.edge_to_edge; + +import android.view.View; +import android.view.Window; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.OnApplyWindowInsetsListener; + +/** + * Wraps calls to the Android OS Edge To Edge APIs so we can easily instrument them. + */ +public interface EdgeToEdgeOSWrapper { + /** + * Wraps {@code WindowCompat#setDecorFitsSystemWindows}. + * Sets whether the decor view should fit root-level content views for WindowInsetsCompat. + * This determines whether the window decoration should fit within the System Windows (inset + * away from System Bars rather than to the edge of the screen beneath System Bars. + * @param window The Android {@link Window} that we're changing the decoration for. + * @param decorFitsSystemWindows If set to {@code false}, the framework will not fit the content + * view to the insets and will just pass through the WindowInsetsCompat to the content + * view. + */ + void setDecorFitsSystemWindows(@NonNull Window window, boolean decorFitsSystemWindows); + + /** + * Wraps {@link View#setPadding(int, int, int, int)}. + * Sets the padding for the given View. + * The view may add on the space required to display the scrollbars, depending on the style and + * visibility of the scrollbars. So the values returned from getPaddingLeft(), getPaddingTop(), + * getPaddingRight() and getPaddingBottom() may be different from the values set in this call. + * @param view The {@link View} to pad. + * @param left int: the left padding in pixels + * @param top int: the top padding in pixels + * @param right int: the right padding in pixels + * @param bottom int: the bottom padding in pixels + */ + void setPadding(View view, int left, int top, int right, int bottom); + + /** + * Wraps {@link Window#setNavigationBarColor(int color)} + * Sets the color of the navigation bar to the given color. + * For this to take effect, the window must be drawing + * the system bar backgrounds with WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS + * and WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION must not be set. If is not opaque, + * consider setting View.SYSTEM_UI_FLAG_LAYOUT_STABLE and + * View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION. + * @param window The Android {@link Window} whose bottom Navigation Bar background color to set. + * @param color int: The color to use for the Navigation Bar background. + */ + void setNavigationBarColor(@NonNull Window window, int color); + + /** + * Wraps {@code ViewCompat#setOnApplyWindowInsetsListener}. + * Set an {@link OnApplyWindowInsetsListener} to take over the policy for applying window insets + * to this view. This will only take effect on devices with API 21 or above. + * @param view The {@link View} to listen to. + * @param listener An {@link OnApplyWindowInsetsListener} to be called when the insets change + * for the {@link Window} that contains the view. + */ + void setOnApplyWindowInsetsListener( + @NonNull View view, @Nullable OnApplyWindowInsetsListener listener); +}
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapperImpl.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapperImpl.java new file mode 100644 index 0000000..750d973 --- /dev/null +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeOSWrapperImpl.java
@@ -0,0 +1,40 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.chrome.browser.ui.edge_to_edge; + +import android.view.View; +import android.view.Window; + +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import androidx.core.view.OnApplyWindowInsetsListener; +import androidx.core.view.ViewCompat; +import androidx.core.view.WindowCompat; + +/** + * Wraps calls to the Android OS Edge To Edge APIs so we can easily instrument them. + */ +public class EdgeToEdgeOSWrapperImpl implements EdgeToEdgeOSWrapper { + @Override + public void setDecorFitsSystemWindows(@NonNull Window window, boolean decorFitsSystemWindows) { + WindowCompat.setDecorFitsSystemWindows(window, decorFitsSystemWindows); + } + + @Override + public void setPadding(View view, int left, int top, int right, int bottom) { + view.setPadding(left, top, right, bottom); + } + + @Override + public void setNavigationBarColor(@NonNull Window window, int color) { + window.setNavigationBarColor(color); + } + + @Override + public void setOnApplyWindowInsetsListener( + @NonNull View view, @Nullable OnApplyWindowInsetsListener listener) { + ViewCompat.setOnApplyWindowInsetsListener(view, listener); + } +}
diff --git a/chrome/browser/ui/android/plus_addresses/java/res/layout/plus_address_creation_prompt.xml b/chrome/browser/ui/android/plus_addresses/java/res/layout/plus_address_creation_prompt.xml index db8557c..cd3d784 100644 --- a/chrome/browser/ui/android/plus_addresses/java/res/layout/plus_address_creation_prompt.xml +++ b/chrome/browser/ui/android/plus_addresses/java/res/layout/plus_address_creation_prompt.xml
@@ -23,7 +23,6 @@ android:layout_gravity="center" android:gravity="center" android:layout_marginBottom="@dimen/list_item_default_margin" - android:text="@string/plus_address_modal_title" style="@style/TextAppearance.Headline.Primary" /> <TextView
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPrompt.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPrompt.java index 0cca663c..8e696ac 100644 --- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPrompt.java +++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPrompt.java
@@ -29,7 +29,7 @@ private final View mDialogView; public PlusAddressCreationPrompt(PlusAddressCreationDelegate delegate, Activity activity, - String primaryEmailAddressHolder) { + String primaryEmailAddressHolder, String modalTitle) { mPlusAddressDelegate = delegate; LayoutInflater inflater = LayoutInflater.from(activity); mDialogView = inflater.inflate(R.layout.plus_address_creation_prompt, null); @@ -38,6 +38,8 @@ // inheriting the larger `generated_resources.grd`. This is a temporary state to work around // some project exigencies. Context context = ContextUtils.getApplicationContext(); + TextView modalTitleView = mDialogView.findViewById(R.id.plus_address_notice_title); + modalTitleView.setText(modalTitle); TextView primaryEmailView = mDialogView.findViewById(R.id.plus_address_modal_primary_email); primaryEmailView.setText(primaryEmailAddressHolder);
diff --git a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java index 16e145a..22cc4ddb 100644 --- a/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java +++ b/chrome/browser/ui/android/plus_addresses/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java
@@ -33,10 +33,10 @@ } @CalledByNative - private void show(WindowAndroid windowAndroid, String primaryEmailAddress) { + private void show(WindowAndroid windowAndroid, String primaryEmailAddress, String modalTitle) { Activity activity = windowAndroid.getActivity().get(); mPlusAddressCreationPrompt = - new PlusAddressCreationPrompt(this, activity, primaryEmailAddress); + new PlusAddressCreationPrompt(this, activity, primaryEmailAddress, modalTitle); mPlusAddressCreationPrompt.show(windowAndroid.getModalDialogManager()); }
diff --git a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPromptTest.java b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPromptTest.java index d28dac1..c5f7ad3 100644 --- a/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPromptTest.java +++ b/chrome/browser/ui/android/plus_addresses/junit/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationPromptTest.java
@@ -35,6 +35,7 @@ public class PlusAddressCreationPromptTest { private static final long NATIVE_PLUS_ADDRESS_CREATION_VIEW = 100L; private static final String EMAIL_PLACEHOLDER = "plus+plus@plus.plus"; + private static final String MODAL_TITLE = "mattwashere"; @Rule public JniMocker mJniMocker = new JniMocker(); @@ -59,7 +60,8 @@ private void createAndShowPrompt() { mModalDialogManager = new FakeModalDialogManager(ModalDialogType.APP); - mPrompt = new PlusAddressCreationPrompt(mPromptDelegate, mActivity, EMAIL_PLACEHOLDER); + mPrompt = new PlusAddressCreationPrompt( + mPromptDelegate, mActivity, EMAIL_PLACEHOLDER, MODAL_TITLE); mPrompt.show(mModalDialogManager); } @@ -69,9 +71,12 @@ createAndShowPrompt(); TextView primaryEmailView = mPrompt.getDialogViewForTesting().findViewById( R.id.plus_address_modal_primary_email); + TextView modalTitleView = + mPrompt.getDialogViewForTesting().findViewById(R.id.plus_address_notice_title); // Ensure that the email placeholder passed into the prompt is shown in the // appropriate spot. Assert.assertEquals(primaryEmailView.getText().toString(), EMAIL_PLACEHOLDER); + Assert.assertEquals(modalTitleView.getText().toString(), MODAL_TITLE); Assert.assertNotNull(mModalDialogManager.getShownDialogModel()); }
diff --git a/chrome/browser/ui/android/plus_addresses/plus_address_creation_view_android.cc b/chrome/browser/ui/android/plus_addresses/plus_address_creation_view_android.cc index c75c424..a2c0257f 100644 --- a/chrome/browser/ui/android/plus_addresses/plus_address_creation_view_android.cc +++ b/chrome/browser/ui/android/plus_addresses/plus_address_creation_view_android.cc
@@ -34,10 +34,17 @@ env, l10n_util::GetStringFUTF8( IDS_PLUS_ADDRESS_MODAL_REGULAR_ADDRESS_LABEL, base::UTF8ToUTF16(primary_email_address))); + + // TODO(b/303054310): Validate that this works as expected, and convert other + // strings in the view XML if so. + base::android::ScopedJavaLocalRef<jstring> j_title = + base::android::ConvertUTF16ToJavaString( + env, l10n_util::GetStringUTF16(IDS_PLUS_ADDRESS_MODAL_TITLE)); + Java_PlusAddressCreationViewBridge_show( env, java_object_, web_contents_->GetTopLevelNativeWindow()->GetJavaObject(), - j_formatted_email); + j_formatted_email, j_title); } void PlusAddressCreationViewAndroid::OnConfirmed(
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoUtil.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoUtil.java index 6a9d642..c1990c0 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoUtil.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoUtil.java
@@ -84,7 +84,7 @@ } if (!TextUtils.isEmpty( - UserPrefs.get(profile).getString(Pref.GOOGLE_SERVICES_LAST_USERNAME))) { + UserPrefs.get(profile).getString(Pref.GOOGLE_SERVICES_LAST_SYNCING_USERNAME))) { // Don't show if user has manually signed out. return false; }
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java index 6d6ae81f..84cc09b4 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/SyncConsentFragmentBase.java
@@ -810,7 +810,7 @@ new ConfirmSyncDataStateMachineDelegate( requireContext(), getChildFragmentManager(), mModalDialogManager), UserPrefs.get(Profile.getLastUsedRegularProfile()) - .getString(Pref.GOOGLE_SERVICES_LAST_USERNAME), + .getString(Pref.GOOGLE_SERVICES_LAST_SYNCING_USERNAME), mSelectedAccountEmail, new ConfirmSyncDataStateMachine.Listener() { @Override public void onConfirm(boolean wipeData) {
diff --git a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoTest.java b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoTest.java index 04070d34..b67c385c 100644 --- a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoTest.java +++ b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/FullScreenSyncPromoTest.java
@@ -99,7 +99,7 @@ .thenReturn(mIdentityManagerMock); when(mUserPrefsNativeMock.get(Profile.getLastUsedRegularProfile())) .thenReturn(mPrefServiceMock); - when(mPrefServiceMock.getString(Pref.GOOGLE_SERVICES_LAST_USERNAME)).thenReturn(""); + when(mPrefServiceMock.getString(Pref.GOOGLE_SERVICES_LAST_SYNCING_USERNAME)).thenReturn(""); } @After @@ -152,7 +152,7 @@ @Test public void manuallySignedOutReturnsFalse() { mAccountManagerTestRule.addAccount(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); - when(mPrefServiceMock.getString(Pref.GOOGLE_SERVICES_LAST_USERNAME)) + when(mPrefServiceMock.getString(Pref.GOOGLE_SERVICES_LAST_SYNCING_USERNAME)) .thenReturn(AccountManagerTestRule.TEST_ACCOUNT_EMAIL); mPrefManager.setSigninPromoLastShownVersion(38); Assert.assertFalse(FullScreenSyncPromoUtil.launchPromoIfNeeded(
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index b1d7ed54..5b721f62 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1415,6 +1415,9 @@ <message name="IDS_SIGN_OUT_OF_CHROME_LINK" desc="The text is displayed in a footer in a dialog to clear browsing data. The link ‘sign out of Chrome’ opens a dialog where the user can confirm if they want to sign out of Chrome."> To sign out of your Google Account on all websites, <ph name="BEGIN_LINK1"><link1></ph>sign out of Chrome<ph name="END_LINK1"></link1></ph>. </message> + <message name="IDS_SIGN_OUT_OF_CHROME_LINK_ADVANCED" desc="The text is displayed in a footer in the advanced option of clear browsing data dialog. The link ‘sign out of Chrome’ opens a dialog where the user can confirm if they want to sign out of Chrome."> + Clearing your browsing data doesn't sign you out of your Google Account. To do so, <ph name="BEGIN_LINK1"><link1></ph>sign out of Chrome<ph name="END_LINK1"></link1></ph>. + </message> <message name="IDS_CLEAR_SEARCH_HISTORY_NON_GOOGLE_DSE" desc="Text informing the user about the way to clear their search history when their Default Search Engine is not Google."> Your search engine is <ph name="dse">%1$s<ex>Bing</ex></ph>. See their instructions for deleting your search history, if applicable. </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_OUT_OF_CHROME_LINK_ADVANCED.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_OUT_OF_CHROME_LINK_ADVANCED.png.sha1 new file mode 100644 index 0000000..1a4ea6b3 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_SIGN_OUT_OF_CHROME_LINK_ADVANCED.png.sha1
@@ -0,0 +1 @@ +a70bf843ca779f092a5294671cc95b058d68a8b0 \ No newline at end of file
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 3e0fa94..893ecbd8 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
@@ -295,7 +295,6 @@ Privaatstatustoken verbeter privaatheid op die web en kan nie gebruik word om uit te vind wie jy is nie.</translation> <translation id="2581165646603367611">Dit sal koekies, kas en ander data uitvee van werwe wat Chrome nie dink belangrik is nie.</translation> <translation id="2587052924345400782">Nuwer weergawe is beskikbaar</translation> -<translation id="2589302627584222634">Skep ’n profielslot</translation> <translation id="2593272815202181319">Enkelspasie</translation> <translation id="2603212228005142861">Meld aan om jou voorkeure te bestuur</translation> <translation id="260403163289591229">Volg tans</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Nie nou nie</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Kom meer te wete<ph name="END_LINK" /> oor voorgestelde inhoud</translation> <translation id="3495219333887281978">Aanmelding se onderste blad is teen halwe hoogte oopgemaak.</translation> -<translation id="3498338220321963224">Jou gestoorde data sal uitgevee word as die profielslot later verwyder word.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Rangskik volgens oudste</translation> <translation id="3507132249039706973">Standaardbeskerming is aan</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Verwyder jou virtuele kaart?</translation> <translation id="4409271659088619928">Jou soekenjin is <ph name="DSE" />. Sien hul instruksies om jou soekgeskiedenis uit te vee, indien nodig.</translation> <translation id="4415276339145661267">Bestuur jou Google-rekening</translation> -<translation id="4417111749295506837">Jy moet ’n profielslot skep om jou Chrome-inligting te sinkroniseer en jou data veilig te hou in die motor. Jy sal ’n kode of ’n wagwoord gebruik elke keer wanneer jy in die motor klim.</translation> <translation id="4425140285732600465">Spoor tans prys na. Kry kennisgewings as die prys op enige werf daal.</translation> <translation id="442518031075347249">Jy sal nie meer jou virtuele kaart met Google Pay kan gebruik nie <ph name="BEGIN_LINK1" />Kom meer te wete oor virtuele kaarte<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Advertensiepersonalisering</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Stop prentbeskrywings</translation> <translation id="5966233851250124270">Chrome sal jou keuse onthou</translation> <translation id="5979084224081478209">Gaan wagwoorde na</translation> -<translation id="5985186846584605773">Skep ’n profielslot vir jou motor</translation> <translation id="5995726099713306770">Laai bladsy weer af?</translation> <translation id="6000066717592683814">Hou Google</translation> <translation id="6000203700195075278">Volg weer</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Verwyder voorstel uit geskiedenis?</translation> <translation id="6380100320871303656">Laai meer gereeld bladsye vooraf wat Chrome dink jy waarskynlik gaan besoek. Hierdie instelling kan groter datagebruik tot gevolg hê.</translation> <translation id="6382848304055775421">Voer uit</translation> -<translation id="6391355955030242704">Jy moet ’n profielslot in jou sekuriteitinstellings skep om jou Chrome-inligting te sinkroniseer en jou data veilig te hou in die motor. Jy sal ’n kode of ’n wagwoord gebruik elke keer wanneer jy in die motor klim.</translation> <translation id="6394791151443660613">Soek vir: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">SKAKEL</translation> <translation id="6397616442223433927">Weer aanlyn</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 df5f068a9..d95908e 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
@@ -295,7 +295,6 @@ የግል ሁኔታ ማስመሰያዎች በድሩ ላይ ግላዊነትን ያሻሽላሉ እና እርስዎ ማን እንደሆኑ ለማወቅ ሥራ ላይ መዋል አይችሉም።</translation> <translation id="2581165646603367611">ይሄ Chrome አስፈላጊ ናቸው ብሎ የማያስባቸውን ኩኪዎች፣ መሸጎጫ እና ሌሎች ጣቢያዎች ያጸዳል።</translation> <translation id="2587052924345400782">አዲስ ስሪት ይገኛል</translation> -<translation id="2589302627584222634">የመገለጫ መቆለፊያ ፍጠር</translation> <translation id="2593272815202181319">ሞኖስፔስ</translation> <translation id="2603212228005142861">ምርጫዎችዎን ለማስተዳደር በመለያ ይግቡ</translation> <translation id="260403163289591229">የምከተላቸው</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">አሁን አይደለም</translation> <translation id="3493531032208478708">ስለሚጠቆም ይዘት <ph name="BEGIN_LINK" />የበለጠ ለመረዳት<ph name="END_LINK" /></translation> <translation id="3495219333887281978">የመግቢያ የግርጌ ሉህ በግማሽ ቁመት ተከፍቷል።</translation> -<translation id="3498338220321963224">የመገለጫ መቆለፊያው በኋላ ከተወገደ የእርስዎ ተቀመጠ ውሂብ ይደመሰሳል።</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">በድሮ ደርድር</translation> <translation id="3507132249039706973">መደበኛ ጥበቃ በርቷል</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">ምናባዊ ካርድዎ ይወገድ?</translation> <translation id="4409271659088619928">የእርስዎ የፍለጋ ፕሮግራም <ph name="DSE" /> ነው። መተግበር የሚችል ከሆነ የፍለጋ ታሪክዎን ለመሰረዝ መመሪያዎቻቸውን ይመልከቱ።</translation> <translation id="4415276339145661267">የGoogle መለያዎን ያቀናብሩ</translation> -<translation id="4417111749295506837">በመኪናው ውስጥ የChrome መረጃዎን ለማስመር እና የውሂብዎን ደህንነት ለመጠበቅ የመገለጫ መቆለፊያ መፍጠር አለብዎት። ወደ መኪናው በሚገቡበት እያንዳንዱ ጊዜ ኮድ ወይም የይለፍ ቃል ይጠቀማሉ።</translation> <translation id="4425140285732600465">ዋጋዎችን በመከታተል ላይ። በማንኛውም ጣቢያ ላይ ዋጋው ቢቀንስ ማንቂያዎችን ያግኙ።</translation> <translation id="442518031075347249">ከእንግዲህ የእርስዎን ምናባዊ ካርድ በGoogle Pay መጠቀም አይችሉም። <ph name="BEGIN_LINK1" />ስለምናባዊ ካርዶች የበለጠ ይወቁ<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ማስታወቂያን ግላዊነት ማላበስ</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">የምስል መግለጫዎችን አቁም</translation> <translation id="5966233851250124270">Chrome የእርስዎን ምርጫ ያስታውሳል</translation> <translation id="5979084224081478209">የይለፍ ቃላትዎን ይፈትሹ</translation> -<translation id="5985186846584605773">ለመኪናዎ የመገለጫ መቆለፊያ ይፍጠሩ</translation> <translation id="5995726099713306770">ገፅ እንደገና ይውረድ?</translation> <translation id="6000066717592683814">Googleን አቆየው</translation> <translation id="6000203700195075278">እንደገና ይከተሉ</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">ጥቆማው ከታሪክ ይወገድ?</translation> <translation id="6380100320871303656">Chrome እርስዎ የመጎብኘት ዕድልዎ ከፍ ያለ ነው የሚልባቸው ገጾችን በበለጠ ተደጋጋሚነት ቅድሚያ ይጭናቸዋል። ይህ ቅንብር የጨመረ የውሂብ አጠቃቀምን ሊያስከትል ይችላል።</translation> <translation id="6382848304055775421">ወደ ውጭ በመላክ ላይ</translation> -<translation id="6391355955030242704">በመኪናዎ ውስጥ የChrome መረጃዎን ለማስመር እና የውሂብዎን ደህንነት ለመጠበቅ በእርስዎ የደህንነት ቅንብሮች ውስጥ የመገለጫ መቆለፊያ መፍጠር አለብዎት። ወደ መኪናው በሚገቡበት እያንዳንዱ ጊዜ ኮድ ወይም የይለፍ ቃል ይጠቀማሉ።</translation> <translation id="6394791151443660613">ይፈልጉ፦ <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">አገናኝ</translation> <translation id="6397616442223433927">ወደ መስመር ላይ ይመለሱ</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 49f37a4..eee9ddc 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
@@ -295,7 +295,6 @@ تعمل "الرموز المميّزة للحالة الخاصة" على تحسين الخصوصية على الويب ولا يمكن استخدامها لمعرفة هويتك.</translation> <translation id="2581165646603367611">سيؤدي هذا إلى محو ملفات تعريف الارتباط وذاكرة التخزين المؤقت والبيانات الأخرى للمواقع التي لا يعتقد Chrome أنها مهمة.</translation> <translation id="2587052924345400782">يتوفر إصدار أحدث</translation> -<translation id="2589302627584222634">إنشاء قفل للملف الشخصي</translation> <translation id="2593272815202181319">أحادي المسافة</translation> <translation id="2603212228005142861">تسجيل الدخول لإدارة إعداداتك المفضَّلة</translation> <translation id="260403163289591229">المواقع التي تتابعها</translation> @@ -478,7 +477,6 @@ <translation id="3479552764303398839">ليس الآن</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />مزيد من المعلومات<ph name="END_LINK" /> حول المحتوى المقترح</translation> <translation id="3495219333887281978">تم فتح البطاقة السفلية لتسجيل الدخول في نصف الشاشة.</translation> -<translation id="3498338220321963224">في حال إزالة قفل الملف الشخصي في وقت لاحق، سيتم محو بياناتك المحفوظة.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">الترتيب حسب الأقدم</translation> <translation id="3507132249039706973">ميزة الحماية العادية مفعّلة.</translation> @@ -652,7 +650,6 @@ <translation id="4405636711880428279">هل تريد إزالة بطاقتك الإفتراضية؟</translation> <translation id="4409271659088619928">محرّك البحث المستخدَم لديك هو <ph name="DSE" />. يمكنك الاطّلاع على تعليمات محرّك البحث الذي تستخدمه بشأن حذف سجلّ البحث إذا كان يوفّر هذه الميزة.</translation> <translation id="4415276339145661267">إدارة حسابك على Google</translation> -<translation id="4417111749295506837">لمزامنة معلومات Chrome والحفاظ على أمان بياناتك في السيارة، عليك إنشاء قفل للملف الشخصي. ستستخدم رمزًا أو كلمة مرور في كل مرة تدخل فيها السيارة.</translation> <translation id="4425140285732600465">تم تفعيل ميزة تتبُّع السعر. يمكنك الحصول على تنبيهات في حال انخفاض السعر على أي موقع إلكتروني.</translation> <translation id="442518031075347249">لن تتمكّن من استخدام بطاقتك الافتراضية هذه مجدّدًا مع خدمة Google Pay. <ph name="BEGIN_LINK1" />مزيد من المعلومات حول البطاقات الافتراضية<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">تخصيص الإعلانات</translation> @@ -964,7 +961,6 @@ <translation id="5964869237734432770">إيقاف عرض أوصاف الصور</translation> <translation id="5966233851250124270">سيتذكر متصفِّح Chrome اختيارك</translation> <translation id="5979084224081478209">التحقق من كلمات المرور</translation> -<translation id="5985186846584605773">إنشاء قفل للملف الشخصي في سيارتك</translation> <translation id="5995726099713306770">هل تريد تنزيل الصفحة مرة أخرى؟</translation> <translation id="6000066717592683814">الاستمرار في استخدام محرك Google</translation> <translation id="6000203700195075278">المتابعة مجدّدًا</translation> @@ -1033,7 +1029,6 @@ <translation id="6364438453358674297">هل تريد إزالة اقتراح من السجل؟</translation> <translation id="6380100320871303656">يعمل هذا الإعداد على إجراء تحميل مُسبق وبشكل أكثر تكرارًا لصفحات الويب التي يظن Chrome أنّه من المرجّح أن تنتقل إليها. وقد يؤدي هذا الإعداد إلى زيادة استخدام البيانات.</translation> <translation id="6382848304055775421">جارٍ التصدير</translation> -<translation id="6391355955030242704">لمزامنة معلومات Chrome والحفاظ على أمان بياناتك في السيارة، عليك إنشاء قفل للملف الشخصي من خلال إعدادات الأمان. ستستخدم رمزًا أو كلمة مرور في كل مرة تدخل فيها السيارة.</translation> <translation id="6394791151443660613">البحث عن: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">رابط</translation> <translation id="6397616442223433927">تمّت استعادة الاتصال بالإنترنت.</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb index b0491c9..32c8d01 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_as.xtb
@@ -294,7 +294,6 @@ প্ৰাইভেট ষ্টে’ট ট’কেনসমূহে ৱেবত গোপনীয়তা উন্নত কৰে আৰু সেইবোৰক আপোনাৰ পৰিচয় জানিবলৈ ব্যৱহাৰ কৰিব পৰা নাযায়।</translation> <translation id="2581165646603367611">ই কুকি, কেশ্ব আৰু Chromeএ গুৰুত্বপূর্ণ বুলি নভবা ছাইটসমূহৰ অন্য ডেটা মচিব।</translation> <translation id="2587052924345400782">নতুন সংস্কৰণ উপলব্ধ</translation> -<translation id="2589302627584222634">এটা প্ৰ’ফাইল লক সৃষ্টি কৰক</translation> <translation id="2593272815202181319">ম'ন'স্পেছ</translation> <translation id="2603212228005142861">আপোনাৰ অগ্ৰাধিকাৰসমূহ পৰিচালনা কৰিবলৈ ছাইন ইন কৰক</translation> <translation id="260403163289591229">ফ’ল’ কৰি আছে</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">এতিয়া নহয়</translation> <translation id="3493531032208478708">পৰামৰ্শ দিয়া সমলৰ বিষয়ে <ph name="BEGIN_LINK" />অধিক জানক<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ছাইন ইন কৰাৰ সুবিধা থকা তলৰ শ্বীটখন অৰ্ধ উচ্চতাত খোলা হৈছে।</translation> -<translation id="3498338220321963224">যদি প্ৰ'ফাইল লকটো পাছত আঁতৰোৱা হয়, তেন্তে আপোনাৰ ছেভ হৈ থকা ডেটা মচি পেলোৱা হ'ব।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">পুৰণি অনুসৰি সজাওক</translation> <translation id="3507132249039706973">সাধাৰণ সুৰক্ষা অন আছে</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">আপোনাৰ ভাৰ্ছুৱেল কাৰ্ডখন আঁতৰাবনে?</translation> <translation id="4409271659088619928">আপোনাৰ সন্ধানৰ ইঞ্জিনটো হৈছে <ph name="DSE" />। যদি প্ৰযোজ্য হয়, আপোনাৰ সন্ধানৰ ইতিহাস মচিবলৈ আপোনাৰ সন্ধানৰ ইঞ্জিনৰ নিৰ্দেশাৱলী চাওক।</translation> <translation id="4415276339145661267">আপোনাৰ Google একাউণ্ট পৰিচালনা কৰক</translation> -<translation id="4417111749295506837">আপোনাৰ Chromeৰ তথ্য ছিংক কৰিবলৈ আৰু গাড়ীত আপোনাৰ ডেটা সুৰক্ষিত ৰাখিবলৈ, আপুনি এটা প্ৰ’ফাইল লক সৃষ্টি কৰিবই লাগিব। আপুনি প্ৰতিবাৰ গাড়ীত প্ৰৱেশ কৰাৰ সময়ত এটা ক’ড অথবা পাছৱৰ্ড ব্যৱহাৰ কৰিব।</translation> <translation id="4425140285732600465">মূল্য ট্ৰেক কৰাটো সক্ষম কৰা হ’ল। কোনো ছাইটত মূল্য কমিলে সতৰ্কবাৰ্তা পাওক।</translation> <translation id="442518031075347249">আপুনি আপোনাৰ ভাৰ্ছুৱেল কাৰ্ডখন Google Payৰ জৰিয়তে আৰু ব্যৱহাৰ কৰিব নোৱাৰিব। <ph name="BEGIN_LINK1" />ভাৰ্ছুৱেল কাৰ্ডৰ বিষয়ে অধিক জানক<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">বিজ্ঞাপন ব্যক্তিগতকৰণ</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">প্ৰতিচ্ছবিৰ বিৱৰণ বন্ধ কৰক</translation> <translation id="5966233851250124270">Chromeএ আপোনাৰ পচন্দ মনত ৰাখিব</translation> <translation id="5979084224081478209">পাছৱৰ্ডবোৰ পৰীক্ষা কৰক</translation> -<translation id="5985186846584605773">আপোনাৰ গাড়ীখনৰ বাবে এটা প্ৰ’ফাইল লক সৃষ্টি কৰক</translation> <translation id="5995726099713306770">পৃষ্ঠাখন পুনৰ ডাউনল’ড কৰিবনে?</translation> <translation id="6000066717592683814">Google ৰাখক</translation> <translation id="6000203700195075278">পুনৰ ফ’ল’ কৰক</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">ইতিহাসৰ পৰা পৰামৰ্শ আঁতৰাবনে?</translation> <translation id="6380100320871303656">Chromeএ যিবোৰ পৃষ্ঠালৈ আপুনি যাব পাৰে বুলি ভাবে সেইসমূহ অধিক সঘনে আগতীয়াকৈ ল’ড কৰে। এই ছেটিংটোৱে ডেটাৰ ব্যৱহাৰ বঢ়াব পাৰে।</translation> <translation id="6382848304055775421">ৰপ্তানি কৰি থকা হৈছে</translation> -<translation id="6391355955030242704">আপোনাৰ Chromeৰ তথ্য ছিংক কৰিবলৈ আৰু গাড়ীত আপোনাৰ ডেটা সুৰক্ষিত ৰাখিবলৈ, আপুনি আপোনাৰ সুৰক্ষা সম্পৰ্কীয় ছেটিঙত এটা প্ৰ’ফাইল লক সৃষ্টি কৰিবই লাগিব। আপুনি প্ৰতিবাৰ গাড়ীত প্ৰৱেশ কৰাৰ সময়ত এটা ক’ড অথবা পাছৱৰ্ড ব্যৱহাৰ কৰিব।</translation> <translation id="6394791151443660613">সন্ধান কৰক: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">লিংক</translation> <translation id="6397616442223433927">আকৌ অনলাইন হৈছে</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb index 41f25fb..6876d8cf 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_az.xtb
@@ -294,7 +294,6 @@ Özəl açarları internetdə məxfiliyi yaxşılaşdırır və kim olduğunuzu öyrənmək üçün istifadə edilə bilməz.</translation> <translation id="2581165646603367611">Bu, Chrome'un vacib hesab etmədiyi kukilər, keş və digər sayt datalarını siləcək.</translation> <translation id="2587052924345400782">Ən yeni versiya əlçatandır</translation> -<translation id="2589302627584222634">Profil kilidi yaradın</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Tərcihləri idarə etmək üçün daxil olun</translation> <translation id="260403163289591229">İzlənilir</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">İndi yox</translation> <translation id="3493531032208478708">Təklif məzmunu haqqında <ph name="BEGIN_LINK" />daha ətraflı<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Giriş alt vərəqi yarı hündürlükdə açılıb.</translation> -<translation id="3498338220321963224">Profil kilidi çıxarılsa, saxlanmış data silinəcək.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ən köhnə üzrə sıralayın</translation> <translation id="3507132249039706973">Standart Qoruma aktivdir</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Virtual kartınız silinsin?</translation> <translation id="4409271659088619928">Axtarış sisteminiz <ph name="DSE" />. Axtarış tarixçənizi silmək üçün onun təlimatlarına (təmin edilibsə) baxın.</translation> <translation id="4415276339145661267">Google Hesabını idarə edin</translation> -<translation id="4417111749295506837">Chrome məlumatlarını sinxronlaşdırmaq və avtomobildə datanı təhlükəsiz saxlamaq üçün profil kilidi yaratmalısınız. Avtomobilə minəndə kod və ya parol istifadə edəcəksiniz.</translation> <translation id="4425140285732600465">Qiymət izlənilir. Hər hansı bir saytda qiymət enərsə, bildiriş alın</translation> <translation id="442518031075347249">Artıq virtual kartınızı Google Pay ilə istifadə edə bilməyəcəksiniz. <ph name="BEGIN_LINK1" />Virtual kartlar haqqında ətraflı məlumat<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Reklam fərdiləşdirməsi</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Şəkil təsvirini dayandırın</translation> <translation id="5966233851250124270">Chrome seçiminizi yadda saxlayacaq</translation> <translation id="5979084224081478209">Parolları yoxlayın</translation> -<translation id="5985186846584605773">Avtomobil üçün profil kilidi yaradın</translation> <translation id="5995726099713306770">Səhifə yenidən endirilsin?</translation> <translation id="6000066717592683814">Google'u saxlayın</translation> <translation id="6000203700195075278">Yenidən izləyin</translation> @@ -1029,7 +1025,6 @@ <translation id="6364438453358674297">Təklif tarixçədən silinsin?</translation> <translation id="6380100320871303656">Chrome'un ziyarət edəcəyinizi düşündüyü səhifələr daha çox əvvəlcədən yüklənir. Bu ayar data istifadəsinin artması ilə nəticələnə bilər.</translation> <translation id="6382848304055775421">Eksport edilir</translation> -<translation id="6391355955030242704">Chrome məlumatlarını sinxronlaşdırmaq və avtomobildə datanı təhlükəsiz saxlamaq üçün güvənlik ayarlarında profil kilidi yaratmalısınız. Avtomobilə minəndə kod və ya parol istifadə edəcəksiniz.</translation> <translation id="6394791151443660613">Axtarış: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LİNK</translation> <translation id="6397616442223433927">Bağlantı bərpa edildi</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 73cff09..17c2803 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
@@ -294,7 +294,6 @@ Прыватныя токены стану павышаюць узровень прыватнасці ў інтэрнэце. З іх дапамогай нельга ідэнтыфікаваць вашу асобу.</translation> <translation id="2581165646603367611">Пры гэтым ачысціцца кэш, будуць выдалены файлы cookie і іншыя даныя сайтаў, якія Chrome не лічыць важнымі.</translation> <translation id="2587052924345400782">Даступная навейшая версія</translation> -<translation id="2589302627584222634">Стварыць блакіроўку профілю</translation> <translation id="2593272815202181319">Монашырынны</translation> <translation id="2603212228005142861">Каб задаваць налады, увайдзіце ва ўліковы запіс</translation> <translation id="260403163289591229">Вы падпісаны</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Не зараз</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Даведацца больш<ph name="END_LINK" /> пра прапанаванае змесціва</translation> <translation id="3495219333887281978">Ніжні аркуш са спісам даступных для выбару ўліковых запісаў разгорнуты на палову экрана.</translation> -<translation id="3498338220321963224">Калі пазней адключыць блакіроўку профілю, захаваныя даныя будуць сцёрты.</translation> <translation id="3499246418971111862">chrome_qr-код_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Спачатку старыя</translation> <translation id="3507132249039706973">Стандартная абарона ўключана</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Выдаліць віртуальную картку?</translation> <translation id="4409271659088619928">Ваша пошукавая сістэма – <ph name="DSE" />. Каб выдаліць гісторыю пошуку, выканайце інструкцыі гэтай сістэмы (калі яны даступныя).</translation> <translation id="4415276339145661267">Кіраванне Уліковым запісам Google</translation> -<translation id="4417111749295506837">Каб сінхранізаваць звесткі Chrome і абараняць даныя ў аўтамабілі, уключыце блакіроўку профілю. Вам трэба будзе ўводзіць код або пароль кожны раз, калі вы садзіцеся ў аўтамабіль.</translation> <translation id="4425140285732600465">Цана адсочваецца. Пры зніжэнні цаны на любым з сайтаў вы будзеце атрымліваць абвесткі.</translation> <translation id="442518031075347249">Вы больш не зможаце выкарыстоўваць віртуальную картку для аплаты праз Google Pay. <ph name="BEGIN_LINK1" />Даведацца больш пра віртуальныя карткі<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Персаналізацыя рэкламы</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Не атр. апісанні відарысаў</translation> <translation id="5966233851250124270">Chrome запомніць ваш выбар</translation> <translation id="5979084224081478209">Праверыць паролі</translation> -<translation id="5985186846584605773">Стварыць блакіроўку профілю для аўтамабіля</translation> <translation id="5995726099713306770">Спампаваць старонку зноў?</translation> <translation id="6000066717592683814">Пакінуць Google</translation> <translation id="6000203700195075278">Падпісацца зноў</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Выдаліць прапанову з гісторыі?</translation> <translation id="6380100320871303656">Chrome часцей перадзагружае старонкі, якія вы з вялікай імавернасцю наведаеце. Пры выкарыстанні гэтай налады можа павялічыцца расход трафіка.</translation> <translation id="6382848304055775421">Ідзе экспарт</translation> -<translation id="6391355955030242704">Каб сінхранізаваць звесткі Chrome і абараняць даныя ў аўтамабілі, уключыце блакіроўку профілю ў наладах бяспекі. Вам трэба будзе ўводзіць код або пароль кожны раз, калі вы садзіцеся ў аўтамабіль.</translation> <translation id="6394791151443660613">Пошук: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">СУВЯЗЬ</translation> <translation id="6397616442223433927">Зноў у інтэрнэце</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 07a9718..06dab1b 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
@@ -294,7 +294,6 @@ Токените за частно състояние подобряват поверителността в мрежата и не могат да се използват за определяне на самоличността ви.</translation> <translation id="2581165646603367611">Така ще се изчистят „бисквитките“, кешът и другата информация от сайтове, която не е важна за Chrome.</translation> <translation id="2587052924345400782">Налице е по-нова версия</translation> -<translation id="2589302627584222634">Задаване на опция за заключване на потребителския профил</translation> <translation id="2593272815202181319">Непропорционален</translation> <translation id="2603212228005142861">Влезте в профила си, за да управлявате предпочитанията си</translation> <translation id="260403163289591229">Следено</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Не сега</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Научете повече<ph name="END_LINK" /> за предложеното съдържание</translation> <translation id="3495219333887281978">Долният лист за вход в профила е отворен на половината височина.</translation> -<translation id="3498338220321963224">Запазените от вас данни ще бъдат изтрити, ако опцията за заключване на потребителския профил бъде премахната по-късно.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Сортиране по най-стари</translation> <translation id="3507132249039706973">Режимът за стандартна защита е включен</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Да се премахне ли виртуалната ви карта?</translation> <translation id="4409271659088619928">Търсещата ви машина е <ph name="DSE" />. Вижте инструкциите ѝ относно изтриването на историята на търсенията ви (ако е приложимо).</translation> <translation id="4415276339145661267">Управление на профила ви в Google</translation> -<translation id="4417111749295506837">За да синхронизирате информацията си в Chrome и да защитите данните си в автомобила, трябва да зададете опция за заключване на потребителския профил. При всяко влизане в автомобила ще използвате код или парола.</translation> <translation id="4425140285732600465">Цената се проследява. Ще получавате сигнали, когато има понижение в който и да е сайт.</translation> <translation id="442518031075347249">Вече няма да можете да използвате виртуалната си карта с Google Pay. <ph name="BEGIN_LINK1" />Научете повече за виртуалните карти<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Персонализиране на рекламите</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Спиране на описанията</translation> <translation id="5966233851250124270">Chrome ще запомни избора ви</translation> <translation id="5979084224081478209">Проверка на паролите</translation> -<translation id="5985186846584605773">Задаване на опция за заключване на потребителския профил за автомобила ви</translation> <translation id="5995726099713306770">Искате ли отново да изтеглите страницата?</translation> <translation id="6000066717592683814">Запазване на Google</translation> <translation id="6000203700195075278">Повторно следене</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Предложението да се премахне ли от историята?</translation> <translation id="6380100320871303656">По-често предварително зареждане на страниците, които Chrome смята, че е вероятно да посетите. Тази настройка може да повиши количеството използвани данни.</translation> <translation id="6382848304055775421">Експортира се</translation> -<translation id="6391355955030242704">За да синхронизирате информацията си в Chrome и да защитите данните си в автомобила, трябва да зададете опция за заключване на потребителския профил в настройките си за сигурност. При всяко влизане в автомобила ще използвате код или парола.</translation> <translation id="6394791151443660613">Търсене: „<ph name="SEARCH_QUERY" />“</translation> <translation id="6395288395575013217">ВРЪЗКА</translation> <translation id="6397616442223433927">Отново онлайн</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb index 1253566..3583527 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_bn.xtb
@@ -294,7 +294,6 @@ ব্যক্তিগত স্টেট টোকেন, ওয়েবে আপনার গোপনীয়তার দিকটি উন্নত করে এবং আপনার ব্যক্তিগত পরিচয় খোঁজার জন্য ব্যবহার করা যাবে না।</translation> <translation id="2581165646603367611">এটা কুকিজ, ক্যাশে, এবং সাইটের সেই সব ডেটা যা Chrome গুরুত্বপূর্ণ মনে করে না সেগুলিকে সাফ করবে।</translation> <translation id="2587052924345400782">নতুন ভার্সন উপলভ্য</translation> -<translation id="2589302627584222634">'প্রোফাইল লক' তৈরি করুন</translation> <translation id="2593272815202181319">মোনোস্পেস</translation> <translation id="2603212228005142861">আপনার পছন্দগুলি ম্যানেজ করতে সাইন-ইন করুন</translation> <translation id="260403163289591229">ফলো করছেন</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">এখনই নয়</translation> <translation id="3493531032208478708">প্রস্তাবিত কন্টেন্ট সম্পর্কে <ph name="BEGIN_LINK" />আরও জানুন<ph name="END_LINK" /></translation> <translation id="3495219333887281978">স্ক্রিনের নিচে অ্যাটাচ করা শিটে সাইন-ইন করার সুবিধা অর্ধেক স্ক্রিন জুড়ে খুলেছে।</translation> -<translation id="3498338220321963224">প্রোফাইল লক পরে সরিয়ে দিলে আপনার সেভ করা ডেটা মুছে যাবে।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">পুরনো অনুযায়ী সাজান</translation> <translation id="3507132249039706973">"স্ট্যান্ডার্ড সুরক্ষা" ফিচারটি চালু করা আছে</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">আপনার ভার্চুয়াল কার্ড সরাতে চান?</translation> <translation id="4409271659088619928">আপনার সার্চ ইঞ্জিনের নাম হল, <ph name="DSE" />। এক্ষেত্রে প্রযোজ্য হলে, আপনার সার্চ ইতিহাস মোছার জন্য সেটির নির্দেশাবলী দেখুন।</translation> <translation id="4415276339145661267">আপনার Google অ্যাকাউন্ট ম্যানেজ করুন</translation> -<translation id="4417111749295506837">আপনার Chrome সম্পর্কিত তথ্য সিঙ্ক করতে এবং গাড়িতে ডেটা সুরক্ষিত রাখতে, অবশ্যই প্রোফাইল লক তৈরি করতে হবে। প্রতিবার গাড়িতে প্রবেশ করার সময় আপনাকে একটি কোড বা পাসওয়ার্ড ব্যবহার করতে হবে।</translation> <translation id="4425140285732600465">দাম ট্র্যাক করা হচ্ছে। কোনও সাইটে দাম কমলে সেই বিষয়ে বিজ্ঞপ্তি পান।</translation> <translation id="442518031075347249">Google Pay অ্যাপে আপনার ভার্চুয়াল কার্ড আর ব্যবহার করতে পারবেন না। <ph name="BEGIN_LINK1" />ভার্চুয়াল কার্ড সম্পর্কে আরও জানুন<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">পছন্দ অনুযায়ী বিজ্ঞাপন বেছে নেওয়া</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">ছবির বিবরণ বন্ধ করুন</translation> <translation id="5966233851250124270">Chrome আপনার পছন্দ মনে রাখবে</translation> <translation id="5979084224081478209">পাসওয়ার্ড চেক করুন</translation> -<translation id="5985186846584605773">আপনার গাড়ির জন্য 'প্রোফাইল লক' তৈরি করুন</translation> <translation id="5995726099713306770">পৃষ্ঠাটি আবার ডাউনলোড করবেন?</translation> <translation id="6000066717592683814">Google কে রাখুন</translation> <translation id="6000203700195075278">আবার ফলো করুন</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">ইতিহাস থেকে প্রস্তাবনা সরাবেন?</translation> <translation id="6380100320871303656">Chrome-এর মতে আপনি যেসব পৃষ্ঠা দেখতে পারেন সেগুলি আরও ঘনঘন লোড করা হয়। এই সেটিং ব্যবহার করা হলে আরও ডেটা খরচ হওয়ার সম্ভাবনা থাকে।</translation> <translation id="6382848304055775421">এক্সপোর্ট করা হচ্ছে</translation> -<translation id="6391355955030242704">আপনার Chrome সম্পর্কিত তথ্য সিঙ্ক করতে এবং গাড়িতে ডেটা সুরক্ষিত রাখতে, নিজের সেটিংসে অবশ্যই আপনাকে প্রোফাইল লক তৈরি করতে হবে। প্রতিবার গাড়িতে প্রবেশ করার সময় আপনাকে একটি কোড বা পাসওয়ার্ড ব্যবহার করতে হবে।</translation> <translation id="6394791151443660613">সার্চ করুন: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">লিঙ্ক</translation> <translation id="6397616442223433927">আবার অনলাইন হয়েছেন</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 bae8e80..0b47dfd 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
@@ -294,7 +294,6 @@ Privatni tokeni stanja poboljšavaju zaštitu privatnosti na webu i ne mogu se koristiti za utvrđivanje vašeg identiteta.</translation> <translation id="2581165646603367611">Na ovaj način će se obrisati kolačići, keš memorija i drugi podaci s web lokacija za koje Chrome smatra da su nebitne.</translation> <translation id="2587052924345400782">Dostupna je nova verzija</translation> -<translation id="2589302627584222634">Kreirajte zaključavanje profila</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Prijavite se da upravljate postavkama</translation> <translation id="260403163289591229">Pratite</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ne sada</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3495219333887281978">Donja tabela za prijavu je otvorena na pola visine.</translation> -<translation id="3498338220321963224">Vaši sačuvani podaci će biti potpuno izbrisani ako kasnije uklonite zaključavanje profila.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Poredaj od najstarijeg</translation> <translation id="3507132249039706973">Standardna zaštita je uključena</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Ukloniti virtuelnu karticu?</translation> <translation id="4409271659088619928">Vaš pretraživač je <ph name="DSE" />. Ako je primjenjivo, pogledajte uputstva pretraživača da saznate kako izbrisati historiju pretraživanja.</translation> <translation id="4415276339145661267">Upravljajte Google računom</translation> -<translation id="4417111749295506837">Da sinhronizirate Chrome informacije i zaštitite podatke u automobilu, morate kreirati zaključavanje profila. Koristit ćete kôd ili lozinku svaki put kada uđete u automobil.</translation> <translation id="4425140285732600465">Praćenje cijene. Primajte obavještenja ako cijena padne na bilo kojoj web lokaciji.</translation> <translation id="442518031075347249">Više nećete moći koristiti virtuelnu karticu s Google Payom. <ph name="BEGIN_LINK1" />Saznajte više o virtuelnim karticama<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizacija oglasa</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Zaustavi opise slika</translation> <translation id="5966233851250124270">Chrome će zapamtiti vaš izbor</translation> <translation id="5979084224081478209">Provjeri lozinke</translation> -<translation id="5985186846584605773">Kreirajte zaključavanje profila za automobil</translation> <translation id="5995726099713306770">Ponovo preuzeti stranicu?</translation> <translation id="6000066717592683814">Zadrži Google</translation> <translation id="6000203700195075278">Prati ponovo</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Ukloniti prijedloge iz historije?</translation> <translation id="6380100320871303656">Češće predučitavanje stranica za koje Chrome smatra da ćete ih vjerovatno posjetiti. Ova postavka može dovesti do povećanog korištenja podataka.</translation> <translation id="6382848304055775421">Izvoz</translation> -<translation id="6391355955030242704">Da sinhronizirate Chrome informacije i zaštitite podatke u automobilu, morate kreirati zaključavanje profila u sigurnosnim postavkama. Koristit ćete kôd ili lozinku svaki put kada uđete u automobil.</translation> <translation id="6394791151443660613">Pretraživanje: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Ponovo na mreži</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb index a57a4aa..6175bc3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ca.xtb
@@ -294,7 +294,6 @@ Els testimonis d'estat privat milloren la privadesa al web i no poden utilitzar-se per esbrinar qui ets.</translation> <translation id="2581165646603367611">Amb aquesta acció, se suprimiran les galetes, la memòria cau i altres dades de llocs que Chrome no consideri importants.</translation> <translation id="2587052924345400782">Versió nova disponible</translation> -<translation id="2589302627584222634">Crea un bloqueig de perfil</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Inicia la sessió per gestionar les teves preferències</translation> <translation id="260403163289591229">Seguint</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ara no</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Més informació<ph name="END_LINK" /> sobre el contingut suggerit</translation> <translation id="3495219333887281978">El full inferior d'inici de sessió s'ha obert a mitja alçada.</translation> -<translation id="3498338220321963224">Les dades desades s'esborraran si el bloqueig de perfil se suprimeix més endavant.</translation> <translation id="3499246418971111862">chrome_codiqr_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordena per més antic</translation> <translation id="3507132249039706973">La protecció estàndard està activada</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Vols suprimir la targeta virtual?</translation> <translation id="4409271659088619928">El teu motor de cerca és <ph name="DSE" />. Consulta'n les instruccions per suprimir l'historial de cerques, si escau.</translation> <translation id="4415276339145661267">Gestiona el teu Compte de Google</translation> -<translation id="4417111749295506837">Per sincronitzar la teva informació de Chrome i protegir les teves dades al cotxe, has de crear un bloqueig de perfil. Hauràs d'utilitzar un codi o una contrasenya cada vegada que pugis al cotxe.</translation> <translation id="4425140285732600465">Estàs fent un seguiment del preu. Si el preu baixa en qualsevol lloc web, rebràs una alerta.</translation> <translation id="442518031075347249">Ja no podràs utilitzar la targeta virtual amb Google Pay. <ph name="BEGIN_LINK1" />Obtén més informació sobre les targetes virtuals<ph name="END_LINK1" />.</translation> <translation id="4428065317363009941">Personalització d'anuncis</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Atura descripcions d'imatges</translation> <translation id="5966233851250124270">Chrome recordarà la teva elecció</translation> <translation id="5979084224081478209">Comprova les contrasenyes</translation> -<translation id="5985186846584605773">Crea un bloqueig de perfil per al cotxe</translation> <translation id="5995726099713306770">Vols tornar a baixar la pàgina?</translation> <translation id="6000066717592683814">Continua amb Google</translation> <translation id="6000203700195075278">Torna a seguir</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Voleu suprimir el suggeriment de l'historial?</translation> <translation id="6380100320871303656">Carrega prèviament, i amb més freqüència, les pàgines que Chrome considera que és possible que visitis. Aquesta opció de configuració pot suposar un augment de l'ús de dades.</translation> <translation id="6382848304055775421">S'està exportant</translation> -<translation id="6391355955030242704">Per sincronitzar la teva informació de Chrome i protegir les teves dades al cotxe, has de crear un bloqueig de perfil a la configuració de seguretat. Hauràs d'utilitzar un codi o una contrasenya cada vegada que pugis al cotxe.</translation> <translation id="6394791151443660613">Cerca: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ENLLAÇ</translation> <translation id="6397616442223433927">Tornes a tenir connexió</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 d8f3c2f..e8b8040 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
@@ -294,7 +294,6 @@ Tokeny soukromého stavu zvyšují ochranu soukromí na webu a nelze pomocí nich zjistit, kdo jste.</translation> <translation id="2581165646603367611">Tímto vymažete soubory cookie, mezipaměť a další data webů, která Chrome považuje za nedůležitá.</translation> <translation id="2587052924345400782">Je dostupná novější verze</translation> -<translation id="2589302627584222634">Vytvořit zámek profilu</translation> <translation id="2593272815202181319">Neproporcionální</translation> <translation id="2603212228005142861">Pokud chcete spravovat své předvolby, přihlaste se</translation> <translation id="260403163289591229">Sledováno</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Teď ne</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Další informace<ph name="END_LINK" /> o navrhovaném obsahu</translation> <translation id="3495219333887281978">Spodní tabulka s přihlášením je otevřená na polovinu výšky</translation> -<translation id="3498338220321963224">Pokud zámek profilu později odstraníte, vaše uložená data budou vymazána.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Seřadit od nejstarších</translation> <translation id="3507132249039706973">Je zapnutá standardní ochrana</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Odstranit virtuální kartu?</translation> <translation id="4409271659088619928">Váš vyhledávač je <ph name="DSE" />. Prostudujte si pokyny vyhledávače pro smazání historie vyhledávání (pokud je k dispozici).</translation> <translation id="4415276339145661267">Spravovat účet Google</translation> -<translation id="4417111749295506837">Pokud chcete synchronizovat své informace v Chromu a mít svá data v autě v bezpečí, musíte si vytvořit zámek profilu. Při každém nastoupení do auta bude potřeba použít kód nebo heslo.</translation> <translation id="4425140285732600465">Sledování ceny. Pokud cena na některém webu klesne, dostanete upozornění.</translation> <translation id="442518031075347249">Virtuální kartu již se službou Google Pay nebudete moci používat. <ph name="BEGIN_LINK1" />Další informace o virtuálních kartách<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizace reklam</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Nezobrazovat popisy obrázků</translation> <translation id="5966233851250124270">Chrome si váš výběr zapamatuje</translation> <translation id="5979084224081478209">Zkontrolovat hesla</translation> -<translation id="5985186846584605773">Vytvořte si pro své auto zámek profilu</translation> <translation id="5995726099713306770">Stáhnout stránku znovu?</translation> <translation id="6000066717592683814">Ponechat Google</translation> <translation id="6000203700195075278">Znovu sledovat</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Odstranit návrh z historie?</translation> <translation id="6380100320871303656">Častěji předběžně načítá stránky, které byste podle Chromu mohli navštívit. Toto nastavení může vést ke zvýšenému využití dat.</translation> <translation id="6382848304055775421">Exportování</translation> -<translation id="6391355955030242704">Pokud chcete synchronizovat své informace v Chromu a mít svá data v autě v bezpečí, musíte si v nastavení zabezpečení vytvořit zámek profilu. Při každém nastoupení do auta bude potřeba použít kód nebo heslo.</translation> <translation id="6394791151443660613">Vyhledat: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ODKAZ</translation> <translation id="6397616442223433927">Opět online</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb index 0224f622..91c957d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_cy.xtb
@@ -294,7 +294,6 @@ Mae tocynnau ymddiriedaeth yn gwella eich preifatrwydd ar y we ac ni ellir eu defnyddio i ddarganfod pwy ydych chi.</translation> <translation id="2581165646603367611">Bydd hyn yn clirio cwcis, storfa, a data eraill o wefannau nad yw Chrome yn credu sy'n bwysig.</translation> <translation id="2587052924345400782">Mae fersiwn mwy newydd ar gael</translation> -<translation id="2589302627584222634">Creu clo proffil</translation> <translation id="2593272815202181319">Lled sefydlog</translation> <translation id="2603212228005142861">Mewngofnodwch i reoli'ch dewisiadau</translation> <translation id="260403163289591229">Yn dilyn</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Nid nawr</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Dysgu rhagor<ph name="END_LINK" /> am gynnwys a awgrymir</translation> <translation id="3495219333887281978">Mae'r ddalen waelod mewngofnodi wedi'i hagor ar hanner uchder.</translation> -<translation id="3498338220321963224">Bydd eich data sydd wedi'u cadw yn cael eu dileu os tynnir y clo proffil yn nes ymlaen.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Trefnu yn ôl hynaf</translation> <translation id="3507132249039706973">Mae Amddiffyniad Safonol ymlaen</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Tynnu eich cerdyn rhithwir?</translation> <translation id="4409271659088619928"><ph name="DSE" /> yw eich peiriant chwilio. Gweler ei gyfarwyddiadau ar gyfer dileu eich hanes chwilio, os yw'n berthnasol.</translation> <translation id="4415276339145661267">Rheoli'ch Cyfrif Google</translation> -<translation id="4417111749295506837">I gysoni'ch gwybodaeth Chrome a chadw'ch data'n ddiogel yn y car, rhaid i chi greu clo proffil. Byddwch yn defnyddio cod neu gyfrinair bob tro y byddwch yn mynd i mewn i'r car.</translation> <translation id="4425140285732600465">Yn dilyn y pris. Cael hysbysiadau os bydd y pris yn gostwng ar unrhyw wefan.</translation> <translation id="442518031075347249">Ni fyddwch yn gallu defnyddio eich cerdyn rhithwir gyda Google Pay mwyach. <ph name="BEGIN_LINK1" />Dysgu rhagor am gardiau rhithwir<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personoleiddio hysbysebion</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Stopio disgrifio lluniau</translation> <translation id="5966233851250124270">Bydd Chrome yn cofio eich dewis</translation> <translation id="5979084224081478209">Gwirio cyfrineiriau</translation> -<translation id="5985186846584605773">Creu clo proffil ar gyfer eich car</translation> <translation id="5995726099713306770">Lawrlwytho'r dudalen eto?</translation> <translation id="6000066717592683814">Cadw Google</translation> <translation id="6000203700195075278">Ail-ddilyn</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Tynnu'r awgrym o'r hanes?</translation> <translation id="6380100320871303656">Yn amlach yn rhaglwytho tudalennau y mae Chrome yn meddwl eich bod yn debygol o ymweld â nhw. Gall y gosodiad hwn arwain at fwy o ddefnydd o ddata.</translation> <translation id="6382848304055775421">Wrthi'n allforio</translation> -<translation id="6391355955030242704">I gysoni'ch gwybodaeth Chrome a chadw'ch data'n ddiogel yn y car, rhaid i chi greu clo proffil yn eich gosodiadau diogelwch. Byddwch yn defnyddio cod neu gyfrinair bob tro y byddwch yn mynd i mewn i'r car.</translation> <translation id="6394791151443660613">Chwilio: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">DOLEN</translation> <translation id="6397616442223433927">Yn ôl ar-lein</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb index 3daf934..8ac483a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_da.xtb
@@ -294,7 +294,6 @@ Private state tokens forbedrer beskyttelsen af personlige oplysninger på nettet og kan ikke bruges til at identificere dig.</translation> <translation id="2581165646603367611">Dette rydder cookies, cache og andre data fra websites, som ikke er vigtige ifølge Chrome.</translation> <translation id="2587052924345400782">Der findes en nyere version</translation> -<translation id="2589302627584222634">Opret en profillås</translation> <translation id="2593272815202181319">Enkelt tegnafstand</translation> <translation id="2603212228005142861">Log ind for at administrere dine præferencer</translation> <translation id="260403163289591229">Følger</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ikke nu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Få flere oplysninger<ph name="END_LINK" /> om anbefalet indhold</translation> <translation id="3495219333887281978">Loginfeltet i bunden er åbnet i halv højde.</translation> -<translation id="3498338220321963224">Dine gemte data ryddes, hvis profillåsen fjernes på et senere tidspunkt.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sortér efter ældste</translation> <translation id="3507132249039706973">Standardbeskyttelse er aktiveret</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Vil du fjerne dit virtuelle kort?</translation> <translation id="4409271659088619928">Dine standardsøgemaskine er <ph name="DSE" />. Se din søgemaskines vejledning i, hvordan du sletter din søgehistorik, hvis det er relevant.</translation> <translation id="4415276339145661267">Administrer din Google-konto</translation> -<translation id="4417111749295506837">Hvis du vil synkronisere dine Chrome-oplysninger og beskytte dine data i bilen, skal du oprette en profillås. Du skal bruge en kode eller adgangskode, hver gang du sætter dig ind i bilen.</translation> <translation id="4425140285732600465">Der holdes øje med prisen. Få besked, hvis prisen falder på et website.</translation> <translation id="442518031075347249">Du vil ikke længere kunne bruge dit virtuelle kort med Google Pay. <ph name="BEGIN_LINK1" />Få flere oplysninger om virtuelle kort<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personlig tilpasning af annoncer</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Stop billedbeskrivelser</translation> <translation id="5966233851250124270">Chrome husker dit valg</translation> <translation id="5979084224081478209">Tjek adgangskoder</translation> -<translation id="5985186846584605773">Opret en profillås til din bil</translation> <translation id="5995726099713306770">Vil du downloade siden igen?</translation> <translation id="6000066717592683814">Behold Google</translation> <translation id="6000203700195075278">Følg igen</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Vil du fjerne forslaget fra historikken?</translation> <translation id="6380100320871303656">Forudindlæser oftere sider, som Chrome tror, der er stor chance for, at du besøger. Denne indstilling kan medføre et højere dataforbrug.</translation> <translation id="6382848304055775421">Eksporterer</translation> -<translation id="6391355955030242704">Hvis du vil synkronisere dine Chrome-oplysninger og beskytte dine data i bilen, skal du oprette en profillås i dine sikkerhedsindstillinger. Du skal bruge en kode eller adgangskode, hver gang du sætter dig ind i bilen.</translation> <translation id="6394791151443660613">Søg: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Online igen</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 0cd26d5..113e6526 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
@@ -294,7 +294,6 @@ Private State Tokens verbessern den Datenschutz im Web und können nicht dazu verwendet werden, deine Identität zu ermitteln.</translation> <translation id="2581165646603367611">Alle Cookies, der Cache und andere Daten von Websites, die Chrome nicht für wichtig hält, werden gelöscht.</translation> <translation id="2587052924345400782">Neuere Version verfügbar</translation> -<translation id="2589302627584222634">Profilsperre erstellen</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Melde dich an, um deine Einstellungen zu verwalten</translation> <translation id="260403163289591229">Folge ich</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Jetzt nicht</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Weitere Informationen<ph name="END_LINK" /> zu vorgeschlagenen Inhalten</translation> <translation id="3495219333887281978">Ansicht zum Anmelden am unteren Rand ist halb geöffnet.</translation> -<translation id="3498338220321963224">Deine gespeicherten Daten werden gelöscht, wenn die Profilsperre später entfernt wird.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Älteste zuerst</translation> <translation id="3507132249039706973">Standardschutz ist aktiviert</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Virtuelle Karte entfernen?</translation> <translation id="4409271659088619928">Du hast <ph name="DSE" /> als Suchmaschine festgelegt. Informationen zum Löschen deines Suchverlaufs findest du in der zugehörigen Anleitung.</translation> <translation id="4415276339145661267">Google-Konto verwalten</translation> -<translation id="4417111749295506837">Wenn du deine Chrome-Daten synchronisieren und in deinem Auto schützen möchtest, musst du eine Profilsperre erstellen. Du musst dann jedes Mal, wenn du in dein Auto einsteigst, einen Code oder ein Passwort eingeben.</translation> <translation id="4425140285732600465">Preis wird beobachtet. Du wirst bei einem Preisnachlass benachrichtigt.</translation> <translation id="442518031075347249">Du kannst deine virtuelle Karte dann nicht mehr mit Google Pay verwenden. <ph name="BEGIN_LINK1" />Weitere Informationen zu virtuellen Karten<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalisierte Werbung</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Bildbeschreibungen beenden</translation> <translation id="5966233851250124270">Chrome speichert deine Auswahl</translation> <translation id="5979084224081478209">Passwörter prüfen</translation> -<translation id="5985186846584605773">Profilsperre für mein Auto erstellen</translation> <translation id="5995726099713306770">Seite noch einmal herunterladen?</translation> <translation id="6000066717592683814">Google beibehalten</translation> <translation id="6000203700195075278">Wieder folgen</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Vorschlag aus Verlauf entfernen?</translation> <translation id="6380100320871303656">Chrome lädt Seiten häufiger vorab, die du wahrscheinlich aufrufen wirst. Bei dieser Einstellung werden voraussichtlich mehr Daten genutzt.</translation> <translation id="6382848304055775421">Werden exportiert</translation> -<translation id="6391355955030242704">Wenn du deine Chrome-Daten synchronisieren und in deinem Auto schützen möchtest, musst du in den Sicherheitseinstellungen eine Profilsperre erstellen. Du musst dann jedes Mal, wenn du in dein Auto einsteigst, einen Code oder ein Passwort eingeben.</translation> <translation id="6394791151443660613">Suchen: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Wieder online</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb index 34d1022..0aa428b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_el.xtb
@@ -294,7 +294,6 @@ Τα διακριτικά ιδιωτικής κατάστασης βελτιώνουν το απόρρητο στον ιστό και δεν μπορούν να χρησιμοποιηθούν για την ταυτοποίησή σας.</translation> <translation id="2581165646603367611">Αυτό θα διαγράψει τα cookie, την κρυφή μνήμη και άλλα δεδομένα ιστοτόπων που το Chrome θεωρεί ότι δεν είναι σημαντικά.</translation> <translation id="2587052924345400782">Διατίθεται νεότερη έκδοση</translation> -<translation id="2589302627584222634">Δημιουργία κλειδώματος προφίλ</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Συνδεθείτε για να διαχειριστείτε τις προτιμήσεις σας</translation> <translation id="260403163289591229">Ακολουθείτε</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Όχι τώρα</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Μάθετε περισσότερα<ph name="END_LINK" /> σχετικά με το προτεινόμενο περιεχόμενο</translation> <translation id="3495219333887281978">Το φύλλο κάτω μέρους για σύνδεση είναι ανοιχτό στο μισό ύψος.</translation> -<translation id="3498338220321963224">Τα αποθηκευμένα δεδομένα σας θα διαγραφούν εάν το κλείδωμα προφίλ καταργηθεί αργότερα.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ταξινόμ. κατά παλαιότερο</translation> <translation id="3507132249039706973">Η Βασική προστασία είναι ενεργή.</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Κατάργηση της εικονικής κάρτας;</translation> <translation id="4409271659088619928">Χρησιμοποιείτε τη μηχανή αναζήτησης <ph name="DSE" />. Ανατρέξτε στις οδηγίες για διαγραφή του ιστορικού αναζήτησής σας, εφόσον υπάρχουν.</translation> <translation id="4415276339145661267">Διαχείριση Λογαριασμού Google</translation> -<translation id="4417111749295506837">Για να συγχρονίσετε τις πληροφορίες σας στο Chrome και να διατηρήσετε τα δεδομένα σας ασφαλή στο αυτοκίνητο, πρέπει να δημιουργήσετε ένα κλείδωμα προφίλ. Θα χρησιμοποιείτε έναν κωδικό ή έναν κωδικό πρόσβασης κάθε φορά που μπαίνετε στο αυτοκίνητο.</translation> <translation id="4425140285732600465">Παρακολούθηση τιμής. Λάβετε ειδοποιήσεις σε περίπτωση πτώσης τιμής σε οποιονδήποτε ιστότοπο.</translation> <translation id="442518031075347249">Δεν θα μπορείτε πλέον να χρησιμοποιήσετε την εικονική σας κάρτα με το Google Pay. <ph name="BEGIN_LINK1" />Μάθετε περισσότερα σχετικά με τις εικονικές κάρτες<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Εξατομίκευση διαφημίσεων</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Διακοπή περιγραφών εικόνων</translation> <translation id="5966233851250124270">Το Chrome θα θυμάται την επιλογή σας</translation> <translation id="5979084224081478209">Έλεγχος κωδικών πρόσβασης</translation> -<translation id="5985186846584605773">Δημιουργία κλειδώματος προφίλ για το αυτοκίνητό σας</translation> <translation id="5995726099713306770">Εκ νέου λήψη της σελίδας;</translation> <translation id="6000066717592683814">Διατήρηση του Google</translation> <translation id="6000203700195075278">Ακολουθήστε ξανά</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Κατάργηση πρότασης από το ιστορικό;</translation> <translation id="6380100320871303656">Προφορτώνει συχνότερα τις σελίδες που το Chrome θεωρεί πιθανό ότι θα επισκεφτείτε. Αυτή η ρύθμιση μπορεί να οδηγήσει σε αυξημένη χρήση δεδομένων.</translation> <translation id="6382848304055775421">Εξαγωγή</translation> -<translation id="6391355955030242704">Για να συγχρονίσετε τις πληροφορίες σας στο Chrome και να διατηρήσετε τα δεδομένα σας ασφαλή στο αυτοκίνητο, πρέπει να δημιουργήσετε ένα κλείδωμα προφίλ στις ρυθμίσεις ασφαλείας. Θα χρησιμοποιείτε έναν κωδικό ή έναν κωδικό πρόσβασης κάθε φορά που μπαίνετε στο αυτοκίνητο.</translation> <translation id="6394791151443660613">Αναζήτηση: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ΣΥΝΔΕΣΜΟΣ</translation> <translation id="6397616442223433927">Επιστροφή στο διαδίκτυο</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb index 8687e0bd..83f27d8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_en-GB.xtb
@@ -295,7 +295,6 @@ Private state tokens improve privacy on the web and can’t be used to find out who you are.</translation> <translation id="2581165646603367611">This will clear cookies, cache and other data of sites Chrome doesn't think is important.</translation> <translation id="2587052924345400782">Newer version is available</translation> -<translation id="2589302627584222634">Create a profile lock</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Sign in to manage your preferences</translation> <translation id="260403163289591229">Following</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Not now</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Find out more<ph name="END_LINK" /> about suggested content</translation> <translation id="3495219333887281978">Sign-in bottom sheet opened at half height.</translation> -<translation id="3498338220321963224">Your saved data will be erased if the profile lock is removed later.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sort by oldest</translation> <translation id="3507132249039706973">Standard protection is on</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Remove your virtual card?</translation> <translation id="4409271659088619928">Your search engine is <ph name="DSE" />. See their instructions for deleting your search history, if applicable.</translation> <translation id="4415276339145661267">Manage your Google Account</translation> -<translation id="4417111749295506837">To sync your Chrome info and keep your data secure in the car, you must create a profile lock. You’ll use a code or password every time you enter the car.</translation> <translation id="4425140285732600465">Tracking price. Get alerts if the price drops on any site.</translation> <translation id="442518031075347249">You’ll no longer be able to use your virtual card with Google Pay. <ph name="BEGIN_LINK1" />Learn more about virtual cards<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Ad personalisation</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Stop image descriptions</translation> <translation id="5966233851250124270">Chrome will remember your choice</translation> <translation id="5979084224081478209">Check passwords</translation> -<translation id="5985186846584605773">Create a profile lock for your car</translation> <translation id="5995726099713306770">Download page again?</translation> <translation id="6000066717592683814">Keep Google</translation> <translation id="6000203700195075278">Refollow</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Remove suggestion from history?</translation> <translation id="6380100320871303656">More frequently preloads pages that Chrome thinks you are likely to visit. This setting may result in increased data use.</translation> <translation id="6382848304055775421">Exporting</translation> -<translation id="6391355955030242704">To sync your Chrome info and keep your data secure in the car, you must create a profile lock in your security settings. You’ll use a code or password every time you enter the car.</translation> <translation id="6394791151443660613">Search: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Back online</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 c5ee561c..5290dc8 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
@@ -294,7 +294,6 @@ Los tokens de estado privado mejoran la privacidad en la Web y no pueden usarse para descubrir tu identidad.</translation> <translation id="2581165646603367611">Esta acción borrará la caché, cookies y otros datos de sitios que Chrome no considera importantes.</translation> <translation id="2587052924345400782">Nueva versión disponible</translation> -<translation id="2589302627584222634">Crear un bloqueo de perfil</translation> <translation id="2593272815202181319">Monoespaciada</translation> <translation id="2603212228005142861">Accede para administrar tus preferencias</translation> <translation id="260403163289591229">Siguiendo</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ahora no</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /> sobre el contenido sugerido</translation> <translation id="3495219333887281978">La hoja inferior de acceso está abierta a media altura.</translation> -<translation id="3498338220321963224">Tus datos guardados se borrarán si se quita el bloqueo del perfil más tarde.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordenar por más antiguo</translation> <translation id="3507132249039706973">Se activó la protección estándar.</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">¿Quieres quitar tu tarjeta virtual?</translation> <translation id="4409271659088619928">Tu motor de búsqueda es <ph name="DSE" />. Consulta las instrucciones para borrar el historial de búsqueda (si corresponde).</translation> <translation id="4415276339145661267">Administrar tu Cuenta de Google</translation> -<translation id="4417111749295506837">Para sincronizar tu información de Chrome y proteger tus datos en el automóvil, debes crear un bloqueo de perfil. Deberás usar un código o una contraseña cada vez que subas al automóvil.</translation> <translation id="4425140285732600465">Sigues el precio. Recibe alertas si baja el precio en algún sitio.</translation> <translation id="442518031075347249">Ya no podrás usar tu tarjeta virtual con Google Pay. <ph name="BEGIN_LINK1" />Obtén más información sobre las tarjetas virtuales<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalización de anuncios</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Detener descripciones de imágenes</translation> <translation id="5966233851250124270">Chrome recordará tu elección</translation> <translation id="5979084224081478209">Revisar contraseñas</translation> -<translation id="5985186846584605773">Crea un bloqueo de perfil para tu automóvil</translation> <translation id="5995726099713306770">¿Quieres descargar la página de nuevo?</translation> <translation id="6000066717592683814">Seguir usando Google</translation> <translation id="6000203700195075278">Volver a seguir</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">¿Borrar la sugerencia del historial?</translation> <translation id="6380100320871303656">Precarga con más frecuencia las páginas que Chrome considera que posiblemente visites. Esta configuración puede generar un mayor uso de datos.</translation> <translation id="6382848304055775421">Exportando</translation> -<translation id="6391355955030242704">Para sincronizar tu información de Chrome y proteger tus datos en el automóvil, debes crear un bloqueo de perfil en la configuración de seguridad. Deberás usar un código o una contraseña cada vez que subas al automóvil.</translation> <translation id="6394791151443660613">Buscar: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">VÍNCULO</translation> <translation id="6397616442223433927">De nuevo en línea</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 44829ab..5f4ff5e8 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
@@ -294,7 +294,6 @@ Los tokens de confianza mejoran la privacidad en la Web y no se pueden usar para averiguar quién eres.</translation> <translation id="2581165646603367611">Se borrarán las cookies, la caché y otros datos de los sitios que Chrome no considere importantes.</translation> <translation id="2587052924345400782">Hay una nueva versión disponible</translation> -<translation id="2589302627584222634">Crear un bloqueo de perfil</translation> <translation id="2593272815202181319">Monoespaciado</translation> <translation id="2603212228005142861">Inicia sesión para gestionar tus preferencias</translation> <translation id="260403163289591229">Siguiendo</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ahora no</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Más información<ph name="END_LINK" /> sobre el contenido sugerido</translation> <translation id="3495219333887281978">Hoja inferior de inicio de sesión abierta a media altura.</translation> -<translation id="3498338220321963224">Tus datos guardados se borrarán si el bloqueo del perfil se quita más adelante.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">El más antiguo primero</translation> <translation id="3507132249039706973">La protección estándar está activada</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">¿Quitar tu tarjeta visual?</translation> <translation id="4409271659088619928">Usas el buscador <ph name="DSE" />. Consulta las instrucciones de tu buscador para eliminar tu historial de búsqueda (si corresponde).</translation> <translation id="4415276339145661267">Gestionar tu cuenta de Google</translation> -<translation id="4417111749295506837">Para sincronizar tu información de Chrome y mantener tus datos seguros en el coche, debes crear un bloqueo de perfil. Tendrás que introducir un código o una contraseña cada vez que entres en el coche.</translation> <translation id="4425140285732600465">Siguiendo precio. Recibe alertas si el precio baja en algún sitio.</translation> <translation id="442518031075347249">Ya no podrás usar tu tarjeta virtual con Google Play. <ph name="BEGIN_LINK1" />Más información sobre tarjetas virtuales<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalización de anuncios</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Detener descripciones de imágenes</translation> <translation id="5966233851250124270">Chrome recordará tu elección</translation> <translation id="5979084224081478209">Comprobar contraseñas</translation> -<translation id="5985186846584605773">Crear un bloqueo del perfil para el coche</translation> <translation id="5995726099713306770">¿Volver a descargar esta página?</translation> <translation id="6000066717592683814">Mantener Google como motor de búsqueda predeterminado</translation> <translation id="6000203700195075278">Volver a seguir</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">¿Eliminar sugerencia del historial?</translation> <translation id="6380100320871303656">Precarga más frecuentemente las páginas que Chrome considera que es probable que visites. Este ajuste puede provocar un aumento en el uso de datos.</translation> <translation id="6382848304055775421">Exportando</translation> -<translation id="6391355955030242704">Para sincronizar tu información de Chrome y mantener tus datos seguros en el coche, debes crear un bloqueo de perfil en la configuración de seguridad. Tendrás que introducir un código o una contraseña cada vez que entres en el coche.</translation> <translation id="6394791151443660613">Buscar: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ENLACE</translation> <translation id="6397616442223433927">Vuelves a tener conexión</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb index 3dff247e4..7420063 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_et.xtb
@@ -294,7 +294,6 @@ Privaatse oleku märgid täiustavad veebis privaatsust ja neid ei saa kasutada teie isiku tuvastamiseks.</translation> <translation id="2581165646603367611">See tühjendab vahemälu, kustutab küpsised ja muud andmed, mis pärinevad Chrome'i arvates ebatähtsatelt saitidelt.</translation> <translation id="2587052924345400782">Saadaval on uuem versioon</translation> -<translation id="2589302627584222634">Profiililuku loomine</translation> <translation id="2593272815202181319">Püsisammkiri</translation> <translation id="2603212228005142861">Eelistuse haldamiseks sisselogimine</translation> <translation id="260403163289591229">Jälgitav</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Mitte praegu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lisateave<ph name="END_LINK" /> soovitatud sisu kohta</translation> <translation id="3495219333887281978">Sisselogimise alumine leht on avatud poolel kõrgusel.</translation> -<translation id="3498338220321963224">Teie salvestatud andmed kustutatakse, kui profiililukk hiljem eemaldatakse.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sordi vanima järgi</translation> <translation id="3507132249039706973">Tavakaitse on sisse lülitatud</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Kas eemaldada virtuaalkaart?</translation> <translation id="4409271659088619928">Teie otsingumootor on <ph name="DSE" />. Vaadake selle juhiseid otsinguajaloo kustutamise kohta, kui see on asjakohane.</translation> <translation id="4415276339145661267">Google'i konto haldamine</translation> -<translation id="4417111749295506837">Autos Chrome'i teabe sünkroonimiseks ja andmete kaitsmiseks peate looma profiililuku. Kasutate koodi või parooli iga kord, kui autosse sisenete.</translation> <translation id="4425140285732600465">Jälgite hinda. Teile saadetakse märguanne, kui hind mõnel saidil langeb.</translation> <translation id="442518031075347249">Te ei saa enam Google Payga virtuaalkaarti kasutada. <ph name="BEGIN_LINK1" />Lisateave virtuaalkaartide kohta<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Reklaamide isikupärastamine</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Piltide kirjelduste peatam.</translation> <translation id="5966233851250124270">Chrome jätab teie valiku meelde</translation> <translation id="5979084224081478209">Kontrolli paroole</translation> -<translation id="5985186846584605773">Looge oma auto jaoks profiililukk</translation> <translation id="5995726099713306770">Kas soovite lehe uuesti alla laadida?</translation> <translation id="6000066717592683814">Säilita Google</translation> <translation id="6000203700195075278">Jälgi uuesti</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Kas eemaldada soovitus ajaloost?</translation> <translation id="6380100320871303656">Lehed, mida Chrome'i arvates tõenäoliselt külastate, eellaaditakse sagedamini. See seade võib suurendada andmemahu kasutust.</translation> <translation id="6382848304055775421">Eksportimine</translation> -<translation id="6391355955030242704">Autos Chrome'i teabe sünkroonimiseks ja andmete kaitsmiseks peate turvaseadetes looma profiililuku. Kasutate koodi või parooli iga kord, kui autosse sisenete.</translation> <translation id="6394791151443660613">Otsing: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Võrguühendus taastus</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb index b4b3848..d250913d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_eu.xtb
@@ -294,7 +294,6 @@ Egoeraren token pribatuek sareko pribatutasuna hobetzen dute eta ezin dira erabili zure identitatea desestaltzeko.</translation> <translation id="2581165646603367611">Chrome-k garrantzi gabekotzat jotzen dituen cookieak, cachea eta bestelako datuak ezabatuko dira.</translation> <translation id="2587052924345400782">Bertsio berriagoa dago</translation> -<translation id="2589302627584222634">Sortu profilaren blokeo bat</translation> <translation id="2593272815202181319">Tarte bakarrekoak</translation> <translation id="2603212228005142861">Hasi saioa zure hobespenak kudeatzeko</translation> <translation id="260403163289591229">Jarraitzen</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Orain ez</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lortu informazio gehiago<ph name="END_LINK" /> iradokitako edukiari buruz</translation> <translation id="3495219333887281978">Pantailaren behealdean ainguratutako orria, saioa hasteko balio duena, altuera erdian irekita dago.</translation> -<translation id="3498338220321963224">Aurrerago profilaren blokeoa kentzen baduzu, gordetako datuak ezabatuko dira.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordenatu zaharrenetik hasita</translation> <translation id="3507132249039706973">Babes estandarra aktibatuta dago</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Txartel birtuala kendu nahi duzu?</translation> <translation id="4409271659088619928"><ph name="DSE" /> da bilatzailea. Behar izanez gero, joan haren argibideetara bilaketa-historia ezabatzeari buruzko informazio gehiago lortzeko.</translation> <translation id="4415276339145661267">Kudeatu Google-ko kontua</translation> -<translation id="4417111749295506837">Chrome-ko informazioa sinkronizatzeko eta datuak autoan babestuta edukitzeko, profilaren blokeo bat sortu behar duzu. Autoan sartzen zaren bakoitzean, kode edo pasahitz bat erabiliko duzu.</translation> <translation id="4425140285732600465">Prezioaren jarraipena egiten ari zara. Jaso alertak webguneren batean prezioa jaisten bada.</translation> <translation id="442518031075347249">Aurrerantzean, ezingo duzu erabili txartel birtuala Google Pay-rekin. <ph name="BEGIN_LINK1" />Lortu txartel birtualei buruzko informazio gehiago<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Iragarkien pertsonalizazioa</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Gelditu irudi-deskribapenak</translation> <translation id="5966233851250124270">Chrome-k aukera gogoratuko du</translation> <translation id="5979084224081478209">Egiaztatu pasahitzak</translation> -<translation id="5985186846584605773">Sortu profilaren blokeo bat autorako</translation> <translation id="5995726099713306770">Berriro deskargatu nahi duzu orria?</translation> <translation id="6000066717592683814">Jarraitu Google erabiltzen</translation> <translation id="6000203700195075278">Jarraitu berriro</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Iradokizuna historiatik ezabatu nahi duzu?</translation> <translation id="6380100320871303656">Maizago kargatzen dira aurrez Google-ren ustez bisitatuko dituzun orriak. Litekeena da ezarpen honek datu gehiago erabiltzea.</translation> <translation id="6382848304055775421">Esportatzen</translation> -<translation id="6391355955030242704">Chrome-ko informazioa sinkronizatzeko eta datuak autoan babestuta edukitzeko, profilaren blokeo bat sortu behar duzu segurtasun-ezarpenetan. Autoan sartzen zaren bakoitzean, kode edo pasahitz bat erabiliko duzu.</translation> <translation id="6394791151443660613">Bilatu: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ESTEKA</translation> <translation id="6397616442223433927">Konektatu zara berriro</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 c4211b1..e899f07 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
@@ -294,7 +294,6 @@ کدهای حالت خصوصی حریم خصوصی را در وب بهبود میبخشند و نمیتوان از آنها برای پی بردن به هویت شما استفاده کرد.</translation> <translation id="2581165646603367611">این کار کوکیها، حافظه پنهان و دادههای دیگر سایتها را که از نظر Chrome مهم نیست پاک میکند.</translation> <translation id="2587052924345400782">نسخه جدیدتری در دسترس است</translation> -<translation id="2589302627584222634">ایجاد قفل نمایه</translation> <translation id="2593272815202181319">قلمهای با عرض ثابت</translation> <translation id="2603212228005142861">برای مدیریت اولویتهایتان، به سیستم وارد شوید</translation> <translation id="260403163289591229">دنبال میکنید</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">حالا نه</translation> <translation id="3493531032208478708">درباره محتوای پیشنهادی <ph name="BEGIN_LINK" />بیشتر بدانید<ph name="END_LINK" /></translation> <translation id="3495219333887281978">برگ زیرین ورود به سیستم نیمهباز شده است.</translation> -<translation id="3498338220321963224">اگر قفل نمایه بعداً برداشته شود، دادههای ذخیرهشده شما پاک خواهد شد.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">ترتیب براساس قدیمیترین</translation> <translation id="3507132249039706973">«محافظت استاندارد» روشن است</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">کارت مجازی حذف شود؟</translation> <translation id="4409271659088619928">موتور جستجوی شما <ph name="DSE" /> است. برای اینکه سابقه جستجویتان را درصورت امکان حذف کنید، دستورالعملهای آن موتور جستجو را ببینید.</translation> <translation id="4415276339145661267">مدیریت «حساب Google»</translation> -<translation id="4417111749295506837">برای همگامسازی اطلاعات Chrome و ایمن نگه داشتن دادههایتان در خودرو، باید قفل نمایه ایجاد کنید. هربار که به خودرو وارد میشوید از کد یا گذرواژه استفاده خواهید کرد.</translation> <translation id="4425140285732600465">درحال پیگیری قیمت هستید. اگر قیمت در هر سایتی کاهش پیدا کرد، هشدار دریافت میکنید.</translation> <translation id="442518031075347249">دیگر نمیتوانید از کارت مجازیتان در Google Pay استفاده کنید. <ph name="BEGIN_LINK1" />درباره کارتهای مجازی بیشتر بدانید<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">شخصیسازی آگهی</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">توقف توضیحات تصویر</translation> <translation id="5966233851250124270">Chrome انتخابتان را بهخاطر میسپارد</translation> <translation id="5979084224081478209">بررسی گذرواژهها</translation> -<translation id="5985186846584605773">قفل نمایه برای خودرو ایجاد کنید</translation> <translation id="5995726099713306770">صفحه دوباره بارگیری شود؟</translation> <translation id="6000066717592683814">حفظ Google</translation> <translation id="6000203700195075278">دنبال کردن مجدد</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">پیشنهاد از سابقه حذف شود؟</translation> <translation id="6380100320871303656">صفحاتی که Chrome فکر میکند ممکن است بازدید کنید، دفعات بیشتری پیشبارگیری میشوند. این تنظیم ممکن است منجر به استفاده از داده بیشتر شود.</translation> <translation id="6382848304055775421">درحال صادر کردن</translation> -<translation id="6391355955030242704">برای همگامسازی اطلاعات Chrome و ایمن نگه داشتن دادههایتان در خودرو، باید قفل نمایه در تنظیمات امنیتی ایجاد کنید. هربار که به خودرو وارد میشوید از کد یا گذرواژه استفاده خواهید کرد.</translation> <translation id="6394791151443660613">جستجو: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">پیوند</translation> <translation id="6397616442223433927">دوباره آنلاین شدید</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb index 8e8cb715..4880df3 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fi.xtb
@@ -294,7 +294,6 @@ Yksityiset tilamerkit parantavat yksityisyyttä verkossa, eikä sinua voi tunnistaa niiden avulla.</translation> <translation id="2581165646603367611">Evästeet, välimuisti ja muut Chromen vähemmän tärkeinä pitämät sivustotiedot poistetaan.</translation> <translation id="2587052924345400782">Uudempi versio on saatavilla.</translation> -<translation id="2589302627584222634">Luo profiililukko</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Kirjaudu sisään, niin voit muuttaa valintoja</translation> <translation id="260403163289591229">Seurataan</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ei nyt</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Lue lisätietoja<ph name="END_LINK" /> suositellusta sisällöstä.</translation> <translation id="3495219333887281978">Kirjautumispaneeli avattu puolelle näytölle.</translation> -<translation id="3498338220321963224">Tallennettu datasi tyhjennetään, jos profiililukko poistetaan myöhemmin.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Lajittelu: vanhin ensin</translation> <translation id="3507132249039706973">Perustason suojaus on päällä</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Poistetaanko virtuaalinen kortti?</translation> <translation id="4409271659088619928">Hakukoneesi on <ph name="DSE" />. Katso tarvittaessa hakukoneen ohjeet hakuhistorian poistamiselle.</translation> <translation id="4415276339145661267">Ylläpidä Google-tiliäsi</translation> -<translation id="4417111749295506837">Jos haluat synkronoida Chrome-tietosi ja suojata datasi autossa, sinun on luotava profiililukko. Käytät koodia tai salasanaa aina, kun menet autoon.</translation> <translation id="4425140285732600465">Hintaa seurataan. Voit saada ilmoituksen, jos hinta laskee jollakin sivustolla.</translation> <translation id="442518031075347249">Et voi tämän jälkeen käyttää virtuaalista korttia Google Payssa. <ph name="BEGIN_LINK1" />Lue lisää virtuaalisista korteista<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Mainosten personointi</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Lopeta kuvaselitykset</translation> <translation id="5966233851250124270">Chrome muistaa valintasi</translation> <translation id="5979084224081478209">Tarkista salasanat</translation> -<translation id="5985186846584605773">Luo profiililukko autoa varten</translation> <translation id="5995726099713306770">Ladataanko sivu uudelleen?</translation> <translation id="6000066717592683814">Käytä Googlea</translation> <translation id="6000203700195075278">Seuraa uudelleen</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Poistetaanko ehdotus historiasta?</translation> <translation id="6380100320871303656">Esilataa useammin sivuja, joita Chromen mukaan avaat todennäköisesti. Asetus voi saada datankäytön lisääntymään.</translation> <translation id="6382848304055775421">Viedään</translation> -<translation id="6391355955030242704">Jos haluat synkronoida Chrome-tietosi ja suojata datasi autossa, sinun on luotava profiililukko yksityisyysasetuksissa. Käytät koodia tai salasanaa aina, kun menet autoon.</translation> <translation id="6394791151443660613">Haku: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINKITÄ</translation> <translation id="6397616442223433927">Verkkoyhteys palautettu</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 2b77929..cf7b4f17c 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
@@ -294,7 +294,6 @@ Pinapahusay ng mga private state token ang privacy sa web at hindi magagamit ang mga ito para malaman kung sino ka.</translation> <translation id="2581165646603367611">Iki-clear nito ang cookies, cache at iba pang data ng mga site na sa tingin ng Chrome ay hindi mahalaga.</translation> <translation id="2587052924345400782">May available na mas bagong bersyon</translation> -<translation id="2589302627584222634">Gumawa ng lock ng profile</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Mag-sign in para pamahalaan ang iyong mga preference</translation> <translation id="260403163289591229">Sinusubaybayan</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Hindi ngayon</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Matuto pa<ph name="END_LINK" /> tungkol sa iminumungkahing content</translation> <translation id="3495219333887281978">Nakabukas ang bottom sheet sa pag-sign in nang kalahati ang taas.</translation> -<translation id="3498338220321963224">Buburahin ang iyong naka-save na data kung aalisin sa ibang pagkakataon ang lock ng profile.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ayon sa pinakaluma</translation> <translation id="3507132249039706973">Naka-on ang Standard Protection</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Alisin ang iyong virtual na card?</translation> <translation id="4409271659088619928"><ph name="DSE" /> ang iyong search engine. Tingnan ang mga tagubilin nito para sa pag-delete sa iyong history ng paghahanap, kung naaangkop.</translation> <translation id="4415276339145661267">Pamahalaan ang iyong Google Account</translation> -<translation id="4417111749295506837">Para ma-sync ang iyong impormasyon sa Chrome at mapanatiling secure ang data mo sa kotse, dapat kang gumawa ng lock ng profile. Gagamit ka ng code o password sa tuwing papasok ka sa kotse.</translation> <translation id="4425140285732600465">Sinusubaybayan ang presyo. Makatanggap ng mga alerto kapag bumaba ang presyo sa alinmang site.</translation> <translation id="442518031075347249">Hindi mo na magagamit ang iyong virtual na card sa Google Pay. <ph name="BEGIN_LINK1" />Matuto pa tungkol sa mga virtual na card<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Pag-personalize ng ad</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Ihinto ang desc ng larawan</translation> <translation id="5966233851250124270">Matatandaan ng Chrome ang iyong napili</translation> <translation id="5979084224081478209">Suriin ang mga password</translation> -<translation id="5985186846584605773">Gumawa ng lock ng profile para sa iyong kotse</translation> <translation id="5995726099713306770">I-download ulit ang page?</translation> <translation id="6000066717592683814">Panatilihin ang Google</translation> <translation id="6000203700195075278">Subaybayan ulit</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Alisin ang suhestyon mula sa history?</translation> <translation id="6380100320871303656">Mas madalas na nagpi-preload ng mga page na sa palagay ng Chrome ay malamang mong bisitahin. Posibleng magresulta sa mas malakas na paggamit ng data ang setting na ito.</translation> <translation id="6382848304055775421">Ine-export</translation> -<translation id="6391355955030242704">Para ma-sync ang iyong impormasyon sa Chrome at mapanatiling secure ang data mo sa kotse, dapat kang gumawa ng lock ng profile sa iyong mga setting ng seguridad. Gagamit ka ng code o password sa tuwing papasok ka sa kotse.</translation> <translation id="6394791151443660613">Hanapin: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Online ulit</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb index 3267f25..5aabe52 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_fr-CA.xtb
@@ -294,7 +294,6 @@ Les jetons de confiance valides améliorent la confidentialité sur le Web et ne peuvent pas être utilisés pour savoir qui vous êtes.</translation> <translation id="2581165646603367611">Cette action entraînera la suppression de tous les témoins, caches et autres données provenant de sites que Chrome estime ne pas être importants.</translation> <translation id="2587052924345400782">Version plus récente dispo</translation> -<translation id="2589302627584222634">Créer un verrouillage de profil</translation> <translation id="2593272815202181319">Espace simple</translation> <translation id="2603212228005142861">Connectez-vous pour gérer vos préférences</translation> <translation id="260403163289591229">Suivi</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Pas maintenant</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /> sur le contenu suggéré</translation> <translation id="3495219333887281978">La zone de contenu dans le bas de l'écran de connexion est ouverte à mi-hauteur.</translation> -<translation id="3498338220321963224">Vos données enregistrées seront effacées si le verrouillage de profil est retiré ultérieurement.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Trier par le plus ancien</translation> <translation id="3507132249039706973">La protection standard est activée</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Retirer votre carte virtuelle?</translation> <translation id="4409271659088619928">Vous utilisez <ph name="DSE" /> comme moteur de recherche. Consultez les instructions de celui-ci pour supprimer votre historique de recherche, le cas échéant.</translation> <translation id="4415276339145661267">Gérer votre compte Google</translation> -<translation id="4417111749295506837">Pour synchroniser vos données Chrome et sécuriser vos données dans le véhicule, vous devez créer un verrouillage de profil. Vous utiliserez un code ou un mot de passe chaque fois que vous entrerez dans le véhicule.</translation> <translation id="4425140285732600465">Suivi des prix activé. Obtenez des alertes si le prix est réduit sur un site.</translation> <translation id="442518031075347249">Vous ne pourrez plus utiliser votre carte virtuelle avec Google Pay. <ph name="BEGIN_LINK1" />En savoir plus sur les cartes virtuelles<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personnalisation des annonces</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Arrêter les descriptions</translation> <translation id="5966233851250124270">Chrome se souviendra de votre choix</translation> <translation id="5979084224081478209">Vérifier les mots de passe</translation> -<translation id="5985186846584605773">Créez un verrouillage de profil pour votre voiture</translation> <translation id="5995726099713306770">Télécharger la page de nouveau?</translation> <translation id="6000066717592683814">Conserver Google</translation> <translation id="6000203700195075278">Se réabonner</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Supprimer la suggestion de l'historique?</translation> <translation id="6380100320871303656">Précharge plus fréquemment les pages que vous êtes susceptible de visiter selon Chrome. Ce paramètre peut entraîner une augmentation de la consommation de données.</translation> <translation id="6382848304055775421">Exportation en cours…</translation> -<translation id="6391355955030242704">Pour synchroniser vos données Chrome et sécuriser vos données dans le véhicule, vous devez créer un verrouillage de profil dans vos paramètres de sécurité. Vous utiliserez un code ou un mot de passe chaque fois que vous entrerez dans le véhicule.</translation> <translation id="6394791151443660613">Recherche : <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LIEN</translation> <translation id="6397616442223433927">De nouveau en ligne</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 c8fb6f0..5e1b92c 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
@@ -294,7 +294,6 @@ Les jetons d'état privés améliorent la confidentialité sur le Web et ne peuvent pas servir à vous identifier.</translation> <translation id="2581165646603367611">Cette action aura pour effet de vider le cache et de supprimer les cookies, ainsi que d'autres données de site que Chrome ne considère pas comme importantes.</translation> <translation id="2587052924345400782">Nouvelle version disponible</translation> -<translation id="2589302627584222634">Créer un verrouillage du profil</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Connectez-vous pour gérer vos préférences</translation> <translation id="260403163289591229">Suivis</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Pas maintenant</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />En savoir plus<ph name="END_LINK" /> sur le contenu suggéré</translation> <translation id="3495219333887281978">Bottom sheet de connexion ouverte à mi-hauteur.</translation> -<translation id="3498338220321963224">Si vous désactivez le verrouillage du profil plus tard, vos données enregistrées seront effacées.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Trier par le plus ancien</translation> <translation id="3507132249039706973">La protection standard est activée</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Supprimer votre carte virtuelle ?</translation> <translation id="4409271659088619928">Votre moteur de recherche est <ph name="DSE" />. Lisez ses instructions pour supprimer l'historique de vos recherches, le cas échéant.</translation> <translation id="4415276339145661267">Gérer votre compte Google</translation> -<translation id="4417111749295506837">Pour synchroniser vos informations Chrome et protéger vos données dans la voiture, vous devez créer un verrouillage du profil. Vous saisirez un code ou un mot de passe chaque fois que vous entrerez dans la voiture.</translation> <translation id="4425140285732600465">Suivi du prix activé. Recevez des alertes si le prix baisse sur un site.</translation> <translation id="442518031075347249">Vous ne pourrez plus utiliser votre carte virtuelle avec Google Pay. <ph name="BEGIN_LINK1" />En savoir plus sur les cartes virtuelles<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personnalisation des annonces</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Arrêter descriptions images</translation> <translation id="5966233851250124270">Chrome retiendra votre choix</translation> <translation id="5979084224081478209">Vérifier les mots de passe</translation> -<translation id="5985186846584605773">Créer un verrouillage du profil pour votre voiture</translation> <translation id="5995726099713306770">Retélécharger la page ?</translation> <translation id="6000066717592683814">Conserver Google</translation> <translation id="6000203700195075278">Se réabonner</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Supprimer la suggestion de l'historique ?</translation> <translation id="6380100320871303656">Les pages que vous êtes susceptible de consulter selon Chrome sont préchargées plus souvent (cela peut augmenter la consommation des données).</translation> <translation id="6382848304055775421">Exportation…</translation> -<translation id="6391355955030242704">Pour synchroniser vos informations Chrome et protéger vos données dans la voiture, vous devez créer un verrouillage du profil dans vos paramètres de sécurité. Vous saisirez un code ou un mot de passe chaque fois que vous entrerez dans la voiture.</translation> <translation id="6394791151443660613">Rechercher : <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LIEN</translation> <translation id="6397616442223433927">Connexion rétablie</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb index c4390fb..6e19d2c92 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gl.xtb
@@ -294,7 +294,6 @@ Os tokens de estado privado melloran a privacidade na Web e non se poden usar para descubrir quen es.</translation> <translation id="2581165646603367611">Borraranse as cookies, a memoria caché e outros datos dos sitios que Chrome non considera importantes.</translation> <translation id="2587052924345400782">Versión nova dispoñible</translation> -<translation id="2589302627584222634">Crear un bloqueo do perfil</translation> <translation id="2593272815202181319">Monoespazado</translation> <translation id="2603212228005142861">Inicia sesión para xestionar as túas preferencias</translation> <translation id="260403163289591229">Seguindo</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Agora non</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Máis información<ph name="END_LINK" /> acerca do contido suxerido</translation> <translation id="3495219333887281978">Panel inferior de inicio de sesión aberto ata media altura.</translation> -<translation id="3498338220321963224">Borraranse os teus datos gardados se o bloqueo do perfil se quita máis adiante.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordenar polo máis antigo</translation> <translation id="3507132249039706973">A protección estándar está activada</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Queres quitar a tarxeta virtual?</translation> <translation id="4409271659088619928">O teu motor de busca é <ph name="DSE" />. En caso aplicable, consulta as súas instrucións para eliminar o historial de busca.</translation> <translation id="4415276339145661267">Xestionar a túa Conta de Google</translation> -<translation id="4417111749295506837">Para sincronizar a túa información de Chrome e protexer os teus datos no coche, debes crear un bloqueo do perfil. Cada vez que entres no coche, terás que usar un código ou contrasinal.</translation> <translation id="4425140285732600465">Estase facendo un seguimento do prezo. Recibe alertas se baixa o prezo en calquera sitio.</translation> <translation id="442518031075347249">Deixarás de poder utilizar a tarxeta virtual con Google Pay. <ph name="BEGIN_LINK1" />Máis información sobre as tarxetas virtuais<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalización de anuncios</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Descricións de imaxes: non</translation> <translation id="5966233851250124270">Chrome lembrará a túa elección</translation> <translation id="5979084224081478209">Comprobar contrasinais</translation> -<translation id="5985186846584605773">Crea un bloqueo do perfil para o coche</translation> <translation id="5995726099713306770">Queres descargar esta páxina de novo?</translation> <translation id="6000066717592683814">Manter Google</translation> <translation id="6000203700195075278">Volver seguir</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Queres eliminar a suxestión do historial?</translation> <translation id="6380100320871303656">Adoita precargar aquelas páxinas que Chrome considera que é probable que visites. Esta opción de configuración pode provocar un maior consumo de datos.</translation> <translation id="6382848304055775421">Exportando</translation> -<translation id="6391355955030242704">Para sincronizar a túa información de Chrome e protexer os teus datos no coche, debes crear un bloqueo do perfil na configuración de seguranza. Cada vez que entres no coche, terás que usar un código ou contrasinal.</translation> <translation id="6394791151443660613">Buscar: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LIGAZÓN</translation> <translation id="6397616442223433927">De novo en liña</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb index a204287..dc8a814 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_gu.xtb
@@ -294,7 +294,6 @@ ખાનગી સ્ટેટસ દર્શાવતા ટોકન વેબ પર પ્રાઇવસીને બહેતર બનાવે છે અને તમે કોણ છો તે જાણવા માટે તેનો ઉપયોગ કરી શકાતો નથી.</translation> <translation id="2581165646603367611">આ કુકી, કૅશ અને Chromeને લાગતું હોય કે આ મહત્વનું નથી એવા સાઇટના બીજા ડેટાને સાફ કરશે.</translation> <translation id="2587052924345400782">નવું વર્ઝન ઉપલબ્ધ છે</translation> -<translation id="2589302627584222634">પ્રોફાઇલ લૉક બનાવો</translation> <translation id="2593272815202181319">મોનોસ્પેસ</translation> <translation id="2603212228005142861">તમારી પસંદગીઓ મેનેજ કરવા માટે, સાઇન ઇન કરો</translation> <translation id="260403163289591229">ફૉલો કરી રહ્યાં છો</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">હમણાં નહીં</translation> <translation id="3493531032208478708">સૂચવેલ કન્ટેન્ટ વિશે <ph name="BEGIN_LINK" />વધુ જાણો<ph name="END_LINK" /></translation> <translation id="3495219333887281978">સાઇન ઇન કરવાની બોટમ શીટ અડધી ઊંચાઈ સુધી ખોલી.</translation> -<translation id="3498338220321963224">જો પછીથી પ્રોફાઇલ લૉક કાઢી નાખવામાં આવશે, તો તમારો સાચવેલો ડેટા કાઢી નાખવામાં આવશે.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">જૂનું પહેલા મુજબ સૉર્ટ</translation> <translation id="3507132249039706973">માનક સુરક્ષા ચાલુ છે</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">શું તમારું વર્ચ્યુઅલ કાર્ડ કાઢી નાખીએ?</translation> <translation id="4409271659088619928">તમારું શોધ એન્જિન <ph name="DSE" /> છે. જો લાગુ થતી હોય, તો તમારા શોધ ઇતિહાસને ડિલીટ કરવા માટે, તેમની સૂચનાઓ જુઓ.</translation> <translation id="4415276339145661267">તમારું Google એકાઉન્ટ મેનેજ કરો</translation> -<translation id="4417111749295506837">તમારી Chrome માહિતી સિંક કરવા અને કારમાં તમારો ડેટા સુરક્ષિત રાખવા, તમારે પ્રોફાઇલ લૉક બનાવવું આવશ્યક છે. દરેક વખતે કારમાં દાખલ થતી વખતે તમારે કોડ કે પાસવર્ડનો ઉપયોગ કરવાનો રહેશે.</translation> <translation id="4425140285732600465">કિંમત ટ્રૅક કરી રહ્યાં છીએ. જો કોઈપણ સાઇટ પર કિંમતમાં ઘટાડો થાય, તો અલર્ટ મેળવો.</translation> <translation id="442518031075347249">હવેથી તમે Google Pay સાથે તમારા વર્ચ્યુઅલ કાર્ડનો ઉપયોગ કરી શકશો નહીં. <ph name="BEGIN_LINK1" />વર્ચ્યુઅલ કાર્ડ વિશે વધુ જાણો<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">રુચિ મુજબ જાહેરાત</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">છબીના વર્ણનો મેળવવાનું બંધ કરો</translation> <translation id="5966233851250124270">Chrome તમારી પસંદગી યાદ રાખશે</translation> <translation id="5979084224081478209">પાસવર્ડ ચેક કરો</translation> -<translation id="5985186846584605773">તમારી કાર માટે પ્રોફાઇલ લૉક બનાવો</translation> <translation id="5995726099713306770">શું આ પેજ ફરીથી ડાઉનલોડ કરીએ?</translation> <translation id="6000066717592683814">Google રાખો</translation> <translation id="6000203700195075278">ફરીથી ફૉલો કરો</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">ઇતિહાસમાંથી સૂચનને દૂર કરીએ?</translation> <translation id="6380100320871303656">તમે મુલાકાત લઈ શકો છો એવી સંભાવના ધરાવતા પેજને Chrome વારંવાર પહેલેથી લોડ કરે છે. આ સેટિંગના પરિણામે ડેટાનો વપરાશ વધી શકે છે.</translation> <translation id="6382848304055775421">નિકાસ કરી રહ્યાં છીએ</translation> -<translation id="6391355955030242704">તમારી Chrome માહિતી સિંક કરવા અને કારમાં તમારો ડેટા સુરક્ષિત રાખવા, તમારે તમારા સિક્યુરિટી સેટિંગમાં પ્રોફાઇલ લૉક બનાવવું આવશ્યક છે. દરેક વખતે કારમાં દાખલ થતી વખતે તમારે કોડ કે પાસવર્ડનો ઉપયોગ કરવાનો રહેશે.</translation> <translation id="6394791151443660613">આ શોધો: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">લિંક</translation> <translation id="6397616442223433927">પાછા ઑનલાઇન થયા</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 2ceb6ba2..589df98 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
@@ -295,7 +295,6 @@ प्राइवेट स्टेट टोकन से, वेब पर निजता को बेहतर किया जा सकता है. इनका इस्तेमाल करके, आपकी पहचान का पता नहीं लगाया जा सकता.</translation> <translation id="2581165646603367611">यह साइट की कुकी, कैश और अन्य डेटा निकाल देगा जो Chrome के विचार में महत्वपूर्ण नहीं है.</translation> <translation id="2587052924345400782">नया वर्शन उपलब्ध है</translation> -<translation id="2589302627584222634">प्रोफ़ाइल लॉक सेट अप करें</translation> <translation id="2593272815202181319">मोनोस्पेस</translation> <translation id="2603212228005142861">सेटिंग मैनेज करने के लिए साइन इन करें</translation> <translation id="260403163289591229">फ़ॉलो किया जा रहा है</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">अभी नहीं</translation> <translation id="3493531032208478708">सुझाई गई सामग्री के बारे में <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="3495219333887281978">साइन इन करने के लिए, खातों की सूची आधी स्क्रीन पर खुली है.</translation> -<translation id="3498338220321963224">अगर बाद में प्रोफ़ाइल लॉक हटा दिया जाता है, तो आपका सेव किया गया डेटा मिटा दिया जाएगा.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">पुराने के क्रम से लगाएं</translation> <translation id="3507132249039706973">मानक सुरक्षा की सुविधा चालू है</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">क्या आपको यह वर्चुअल कार्ड हटाना है?</translation> <translation id="4409271659088619928">आपका सर्च इंजन <ph name="DSE" /> है. अगर लागू होता है, तो अपना खोज इतिहास मिटाने के लिए निर्देश देखें.</translation> <translation id="4415276339145661267">अपना Google खाता मैनेज करें</translation> -<translation id="4417111749295506837">अपने Chrome की जानकारी सिंक करने और कार में अपना डेटा सुरक्षित रखने के लिए, आपको प्रोफ़ाइल लॉक सेट अप करना होगा. इसके बाद, आपको हर बार कार में बैठने पर एक कोड या पासवर्ड का इस्तेमाल करना होगा.</translation> <translation id="4425140285732600465">कीमत ट्रैक की जा रही है. किसी भी साइट पर कीमत में कमी होने पर सूचना पाएं.</translation> <translation id="442518031075347249">Google Pay पर, अब इस वर्चुअल कार्ड का इस्तेमाल नहीं किया जा सकेगा. <ph name="BEGIN_LINK1" />वर्चुअल कार्ड के बारे में ज़्यादा जानें<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">दिलचस्पी के मुताबिक विज्ञापन</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">इमेज की जानकारी पाना बंद करें</translation> <translation id="5966233851250124270">Chrome आपकी पसंद याद रखेगा</translation> <translation id="5979084224081478209">पासवर्ड जांचें</translation> -<translation id="5985186846584605773">अपनी कार के लिए प्रोफ़ाइल लॉक बनाएं</translation> <translation id="5995726099713306770">क्या आप पेज को फिर से डाउनलोड करना चाहते हैं?</translation> <translation id="6000066717592683814">Google को डिफ़ॉल्ट बनाए रखें</translation> <translation id="6000203700195075278">फिर से फ़ॉलो करें</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">सुझाव को इतिहास से निकालें?</translation> <translation id="6380100320871303656">इस सेटिंग से, ऐसे पेज ज़्यादा बार पहले से लोड किए जाते हैं जिनके बारे में Chrome को लगता है कि वे अक्सर विज़िट किए जाने वाले पेज हैं. इस सेटिंग के चालू रहने पर डेटा का इस्तेमाल बढ़ सकता है.</translation> <translation id="6382848304055775421">एक्सपोर्ट किए जा रहे हैं</translation> -<translation id="6391355955030242704">अपने Chrome की जानकारी सिंक करने और कार में अपना डेटा सुरक्षित रखने के लिए, आपको सुरक्षा सेटिंग में जाकर प्रोफ़ाइल लॉक सेट अप करना होगा. इसके बाद, आपको हर बार कार में बैठने पर एक कोड या पासवर्ड का इस्तेमाल करना होगा.</translation> <translation id="6394791151443660613"><ph name="SEARCH_QUERY" />: खोजें</translation> <translation id="6395288395575013217">लिंक</translation> <translation id="6397616442223433927">इंटरनेट कनेक्शन फिर से जुड़ गया</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb index afe392d..fe7e6664 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hr.xtb
@@ -294,7 +294,6 @@ Privatne oznake poboljšavaju privatnost na webu i ne mogu se upotrebljavati da bi se saznalo tko ste vi.</translation> <translation id="2581165646603367611">Time će se izbrisati kolačići, predmemorija i ostali podaci o web-lokacijama koje Chrome ne smatra važnima.</translation> <translation id="2587052924345400782">Dostupna je novija verzija</translation> -<translation id="2589302627584222634">Postavi zaključavanja profila</translation> <translation id="2593272815202181319">Ravnomjerno raspoređeno</translation> <translation id="2603212228005142861">Prijavite se da biste upravljali svojim preferencijama</translation> <translation id="260403163289591229">Praćeno</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ne sada</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3495219333887281978">Donja tablica za prijavu otvorena na pola visine.</translation> -<translation id="3498338220321963224">Ako se zaključavanje profila kasnije ukloni, vaši će se spremljeni podaci izbrisati.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Poredaj od najstarijeg</translation> <translation id="3507132249039706973">Uključena je Standardna zaštita</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Ukloniti virtualnu karticu?</translation> <translation id="4409271659088619928">Vaša je tražilica <ph name="DSE" />. Potražite njezine upute da biste saznali kako izbrisati svoju povijest pretraživanja, ako je primjenjivo.</translation> <translation id="4415276339145661267">Upravljajte svojim Google računom</translation> -<translation id="4417111749295506837">Da biste sinkronizirali podatke u Chromeu i zaštitili svoje podatke u automobilu, morate izraditi zaključavanje profila. Kôd ili zaporku upotrebljavat ćete svaki put kad uđete u automobil.</translation> <translation id="4425140285732600465">Praćenje cijene. Dobivajte upozorenja ako se cijena snizi na bilo kojoj web-lokaciji.</translation> <translation id="442518031075347249">Više nećete moći upotrebljavati svoju virtualnu karticu s Google Payom. <ph name="BEGIN_LINK1" />Saznajte više o virtualnim karticama<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Prilagodba oglasa</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Zaustavite opise slike</translation> <translation id="5966233851250124270">Chrome će zapamtiti vaš odabir</translation> <translation id="5979084224081478209">Provjeri zaporke</translation> -<translation id="5985186846584605773">Postavljanje zaključavanja profila za automobil</translation> <translation id="5995726099713306770">Ponovo preuzeti stranicu?</translation> <translation id="6000066717592683814">Zadrži Google</translation> <translation id="6000203700195075278">Pratite ponovo</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Želite li ukloniti prijedlog iz povijesti?</translation> <translation id="6380100320871303656">Češće predučitava stranice za koje Chrome misli da ćete ih vjerojatno posjetiti. Ta postavka može rezultirati većom potrošnjom podatkovnog prometa.</translation> <translation id="6382848304055775421">Izvoz</translation> -<translation id="6391355955030242704">Da biste sinkronizirali podatke u Chromeu i zaštitili svoje podatke u automobilu, u sigurnosnim postavkama morate izraditi zaključavanje profila. Kôd ili zaporku upotrebljavat ćete svaki put kad uđete u automobil.</translation> <translation id="6394791151443660613">Pretraživanje: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">VEZA</translation> <translation id="6397616442223433927">Veza je ponovo uspostavljena</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb index b53d493..61fc26e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_hu.xtb
@@ -295,7 +295,6 @@ A privát állapottokenek nagyobb fokú adatvédelmet biztosítanak az interneten, és nem alkalmasak arra, hogy felfedjék az Ön személyazonosságát.</translation> <translation id="2581165646603367611">Ezzel törli a cookie-kat, a gyorsítótárat, valamint a webhelyek összes olyan adatát, amelyről a Chrome úgy véli, hogy nem fontos.</translation> <translation id="2587052924345400782">Rendelkezésre áll új verzió</translation> -<translation id="2589302627584222634">Profilzárolás létrehozása</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Jelentkezzen be a beállításai kezeléséhez</translation> <translation id="260403163289591229">Követve</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Ne most</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />További információ<ph name="END_LINK" /> a javasolt tartalomról</translation> <translation id="3495219333887281978">Az alsó bejelentkezési lap félmagasságban megnyitva.</translation> -<translation id="3498338220321963224">Mentett adatai törlődnek, ha később eltávolítja a profilzárolást.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Rendezés: legrégibb elől</translation> <translation id="3507132249039706973">A Normál védelem be van kapcsolva</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Biztosan eltávolítja a virtuális kártyát?</translation> <translation id="4409271659088619928">Az Ön keresőmotorja a következő: <ph name="DSE" />. A keresési előzmények törléséről a keresőmotorja útmutatójából tájékozódhat, ha van ilyen.</translation> <translation id="4415276339145661267">Google-fiók kezelése</translation> -<translation id="4417111749295506837">Ha az autóban szinkronizálni szeretné Chrome-adatait, és meg szeretné őrizni a biztonságukat, profilzárolást kell létrehoznia. Minden alkalommal meg kell adnia egy kódot vagy jelszót, amikor beül az autóba.</translation> <translation id="4425140285732600465">Ár nyomon követve. Értesítést kaphat, ha valamelyik webhelyen csökken az ár.</translation> <translation id="442518031075347249">A továbbiakban nem fogja tudni használni virtuális kártyáját a Google Pay alkalmazással. <ph name="BEGIN_LINK1" />További információ a virtuális kártyákról<ph name="END_LINK1" />.</translation> <translation id="4428065317363009941">Hirdetések személyre szabása</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Képleírások leállítása</translation> <translation id="5966233851250124270">A Chrome megjegyzi a választását</translation> <translation id="5979084224081478209">Jelszavak ellenőrzése</translation> -<translation id="5985186846584605773">Hozzon létre profilzárolást az autóhoz</translation> <translation id="5995726099713306770">Ismét letölti az oldalt?</translation> <translation id="6000066717592683814">A Google megtartása</translation> <translation id="6000203700195075278">Újrakövetés</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Eltávolítja a javaslatot az előzményekből?</translation> <translation id="6380100320871303656">Gyakrabban tölti be előre azokat az oldalakat, amelyeket a böngésző szerint Ön valószínűleg felkeres. Ez a beállítás megnövekedett adathasználattal járhat.</translation> <translation id="6382848304055775421">Exportálás</translation> -<translation id="6391355955030242704">Ha az autóban szinkronizálni szeretné Chrome-adatait, és meg szeretné őrizni a biztonságukat, profilzárolást kell létrehoznia a biztonsági beállításokban. Minden alkalommal meg kell adnia egy kódot vagy jelszót, amikor beül az autóba.</translation> <translation id="6394791151443660613">Keresés: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Ismét online</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 f344bf2..1f920e8e 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
@@ -294,7 +294,6 @@ Վիճակի անձնական թոքենները բարձրացնում են ցանցում գաղտնիության մակարդակը և անհնար են դարձնում ձեր ինքնության բացահայտումը։</translation> <translation id="2581165646603367611">Բոլոր քուքիները, քեշը և այլ տվյալները, որոնք Chrome-ին անհրաժեշտ չեն, կջնջվեն:</translation> <translation id="2587052924345400782">Հասանելի է նոր տարբերակ</translation> -<translation id="2589302627584222634">Ստեղծել պրոֆիլի կողպում</translation> <translation id="2593272815202181319">Միալայն</translation> <translation id="2603212228005142861">Մտեք հաշիվ՝ ձեր կարգավորումները կառավարելու համար</translation> <translation id="260403163289591229">Հետևում եք</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Հիմա չէ</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Իմացեք ավելին<ph name="END_LINK" /> առաջարկվող բովանդակության վերաբերյալ</translation> <translation id="3495219333887281978">Հաշիվ մտնելու ներքևի էկրանը բացված է կիսով չափ։</translation> -<translation id="3498338220321963224">Եթե հետագայում հեռացնեք պրոֆիլի կողպումը, պահված տվյալները կջնջվեն։</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Սկզբում հները</translation> <translation id="3507132249039706973">Սովորական պաշտպանությունը միացված է</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Հեռացնե՞լ վիրտուալ քարտը</translation> <translation id="4409271659088619928">Դուք օգտագործում եք <ph name="DSE" /> որոնողական համակարգը։ Որոնումների պատմությունը ջնջելու համար կարդացեք համապատասխան ցուցումները։</translation> <translation id="4415276339145661267">Կառավարել Google հաշիվը</translation> -<translation id="4417111749295506837">Chrome-ի ձեր տեղեկությունները համաժամացնելու և մեքենայում տվյալներն ապահով պահելու համար պետք է ստեղծեք պրոֆիլի կողպում։ Ամեն անգամ մեքենա մուտք գործելիս անհրաժեշտ կլինի օգտագործել կոդ կամ գաղտնաբառ։</translation> <translation id="4425140285732600465">Դուք հետևում եք այս ապրանքի գնին։ Երբ որևէ կայքում այն իջնի, դուք կստանաք ծանուցում։</translation> <translation id="442518031075347249">Դուք այլևս չեք կարողանա օգտագործել ձեր վիրտուալ քարտը՝ Google Pay-ի միջոցով վճարումներ կատարելու համար։ <ph name="BEGIN_LINK1" />Իմանալ ավելին վիրտուալ քարտերի մասին<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Գովազդի անհատականացում</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Չստանալ նկարագրություններ</translation> <translation id="5966233851250124270">Chrome-ը կհիշի ձեր ընտրությունը</translation> <translation id="5979084224081478209">Ստուգել գաղտնաբառերը</translation> -<translation id="5985186846584605773">Ստեղծեք պրոֆիլի կողպում ձեր մեքենայի համար</translation> <translation id="5995726099713306770">Նորից ներբեռնե՞լ էջը</translation> <translation id="6000066717592683814">Օգտագործել Google-ը</translation> <translation id="6000203700195075278">Նորից բաժանորդագրվել</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Հեռացնե՞լ առաջարկը պատմությունից:</translation> <translation id="6380100320871303656">Chrome-ը հիմնականում նախաբեռնում է այն էջերը, որոնք առավել հավանական է, որ կայցելեք։ Այս կարգավորումը կարող է մեծացնել թրաֆիկի օգտագործման ծավալը։</translation> <translation id="6382848304055775421">Արտահանում</translation> -<translation id="6391355955030242704">Chrome-ի ձեր տեղեկությունները համաժամացնելու և մեքենայում տվյալներն ապահով պահելու համար անվտանգության կարգավորումներում պետք է ստեղծեք պրոֆիլի կողպում։ Ամեն անգամ մեքենա մուտք գործելիս անհրաժեշտ կլինի օգտագործել կոդ կամ գաղտնաբառ։</translation> <translation id="6394791151443660613">Որոնել՝ <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ՀՂՈՒՄ</translation> <translation id="6397616442223433927">Կապը վերականգնվեց</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb index 78d44c9..52b844d7 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_id.xtb
@@ -294,7 +294,6 @@ Private state token meningkatkan privasi di web dan tidak dapat digunakan untuk menemukan identitas Anda.</translation> <translation id="2581165646603367611">Tindakan ini akan mengosongkan cache dan menghapus cookie, serta data lain dari situs yang dianggap tidak penting oleh Chrome.</translation> <translation id="2587052924345400782">Versi baru telah tersedia</translation> -<translation id="2589302627584222634">Buat kunci profil</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Login untuk mengelola preferensi Anda</translation> <translation id="260403163289591229">Mengikuti</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Jangan sekarang</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pelajari lebih lanjut<ph name="END_LINK" /> konten yang disarankan</translation> <translation id="3495219333887281978">Sheet bawah untuk tombol login terbuka setengah.</translation> -<translation id="3498338220321963224">Data yang Anda simpan akan dihapus jika kunci profil dihapus nanti.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Urutkan dari yang terlama</translation> <translation id="3507132249039706973">Perlindungan Standar aktif</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Hapus kartu virtual Anda?</translation> <translation id="4409271659088619928">Mesin telusur Anda adalah <ph name="DSE" />. Lihat petunjuknya untuk menghapus histori penelusuran Anda, jika memungkinkan.</translation> <translation id="4415276339145661267">Kelola Akun Google Anda</translation> -<translation id="4417111749295506837">Untuk menyinkronkan info Chrome dan menjaga keamanan data Anda di mobil, Anda harus membuat kunci profil. Anda akan menggunakan kode atau sandi setiap kali masuk ke mobil.</translation> <translation id="4425140285732600465">Memantau harga. Dapatkan notifikasi jika ada diskon di situs mana pun.</translation> <translation id="442518031075347249">Anda tidak akan dapat menggunakan kartu virtual dengan Google Pay lagi. <ph name="BEGIN_LINK1" />Pelajari kartu virtual lebih lanjut<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalisasi iklan</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Hentikan deskripsi gambar</translation> <translation id="5966233851250124270">Chrome akan mengingat pilihan Anda</translation> <translation id="5979084224081478209">Periksa sandi</translation> -<translation id="5985186846584605773">Buat kunci profil untuk mobil Anda</translation> <translation id="5995726099713306770">Download halaman lagi?</translation> <translation id="6000066717592683814">Tetap menggunakan Google</translation> <translation id="6000203700195075278">Ikuti kembali</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Hapus saran dari histori?</translation> <translation id="6380100320871303656">Lebih sering melakukan pramuat halaman yang menurut Chrome mungkin akan Anda buka. Setelan ini dapat mengakibatkan peningkatan penggunaan data.</translation> <translation id="6382848304055775421">Mengekspor</translation> -<translation id="6391355955030242704">Untuk menyinkronkan info Chrome dan menjaga keamanan data Anda di mobil, Anda harus membuat kunci profil di setelan keamanan Anda. Anda akan menggunakan kode atau sandi setiap kali masuk ke mobil.</translation> <translation id="6394791151443660613">Telusuri: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Kembali online</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 736c48e..798abef 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
@@ -294,7 +294,6 @@ Traustslyklar bæta persónuvernd á netinu og ekki er hægt að nota þá til að persónugreina þig.</translation> <translation id="2581165646603367611">Þetta mun eyða fótsporum, skyndiminni og öðrum gögnum frá vefsvæðum sem Chrome telur ekki mikilvæg.</translation> <translation id="2587052924345400782">Nýrri útgáfa er í boði</translation> -<translation id="2589302627584222634">Búa til prófíllás</translation> <translation id="2593272815202181319">Jafnbreitt</translation> <translation id="2603212228005142861">Skráðu þig inn til að stjórna kjörstillingum</translation> <translation id="260403163289591229">Fylgir</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ekki núna</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Frekari upplýsingar<ph name="END_LINK" /> um uppástungur að efni</translation> <translation id="3495219333887281978">Innskráningarblað neðst opið í hálfri hæð.</translation> -<translation id="3498338220321963224">Vistuðu gögnunum þínum verður eytt ef prófíllásinn er fjarlægður síðar.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Raða eftir elsta</translation> <translation id="3507132249039706973">Kveikt er á hefðbundinni vörn</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Fjarlægja sýndarkortið þitt?</translation> <translation id="4409271659088619928">Leitarvélin þín er <ph name="DSE" />. Skoðaðu leiðbeiningar hennar um að eyða leitarferlinum ef það á við.</translation> <translation id="4415276339145661267">Stjórna Google reikningnum</translation> -<translation id="4417111749295506837">Til að samstilla upplýsingar Chrome og gæta að öryggi gagna í bílnum þarftu að búa til prófíllás. Þú notar kóða eða aðgangsorð í hvert skipti sem þú ferð inn í bílinn.</translation> <translation id="4425140285732600465">Vaktar verð. Fáðu tilkynningu ef verðlækkun verður á einhverju vefsvæði.</translation> <translation id="442518031075347249">Þú munt ekki lengur geta notað sýndarkortið þitt með Google Pay. <ph name="BEGIN_LINK1" />Nánar um sýndarkort<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Sérsniðnar auglýsingar</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Slökkva á myndlýsingum</translation> <translation id="5966233851250124270">Chrome man valið þitt</translation> <translation id="5979084224081478209">Yfirfara aðgangsorð</translation> -<translation id="5985186846584605773">Búðu til prófíllás fyrir bílinn</translation> <translation id="5995726099713306770">Sækja síðu aftur?</translation> <translation id="6000066717592683814">Nota Google áfram</translation> <translation id="6000203700195075278">Fylgja aftur</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Fjarlægja tillögu úr ferlinum?</translation> <translation id="6380100320871303656">Forhleður oftar síðum sem Chrome telur að þú munir opna. Þessi stilling kann að auka gagnanotkun.</translation> <translation id="6382848304055775421">Flytur út</translation> -<translation id="6391355955030242704">Til að samstilla upplýsingar Chrome og gæta að öryggi gagna í bílnum þarftu að búa til prófíllás í öryggisstillingunum. Þú notar kóða eða aðgangsorð í hvert skipti sem þú ferð inn í bílinn.</translation> <translation id="6394791151443660613">Leit: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">TENGILL</translation> <translation id="6397616442223433927">Nettenging komin aftur</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb index 9153c986..c2904f4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_it.xtb
@@ -294,7 +294,6 @@ I token di stato privati migliorano la privacy sul web e non possono essere usati per scoprire la tua identità.</translation> <translation id="2581165646603367611">Verrà svuotata la cache e verranno cancellati i cookie e altri dati relativi a siti che Chrome non ritiene importanti.</translation> <translation id="2587052924345400782">Nuova versione disponibile</translation> -<translation id="2589302627584222634">Crea un blocco del profilo</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Accedi per gestire le tue preferenze</translation> <translation id="260403163289591229">Stai seguendo</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Non adesso</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ulteriori informazioni<ph name="END_LINK" /> sui contenuti suggeriti</translation> <translation id="3495219333887281978">Riquadro inferiore di accesso aperto nella parte inferiore dello schermo.</translation> -<translation id="3498338220321963224">I dati salvati verranno cancellati se il blocco del profilo verrà rimosso in un secondo momento.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordina per meno recente</translation> <translation id="3507132249039706973">È attiva la protezione standard</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Rimuovere la carta virtuale?</translation> <translation id="4409271659088619928">Il tuo motore di ricerca è <ph name="DSE" />. Consulta le relative istruzioni per eliminare la tua cronologia delle ricerche, se applicabile.</translation> <translation id="4415276339145661267">Gestisci il tuo Account Google</translation> -<translation id="4417111749295506837">Per sincronizzare le tue informazioni di Chrome e proteggere i tuoi dati in auto, devi creare un blocco del profilo. Dovrai usare un codice o una password ogni volta che entrerai in auto.</translation> <translation id="4425140285732600465">Monitoraggio del prezzo attivato. Ricevi avvisi se il prezzo cala su qualsiasi sito.</translation> <translation id="442518031075347249">Non potrai più utilizzare la tua carta virtuale con Google Pay. <ph name="BEGIN_LINK1" />Scopri di più sulle carte virtuali<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizzazione degli annunci</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Interrompi descr. immagini</translation> <translation id="5966233851250124270">Chrome memorizzerà la tua scelta</translation> <translation id="5979084224081478209">Controlla password</translation> -<translation id="5985186846584605773">Crea un blocco del profilo per la tua auto</translation> <translation id="5995726099713306770">Vuoi scaricare di nuovo la pagina?</translation> <translation id="6000066717592683814">Mantieni Google</translation> <translation id="6000203700195075278">Segui di nuovo</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Rimuovere il suggerimento dalla cronologia?</translation> <translation id="6380100320871303656">Precarica più di frequente le pagine che Chrome ritiene tu possa visitare. Questa impostazione potrebbe comportare un maggior utilizzo dei dati.</translation> <translation id="6382848304055775421">Esportazione in corso…</translation> -<translation id="6391355955030242704">Per sincronizzare le tue informazioni di Chrome e proteggere i tuoi dati in auto, devi creare un blocco del profilo nelle impostazioni di sicurezza. Dovrai usare un codice o una password ogni volta che entrerai in auto.</translation> <translation id="6394791151443660613">Cerca: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Di nuovo online</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb index 87b692e..a9a6d05 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_iw.xtb
@@ -294,7 +294,6 @@ אסימוני מצב פרטי משפרים את הפרטיות באינטרנט ולא ניתן להשתמש בהם כדי לגלות את הזהות שלך.</translation> <translation id="2581165646603367611">פעולה זו תמחק את קובצי ה-Cookie, את המטמון ונתונים אחרים של אתרים ש-Chrome לא מחשיב כחשובים.</translation> <translation id="2587052924345400782">יש גרסה חדשה יותר</translation> -<translation id="2589302627584222634">יצירה של נעילת פרופיל</translation> <translation id="2593272815202181319">רוחב אחיד</translation> <translation id="2603212228005142861">צריך להיכנס לחשבון כדי לנהל את ההעדפות</translation> <translation id="260403163289591229">במעקב</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">לא עכשיו</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />מידע נוסף<ph name="END_LINK" /> על הצעות לתוכן</translation> <translation id="3495219333887281978">הגיליון התחתון של הכניסה נפתח בחצי הגובה.</translation> -<translation id="3498338220321963224">אם נעילת הפרופיל תוסר מאוחר יותר, הנתונים השמורים יימחקו.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">מיון לפי הישן ביותר</translation> <translation id="3507132249039706973">מופעלת הגנה רגילה</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">להסיר את הכרטיס הווירטואלי?</translation> <translation id="4409271659088619928">מנוע החיפוש שלך הוא <ph name="DSE" />. ניתן לעיין בהוראות שלו לגבי מחיקת היסטוריית החיפושים, אם רלוונטי.</translation> <translation id="4415276339145661267">ניהול חשבון Google שלך</translation> -<translation id="4417111749295506837">כדי לסנכרן את המידע מ-Chrome ולשמור על אבטחת המידע ברכב, עליך ליצור נעילת פרופיל. יהיה עליך להשתמש בקוד או בסיסמה בכל כניסה לרכב.</translation> <translation id="4425140285732600465">המחיר נמצא במעקב. קבלת התראות על הנחות באתר כלשהו.</translation> <translation id="442518031075347249">לא תהיה לך יותר אפשרות להשתמש בכרטיס הווירטואלי באמצעות Google Pay. <ph name="BEGIN_LINK1" />כאן יש מידע נוסף על כרטיסים וירטואליים<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">התאמה אישית של מודעות</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">הפסקה של תיאורי התמונות</translation> <translation id="5966233851250124270">הבחירה שלך תישמר ב-Chrome</translation> <translation id="5979084224081478209">בדיקת הסיסמאות</translation> -<translation id="5985186846584605773">יצירה של נעילת פרופיל לרכב</translation> <translation id="5995726099713306770">להוריד שוב את הדף?</translation> <translation id="6000066717592683814">להמשיך להשתמש ב-Google</translation> <translation id="6000203700195075278">מעקב מחודש</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">האם להסיר את ההצעה מההיסטוריה?</translation> <translation id="6380100320871303656">מערכת Chrome טוענת מראש בתדירות גבוהה יותר דפים שסביר שהמשתמש יעבור אליהם. ההגדרה הזו יכולה לגרום לשימוש מוגבר בנתונים.</translation> <translation id="6382848304055775421">מתבצע ייצוא</translation> -<translation id="6391355955030242704">כדי לסנכרן את המידע מ-Chrome ולשמור על אבטחת המידע ברכב, עליך ליצור נעילת פרופיל בהגדרות האבטחה. יהיה עליך להשתמש בקוד או בסיסמה בכל כניסה לרכב.</translation> <translation id="6394791151443660613">חיפוש: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">קישור</translation> <translation id="6397616442223433927">חזרה למצב אונליין</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb index 157deea..c403f43 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ja.xtb
@@ -295,7 +295,6 @@ プライベート ステート トークンはウェブ上のプライバシー保護を強化するもので、ユーザーの特定に使用することはできません。</translation> <translation id="2581165646603367611">Chrome で重要度が低いと判断されるサイトの Cookie やキャッシュなどのデータを削除します。</translation> <translation id="2587052924345400782">新しいバージョンをご利用いただけます</translation> -<translation id="2589302627584222634">プロフィールのロックを作成</translation> <translation id="2593272815202181319">等幅</translation> <translation id="2603212228005142861">設定を管理するにはログインしてください</translation> <translation id="260403163289591229">フォロー中</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">後で</translation> <translation id="3493531032208478708">詳しくは、<ph name="BEGIN_LINK" />おすすめのコンテンツ<ph name="END_LINK" />についての説明をご覧ください</translation> <translation id="3495219333887281978">ログインのボトムシートが画面の下半分に表示されています。</translation> -<translation id="3498338220321963224">保存したデータは、後ほどプロフィールのロックを削除すると消去されます。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">古い順に並べ替え</translation> <translation id="3507132249039706973">標準保護機能がオンになっています</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">仮想カードを削除しますか?</translation> <translation id="4409271659088619928">検索エンジンは <ph name="DSE" /> に設定されています。検索履歴を削除する場合は、検索エンジンの手順をご確認ください(該当する場合)。</translation> <translation id="4415276339145661267">Google アカウントの管理</translation> -<translation id="4417111749295506837">車内で Chrome 情報を同期してデータを安全に保つには、プロフィールのロックを作成する必要があります。作成すると、車に乗るたびにコードまたはパスワードの入力が求められるようになります。</translation> <translation id="4425140285732600465">価格をトラッキングします。値下げしたサイトがある場合に通知します。</translation> <translation id="442518031075347249">Google Pay で仮想カードを使用できなくなります。<ph name="BEGIN_LINK1" />仮想カードの詳細<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">広告のカスタマイズ</translation> @@ -963,7 +960,6 @@ <translation id="5964869237734432770">画像の説明文の取得を停止する</translation> <translation id="5966233851250124270">この設定は Chrome に保存されます</translation> <translation id="5979084224081478209">パスワードを確認</translation> -<translation id="5985186846584605773">車用のプロフィールのロックを作成する</translation> <translation id="5995726099713306770">ページを再ダウンロードしますか?</translation> <translation id="6000066717592683814">Google のままにする</translation> <translation id="6000203700195075278">再フォロー</translation> @@ -1032,7 +1028,6 @@ <translation id="6364438453358674297">履歴から候補を削除しますか?</translation> <translation id="6380100320871303656">Chrome によってアクセスする可能性があると判断されたページが、より頻繁にプリロードされます。この設定によりデータの使用量が増える可能性があります。</translation> <translation id="6382848304055775421">エクスポートしています</translation> -<translation id="6391355955030242704">車内で Chrome 情報を同期してデータを安全に保つには、セキュリティ設定でプロフィールのロックを作成する必要があります。作成すると、車に乗るたびにコードまたはパスワードの入力が求められるようになります。</translation> <translation id="6394791151443660613">検索: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">リンク</translation> <translation id="6397616442223433927">オンラインに復帰</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb index 7ba6c63..171cf35b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ka.xtb
@@ -294,7 +294,6 @@ პირადი მდგომარეობის ჟეტონები ვებში კონფიდენციალურობის დაცვას უწყობს ხელს, ხოლო მათი მეშვეობით თქვენი ვინაობის დადგენა ვერ მოხერხდება.</translation> <translation id="2581165646603367611">ეს მოქმედება გაასუფთავებს ქუქი-ჩანაწერებს, ქეშს და საიტების სხვა მონაცემებს, რომლებსაც Chrome უმნიშვნელოდ თვლის.</translation> <translation id="2587052924345400782">ხელმისაწვდომია ახალი ვერსია</translation> -<translation id="2589302627584222634">პროფილის ჩაკეტვის დაყენება</translation> <translation id="2593272815202181319">ფიქსირებული სიგანის</translation> <translation id="2603212228005142861">პარამეტრების სამართავად შედით სისტემაში</translation> <translation id="260403163289591229">თვალს ადევნებთ</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">ახლა არა</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />შეიტყვეთ მეტი<ph name="END_LINK" /> შემოთავაზებული კონტენტის შესახებ</translation> <translation id="3495219333887281978">სისტემაში შესვლის ქვედა ფურცელი გახსნილია ნახევარ სიმაღლეზე.</translation> -<translation id="3498338220321963224">თქვენი შენახული მონაცემები წაიშლება, თუ მოგვიანებით პროფილის ჩაკეტვის ფუნქცია ამოიშლება.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">დალაგება უძველესით</translation> <translation id="3507132249039706973">სტანდარტული დაცვა ჩართულია</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">გსურთ, ამოიშალოს თქვენი ვირტუალური ბარათი?</translation> <translation id="4409271659088619928">თქვენი საძიებო სისტემაა <ph name="DSE" />. გაეცანით მის ინსტრუქციას იმის თაობაზე, როგორ წაშალოთ თქვენი ძიების ისტორია, თუ ეს შესაძლებელია.</translation> <translation id="4415276339145661267">თქვენი Google ანგარიშის მართვა</translation> -<translation id="4417111749295506837">თქვენი Chrome ინფორმაციის სინქრონიზაციისა და თქვენი მონაცემების უსაფრთხოების უზრუნველყოფად მანქანაში, პროფილის ჩაკეტვა უნდა დააყენოთ. მანქანაში ყოველი შესვლისას კოდის ან პაროლის გამოყენება დაგჭირდებათ.</translation> <translation id="4425140285732600465">მიმდინარეობს ფასისთვის თვალის მიდევნება. თქვენ მიიღებთ გაფრთხილებებს, როცა ფასი დაიკლებს რომელიმე საიტზე.</translation> <translation id="442518031075347249">Google Pay-ში თქვენს ვირტუალურ ბარათს ვეღარ გამოიყენებთ. <ph name="BEGIN_LINK1" />შეიტყვეთ მეტი ვირტუალური ბარათების შესახებ<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">რეკლამის პერსონალიზება</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">სურათების აღწერის შეწყვეტა</translation> <translation id="5966233851250124270">Chrome დაიმახსოვრებს თქვენს არჩევანს</translation> <translation id="5979084224081478209">პაროლების შემოწმება</translation> -<translation id="5985186846584605773">დააყენეთ პროფილის ჩაკეტვა თქვენი მანქანისთვის</translation> <translation id="5995726099713306770">გსურთ, ხელახლა ჩამოტვირთოთ გვერდი?</translation> <translation id="6000066717592683814">Google-ის შენარჩუნება</translation> <translation id="6000203700195075278">თვალის ხელახლა მიდევნება</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">ამოიშალოს შემოთავაზება ისტორიიდან?</translation> <translation id="6380100320871303656">უფრო ხშირად ჩატვირთავს წინასწარ გვერდებს, რომლებიც, Chrome-ის გათვლებით, შეიძლება მოინახულოთ. ამ პარამეტრმა შეიძლება გამოიწვიოს მონაცემთა გაზრდილი მოხმარება.</translation> <translation id="6382848304055775421">მიმდინარეობს ექსპორტირება</translation> -<translation id="6391355955030242704">თქვენი Chrome ინფორმაციის სინქრონიზაციისა და თქვენი მონაცემების უსაფრთხოების უზრუნველყოფად მანქანაში, უსაფრთხოების პარამეტრებიდან პროფილის ჩაკეტვა უნდა დააყენოთ. მანქანაში ყოველი შესვლისას კოდის ან პაროლის გამოყენება დაგჭირდებათ.</translation> <translation id="6394791151443660613">ძიება: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ბმული</translation> <translation id="6397616442223433927">კვლავ ონლაინ ხართ</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 d428935..1a95533 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
@@ -294,7 +294,6 @@ Жеке күй токендері интернеттегі құпиялықты жақсартады. Олар кім екеніңізді анықтау үшін пайдаланылмайды.</translation> <translation id="2581165646603367611">Сookie файлдары, кэш және маңызды емес деп саналатын сайттың басқа деректері өшіріледі.</translation> <translation id="2587052924345400782">Жаңа нұсқасы қолжетімді</translation> -<translation id="2589302627584222634">Профиль құлпын жасау</translation> <translation id="2593272815202181319">Моноенді</translation> <translation id="2603212228005142861">Параметрлерді басқару үшін аккаунтқа кіріңіз.</translation> <translation id="260403163289591229">Жазылғансыз</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Қазір емес</translation> <translation id="3493531032208478708">Ұсынылған контент туралы <ph name="BEGIN_LINK" />толығырақ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Акканунтқа кіру төменгі парақшасы жартылай ашылды.</translation> -<translation id="3498338220321963224">Профиль құлпы кейінірек өшірілсе, сақталған деректеріңіз өшіріледі.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ең ескісі бойынша сұрыптау</translation> <translation id="3507132249039706973">Стандартты қорғаныс қосулы.</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Виртуалдық картаны жою керек пе?</translation> <translation id="4409271659088619928">Іздеу жүйесі — <ph name="DSE" />. Қажет болса, ондағы іздеу тарихын жою туралы нұсқауларды қараңыз.</translation> <translation id="4415276339145661267">Google аккаунтын басқару</translation> -<translation id="4417111749295506837">Chrome ақпаратын синхрондау және деректеріңізді көлікте қауіпсіз сақтау үшін профиль құлпын жасауыңыз қажет. Көлікке отырған сайын кодты немесе құпия сөзді пайдалана аласыз.</translation> <translation id="4425140285732600465">Баға бақылануда. Қандай да бір сайтта баға төмендесе, сізге хабарланады.</translation> <translation id="442518031075347249">Бұдан былай виртуалдық картаны Google Pay қызметінде пайдалана алмайтын боласыз. <ph name="BEGIN_LINK1" />Виртуалдық карталар туралы толығырақ ақпарат алыңыз.<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Жарнаманы жекелендіру</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Сурет сипаттамаларын алмау</translation> <translation id="5966233851250124270">Chrome таңдауыңызды есте сақтайды</translation> <translation id="5979084224081478209">Құпия сөздерді тексеру</translation> -<translation id="5985186846584605773">Көлігіңіз үшін профиль құлпын жасау</translation> <translation id="5995726099713306770">Бет қайта жүктеп алынсын ба?</translation> <translation id="6000066717592683814">Google қызметін әдепкісінше пайдалану</translation> <translation id="6000203700195075278">Қайта жазылу</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Журналдың ұсынысын жою қажет пе?</translation> <translation id="6380100320871303656">Chrome браузері сіз кіруіңіз мүмкін деп санайтын беттерді алдын ала жүктеуді жиілетеді. Бұл параметр қосулы болса, деректерді пайдалану көлемі артуы мүмкін.</translation> <translation id="6382848304055775421">Экспортталып жатыр</translation> -<translation id="6391355955030242704">Chrome ақпаратын синхрондау және деректеріңізді көлікте қауіпсіз сақтау үшін қауіпсіздік параметрлерінде профиль құлпын жасауыңыз қажет. Көлікке отырған сайын кодты немесе құпия сөзді пайдалана аласыз.</translation> <translation id="6394791151443660613">Іздеу: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">СІЛТЕМЕ</translation> <translation id="6397616442223433927">Онлайн режимге оралу</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 862a745..3c0dedc7 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
@@ -294,7 +294,6 @@ ថូខិនស្ថានភាពឯកជនកែលម្អឯកជនភាពនៅលើបណ្ដាញ និងមិនអាចត្រូវបានប្រើ ដើម្បីឱ្យដឹងថាអ្នកជានរណានោះទេ។</translation> <translation id="2581165646603367611">វានឹងជម្រះខុកឃី ឃ្លាំងសម្ងាត់ និងទិន្នន័យផ្សេងទៀតនៃគេហទំព័រដែល Chrome គិតថាមិនសំខាន់។</translation> <translation id="2587052924345400782">មានផ្តល់ជូនកំណែថ្មី</translation> -<translation id="2589302627584222634">បង្កើតការចាក់សោកម្រងព័ត៌មាន</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">ចូលគណនីដើម្បីគ្រប់គ្រងចំណូលចិត្តរបស់អ្នក</translation> <translation id="260403163289591229">កំពុងតាមដាន</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">មិនមែនឥឡូវនេះទេ</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ស្វែងយល់បន្ថែម<ph name="END_LINK" />អំពីមាតិកាដែលបានណែនាំ</translation> <translation id="3495219333887281978">បានបើកសន្លឹកខាងក្រោមសម្រាប់ចូលគណនីពាក់កណ្ដាលអេក្រង់។</translation> -<translation id="3498338220321963224">ទិន្នន័យដែលអ្នកបានរក្សាទុកនឹងត្រូវបានលុប ប្រសិនបើដកការចាក់សោកម្រងព័ត៌មានចេញនៅពេលក្រោយ។</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">តម្រៀបតាមចាស់បំផុត</translation> <translation id="3507132249039706973">ការការពារស្តង់ដារត្រូវបានបើក</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">ដកកាតនិម្មិតរបស់អ្នកឬ?</translation> <translation id="4409271659088619928">ម៉ាស៊ីនស្វែងរករបស់អ្នកគឺ <ph name="DSE" />។ មើលការណែនាំរបស់ម៉ាស៊ីនស្វែងរក ដើម្បីដឹងអំពីរបៀបលុបប្រវត្តិស្វែងរករបស់អ្នក ប្រសិនបើអាច។</translation> <translation id="4415276339145661267">គ្រប់គ្រងគណនី Google របស់អ្នក</translation> -<translation id="4417111749295506837">ដើម្បីធ្វើសមកាលកម្មព័ត៌មាន Chrome របស់អ្នក និងរក្សាសុវត្ថិភាពទិន្នន័យរបស់អ្នកនៅក្នុងរថយន្ត អ្នកត្រូវតែបង្កើតការចាក់សោកម្រងព័ត៌មាន។ អ្នកនឹងប្រើកូដ ឬពាក្យសម្ងាត់ រាល់ពេលដែលអ្នកចូលរថយន្ត។</translation> <translation id="4425140285732600465">កំពុងតាមដានតម្លៃ។ ទទួលបានការជូនដំណឹង ប្រសិនបើមានការធ្លាក់ថ្លៃនៅលើគេហទំព័រណាមួយ។</translation> <translation id="442518031075347249">អ្នកនឹងមិនអាចប្រើកាតនិម្មិតរបស់អ្នកជាមួយ Google Pay បានទៀតទេ។ <ph name="BEGIN_LINK1" />ស្វែងយល់បន្ថែមអំពីកាតនិម្មិត<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ការកំណត់ការផ្សាយពាណិជ្ជកម្មឱ្យស្របតាមបុគ្គល</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">ឈប់យកការពណ៌នាអំពីរូបភាព</translation> <translation id="5966233851250124270">Chrome នឹងចងចាំជម្រើសរបស់អ្នក</translation> <translation id="5979084224081478209">ពិនិត្យពាក្យសម្ងាត់</translation> -<translation id="5985186846584605773">បង្កើតការចាក់សោកម្រងព័ត៌មានសម្រាប់រថយន្តរបស់អ្នក</translation> <translation id="5995726099713306770">ទាញយកទំព័រម្ដងទៀត?</translation> <translation id="6000066717592683814">រក្សា Google ដដែល</translation> <translation id="6000203700195075278">តាមដានឡើងវិញ</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">យកការផ្តល់យោបល់ចេញពីប្រវត្តិ?</translation> <translation id="6380100320871303656">ផ្ទុកទំព័រជាមុនកាន់តែញឹកញាប់ដែល Chrome គិតថាអ្នកទំនងជាចូលមើល។ ការកំណត់នេះអាចបណ្ដាលឱ្យការប្រើប្រាស់ទិន្នន័យមានការកើនឡើង។</translation> <translation id="6382848304055775421">កំពុងនាំចេញ</translation> -<translation id="6391355955030242704">ដើម្បីធ្វើសមកាលកម្មព័ត៌មាន Chrome របស់អ្នក និងរក្សាសុវត្ថិភាពទិន្នន័យរបស់អ្នកនៅក្នុងរថយន្ត អ្នកត្រូវតែបង្កើតការចាក់សោកម្រងព័ត៌មាននៅក្នុងការកំណត់សុវត្ថិភាពរបស់អ្នក។ អ្នកនឹងប្រើកូដ ឬពាក្យសម្ងាត់ រាល់ពេលដែលអ្នកចូលរថយន្ត។</translation> <translation id="6394791151443660613">ស្វែងរក៖ <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">តំណ</translation> <translation id="6397616442223433927">មានអ៊ីនធឺណិតវិញ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb index c011bd8..27895cd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_kn.xtb
@@ -295,7 +295,6 @@ ಖಾಸಗಿ ಸ್ಥಿತಿಯ ಟೋಕನ್ಗಳು ವೆಬ್ನಲ್ಲಿನ ಗೌಪ್ಯತೆಯನ್ನು ಸುಧಾರಿಸುತ್ತವೆ ಮತ್ತು ನೀವು ಯಾರೆಂದು ಕಂಡುಹಿಡಿಯಲು ಅವುಗಳನ್ನು ಬಳಸಲು ಸಾಧ್ಯವಿಲ್ಲ.</translation> <translation id="2581165646603367611">ಇದು ಕುಕೀಗಳು, ಕ್ಯಾಷ್ ಮತ್ತು ಪ್ರಮುಖವಲ್ಲವೆಂದು Chrome ಭಾವಿಸುವ ಸೈಟ್ಗಳ ಇತರ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="2587052924345400782">ಹೊಸ ಆವೃತ್ತಿಯು ಲಭ್ಯವಿದೆ</translation> -<translation id="2589302627584222634">ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಒಂದನ್ನು ರಚಿಸಿ</translation> <translation id="2593272815202181319">ಮೊನೋಸ್ಪೇಸ್</translation> <translation id="2603212228005142861">ನಿಮ್ಮ ಆದ್ಯತೆಗಳನ್ನು ನಿರ್ವಹಿಸಲು ಸೈನ್ ಇನ್ ಮಾಡಿ</translation> <translation id="260403163289591229">ಫಾಲೋ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ಈಗ ಬೇಡ</translation> <translation id="3493531032208478708">ಸೂಚಿಸಲಾದ ವಿಷಯದ ಕುರಿತು <ph name="BEGIN_LINK" />ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ಸೈನ್ ಇನ್ ಮಾಡುವ ಕೆಳಭಾಗದ ಶೀಟ್ ಅರ್ಧ ಎತ್ತರದಲ್ಲಿ ತೆರೆದಿದೆ.</translation> -<translation id="3498338220321963224">ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಅನ್ನು ನಂತರ ತೆಗೆದುಹಾಕಿದರೆ, ನಿಮ್ಮ ಸೇವ್ ಮಾಡಿದ ಡೇಟಾವನ್ನು ಅಳಿಸಲಾಗುತ್ತದೆ.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">ಹಳೆಯದರಿಂದ ವಿಂಗಡಿಸಿ</translation> <translation id="3507132249039706973">ಪ್ರಮಾಣಿತ ಸುರಕ್ಷತೆ ಆನ್ ಆಗಿದೆ</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">ನಿಮ್ಮ ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ತೆಗೆದುಹಾಕುವುದೇ?</translation> <translation id="4409271659088619928">ನಿಮ್ಮ ಸರ್ಚ್ ಎಂಜಿನ್ <ph name="DSE" /> ಆಗಿದೆ. ಅನ್ವಯವಾದರೆ, ನಿಮ್ಮ ಹುಡುಕಾಟದ ಇತಿಹಾಸವನ್ನು ಅಳಿಸುವುದಕ್ಕಾಗಿ ಅವರ ಸೂಚನೆಗಳನ್ನು ನೋಡಿ.</translation> <translation id="4415276339145661267">ನಿಮ್ಮ Google ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸಿ</translation> -<translation id="4417111749295506837">ನಿಮ್ಮ Chrome ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ಕಾರಿನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು, ನೀವು ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಒಂದನ್ನು ರಚಿಸಬೇಕು. ನೀವು ಪ್ರತಿ ಬಾರಿ ಕಾರ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿದಾಗಲೂ ನೀವು ಕೋಡ್ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಒಂದನ್ನು ಬಳಸುತ್ತೀರಿ.</translation> <translation id="4425140285732600465">ದರವನ್ನು ಟ್ರ್ಯಾಕ್ ಮಾಡಲಾಗುತ್ತಿದೆ. ಯಾವುದೇ ಸೈಟ್ನಲ್ಲಿ ಬೆಲೆ ಕಡಿಮೆಯಾದರೆ ಅಲರ್ಟ್ಗಳನ್ನು ಪಡೆಯಿರಿ.</translation> <translation id="442518031075347249">Google Pay ಜೊತೆಗೆ ನಿಮ್ಮ ವರ್ಚುವಲ್ ಕಾರ್ಡ್ ಅನ್ನು ಇನ್ನು ಮುಂದೆ ಬಳಸಲು ನಿಮಗೆ ಸಾಧ್ಯವಾಗುವುದಿಲ್ಲ. <ph name="BEGIN_LINK1" />ವರ್ಚುವಲ್ ಕಾರ್ಡ್ಗಳ ಕುರಿತು ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ಜಾಹೀರಾತು ವೈಯಕ್ತೀಕರಣ</translation> @@ -964,7 +961,6 @@ <translation id="5964869237734432770">ಚಿತ್ರ ವಿವರಣೆಗಳನ್ನು ನಿಲ್ಲಿಸಿ</translation> <translation id="5966233851250124270">ನಿಮ್ಮ ಆಯ್ಕೆಯನ್ನು Chrome ನೆನಪಿಟ್ಟುಕೊಳ್ಳುತ್ತದೆ</translation> <translation id="5979084224081478209">ಪಾಸ್ವರ್ಡ್ಗಳನ್ನು ಪರಿಶೀಲಿಸಿ</translation> -<translation id="5985186846584605773">ನಿಮ್ಮ ಕಾರಿಗಾಗಿ ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಒಂದನ್ನು ರಚಿಸಿ</translation> <translation id="5995726099713306770">ಪುಟವನ್ನು ಪುನಃ ಡೌನ್ಲೋಡ್ ಮಾಡಬೇಕೆ?</translation> <translation id="6000066717592683814">Google ಇರಿಸಿಕೊಳ್ಳಿ</translation> <translation id="6000203700195075278">ಮರು ಅನುಸರಿಸಿ</translation> @@ -1033,7 +1029,6 @@ <translation id="6364438453358674297">ಇತಿಹಾಸದಿಂದ ಸಲಹೆಯನ್ನು ತೆಗೆದುಹಾಕುವುದೇ?</translation> <translation id="6380100320871303656">ನೀವು ಭೇಟಿ ನೀಡುವ ಸಾಧ್ಯತೆ ಇದೆ ಎಂದು Chrome ಭಾವಿಸುವ ಪುಟಗಳನ್ನು ಇದು ಹೆಚ್ಚು ಬಾರಿ ಮುಂಚಿತವಾಗಿ ಲೋಡ್ ಮಾಡುತ್ತದೆ. ಈ ಸೆಟ್ಟಿಂಗ್ನಿಂದಾಗಿ ಡೇಟಾ ಬಳಕೆ ಹೆಚ್ಚಾಗಬಹುದು.</translation> <translation id="6382848304055775421">ಎಕ್ಸ್ಪೋರ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ</translation> -<translation id="6391355955030242704">ನಿಮ್ಮ Chrome ಮಾಹಿತಿಯನ್ನು ಸಿಂಕ್ ಮಾಡಲು ಮತ್ತು ಕಾರಿನಲ್ಲಿ ನಿಮ್ಮ ಡೇಟಾವನ್ನು ಸುರಕ್ಷಿತವಾಗಿರಿಸಲು, ನಿಮ್ಮ ಭದ್ರತೆ ಸೆಟ್ಟಿಂಗ್ಗಳಲ್ಲಿ ನೀವು ಪ್ರೊಫೈಲ್ ಲಾಕ್ ಒಂದನ್ನು ರಚಿಸಬೇಕು. ನೀವು ಪ್ರತಿ ಬಾರಿ ಕಾರ್ ಅನ್ನು ಪ್ರವೇಶಿಸಿದಾಗಲೂ ನೀವು ಕೋಡ್ ಅಥವಾ ಪಾಸ್ವರ್ಡ್ ಒಂದನ್ನು ಬಳಸುತ್ತೀರಿ.</translation> <translation id="6394791151443660613">ಹುಡುಕಿ: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ಲಿಂಕ್</translation> <translation id="6397616442223433927">ಆನ್ಲೈನ್ಗೆ ಮರಳಿದ್ದೀರಿ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb index 9681ec5d..b9980f5 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ko.xtb
@@ -294,7 +294,6 @@ 비공개 상태 토큰은 웹의 개인 정보 보호를 개선하나, 나를 식별하는 데 사용될 수는 없습니다.</translation> <translation id="2581165646603367611">이를 통해 쿠키, 캐시 및 Chrome에서 중요하다고 간주하지 않는 사이트의 기타 데이터가 삭제됩니다.</translation> <translation id="2587052924345400782">최신 버전 사용 가능</translation> -<translation id="2589302627584222634">프로필 잠금 만들기</translation> <translation id="2593272815202181319">고정 너비</translation> <translation id="2603212228005142861">환경설정을 관리하려면 로그인하세요</translation> <translation id="260403163289591229">팔로우 중</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">나중에</translation> <translation id="3493531032208478708">추천 콘텐츠 <ph name="BEGIN_LINK" />자세히 알아보기<ph name="END_LINK" /></translation> <translation id="3495219333887281978">로그인 하단 시트가 절반 높이로 열렸습니다.</translation> -<translation id="3498338220321963224">나중에 프로필 잠금을 삭제하면 저장된 데이터가 삭제됩니다.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">오래된 항목순 정렬</translation> <translation id="3507132249039706973">표준 보호 모드를 사용 중입니다.</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">가상 카드를 삭제하시겠습니까?</translation> <translation id="4409271659088619928">기본 검색엔진은 <ph name="DSE" />입니다. 해당 검색엔진에서 검색 기록을 삭제할 수 있는 경우 검색 기록 삭제 안내를 확인하세요.</translation> <translation id="4415276339145661267">Google 계정 관리</translation> -<translation id="4417111749295506837">자동차에서 Chrome 정보를 동기화하고 데이터를 안전하게 유지하려면 프로필 잠금을 만들어야 합니다. 차량에 탑승할 때마다 코드나 비밀번호를 사용하게 됩니다.</translation> <translation id="4425140285732600465">가격 추적 중입니다. 사이트에서 가격이 인하되면 알림이 전송됩니다.</translation> <translation id="442518031075347249">더 이상 Google Pay에서 가상 카드를 사용할 수 없습니다. <ph name="BEGIN_LINK1" />가상 카드에 관해 자세히 알아보기<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">광고 개인 최적화</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">이미지 설명 중지</translation> <translation id="5966233851250124270">선택사항이 Chrome에 저장됩니다</translation> <translation id="5979084224081478209">비밀번호 확인</translation> -<translation id="5985186846584605773">자동차용 프로필 잠금 만들기</translation> <translation id="5995726099713306770">페이지를 다시 다운로드하시겠습니까?</translation> <translation id="6000066717592683814">계속 Google 사용</translation> <translation id="6000203700195075278">다시 팔로우</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">기록에서 제안을 삭제하시겠습니까?</translation> <translation id="6380100320871303656">Chrome에서 사용자가 방문할 가능성이 높다고 생각되는 페이지를 더 자주 미리 로드합니다. 이 설정을 사용하면 데이터 사용량이 늘어날 수 있습니다.</translation> <translation id="6382848304055775421">내보내는 중</translation> -<translation id="6391355955030242704">자동차에서 Chrome 정보를 동기화하고 데이터를 안전하게 유지하려면 보안 설정에서 프로필 잠금을 만들어야 합니다. 차량에 탑승할 때마다 코드나 비밀번호를 사용하게 됩니다.</translation> <translation id="6394791151443660613">검색: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">링크</translation> <translation id="6397616442223433927">인터넷에 다시 연결됨</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 60cfb073..b0fe66b 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
@@ -290,7 +290,6 @@ <translation id="2580436639406015883">Спамдарга жана шылуундарга каршы жеке абал токендери колдонулат. Алардын жардамы менен сайттар шылуундар менен күрөшүп, боттор менен адамдарды айырмалай алат. Сайт жасаган аракеттериңизге жараша, өзгөчө, аккаунтуңузга көп кирсеңиз, серепчиңизге жеке абал токенин бериши мүмкүн. Сиз кирген сайттар жеке абал токениңиз аркылуу сиздин бот эмес, адам экениңизди оңой аныктай алышат. Мындай токендер Интернеттеги купуялыгыңызды жакшыраак коргоп, ким экениңизди аныктаганга мүмкүнчүлүк бербейт.</translation> <translation id="2581165646603367611">Ушуну менен Chrome үчүн анча маанилүү болбогон кукилер, кэш жана сайттын башка нерселери тазаланат.</translation> <translation id="2587052924345400782">Жаңыраак версиясы бар</translation> -<translation id="2589302627584222634">Профилдин кулпусун түзүү</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Параметрлерди башкаруу үчүн аккаунтуңузга кириңиз</translation> <translation id="260403163289591229">Жазылгансыз</translation> @@ -472,7 +471,6 @@ <translation id="3479552764303398839">Азыр эмес</translation> <translation id="3493531032208478708">Сунушталган мазмун жөнүндө <ph name="BEGIN_LINK" />көбүрөөк билүү<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Жарымына чейин ачылган кирүү процессинин ылдыйкы экраны жарымына чейин ачылды.</translation> -<translation id="3498338220321963224">Кийинчерээк профилдин кулпусу өчүрүлсө, сакталган маалыматыңыз тазаланат.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Эң эскилери боюнча иргөө</translation> <translation id="3507132249039706973">Стандарттуу коргоо күйүк</translation> @@ -642,7 +640,6 @@ <translation id="4405636711880428279">Виртуалдык карта өчүрүлсүнбү?</translation> <translation id="4409271659088619928">Издөө каражатыңыз: <ph name="DSE" />. Издөө таржымалын өчүрүү үчүн бар болсо, издөө каражатындагы нускамаларды караңыз.</translation> <translation id="4415276339145661267">Google аккаунтунун параметрлерине өтүү</translation> -<translation id="4417111749295506837">Chrome'догу маалыматыңызды шайкештирүү жана унааңызда маалыматыңыздын коопсуздугун камсыздоо үчүн профилдин кулпусун түзүшүңүз керек. Унаага кирген сайын код же сырсөздү колдоносуз.</translation> <translation id="4425140285732600465">Баасына көз салуу. Кандайдыр бир сайтта баасы төмөндөсө, эскертүүлөрдү аласыз.</translation> <translation id="442518031075347249">Мындан ары Google Pay'де виртуалдык картаңызды колдоно албай каласыз. <ph name="BEGIN_LINK1" />Виртуалдык карталар жөнүндө кеңири маалымат алыңыз<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Жарнамаларды жекелештирүү</translation> @@ -954,7 +951,6 @@ <translation id="5964869237734432770">Сүрөттөмөлөрдү албоо</translation> <translation id="5966233851250124270">Chrome тандооңузду эстеп калат</translation> <translation id="5979084224081478209">Сырсөздөрдү текшерүү</translation> -<translation id="5985186846584605773">Унааңыз үчүн профилдин кулпусун түзүңүз</translation> <translation id="5995726099713306770">Барак кайрадан жүктөлүп алынсынбы?</translation> <translation id="6000066717592683814">Google калсын</translation> <translation id="6000203700195075278">Кайра жазылуу</translation> @@ -1023,7 +1019,6 @@ <translation id="6364438453358674297">Сунуш таржымалдан алынып салынсынбы?</translation> <translation id="6380100320871303656">Көбүнчө Chrome сизди баш багат деп болжолдогон барактарды алдын ала жүктөйт. Бул параметр менен көбүрөөк маалымат колдонулушу мүмкүн.</translation> <translation id="6382848304055775421">Экспорттолууда</translation> -<translation id="6391355955030242704">Chrome'догу маалыматыңызды шайкештирүү жана унааңызда маалыматыңыздын коопсуздугун камсыздоо үчүн коопсуздук параметрлеринен профилдин кулпусун түзүшүңүз керек. Унаага кирген сайын код же сырсөздү колдоносуз.</translation> <translation id="6394791151443660613">Издөө: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ШИЛТЕМЕ</translation> <translation id="6397616442223433927">Кайрадан онлайн</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb index 6ed7a41..908e5a4 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lo.xtb
@@ -294,7 +294,6 @@ ໂທເຄນສະຖານະສ່ວນຕົວຊ່ວຍປັບປຸງຄວາມເປັນສ່ວນຕົວຢູ່ເວັບ ແລະ ບໍ່ສາມາດນຳໃຊ້ເພື່ອລະບຸຕົວຕົນຂອງທ່ານໄດ້.</translation> <translation id="2581165646603367611">ນີ້ຈະລຶບລ້າງຄຸກກີ້, ແຄສ ແລະ ຂໍ້ມູນອື່ນຂອງເວັບໄຊທີ່ Chrome ຄິດວ່າບໍ່ສຳຄັນ.</translation> <translation id="2587052924345400782">ມີເວີຊັນທີ່ໃໝ່ກວ່າ</translation> -<translation id="2589302627584222634">ສ້າງການລັອກໂປຣໄຟລ໌</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">ເຂົ້າສູ່ລະບົບເພື່ອຈັດການການຕັ້ງຄ່າຂອງທ່ານ</translation> <translation id="260403163289591229">ກຳລັງຕິດຕາມ</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">ບໍ່ແມ່ນດຽວນີ້</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ສຶກສາເພີ່ມເຕີມ<ph name="END_LINK" /> ກ່ຽວກັບເນື້ອຫາທີ່ແນະນຳ</translation> <translation id="3495219333887281978">ເປີດຊີດລຸ່ມສຸດສຳລັບການເຂົ້າສູ່ລະບົບໃນຄວາມສູງເຄິ່ງໜຶ່ງແລ້ວ.</translation> -<translation id="3498338220321963224">ລະບົບຈະລຶບຂໍ້ມູນທີ່ບັນທຶກໄວ້ຂອງທ່ານອອກ ຫາກລຶບການລັອກໂປຣໄຟລ໌ອອກໃນພາຍຫຼັງ.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">ຈັດຮຽງຈາກເກົ່າສຸດ</translation> <translation id="3507132249039706973">ການປົກປ້ອງມາດຕະຖານເປີດຢູ່</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">ລຶບບັດສະເໝືອນຂອງທ່ານອອກບໍ?</translation> <translation id="4409271659088619928">ໂປຣແກຣມຊອກຫາຂອງທ່ານແມ່ນ <ph name="DSE" />. ກະລຸນາອ່ານຄຳແນະນຳສຳລັບການລຶບປະຫວັດການຊອກຫາ, ຖ້າມີ.</translation> <translation id="4415276339145661267">ຈັດການບັນຊີ Google ຂອງທ່ານ</translation> -<translation id="4417111749295506837">ເພື່ອຊິ້ງຂໍ້ມູນ Chrome ຂອງທ່ານ ແລະ ຮັກສາຂໍ້ມູນຂອງທ່ານໃນລົດໃຫ້ປອດໄພ, ທ່ານຕ້ອງສ້າງການລັອກໂປຣໄຟລ໌. ຈາກນັ້ນທ່ານຈະຕ້ອງໃຊ້ລະຫັດ ຫຼື ລະຫັດຜ່ານທຸກເທື່ອທີ່ທ່ານຂຶ້ນລົດ.</translation> <translation id="4425140285732600465">ກຳລັງຕິດຕາມລາຄາ. ຮັບການແຈ້ງເຕືອນຫາກມີການຫຼຸດລາຄາຢູ່ເວັບໄຊໃດກໍຕາມ.</translation> <translation id="442518031075347249">ທ່ານຈະບໍ່ສາມາດໃຊ້ບັດສະເໝືອນຂອງທ່ານກັບ Google Pay ໄດ້ອີກຕໍ່ໄປ. <ph name="BEGIN_LINK1" />ສຶກສາເພີ່ມເຕີມກ່ຽວກັບບັດສະເໝືອນ<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ການປັບແຕ່ງໂຄສະນາເປັນແບບສ່ວນຕົວ</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">ຢຸດຄຳອະທິບາຍຮູບ</translation> <translation id="5966233851250124270">Chrome ຈະຈື່ຕົວເລືອກຂອງທ່ານ</translation> <translation id="5979084224081478209">ກວດເບິ່ງລະຫັດຜ່ານ</translation> -<translation id="5985186846584605773">ສ້າງການລັອກໂປຣໄຟລ໌ສຳລັບລົດຂອງທ່ານ</translation> <translation id="5995726099713306770">ດາວໂຫຼດໜ້າອີກເທື່ອໜຶ່ງບໍ່?</translation> <translation id="6000066717592683814">ດຳເນີນການໃຊ້ Google</translation> <translation id="6000203700195075278">ຕິດຕາມຄືນໃໝ່</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">ເອົາການແນະນໍາອອກຈາກປະຫວັດບໍ?</translation> <translation id="6380100320871303656">ໂຫຼດໜ້າທີ່ Chrome ຄິດວ່າທ່ານໜ້າຈະເຂົ້າເບິ່ງໄວ້ກ່ອນລ່ວງໜ້າໃຫ້ຖີ່ຂຶ້ນ. ການຕັ້ງຄ່ານີ້ອາດສົ່ງຜົນໃຫ້ມີການໃຊ້ອິນເຕີເນັດຫຼາຍຂຶ້ນ.</translation> <translation id="6382848304055775421">ກຳລັງສົ່ງອອກ</translation> -<translation id="6391355955030242704">ເພື່ອຊິ້ງຂໍ້ມູນ Chrome ຂອງທ່ານ ແລະ ຮັກສາຂໍ້ມູນຂອງທ່ານໃນລົດໃຫ້ປອດໄພ, ທ່ານຕ້ອງສ້າງການລັອກໂປຣໄຟລ໌ໃນການຕັ້ງຄ່າຄວາມປອດໄພຂອງທ່ານ. ຈາກນັ້ນທ່ານຈະຕ້ອງໃຊ້ລະຫັດ ຫຼື ລະຫັດຜ່ານທຸກເທື່ອທີ່ທ່ານຂຶ້ນລົດ.</translation> <translation id="6394791151443660613">ຊອກຫາ: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ລິ້ງ</translation> <translation id="6397616442223433927">ກັບມາອອນລາຍ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb index e036a4d..1b511cd 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_lt.xtb
@@ -294,7 +294,6 @@ Privatūs prieigos raktai pagerina privatumą žiniatinklyje ir negali būti naudojami jūsų tapatybei atskleisti.</translation> <translation id="2581165646603367611">Bus išvalyti slapukai, talpykla ir kiti svetainių duomenys, kurių „Chrome“ nelaiko svarbiais.</translation> <translation id="2587052924345400782">Pasiekiama naujesnė versija</translation> -<translation id="2589302627584222634">Kurti profilio užraktą</translation> <translation id="2593272815202181319">Lygiaplotis</translation> <translation id="2603212228005142861">Prisijunkite, kad galėtumėte tvarkyti nuostatas</translation> <translation id="260403163289591229">Stebima</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ne dabar</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Sužinokite daugiau<ph name="END_LINK" /> apie siūlomą turinį</translation> <translation id="3495219333887281978">Prisijungimo apatinis lapas atidarytas per pusę ekrano aukščio.</translation> -<translation id="3498338220321963224">Išsaugoti duomenys bus ištrinti, jei profilio užraktas vėliau bus pašalintas.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Rūšiuoti nuo seniausio</translation> <translation id="3507132249039706973">Įprasta apsauga įjungta</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Pašalinti virtualiąją kortelę?</translation> <translation id="4409271659088619928">Jūsų paieškos variklis yra „<ph name="DSE" />“. Peržiūrėkite jo instrukcijas, kaip ištrinti paieškos istoriją (jei taikoma).</translation> <translation id="4415276339145661267">„Google“ paskyros tvarkymas</translation> -<translation id="4417111749295506837">Jei norite sinchronizuoti „Chrome“ informaciją ir apsaugoti duomenis automobilyje, turite sukurti profilio užraktą. Kiekvieną kartą, kai įsėsite į automobilį, turėsite naudoti kodą arba slaptažodį.</translation> <translation id="4425140285732600465">Kaina stebima. Gaukite įspėjimus, jei kaina bus sumažinta bet kurioje svetainėje.</translation> <translation id="442518031075347249">Nebegalėsite naudoti virtualiosios kortelės su „Google Pay“. <ph name="BEGIN_LINK1" />Sužinokite daugiau apie virtualiąsias korteles<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Skelbimų suasmeninimas</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Stabdyti vaizdų aprašus</translation> <translation id="5966233851250124270">„Chrome“ prisimins jūsų pasirinkimą</translation> <translation id="5979084224081478209">Patikrinti slaptažodžius</translation> -<translation id="5985186846584605773">Automobilio profilio užrakto kūrimas</translation> <translation id="5995726099713306770">Atsisiųsti puslapį dar kartą?</translation> <translation id="6000066717592683814">Palikti „Google“</translation> <translation id="6000203700195075278">Stebėti iš naujo</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Pašalinti pasiūlymą iš istorijos?</translation> <translation id="6380100320871303656">Dažniau iš anksto įkeliami puslapiai, kuriuose, „Chrome“ manymu, galėtumėte apsilankyti. Dėl šio nustatymo gali būti naudojama daugiau duomenų.</translation> <translation id="6382848304055775421">Eksportuojama</translation> -<translation id="6391355955030242704">Jei norite sinchronizuoti „Chrome“ informaciją ir apsaugoti duomenis automobilyje, turite sukurti profilio užraktą saugos nustatymuose. Kiekvieną kartą, kai įsėsite į automobilį, turėsite naudoti kodą arba slaptažodį.</translation> <translation id="6394791151443660613">Paieška: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">NUORODA</translation> <translation id="6397616442223433927">Vėl prisijungta</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 030b7e1..50519cc6 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
@@ -294,7 +294,6 @@ Privātā stāvokļa pilnvaras uzlabo konfidencialitāti tīmeklī. Tās nevar izmantot, lai uzzinātu, kas jūs esat.</translation> <translation id="2581165646603367611">Tādējādi tiks dzēsti sīkfaili, kešatmiņa un citi vietņu dati, kas pārlūkā Chrome netiek uzskatīti par svarīgiem.</translation> <translation id="2587052924345400782">Pieejama jaunāka versija</translation> -<translation id="2589302627584222634">Iestatīt profila bloķēšanu</translation> <translation id="2593272815202181319">Vienplatuma</translation> <translation id="2603212228005142861">Pierakstieties, lai pārvaldītu preferences</translation> <translation id="260403163289591229">Sekojat</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Vēlāk</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Uzziniet vairāk<ph name="END_LINK" /> par ieteikto saturu.</translation> <translation id="3495219333887281978">Pierakstīšanās ekrāna apakšdaļas lapa ir atvērta pusekrāna augstumā.</translation> -<translation id="3498338220321963224">Ja profila bloķēšana vēlāk tiks noņemta, jūsu saglabātie dati tiks dzēsti.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Kārtot pēc vecākās</translation> <translation id="3507132249039706973">Ir ieslēgta standarta aizsardzība.</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Vai noņemt virtuālo karti?</translation> <translation id="4409271659088619928">Jūsu meklētājprogramma ir <ph name="DSE" />. Skatiet tās norādījumus par meklēšanas vēstures dzēšanu, ja šāda iespēja ir pieejama.</translation> <translation id="4415276339145661267">Google konta pārvaldība</translation> -<translation id="4417111749295506837">Lai pārlūkā Chrome sinhronizētu savu informāciju un gādātu par datu drošību, ir jāiestata profila bloķēšana. Ikreiz, kad iekāpsiet automašīnā, jūs izmantosiet kodu vai paroli.</translation> <translation id="4425140285732600465">Notiek cenas izsekošana. Saņemiet paziņojumus, ja kādā vietnē tiek konstatēts cenas kritums.</translation> <translation id="442518031075347249">Vairs nevarēsiet izmantot virtuālo karti pakalpojumā Google Pay. <ph name="BEGIN_LINK1" />Uzziniet vairāk par virtuālajām kartēm<ph name="END_LINK1" />.</translation> <translation id="4428065317363009941">Reklāmu personalizēšana</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Atspējot attēlu aprakstus</translation> <translation id="5966233851250124270">Pārlūkā Chrome tiks saglabāta jūsu izvēle.</translation> <translation id="5979084224081478209">Pārbaudīt paroles</translation> -<translation id="5985186846584605773">Automašīnas profila bloķēšanas iestatīšana</translation> <translation id="5995726099713306770">Vai vēlaties vēlreiz lejupielādēt lapu?</translation> <translation id="6000066717592683814">Arī turpmāk izmantot Google</translation> <translation id="6000203700195075278">Atsākt sekošanu</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Vai noņemt ieteikumu no vēstures?</translation> <translation id="6380100320871303656">Biežāk tiek iepriekš ielādētas lapas, ko jūs varētu apmeklēt saskaņā ar Chrome rīcībā esošajiem datiem. Šī iestatījuma rezultātā var palielināties datu lietojums.</translation> <translation id="6382848304055775421">Notiek eksportēšana</translation> -<translation id="6391355955030242704">Lai pārlūkā Chrome sinhronizētu savu informāciju un gādātu par datu drošību, drošības iestatījumos ir jāiestata profila bloķēšana. Ikreiz, kad iekāpsiet automašīnā, jūs izmantosiet kodu vai paroli.</translation> <translation id="6394791151443660613">Meklēt: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">SAITE</translation> <translation id="6397616442223433927">Esat tiešsaistē</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb index 876834a5..f8bcdba0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mk.xtb
@@ -294,7 +294,6 @@ Токените за автентичност ја подобруваат приватноста на интернет и не може да се користат за ваша идентификација.</translation> <translation id="2581165646603367611">Ова ќе ги избрише колачињата, кешот и другите податоци од сајтовите за коишто Chrome смета дека не се важни.</translation> <translation id="2587052924345400782">Достапна е понова верзија</translation> -<translation id="2589302627584222634">Создајте заклучување на профилот</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Најавете се за да управувате со вашите поставки</translation> <translation id="260403163289591229">Се следи</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Не сега</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Дознајте повеќе<ph name="END_LINK" /> за предложените содржини</translation> <translation id="3495219333887281978">Долниот лист за најавување е отворен на половина екран.</translation> -<translation id="3498338220321963224">Вашите зачувани податоци ќе се избришат ако се отстрани заклучувањето на профилот подоцна.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Подредување по најстари</translation> <translation id="3507132249039706973">Вклучена е „Стандардната заштита“</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Дали да се отстрани виртуелната картичка?</translation> <translation id="4409271659088619928">Вашиот пребарувач е <ph name="DSE" />. Погледнете го неговото упатство за бришење на историјата на пребарување ако е применливо.</translation> <translation id="4415276339145661267">Управувајте со сметката на Google</translation> -<translation id="4417111749295506837">За синхронизација на вашите податоци на Chrome и заштита на податоците во автомобилот, мора да создадете заклучување на профилот. Ќе користите код или лозинка секогаш кога ќе влегувате во автомобилот.</translation> <translation id="4425140285732600465">Цената се следи. Добивајте предупредувања ако цената се намали на кој било сајт.</translation> <translation id="442518031075347249">Веќе нема да можете да ја користите вашата виртуелна картичка со Google Pay. <ph name="BEGIN_LINK1" />Дознајте повеќе за виртуелните картички<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Персонализирање на рекламите</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Сопри описи на слики</translation> <translation id="5966233851250124270">Chrome ќе го запомни вашиот избор</translation> <translation id="5979084224081478209">Провери ги лозинките</translation> -<translation id="5985186846584605773">Создавање заклучување на профилот за вашиот автомобил</translation> <translation id="5995726099713306770">Да се преземе страницата повторно?</translation> <translation id="6000066717592683814">Задржи го Google</translation> <translation id="6000203700195075278">Следете пак</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Да се отстрани предлогот од историјата?</translation> <translation id="6380100320871303656">Најчесто однапред ги вчитува страниците што Chrome мисли дека ќе ги посетите. Поставкава може да доведе до зголемен сообраќај на податоци.</translation> <translation id="6382848304055775421">Се извезува</translation> -<translation id="6391355955030242704">За синхронизација на вашите податоци на Chrome и заштита на податоците во автомобилот, мора да создадете заклучување на профилот во вашите поставки за безбедност. Ќе користите код или лозинка секогаш кога ќе влегувате во автомобилот.</translation> <translation id="6394791151443660613">Пребарајте: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ЛИНК</translation> <translation id="6397616442223433927">Повторно сте онлајн</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb index 15fad955..1b66bf1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ml.xtb
@@ -295,7 +295,6 @@ പ്രൈവറ്റ് സ്റ്റേറ്റ് ടോക്കണുകൾ വെബിലെ സ്വകാര്യത വർദ്ധിപ്പിക്കുന്നു, നിങ്ങൾ ആരാണെന്ന് തിരിച്ചറിയാൻ അവ ഉപയോഗിക്കാനാകില്ല.</translation> <translation id="2581165646603367611">ഇത്, Chrome പ്രധാനമായി കണക്കാക്കാത്ത സൈറ്റുകളുടെ കുക്കികളും കാഷെയും മറ്റ് വിവരങ്ങളും മായ്ക്കും.</translation> <translation id="2587052924345400782">ഏറ്റവും പുതിയ പതിപ്പ് ലഭ്യമാണ്</translation> -<translation id="2589302627584222634">പ്രൊഫൈല് ലോക്ക് സൃഷ്ടിക്കുക</translation> <translation id="2593272815202181319">മോണോസ്പെയ്സ്</translation> <translation id="2603212228005142861">മുൻഗണനകൾ മാനേജ് ചെയ്യാൻ സൈൻ ഇൻ ചെയ്യുക</translation> <translation id="260403163289591229">ഫോളോ ചെയ്യുന്നത്</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ഇപ്പോഴല്ല</translation> <translation id="3493531032208478708">നിർദ്ദേശിച്ച ഉള്ളടക്കത്തെക്കുറിച്ച് <ph name="BEGIN_LINK" />കൂടുതലറിയുക<ph name="END_LINK" /></translation> <translation id="3495219333887281978">സൈൻ ഇൻ ചെയ്യാനുള്ള ബോട്ടം ഷീറ്റ് പകുതി ഉയരത്തിൽ തുറന്നു.</translation> -<translation id="3498338220321963224">പ്രൊഫൈൽ ലോക്ക് പിന്നീട് നീക്കം ചെയ്താൽ, നിങ്ങളുടെ സംരക്ഷിച്ച ഡാറ്റ മായ്ക്കപ്പെടും.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">ഏറ്റവും പഴയത് ആദ്യം</translation> <translation id="3507132249039706973">സാധാരണ പരിരക്ഷ ഓണാക്കിയിരിക്കുന്നു</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">നിങ്ങളുടെ വെർച്വൽ കാർഡ് നീക്കം ചെയ്യണോ?</translation> <translation id="4409271659088619928"><ph name="DSE" /> ആണ് നിങ്ങളുടെ തിരയൽ യന്ത്രം. ബാധകമെങ്കിൽ, നിങ്ങളുടെ തിരയൽ ചരിത്രം ഇല്ലാതാക്കാനുള്ള അതിലെ നിർദ്ദേശങ്ങൾ കാണുക.</translation> <translation id="4415276339145661267">നിങ്ങളുടെ Google Account മാനേജ് ചെയ്യുക</translation> -<translation id="4417111749295506837">നിങ്ങളുടെ Chrome വിവരങ്ങൾ സമന്വയിപ്പിക്കാനും കാറിൽ ഡാറ്റ സുരക്ഷിതമായി സൂക്ഷിക്കാനും, ഒരു പ്രൊഫൈൽ ലോക്ക് സൃഷ്ടിക്കണം. നിങ്ങൾ കാറിൽ പ്രവേശിക്കുമ്പോഴെല്ലാം ഒരു കോഡോ പാസ്വേഡോ ഉപയോഗിക്കും.</translation> <translation id="4425140285732600465">നിരക്ക് ട്രാക്ക് ചെയ്യുന്നു. ഏതെങ്കിലും സൈറ്റിൽ വിലക്കുറവ് ഉണ്ടെങ്കിൽ അറിയിപ്പുകൾ നേടുക.</translation> <translation id="442518031075347249">Google Pay-യുടെ സഹായത്തോടെ നിങ്ങൾക്ക് ഇനി വെർച്വൽ കാർഡ് ഉപയോഗിക്കാനാകില്ല. <ph name="BEGIN_LINK1" />വെർച്വൽ കാർഡുകളെ കുറിച്ച് കൂടുതലറിയുക<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">പരസ്യം വ്യക്തിപരമാക്കൽ</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">ചിത്ര വിവരണങ്ങൾ നിർത്തുക</translation> <translation id="5966233851250124270">Chrome നിങ്ങളുടെ ചോയ്സ് ഓർമ്മിക്കും</translation> <translation id="5979084224081478209">പാസ്വേഡ് പരിശോധിക്കൂ</translation> -<translation id="5985186846584605773">നിങ്ങളുടെ കാറിനായി ഒരു പ്രൊഫൈൽ ലോക്ക് സൃഷ്ടിക്കുക</translation> <translation id="5995726099713306770">പേജ് വീണ്ടും ഡൗൺലോഡ് ചെയ്യണോ?</translation> <translation id="6000066717592683814">Google ഉപയോഗിക്കുക</translation> <translation id="6000203700195075278">വീണ്ടും ഫോളോ ചെയ്യുക</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">ചരിത്രത്തിൽ നിന്ന് നിർദ്ദേശം നീക്കംചെയ്യണോ?</translation> <translation id="6380100320871303656">നിങ്ങൾ സന്ദർശിക്കാൻ സാധ്യതയുണ്ടെന്ന് Chrome കരുതുന്ന പേജുകൾ ഇടയ്ക്കിടെ മുൻകൂട്ടി ലോഡ് ചെയ്യുന്നു. ഈ ക്രമീകരണം ഉയർന്ന ഡാറ്റാ ഉപയോഗത്തിന് കാരണമായേക്കാം.</translation> <translation id="6382848304055775421">എക്സ്പോർട്ട് ചെയ്യുന്നു</translation> -<translation id="6391355955030242704">നിങ്ങളുടെ Chrome വിവരങ്ങൾ സമന്വയിപ്പിക്കാനും കാറിൽ ഡാറ്റ സുരക്ഷിതമായി സൂക്ഷിക്കാനും, സുരക്ഷാ ക്രമീകരണത്തിൽ ഒരു പ്രൊഫൈൽ ലോക്ക് സൃഷ്ടിക്കണം. നിങ്ങൾ കാറിൽ പ്രവേശിക്കുമ്പോഴെല്ലാം ഒരു കോഡോ പാസ്വേഡോ ഉപയോഗിക്കും.</translation> <translation id="6394791151443660613">തിരയുക: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ലിങ്ക്</translation> <translation id="6397616442223433927">ഓൺലൈനിൽ തിരിച്ചെത്തി</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb index d2d4833..9105661 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mn.xtb
@@ -294,7 +294,6 @@ Хувийн төлөвийн токен нь веб дээрх нууцлалыг сайжруулах бөгөөд үүнийг таныг хэн болохыг олж мэдэхэд ашиглах боломжгүй.</translation> <translation id="2581165646603367611">Энэ нь күүки, кэш болон Chrome-н чухалд тооцдоггүй бусад сайтын өгөгдлийг устгах болно.</translation> <translation id="2587052924345400782">Сүүлийн үеийн хувилбарыг ашиглах боломжтой</translation> -<translation id="2589302627584222634">Профайлын түгжээ үүсгэх</translation> <translation id="2593272815202181319">Моноспэйс</translation> <translation id="2603212228005142861">Сонголтоо удирдахын тулд нэвтрээрэй</translation> <translation id="260403163289591229">Дагаж буй</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Одоо биш</translation> <translation id="3493531032208478708">Санал болгосон агуулгын талаар <ph name="BEGIN_LINK" />дэлгэрэнгүй үзэх<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Нэвтрэх доод хүснэгтийг тал хэмжээгээр нээсэн.</translation> -<translation id="3498338220321963224">Хэрэв профайлын түгжээг дараа нь хасвал таны хадгалсан өгөгдлийг устгана.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Хуучнаар нь эрэмбэлэх</translation> <translation id="3507132249039706973">Стандарт хамгаалалт асаалттай байна</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Виртуал картаа хасах уу?</translation> <translation id="4409271659088619928">Таны хайлтын систем <ph name="DSE" /> байна. Хэрэв боломжтой бол хайлтын түүхээ устгахын тулд үүний зааварчилгааг харна уу.</translation> <translation id="4415276339145661267">Google Бүртгэлээ удирдах</translation> -<translation id="4417111749295506837">Chrome-н мэдээллээ синк хийж, өгөгдлөө автомашиндаа аюулгүй байлгахын тулд та профайлын түгжээ үүсгэх ёстой. Та автомашиндаа суух бүрдээ код эсвэл нууц үг ашиглана.</translation> <translation id="4425140285732600465">Үнийг хянаж байна. Аль нэг сайт дээр үнэ буурсан тохиолдолд сэрэмжлүүлэг аваарай.</translation> <translation id="442518031075347249">Та цаашид виртуал картаа Google Pay-тэй ашиглах боломжгүй болно. <ph name="BEGIN_LINK1" />Виртуал картын талаар нэмэлт мэдээлэл авах<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Сонирхсон зарын тохируулга</translation> @@ -961,7 +958,6 @@ <translation id="5964869237734432770">Зургийн тайлбарыг зогсоох</translation> <translation id="5966233851250124270">Chrome таны сонголтыг санана</translation> <translation id="5979084224081478209">Нууц үгийг шалгах</translation> -<translation id="5985186846584605773">Автомашиндаа профайлын түгжээ үүсгэнэ үү</translation> <translation id="5995726099713306770">Хуудсыг дахин татах уу?</translation> <translation id="6000066717592683814">Google хэвээр байлгах</translation> <translation id="6000203700195075278">Дахин дагах</translation> @@ -1030,7 +1026,6 @@ <translation id="6364438453358674297">Түүхээс зөвлөмж устгах уу?</translation> <translation id="6380100320871303656">Chrome таныг зочилж магадгүй гэж бодсон хуудаснуудыг илүү тогтмол урьдчилан ачаална. Энэ тохиргоо нь дата ашиглалтыг нэмэгдүүлж магадгүй.</translation> <translation id="6382848304055775421">Экспортолж байна</translation> -<translation id="6391355955030242704">Chrome-н мэдээллээ синк хийж, өгөгдлөө автомашиндаа аюулгүй байлгахын тулд та аюулгүй байдлын тохиргоондоо профайлын түгжээ үүсгэх ёстой. Та автомашиндаа суух бүрдээ код эсвэл нууц үг ашиглана.</translation> <translation id="6394791151443660613">Хайх: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ХОЛБООС</translation> <translation id="6397616442223433927">Буцаад онлайн боллоо</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb index 15beeccf..7151a1c1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_mr.xtb
@@ -294,7 +294,6 @@ खाजगी स्टेट टोकन वेबवरील गोपनीयतेमध्ये सुधारणा करतात आणि ती तुमची ओळख उघड करण्यासाठी वापरली जाऊ शकत नाहीत.</translation> <translation id="2581165646603367611">हे सर्व कुकी, कॅशे आणि साइटचा अन्य डेटा साफ करेल जो Chrome ला महत्त्वाचा वाटत नाही.</translation> <translation id="2587052924345400782">अधिक नवीन आवृत्ती उपलब्ध आहे</translation> -<translation id="2589302627584222634">प्रोफाइल लॉक तयार करा</translation> <translation id="2593272815202181319">मोनोस्पेस</translation> <translation id="2603212228005142861">तुमची प्राधान्ये व्यवस्थापित करण्यासाठी साइन इन करा</translation> <translation id="260403163289591229">फॉलो करत आहे</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">सध्या नाही</translation> <translation id="3493531032208478708">सूचित केलेल्या आशयविषयी <ph name="BEGIN_LINK" />अधिक जाणून घ्या<ph name="END_LINK" /></translation> <translation id="3495219333887281978">अर्ध्या उंचीवर उघडलेल्या तळाशी असलेल्या शीटमध्ये साइन इन करा.</translation> -<translation id="3498338220321963224">प्रोफाइल लॉक हे नंतर काढून टाकल्यास, तुमचा सेव्ह केलेला डेटा मिटवला जाईल.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">जुन्यानुसार क्रमाने लावा</translation> <translation id="3507132249039706973">मानक संरक्षण सुरू आहे</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">तुमचे व्हर्च्युअल कार्ड काढून टाकायचे का?</translation> <translation id="4409271659088619928"><ph name="DSE" /> हे तुमचे शोध इंजीन आहे. लागू असल्यास, तुमचा शोध इतिहास हटवण्यासाठी, त्याच्या सूचना पहा.</translation> <translation id="4415276339145661267">तुमचे Google खाते व्यवस्थापित करा</translation> -<translation id="4417111749295506837">तुमची Chrome शी संबंधित माहिती सिंक करण्यासाठी आणि कारमध्ये तुमचा डेटा सुरक्षित ठेवण्यासाठी, तुम्ही प्रोफाइल लॉक तयार करणे आवश्यक आहे. तुम्ही प्रत्येकवेळी कारमध्ये प्रवेश कराल, तेव्हा कोड किंवा पासवर्ड वापराल.</translation> <translation id="4425140285732600465">किमतीचा माग ठेवत आहे. कोणत्याही साइटवर किंमत कमी झाल्यास सूचना मिळवा.</translation> <translation id="442518031075347249">तुम्ही यापुढे तुमचे व्हर्च्युअल कार्ड Google Pay सोबत वापरू शकणार नाही. <ph name="BEGIN_LINK1" />व्हर्च्युअल कार्डबद्दल अधिक जाणून घ्या<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">जाहिरात पर्सनलायझेशन</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">इमेजची वर्णने थांबवा</translation> <translation id="5966233851250124270">Chrome तुमची निवड लक्षात ठेवेल</translation> <translation id="5979084224081478209">पासवर्ड तपासा</translation> -<translation id="5985186846584605773">तुमच्या कारसाठी प्रोफाइल लॉक तयार करा</translation> <translation id="5995726099713306770">पेज पुन्हा डाउनलोड करायचे आहे का?</translation> <translation id="6000066717592683814">Google ठेवा</translation> <translation id="6000203700195075278">पुन्हा फॉलो करा</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">इतिहासातून सूचना काढून टाकायची?</translation> <translation id="6380100320871303656">Chrome ला तुम्ही भेट देण्याची शक्यता आहे असे वाटत असलेली पेज ते अधिक वारंवार प्रीलोड करते. या सेटिंगमुळे डेटा वापर वाढू शकतो.</translation> <translation id="6382848304055775421">एक्सपोर्ट करत आहे</translation> -<translation id="6391355955030242704">तुमची Chrome शी संबंधित माहिती सिंक करण्यासाठी आणि कारमध्ये तुमचा डेटा सुरक्षित ठेवण्यासाठी, तुम्ही तुमच्या सुरक्षा सेटिंग्जमध्ये प्रोफाइल लॉक तयार करणे आवश्यक आहे. तुम्ही प्रत्येकवेळी कारमध्ये प्रवेश कराल, तेव्हा कोड किंवा पासवर्ड वापराल.</translation> <translation id="6394791151443660613">शोधा: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">लिंक</translation> <translation id="6397616442223433927">पुन्हा ऑनलाइन</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb index b78219b..7a3310f 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ms.xtb
@@ -295,7 +295,6 @@ Token keadaan sulit meningkatkan privasi pada web dan tidak boleh digunakan untuk mengetahui identiti anda.</translation> <translation id="2581165646603367611">Tindakan ini akan menghapuskan kuki, cache dan data tapak yang lain yang Chrome anggap tidak penting.</translation> <translation id="2587052924345400782">Versi lebih baharu tersedia</translation> -<translation id="2589302627584222634">Buat kunci profil</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Log masuk untuk mengurus keutamaan anda</translation> <translation id="260403163289591229">Mengikuti</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Bukan sekarang</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ketahui lebih lanjut<ph name="END_LINK" /> tentang kandungan yang disyorkan</translation> <translation id="3495219333887281978">Helaian bawah log masuk dibuka pada ketinggian separuh.</translation> -<translation id="3498338220321963224">Data anda yang disimpan akan dipadamkan jika kunci profil dialih keluar kemudian.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Isih mengikut yang paling lama</translation> <translation id="3507132249039706973">Perlindungan Standard dihidupkan</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Alih keluar kad maya anda?</translation> <translation id="4409271659088619928">Enjin carian anda ialah <ph name="DSE" />. Lihat arahan enjin carian itu untuk memadamkan sejarah carian anda, jika berkenaan.</translation> <translation id="4415276339145661267">Urus Google Account anda</translation> -<translation id="4417111749295506837">Untuk menyegerakkan maklumat Chrome anda dan melindungi data anda di dalam kereta, anda perlu membuat kunci profil. Anda akan menggunakan kod dan kata laluan setiap kali anda memasuki kereta.</translation> <translation id="4425140285732600465">Menjejaki harga. Dapatkan makluman sekiranya harga jatuh pada mana-mana laman.</translation> <translation id="442518031075347249">Anda tidak dapat menggunakan kad maya anda dengan Google Pay lagi. <ph name="BEGIN_LINK1" />Ketahui lebih lanjut tentang kad maya<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Pemperibadian iklan</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Hentikan perihalan imej</translation> <translation id="5966233851250124270">Chrome akan mengingati pilihan anda</translation> <translation id="5979084224081478209">Semak kata laluan</translation> -<translation id="5985186846584605773">Buat kunci profil untuk kereta anda</translation> <translation id="5995726099713306770">Muat turun halaman sekali lagi?</translation> <translation id="6000066717592683814">Kekalkan Google</translation> <translation id="6000203700195075278">Ikuti semula</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Alih keluar cadangan daripada sejarah?</translation> <translation id="6380100320871303656">Lebih kerap mempramuat halaman yang diramal oleh Chrome akan anda lawati. Tetapan ini boleh menyebabkan penggunaan data meningkat.</translation> <translation id="6382848304055775421">Mengeksport</translation> -<translation id="6391355955030242704">Untuk menyegerakkan maklumat Chrome anda dan melindungi data anda di dalam kereta, anda perlu membuat kunci profil dalam tetapan keselamatan anda. Anda akan menggunakan kod dan kata laluan setiap kali anda memasuki kereta.</translation> <translation id="6394791151443660613">Carian: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">PAUTAN</translation> <translation id="6397616442223433927">Kembali dalam talian</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb index de75bdf9..61abfb8 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_my.xtb
@@ -295,7 +295,6 @@ သီးသန့်အခြေအနေ တိုကင်များသည် ဝဘ်ပေါ်တွင် ကိုယ်ရေးအချက်အလက်လုံခြုံမှု ပိုကောင်းမွန်စေပြီး သင်မည်သူဖြစ်ကြောင်း ရှာဖွေရာတွင် အသုံးမပြုနိုင်ပါ။</translation> <translation id="2581165646603367611">၎င်းသည် Chrome က အရေးကြီးသည်ဟု မယူဆသည့် ကွတ်ကီးများ၊ ယာယီမှတ်ဉာဏ်များနှင့် ဆိုက်များ၏ အခြားဒေတာများကို ရှင်းလင်းလိုက်ပါမည်။</translation> <translation id="2587052924345400782">ပိုသစ်သော ဗားရှင်း ရှိပါသည်</translation> -<translation id="2589302627584222634">ပရိုဖိုင်လော့ခ် ပြုလုပ်မည်</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">သင့်သတ်မှတ်ချက်များကို စီမံရန် လက်မှတ်ထိုးဝင်ပါ</translation> <translation id="260403163289591229">လိုက်ကြည့်နေသည်များ</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ယခု မလို</translation> <translation id="3493531032208478708">အကြံပြုထားသည့် အကြောင်းအရာအကြောင်း <ph name="BEGIN_LINK" />ပိုမိုလေ့လာရန်<ph name="END_LINK" /></translation> <translation id="3495219333887281978">လက်မှတ်ထိုးဝင်ခြင်းဆိုင်ရာ အောက်ခြေအပိုဆောင်း စာမျက်နှာကို မြင်ကွင်းတစ်ဝက် ဖွင့်ထားသည်။</translation> -<translation id="3498338220321963224">ပရိုဖိုင်လော့ခ်ချခြင်းကို နောက်ပိုင်းဖယ်ရှားပါက သင်၏ သိမ်းထားသော ဒေတာကိုဖျက်ပါမည်။</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">အဟောင်းဆုံးဖြင့် စီရန်</translation> <translation id="3507132249039706973">'ပုံမှန် ကာကွယ်မှု' ကို ဖွင့်ထားသည်</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">သင်၏ပကတိအသွင်ကတ် ဖယ်ရှားမလား။</translation> <translation id="4409271659088619928">သင်၏ရှာဖွေရေး အင်ဂျင်သည် <ph name="DSE" /> ဖြစ်သည်။ သက်ဆိုင်မှုရှိပါက သင်၏ရှာဖွေမှတ်တမ်းကို ဖျက်ရန်အတွက် ၎င်း၏ ညွှန်ကြားချက်များကို ကြည့်ပါ။</translation> <translation id="4415276339145661267">သင့် Google Account ကို စီမံခြင်း</translation> -<translation id="4417111749295506837">Chrome အချက်အလက်များကို စင့်ခ်လုပ်ပြီး သင့်ဒေတာကို ကားထဲတွင် လုံခြုံအောင်ထားရန် ပရိုဖိုင်လော့ခ်တစ်ခု ပြုလုပ်ရမည်။ ကားထဲသို့ဝင်တိုင်း ကုဒ် (သို့) စကားဝှက်ကို အသုံးပြုရမည်။</translation> <translation id="4425140285732600465">ဈေးနှုန်း စောင့်ကြည့်နေသည်။ ဝဘ်ဆိုက်တစ်ခုခုတွင် ဈေးကျသွားပါက သတိပေးချက်များ ရယူနိုင်သည်။</translation> <translation id="442518031075347249">Google Pay တွင် သင်၏ပကတိအသွင်ကတ်ကို သုံး၍ရတော့မည်မဟုတ်ပါ။ <ph name="BEGIN_LINK1" />ပကတိအသွင်ကတ်များအကြောင်း ပိုမိုလေ့လာရန်<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ကြော်ငြာ စိတ်ကြိုက်သတ်မှတ်ခြင်း</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">ပုံရှင်းလင်းချက်များ ရပ်ရန်</translation> <translation id="5966233851250124270">သင့်ရွေးချယ်မှုကို Chrome က မှတ်ထားပါမည်</translation> <translation id="5979084224081478209">စကားဝှက်များ စစ်ဆေးရန်</translation> -<translation id="5985186846584605773">သင့်ကားအတွက် ပရိုဖိုင်လော့ခ် ပြုလုပ်ပါ</translation> <translation id="5995726099713306770">စာမျက်နှာကို ထပ်မံဒေါင်းလုဒ်လုပ်လိုပါသလား။</translation> <translation id="6000066717592683814">Google ကို ဆက်သုံးရန်</translation> <translation id="6000203700195075278">ပြန်လည်လိုက်ကြည့်ရန်</translation> @@ -1033,7 +1029,6 @@ <translation id="6364438453358674297">အကြံပေးချက်ကို မှတ်တမ်း ထဲမှ ဖယ်ရှားမလား?</translation> <translation id="6380100320871303656">Chrome က သင်ဝင်ကြည့်လိုသည်ဟု ထင်သည့် စာမျက်နှာများကို မကြာခဏ ကြိုဖွင့်ပေးသည်။ ဤဆက်တင်သည် ဒေတာအသုံးပြုမှု များသွားစေနိုင်ပါသည်။</translation> <translation id="6382848304055775421">ထုတ်ယူနေသည်</translation> -<translation id="6391355955030242704">Chrome အချက်အလက်များကို စင့်ခ်လုပ်ပြီး သင့်ဒေတာကို ကားထဲတွင် လုံခြုံအောင်ထားရန် လုံခြုံရေးဆက်တင်များတွင် ပရိုဖိုင်လော့ခ်တစ်ခု ပြုလုပ်ရမည်။ ကားထဲသို့ဝင်တိုင်း ကုဒ် (သို့) စကားဝှက်ကို အသုံးပြုရမည်။</translation> <translation id="6394791151443660613">ရှာဖွေရန်- <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">လင့်ခ်</translation> <translation id="6397616442223433927">အွန်လိုင်းပြန်ရပြီ</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb index 839b0507..4cac0e1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ne.xtb
@@ -295,7 +295,6 @@ प्राइभेट स्टेट टोकनहरूले वेबमा गोपनीयताको अवस्था सुधार्छन् र तपाईंको पहिचान पत्ता लगाउने प्रयोजनका लागि ती टोकन प्रयोग गर्न पाइँदैन।</translation> <translation id="2581165646603367611">यसले कुकी, क्यास र साइटहरूको Chrome लाई महत्वपूर्ण नलाग्ने अन्य डेटा हटाउने छ।</translation> <translation id="2587052924345400782">नयाँ संस्करण उपलब्ध छ</translation> -<translation id="2589302627584222634">प्रोफाइल लक बनाउनुहोस्</translation> <translation id="2593272815202181319">मोनोस्पेस</translation> <translation id="2603212228005142861">आफ्ना प्राथमिकताहरू व्यवस्थापन गर्न साइन इन गर्नुहोस्</translation> <translation id="260403163289591229">फलो गरिएका</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">अहिले होइन</translation> <translation id="3493531032208478708">सुझाव दिइएको सामग्रीको बारेमा <ph name="BEGIN_LINK" />थप जान्नुहोस्<ph name="END_LINK" /></translation> <translation id="3495219333887281978">साइन इन गर्ने सुविधा पुछारको पानाको आधा स्क्रिनमा खोलिएको छ।</translation> -<translation id="3498338220321963224">पछि प्रोफाइल लक हटाइएका खण्डमा तपाईंको सेभ गरिएको जानकारी मेटाइने छ।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">सबैभन्दा पुरानो सुरुमा आउने गरी क्रमबद्ध गर्नुहोस्</translation> <translation id="3507132249039706973">'मानक सुरक्षा' सक्रिय छ</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">आफ्नो भर्चुअल कार्ड हटाउन चाहनुहुन्छ?</translation> <translation id="4409271659088619928">तपाईंको डिफल्ट सर्च इन्जिन <ph name="DSE" /> हो। तपाईंको सर्च इन्जिनमा खोजको इतिहास मेटाउन मिल्छ भने खोज इतिहास मेटाउन सर्च इन्जिनले उपलब्ध गराएका निर्देशनहरू हेर्नुहोस्।</translation> <translation id="4415276339145661267">आफ्नो Google खाताको व्यवस्थापन गर्नुहोस्</translation> -<translation id="4417111749295506837">कारमा Chrome मा भएको आफ्नो जानकारी सिंक गर्न र उक्त जानकारी सुरक्षित राख्न तपाईंले अनिवार्य रूपमा प्रोफाइल लक बनाउनु पर्छ। तपाईंले हरेक पटक कारमा छिर्दा कोड वा पासवर्ड प्रयोग गर्नु पर्ने हुन्छ।</translation> <translation id="4425140285732600465">यो उत्पादनको मूल्य ट्र्याक गरिँदै छ। कुनै साइटमा मूल्य घटेका खण्डमा अलर्ट प्राप्त गर्नुहोस्।</translation> <translation id="442518031075347249">तपाईं अबदेखि Google Pay मा आफ्नो भर्चुअल कार्ड प्रयोग गर्न सक्नु हुने छैन। <ph name="BEGIN_LINK1" />भर्चुअल कार्डका बारेमा थप जान्नुहोस्<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">विज्ञापनको पर्सनलाइजेसन</translation> @@ -964,7 +961,6 @@ <translation id="5964869237734432770">फोटो विवरण पाउन छाड्नुहोस्</translation> <translation id="5966233851250124270">Chrome ले तपाईंले छनौट गरेको सेटिङ याद राख्ने छ</translation> <translation id="5979084224081478209">पासवर्डहरूको जाँच गर्नुहोस्</translation> -<translation id="5985186846584605773">आफ्नो कारमा प्रोफाइल लक बनाउनुहोस्</translation> <translation id="5995726099713306770">यो पेज फेरि डाउनलोड गर्ने हो?</translation> <translation id="6000066717592683814">Google लाई डिफल्ट खोज इञ्जिनका रूपमा कायम राख्नुहोस्</translation> <translation id="6000203700195075278">पुनः फलो गर्नुहोस्</translation> @@ -1033,7 +1029,6 @@ <translation id="6364438453358674297">इतिहासबाट सुझाव हटाउने?</translation> <translation id="6380100320871303656">यो मोड अन हुँदा Chrome लाई तपाईं जुन जुन पेज खोल्न सक्नुहुन्छ भन्ने लाग्छ ती पेज अझ छिटो अन्तरालमा प्रिलोड गरेर राखिन्छ। यो सेटिङ अन हुँदा बढी डेटा प्रयोग हुन सक्छ।</translation> <translation id="6382848304055775421">एक्स्पोर्ट गरिँदै छ</translation> -<translation id="6391355955030242704">कारमा Chrome मा भएको आफ्नो जानकारी सिंक गर्न र उक्त जानकारी सुरक्षित राख्न तपाईंले अनिवार्य रूपमा सुरक्षासम्बन्धी सेटिङमा गई प्रोफाइल लक बनाउनु पर्छ। तपाईंले हरेक पटक कारमा छिर्दा कोड वा पासवर्ड प्रयोग गर्नु पर्ने हुन्छ।</translation> <translation id="6394791151443660613">खोज्नुहोस्: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">लिंक</translation> <translation id="6397616442223433927">यन्त्र फेरि अनलाइन भयो</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb index e699d73..f0ee1b3b 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_nl.xtb
@@ -295,7 +295,6 @@ Privéstatustokens verbeteren de privacy op het web en kunnen niet worden gebruikt om je identiteit te achterhalen.</translation> <translation id="2581165646603367611">Hiermee worden cookies, het cachegeheugen en andere gegevens gewist van sites waarvan Chrome denkt dat deze niet belangrijk zijn.</translation> <translation id="2587052924345400782">Nieuwere versie beschikbaar</translation> -<translation id="2589302627584222634">Profielvergrendeling instellen</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Log in om je voorkeuren te beheren</translation> <translation id="260403163289591229">Je volgt</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Niet nu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Meer informatie<ph name="END_LINK" /> over voorgestelde content</translation> <translation id="3495219333887281978">Inlogblad onderaan is op halve hoogte geopend.</translation> -<translation id="3498338220321963224">Je opgeslagen gegevens worden gewist als de profielvergrendeling later wordt verwijderd.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sorteren op oudste</translation> <translation id="3507132249039706973">Standaardbeveiliging staat aan</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Je virtuele kaart verwijderen?</translation> <translation id="4409271659088619928">Je zoekmachine is <ph name="DSE" />. Bekijk de instructies van je zoekmachine voor het verwijderen van je zoekgeschiedenis (indien van toepassing).</translation> <translation id="4415276339145661267">Je Google-account beheren</translation> -<translation id="4417111749295506837">Als je je Chrome-gegevens wilt synchroniseren en je gegevens wilt beveiligen in de auto, moet je een profielvergrendeling instellen. Je gebruikt elke keer dat je in de auto stapt een code of wachtwoord.</translation> <translation id="4425140285732600465">Prijs wordt gevolgd. Krijg meldingen bij een prijsdaling op een site.</translation> <translation id="442518031075347249">Je kunt je virtuele kaart niet meer gebruiken met Google Pay. <ph name="BEGIN_LINK1" />Meer informatie over virtuele kaarten<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Advertentiepersonalisatie</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Afbeeldingsbeschrijvingen stoppen</translation> <translation id="5966233851250124270">Chrome onthoudt je keuze</translation> <translation id="5979084224081478209">Wachtwoorden controleren</translation> -<translation id="5985186846584605773">Profielvergrendeling instellen voor je auto</translation> <translation id="5995726099713306770">Pagina opnieuw downloaden?</translation> <translation id="6000066717592683814">Google blijven gebruiken</translation> <translation id="6000203700195075278">Opnieuw volgen</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Suggestie verwijderen uit geschiedenis?</translation> <translation id="6380100320871303656">Pagina's waarvan Chrome denkt dat je ze waarschijnlijk gaat bezoeken, worden vaker vooraf geladen. Deze instelling kan leiden tot meer datagebruik.</translation> <translation id="6382848304055775421">Exporteren</translation> -<translation id="6391355955030242704">Als je je Chrome-gegevens wilt synchroniseren en je gegevens wilt beveiligen in de auto, moet je een profielvergrendeling instellen in de beveiligingsinstellingen. Je gebruikt elke keer dat je in de auto stapt een code of wachtwoord.</translation> <translation id="6394791151443660613">Zoeken: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Weer online</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb index 5d1555e..8e3a9e44 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_no.xtb
@@ -294,7 +294,6 @@ Med private tilstandstokener får du bedre personvern på nettet, og de kan ikke brukes til å finne ut hvem du er.</translation> <translation id="2581165646603367611">Dette sletter informasjonskapsler, buffere og annen data fra nettsteder Chrome ikke tror er viktige.</translation> <translation id="2587052924345400782">En nyere versjon er tilgjengelig</translation> -<translation id="2589302627584222634">Opprett en profillås</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Logg på for å administrere preferansene dine</translation> <translation id="260403163289591229">Følger</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ikke nå</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Finn ut mer<ph name="END_LINK" /> om foreslått innhold</translation> <translation id="3495219333887281978">Påloggingsfeltet nederst er åpnet i halv høyde.</translation> -<translation id="3498338220321963224">De lagrede dataene dine blir slettet hvis profillåsen fjernes senere.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sorter etter eldste</translation> <translation id="3507132249039706973">Standardbeskyttelse er på</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Vil du fjerne det virtuelle kortet ditt?</translation> <translation id="4409271659088619928">Søkemotoren din er <ph name="DSE" />. Se eventuelt instruksjonene deres om hvordan du sletter søkeloggen din.</translation> <translation id="4415276339145661267">Administrer Google-kontoen din</translation> -<translation id="4417111749295506837">For å synkronisere Chrome-informasjonen din og holde dataene dine sikre i bilen må du opprette en profillås. Da må du bruke en kode eller et passord hver gang du setter deg inn i bilen.</translation> <translation id="4425140285732600465">Sporer prisen. Du får varsler hvis prisen settes ned på noe nettsted.</translation> <translation id="442518031075347249">Du kommer ikke lenger til å kunne bruke det virtuelle kortet ditt med Google Pay. <ph name="BEGIN_LINK1" />Finn ut mer om virtuelle kort<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personlig tilpasning av annonser</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Stopp bildebeskrivelser</translation> <translation id="5966233851250124270">Chrome husker valget ditt</translation> <translation id="5979084224081478209">Kontroller passordene</translation> -<translation id="5985186846584605773">Opprett en profillås for bilen din</translation> <translation id="5995726099713306770">Vil du laste ned siden på nytt?</translation> <translation id="6000066717592683814">Behold Google</translation> <translation id="6000203700195075278">Følg på nytt</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Vil du fjerne forslaget fra loggen?</translation> <translation id="6380100320871303656">Forhåndslaster oftere sider som Chrome tror du sannsynligvis kommer til å besøke. Denne innstillingen kan medføre høyere databruk.</translation> <translation id="6382848304055775421">Eksporterer</translation> -<translation id="6391355955030242704">For å synkronisere Chrome-informasjonen din og holde dataene dine sikre i bilen må du opprette en profillås i sikkerhetsinnstillingene. Da må du bruke en kode eller et passord hver gang du setter deg inn i bilen.</translation> <translation id="6394791151443660613">Søk: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">På nettet igjen</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 59f66fd7..66603d5f 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
@@ -295,7 +295,6 @@ ପ୍ରାଇଭେଟ ଷ୍ଟେଟ ଟୋକନଗୁଡ଼ିକ ୱେବରେ ଗୋପନୀୟତାକୁ ଉନ୍ନତ କରେ ଏବଂ ଆପଣ କିଏ ତାହା ଜାଣିବା ପାଇଁ ଏଗୁଡ଼ିକୁ ବ୍ୟବହାର କରାଯାଇପାରିବ ନାହିଁ।</translation> <translation id="2581165646603367611">ଏହାଦ୍ୱାରା Chrome ମହତ୍ୱପୂର୍ଣ୍ଣ ବୋଲି ଭାବୁନଥିବା, କୁକିସ୍, କ୍ୟାଶ୍ ଏବଂ ସାଇଟ୍ର ଅନ୍ୟାନ୍ୟ ଡାଟାଗୁଡ଼ିକ ଖାଲି ହୋଇଯିବ।</translation> <translation id="2587052924345400782">ନୂତନତର ସଂସ୍କରଣ ଉପଲବ୍ଧ ଅଛି</translation> -<translation id="2589302627584222634">ଏକ ପ୍ରୋଫାଇଲ ଲକ ତିଆରି କରନ୍ତୁ</translation> <translation id="2593272815202181319">ମୋନୋସ୍ପେସ୍</translation> <translation id="2603212228005142861">ଆପଣଙ୍କ ପସନ୍ଦଗୁଡ଼ିକୁ ପରିଚାଳନା କରିବା ପାଇଁ ସାଇନ ଇନ କରନ୍ତୁ</translation> <translation id="260403163289591229">ଫଲୋ କରୁଛନ୍ତି</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ଏବେ ନୁହେଁ</translation> <translation id="3493531032208478708">ପ୍ରସ୍ତାବିତ ବିଷୟବସ୍ତୁ ବିଷୟରେ <ph name="BEGIN_LINK" />ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ସାଇନ ଇନ ବଟମ ସିଟ ଅଧା ସ୍କ୍ରିନରେ ଖୋଲିଛି।</translation> -<translation id="3498338220321963224">ଯଦି ପ୍ରୋଫାଇଲ ଲକକୁ ପରେ କାଢ଼ି ଦିଆଯାଏ, ତେବେ ଆପଣଙ୍କ ସେଭ ହୋଇଥିବା ଡାଟା ଇରେଜ ହୋଇଯିବ।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">ସବୁଠୁ ପୁରୁଣା ଅନୁସାରେ ସର୍ଟ କର</translation> <translation id="3507132249039706973">ଷ୍ଟାଣ୍ଡାର୍ଡ ସୁରକ୍ଷା ଚାଲୁ ଅଛି</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">ଆପଣଙ୍କ ଭର୍ଚୁଆଲ କାର୍ଡ କାଢ଼ି ଦେବେ?</translation> <translation id="4409271659088619928">ଆପଣଙ୍କ ସନ୍ଧାନ ଇଞ୍ଜିନ୍ ହେଉଛି <ph name="DSE" />। ଯଦି ଲାଗୁ ହୁଏ, ତେବେ ଆପଣଙ୍କ ସନ୍ଧାନ ଇତିହାସକୁ ଡିଲିଟ୍ କରିବା ପାଇଁ ସେଗୁଡ଼ିକର ନିର୍ଦ୍ଦେଶଗୁଡ଼ିକୁ ଦେଖନ୍ତୁ।</translation> <translation id="4415276339145661267">ଆପଣଙ୍କର Google ଆକାଉଣ୍ଟ ପରିଚାଳନା କରନ୍ତୁ</translation> -<translation id="4417111749295506837">ଆପଣଙ୍କ ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏବଂ କାରରେ ଆପଣଙ୍କ ଡାଟା ସୁରକ୍ଷିତ ରଖିବାକୁ, ଆପଣ ଏକ ପ୍ରୋଫାଇଲ ଲକ ତିଆରି କରିବା ଆବଶ୍ୟକ। ଆପଣ ପ୍ରତ୍ୟେକ ଥର କାରରେ ପ୍ରବେଶ କରିବା ସମୟରେ ଏକ କୋଡ କିମ୍ବା ପାସୱାର୍ଡ ବ୍ୟବହାର କରିବେ।</translation> <translation id="4425140285732600465">ମୂଲ୍ୟ ଟ୍ରାକ କରାଯାଉଛି। ଯଦି କୌଣସି ସାଇଟରେ ମୂଲ୍ୟ ହ୍ରାସ ପାଏ, ତେବେ ଆଲର୍ଟ ପାଆନ୍ତୁ।</translation> <translation id="442518031075347249">ଆପଣ Google Pay ମାଧ୍ୟମରେ ଆପଣଙ୍କ ଭର୍ଚୁଆଲ କାର୍ଡ ବ୍ୟବହାର କରିବାକୁ ଆଉ ସକ୍ଷମ ହେବେ ନାହିଁ। <ph name="BEGIN_LINK1" />ଭର୍ଚୁଆଲ କାର୍ଡଗୁଡ଼ିକ ବିଷୟରେ ଅଧିକ ଜାଣନ୍ତୁ<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ବିଜ୍ଞାପନ ପର୍ସନାଲାଇଜେସନ</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">ଛବିର ବର୍ଣ୍ଣନା ବନ୍ଦ କରନ୍ତୁ</translation> <translation id="5966233851250124270">Chrome ଆପଣଙ୍କ ପସନ୍ଦକୁ ମନେ ରଖିବ</translation> <translation id="5979084224081478209">ପାସ୍ୱାର୍ଡଗୁଡ଼ିକୁ ଯାଞ୍ଚ କରନ୍ତୁ</translation> -<translation id="5985186846584605773">ଆପଣଙ୍କ କାର ପାଇଁ ଏକ ପ୍ରୋଫାଇଲ ଲକ ତିଆରି କରନ୍ତୁ</translation> <translation id="5995726099713306770">ପୃଷ୍ଠାକୁ ପୁଣି ଡାଉନଲୋଡ୍ କରିବେ କି?</translation> <translation id="6000066717592683814">Googleକୁ ଡିଫଲ୍ଟ ଭାବେ ରଖନ୍ତୁ</translation> <translation id="6000203700195075278">ପୁଣି ଅନୁସରଣ କରନ୍ତୁ</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">ଇତିବୃତ୍ତିରୁ ପ୍ରସ୍ତାବକୁ କାଢ଼ି ଦେବେକି?</translation> <translation id="6380100320871303656">ଆପଣ ଭିଜିଟ କରିବାର ସମ୍ଭାବନା ଅଛି ବୋଲି Chrome ଭାବୁଥିବା ପୃଷ୍ଠାଗୁଡ଼ିକୁ ବାରମ୍ବାର ପ୍ରିଲୋଡ କରେ। ଏହି ସେଟିଂ ଯୋଗୁଁ ଡାଟାର ବ୍ୟବହାର ବଢ଼ିପାରେ।</translation> <translation id="6382848304055775421">ଏକ୍ସପୋର୍ଟ କରାଯାଉଛି</translation> -<translation id="6391355955030242704">ଆପଣଙ୍କ ସୂଚନା ସିଙ୍କ କରିବାକୁ ଏବଂ କାରରେ ଆପଣଙ୍କ ଡାଟା ସୁରକ୍ଷିତ ରଖିବାକୁ, ଆପଣ ଆପଣଙ୍କ ସୁରକ୍ଷା ସେଟିଂସରେ ଏକ ପ୍ରୋଫାଇଲ ଲକ ତିଆରି କରିବା ଆବଶ୍ୟକ। ଆପଣ ପ୍ରତ୍ୟେକ ଥର କାରରେ ପ୍ରବେଶ କରିବା ସମୟରେ ଏକ କୋଡ କିମ୍ବା ପାସୱାର୍ଡ ବ୍ୟବହାର କରିବେ।</translation> <translation id="6394791151443660613">ସନ୍ଧାନ କରନ୍ତୁ: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ଲିଙ୍କ୍</translation> <translation id="6397616442223433927">ପୁଣି ଅନଲାଇନ୍ ହୋଇଛି</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb index 6299db4..1442889 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pa.xtb
@@ -294,7 +294,6 @@ ਨਿੱਜੀ ਸਥਿਤੀ ਦੇ ਟੋਕਨ ਵੈੱਬ 'ਤੇ ਪਰਦੇਦਾਰੀ ਨੂੰ ਬਿਹਤਰ ਬਣਾਉਂਦੇ ਹਨ ਅਤੇ ਉਨ੍ਹਾਂ ਦੀ ਵਰਤੋਂ ਤੁਹਾਡੇ ਬਾਰੇ ਪਤਾ ਲਗਾਉਣ ਲਈ ਨਹੀਂ ਕੀਤੀ ਜਾ ਸਕਦੀ।</translation> <translation id="2581165646603367611">ਇਹ ਉਹਨਾਂ ਸਾਈਟਾਂ ਦੀਆਂ ਕੁਕੀਜ਼, ਕੈਸ਼ੇ, ਅਤੇ ਹੋਰ ਡਾਟੇ ਨੂੰ ਮਿਟਾ ਦੇਵੇਗਾ ਜੋ Chrome ਅਨੁਸਾਰ ਮਹੱਤਵਪੂਰਨ ਨਹੀਂ ਹਨ।</translation> <translation id="2587052924345400782">ਨਵਾਂ ਵਰਜਨ ਉਪਲਬਧ ਹੈ</translation> -<translation id="2589302627584222634">ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਓ</translation> <translation id="2593272815202181319">ਮੋਨੋਸਪੇਸ</translation> <translation id="2603212228005142861">ਆਪਣੀਆਂ ਤਰਜੀਹਾਂ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰਨ ਲਈ ਸਾਈਨ-ਇਨ ਕਰੋ</translation> <translation id="260403163289591229">ਅਨੁਸਰਣ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">ਹੁਣ ਨਹੀਂ</translation> <translation id="3493531032208478708">ਸੁਝਾਈ ਗਈ ਸਮੱਗਰੀ ਬਾਰੇ <ph name="BEGIN_LINK" />ਹੋਰ ਜਾਣੋ<ph name="END_LINK" /></translation> <translation id="3495219333887281978">ਸਾਈਨ-ਇਨ ਕਰਨ ਲਈ ਹੇਠਲੀ ਸ਼ੀਟ ਨੂੰ ਅੱਧੀ ਉਚਾਈ ਤੱਕ ਖੋਲ੍ਹਿਆ ਗਿਆ।</translation> -<translation id="3498338220321963224">ਜੇ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਨੂੰ ਬਾਅਦ ਵਿੱਚ ਹਟਾ ਦਿੱਤਾ ਜਾਂਦਾ ਹੈ, ਤਾਂ ਤੁਹਾਡਾ ਸੁਰੱਖਿਅਤ ਡਾਟਾ ਮਿਟਾ ਦਿੱਤਾ ਜਾਵੇਗਾ।</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">ਪੁਰਾਣੇ ਮੁਤਾਬਕ ਕ੍ਰਮ-ਬੱਧ</translation> <translation id="3507132249039706973">ਮਿਆਰੀ ਸੁਰੱਖਿਆ ਚਾਲੂ ਹੈ</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">ਆਪਣਾ ਆਭਾਸੀ ਕਾਰਡ ਹਟਾਓ?</translation> <translation id="4409271659088619928">ਤੁਹਾਡਾ ਖੋਜ ਇੰਜਣ <ph name="DSE" /> ਹੈ। ਲਾਗੂ ਹੋਣ 'ਤੇ, ਆਪਣਾ ਖੋਜ ਇਤਿਹਾਸ ਮਿਟਾਉਣ ਲਈ ਉਹਨਾਂ ਦੀਆਂ ਹਿਦਾਇਤਾਂ ਦੇਖੋ।</translation> <translation id="4415276339145661267">ਆਪਣੇ Google ਖਾਤੇ ਦਾ ਪ੍ਰਬੰਧਨ ਕਰੋ</translation> -<translation id="4417111749295506837">ਆਪਣੀ Chrome ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰਨ ਅਤੇ ਕਾਰ ਵਿੱਚ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਤੁਹਾਡਾ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਉਣਾ ਲਾਜ਼ਮੀ ਹੈ। ਤੁਸੀਂ ਹਰ ਵਾਰ ਕਾਰ ਵਿੱਚ ਦਾਖਲ ਹੋਣ 'ਤੇ ਇੱਕ ਕੋਡ ਜਾਂ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋਗੇ।</translation> <translation id="4425140285732600465">ਕੀਮਤ ਨੂੰ ਟਰੈਕ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ। ਕਿਸੇ ਵੀ ਸਾਈਟ 'ਤੇ ਕੀਮਤਾਂ ਘਟਣ 'ਤੇ ਸੁਚੇਤਨਾਵਾਂ ਪ੍ਰਾਪਤ ਕਰੋ।</translation> <translation id="442518031075347249">ਤੁਸੀਂ ਹੁਣ Google Pay ਨਾਲ ਆਪਣੇ ਆਭਾਸੀ ਕਾਰਡ ਦੀ ਵਰਤੋਂ ਨਹੀਂ ਕਰ ਸਕੋਗੇ। <ph name="BEGIN_LINK1" />ਆਭਾਸੀ ਕਾਰਡਾਂ ਬਾਰੇ ਹੋਰ ਜਾਣੋ<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">ਵਿਗਿਆਪਨ ਵਿਅਕਤੀਗਤਕਰਨ</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">ਚਿੱਤਰ ਦੇ ਵਰਣਨ ਬੰਦ ਕਰੋ</translation> <translation id="5966233851250124270">Chrome ਤੁਹਾਡੀ ਚੋਣ ਨੂੰ ਯਾਦ ਰੱਖੇਗਾ</translation> <translation id="5979084224081478209">ਪਾਸਵਰਡਾਂ ਦੀ ਜਾਂਚ ਕਰੋ</translation> -<translation id="5985186846584605773">ਆਪਣੀ ਕਾਰ ਲਈ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਓ</translation> <translation id="5995726099713306770">ਕੀ ਪੰਨਾ ਦੁਬਾਰਾ ਡਾਊਨਲੋਡ ਕਰਨਾ ਹੈ?</translation> <translation id="6000066717592683814">Google ਰੱਖੋ</translation> <translation id="6000203700195075278">ਮੁੜ-ਅਨੁਸਰਣ ਕਰੋ</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">ਕੀ ਇਤਿਹਾਸ ਵਿੱਚੋਂ ਸੁਝਾਅ ਹਟਾਉਣਾ ਹੈ?</translation> <translation id="6380100320871303656">Chrome ਮੁਤਾਬਕ ਜਿਨ੍ਹਾਂ ਪੰਨਿਆਂ 'ਤੇ ਤੁਸੀਂ ਜਾ ਸਕਦੇ ਹੋ, ਇਹ ਉਨ੍ਹਾਂ ਨੂੰ ਜ਼ਿਆਦਾ ਵਾਰ ਪ੍ਰੀਲੋਡ ਕਰਦਾ ਹੈ। ਇਸ ਸੈਟਿੰਗ ਦੇ ਨਤੀਜੇ ਵਜੋਂ ਡਾਟਾ ਵਰਤੋਂ ਵਧ ਸਕਦੀ ਹੈ।</translation> <translation id="6382848304055775421">ਨਿਰਯਾਤ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ</translation> -<translation id="6391355955030242704">ਆਪਣੀ Chrome ਜਾਣਕਾਰੀ ਨੂੰ ਸਿੰਕ ਕਰਨ ਅਤੇ ਕਾਰ ਵਿੱਚ ਆਪਣੇ ਡਾਟੇ ਨੂੰ ਸੁਰੱਖਿਅਤ ਰੱਖਣ ਲਈ, ਤੁਹਾਡਾ ਆਪਣੀਆਂ ਸੁਰੱਖਿਆ ਸੈਟਿੰਗਾਂ ਵਿੱਚ ਜਾ ਕੇ ਪ੍ਰੋਫਾਈਲ ਲਾਕ ਬਣਾਉਣਾ ਲਾਜ਼ਮੀ ਹੈ। ਤੁਸੀਂ ਹਰ ਵਾਰ ਕਾਰ ਵਿੱਚ ਦਾਖਲ ਹੋਣ 'ਤੇ ਇੱਕ ਕੋਡ ਜਾਂ ਪਾਸਵਰਡ ਦੀ ਵਰਤੋਂ ਕਰੋਗੇ।</translation> <translation id="6394791151443660613">ਖੋਜੋ: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ਲਿੰਕ</translation> <translation id="6397616442223433927">ਵਾਪਸ ਆਨਲਾਈਨ ਹੋ ਗਿਆ</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 05899ac..672fad4 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
@@ -295,7 +295,6 @@ Tokeny prywatności zwiększają prywatność w sieci i nie można za ich pomocą sprawdzić, kim jesteś.</translation> <translation id="2581165646603367611">Spowoduje to skasowanie plików cookie, pamięci podręcznej i innych danych witryn, które Chrome uzna za nieistotne.</translation> <translation id="2587052924345400782">Dostępna jest nowsza wersja</translation> -<translation id="2589302627584222634">Utwórz blokadę profilu</translation> <translation id="2593272815202181319">Stała szerokość znaków</translation> <translation id="2603212228005142861">Zaloguj się, aby zarządzać ustawieniami</translation> <translation id="260403163289591229">Obserwujesz</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Nie teraz</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Dowiedz się więcej<ph name="END_LINK" /> o proponowanej treści</translation> <translation id="3495219333887281978">Plansza dolna logowania jest otwarta do połowy wysokości.</translation> -<translation id="3498338220321963224">Jeśli później usuniesz blokadę profilu, zapisane dane zostaną wykasowane.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sortuj od najstarszego</translation> <translation id="3507132249039706973">Włączona jest standardowa ochrona</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Usunąć Twoją kartę wirtualną?</translation> <translation id="4409271659088619928">Twoja wyszukiwarka to <ph name="DSE" />. Zapoznaj się z jej instrukcjami, jeśli chcesz usunąć historię wyszukiwania.</translation> <translation id="4415276339145661267">Zarządzaj kontem Google</translation> -<translation id="4417111749295506837">Aby synchronizować informacje w Chrome i zabezpieczyć dane w samochodzie, musisz utworzyć blokadę profilu. Za każdym razem, gdy wsiądziesz do samochodu, będziesz podawać kod lub hasło.</translation> <translation id="4425140285732600465">Monitoruję cenę. Jeśli na którejkolwiek stronie produkt stanieje, otrzymasz alert.</translation> <translation id="442518031075347249">Stracisz możliwość korzystania z karty wirtualnej w Google Pay. <ph name="BEGIN_LINK1" />Więcej informacji o kartach wirtualnych<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizacja reklam</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Wstrzymaj opisy obrazów</translation> <translation id="5966233851250124270">Chrome zapamięta Twój wybór</translation> <translation id="5979084224081478209">Sprawdź hasła</translation> -<translation id="5985186846584605773">Tworzenie blokady profilu w samochodzie</translation> <translation id="5995726099713306770">Pobrać stronę ponownie?</translation> <translation id="6000066717592683814">Zachowaj Google</translation> <translation id="6000203700195075278">Ponownie dodaj do obserwowanych</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Usunąć sugestię z historii?</translation> <translation id="6380100320871303656">Częściej wczytuje strony, w przypadku których Chrome przewiduje, że prawdopodobieństwo ich odwiedzin jest duże. Gdy ustawienie jest aktywne, zużycie danych może być większe.</translation> <translation id="6382848304055775421">Eksportuję</translation> -<translation id="6391355955030242704">Aby synchronizować informacje w Chrome i zabezpieczyć dane w samochodzie, musisz utworzyć blokadę profilu w ustawieniach zabezpieczeń. Za każdym razem, gdy wsiądziesz do samochodu, będziesz podawać kod lub hasło.</translation> <translation id="6394791151443660613">Szukaj: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Jesteś znowu online</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb index aaf6a58..8f33bb0 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-BR.xtb
@@ -295,7 +295,6 @@ Os tokens de estado particular melhoram a privacidade na Web e não podem ser usados para descobrir quem você é.</translation> <translation id="2581165646603367611">Essa ação vai apagar os cookies, cache e outros dados de sites que o Chrome não acredita serem importantes.</translation> <translation id="2587052924345400782">Versão mais recente disponível</translation> -<translation id="2589302627584222634">Criar um bloqueio de perfil</translation> <translation id="2593272815202181319">Espaçamento uniforme</translation> <translation id="2603212228005142861">Faça login para gerenciar suas preferências</translation> <translation id="260403163289591229">Seguindo</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Não agora</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> sobre o conteúdo sugerido</translation> <translation id="3495219333887281978">Página inferior de login aberta na metade da altura.</translation> -<translation id="3498338220321963224">Os dados salvos serão apagados se o bloqueio de perfil for removido mais tarde.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordenar por mais antigo</translation> <translation id="3507132249039706973">A Proteção padrão está ativa</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Remover seu cartão virtual?</translation> <translation id="4409271659088619928">Seu mecanismo de pesquisa é o <ph name="DSE" />. Veja as instruções dele para excluir o histórico de pesquisa, se aplicável.</translation> <translation id="4415276339145661267">Gerenciar sua Conta do Google</translation> -<translation id="4417111749295506837">Para sincronizar suas informações do Chrome e proteger seus dados no carro, é necessário criar um bloqueio de perfil. Você terá que usar um código ou uma senha sempre que entrar no veículo.</translation> <translation id="4425140285732600465">Monitorando o preço. Receba alertas se houver uma redução no preço em algum site.</translation> <translation id="442518031075347249">Não será mais possível usar o cartão virtual com Google Pay. <ph name="BEGIN_LINK1" />Saiba mais sobre os cartões virtuais<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalização de anúncios</translation> @@ -966,7 +963,6 @@ <translation id="5964869237734432770">Parar descrição de imagens</translation> <translation id="5966233851250124270">O Chrome vai lembrar sua escolha</translation> <translation id="5979084224081478209">Verificar senhas</translation> -<translation id="5985186846584605773">Crie um bloqueio de perfil para o carro</translation> <translation id="5995726099713306770">Fazer o download da página novamente?</translation> <translation id="6000066717592683814">Continuar usando o Google</translation> <translation id="6000203700195075278">Voltar a seguir</translation> @@ -1035,7 +1031,6 @@ <translation id="6364438453358674297">Remover sugestão do histórico?</translation> <translation id="6380100320871303656">Pré-carrega com mais frequência páginas que o Chrome acredita serem de seu interesse. Esta configuração pode resultar em aumento no uso de dados.</translation> <translation id="6382848304055775421">Exportando</translation> -<translation id="6391355955030242704">Para sincronizar suas informações do Chrome e proteger seus dados no carro, é necessário criar um bloqueio de perfil nas configurações de segurança. Você terá que usar um código ou uma senha sempre que entrar no veículo.</translation> <translation id="6394791151443660613">Pesquisar: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Conectado novamente</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb index e27fa910..911c122 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_pt-PT.xtb
@@ -295,7 +295,6 @@ Os símbolos de estado privado melhoram a privacidade na Web e não podem ser usados para descobrir a sua identidade.</translation> <translation id="2581165646603367611">Esta ação elimina os cookies, a cache e outros dados de sites que o Chrome não considera importantes.</translation> <translation id="2587052924345400782">Versão mais recente dispon.</translation> -<translation id="2589302627584222634">Criar bloqueio do perfil</translation> <translation id="2593272815202181319">Monoespaço</translation> <translation id="2603212228005142861">Inicie sessão para gerir as suas preferências</translation> <translation id="260403163289591229">A seguir</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">Agora não</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saiba mais<ph name="END_LINK" /> acerca do conteúdo sugerido</translation> <translation id="3495219333887281978">Secção inferior de início de sessão aberta a meia altura.</translation> -<translation id="3498338220321963224">Os dados guardados são apagados se o bloqueio do perfil for removido mais tarde.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Ordenar pelo mais antigo</translation> <translation id="3507132249039706973">A Proteção padrão está ativada.</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Remover o seu cartão virtual?</translation> <translation id="4409271659088619928">O seu motor de pesquisa é o <ph name="DSE" />. Se aplicável, consulte as instruções para eliminar o histórico de pesquisas.</translation> <translation id="4415276339145661267">Gerir a sua Conta Google</translation> -<translation id="4417111749295506837">Para sincronizar as suas informações do Chrome e manter os seus dados seguros no carro, tem de criar um bloqueio do perfil. Vai usar um código ou uma palavra-passe sempre que entrar no carro.</translation> <translation id="4425140285732600465">A monitorizar o preço. Obtenha alertas se o preço descer em qualquer site.</translation> <translation id="442518031075347249">Vai deixar de poder utilizar o seu cartão virtual com o Google Pay. <ph name="BEGIN_LINK1" />Saiba mais sobre cartões virtuais<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalização de anúncios</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">Parar descrições de imagens</translation> <translation id="5966233851250124270">O Chrome vai memorizar a sua escolha</translation> <translation id="5979084224081478209">Rever palavras-passe</translation> -<translation id="5985186846584605773">Crie um bloqueio do perfil para o seu carro</translation> <translation id="5995726099713306770">Quer transferir a página novamente?</translation> <translation id="6000066717592683814">Manter o Google</translation> <translation id="6000203700195075278">Voltar a seguir</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">Remover a sugestão do histórico?</translation> <translation id="6380100320871303656">Pré-carrega mais frequentemente páginas que o Chrome pensa que provavelmente irá visitar. Esta definição pode resultar numa maior utilização de dados.</translation> <translation id="6382848304055775421">A exportar</translation> -<translation id="6391355955030242704">Para sincronizar as suas informações do Chrome e manter os seus dados seguros no carro, tem de criar um bloqueio do perfil nas definições de segurança. Vai usar um código ou uma palavra-passe sempre que entrar no carro.</translation> <translation id="6394791151443660613">Pesquisar: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Ligação retomada</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb index fb5ab4e..310026d 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ro.xtb
@@ -294,7 +294,6 @@ Indicativele de stare private îmbunătățesc confidențialitatea pe web și nu pot fi folosite pentru a afla cine ești.</translation> <translation id="2581165646603367611">Astfel, vor fi șterse cookie-urile, memoria cache și alte date ale site-urilor pe care Chrome nu le consideră importante.</translation> <translation id="2587052924345400782">Este disponibilă o versiune mai nouă</translation> -<translation id="2589302627584222634">Creează o blocare a profilului</translation> <translation id="2593272815202181319">Un singur spațiu</translation> <translation id="2603212228005142861">Conectează-te pentru a-ți gestiona preferințele</translation> <translation id="260403163289591229">Urmărești</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Nu acum</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Află mai multe<ph name="END_LINK" /> despre conținutul sugerat</translation> <translation id="3495219333887281978">Foaia de conectare din partea de jos deschisă la jumătate din înălțime.</translation> -<translation id="3498338220321963224">Datele salvate se vor șterge dacă blocarea profilului este eliminată ulterior.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sortează după vechime</translation> <translation id="3507132249039706973">Protecția standard este activată</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Elimini cardul virtual?</translation> <translation id="4409271659088619928">Motorul tău de căutare este <ph name="DSE" />. Vezi instrucțiunile pentru ștergerea istoricului căutărilor, dacă este cazul.</translation> <translation id="4415276339145661267">Gestionează-ți Contul Google</translation> -<translation id="4417111749295506837">Pentru a sincroniza informațiile din Chrome și a păstra datele în siguranță în mașină, trebuie să creezi o blocare a profilului. Vei folosi un cod sau o parolă de fiecare dată când intri în mașină.</translation> <translation id="4425140285732600465">Se urmărește prețul. Primește alerte dacă prețul scade pe orice site.</translation> <translation id="442518031075347249">Nu vei mai putea folosi cardul virtual cu Google Pay. <ph name="BEGIN_LINK1" />Află mai multe despre cardurile virtuale<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizarea anunțurilor</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Nu genera descrieri imagine</translation> <translation id="5966233851250124270">Chrome îți va memora alegerea</translation> <translation id="5979084224081478209">Verifică parolele</translation> -<translation id="5985186846584605773">Creează o blocare a profilului pentru mașină</translation> <translation id="5995726099713306770">Descarci pagina din nou?</translation> <translation id="6000066717592683814">Păstrează Google</translation> <translation id="6000203700195075278">Urmărește din nou</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Elimini sugestia din istoric?</translation> <translation id="6380100320871303656">Preîncarcă mai frecvent paginile pe care Chrome consideră că le-ai putea accesa. Este posibil ca această setare să ducă la o utilizare crescută a datelor.</translation> <translation id="6382848304055775421">Se exportă</translation> -<translation id="6391355955030242704">Pentru a sincroniza informațiile Chrome și a păstra datele în siguranță în mașină, trebuie să creezi o blocare a profilului în setările de securitate. Vei folosi un cod sau o parolă de fiecare dată când intri în mașină.</translation> <translation id="6394791151443660613">Caută: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Din nou online</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 d6fd9ed..2e354010 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
@@ -294,7 +294,6 @@ Токены доверия помогают обеспечивать конфиденциальность в интернете и не позволяют определять личность пользователей.</translation> <translation id="2581165646603367611">Будет очищен кеш, а также удалены файлы cookie и другие данные, которые система сочтет маловажными.</translation> <translation id="2587052924345400782">Доступна новая версия</translation> -<translation id="2589302627584222634">Настроить блокировку профиля</translation> <translation id="2593272815202181319">Моноширинный</translation> <translation id="2603212228005142861">Войдите в аккаунт, чтобы задать настройки</translation> <translation id="260403163289591229">Вы подписаны</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Не сейчас</translation> <translation id="3493531032208478708">Подробнее <ph name="BEGIN_LINK" />о рекомендованном контенте<ph name="END_LINK" />…</translation> <translation id="3495219333887281978">Нижний экран входа в аккаунт открыт наполовину.</translation> -<translation id="3498338220321963224">Если позже отключить блокировку профиля, сохраненные данные будут удалены.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Сначала старые</translation> <translation id="3507132249039706973">Стандартная защита включена</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Удалить виртуальную карту?</translation> <translation id="4409271659088619928">Ваша поисковая система – <ph name="DSE" />. Изучите инструкции по удалению истории поиска в справочных материалах указанной поисковой системы.</translation> <translation id="4415276339145661267">Перейти в настройки аккаунта Google</translation> -<translation id="4417111749295506837">Чтобы синхронизировать данные Chrome и обеспечить их защиту в автомобиле, включите блокировку профиля. Вам потребуется вводить PIN-код или пароль каждый раз, когда вы садитесь в автомобиль.</translation> <translation id="4425140285732600465">Вы отслеживаете цену на этот товар. Если на одном из сайтов она снизится, вы получите уведомление.</translation> <translation id="442518031075347249">Вы больше не сможете использовать виртуальную карту для оплаты через Google Pay. Подробнее <ph name="BEGIN_LINK1" />о виртуальных картах<ph name="END_LINK1" />…</translation> <translation id="4428065317363009941">Персонализация рекламы</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Не генерировать описания</translation> <translation id="5966233851250124270">Chrome запомнит ваш выбор</translation> <translation id="5979084224081478209">Проверить пароли</translation> -<translation id="5985186846584605773">Настройте блокировку профиля для автомобиля</translation> <translation id="5995726099713306770">Снова скачать страницу?</translation> <translation id="6000066717592683814">Использовать Google</translation> <translation id="6000203700195075278">Снова подписаться</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Удалить подсказку из истории?</translation> <translation id="6380100320871303656">Chrome чаще предзагружает страницы, которые вы с большой вероятностью посетите. Может увеличиться расход трафика.</translation> <translation id="6382848304055775421">Экспорт…</translation> -<translation id="6391355955030242704">Чтобы синхронизировать данные Chrome и обеспечить их защиту в автомобиле, включите блокировку профиля в настройках безопасности. Вам потребуется вводить PIN-код или пароль каждый раз, когда вы садитесь в автомобиль.</translation> <translation id="6394791151443660613">Поиск по запросу "<ph name="SEARCH_QUERY" />"</translation> <translation id="6395288395575013217">ССЫЛКА</translation> <translation id="6397616442223433927">Подключение восстановлено</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 afc28b5e..e5d39154 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
@@ -294,7 +294,6 @@ පෞද්ගලික තත්ත්ව ටෝකන වෙබයෙහි පෞද්ගලිකත්වය වැඩි දියුණු කරන අතර ඔබ කවුදැයි සොයා ගැනීමට භාවිතා කළ නොහැක.</translation> <translation id="2581165646603367611">මෙය Chrome වැදගත් යැයි නොසිතන කුකීස්, හැඹිලිය, සහ අඩවිවල අනෙකුත් දත්ත හිස් කරනු ඇත.</translation> <translation id="2587052924345400782">වඩා අලුත් අනුවාදයක් තිබේ</translation> -<translation id="2589302627584222634">පැතිකඩ අගුලක් තනන්න</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">ඔබේ මනාප කළමනාකරණය කිරීමට පුරන්න</translation> <translation id="260403163289591229">අනුගමනය කරයි</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">දැන් නොවේ</translation> <translation id="3493531032208478708">යෝජිත අන්තර්ගතය ගැන <ph name="BEGIN_LINK" />තවත් දැනගන්න<ph name="END_LINK" /></translation> <translation id="3495219333887281978">පිරීමේ පහළ පත්රය අර්ධ උසින් විවෘත විය.</translation> -<translation id="3498338220321963224">පසුව පැතිකඩ අගුල ඉවත් කරනු ලබන්නේ නම් ඔබේ සුරැකි දත්ත මකනු ලබයි.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">පැරණිම අනුව වර්ග කරන්න</translation> <translation id="3507132249039706973">සම්මත ආරක්ෂව සක්රීයයි</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">ඔබගේ අතථ්ය කාඩ්පත ඉවත් කරන්නද?</translation> <translation id="4409271659088619928">ඔබගේ සෙවීම් යන්ත්රය වන්නේ <ph name="DSE" />. අදාළ වන්නේ නම්, ඔබගේ සෙවීම් ඉතිහාසය මැකීම සඳහා ඔවුන්ගේ උපදෙස් බලන්න.</translation> <translation id="4415276339145661267">ඔබේ Google ගිණුම කළමනාකරණය</translation> -<translation id="4417111749295506837">ඔබේ Chrome තොරතුරු සමමුහූර්ත කිරීමට සහ මෝටර් රථය තුළ ඔබේ දත්ත සුරක්ෂිතව තබා ගැනීමට, ඔබ පැතිකඩ අගුලක් සෑදිය යුතු ම ය. ඔබ මෝටර් රථයට ඇතුළු වන සෑම අවස්ථාවකම ඔබ කේතයක් හෝ මුරපදයක් භාවිත කරයි.</translation> <translation id="4425140285732600465">මිල හඹා යාම කිනම් හෝ අඩවියක මිල අඩු වුවහොත් ඇඟවීම් ලබා ගන්න.</translation> <translation id="442518031075347249">ඔබට තවදුරටත් Google Pay සමඟ ඔබගේ අතථ්ය කාඩ්පත භාවිත කළ නොහැකි වනු ඇත <ph name="BEGIN_LINK1" />අතථ්ය කාඩ්පත් ගැන තව දැන ගන්න<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">වෙළඳ දැන්වීම් පුද්ගලිකකරණය</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">රූප විස්තර නවත්වන්න</translation> <translation id="5966233851250124270">Chrome ඔබේ තේරීම මතක තබා ගනී</translation> <translation id="5979084224081478209">මුරපද පරීක්ෂා කරන්න</translation> -<translation id="5985186846584605773">ඔබේ මෝටර් රථය සඳහා පැතිකඩ අගුලක් තනන්න</translation> <translation id="5995726099713306770">නැවත පිටුව බාගන්නද?</translation> <translation id="6000066717592683814">Keep Google</translation> <translation id="6000203700195075278">නැවත අනුගමනය කරන්න</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">යෝජනාව ඉතිහාසය වෙතින් ඉවත් කරන්නද?</translation> <translation id="6380100320871303656">ඔබ පිවිසීමට ඉඩ ඇතැයි Chrome සිතන පිටු වඩාත් නිතර පූර්ව පූරණය කරයි. මෙම සැකසීම දත්ත භාවිතය වැඩි වීමට හේතු විය හැකිය.</translation> <translation id="6382848304055775421">නිර්යාත කරමින්</translation> -<translation id="6391355955030242704">ඔබේ Chrome තොරතුරු සමමුහූර්ත කිරීමට සහ මෝටර් රථය තුළ ඔබේ දත්ත සුරක්ෂිතව තබා ගැනීමට, ඔබ ඔබේ ආරක්ෂක සැකසීම් තුළ පැතිකඩ අගුලක් සෑදිය යුතු ම ය. ඔබ මෝටර් රථයට ඇතුළු වන සෑම අවස්ථාවකම ඔබ කේතයක් හෝ මුරපදයක් භාවිත කරයි.</translation> <translation id="6394791151443660613">සොයන්න: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">සබැඳිය</translation> <translation id="6397616442223433927">ආපසු සබැඳියි</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb index 03abcc7..05dc975 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sk.xtb
@@ -294,7 +294,6 @@ Tokeny súkromného stavu zlepšujú ochranu súkromia na internete a nedá sa podľa nich zistiť vaša totožnosť.</translation> <translation id="2581165646603367611">Táto akcia vymaže súbory cookie, vyrovnávaciu pamäť a ďalšie údaje webov, ktoré Chrome nepovažuje za dôležité.</translation> <translation id="2587052924345400782">Je dostupná novšia verzia</translation> -<translation id="2589302627584222634">Vytvoriť zámku profilu</translation> <translation id="2593272815202181319">Neproporcionálne</translation> <translation id="2603212228005142861">Ak chcete spravovať predvoľby, prihláste sa</translation> <translation id="260403163289591229">Sledovaný</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Teraz nie</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Ďalšie informácie<ph name="END_LINK" /> o návrhoch obsahu</translation> <translation id="3495219333887281978">Dolný hárok prihlásenia otvorený na polovičnú výšku.</translation> -<translation id="3498338220321963224">Ak neskôr odstránite zámku profilu, vaše uložené údaje budú vymazané.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Zoradiť od najstarších</translation> <translation id="3507132249039706973">Je zapnutá štandardná ochrana</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Chcete virtuálnu kartu odstrániť?</translation> <translation id="4409271659088619928">Používate vyhľadávač <ph name="DSE" />. Prečítajte si jeho pokyny, ako odstrániť históriu vyhľadávania (ak je to možné).</translation> <translation id="4415276339145661267">Spravovať účet Google</translation> -<translation id="4417111749295506837">Ak chcete synchronizovať informácie v Chrome a zabezpečiť údaje v aute, musíte vytvoriť zámku profilu. Kód alebo heslo budete používať pri každom nastupovaní do auta.</translation> <translation id="4425140285732600465">Cenu sledujete. Dostávajte upozornenia, keď na ľubovoľnom webe poklesne.</translation> <translation id="442518031075347249">Virtuálnu kartu už nebudete môcť používať so službou Google Pay. <ph name="BEGIN_LINK1" />Ďalšie informácie o virtuálnych kartách<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Prispôsobenie reklám</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Zastaviť popisy obrázkov</translation> <translation id="5966233851250124270">Chrome si vašu voľbu zapamätá</translation> <translation id="5979084224081478209">Skontrolovať heslá</translation> -<translation id="5985186846584605773">Vytvorte si pre auto zámku profilu</translation> <translation id="5995726099713306770">Chcete stránku znova stiahnuť?</translation> <translation id="6000066717592683814">Ponechať Google</translation> <translation id="6000203700195075278">Znova sledovať</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Odstrániť návrh z histórie?</translation> <translation id="6380100320871303656">Častejšie prednačítava stránky, ktoré podľa Chromu pravdepodobne navštívite. Toto nastavenie môže zvýšiť spotrebu dát.</translation> <translation id="6382848304055775421">Exportuje sa</translation> -<translation id="6391355955030242704">Ak chcete synchronizovať informácie v Chrome a zabezpečiť údaje v aute, musíte v nastaveniach zabezpečenia vytvoriť zámku profilu. Kód alebo heslo budete používať pri každom nastupovaní do auta.</translation> <translation id="6394791151443660613">Hľadať: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ODKAZ</translation> <translation id="6397616442223433927">Sme späť online</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 ae7e18c..9bee4b2 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
@@ -294,7 +294,6 @@ Zasebni žetoni stanja izboljšujejo zaupanje v spletu in jih ni mogoče uporabiti za osebno prepoznavo.</translation> <translation id="2581165646603367611">S tem bodo izbrisani piškotki, predpomnilnik in drugi podatki spletnih mest, ki se Chromu ne zdijo pomembni.</translation> <translation id="2587052924345400782">Na voljo je nov. različica</translation> -<translation id="2589302627584222634">Ustvari zaklepanja profila</translation> <translation id="2593272815202181319">Stalna širina</translation> <translation id="2603212228005142861">Če želite upravljati nastavitve, se prijavite</translation> <translation id="260403163289591229">Spremljano</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ne zdaj</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Preberite več<ph name="END_LINK" /> o predlagani vsebini</translation> <translation id="3495219333887281978">Razdelek na dnu zaslona za prijavo je odprt pri polovični višini.</translation> -<translation id="3498338220321963224">Shranjeni podatki bodo izbrisani, če pozneje odstranite zaklepanje profila.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Najprej najstarejši</translation> <translation id="3507132249039706973">Standardna zaščita je vklopljena</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Želite odstraniti navidezno kartico?</translation> <translation id="4409271659088619928">Vaš iskalnik je <ph name="DSE" />. Oglejte si navodila iskalnika za brisanje zgodovine iskanja, če je na voljo.</translation> <translation id="4415276339145661267">Upravljanje računa Google</translation> -<translation id="4417111749295506837">Če želite sinhronizirati podatke v Chromu in poskrbeti za varnost podatkov v avtomobilu, morate ustvariti zaklepanje profila. Pri vsakem vstopu v avtomobil boste uporabili kodo ali geslo.</translation> <translation id="4425140285732600465">Spremljanje cene. Prejmite opozorila, če se cena zniža na katerem koli spletnem mestu.</translation> <translation id="442518031075347249">Navidezne kartice ne bo več mogoče uporabljati v Googlu Pay. <ph name="BEGIN_LINK1" />Preberite več o navideznih karticah<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Osebno prilagajanje oglasov</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Ustavi prenos opisov slik</translation> <translation id="5966233851250124270">Chrome si bo zapomnil vašo izbiro</translation> <translation id="5979084224081478209">Preveri gesla</translation> -<translation id="5985186846584605773">Ustvarjanje zaklepanja profila za avtomobil</translation> <translation id="5995726099713306770">Ali želite znova prenesti stran?</translation> <translation id="6000066717592683814">Ohrani Google</translation> <translation id="6000203700195075278">Znova spremljaj</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Ali želite odstraniti predlog iz zgodovine?</translation> <translation id="6380100320871303656">Pogosteje vnaprej naloži strani, za katere Chrome meni, da jih boste najverjetneje obiskali Ta nastavitev bo morda povzročila povečano uporabo podatkov.</translation> <translation id="6382848304055775421">Izvažanje</translation> -<translation id="6391355955030242704">Če želite sinhronizirati podatke v Chromu in poskrbeti za varnost podatkov v avtomobilu, morate v varnostnih nastavitvah ustvariti zaklepanje profila. Pri vsakem vstopu v avtomobil boste uporabili kodo ali geslo.</translation> <translation id="6394791151443660613">Iskanje: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">POVEZAVA</translation> <translation id="6397616442223433927">Povezava je znova vzpostavljena</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 43db9c1..f43cd74 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
@@ -294,7 +294,6 @@ Kodet e gjendjes private përmirësojnë privatësinë në ueb dhe nuk mund të përdoren për të zbuluar identitetin tënd.</translation> <translation id="2581165646603367611">Kjo do të pastrojë kukit, memorien e përkohshme dhe të dhënat e tjera të sajteve që Chrome nuk i konsideron si të rëndësishme.</translation> <translation id="2587052924345400782">Një version më i ri është i disponueshëm</translation> -<translation id="2589302627584222634">Krijo një kyçje profili</translation> <translation id="2593272815202181319">Me hapësirë fikse</translation> <translation id="2603212228005142861">Identifikohu për të menaxhuar preferencat e tua</translation> <translation id="260403163289591229">Po ndjek</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Jo tani</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Mëso më shumë<ph name="END_LINK" /> mbi përmbajtjen e sugjeruar</translation> <translation id="3495219333887281978">Fleta e poshtme e identifikimit u hap në gjysmë lartësi.</translation> -<translation id="3498338220321963224">Të dhënat e tua të ruajtura do të spastrohen nëse kyçja e profilit hiqet më vonë.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Rendit nga më i vjetri</translation> <translation id="3507132249039706973">"Mbrojtja standarde" është aktive</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Të hiqet karta virtuale?</translation> <translation id="4409271659088619928">Motori yt i kërkimit është <ph name="DSE" />. Shiko udhëzimet e motorit të kërkimit për fshirjen e historikut të kërkimit, nëse është e vlefshme.</translation> <translation id="4415276339145661267">Menaxho "Llogarinë tënde të Google"</translation> -<translation id="4417111749295506837">Për të sinkronizuar informacionet e tua të Chrome dhe për t'i mbajtur të sigurta të dhënat e tua në makinën tënde, duhet të krijosh një kyçje profili. Do të përdorësh një kod ose një fjalëkalim sa herë që do të hysh në makinë.</translation> <translation id="4425140285732600465">Çmimi po monitorohet. Merr sinjalizime nëse ulet çmimi në ndonjë sajt.</translation> <translation id="442518031075347249">Nuk do të mund ta përdorësh më kartën virtuale me Google Pay. <ph name="BEGIN_LINK1" />Mëso më shumë rreth kartave virtuale<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizimi i reklamave</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Ndalo përshkrimet e imazheve</translation> <translation id="5966233851250124270">Chrome do ta kujtojë këtë zgjedhje</translation> <translation id="5979084224081478209">Kontrollo fjalëkalimet</translation> -<translation id="5985186846584605773">Krijo një kyçje profili për makinën tënde</translation> <translation id="5995726099713306770">Të shkarkohet faqja sërish?</translation> <translation id="6000066717592683814">Mbaj Google</translation> <translation id="6000203700195075278">Ndiqe përsëri</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Të hiqet sugjerimi nga historiku?</translation> <translation id="6380100320871303656">Ngarkon paraprakisht më shpesh faqet që Chrome mendon se mund të vizitosh. Ky cilësim mund të rezultojë në përdorimin e më shumë të dhënave.</translation> <translation id="6382848304055775421">Po eksportohen</translation> -<translation id="6391355955030242704">Për të sinkronizuar informacionet e tua të Chrome dhe për t'i mbajtur të sigurta të dhënat e tua në makinën tënde, duhet të krijosh një kyçje profili te cilësimet e tua të sigurisë. Do të përdorësh një kod ose një fjalëkalim sa herë që do të hysh në makinë.</translation> <translation id="6394791151443660613">Kërko: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LIDHJA</translation> <translation id="6397616442223433927">Përsëri në linjë</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb index ec41ad03..6a570308 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr-Latn.xtb
@@ -294,7 +294,6 @@ Privatni tokeni za stanje poboljšavaju privatnost na vebu i ne mogu da se koriste za otkrivanje identiteta.</translation> <translation id="2581165646603367611">Ovim ćete obrisati kolačiće, keš i druge podatke sajtova koje Chrome ne smatra važnim.</translation> <translation id="2587052924345400782">Dostupna je novija verzija</translation> -<translation id="2589302627584222634">Primeni zaključavanje profila</translation> <translation id="2593272815202181319">Fiksne širine</translation> <translation id="2603212228005142861">Prijavite se da biste upravljali podešavanjima</translation> <translation id="260403163289591229">Pratite</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Ne sada</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Saznajte više<ph name="END_LINK" /> o predloženom sadržaju</translation> <translation id="3495219333887281978">Donja tabela za prijavljivanje je otvorena do polovine ekrana.</translation> -<translation id="3498338220321963224">Sačuvani podaci će biti obrisani ako se zaključavanje profila ukloni kasnije.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sortiraj po najstarijem</translation> <translation id="3507132249039706973">Standardna zaštita je uključena</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Želite da uklonite virtuelnu karticu?</translation> <translation id="4409271659088619928">Vaš pretraživač je <ph name="DSE" />. Pogledajte uputstva tog pretraživača za brisanje istorije pretrage ako je to primenjivo.</translation> <translation id="4415276339145661267">Upravljajte Google nalogom</translation> -<translation id="4417111749295506837">Da biste sinhronizovali Chrome informacije i zaštitili podatke u automobilu, morate da primenite zaključavanje profila. Koristićete kôd ili lozinku svaki put kad uđete u automobil.</translation> <translation id="4425140285732600465">Cena se prati. Dobijajte obaveštenja kada se cena snizi na bilo kom sajtu.</translation> <translation id="442518031075347249">Više nećete moći da koristite virtuelnu karticu uz Google Pay. <ph name="BEGIN_LINK1" />Saznajte više o virtuelnim karticama<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personalizacija oglasa</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Zaustavi opise slika</translation> <translation id="5966233851250124270">Chrome će zapamtiti izbor</translation> <translation id="5979084224081478209">Proveri lozinke</translation> -<translation id="5985186846584605773">Primenite zaključavanje profila za automobil</translation> <translation id="5995726099713306770">Želite da preuzmete stranicu ponovo?</translation> <translation id="6000066717592683814">Zadrži Google</translation> <translation id="6000203700195075278">Ponovo prati</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Želite li da uklonite predlog iz istorije?</translation> <translation id="6380100320871303656">Češće predučitava stranice za koje Chrome smatra da ćete ih verovatno posetiti. Ovo podešavanje može da dovede do povećane potrošnje podataka.</translation> <translation id="6382848304055775421">Izvozi se</translation> -<translation id="6391355955030242704">Da biste sinhronizovali Chrome informacije i zaštitili podatke u automobilu, morate da primenite zaključavanje profila u bezbednosnim podešavanjima. Koristićete kôd ili lozinku svaki put kad uđete u automobil.</translation> <translation id="6394791151443660613">Pretražite: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LINK</translation> <translation id="6397616442223433927">Ponovo ste onlajn</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb index fc0b07d..2b49609 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_sr.xtb
@@ -294,7 +294,6 @@ Приватни токени за стање побољшавају приватност на вебу и не могу да се користе за откривање идентитета.</translation> <translation id="2581165646603367611">Овим ћете обрисати колачиће, кеш и друге податке сајтова које Chrome не сматра важним.</translation> <translation id="2587052924345400782">Доступна је новија верзија</translation> -<translation id="2589302627584222634">Примени закључавање профила</translation> <translation id="2593272815202181319">Фиксне ширине</translation> <translation id="2603212228005142861">Пријавите се да бисте управљали подешавањима</translation> <translation id="260403163289591229">Пратите</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Не сада</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Сазнајте више<ph name="END_LINK" /> о предложеном садржају</translation> <translation id="3495219333887281978">Доња табела за пријављивање је отворена до половине екрана.</translation> -<translation id="3498338220321963224">Сачувани подаци ће бити обрисани ако се закључавање профила уклони касније.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Сортирај по најстаријем</translation> <translation id="3507132249039706973">Стандардна заштита је укључена</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Желите да уклоните виртуелну картицу?</translation> <translation id="4409271659088619928">Ваш претраживач је <ph name="DSE" />. Погледајте упутства тог претраживача за брисање историје претраге ако је то примењиво.</translation> <translation id="4415276339145661267">Управљајте Google налогом</translation> -<translation id="4417111749295506837">Да бисте синхронизовали Chrome информације и заштитили податке у аутомобилу, морате да примените закључавање профила. Користићете кôд или лозинку сваки пут кад уђете у аутомобил.</translation> <translation id="4425140285732600465">Цена се прати. Добијајте обавештења када се цена снизи на било ком сајту.</translation> <translation id="442518031075347249">Више нећете моћи да користите виртуелну картицу уз Google Pay. <ph name="BEGIN_LINK1" />Сазнајте више о виртуелним картицама<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Персонализација огласа</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Заустави описе слика</translation> <translation id="5966233851250124270">Chrome ће запамтити избор</translation> <translation id="5979084224081478209">Провери лозинке</translation> -<translation id="5985186846584605773">Примените закључавање профила за аутомобил</translation> <translation id="5995726099713306770">Желите да преузмете страницу поново?</translation> <translation id="6000066717592683814">Задржи Google</translation> <translation id="6000203700195075278">Поново прати</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Желите ли да уклоните предлог из историје?</translation> <translation id="6380100320871303656">Чешће предучитава странице за које Chrome сматра да ћете их вероватно посетити. Ово подешавање може да доведе до повећане потрошње података.</translation> <translation id="6382848304055775421">Извози се</translation> -<translation id="6391355955030242704">Да бисте синхронизовали Chrome информације и заштитили податке у аутомобилу, морате да примените закључавање профила у безбедносним подешавањима. Користићете кôд или лозинку сваки пут кад уђете у аутомобил.</translation> <translation id="6394791151443660613">Претражите: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ЛИНК</translation> <translation id="6397616442223433927">Поново сте онлајн</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 e548bff..46ca2c65 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
@@ -294,7 +294,6 @@ Med förtroendetoken förbättras integriteten på webben. De kan inte användas för att ta reda på vem du är.</translation> <translation id="2581165646603367611">Det här alternativet rensar cookies, cacheminnet och annan data från webbplatser som bedöms vara oviktiga.</translation> <translation id="2587052924345400782">Det finns en nyare version</translation> -<translation id="2589302627584222634">Skapa ett profillås</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Logga in för att hantera inställningarna.</translation> <translation id="260403163289591229">Följer</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Inte nu</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Läs mer<ph name="END_LINK" /> om förslag på innehåll</translation> <translation id="3495219333887281978">Arket för inloggning på nedre delen av skärmen har öppnats över halva skärmen.</translation> -<translation id="3498338220321963224">Din sparade data raderas om profillåset tas bort senare.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Sortera efter äldsta</translation> <translation id="3507132249039706973">Standardskydd är aktiverat</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">Vill du ta bort det virtuella kortet?</translation> <translation id="4409271659088619928">Du använder <ph name="DSE" /> som sökmotor. Läs den sökmotorns anvisningar för att radera sökhistoriken om tillämpligt.</translation> <translation id="4415276339145661267">Hantera Google-kontot</translation> -<translation id="4417111749295506837">Om du vill synkronisera dina Chrome-uppgifter och skydda din data i bilen måste du skapa ett profillås. Du anger en kod eller ett lösenord varje gång du sätter dig i bilen.</translation> <translation id="4425140285732600465">Bevakar pris. Få aviseringar när priset sjunker på en webbplats.</translation> <translation id="442518031075347249">Du kommer inte längre att kunna använda det virtuella kortet med Google Pay. <ph name="BEGIN_LINK1" />Läs mer om virtuella kort<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Personliga annonspreferenser</translation> @@ -963,7 +960,6 @@ <translation id="5964869237734432770">Stoppa bildbeskrivning</translation> <translation id="5966233851250124270">Chrome kommer ihåg valet</translation> <translation id="5979084224081478209">Kontrollera lösenord</translation> -<translation id="5985186846584605773">Skapa ett profillås för bilen</translation> <translation id="5995726099713306770">Vill du ladda ned sidan igen?</translation> <translation id="6000066717592683814">Behåll Google</translation> <translation id="6000203700195075278">Följ på nytt</translation> @@ -1032,7 +1028,6 @@ <translation id="6364438453358674297">Vill du ta bort förslaget från historiken?</translation> <translation id="6380100320871303656">Chrome läser oftare in sidor som du kanske vill besöka i förväg. Den här inställningen kan leda till ökad dataanvändning.</translation> <translation id="6382848304055775421">Exporterar</translation> -<translation id="6391355955030242704">Om du vill synkronisera dina Chrome-uppgifter och skydda din data i bilen måste du skapa ett profillås i säkerhetsinställningarna. Du anger en kod eller ett lösenord varje gång du sätter dig i bilen.</translation> <translation id="6394791151443660613">Sök efter: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LÄNK</translation> <translation id="6397616442223433927">Online igen</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 11740bd6..eecf924 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
@@ -294,7 +294,6 @@ Tokeni za hali ya faragha zinaboresha faragha kwenye wavuti na haziwezi kutumiwa kukutambua wewe ni nani.</translation> <translation id="2581165646603367611">Hatua hii itafuta vidakuzi, akiba na data nyingine ya tovuti ambazo Chrome haidhani kuwa muhimu.</translation> <translation id="2587052924345400782">Toleo jipya linapatikana.</translation> -<translation id="2589302627584222634">Unda kufuli la wasifu</translation> <translation id="2593272815202181319">Nafasi moja</translation> <translation id="2603212228005142861">Ingia katika akaunti ili udhibiti mapendeleo</translation> <translation id="260403163289591229">Unayofuatilia</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Si sasa</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Pata maelezo zaidi<ph name="END_LINK" /> kuhusu maudhui yaliyopendekezwa</translation> <translation id="3495219333887281978">Safu ya chini ya kuingia katika akaunti imefunguliwa katika hali ya nusu skrini.</translation> -<translation id="3498338220321963224">Data uliyohifadhi itafutwa ikiwa kufuli la wasifu litaondolewa baadaye.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Panga kulingana na alamisho za zamani zaidi</translation> <translation id="3507132249039706973">Kipengele cha Ulinzi wa Kawaida kimewashwa</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Ungependa kuondoa kadi pepe yako?</translation> <translation id="4409271659088619928">Mtambo wako wa kutafuta ni <ph name="DSE" />. Angalia maagizo ya mtambo huo wa kutafuta, ikiwa yapo, kuhusu jinsi ya kufuta historia ya mambo uliyotafuta.</translation> <translation id="4415276339145661267">Dhibiti Akaunti yako ya Google</translation> -<translation id="4417111749295506837">Ili usawazishe maelezo yako ya Chrome na uimarishe usalama wa data yako kwenye gari, ni lazima uunde kufuli la wasifu. Utatumia msimbo au nenosiri kila unapoingia kwenye gari.</translation> <translation id="4425140285732600465">Unafuatilia bei. Pata arifa bei ikipunguzwa kwenye tovuti yoyote.</translation> <translation id="442518031075347249">Hutaweza kutumia tena kadi pepe yako kwenye programu ya Google Play. <ph name="BEGIN_LINK1" />Pata maelezo zaidi kuhusu kadi pepe<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Kuweka mapendeleo ya matangazo</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Komesha maelezo ya picha</translation> <translation id="5966233851250124270">Chrome itakumbuka chaguo lako</translation> <translation id="5979084224081478209">Kagua manenosiri</translation> -<translation id="5985186846584605773">Kuunda kufuli la wasifu kwa ajili ya gari lako</translation> <translation id="5995726099713306770">Je, ungependa kupakua ukurasa huu tena?</translation> <translation id="6000066717592683814">Endelea Kutumia Google</translation> <translation id="6000203700195075278">Fuatilia tena</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Je, ungependa kuondoa pendekezo kwenye historia?</translation> <translation id="6380100320871303656">Hupakia mapema mara nyingi zaidi kurasa ambazo Chrome inafikiri kwamba unaweza kuzitembelea. Mipangilio hii inaweza kusababisha ongezeko la matumizi ya data.</translation> <translation id="6382848304055775421">Inahamisha</translation> -<translation id="6391355955030242704">Ili usawazishe maelezo yako ya Chrome na uimarishe usalama wa data yako kwenye gari, ni lazima uunde kufuli la wasifu katika mipangilio yako ya usalama. Utatumia msimbo au nenosiri kila unapoingia kwenye gari.</translation> <translation id="6394791151443660613">Tafuta: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">KIUNGO</translation> <translation id="6397616442223433927">Imerudi mtandaoni</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 166ccee..514eced5 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
@@ -294,7 +294,6 @@ தனிப்பட்ட நிலை டோக்கன்கள் இணையத்தில் தனியுரிமையை மேம்படுத்துகின்றன. உங்கள் அடையாளத்தைக் கண்டறிவதற்காக அவற்றைப் பயன்படுத்த முடியாது.</translation> <translation id="2581165646603367611">முக்கியமில்லை என்று Chrome கருதும் குக்கீகள், தற்காலிகச் சேமிப்பு, தளங்களின் பிற தரவு ஆகியவற்றை இது அழிக்கும்.</translation> <translation id="2587052924345400782">புதிய பதிப்பு உள்ளது</translation> -<translation id="2589302627584222634">சுயவிவரப் பூட்டை உருவாக்கு</translation> <translation id="2593272815202181319">மோனோஸ்பேஸ்</translation> <translation id="2603212228005142861">உங்கள் விருப்பத்தேர்வுகளை நிர்வகிக்க உள்நுழையவும்</translation> <translation id="260403163289591229">பின்தொடர்பவை</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">இப்பொழுது இல்லை</translation> <translation id="3493531032208478708">பரிந்துரைக்கப்படும் உள்ளடக்கம் பற்றி <ph name="BEGIN_LINK" />மேலும் அறிக<ph name="END_LINK" /></translation> <translation id="3495219333887281978">உள்நுழைவதற்கான கீழ்ப்புறச் சீட்டு பாதித் திரையில் திறக்கப்பட்டுள்ளது.</translation> -<translation id="3498338220321963224">சுயவிவரப் பூட்டு பின்னர் அகற்றப்படும்போது சேமிக்கப்பட்ட தரவும் அழிக்கப்படும்.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">பழையவற்றின்படி வரிசைப்படுத்து</translation> <translation id="3507132249039706973">நிலையான பாதுகாப்பு இயக்கப்பட்டுள்ளது</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">உங்கள் விர்ச்சுவல் கார்டை அகற்றவா?</translation> <translation id="4409271659088619928"><ph name="DSE" /> என்பதே உங்கள் தேடல் இன்ஜின். அதன் வழிமுறைகளைப் பார்த்து தேடல் விவரங்களை நீக்குங்கள் (நீக்க அனுமதி இருந்தால்).</translation> <translation id="4415276339145661267">Google கணக்கை நிர்வகி</translation> -<translation id="4417111749295506837">காரில் உங்கள் Chromeமை ஒத்திசைப்பதற்கும் உங்கள் தரவைப் பாதுகாப்பதற்கும் சுயவிவரப் பூட்டை உருவாக்க வேண்டும். காரின் டாஷ்போர்டைப் பயன்படுத்தும் போதெல்லாம் குறியீடு அல்லது கடவுச்சொல்லை நீங்கள் பயன்படுத்த வேண்டியிருக்கும்.</translation> <translation id="4425140285732600465">விலையைக் கண்காணிக்கிறது. எந்தத் தளத்திலாவது விலை குறைந்தால் அதுகுறித்து அறிவிப்பைப் பெறுவீர்கள்.</translation> <translation id="442518031075347249">உங்கள் விர்ச்சுவல் கார்டை Google Payயில் இனி பயன்படுத்த முடியாது. <ph name="BEGIN_LINK1" />விர்ச்சுவல் கார்டுகள் குறித்து மேலும் அறிக<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">விளம்பரப் பிரத்தியேகமாக்கல்</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">விளக்கத்தை பெறுவதை நிறுத்து</translation> <translation id="5966233851250124270">உங்கள் விருப்பத்தேர்வை Chrome நினைவில் வைத்திருக்கும்</translation> <translation id="5979084224081478209">கடவுச்சொற்களைச் சோதித்துப் பார்க்கவும்</translation> -<translation id="5985186846584605773">உங்கள் காருக்கு சுயவிவரப் பூட்டை உருவாக்குங்கள்</translation> <translation id="5995726099713306770">பக்கத்தை மீண்டும் பதிவிறக்கவா?</translation> <translation id="6000066717592683814">Googleஐ இயல்பு இன்ஜினாக வைத்திரு</translation> <translation id="6000203700195075278">மீண்டும் பின்தொடர்க</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">வரலாற்றிலிருந்து பரிந்துரையை அகற்றவா?</translation> <translation id="6380100320871303656">நீங்கள் பார்வையிடக்கூடும் என Chrome கணிக்கும் பக்கங்களைப் பெரும்பாலும் முன்கூட்டியே ஏற்றும். இந்த அமைப்பின் காரணமாக டேட்டா உபயோகம் அதிகரிக்கக்கூடும்.</translation> <translation id="6382848304055775421">பதிவேற்றுகிறது</translation> -<translation id="6391355955030242704">காரில் உங்கள் Chromeமை ஒத்திசைப்பதற்கும் உங்கள் தரவைப் பாதுகாப்பதற்கும் பாதுகாப்பு அமைப்புகளில் சுயவிவரப் பூட்டை உருவாக்க வேண்டும். காரின் டாஷ்போர்டைப் பயன்படுத்தும் போதெல்லாம் குறியீடு அல்லது கடவுச்சொல்லை நீங்கள் பயன்படுத்த வேண்டியிருக்கும்.</translation> <translation id="6394791151443660613">தேடு: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">இணைப்பு</translation> <translation id="6397616442223433927">இணைப்பு வந்துவிட்டது</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 038a81b..152c3ed 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
@@ -295,7 +295,6 @@ ప్రైవేట్ స్టేట్ టోకెన్లు వెబ్లో మెరుగైన గోప్యతను అందిస్తాయి, కానీ వీటిని ఉపయోగించి మీరు ఎవరు అనేది తెలుసుకోలేరు.</translation> <translation id="2581165646603367611">ఇది Chrome ముఖ్యమైనదిగా భావించని కుక్కీలు, కాష్, సైట్ల ఇతర డేటాను తీసివేస్తుంది.</translation> <translation id="2587052924345400782">సరికొత్త వెర్షన్ ఉంది</translation> -<translation id="2589302627584222634">ప్రొఫైల్ లాక్ను క్రియేట్ చేయండి</translation> <translation id="2593272815202181319">మోనోస్పేస్</translation> <translation id="2603212228005142861">మీ ప్రాధాన్యతలను మేనేజ్ చేయడానికి సైన్ ఇన్ చేయండి</translation> <translation id="260403163289591229">ఫాలో అవుతున్నారు</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ఇప్పుడు కాదు</translation> <translation id="3493531032208478708">సూచించిన కంటెంట్ గురించి <ph name="BEGIN_LINK" />మరింత తెలుసుకోండి<ph name="END_LINK" /></translation> <translation id="3495219333887281978">సైన్ ఇన్ చేయదగిన దిగువున ఉన్న షీట్ సగం మేరకు తెరవబడింది.</translation> -<translation id="3498338220321963224">ప్రొఫైల్ లాక్ తర్వాత తీసివేయబడినట్లయితే, మీరు సేవ్ చేసిన డేటా తొలగించబడుతుంది.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">పాతవాటిని సార్ట్ చేయి</translation> <translation id="3507132249039706973">స్టాండర్డ్ రక్షణ ఆన్లో ఉంది</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">మీ వర్చువల్ కార్డ్ను తీసివేయాలా?</translation> <translation id="4409271659088619928">మీ సెర్చ్ ఇంజిన్ <ph name="DSE" />. వర్తిస్తే, మీ సెర్చ్ హిస్టరీని తొలగించడానికి దాని సూచనలను చూడండి.</translation> <translation id="4415276339145661267">మీ Google ఖాతాను మేనేజ్ చేయండి</translation> -<translation id="4417111749295506837">కారులో మీ సమాచారాన్ని సింక్ చేసి, మీ Chrome డేటాను సురక్షితంగా ఉంచడానికి, మీరు తప్పనిసరిగా ప్రొఫైల్ లాక్ను క్రియేట్ చేయాలి. మీరు కారు ఎక్కిన ప్రతిసారి కోడ్ లేదా పాస్వర్డ్ను ఉపయోగిస్తారు.</translation> <translation id="4425140285732600465">ధరను ట్రాక్ చేయడం. ఏదైనా సైట్లో ధర తగ్గితే అలర్ట్లు పొందండి.</translation> <translation id="442518031075347249">Google Payతో మీ వర్చువల్ కార్డ్ను మీరు ఇకపై ఉపయోగించలేరు. <ph name="BEGIN_LINK1" />వర్చువల్ కార్డ్ల గురించి మరింత తెలుసుకోండి<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">యాడ్ వ్యక్తిగతీకరణ</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">ఇమేజ్ వివరణలను ఆపివేయి</translation> <translation id="5966233851250124270">Chrome మీ ఎంపికను గుర్తుంచుకుంటుంది</translation> <translation id="5979084224081478209">పాస్వర్డ్లను చెక్ చేయండి</translation> -<translation id="5985186846584605773">మీ కారు కోసం ఒక ప్రొఫైల్ లాక్ను క్రియేట్ చేయండి</translation> <translation id="5995726099713306770">పేజీని మళ్లీ డౌన్లోడ్ చేయాలనుకుంటున్నారా?</translation> <translation id="6000066717592683814">Googleని ఉంచు</translation> <translation id="6000203700195075278">మళ్లీ ఫాలో చేయి</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">హిస్టరీ నుండి సూచనను తీసివేయాలా?</translation> <translation id="6380100320871303656">మీరు సందర్శించే అవకాశం ఉందని Chrome భావించే పేజీలను మరింత తరచుగా ప్రీ - లోడ్ చేస్తుంది. ఈ సెట్టింగ్ వల్ల డేటా వినియోగం పెరిగే అవకాశం ఉంది.</translation> <translation id="6382848304055775421">ఎగుమతి అవుతున్నాయి</translation> -<translation id="6391355955030242704">కారులో మీ Chrome సమాచారాన్ని సింక్ చేసి, మీ డేటాను సురక్షితంగా ఉంచడానికి, మీరు సెక్యూరిటీ సెట్టింగ్లలో తప్పనిసరిగా ప్రొఫైల్ లాక్ను క్రియేట్ చేయాలి. మీరు కారు ఎక్కిన ప్రతిసారి కోడ్ లేదా పాస్వర్డ్ను ఉపయోగిస్తారు.</translation> <translation id="6394791151443660613">సెర్చ్ చేయండి: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">లింక్</translation> <translation id="6397616442223433927">తిరిగి ఆన్లైన్లోకి వచ్చింది</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 3f095d1f..6b42f217 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
@@ -295,7 +295,6 @@ โทเค็นสถานะส่วนตัวเพิ่มความเป็นส่วนตัวบนเว็บและไม่สามารถใช้เพื่อค้นหาว่าคุณคือใคร</translation> <translation id="2581165646603367611">การดำเนินการนี้จะล้างคุกกี้ แคช และข้อมูลอื่นๆ ของเว็บไซต์ที่ Chrome คิดว่าไม่สำคัญ</translation> <translation id="2587052924345400782">มีเวอร์ชันใหม่กว่าให้ใช้งาน</translation> -<translation id="2589302627584222634">สร้างการล็อกโปรไฟล์</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">ลงชื่อเข้าใช้เพื่อจัดการค่ากำหนด</translation> <translation id="260403163289591229">กำลังติดตาม</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ไม่ใช่ตอนนี้</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />ดูข้อมูลเพิ่มเติม<ph name="END_LINK" />เกี่ยวกับเนื้อหาที่แนะนำ</translation> <translation id="3495219333887281978">Bottom Sheet การลงชื่อเข้าใช้เปิดอยู่ครึ่งหน้าจอ</translation> -<translation id="3498338220321963224">ระบบจะลบข้อมูลที่คุณบันทึกไว้หากมีการนำการล็อกโปรไฟล์ออกในภายหลัง</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">จัดเรียงจากเก่าที่สุด</translation> <translation id="3507132249039706973">การปกป้องแบบมาตรฐานเปิดอยู่</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">นำบัตรเสมือนออกใช่ไหม</translation> <translation id="4409271659088619928">เครื่องมือค้นหาของคุณคือ <ph name="DSE" /> ดูวิธีลบประวัติการค้นหา (หากมี) ของเครื่องมือค้นหาที่คุณใช้</translation> <translation id="4415276339145661267">จัดการบัญชี Google</translation> -<translation id="4417111749295506837">หากต้องการซิงค์ข้อมูล Chrome และรักษาข้อมูลในรถให้ปลอดภัย คุณต้องสร้างการล็อกโปรไฟล์ จากนั้นจะต้องใช้รหัสหรือรหัสผ่านทุกครั้งที่ขึ้นรถ</translation> <translation id="4425140285732600465">กำลังติดตามราคา รับการแจ้งเตือนหากราคาลดลงในเว็บไซต์ใดก็ตาม</translation> <translation id="442518031075347249">คุณจะใช้บัตรเสมือนกับ Google Pay ไม่ได้อีกต่อไป <ph name="BEGIN_LINK1" />ดูข้อมูลเพิ่มเติมเกี่ยวกับบัตรเสมือน<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">การปรับโฆษณาตามโปรไฟล์ของผู้ใช้</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">หยุดรับคำอธิบายรูปภาพ</translation> <translation id="5966233851250124270">Chrome จะจดจำตัวเลือกของคุณ</translation> <translation id="5979084224081478209">ตรวจสอบรหัสผ่าน</translation> -<translation id="5985186846584605773">สร้างการล็อกโปรไฟล์สำหรับรถ</translation> <translation id="5995726099713306770">ดาวน์โหลดหน้าเว็บอีกครั้งใช่ไหม</translation> <translation id="6000066717592683814">ใช้ Google ต่อ</translation> <translation id="6000203700195075278">ติดตามอีกครั้ง</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">ต้องการนำคำแนะนำออกจากประวัติการเข้าชมใช่ไหม</translation> <translation id="6380100320871303656">โหลดหน้าที่ Chrome คิดว่าคุณอาจจะเข้าชมไว้ล่วงหน้าบ่อยขึ้น การตั้งค่านี้อาจทำให้ใช้อินเทอร์เน็ตมากขึ้น</translation> <translation id="6382848304055775421">กำลังส่งออก</translation> -<translation id="6391355955030242704">หากต้องการซิงค์ข้อมูล Chrome และรักษาข้อมูลในรถให้ปลอดภัย คุณต้องสร้างการล็อกโปรไฟล์ในการตั้งค่าความปลอดภัย จากนั้นจะต้องใช้รหัสหรือรหัสผ่านทุกครั้งที่ขึ้นรถ</translation> <translation id="6394791151443660613">ค้นหา: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ลิงก์</translation> <translation id="6397616442223433927">กลับมาออนไลน์แล้ว</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb index 495acc0..9ee4da6 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_tr.xtb
@@ -294,7 +294,6 @@ Gizlilik jetonları, web'deki gizliliği artırırken kim olduğunuzu bulmak için kullanılamaz.</translation> <translation id="2581165646603367611">Bu işlem Chrome'un önemli olmadığını düşündüğü çerezleri, önbelleği ve diğer site verilerini temizleyecek.</translation> <translation id="2587052924345400782">Daha yeni bir sürüm mevcut</translation> -<translation id="2589302627584222634">Profil kilidi oluştur</translation> <translation id="2593272815202181319">Eş aralıklı</translation> <translation id="2603212228005142861">Tercihlerinizi yönetmek için oturum açın</translation> <translation id="260403163289591229">Takip ediliyor:</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Şimdi değil</translation> <translation id="3493531032208478708">Önerilen içerik hakkında <ph name="BEGIN_LINK" />daha fazla bilgi edinin<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Oturum açma alt sayfası ekranın yarısına kadar açıldı.</translation> -<translation id="3498338220321963224">Profil kilidi daha sonra kaldırılırsa kayıtlı verileriniz silinir.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Eskiden yeniye sırala</translation> <translation id="3507132249039706973">Standart Koruma açık</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Sanal kartınız kaldırılsın mı?</translation> <translation id="4409271659088619928">Arama motorunuz <ph name="DSE" />. Arama geçmişinizi silmek için arama motorunuzun talimatlarını (varsa) inceleyin.</translation> <translation id="4415276339145661267">Google Hesabınızı yönetin</translation> -<translation id="4417111749295506837">Chrome bilgilerinizi senkronize etmek ve arabanızda verilerinizi güvende tutmak için bir profil kilidi oluşturmanız gerekir. Arabanıza her bindiğinizde bir kod veya şifre kullanırsınız.</translation> <translation id="4425140285732600465">Fiyat takip ediliyor. Herhangi bir sitedeki fiyat düşüşüyle ilgili uyarıları alın.</translation> <translation id="442518031075347249">Sanal kartınızı artık Google Pay'de kullanamazsınız. <ph name="BEGIN_LINK1" />Sanal kartlar hakkında daha fazla bilgi<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Reklam kişiselleştirme</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Resim açıklamasını durdur</translation> <translation id="5966233851250124270">Chrome seçiminizi hatırlar</translation> <translation id="5979084224081478209">Şifreleri kontrol et</translation> -<translation id="5985186846584605773">Arabanız için profil kilidi oluşturun</translation> <translation id="5995726099713306770">Sayfa tekrar indirilsin mi?</translation> <translation id="6000066717592683814">Google kalsın</translation> <translation id="6000203700195075278">Yeniden takip et</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Öneri geçmişten kaldırılsın mı?</translation> <translation id="6380100320871303656">Chrome'un ziyaret edebileceğinizi düşündüğü sayfaları daha sık önceden yükler. Bu ayar sonucunda veri kullanımı artabilir.</translation> <translation id="6382848304055775421">Dışa aktarılıyor</translation> -<translation id="6391355955030242704">Chrome bilgilerinizi senkronize etmek ve arabanızda verilerinizi güvende tutmak için güvenlik ayarlarınızdan bir profil kilidi oluşturmanız gerekir. Arabanıza her bindiğinizde bir kod veya şifre kullanırsınız.</translation> <translation id="6394791151443660613">Ara: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">BAĞLANTI</translation> <translation id="6397616442223433927">İnternete yeniden bağlanıldı</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 c39ba26..f956623 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
@@ -294,7 +294,6 @@ Такі маркери покращують вашу конфіденційність у мережі й не дають змоги вас ідентифікувати.</translation> <translation id="2581165646603367611">Буде видалено файли cookie, кеш та інші дані сайтів, які Chrome визначив як неважливі.</translation> <translation id="2587052924345400782">Доступна новіша версія</translation> -<translation id="2589302627584222634">Налаштувати блокування профілю</translation> <translation id="2593272815202181319">Однакової ширини</translation> <translation id="2603212228005142861">Увійдіть, щоб керувати налаштуваннями</translation> <translation id="260403163289591229">Підписки</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Не зараз</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Докладніше<ph name="END_LINK" /> про рекомендований контент</translation> <translation id="3495219333887281978">Нижній екран для входу відкрито на половину висоти.</translation> -<translation id="3498338220321963224">Якщо пізніше ви вимкнете блокування профілю, збережені дані буде видалено.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Сортувати за старішими</translation> <translation id="3507132249039706973">Стандартний захист увімкнено</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Вилучити віртуальну картку?</translation> <translation id="4409271659088619928">Ваша пошукова система – <ph name="DSE" />. Перегляньте її вказівки щодо того, як видалити історію пошуку (якщо вона є).</translation> <translation id="4415276339145661267">Керувати обліковим записом Google</translation> -<translation id="4417111749295506837">Щоб синхронізувати й захистити дані Chrome в автомобілі, потрібно створити код або пароль для блокування профілю. Ви будете вводити його щоразу, коли сідатимете в автомобіль.</translation> <translation id="4425140285732600465">Ціна відстежується. Отримуйте сповіщення, коли на якомусь сайті знизиться ціна.</translation> <translation id="442518031075347249">Ви більше не зможете використовувати цю віртуальну картку в Google Pay. <ph name="BEGIN_LINK1" />Докладніше про віртуальні картки<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Персоналізація реклами</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Не показувати описи</translation> <translation id="5966233851250124270">Chrome запам’ятає ваш вибір</translation> <translation id="5979084224081478209">Перевірити паролі</translation> -<translation id="5985186846584605773">Налаштуйте блокування профілю для свого автомобіля</translation> <translation id="5995726099713306770">Завантажити сторінку знову?</translation> <translation id="6000066717592683814">Залишити Google</translation> <translation id="6000203700195075278">Підписатися знову</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Вилучити пропозицію з історії?</translation> <translation id="6380100320871303656">Сторінки, які ви, імовірно, відвідаєте, частіше попередньо завантажуються. Через це налаштування може використовуватися більше даних.</translation> <translation id="6382848304055775421">Експортування</translation> -<translation id="6391355955030242704">Щоб синхронізувати й захистити дані Chrome в автомобілі, у налаштуваннях безпеки потрібно створити код або пароль для блокування профілю. Ви будете вводити його щоразу, коли сідатимете в автомобіль.</translation> <translation id="6394791151443660613">Пошук: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ПОСИЛАННЯ</translation> <translation id="6397616442223433927">З'єднання відновлено</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb index 51092aaf..7ebe5ac 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_ur.xtb
@@ -295,7 +295,6 @@ پرائیویٹ اسٹیٹ ٹوکنز ویب پر رازداری کو بہتر بناتے ہیں اور آپ کون ہیں یہ معلوم کرنے کے لیے استعمال نہیں کیے جا سکتے۔</translation> <translation id="2581165646603367611">یہ سائٹس کی کوکیز، کیش اور اس دیگر ڈیٹا کو صاف کر دے گی جسے Chrome اہم نہیں خیال کرتا ہے۔</translation> <translation id="2587052924345400782">جدید تر ورژن دستیاب ہے</translation> -<translation id="2589302627584222634">پروفائل لاک تخلیق کریں</translation> <translation id="2593272815202181319">مونو اسپیس</translation> <translation id="2603212228005142861">اپنی ترجیحات کا نظم کرنے کے لیے سائن ان کریں</translation> <translation id="260403163289591229">پیروی ہو رہی ہے</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">ابھی نہیں</translation> <translation id="3493531032208478708">تجویز کردہ مواد کے بارے میں <ph name="BEGIN_LINK" />مزید جانیں<ph name="END_LINK" /></translation> <translation id="3495219333887281978">سائن ان کرنے کے لیے نیچے کی شیٹ آدھی اونچائی پر کھلی ہوئی ہے۔</translation> -<translation id="3498338220321963224">اگر پروفائل لاک بعد میں ہٹا دیا جاتا ہے تو آپ کا محفوظ کردہ ڈیٹا مٹا دیا جائے گا۔</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">قدیم ترین کے لحاظ سے ترتیب دیں</translation> <translation id="3507132249039706973">معیاری تحفظ آن ہے</translation> @@ -651,7 +649,6 @@ <translation id="4405636711880428279">اپنا ورچوئل کارڈ ہٹائیں؟</translation> <translation id="4409271659088619928">آپ کا سرچ انجن <ph name="DSE" /> ہے۔ اگر قابل اطلاق ہو تو اپنی تلاش کی سرگزشت حذف کرنے کے لیے ان کی ہدایات دیکھیں۔</translation> <translation id="4415276339145661267">اپنے Google اکاؤنٹ کا نظم کریں</translation> -<translation id="4417111749295506837">اپنی Chrome کی معلومات کو مطابقت پذیر بنانے اور کار میں اپنے ڈیٹا کو محفوظ رکھنے کے لیے، آپ کو ایک پروفائل لاک تخلیق کرنا ہوگا۔ جب بھی آپ کار میں داخل ہوں گے آپ کو کوڈ یا پاس ورڈ استعمال کرنا ہوگا۔</translation> <translation id="4425140285732600465">قیمت ٹریک کی جا رہی ہے۔ کسی بھی سائٹ پر قیمت میں گراوٹ ہونے پر الرٹس حاصل کریں۔</translation> <translation id="442518031075347249">اب آپ Google Pay کے ساتھ اپنا ورچوئل کارڈ استعمال نہیں کر سکیں گے۔ <ph name="BEGIN_LINK1" />ورچوئل کارڈز کے بارے میں مزید جانیں<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">اشتہارات کو ذاتی نوعیت کا بنانا</translation> @@ -965,7 +962,6 @@ <translation id="5964869237734432770">تصویری تفصیلات کو روکیں</translation> <translation id="5966233851250124270">Chrome آپ کے انتخاب کو یاد رکھے گا</translation> <translation id="5979084224081478209">پاس ورڈز چیک کریں</translation> -<translation id="5985186846584605773">اپنی کار کے لیے پروفائل لاک تخلیق کریں</translation> <translation id="5995726099713306770">صفحے کو دوبارہ لوڈ کریں؟</translation> <translation id="6000066717592683814">Google کو رکھیں</translation> <translation id="6000203700195075278">دوبارہ پیروی کریں</translation> @@ -1034,7 +1030,6 @@ <translation id="6364438453358674297">سرگزشت سے تجویز ہٹائیں؟</translation> <translation id="6380100320871303656">جن صفحات کو Chrome کے خیال میں آپ ملاحظہ کر سکتے ہیں وہ زیادہ کثرت سے پیشگی لوڈ ہوتے ہیں۔ اس ترتیب کے نیتجے میں ڈیٹا کے استعمال میں اضافہ ہو سکتا ہے۔</translation> <translation id="6382848304055775421">برآمد کرنا</translation> -<translation id="6391355955030242704">اپنی Chrome کی معلومات کو مطابقت پذیر بنانے اور کار میں اپنے ڈیٹا کو محفوظ رکھنے کے لیے، آپ کو اپنی سیکیورٹی کی ترتیبات میں پروفائل لاک تخلیق کرنا ہوگا۔ جب بھی آپ کار میں داخل ہوں گے آپ کو کوڈ یا پاس ورڈ استعمال کرنا ہوگا۔</translation> <translation id="6394791151443660613">تلاش کریں: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">لنک</translation> <translation id="6397616442223433927">نیٹ ورک کنکشن بحال ہو گیا</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb index 3d0bcc1..ff426d7e 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_uz.xtb
@@ -294,7 +294,6 @@ Ishonch tokenlari Internetdagi maxfiylikni oshiradi va shaxsiy maʼlumotlaringizni aniqlash uchun ishlatilmaydi.</translation> <translation id="2581165646603367611">Chrome muhim emas deb hisoblaydigan cookie-fayllar, kesh va boshqa sayt ma’lumotlari o‘chiriladi.</translation> <translation id="2587052924345400782">Yangi versiyasi chiqdi.</translation> -<translation id="2589302627584222634">Profil qulfini yaratish</translation> <translation id="2593272815202181319">Bir xil kenglikdagi</translation> <translation id="2603212228005142861">Sozlamalarni belgilash uchun hisobga kiring</translation> <translation id="260403163289591229">Kuzatyapsiz</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Hozir emas</translation> <translation id="3493531032208478708">Bildirgi takliflar haqida <ph name="BEGIN_LINK" />batafsil ma’lumot<ph name="END_LINK" /></translation> <translation id="3495219333887281978">Kirish oynasi quyi ekranda yarim hajmda ochildi.</translation> -<translation id="3498338220321963224">Keyinroq profil qulfi olib tashlansa, saqlangan maʼlumotlar tozalanadi.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Avval eskilari asosida saralash</translation> <translation id="3507132249039706973">Standart himoya yoniq</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Virtual karta olib tashlansinmi?</translation> <translation id="4409271659088619928">Qidiruv tizimingiz: <ph name="DSE" />. Imkon boʻlsa, qidiruv tarixini qanday tozalash haqidagi koʻrsatmalarni oching.</translation> <translation id="4415276339145661267">Google hisobingizni boshqaring</translation> -<translation id="4417111749295506837">Chrome axborotini sinxronlash va maʼlumotlarni avtomobilda xavfsiz saqlash uchun profil qulfini yaratish lozim. Har safar avtomobilga kirishda kod yoki parol ishlatiladi.</translation> <translation id="4425140285732600465">Narxi kuzatiladi. Har qaysi saytda narxi tushganda xabar olish.</translation> <translation id="442518031075347249">Endi virtual kartangizni Google Pay bilan ishlata olmaysiz. <ph name="BEGIN_LINK1" />Virtual kartalar haqida batafsil<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Reklamalarni moslashtirish</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Rasm tavsiflari yuklanmasin</translation> <translation id="5966233851250124270">Chrome tanlovingizni eslab qoladi</translation> <translation id="5979084224081478209">Parollarni tekshiring</translation> -<translation id="5985186846584605773">Avtomobil uchun profil qulfini yaratish</translation> <translation id="5995726099713306770">Sahifa qayta yuklab olinsinmi?</translation> <translation id="6000066717592683814">Google qolaversin</translation> <translation id="6000203700195075278">Qayta obuna</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Bu taklif tarixdan o‘chirib tashlansinmi?</translation> <translation id="6380100320871303656">Aksariyat oldindan yuklanadigan sahifalar – Chrome sizni ularga kirishni istaydi, deb hisoblagan sahifalardir. Bu sozlama ortiqcha trafik sarfiga sabab boʻlishi mumkin.</translation> <translation id="6382848304055775421">Eksport qilinmoqda</translation> -<translation id="6391355955030242704">Chrome axborotini sinxronlash va maʼlumotlarni avtomobilda xavfsiz saqlash uchun xavfsizlik sozlamalari orqali profil qulfini yaratish lozim. Har safar avtomobilga kirishda kod yoki parol ishlatiladi.</translation> <translation id="6394791151443660613">Qidiruv: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">HAVOLA</translation> <translation id="6397616442223433927">Yana onlayndasiz</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb index 8f5f420..f567236 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_vi.xtb
@@ -294,7 +294,6 @@ Mã thông báo trạng thái riêng tư giúp cải thiện quyền riêng tư trên web và các bên sẽ không thể dùng mã này để tìm ra bạn là ai.</translation> <translation id="2581165646603367611">Thao tác này sẽ xóa cookie, bộ nhớ đệm và các dữ liệu khác của các trang web mà Chrome cho rằng không quan trọng.</translation> <translation id="2587052924345400782">Đã có phiên bản mới hơn</translation> -<translation id="2589302627584222634">Tạo khoá hồ sơ</translation> <translation id="2593272815202181319">Monospace</translation> <translation id="2603212228005142861">Đăng nhập để quản lý lựa chọn ưu tiên của bạn</translation> <translation id="260403163289591229">Đang theo dõi</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Để sau</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Tìm hiểu thêm<ph name="END_LINK" /> về nội dung đề xuất</translation> <translation id="3495219333887281978">Bảng đăng nhập ở dưới cùng mở ra trong nửa dưới màn hình.</translation> -<translation id="3498338220321963224">Dữ liệu bạn đã lưu sẽ bị xoá nếu sau này bạn xoá khoá hồ sơ.</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Cũ nhất xếp trước</translation> <translation id="3507132249039706973">Tính năng Bảo vệ thông thường đang bật</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Xoá thẻ ảo?</translation> <translation id="4409271659088619928">Bạn đang dùng công cụ tìm kiếm <ph name="DSE" />. Để xóa nhật ký tìm kiếm, hãy xem hướng dẫn (nếu có) của công cụ tìm kiếm đó.</translation> <translation id="4415276339145661267">Quản lý Tài khoản Google của bạn</translation> -<translation id="4417111749295506837">Để đồng bộ hoá thông tin trên Chrome và đảm bảo an toàn cho dữ liệu của bạn trong ô tô, bạn phải tạo khoá hồ sơ. Bạn sẽ sử dụng mã hoặc mật khẩu mỗi khi vào xe.</translation> <translation id="4425140285732600465">Đang theo dõi giá. Nhận thông báo nếu có chương trình giảm giá trên một trang web bất kỳ.</translation> <translation id="442518031075347249">Bạn sẽ không thể sử dụng thẻ ảo qua Google Pay được nữa. <ph name="BEGIN_LINK1" />Tìm hiểu thêm về thẻ ảo<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Cá nhân hoá quảng cáo</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Dừng lấy nội dung mô tả hình ảnh</translation> <translation id="5966233851250124270">Chrome sẽ ghi nhớ lựa chọn của bạn</translation> <translation id="5979084224081478209">Kiểm tra mật khẩu</translation> -<translation id="5985186846584605773">Tạo khoá hồ sơ cho ô tô</translation> <translation id="5995726099713306770">Tải trang xuống lần nữa?</translation> <translation id="6000066717592683814">Giữ Google làm công cụ tìm kiếm mặc định</translation> <translation id="6000203700195075278">Theo dõi lại</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Xóa đề xuất khỏi lịch sử?</translation> <translation id="6380100320871303656">Chrome sẽ thường xuyên tải trước các trang mà trình duyệt cho rằng bạn có thể sẽ truy cập. Chế độ cài đặt này có thể dẫn đến việc dùng dữ liệu nhiều hơn.</translation> <translation id="6382848304055775421">Đang xuất</translation> -<translation id="6391355955030242704">Để đồng bộ hoá thông tin trên Chrome và đảm bảo an toàn cho dữ liệu của bạn trong ô tô, bạn phải tạo khoá hồ sơ trong phần cài đặt bảo mật. Bạn sẽ sử dụng mã hoặc mật khẩu mỗi khi vào xe.</translation> <translation id="6394791151443660613">Tìm kiếm: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">LIÊN KẾT</translation> <translation id="6397616442223433927">Đã có kết nối mạng trở lại</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb index 47ba07b..a9a12137 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-CN.xtb
@@ -294,7 +294,6 @@ 私密状态令牌有助于加强网络隐私保护,而且不会泄露您的身份。</translation> <translation id="2581165646603367611">这会清除 Chrome 认为不重要的网站的 Cookie、缓存和其他数据。</translation> <translation id="2587052924345400782">新版本已推出</translation> -<translation id="2589302627584222634">设置个人资料锁定</translation> <translation id="2593272815202181319">等宽</translation> <translation id="2603212228005142861">登录以管理您的偏好设置</translation> <translation id="260403163289591229">已关注</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">以后再说</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />详细了解<ph name="END_LINK" />推荐内容</translation> <translation id="3495219333887281978">用于进行登录的底部工作表已半屏打开。</translation> -<translation id="3498338220321963224">如果您日后解除个人资料锁定,系统会清除保存的数据。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">按从旧到新排序</translation> <translation id="3507132249039706973">已开启标准保护</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">移除您的虚拟卡?</translation> <translation id="4409271659088619928">您所用的搜索引擎是<ph name="DSE" />。请查看它的相关说明,了解如何删除您的搜索记录(若适用)。</translation> <translation id="4415276339145661267">管理您的 Google 账号</translation> -<translation id="4417111749295506837">若要在车载系统中同步 Chrome 信息并确保数据安全,您必须设置个人资料锁定功能。之后,每当您上车时,系统都会要求您输入验证码或密码。</translation> <translation id="4425140285732600465">正在跟踪价格。当任一网站上的商品降价时,您会收到提醒。</translation> <translation id="442518031075347249">您将无法再通过 Google Pay 使用此虚拟卡。<ph name="BEGIN_LINK1" />详细了解虚拟卡<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">广告个性化</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">停止获取图片说明</translation> <translation id="5966233851250124270">Chrome 会记住您的选择</translation> <translation id="5979084224081478209">检查密码</translation> -<translation id="5985186846584605773">为车载系统设置个人资料锁定功能</translation> <translation id="5995726099713306770">再次下载此页面?</translation> <translation id="6000066717592683814">继续使用 Google</translation> <translation id="6000203700195075278">重新关注</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">要从历史记录中移除建议吗?</translation> <translation id="6380100320871303656">更频繁地预加载 Chrome 认为您可能会访问的网页。此设置可能会消耗更多数据流量。</translation> <translation id="6382848304055775421">正在导出</translation> -<translation id="6391355955030242704">若要在车载系统中同步 Chrome 信息并确保数据安全,您必须在安全设置中设置个人资料锁定功能。之后,每当您上车时,系统都会要求您输入验证码或密码。</translation> <translation id="6394791151443660613">搜索:<ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">链接</translation> <translation id="6397616442223433927">已恢复在线状态</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb index 7495e8d..7917085a 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-HK.xtb
@@ -294,7 +294,6 @@ Private State Token 能夠改善網絡上的私隱,而且系統無法透過信任憑證來識別您的身分。</translation> <translation id="2581165646603367611">這會清除 Chrome 認為不重要的網站內的 Cookie、快取和其他資料。</translation> <translation id="2587052924345400782">全新版本現已推出</translation> -<translation id="2589302627584222634">建立個人檔案鎖定</translation> <translation id="2593272815202181319">等寬</translation> <translation id="2603212228005142861">登入即可管理偏好設定</translation> <translation id="260403163289591229">追蹤中</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">略過</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />進一步瞭解<ph name="END_LINK" />建議的內容</translation> <translation id="3495219333887281978">登入頁底面板宜家顯示喺畫面下半部。</translation> -<translation id="3498338220321963224">如果之後移除個人檔案鎖定,系統會清除已儲存的資料。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">按最舊日期排序</translation> <translation id="3507132249039706973">已開啟「標準保護功能」</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">要移除虛擬卡嗎?</translation> <translation id="4409271659088619928">您的搜尋引擎是「<ph name="DSE" />」。建議您查看搜尋引擎的搜尋記錄刪除指示 (如有)。</translation> <translation id="4415276339145661267">管理您的 Google 帳戶</translation> -<translation id="4417111749295506837">如要在車上同步 Chrome 資料並確保資料安全,你必須建立個人檔案鎖定。每次進入汽車時,都需要輸入驗證碼或密碼。</translation> <translation id="4425140285732600465">正在追蹤價格。如果產品在任何網站上降價,系統將通知您。</translation> <translation id="442518031075347249">您將無法再透過 Google Pay 使用虛擬卡。<ph name="BEGIN_LINK1" />進一步瞭解虛擬卡<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">廣告個人化</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">停止取得圖片說明</translation> <translation id="5966233851250124270">Chrome 會記住您的選擇</translation> <translation id="5979084224081478209">檢查密碼</translation> -<translation id="5985186846584605773">為汽車建立個人檔案鎖定</translation> <translation id="5995726099713306770">要再次下載頁面嗎?</translation> <translation id="6000066717592683814">繼續使用 Google</translation> <translation id="6000203700195075278">重新追蹤</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">從記錄中移除建議項目嗎?</translation> <translation id="6380100320871303656">Chrome 會較頻密地預先載入 Chrome 您可能會瀏覽的頁面。此設定可能會提高數據用量。</translation> <translation id="6382848304055775421">匯出中</translation> -<translation id="6391355955030242704">如要在車上同步 Chrome 資料並確保資料安全,你必須在安全性設定中建立個人檔案鎖定。每次進入汽車時,都需要輸入驗證碼或密碼。</translation> <translation id="6394791151443660613">搜尋:<ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">連結</translation> <translation id="6397616442223433927">已重新連線</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb index 5583f8c..35eacb1 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zh-TW.xtb
@@ -295,7 +295,6 @@ 私密狀態權杖能進一步保護網路使用者的隱私,且無法用來識別個人身分。</translation> <translation id="2581165646603367611">這項操作會清除不重要的網站 Cookie、快取等其他資料 (Chrome 會自動判斷資料的重要性)。</translation> <translation id="2587052924345400782">已推出新版本</translation> -<translation id="2589302627584222634">建立設定檔鎖定</translation> <translation id="2593272815202181319">等寬</translation> <translation id="2603212228005142861">登入即可管理偏好設定</translation> <translation id="260403163289591229">追蹤中</translation> @@ -477,7 +476,6 @@ <translation id="3479552764303398839">現在不要</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />進一步瞭解<ph name="END_LINK" />建議的內容</translation> <translation id="3495219333887281978">登入底部功能表已開啟,顯示在畫面下半部。</translation> -<translation id="3498338220321963224">如果之後移除「設定檔鎖定」,系統會清除已儲存的資料。</translation> <translation id="3499246418971111862">chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">由舊到新排序</translation> <translation id="3507132249039706973">已啟用標準防護功能</translation> @@ -649,7 +647,6 @@ <translation id="4405636711880428279">要移除虛擬卡片嗎?</translation> <translation id="4409271659088619928">你的搜尋引擎是 <ph name="DSE" />。如要瞭解如何刪除搜尋記錄,請查看搜尋引擎的操作說明 (如果有的話)。</translation> <translation id="4415276339145661267">管理你的 Google 帳戶</translation> -<translation id="4417111749295506837">如要在車上同步處理 Chrome 資訊並保護資料安全,請建立「設定檔鎖定」。每次進入車輛時,都必須輸入驗證碼或密碼。</translation> <translation id="4425140285732600465">正在追蹤價格。如果產品在任何網站上降價,你會收到通知。</translation> <translation id="442518031075347249">你將無法再透過 Google Pay 使用虛擬卡片。<ph name="BEGIN_LINK1" />進一步瞭解虛擬卡片<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">廣告個人化</translation> @@ -961,7 +958,6 @@ <translation id="5964869237734432770">停止取得圖片說明</translation> <translation id="5966233851250124270">Chrome 會記住你的選擇</translation> <translation id="5979084224081478209">檢查密碼</translation> -<translation id="5985186846584605773">為車輛建立設定檔鎖定</translation> <translation id="5995726099713306770">要再次下載網頁嗎?</translation> <translation id="6000066717592683814">繼續使用 Google</translation> <translation id="6000203700195075278">重新追蹤</translation> @@ -1030,7 +1026,6 @@ <translation id="6364438453358674297">從歷史記錄中移除建議項目?</translation> <translation id="6380100320871303656">Chrome 會以更頻繁的次數預先載入你可能造訪的網頁。這項設定可能會提高數據用量。</translation> <translation id="6382848304055775421">匯出中</translation> -<translation id="6391355955030242704">如要在車上同步處理 Chrome 資訊並保護資料安全,請前往安全性設定建立「設定檔鎖定」。每次進入車輛時,都必須輸入驗證碼或密碼。</translation> <translation id="6394791151443660613">搜尋:<ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">連結</translation> <translation id="6397616442223433927">已恢復連線</translation>
diff --git a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb index 25e8a65..34b08fe 100644 --- a/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb +++ b/chrome/browser/ui/android/strings/translations/android_chrome_strings_zu.xtb
@@ -294,7 +294,6 @@ Amathokheni esimo esiyimfihlo athuthukisa ubumfihlo kuwebhu futhi awakwazi ukusetshenziselwa ukuthola ukuthi ungubani.</translation> <translation id="2581165646603367611">Lokhu kuzosusa amakhukhi, inqolobane, nenye idatha yamasayithi i-Chrome engacabangi ukuthi ibalulekile.</translation> <translation id="2587052924345400782">Inguqulo entsha iyatholakala</translation> -<translation id="2589302627584222634">Sungula ukukhiya iphrofayela</translation> <translation id="2593272815202181319">I-Monospace</translation> <translation id="2603212228005142861">Ngena ngemvume ukuze uphathe izintandokazi zakho</translation> <translation id="260403163289591229">Okulandelwayo</translation> @@ -476,7 +475,6 @@ <translation id="3479552764303398839">Hhayi manje</translation> <translation id="3493531032208478708"><ph name="BEGIN_LINK" />Funda kabanzi<ph name="END_LINK" /> mayelana nokuqukethwe okuphakamisiwe</translation> <translation id="3495219333887281978">Ishidi lokungena ngemvume eliphansi livulwe ngobude obuyisigamu.</translation> -<translation id="3498338220321963224">Idatha yakho elondoloziwe izosulwa uma ukukhiya kwephrofayela kususwa kamuva.</translation> <translation id="3499246418971111862">i-chrome_qrcode_<ph name="CURRENT_TIMESTAMP_MS" /></translation> <translation id="350276055892098337">Hlunga ngokudala kakhulu</translation> <translation id="3507132249039706973">Ukuvikelwa okujwayelekile kuvuliwe</translation> @@ -650,7 +648,6 @@ <translation id="4405636711880428279">Susa ikhadi lakho le-virtual?</translation> <translation id="4409271659088619928">Injini yakho yokusesha iyi-<ph name="DSE" />. Bona imiyalelo yabo yokusula umlando wakho wosesho, uma kusebenza.</translation> <translation id="4415276339145661267">Lawula i-akhawunti yakho ye-Google</translation> -<translation id="4417111749295506837">Ukuze uvumelanise ulwazi lwakho lwe-Chrome futhi ugcine idatha yakho iphephile emotweni, kufanele usungule ukukhiya kwephrofayela. Uzosebenzisa ikhodi noma iphasiwedi njalo uma ufaka imoto.</translation> <translation id="4425140285732600465">Ukulandelela intengo. Thola izexwayiso uma intengo yehla kunoma yiliphi isayithi.</translation> <translation id="442518031075347249">Ngeke usakwazi ukusebenzisa ikhadi lakho le-virtual nge-Google Pay. <ph name="BEGIN_LINK1" />Funda kabanzi ngamakhadi we-virtual<ph name="END_LINK1" /></translation> <translation id="4428065317363009941">Ukwenza ngezifiso izikhangiso</translation> @@ -962,7 +959,6 @@ <translation id="5964869237734432770">Misa izincazelo zesithombe</translation> <translation id="5966233851250124270">I-Chrome izokhumbula ukukhetha kwakho</translation> <translation id="5979084224081478209">Hlola amaphasiwedi</translation> -<translation id="5985186846584605773">Sungula isikhiya sephrofayela semoto yakho</translation> <translation id="5995726099713306770">Dawuniloda futhi ikhasi?</translation> <translation id="6000066717592683814">Gcina i-Google</translation> <translation id="6000203700195075278">Phinda ulandele</translation> @@ -1031,7 +1027,6 @@ <translation id="6364438453358674297">Susa isiphakamiso kusukela kumlando?</translation> <translation id="6380100320871303656">Iwalayisha kakhulu kusengaphambili amakhasi i-Chrome ecabanga ukuthi ungawavakashela. Leli sethingi lingase liphumele ekwenyukeni kokusetshenziswa kwedatha.</translation> <translation id="6382848304055775421">Iyakhipha</translation> -<translation id="6391355955030242704">Ukuze uvumelanise ulwazi lwakho futhi ugcine idatha yakho iphephile emotweni, kufanele usungule ukukhiya kwephrofayela kumasethingi akho okuphepha. Uzosebenzisa ikhodi noma iphasiwedi njalo uma ufaka imoto.</translation> <translation id="6394791151443660613">Sesha: <ph name="SEARCH_QUERY" /></translation> <translation id="6395288395575013217">ISIXHUMANISI</translation> <translation id="6397616442223433927">Usuxhunyiwe futhi ku-inthanethi</translation>
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client.cc b/chrome/browser/ui/autofill/chrome_autofill_client.cc index 6ed2444..9e4c108 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client.cc
@@ -124,6 +124,7 @@ #include "chrome/browser/ui/android/autofill/autofill_accessibility_utils.h" #include "chrome/browser/ui/android/autofill/autofill_logger_android.h" #include "chrome/browser/ui/android/autofill/autofill_save_card_bottom_sheet_bridge.h" +#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h" #include "chrome/browser/ui/android/autofill/card_expiration_date_fix_flow_view_android.h" #include "chrome/browser/ui/android/autofill/card_name_fix_flow_view_android.h" #include "chrome/browser/ui/android/infobars/autofill_credit_card_filling_infobar.h" @@ -792,8 +793,8 @@ DCHECK(options.show_prompt); AutofillSaveCardUiInfo ui_info = AutofillSaveCardUiInfo::CreateForLocalSave(options, card); - auto save_card_delegate = - std::make_unique<AutofillSaveCardDelegate>(std::move(callback), options); + auto save_card_delegate = std::make_unique<AutofillSaveCardDelegateAndroid>( + std::move(callback), options, web_contents()); if (base::FeatureList::IsEnabled( features::kAutofillEnablePaymentsAndroidBottomSheet)) { if (auto* bridge = GetOrCreateAutofillSaveCardBottomSheetBridge()) { @@ -833,8 +834,8 @@ identity_manager->GetPrimaryAccountInfo(signin::ConsentLevel::kSignin)); AutofillSaveCardUiInfo ui_info = AutofillSaveCardUiInfo::CreateForUploadSave( options, card, legal_message_lines, account_info); - auto save_card_delegate = - std::make_unique<AutofillSaveCardDelegate>(std::move(callback), options); + auto save_card_delegate = std::make_unique<AutofillSaveCardDelegateAndroid>( + std::move(callback), options, web_contents()); if (base::FeatureList::IsEnabled( features::kAutofillEnablePaymentsAndroidBottomSheet)) { if (auto* bridge = GetOrCreateAutofillSaveCardBottomSheetBridge()) {
diff --git a/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc b/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc index 28d72f2..ca4b5025 100644 --- a/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc +++ b/chrome/browser/ui/autofill/chrome_autofill_client_unittest.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/fast_checkout/fast_checkout_client_impl.h" #include "chrome/browser/fast_checkout/fast_checkout_features.h" #include "chrome/browser/plus_addresses/plus_address_service_factory.h" +#include "chrome/browser/ui/android/autofill/autofill_save_card_delegate_android.h" #include "chrome/test/base/chrome_render_view_host_test_harness.h" #include "components/autofill/content/browser/test_autofill_client_injector.h" #include "components/autofill/content/browser/test_autofill_driver_injector.h" @@ -49,7 +50,7 @@ MOCK_METHOD(void, RequestShowContent, (const AutofillSaveCardUiInfo&, - std::unique_ptr<AutofillSaveCardDelegate>), + std::unique_ptr<AutofillSaveCardDelegateAndroid>), (override)); }; #endif
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index 146d8ac9..aa976aad 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h
@@ -604,13 +604,7 @@ // expense, you *may* first call `CanShowFeaturePromo()` before doing the // required computation; otherwise just call this method. virtual user_education::FeaturePromoResult MaybeShowFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::BubbleCloseCallback - close_callback = base::DoNothing(), - user_education::FeaturePromoSpecification::FormatParameters body_params = - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::FormatParameters title_params = - user_education::FeaturePromoSpecification::NoSubstitution()) = 0; + user_education::FeaturePromoParams params) = 0; // Maybe shows an in-product help promo at startup, whenever the Feature // Engagement system is fully initialized. If the promo cannot be queued for @@ -627,15 +621,7 @@ // If your promo is not likely to be shown at browser startup, prefer using // MaybeShowFeaturePromo() - which always runs synchronously - instead. virtual bool MaybeShowStartupFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::StartupPromoCallback - promo_callback = base::DoNothing(), - user_education::FeaturePromoController::BubbleCloseCallback - close_callback = base::DoNothing(), - user_education::FeaturePromoSpecification::FormatParameters body_params = - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::FormatParameters title_params = - user_education::FeaturePromoSpecification::NoSubstitution()) = 0; + user_education::FeaturePromoParams params) = 0; // Closes the in-product help promo for `iph_feature` if it is showing or // cancels a pending startup promo; returns true if a promo bubble was
diff --git a/chrome/browser/ui/download/download_display.cc b/chrome/browser/ui/download/download_display.cc new file mode 100644 index 0000000..9167a97 --- /dev/null +++ b/chrome/browser/ui/download/download_display.cc
@@ -0,0 +1,19 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/download/download_display.h" + +#include <tuple> + +bool DownloadDisplay::ProgressInfo::operator==( + const ProgressInfo& other) const { + return std::tie(progress_percentage, download_count, progress_certain) == + std::tie(other.progress_percentage, other.download_count, + other.progress_certain); +} + +bool DownloadDisplay::ProgressInfo::operator!=( + const ProgressInfo& other) const { + return !operator==(other); +}
diff --git a/chrome/browser/ui/download/download_display.h b/chrome/browser/ui/download/download_display.h index 86db5362..25a1418 100644 --- a/chrome/browser/ui/download/download_display.h +++ b/chrome/browser/ui/download/download_display.h
@@ -46,6 +46,9 @@ int progress_percentage = 0; // Whether we know the final size of all downloads. bool progress_certain = true; + + bool operator==(const ProgressInfo& other) const; + bool operator!=(const ProgressInfo& other) const; }; // Shows the download display.
diff --git a/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc b/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc index 57f4254..dc2cf3b 100644 --- a/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc +++ b/chrome/browser/ui/passwords/credential_manager_dialog_controller_impl.cc
@@ -12,11 +12,11 @@ #include "chrome/browser/ui/passwords/ui_utils.h" #include "chrome/grit/branded_strings.h" #include "chrome/grit/generated_resources.h" -#include "components/device_reauth/device_authenticator.h" #include "components/password_manager/core/browser/password_bubble_experiment.h" #include "components/password_manager/core/browser/password_feature_manager.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_manager_metrics_util.h" +#include "components/password_manager/core/browser/password_sync_util.h" #include "components/password_manager/core/browser/password_ui_utils.h" #include "components/password_manager/core/common/password_manager_pref_names.h" #include "components/prefs/pref_service.h" @@ -112,7 +112,7 @@ bool CredentialManagerDialogControllerImpl::ShouldShowFooter() const { const syncer::SyncService* sync_service = SyncServiceFactory::GetForProfile(profile_); - return password_bubble_experiment::HasChosenToSyncPasswords(sync_service); + return password_manager::sync_util::IsPasswordSyncEnabled(sync_service); } void CredentialManagerDialogControllerImpl::OnChooseCredentials(
diff --git a/chrome/browser/ui/passwords/manage_passwords_test.cc b/chrome/browser/ui/passwords/manage_passwords_test.cc index caf6bf31..1ca0acc 100644 --- a/chrome/browser/ui/passwords/manage_passwords_test.cc +++ b/chrome/browser/ui/passwords/manage_passwords_test.cc
@@ -239,9 +239,9 @@ autofill::FormData observed_form; observed_form.url = password_form_.url; autofill::FormFieldData field; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; observed_form.fields.push_back(field); - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; observed_form.fields.push_back(field); auto form_manager = std::make_unique<PasswordFormManager>(
diff --git a/chrome/browser/ui/quick_answers/quick_answers_state_ash.cc b/chrome/browser/ui/quick_answers/quick_answers_state_ash.cc index 1f835e54..4428d9c 100644 --- a/chrome/browser/ui/quick_answers/quick_answers_state_ash.cc +++ b/chrome/browser/ui/quick_answers/quick_answers_state_ash.cc
@@ -34,6 +34,8 @@ } // namespace QuickAnswersStateAsh::QuickAnswersStateAsh() { + shell_observation_.Observe(ash::Shell::Get()); + auto* session_controller = ash::Shell::Get()->session_controller(); CHECK(session_controller); @@ -61,6 +63,7 @@ void QuickAnswersStateAsh::OnShellDestroying() { session_observation_.Reset(); + shell_observation_.Reset(); } void QuickAnswersStateAsh::RegisterPrefChanges(PrefService* pref_service) {
diff --git a/chrome/browser/ui/quick_answers/quick_answers_state_ash.h b/chrome/browser/ui/quick_answers/quick_answers_state_ash.h index 4b72a0b..57b29718 100644 --- a/chrome/browser/ui/quick_answers/quick_answers_state_ash.h +++ b/chrome/browser/ui/quick_answers/quick_answers_state_ash.h
@@ -15,6 +15,7 @@ namespace ash { class SessionController; +class Shell; } // namespace ash // A class that holds Quick Answers related prefs and states. @@ -61,6 +62,9 @@ base::ScopedObservation<ash::SessionController, ash::SessionObserver> session_observation_{this}; + + base::ScopedObservation<ash::Shell, ash::ShellObserver> shell_observation_{ + this}; }; #endif // CHROME_BROWSER_UI_QUICK_ANSWERS_QUICK_ANSWERS_STATE_ASH_H_
diff --git a/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc b/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc index 76b6ce7e..c60ccfe 100644 --- a/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc +++ b/chrome/browser/ui/views/commerce/price_tracking_icon_view.cc
@@ -205,10 +205,11 @@ if (!browser_->window() || !ShouldShowFirstUseExperienceBubble()) { return false; } - return browser_->window()->MaybeShowFeaturePromo( - feature_engagement::kIPHPriceTrackingChipFeature, - base::BindOnce(&PriceTrackingIconView::UnpauseAnimation, - base::Unretained(this))); + user_education::FeaturePromoParams params( + feature_engagement::kIPHPriceTrackingChipFeature); + params.close_callback = base::BindOnce( + &PriceTrackingIconView::UnpauseAnimation, base::Unretained(this)); + return browser_->window()->MaybeShowFeaturePromo(std::move(params)); } void PriceTrackingIconView::ForceVisibleForTesting(bool is_tracking_price) {
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc index 2f476ce8..4b2ec2a 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
@@ -244,6 +244,8 @@ } void DownloadToolbarButtonView::PaintButtonContents(gfx::Canvas* canvas) { + redraw_progress_soon_ = false; + // Do not show the progress ring when there is no in progress download. if (progress_info_.download_count == 0) { if (scanning_animation_.is_animating()) { @@ -327,6 +329,9 @@ } void DownloadToolbarButtonView::UpdateIconProgress(const ProgressInfo& info) { + if (progress_info_ != info) { + redraw_progress_soon_ = true; + } progress_info_ = info; } @@ -423,7 +428,9 @@ return; // Schedule paint to update the progress ring. - SchedulePaint(); + if (redraw_progress_soon_) { + SchedulePaint(); + } const gfx::VectorIcon* new_icon; SkColor icon_color = GetIconColor();
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h index 4f85cd4..fb181783 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.h
@@ -207,6 +207,9 @@ // Parameters determining how the progress ring should be drawn. ProgressInfo progress_info_; + // Whether we have a new progress_info_ and need to redraw the button. + bool redraw_progress_soon_ = false; + // Marks whether there is a pending download started animation. This is needed // because the animation should only be triggered after the view has been // laid out properly, so this provides a way to remember to show the animation
diff --git a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc index dd9ac6d..a53ddea 100644 --- a/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc +++ b/chrome/browser/ui/views/extensions/extensions_toolbar_container.cc
@@ -1036,10 +1036,11 @@ if (extensions_controls_->request_access_button()->GetVisible()) { const int extensions_size = extensions_controls_->request_access_button()->GetExtensionsCount(); - browser_->window()->MaybeShowFeaturePromo( - feature_engagement::kIPHExtensionsRequestAccessButtonFeature, - /*close_callback=*/base::DoNothing(), /*body_params=*/extensions_size, - /*title_params=*/extensions_size); + user_education::FeaturePromoParams params( + feature_engagement::kIPHExtensionsRequestAccessButtonFeature); + params.body_params = extensions_size; + params.title_params = extensions_size; + browser_->window()->MaybeShowFeaturePromo(std::move(params)); } if (extensions_controls_->extensions_button()->state() ==
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 85ad903..41376bb2 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -4890,15 +4890,12 @@ } user_education::FeaturePromoResult BrowserView::MaybeShowFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::BubbleCloseCallback close_callback, - user_education::FeaturePromoSpecification::FormatParameters body_params, - user_education::FeaturePromoSpecification::FormatParameters title_params) { + user_education::FeaturePromoParams params) { // Trying to show a promo before the browser is initialized can result in a // failure to retrieve accelerators, which can cause issues for screen reader // users. if (!initialized_) { - LOG(ERROR) << "Attempting to show IPH " << iph_feature.name + LOG(ERROR) << "Attempting to show IPH " << params.feature->name << " before browser initialization; IPH will not be shown."; return user_education::FeaturePromoResult::kError; } @@ -4907,20 +4904,13 @@ return user_education::FeaturePromoResult::kBlockedByContext; } - return feature_promo_controller_->MaybeShowPromo( - iph_feature, std::move(close_callback), body_params, title_params); + return feature_promo_controller_->MaybeShowPromo(std::move(params)); } bool BrowserView::MaybeShowStartupFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::StartupPromoCallback promo_callback, - user_education::FeaturePromoController::BubbleCloseCallback close_callback, - user_education::FeaturePromoSpecification::FormatParameters body_params, - user_education::FeaturePromoSpecification::FormatParameters title_params) { + user_education::FeaturePromoParams params) { return feature_promo_controller_ && - feature_promo_controller_->MaybeShowStartupPromo( - iph_feature, std::move(promo_callback), std::move(close_callback), - body_params, title_params); + feature_promo_controller_->MaybeShowStartupPromo(std::move(params)); } bool BrowserView::CloseFeaturePromo(
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index b858387..f6251860 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -646,23 +646,9 @@ user_education::FeaturePromoResult CanShowFeaturePromo( const base::Feature& iph_feature) const override; user_education::FeaturePromoResult MaybeShowFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::BubbleCloseCallback - close_callback = base::DoNothing(), - user_education::FeaturePromoSpecification::FormatParameters body_params = - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::FormatParameters title_params = - user_education::FeaturePromoSpecification::NoSubstitution()) override; + user_education::FeaturePromoParams params) override; bool MaybeShowStartupFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::StartupPromoCallback - promo_callback = base::DoNothing(), - user_education::FeaturePromoController::BubbleCloseCallback - close_callback = base::DoNothing(), - user_education::FeaturePromoSpecification::FormatParameters body_params = - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::FormatParameters title_params = - user_education::FeaturePromoSpecification::NoSubstitution()) override; + user_education::FeaturePromoParams params) override; bool CloseFeaturePromo( const base::Feature& iph_feature, user_education::FeaturePromoCloseReason close_reason) override;
diff --git a/chrome/browser/ui/views/frame/browser_view_layout.cc b/chrome/browser/ui/views/frame/browser_view_layout.cc index ab36dd2..b032148d 100644 --- a/chrome/browser/ui/views/frame/browser_view_layout.cc +++ b/chrome/browser/ui/views/frame/browser_view_layout.cc
@@ -98,7 +98,8 @@ } gfx::Point GetDialogPosition(const gfx::Size& size) override { - views::View* view = browser_view_layout_->top_container_; + // Horizontally places the dialog at the center of the content. + views::View* view = browser_view_layout_->contents_container_; gfx::Rect rect = view->ConvertRectToWidget(view->GetLocalBounds()); const int middle_x = rect.x() + rect.width() / 2; const int top = browser_view_layout_->dialog_top_y_;
diff --git a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_icon_view.cc b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_icon_view.cc index e944ce01..8321237 100644 --- a/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_icon_view.cc +++ b/chrome/browser/ui/views/location_bar/cookie_controls/cookie_controls_icon_view.cc
@@ -136,30 +136,34 @@ // Need to make element visible or calls to show IPH will fail. SetVisible(true); // IPH for UB on high-confidence site. - if (confidence_ == CookieControlsBreakageConfidenceLevel::kHigh && - browser_->window()->MaybeShowFeaturePromo( - feature_engagement::kIPHCookieControlsFeature, - base::BindOnce(&CookieControlsIconView::OnIPHClosed, - weak_ptr_factory_.GetWeakPtr()))) { - SetHighlighted(true); - return true; + if (confidence_ == CookieControlsBreakageConfidenceLevel::kHigh) { + user_education::FeaturePromoParams params( + feature_engagement::kIPHCookieControlsFeature); + params.close_callback = base::BindOnce(&CookieControlsIconView::OnIPHClosed, + weak_ptr_factory_.GetWeakPtr()); + if (browser_->window()->MaybeShowFeaturePromo(std::move(params))) { + SetHighlighted(true); + return true; + } } - auto* web_contents = delegate()->GetWebContentsForPageActionIconView(); + auto* const web_contents = delegate()->GetWebContentsForPageActionIconView(); if (!web_contents) { return false; } - Profile* profile = + Profile* const profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); // IPH for UB in 3PCD experiment. if (TrackingProtectionSettingsFactory::GetForProfile(profile) - ->IsTrackingProtection3pcdEnabled() && - browser_->window()->MaybeShowFeaturePromo( - feature_engagement::kIPH3pcdUserBypassFeature, - base::BindOnce(&CookieControlsIconView::OnIPHClosed, - weak_ptr_factory_.GetWeakPtr()))) { - SetHighlighted(true); - return true; + ->IsTrackingProtection3pcdEnabled()) { + user_education::FeaturePromoParams params( + feature_engagement::kIPH3pcdUserBypassFeature); + params.close_callback = base::BindOnce(&CookieControlsIconView::OnIPHClosed, + weak_ptr_factory_.GetWeakPtr()); + if (browser_->window()->MaybeShowFeaturePromo(std::move(params))) { + SetHighlighted(true); + return true; + } } return false; }
diff --git a/chrome/browser/ui/views/location_bar/location_bar_view.cc b/chrome/browser/ui/views/location_bar/location_bar_view.cc index ed1305a..0200731 100644 --- a/chrome/browser/ui/views/location_bar/location_bar_view.cc +++ b/chrome/browser/ui/views/location_bar/location_bar_view.cc
@@ -1604,6 +1604,8 @@ View::GetColorProvider()->GetColor(kColorOmniboxResultsIcon), View::GetColorProvider()->GetColor( kColorOmniboxResultsStarterPackIcon), + View::GetColorProvider()->GetColor( + kColorOmniboxAnswerIconGM3Foreground), std::move(on_icon_fetched), dark_mode) : ui::ImageModel(); }
diff --git a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc index 7272d1e..62b0b1e 100644 --- a/chrome/browser/ui/views/omnibox/omnibox_result_view.cc +++ b/chrome/browser/ui/views/omnibox/omnibox_result_view.cc
@@ -659,8 +659,9 @@ } if (OmniboxFieldTrial::IsActionsUISimplificationEnabled() && - match_.type != AutocompleteMatchType::STARTER_PACK) { - // When `kOmniboxActionsUISimplification` is enabled, (non-starter pack) + (match_.type == AutocompleteMatchType::HISTORY_CLUSTER || + match_.type == AutocompleteMatchType::PEDAL)) { + // When `kOmniboxActionsUISimplification` is enabled, pedal and journeys // vector icons will need a distinctive foreground color in order to stand // out against the blue square background they are painted upon. vector_icon_color_id = kColorOmniboxAnswerIconGM3Foreground;
diff --git a/chrome/browser/ui/views/page_action/pwa_install_view.cc b/chrome/browser/ui/views/page_action/pwa_install_view.cc index 34aa5d6..ccb0c7b 100644 --- a/chrome/browser/ui/views/page_action/pwa_install_view.cc +++ b/chrome/browser/ui/views/page_action/pwa_install_view.cc
@@ -128,12 +128,15 @@ // that view is set to visible but not drawn in fullscreen mode. if (is_probably_promotable && ShouldShowIph(web_contents, manager) && IsDrawn()) { - const bool iph_shown = browser_->window()->MaybeShowFeaturePromo( - feature_engagement::kIPHDesktopPwaInstallFeature, - base::BindOnce(&PwaInstallView::OnIphClosed, - weak_ptr_factory_.GetWeakPtr()), - webapps::AppBannerManager::GetInstallableWebAppName(web_contents)); - if (iph_shown) { + user_education::FeaturePromoParams params( + feature_engagement::kIPHDesktopPwaInstallFeature); + params.close_callback = base::BindOnce(&PwaInstallView::OnIphClosed, + weak_ptr_factory_.GetWeakPtr()); + params.body_params = + webapps::AppBannerManager::GetInstallableWebAppName(web_contents); + const user_education::FeaturePromoResult iph_result = + browser_->window()->MaybeShowFeaturePromo(std::move(params)); + if (iph_result) { // Reset the iph flag when it's shown again. install_icon_clicked_after_iph_shown_ = false; SetHighlighted(true);
diff --git a/chrome/browser/ui/views/page_info/page_info_bubble_view_dialog_browsertest.cc b/chrome/browser/ui/views/page_info/page_info_bubble_view_dialog_browsertest.cc index 8a53d28..42e761a 100644 --- a/chrome/browser/ui/views/page_info/page_info_bubble_view_dialog_browsertest.cc +++ b/chrome/browser/ui/views/page_info/page_info_bubble_view_dialog_browsertest.cc
@@ -38,6 +38,7 @@ #include "components/safe_browsing/content/browser/password_protection/password_protection_test_util.h" #include "components/safe_browsing/core/browser/password_protection/metrics_util.h" #include "components/safe_browsing/core/common/features.h" +#include "components/strings/grit/components_strings.h" #include "components/webapps/common/web_app_id.h" #include "content/public/common/content_features.h" #include "content/public/test/browser_test.h" @@ -46,6 +47,7 @@ #include "net/test/embedded_test_server/embedded_test_server.h" #include "net/test/test_certificate_data.h" #include "net/test/test_data_directory.h" +#include "ui/base/l10n/l10n_util.h" #include "ui/events/test/test_event.h" #include "url/gurl.h" #include "url/origin.h" @@ -688,6 +690,7 @@ kOff = 0, kOnTemporaryExceptions = 1, kOnPermanentExceptions = 2, + kOn3pcdCookiesLimited = 3, }; class PageInfoBubbleViewCookiesSubpageBrowserTest @@ -713,6 +716,10 @@ enabled_features.push_back({content_settings::features::kUserBypassUI, {{"expiration", "0d"}}}); break; + case UserBypassFeatureState::kOn3pcdCookiesLimited: + enabled_features.push_back( + {content_settings::features::kTrackingProtection3pcd, {{}}}); + break; } feature_list_.InitWithFeaturesAndParameters(enabled_features, disabled_features); @@ -822,6 +829,33 @@ // Removing the focus as with tests run in parallel it causes different // outputs. bubble_view->GetFocusManager()->SetFocusedView(nullptr); + + auto third_party_cookies_title = + cookies_subpage_content->third_party_cookies_title_->GetText(); + auto third_party_cookies_description = + cookies_subpage_content->third_party_cookies_description_->GetText(); + if (cookie_info.status != CookieControlsStatus::kDisabled && + cookie_info.status != CookieControlsStatus::kEnabled) { + if (presenter->IsTrackingProtection3pcdEnabled()) { + EXPECT_EQ( + third_party_cookies_title, + l10n_util::GetPluralStringFUTF16( + IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_LIMITING_RESTART_TITLE, + 30)); + EXPECT_EQ( + third_party_cookies_description, + l10n_util::GetStringUTF16( + IDS_PAGE_INFO_COOKIES_TRACKING_PROTECTION_COOKIES_RESTART_DESCRIPTION)); + } else { + EXPECT_EQ(third_party_cookies_title, + l10n_util::GetPluralStringFUTF16( + IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_TITLE, 30)); + EXPECT_EQ( + third_party_cookies_description, + l10n_util::GetStringUTF16( + IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_DESCRIPTION_TODAY)); + } + } } private: @@ -865,13 +899,18 @@ InvokeUi_CookiesSubpageFpsManaged3pcAllowed) { ShowAndVerifyUi(); } +IN_PROC_BROWSER_TEST_P(PageInfoBubbleViewCookiesSubpageBrowserTest, + InvokeUi_CookiesSubpageFpsTrackingProtection3pcd) { + ShowAndVerifyUi(); +} INSTANTIATE_TEST_SUITE_P( /*no prefix*/, PageInfoBubbleViewCookiesSubpageBrowserTest, testing::ValuesIn({UserBypassFeatureState::kOff, UserBypassFeatureState::kOnTemporaryExceptions, - UserBypassFeatureState::kOnPermanentExceptions})); + UserBypassFeatureState::kOnPermanentExceptions, + UserBypassFeatureState::kOn3pcdCookiesLimited})); class PageInfoBubbleViewIsolatedWebAppBrowserTest : public DialogBrowserTest { public:
diff --git a/chrome/browser/ui/views/page_info/page_info_cookies_content_view.cc b/chrome/browser/ui/views/page_info/page_info_cookies_content_view.cc index b71f87c4..e3ab0f8 100644 --- a/chrome/browser/ui/views/page_info/page_info_cookies_content_view.cc +++ b/chrome/browser/ui/views/page_info/page_info_cookies_content_view.cc
@@ -281,18 +281,25 @@ : presenter_->IsTrackingProtection3pcdEnabled() ? IDS_PAGE_INFO_TRACKING_PROTECTION_SITE_NOT_WORKING_DESCRIPTION_TEMPORARY : IDS_PAGE_INFO_COOKIES_SITE_NOT_WORKING_DESCRIPTION_TEMPORARY); - } else { - title = is_permanent_exception - ? l10n_util::GetStringUTF16( - IDS_PAGE_INFO_COOKIES_PERMANENT_ALLOWED_TITLE) - : l10n_util::GetPluralStringFUTF16( - IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_TITLE, - CookieControlsUtil::GetDaysToExpiration( - cookie_info.expiration)); + } else if (is_permanent_exception) { + title = l10n_util::GetStringUTF16( + IDS_PAGE_INFO_COOKIES_PERMANENT_ALLOWED_TITLE); description = l10n_util::GetStringUTF16( - is_permanent_exception - ? IDS_PAGE_INFO_COOKIES_PERMANENT_ALLOWED_DESCRIPTION - : IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_DESCRIPTION_TODAY); + IDS_PAGE_INFO_COOKIES_PERMANENT_ALLOWED_DESCRIPTION); + } else if (presenter_->IsTrackingProtection3pcdEnabled()) { + title = l10n_util::GetPluralStringFUTF16( + presenter_->AreAllThirdPartyCookiesBlocked() + ? IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_3PC_BLOCKED_RESTART_TITLE + : IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_LIMITING_RESTART_TITLE, + CookieControlsUtil::GetDaysToExpiration(cookie_info.expiration)); + description = l10n_util::GetStringUTF16( + IDS_PAGE_INFO_COOKIES_TRACKING_PROTECTION_COOKIES_RESTART_DESCRIPTION); + } else { + title = l10n_util::GetPluralStringFUTF16( + IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_TITLE, + CookieControlsUtil::GetDaysToExpiration(cookie_info.expiration)); + description = l10n_util::GetStringUTF16( + IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_DESCRIPTION_TODAY); } third_party_cookies_title_->SetText(title); third_party_cookies_description_->SetText(description);
diff --git a/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h b/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h index 7f84a482..c77c044 100644 --- a/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h +++ b/chrome/browser/ui/views/page_info/page_info_cookies_content_view.h
@@ -45,6 +45,7 @@ private: friend class PageInfoCookiesContentViewTest; + friend class PageInfoBubbleViewCookiesSubpageBrowserTest; // Ensures the allowed sites information UI is present, with placeholder // information if necessary.
diff --git a/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc b/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc index 9daae81..d4f26188 100644 --- a/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc +++ b/chrome/browser/ui/views/profiles/profile_picker_interactive_uitest.cc
@@ -124,14 +124,6 @@ }; } - void SimulateUserActivation() { - content::UpdateUserActivationStateInterceptor user_activation_interceptor( - web_contents()->GetPrimaryMainFrame()); - user_activation_interceptor.UpdateUserActivationState( - blink::mojom::UserActivationUpdateType::kNotifyActivation, - blink::mojom::UserActivationNotificationType::kTest); - } - StateChange Exists(const DeepQuery& where) { DEFINE_LOCAL_CUSTOM_ELEMENT_EVENT_TYPE(kElementExistsEvent); StateChange state_change; @@ -357,10 +349,10 @@ .last_committed_entry_index = 1})), // Focus the window to ensure the keyboard shortcut reaches it. - Do([&] { SimulateUserActivation(); }), + FocusWebContents(kPickerWebContentsId), // Navigate back with the keyboard. - SendAccelerator(kProfilePickerViewId, GetAccelerator(IDC_BACK)), + SendAccelerator(kPickerWebContentsId, GetAccelerator(IDC_BACK)), CheckResult(HasPendingNav(), IsTrue(), /*check_description=*/"HasPendingNav"), WaitForStateChange(kPickerWebContentsId,
diff --git a/chrome/browser/ui/views/user_education/browser_feature_promo_controller_interactive_uitest.cc b/chrome/browser/ui/views/user_education/browser_feature_promo_controller_interactive_uitest.cc index e117205..681ec845 100644 --- a/chrome/browser/ui/views/user_education/browser_feature_promo_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/browser_feature_promo_controller_interactive_uitest.cc
@@ -137,8 +137,10 @@ .Times(0); } + user_education::FeaturePromoParams params(iph_feature); + params.close_callback = std::move(callback); if (expected_result != - promo_controller_->MaybeShowPromo(iph_feature, std::move(callback))) { + promo_controller_->MaybeShowPromo(std::move(params))) { LOG(ERROR) << "MaybeShowPromo() didn't return expected result."; return false; }
diff --git a/chrome/browser/ui/views/user_education/browser_feature_promo_controller_unittest.cc b/chrome/browser/ui/views/user_education/browser_feature_promo_controller_unittest.cc index ec01e63..eaeb6ad 100644 --- a/chrome/browser/ui/views/user_education/browser_feature_promo_controller_unittest.cc +++ b/chrome/browser/ui/views/user_education/browser_feature_promo_controller_unittest.cc
@@ -189,6 +189,18 @@ } protected: + user_education::FeaturePromoParams MakeParams( + const base::Feature& feature, + user_education::FeaturePromoController::BubbleCloseCallback + close_callback, + user_education::FeaturePromoController::StartupPromoCallback + startup_callback = base::NullCallback()) { + user_education::FeaturePromoParams params(feature); + params.close_callback = std::move(close_callback); + params.startup_callback = std::move(startup_callback); + return params; + } + FeaturePromoStorageService* storage_service() { return controller_->storage_service(); } @@ -293,8 +305,8 @@ UNCALLED_MOCK_CALLBACK(BubbleCloseCallback, close_callback); - EXPECT_FALSE( - controller_->MaybeShowPromo(kTestIPHFeature, close_callback.Get())); + EXPECT_FALSE(controller_->MaybeShowPromo( + MakeParams(kTestIPHFeature, close_callback.Get()))); EXPECT_FALSE(controller_->IsPromoActive(kTestIPHFeature)); EXPECT_FALSE(GetPromoBubble()); } @@ -310,7 +322,8 @@ EXPECT_CALL_IN_SCOPE( callback, Run(Ref(kTestIPHFeature), FeaturePromoResult(FeaturePromoResult::kError)), - controller_->MaybeShowStartupPromo(kTestIPHFeature, callback.Get())); + controller_->MaybeShowStartupPromo( + MakeParams(kTestIPHFeature, base::DoNothing(), callback.Get()))); } TEST_F(BrowserFeaturePromoControllerTest, @@ -354,10 +367,10 @@ UNCALLED_MOCK_CALLBACK(FeaturePromoController::StartupPromoCallback, callback); - EXPECT_CALL_IN_SCOPE(callback, - Run(Ref(kTestIPHFeature), FeaturePromoResult::Success()), - EXPECT_TRUE(controller_->MaybeShowStartupPromo( - kTestIPHFeature, callback.Get()))); + EXPECT_CALL_IN_SCOPE( + callback, Run(Ref(kTestIPHFeature), FeaturePromoResult::Success()), + EXPECT_TRUE(controller_->MaybeShowStartupPromo( + MakeParams(kTestIPHFeature, base::DoNothing(), callback.Get())))); EXPECT_EQ(FeaturePromoStatus::kBubbleShowing, controller_->GetPromoStatus(kTestIPHFeature)); EXPECT_TRUE(GetPromoBubble()); @@ -382,8 +395,8 @@ UNCALLED_MOCK_CALLBACK(FeaturePromoController::StartupPromoCallback, callback); - EXPECT_TRUE( - controller_->MaybeShowStartupPromo(kTestIPHFeature, callback.Get())); + EXPECT_TRUE(controller_->MaybeShowStartupPromo( + MakeParams(kTestIPHFeature, base::DoNothing(), callback.Get()))); EXPECT_EQ(FeaturePromoStatus::kQueuedForStartup, controller_->GetPromoStatus(kTestIPHFeature)); EXPECT_CALL_IN_SCOPE( @@ -415,8 +428,8 @@ UNCALLED_MOCK_CALLBACK(FeaturePromoController::StartupPromoCallback, callback); - EXPECT_TRUE( - controller_->MaybeShowStartupPromo(kTestIPHFeature, callback.Get())); + EXPECT_TRUE(controller_->MaybeShowStartupPromo( + MakeParams(kTestIPHFeature, base::DoNothing(), callback.Get()))); EXPECT_EQ(FeaturePromoStatus::kQueuedForStartup, controller_->GetPromoStatus(kTestIPHFeature)); EXPECT_CALL_IN_SCOPE(callback, @@ -668,8 +681,8 @@ EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(0); UNCALLED_MOCK_CALLBACK(BubbleCloseCallback, close_callback); - ASSERT_TRUE( - controller_->MaybeShowPromo(kTestIPHFeature, close_callback.Get())); + ASSERT_TRUE(controller_->MaybeShowPromo( + MakeParams(kTestIPHFeature, close_callback.Get()))); // Only valid before the widget is closed. auto* const bubble = GetPromoBubble(); @@ -717,8 +730,8 @@ EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(0); UNCALLED_MOCK_CALLBACK(BubbleCloseCallback, close_callback); - ASSERT_TRUE( - controller_->MaybeShowPromo(kTestIPHFeature, close_callback.Get())); + ASSERT_TRUE(controller_->MaybeShowPromo( + MakeParams(kTestIPHFeature, close_callback.Get()))); // Only valid before the widget is closed. auto* const bubble = GetPromoBubble(); @@ -745,8 +758,8 @@ EXPECT_CALL(*mock_tracker_, Dismissed(Ref(kTestIPHFeature))).Times(0); UNCALLED_MOCK_CALLBACK(BubbleCloseCallback, close_callback); - ASSERT_TRUE( - controller_->MaybeShowPromo(kTestIPHFeature, close_callback.Get())); + ASSERT_TRUE(controller_->MaybeShowPromo( + MakeParams(kTestIPHFeature, close_callback.Get()))); // Only valid before the widget is closed. auto* const bubble = GetPromoBubble(); @@ -934,8 +947,8 @@ .WillOnce(Return(true)); UNCALLED_MOCK_CALLBACK(BubbleCloseCallback, close_callback); - EXPECT_TRUE( - controller_->MaybeShowPromo(kTestIPHFeature, close_callback.Get())); + EXPECT_TRUE(controller_->MaybeShowPromo( + MakeParams(kTestIPHFeature, close_callback.Get()))); EXPECT_TRUE(controller_->IsPromoActive(kTestIPHFeature)); EXPECT_TRUE(GetPromoBubble()); @@ -1222,25 +1235,26 @@ }); } - template <typename... Args> - auto MaybeShowPromo(Args... args) { - return Check([this, args...]() { + auto MaybeShowPromo(user_education::FeaturePromoParams params) { + return Check([this, p = std::move(params)]() mutable { EXPECT_CALL(*mock_tracker_, ShouldTriggerHelpUI(Ref(kStringTestIPHFeature))) .WillOnce(Return(FeaturePromoResult::Success())); - return static_cast<bool>(controller_->MaybeShowPromo( - kStringTestIPHFeature, base::DoNothing(), args...)); + return static_cast<bool>(controller_->MaybeShowPromo(std::move(p))); }); } }; TEST_F(BrowserFeaturePromoControllerViewsTest, BodyTextSubstitution_SingleString) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.body_params = kSubstitution1; + RunTestSequenceInContext( browser_view()->GetElementContext(), RegisterPromo(kStringWithSingleSubstitution), - MaybeShowPromo(kSubstitution1), + MaybeShowPromo(std::move(params)), CheckViewProperty(user_education::HelpBubbleView::kBodyTextIdForTesting, &views::Label::GetText, l10n_util::GetStringFUTF16( @@ -1249,12 +1263,15 @@ TEST_F(BrowserFeaturePromoControllerViewsTest, BodyTextSubstitution_MultipleStrings) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.body_params = + user_education::FeaturePromoSpecification::StringSubstitutions{ + kSubstitution1, kSubstitution2, kSubstitution3}; + RunTestSequenceInContext( browser_view()->GetElementContext(), RegisterPromo(kStringWithMultipleSubstitutions), - MaybeShowPromo( - user_education::FeaturePromoSpecification::StringSubstitutions{ - kSubstitution1, kSubstitution2, kSubstitution3}), + MaybeShowPromo(std::move(params)), CheckViewProperty(user_education::HelpBubbleView::kBodyTextIdForTesting, &views::Label::GetText, l10n_util::GetStringFUTF16( @@ -1263,9 +1280,13 @@ } TEST_F(BrowserFeaturePromoControllerViewsTest, BodyTextSubstitution_Singular) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.body_params = 1; + RunTestSequenceInContext( browser_view()->GetElementContext(), - RegisterPromo(kStringWithPluralSubstitution), MaybeShowPromo(1), + RegisterPromo(kStringWithPluralSubstitution), + MaybeShowPromo(std::move(params)), CheckViewProperty( user_education::HelpBubbleView::kBodyTextIdForTesting, &views::Label::GetText, @@ -1273,9 +1294,13 @@ } TEST_F(BrowserFeaturePromoControllerViewsTest, BodyTextSubstitution_Plural) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.body_params = 3; + RunTestSequenceInContext( browser_view()->GetElementContext(), - RegisterPromo(kStringWithPluralSubstitution), MaybeShowPromo(3), + RegisterPromo(kStringWithPluralSubstitution), + MaybeShowPromo(std::move(params)), CheckViewProperty( user_education::HelpBubbleView::kBodyTextIdForTesting, &views::Label::GetText, @@ -1284,12 +1309,13 @@ TEST_F(BrowserFeaturePromoControllerViewsTest, TitleTextSubstitution_SingleString) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.title_params = kSubstitution1; + RunTestSequenceInContext( browser_view()->GetElementContext(), RegisterPromo(IDS_OK, kStringWithSingleSubstitution), - MaybeShowPromo( - user_education::FeaturePromoSpecification::NoSubstitution(), - kSubstitution1), + MaybeShowPromo(std::move(params)), CheckViewProperty(user_education::HelpBubbleView::kTitleTextIdForTesting, &views::Label::GetText, l10n_util::GetStringFUTF16( @@ -1298,13 +1324,15 @@ TEST_F(BrowserFeaturePromoControllerViewsTest, TitleTextSubstitution_MultipleStrings) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.title_params = + user_education::FeaturePromoSpecification::StringSubstitutions{ + kSubstitution1, kSubstitution2, kSubstitution3}; + RunTestSequenceInContext( browser_view()->GetElementContext(), RegisterPromo(IDS_OK, kStringWithMultipleSubstitutions), - MaybeShowPromo( - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::StringSubstitutions{ - kSubstitution1, kSubstitution2, kSubstitution3}), + MaybeShowPromo(std::move(params)), CheckViewProperty(user_education::HelpBubbleView::kTitleTextIdForTesting, &views::Label::GetText, l10n_util::GetStringFUTF16( @@ -1313,11 +1341,13 @@ } TEST_F(BrowserFeaturePromoControllerViewsTest, TitleTextSubstitution_Singular) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.title_params = 1; + RunTestSequenceInContext( browser_view()->GetElementContext(), RegisterPromo(IDS_OK, kStringWithPluralSubstitution), - MaybeShowPromo( - user_education::FeaturePromoSpecification::NoSubstitution(), 1), + MaybeShowPromo(std::move(params)), CheckViewProperty( user_education::HelpBubbleView::kTitleTextIdForTesting, &views::Label::GetText, @@ -1325,11 +1355,13 @@ } TEST_F(BrowserFeaturePromoControllerViewsTest, TitleTextSubstitution_Plural) { + user_education::FeaturePromoParams params(kStringTestIPHFeature); + params.title_params = 3; + RunTestSequenceInContext( browser_view()->GetElementContext(), RegisterPromo(IDS_OK, kStringWithPluralSubstitution), - MaybeShowPromo( - user_education::FeaturePromoSpecification::NoSubstitution(), 3), + MaybeShowPromo(std::move(params)), CheckViewProperty( user_education::HelpBubbleView::kTitleTextIdForTesting, &views::Label::GetText,
diff --git a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc index 3d2671d..bfffa38 100644 --- a/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/feature_promo_dialog_interactive_uitest.cc
@@ -140,8 +140,9 @@ EXPECT_CALL(*mock_tracker, ShouldTriggerHelpUI(Ref(*feature_))) .Times(1) .WillOnce(Return(true)); - ASSERT_TRUE(promo_controller->MaybeShowPromo( - *feature_, base::DoNothing(), GetReplacementsForFeature(*feature_))); + user_education::FeaturePromoParams params(*feature_); + params.body_params = GetReplacementsForFeature(*feature_); + ASSERT_TRUE(promo_controller->MaybeShowPromo(std::move(params))); } private:
diff --git a/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc b/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc index c060a509..f1602415 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_qr_sheet_view.cc
@@ -168,5 +168,5 @@ label->SetAllowCharacterBreak(true); label->SetHorizontalAlignment(gfx::HorizontalAlignment::ALIGN_LEFT); } - return std::make_pair(std::move(container), AutoFocus::kYes); + return std::make_pair(std::move(container), AutoFocus::kNo); }
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc index 1c0b7088..54511a0f 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.cc
@@ -19,10 +19,8 @@ #include "components/web_modal/web_contents_modal_dialog_manager_delegate.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/metadata/metadata_impl_macros.h" -#include "ui/gfx/geometry/insets.h" #include "ui/views/controls/button/label_button.h" #include "ui/views/controls/button/md_text_button.h" -#include "ui/views/layout/box_layout.h" #include "ui/views/layout/fill_layout.h" // static @@ -100,14 +98,22 @@ SetButtonLabel(ui::DIALOG_BUTTON_CANCEL, sheet_->model()->GetCancelButtonLabel()); - // Whether to show the `Choose another option` button, or other dialog - // configuration is delegated to the |sheet_|, and the new sheet likely wants - // to provide a new configuration. - other_mechanisms_button_->SetVisible(ShouldOtherMechanismsButtonBeVisible()); - other_mechanisms_button_->SetText( - sheet_->model()->GetOtherMechanismButtonLabel()); - manage_devices_button_->SetVisible( - sheet_->model()->IsManageDevicesButtonVisible()); + if (ShouldOtherMechanismsButtonBeVisible()) { + SetExtraView(std::make_unique<views::MdTextButton>( + base::BindRepeating( + &AuthenticatorRequestDialogView::OtherMechanismsButtonPressed, + base::Unretained(this)), + sheet_->model()->GetOtherMechanismButtonLabel())); + } else if (sheet_->model()->IsManageDevicesButtonVisible()) { + SetExtraView(std::make_unique<views::MdTextButton>( + base::BindRepeating( + &AuthenticatorRequestDialogView::ManageDevicesButtonPressed, + base::Unretained(this)), + l10n_util::GetStringUTF16(IDS_WEBAUTHN_MANAGE_DEVICES))); + } else { + SetExtraView(std::make_unique<views::View>()); + } + DialogModelChanged(); // If the widget is not yet shown or already being torn down, we are done. In @@ -199,7 +205,7 @@ } if (ShouldOtherMechanismsButtonBeVisible()) { - return other_mechanisms_button_; + return GetExtraView(); } if (sheet()->model()->IsCancelButtonVisible()) { @@ -265,27 +271,6 @@ DCHECK(!model_->should_dialog_be_closed()); model_->AddObserver(this); - // This View contains buttons that can appear at the bottom left of the - // dialog. Only a single button is expected to be visible at a time so the - // padding between them is zero. - auto hbox = std::make_unique<views::View>(); - hbox->SetLayoutManager(std::make_unique<views::BoxLayout>( - views::BoxLayout::Orientation::kHorizontal, gfx::Insets(), 0)); - - other_mechanisms_button_ = new views::MdTextButton(base::BindRepeating( - &AuthenticatorRequestDialogView::OtherMechanismsButtonPressed, - base::Unretained(this))); - hbox->AddChildView(other_mechanisms_button_.get()); - - manage_devices_button_ = new views::MdTextButton( - base::BindRepeating( - &AuthenticatorRequestDialogView::ManageDevicesButtonPressed, - base::Unretained(this)), - l10n_util::GetStringUTF16(IDS_WEBAUTHN_MANAGE_DEVICES)); - hbox->AddChildView(manage_devices_button_.get()); - - SetExtraView(std::move(hbox)); - SetCloseCallback( base::BindOnce(&AuthenticatorRequestDialogView::OnDialogClosing, base::Unretained(this)));
diff --git a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h index e41ebe10..fdb0392 100644 --- a/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h +++ b/chrome/browser/ui/views/webauthn/authenticator_request_dialog_view.h
@@ -22,10 +22,6 @@ class AuthenticatorRequestDialogViewTestApi; } -namespace views { -class MdTextButton; -} - class AuthenticatorRequestSheetView; // A tab-modal dialog shown while a Web Authentication API request is active. @@ -109,8 +105,6 @@ raw_ptr<AuthenticatorRequestDialogModel> model_; raw_ptr<AuthenticatorRequestSheetView, DanglingUntriaged> sheet_ = nullptr; - raw_ptr<views::MdTextButton> other_mechanisms_button_ = nullptr; - raw_ptr<views::View> manage_devices_button_ = nullptr; std::unique_ptr<views::MenuRunner> other_mechanisms_menu_runner_; bool first_shown_ = false;
diff --git a/chrome/browser/ui/webui/ash/login/network_screen_handler.cc b/chrome/browser/ui/webui/ash/login/network_screen_handler.cc index b6cbb69..bdcb7a3 100644 --- a/chrome/browser/ui/webui/ash/login/network_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/network_screen_handler.cc
@@ -4,19 +4,14 @@ #include "chrome/browser/ui/webui/ash/login/network_screen_handler.h" -#include <stddef.h> - -#include <utility> - #include "base/values.h" #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" #include "chrome/browser/ash/login/screens/network_screen.h" -#include "chrome/browser/ash/login/startup_utils.h" #include "chrome/browser/ui/webui/ash/cellular_setup/cellular_setup_localized_strings_provider.h" #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/network/network_handler.h" -#include "chromeos/ash/components/network/technology_state_controller.h" #include "components/login/localized_values_builder.h" +#include "ui/chromeos/devicetype_utils.h" #include "ui/chromeos/strings/network/network_element_localized_strings_provider.h" namespace ash { @@ -26,23 +21,7 @@ NetworkScreenHandler::~NetworkScreenHandler() = default; void NetworkScreenHandler::Show() { - // In OOBE all physical network technologies should be enabled, so the user is - // able to select any of the available networks on the device. Enabled - // technologies should not be changed if network screen is shown outside of - // OOBE. - // If OOBE is not completed, we assume that the only instance of this object - // could be OOBE itself. - if (!StartupUtils::IsOobeCompleted()) { - TechnologyStateController* controller = - NetworkHandler::Get()->technology_state_controller(); - controller->SetTechnologiesEnabled(NetworkTypePattern::Physical(), true, - network_handler::ErrorCallback()); - } - - base::Value::Dict data; - data.Set("isDemoModeSetup", - DemoSetupController::IsOobeDemoSetupFlowInProgress()); - ShowInWebUI(std::move(data)); + ShowInWebUI(); } void NetworkScreenHandler::ShowError(const std::u16string& message) { @@ -55,8 +34,10 @@ void NetworkScreenHandler::DeclareLocalizedValues( ::login::LocalizedValuesBuilder* builder) { - builder->Add("networkSectionTitle", IDS_NETWORK_SELECTION_TITLE); - builder->Add("networkSectionHint", IDS_NETWORK_SELECTION_HINT); + builder->AddF("networkSectionTitle", IDS_NETWORK_SELECTION_TITLE, + ui::GetChromeOSDeviceName()); + builder->AddF("networkSectionSubtitle", IDS_NETWORK_SELECTION_SUBTITLE, + ui::GetChromeOSDeviceName()); builder->Add("proxySettingsListItemName", IDS_NETWORK_PROXY_SETTINGS_LIST_ITEM_NAME); builder->Add("addWiFiListItemName", IDS_NETWORK_ADD_WI_FI_LIST_ITEM_NAME);
diff --git a/chrome/browser/ui/webui/ash/login/network_screen_handler.h b/chrome/browser/ui/webui/ash/login/network_screen_handler.h index c6d620f3..0a0b317 100644 --- a/chrome/browser/ui/webui/ash/login/network_screen_handler.h +++ b/chrome/browser/ui/webui/ash/login/network_screen_handler.h
@@ -47,13 +47,12 @@ ~NetworkScreenHandler() override; - void SetQuickStartEnabled() override; - private: // NetworkScreenView: void Show() override; void ShowError(const std::u16string& message) override; void ClearErrors() override; + void SetQuickStartEnabled() override; // BaseScreenHandler: void DeclareLocalizedValues(
diff --git a/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc b/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc index 39b7347..c43204c9 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/about/about_section.cc
@@ -498,7 +498,8 @@ base::UTF8ToUTF16(safetyInfoLink)); #endif - if (kIsRevampEnabled) { + // Crostini subsection exists only when OsSettingsRevampWayfinding is enabled. + if (crostini_subsection_) { crostini_subsection_->AddLoadTimeData(html_source); } } @@ -510,7 +511,8 @@ web_ui->AddMessageHandler(std::make_unique<DeviceNameHandler>()); } - if (ash::features::IsOsSettingsRevampWayfindingEnabled()) { + // Crostini subsection exists only when OsSettingsRevampWayfinding is enabled. + if (crostini_subsection_) { crostini_subsection_->AddHandlers(web_ui); } } @@ -546,10 +548,6 @@ generator->RegisterTopLevelSetting(mojom::Setting::kDiagnostics); generator->RegisterTopLevelSetting(mojom::Setting::kFirmwareUpdates); - if (ash::features::IsOsSettingsRevampWayfindingEnabled()) { - crostini_subsection_->RegisterHierarchy(generator); - } - // Detailed build info. generator->RegisterTopLevelSubpage( IDS_SETTINGS_ABOUT_PAGE_DETAILED_BUILD_INFO, @@ -561,6 +559,10 @@ mojom::Setting::kCopyDetailedBuildInfo}; RegisterNestedSettingBulk(mojom::Subpage::kDetailedBuildInfo, kDetailedBuildInfoSettings, generator); + + if (crostini_subsection_) { + crostini_subsection_->RegisterHierarchy(generator); + } } bool AboutSection::ShouldShowAUToggle(user_manager::User* active_user) {
diff --git a/chrome/browser/ui/webui/ash/settings/pages/apps/apps_section.cc b/chrome/browser/ui/webui/ash/settings/pages/apps/apps_section.cc index f4d88be..1bbda90 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/apps/apps_section.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/apps/apps_section.cc
@@ -502,7 +502,8 @@ AddPluginVmLoadTimeData(html_source); AddBorealisStrings(html_source); - if (!kIsRevampEnabled) { + // Startup subsection exists only when OsSettingsRevampWayfinding is disabled. + if (startup_subsection_) { startup_subsection_->AddLoadTimeData(html_source); } } @@ -616,7 +617,8 @@ mojom::SearchResultDefaultRank::kMedium, mojom::kArcVmUsbPreferencesSubpagePath); - if (!ash::features::IsOsSettingsRevampWayfindingEnabled()) { + // Startup subsection exists only when OsSettingsRevampWayfinding is disabled. + if (startup_subsection_) { startup_subsection_->RegisterHierarchy(generator); } }
diff --git a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc index 504293a..5eefdd59 100644 --- a/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc +++ b/chrome/browser/ui/webui/chrome_web_ui_controller_factory.cc
@@ -77,6 +77,7 @@ #include "chromeos/ash/components/scalable_iph/scalable_iph_constants.h" #include "components/commerce/content/browser/commerce_internals_ui.h" #include "components/commerce/core/commerce_constants.h" +#include "components/compose/core/browser/compose_features.h" #include "components/favicon/core/favicon_service.h" #include "components/favicon_base/favicon_util.h" #include "components/favicon_base/select_favicon_frames.h" @@ -146,6 +147,7 @@ #include "chrome/browser/ui/webui/bookmarks/bookmarks_ui.h" #include "chrome/browser/ui/webui/commander/commander_ui.h" #include "chrome/browser/ui/webui/commerce/shopping_insights_side_panel_ui.h" +#include "chrome/browser/ui/webui/compose/compose_ui.h" #include "chrome/browser/ui/webui/devtools_ui.h" #include "chrome/browser/ui/webui/downloads/downloads_ui.h" #include "chrome/browser/ui/webui/feedback/feedback_ui.h" @@ -770,6 +772,10 @@ if (url.host_piece() == chrome::kChromeUIWebuiGalleryHost) { return &NewWebUI<WebuiGalleryUI>; } + if (url.host_piece() == chrome::kChromeUIComposeHost && + base::FeatureList::IsEnabled(compose::features::kEnableCompose)) { + return &NewWebUI<ComposeUI>; + } if (url.host_piece() == chrome::kChromeUIWhatsNewHost && base::FeatureList::IsEnabled(features::kChromeWhatsNewUI)) { return &NewWebUI<WhatsNewUI>;
diff --git a/chrome/browser/ui/webui/compose/OWNERS b/chrome/browser/ui/webui/compose/OWNERS new file mode 100644 index 0000000..48a4b667 --- /dev/null +++ b/chrome/browser/ui/webui/compose/OWNERS
@@ -0,0 +1 @@ +file://components/compose/OWNERS
diff --git a/chrome/browser/ui/webui/compose/compose_ui.cc b/chrome/browser/ui/webui/compose/compose_ui.cc new file mode 100644 index 0000000..4264eda --- /dev/null +++ b/chrome/browser/ui/webui/compose/compose_ui.cc
@@ -0,0 +1,26 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/webui/compose/compose_ui.h" + +#include "chrome/browser/profiles/profile.h" +#include "chrome/browser/ui/webui/webui_util.h" +#include "chrome/common/webui_url_constants.h" +#include "chrome/grit/compose_resources.h" +#include "chrome/grit/compose_resources_map.h" +#include "content/public/browser/web_ui.h" +#include "content/public/browser/web_ui_data_source.h" + +ComposeUI::ComposeUI(content::WebUI* web_ui) : ui::MojoWebUIController(web_ui) { + content::WebUIDataSource* source = content::WebUIDataSource::CreateAndAdd( + Profile::FromWebUI(web_ui), chrome::kChromeUIComposeHost); + webui::SetupWebUIDataSource( + source, base::make_span(kComposeResources, kComposeResourcesSize), + IDR_COMPOSE_COMPOSE_HTML); + webui::SetupChromeRefresh2023(source); +} + +ComposeUI::~ComposeUI() = default; + +WEB_UI_CONTROLLER_TYPE_IMPL(ComposeUI)
diff --git a/chrome/browser/ui/webui/compose/compose_ui.h b/chrome/browser/ui/webui/compose/compose_ui.h new file mode 100644 index 0000000..a7b4452 --- /dev/null +++ b/chrome/browser/ui/webui/compose/compose_ui.h
@@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_WEBUI_COMPOSE_COMPOSE_UI_H_ +#define CHROME_BROWSER_UI_WEBUI_COMPOSE_COMPOSE_UI_H_ + +#include "content/public/browser/web_ui_controller.h" +#include "ui/webui/mojo_web_ui_controller.h" + +class ComposeUI : public ui::MojoWebUIController { + public: + explicit ComposeUI(content::WebUI* web_ui); + ComposeUI(const ComposeUI&) = delete; + ComposeUI& operator=(const ComposeUI&) = delete; + ~ComposeUI() override; + + private: + WEB_UI_CONTROLLER_TYPE_DECL(); +}; + +#endif // CHROME_BROWSER_UI_WEBUI_COMPOSE_COMPOSE_UI_H_
diff --git a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc index 9167e45..5bd3bf1 100644 --- a/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc +++ b/chrome/browser/ui/webui/settings/settings_localized_strings_provider.cc
@@ -3277,9 +3277,9 @@ "trackingProtectionBulletTwoDescription", l10n_util::GetStringFUTF16( IDS_SETTINGS_TRACKING_PROTECTION_BULLET_TWO_DESCRIPTION, - base::ASCIIToUTF16(chrome::kTrackingProtectionHelpCenterURL))); + base::ASCIIToUTF16(chrome::kUserBypassHelpCenterURL))); html_source->AddString("trackingProtectionThirdPartyCookiesLearnMoreUrl", - chrome::kUserBypassHelpCenterURL); + chrome::kManage3pcHelpCenterURL); // These ones cannot be constexpr because we need to check base::FeatureList. static webui::LocalizedString kSensorsLocalizedStrings[] = {
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc index 896d9a3c..e74d1a4f 100644 --- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler.cc
@@ -10,7 +10,6 @@ #include "base/metrics/histogram_macros.h" #include "base/metrics/user_metrics.h" #include "base/metrics/user_metrics_action.h" -#include "chrome/browser/browser_features.h" #include "chrome/browser/manta/manta_service_factory.h" #include "chrome/browser/manta/manta_status.h" #include "chrome/browser/manta/proto/manta.pb.h" @@ -31,6 +30,7 @@ #include "chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_section.h" #include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" +#include "components/manta/features.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/search/ntp_features.h" @@ -97,7 +97,7 @@ if (base::FeatureList::IsEnabled( ntp_features::kCustomizeChromeWallpaperSearch) && - base::FeatureList::IsEnabled(features::kMantaService)) { + manta::features::IsMantaServiceEnabled()) { manta_service_ = manta::MantaServiceFactory::GetForProfile(profile_); snapper_provider_ = manta_service_->CreateSnapperProvider(); } @@ -247,7 +247,7 @@ SearchWallpaperCallback callback) { if (base::FeatureList::IsEnabled( ntp_features::kCustomizeChromeWallpaperSearch) && - base::FeatureList::IsEnabled(features::kMantaService)) { + manta::features::IsMantaServiceEnabled()) { manta::proto::Request request; request.set_feature_name(manta::proto::FeatureName::IMAGE_TEST); manta::proto::RequestConfig& request_config =
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc index 8f99508..8e6f54f 100644 --- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc +++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_page_handler_unittest.cc
@@ -18,7 +18,6 @@ #include "base/test/metrics/user_action_tester.h" #include "base/test/mock_callback.h" #include "base/test/scoped_feature_list.h" -#include "chrome/browser/browser_features.h" #include "chrome/browser/manta/manta_service.h" #include "chrome/browser/manta/manta_service_callbacks.h" #include "chrome/browser/manta/manta_service_factory.h" @@ -42,6 +41,7 @@ #include "chrome/test/base/test_browser_window.h" #include "chrome/test/base/testing_profile.h" #include "components/keyed_service/core/keyed_service.h" +#include "components/manta/features.h" #include "components/prefs/pref_service.h" #include "components/search/ntp_features.h" #include "content/public/browser/web_contents.h" @@ -839,7 +839,7 @@ void SetUp() override { feature_list_.InitWithFeatures( /*enabled_features=*/{ntp_features::kCustomizeChromeWallpaperSearch, - features::kMantaService}, + manta::features::kMantaService}, /*disabled_features=*/{}); CustomizeChromePageHandlerTest::SetUp(); }
diff --git a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_ui.cc b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_ui.cc index e037df1..10a7e33 100644 --- a/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_ui.cc +++ b/chrome/browser/ui/webui/side_panel/customize_chrome/customize_chrome_ui.cc
@@ -7,7 +7,6 @@ #include <string> #include <utility> -#include "chrome/browser/browser_features.h" #include "chrome/browser/cart/cart_handler.h" #include "chrome/browser/new_tab_page/modules/new_tab_page_modules.h" #include "chrome/browser/new_tab_page/new_tab_page_util.h" @@ -27,6 +26,7 @@ #include "chrome/grit/side_panel_customize_chrome_resources_map.h" #include "chrome/grit/side_panel_shared_resources.h" #include "chrome/grit/side_panel_shared_resources_map.h" +#include "components/manta/features.h" #include "components/search/ntp_features.h" #include "components/strings/grit/components_strings.h" #include "content/public/browser/web_contents.h" @@ -137,7 +137,7 @@ source->AddBoolean("wallpaperSearchEnabled", base::FeatureList::IsEnabled( ntp_features::kCustomizeChromeWallpaperSearch) && - base::FeatureList::IsEnabled(features::kMantaService)); + manta::features::IsMantaServiceEnabled()); webui::SetupChromeRefresh2023(source);
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_read_aloud_browsertest.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_read_aloud_browsertest.cc index 351337c..fd1f3dbe 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_read_aloud_browsertest.cc +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_read_aloud_browsertest.cc
@@ -107,3 +107,11 @@ HighlightCallback_TogglesHighlight) { ASSERT_TRUE(RunTest("highlight_callback_toggles_highlight.js")); } + +IN_PROC_BROWSER_TEST_F(ReadAnythingAppReadAloudTest, ReadAloud_FontSizeMenu) { + ASSERT_TRUE(RunTest("font_size_menu_with_read_aloud.js")); +} + +IN_PROC_BROWSER_TEST_F(ReadAnythingAppReadAloudTest, ReadAloud_FontMenu) { + ASSERT_TRUE(RunTest("font_menu_with_read_aloud.js")); +}
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_toolbar_browsertest.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_toolbar_browsertest.cc index 7e02896..a2b4e403 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_toolbar_browsertest.cc +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_app_toolbar_browsertest.cc
@@ -106,6 +106,14 @@ ASSERT_TRUE(RunTest("toolbar_visible_with_flag.js")); } +IN_PROC_BROWSER_TEST_F(ReadAnythingAppToolbarTest, FontSelectionShows) { + ASSERT_TRUE(RunTest("font_select_without_read_aloud.js")); +} + +IN_PROC_BROWSER_TEST_F(ReadAnythingAppToolbarTest, FontSizeButtonsOnToolbar) { + ASSERT_TRUE(RunTest("font_size_buttons_without_read_aloud.js")); +} + // TODO(crbug.com/1474951): Remove this test once Read Aloud flag is removed. IN_PROC_BROWSER_TEST_F(ReadAnythingAppToolbarTest, ReadAloud_Hidden) { ASSERT_TRUE(RunTest("toolbar_without_flag_hides_read_aloud.js"));
diff --git a/chrome/browser/ui/webui/signin/inline_login_handler.cc b/chrome/browser/ui/webui/signin/inline_login_handler.cc index 1fe3e2d..4b45d63 100644 --- a/chrome/browser/ui/webui/signin/inline_login_handler.cc +++ b/chrome/browser/ui/webui/signin/inline_login_handler.cc
@@ -139,8 +139,8 @@ std::string default_email; if (reason == signin_metrics::Reason::kSigninPrimaryAccount || reason == signin_metrics::Reason::kForcedSigninPrimaryAccount) { - default_email = - profile->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername); + default_email = profile->GetPrefs()->GetString( + prefs::kGoogleServicesLastSyncingUsername); } else { if (!net::GetValueForKeyInQuery(current_url, "email", &default_email)) default_email.clear();
diff --git a/chrome/browser/ui/webui/signin/signin_utils_desktop.cc b/chrome/browser/ui/webui/signin/signin_utils_desktop.cc index 1d439d4..26996dc4 100644 --- a/chrome/browser/ui/webui/signin/signin_utils_desktop.cc +++ b/chrome/browser/ui/webui/signin/signin_utils_desktop.cc
@@ -99,8 +99,8 @@ // With force sign in enabled, cross account sign in is not allowed. if (signin_util::IsForceSigninEnabled() && IsCrossAccountError(profile, gaia_id)) { - std::string last_email = - profile->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername); + std::string last_email = profile->GetPrefs()->GetString( + prefs::kGoogleServicesLastSyncingUsername); return SigninUIError::ProfileWasUsedByAnotherAccount(email, last_email); } } @@ -111,6 +111,6 @@ bool IsCrossAccountError(Profile* profile, const std::string& gaia_id) { DCHECK(!gaia_id.empty()); std::string last_gaia_id = - profile->GetPrefs()->GetString(prefs::kGoogleServicesLastGaiaId); + profile->GetPrefs()->GetString(prefs::kGoogleServicesLastSyncingGaiaId); return !last_gaia_id.empty() && gaia_id != last_gaia_id; }
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc index 8a6a2b0..1cae20d 100644 --- a/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc +++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper.cc
@@ -267,8 +267,8 @@ // last authenticated account of the current profile, then Chrome will show a // confirmation dialog before starting sync. // TODO(skym): Warn for high risk upgrade scenario (https://crbug.com/572754). - std::string last_email = - profile_->GetPrefs()->GetString(prefs::kGoogleServicesLastUsername); + std::string last_email = profile_->GetPrefs()->GetString( + prefs::kGoogleServicesLastSyncingUsername); delegate_->ShowMergeSyncDataConfirmation( last_email, account_info_.email, base::BindOnce(&TurnSyncOnHelper::OnMergeAccountConfirmation,
diff --git a/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc b/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc index ef43cfc5..a149c305 100644 --- a/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc +++ b/chrome/browser/ui/webui/signin/turn_sync_on_helper_unittest.cc
@@ -1234,9 +1234,9 @@ expected_merge_data_previous_email_ = kPreviousEmail; expected_merge_data_new_email_ = kEmail; // Configure the test. - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingUsername, kPreviousEmail); - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastGaiaId, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingGaiaId, kPreviousGaiaId); // Signin flow. CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT); @@ -1256,9 +1256,9 @@ expected_merge_data_previous_email_ = kPreviousEmail; expected_merge_data_new_email_ = kEmail; // Configure the test. - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingUsername, kPreviousEmail); - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastGaiaId, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingGaiaId, kPreviousGaiaId); user_policy_signin_service()->set_dm_token("foo"); user_policy_signin_service()->set_client_id("bar"); @@ -1284,9 +1284,9 @@ SetExpectationsForSyncStartupCompleted(profile()); // Configure the test. merge_data_choice_ = signin::SIGNIN_CHOICE_CONTINUE; - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingUsername, kPreviousEmail); - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastGaiaId, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingGaiaId, kPreviousGaiaId); // Signin flow. CreateTurnOnSyncHelper(TurnSyncOnHelper::SigninAbortedMode::REMOVE_ACCOUNT); @@ -1309,9 +1309,9 @@ SetExpectationsForSyncStartupCompleted(profile()); // Configure the test. merge_data_choice_ = signin::SIGNIN_CHOICE_CONTINUE; - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingUsername, kPreviousEmail); - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastGaiaId, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingGaiaId, kPreviousGaiaId); user_policy_signin_service()->set_dm_token("foo"); user_policy_signin_service()->set_client_id("bar"); @@ -1345,9 +1345,9 @@ SetExpectationsForSyncStartupCompletedForNextProfileCreated(); // Configure the test. merge_data_choice_ = signin::SIGNIN_CHOICE_NEW_PROFILE; - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastUsername, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingUsername, kPreviousEmail); - profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastGaiaId, + profile()->GetPrefs()->SetString(prefs::kGoogleServicesLastSyncingGaiaId, kPreviousGaiaId); // Signin flow. ProfileWaiter profile_waiter;
diff --git a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc index 31f92c1..c7b4ae3 100644 --- a/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc +++ b/chrome/browser/ui/webui/support_tool/support_tool_ui_utils.cc
@@ -111,7 +111,7 @@ case support_tool::PERFORMANCE: return l10n_util::GetStringUTF8(IDS_SUPPORT_TOOL_PERFORMANCE); case support_tool::CHROMEOS_APP_SERVICE: - return "ChromeOS App Service"; + return l10n_util::GetStringUTF8(IDS_SUPPORT_TOOL_CHROMEOS_APP_SERVICE); default: return "Error: Undefined"; }
diff --git a/chrome/browser/updates/announcement_notification/announcement_notification_service.cc b/chrome/browser/updates/announcement_notification/announcement_notification_service.cc index ebd6a226..ce9f8fd 100644 --- a/chrome/browser/updates/announcement_notification/announcement_notification_service.cc +++ b/chrome/browser/updates/announcement_notification/announcement_notification_service.cc
@@ -240,13 +240,13 @@ } // static -AnnouncementNotificationService* AnnouncementNotificationService::Create( - Profile* profile, - PrefService* pref_service, - std::unique_ptr<Delegate> delegate, - base::Clock* clock) { - return new AnnouncementNotificationServiceImpl(profile, pref_service, - std::move(delegate), clock); +std::unique_ptr<AnnouncementNotificationService> +AnnouncementNotificationService::Create(Profile* profile, + PrefService* pref_service, + std::unique_ptr<Delegate> delegate, + base::Clock* clock) { + return std::make_unique<AnnouncementNotificationServiceImpl>( + profile, pref_service, std::move(delegate), clock); } // static
diff --git a/chrome/browser/updates/announcement_notification/announcement_notification_service.h b/chrome/browser/updates/announcement_notification/announcement_notification_service.h index 684ff371..7cb43ea 100644 --- a/chrome/browser/updates/announcement_notification/announcement_notification_service.h +++ b/chrome/browser/updates/announcement_notification/announcement_notification_service.h
@@ -82,7 +82,7 @@ }; static void RegisterProfilePrefs(PrefRegistrySimple* registry); - static AnnouncementNotificationService* Create( + static std::unique_ptr<AnnouncementNotificationService> Create( Profile* profile, PrefService* pref_service, std::unique_ptr<Delegate> delegate,
diff --git a/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.cc b/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.cc index 670484ea..dc518635 100644 --- a/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.cc +++ b/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.cc
@@ -33,10 +33,11 @@ GetInstance()->GetServiceForBrowserContext(profile, true /* create */)); } -KeyedService* AnnouncementNotificationServiceFactory::BuildServiceInstanceFor( +std::unique_ptr<KeyedService> +AnnouncementNotificationServiceFactory::BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const { if (context->IsOffTheRecord()) { - return new EmptyAnnouncementNotificationService(); + return std::make_unique<EmptyAnnouncementNotificationService>(); } Profile* profile = Profile::FromBrowserContext(context);
diff --git a/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.h b/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.h index 9d86c43c..1e308b3 100644 --- a/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.h +++ b/chrome/browser/updates/announcement_notification/announcement_notification_service_factory.h
@@ -27,7 +27,7 @@ friend class base::NoDestructor<AnnouncementNotificationServiceFactory>; // BrowserContextKeyedServiceFactory implementation. - KeyedService* BuildServiceInstanceFor( + std::unique_ptr<KeyedService> BuildServiceInstanceForBrowserContext( content::BrowserContext* context) const override; AnnouncementNotificationServiceFactory();
diff --git a/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc b/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc index a4cb7a4..4f9667d 100644 --- a/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc +++ b/chrome/browser/updates/announcement_notification/announcement_notification_service_unittest.cc
@@ -150,10 +150,8 @@ // Setup test target objects. auto delegate = std::make_unique<NiceMock<MockDelegate>>(); delegate_ = delegate.get(); - service_ = base::WrapUnique<AnnouncementNotificationService>( - AnnouncementNotificationService::Create(test_profile_.get(), - pref_service_.get(), - std::move(delegate), &clock_)); + service_ = AnnouncementNotificationService::Create( + test_profile_.get(), pref_service_.get(), std::move(delegate), &clock_); } private:
diff --git a/chrome/browser/usb/chrome_usb_delegate_unittest.cc b/chrome/browser/usb/chrome_usb_delegate_unittest.cc index d5f3a87..1218dcb 100644 --- a/chrome/browser/usb/chrome_usb_delegate_unittest.cc +++ b/chrome/browser/usb/chrome_usb_delegate_unittest.cc
@@ -787,6 +787,9 @@ auto worker_url = GURL(base::StringPrintf("%s/worker.js", origin_url_.spec().c_str())); CreateAndStartWorker(origin_url_, worker_url); + + // Wait until tasks triggered by ServiceWorkerUsbDelegateObserver settle. + base::RunLoop().RunUntilIdle(); } void StopWorker() { StopAndResetWorker(); }
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index a0fb7ce..8f4b991 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -458,7 +458,13 @@ const Mechanism::Credential* cred = absl::get_if<Mechanism::Credential>(&mechanism.type); if (cred != nullptr && - cred->value().source != device::AuthenticatorType::kICloudKeychain) { + // Credentials on phones should never be triggered automatically. + (cred->value().source == device::AuthenticatorType::kPhone || + (transport_availability_.has_empty_allow_list && + // iCloud Keychain has its own confirmation UI and we don't want to + // duplicate it. + cred->value().source != + device::AuthenticatorType::kICloudKeychain))) { SetCurrentStep(Step::kSelectPriorityMechanism); } else { mechanism.callback.Run();
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc index 940b143..e161928 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -400,6 +400,15 @@ // If the platform authenticator has a credential it should activate. {L, ga, + {}, + {has_plat, one_cred}, + {}, + {c(cred1)}, + plat_ui, + }, + // If the platform authenticator has a credential it should activate. + {L, + ga, {usb, internal}, {has_plat, one_cred}, {}, @@ -2554,12 +2563,12 @@ model.StartFlow(std::move(transports_info), /*is_conditional_mediation=*/false); + EXPECT_EQ(model.current_step(), Step::kNotStarted); + device::PublicKeyCredentialDescriptor descriptor = + account_preselected_callback.WaitForResult(); if (credential_source == device::AuthenticatorType::kTouchID) { - EXPECT_EQ(model.current_step(), Step::kSelectPriorityMechanism); + EXPECT_EQ(descriptor.id, kCred2.cred_id); } else { - EXPECT_EQ(model.current_step(), Step::kNotStarted); - device::PublicKeyCredentialDescriptor descriptor = - account_preselected_callback.WaitForResult(); EXPECT_EQ(descriptor.id, kCred1FromICloudKeychain.cred_id); } } @@ -2734,6 +2743,7 @@ using HasCreds = device::FidoRequestHandlerBase::RecognizedCredential; constexpr int kNoWinButton = -1; +constexpr int kNoChromeUI = -2; constexpr int kHelloOrSk = IDS_WEBAUTHN_TRANSPORT_WINDOWS_HELLO_OR_SECURITY_KEY; constexpr int kHello = IDS_WEBAUTHN_TRANSPORT_WINDOWS_HELLO; constexpr int kSk = IDS_WEBAUTHN_TRANSPORT_EXTERNAL_SECURITY_KEY; @@ -2761,7 +2771,7 @@ // Windows v7+ with only internal creds. {L, false, false, true, true, HasCreds::kHasRecognizedCredential, - kNoWinButton}, + kNoChromeUI}, // Windows v7+ with empty allow-list. {L, false, false, false, true, HasCreds::kHasRecognizedCredential, @@ -2779,7 +2789,7 @@ // Windows v5+ with only internal creds. {L, false, false, true, false, HasCreds::kHasRecognizedCredential, - kNoWinButton}, + kNoChromeUI}, // Windows v5+ with empty allow-list. {L, false, false, false, false, HasCreds::kHasRecognizedCredential, kSk}, @@ -2807,6 +2817,9 @@ &fake_win_webauthn_api); for (const auto& test_case : kWinHelloButtonGetAssertionTestCases) { AuthenticatorRequestDialogModel model(main_rfh()); + model.SetAccountPreselectedCallback( + base::BindRepeating([](device::PublicKeyCredentialDescriptor cred) {})); + TransportAvailabilityInfo transports_info; transports_info.has_win_native_api_authenticator = true; transports_info.request_type = device::FidoRequestType::kGetAssertion; @@ -2840,6 +2853,9 @@ }); if (test_case.expected_button == kNoWinButton) { EXPECT_EQ(win_button_it, model.mechanisms().end()); + } else if (test_case.expected_button == kNoChromeUI) { + // In these cases, Chrome should have invoked the Windows UI immediately. + EXPECT_EQ(model.current_step(), Step::kNotStarted); } else { ASSERT_NE(win_button_it, model.mechanisms().end()); EXPECT_EQ(win_button_it->name,
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index fc20303..2d1aa94 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1696225912-66d2e3f07b71a7b1bf370fce2ece010c640903d3.profdata +chrome-android32-main-1696269474-d9cc430a376fd26e31c2c2b532aa055bbc985f6f.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index 7837f0a8..7029c3a 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1696225912-87b112fe2f16d511ab8bc6f57bf7a6f9d9c48301.profdata +chrome-android64-main-1696269474-c48c320c9092df29383f4fdbb89349e9e30169fe.profdata
diff --git a/chrome/build/lacros64.pgo.txt b/chrome/build/lacros64.pgo.txt index d71bd0a..6a3531c 100644 --- a/chrome/build/lacros64.pgo.txt +++ b/chrome/build/lacros64.pgo.txt
@@ -1 +1 @@ -chrome-chromeos-amd64-generic-main-1696204126-da5c99ca4f62233da52885f529a70c2f4fcc27b1.profdata +chrome-chromeos-amd64-generic-main-1696247976-9d0fea36462db06bc67338fb4d3430c0cce4ae59.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index ad67a62..fe89c7e7 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1696225912-de51b29b0d322d6767e6d25dc56b7795505dbe5f.profdata +chrome-linux-main-1696269474-d4c71b1863c3e7f32bd36ba6cbdafc6c6c69f6a4.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 9843612..92ea943 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1696233585-0687b0b86a4655fb432d896fd6c827bc8b08fc70.profdata +chrome-mac-arm-main-1696269474-dc08ab58135bf3101052fd4fd8201b02c98e0309.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 7b06df0cb1..a5004fda 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1696225912-0830e8038fb11f6161c385933cfaf4e73457c40f.profdata +chrome-mac-main-1696269474-7ea32280d4cf366ca08909bf9948e86020d80b22.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 4d89c20..073152b 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1696225912-43a055ae515960c816082d233006085a8baa2d8b.profdata +chrome-win-arm64-main-1696247976-9992948f6edc579f186906d21f9ff3940ff99fbe.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 7526544..678e31e 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1696225912-8564bb8f6c3a9b66e877f5d117cf9bdd70062fef.profdata +chrome-win32-main-1696258690-6ae0a9cfb1e9de37fd86ca07fb8b0828a1a1e251.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 6b8d512..86ab363 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1696225912-4a698df6ea13061f18ac3dada4503a04e2cd8eea.profdata +chrome-win64-main-1696269474-5d4ed41388aafd386000c257ddb807d0a9812d7e.profdata
diff --git a/chrome/chrome_paks.gni b/chrome/chrome_paks.gni index 9fd7089..d60ce9a 100644 --- a/chrome/chrome_paks.gni +++ b/chrome/chrome_paks.gni
@@ -155,6 +155,7 @@ "$root_gen_dir/chrome/bookmarks_resources.pak", "$root_gen_dir/chrome/commander_resources.pak", "$root_gen_dir/chrome/component_extension_resources.pak", + "$root_gen_dir/chrome/compose_resources.pak", "$root_gen_dir/chrome/dev_ui_resources.pak", "$root_gen_dir/chrome/downloads_resources.pak", "$root_gen_dir/chrome/feed_resources.pak",
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 5b79fd14..e2cb927 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -413,6 +413,24 @@ "EnableWebUsbOnExtensionServiceWorker", base::FEATURE_ENABLED_BY_DEFAULT); +// When enabled, resource requests will be evaluated against the Network +// Service's block list for NetworkContexts that are not associated with an Off +// the Record session. The block list is populated by the MaskedDomainList, so +// "MaskedDomainList" will need to also be enabled for the block list to have +// any contents. +BASE_FEATURE(kEnableNetworkServiceResourceBlockList, + "EnableNetworkServiceResourceBlockList", + base::FEATURE_DISABLED_BY_DEFAULT); + +// When enabled, resource requests will be evaluated against the Network +// Service's block list for NetworkContexts that are associated with an Off the +// Record session. The block list is populated by the MaskedDomainList, so +// "MaskedDomainList" will need to also be enabled for the block list to have +// any contents. +BASE_FEATURE(kEnableNetworkServiceResourceBlockListInOtrSessions, + "EnableNetworkServiceResourceBlockListInOtrSessions", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enable extended descriptions for key settings in Chrome settings. BASE_FEATURE(kExtendedSettingsDescriptions, "ExtendedSettingsDescriptions", @@ -1018,30 +1036,6 @@ "PermissionAuditing", base::FEATURE_DISABLED_BY_DEFAULT); -// Enables using the prediction service for permission prompts. We will keep -// this feature in order to allow us to update the holdback chance via finch. -BASE_FEATURE(kPermissionPredictions, - "PermissionPredictions", - base::FEATURE_ENABLED_BY_DEFAULT); - -// The holdback chance is 30% but it can also be configured/updated -// through finch if needed. -const base::FeatureParam<double> kPermissionPredictionsHoldbackChance( - &kPermissionPredictions, - "holdback_chance", - 0.3); - -// Enables using the prediction service for geolocation permission prompts. -BASE_FEATURE(kPermissionGeolocationPredictions, - "PermissionGeolocationPredictions", - base::FEATURE_ENABLED_BY_DEFAULT); - -const base::FeatureParam<double> - kPermissionGeolocationPredictionsHoldbackChance( - &kPermissionGeolocationPredictions, - "holdback_chance", - 0.3); - #if BUILDFLAG(IS_CHROMEOS_ASH) // Enable support for "Plugin VMs" on Chrome OS. BASE_FEATURE(kPluginVm, "PluginVm", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index a8dbe8c..e51d5d1 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -241,6 +241,12 @@ BASE_DECLARE_FEATURE(kEnableWebUsbOnExtensionServiceWorker); COMPONENT_EXPORT(CHROME_FEATURES) +BASE_DECLARE_FEATURE(kEnableNetworkServiceResourceBlockList); + +COMPONENT_EXPORT(CHROME_FEATURES) +BASE_DECLARE_FEATURE(kEnableNetworkServiceResourceBlockListInOtrSessions); + +COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kExtendedSettingsDescriptions); #if !BUILDFLAG(IS_ANDROID) @@ -583,16 +589,6 @@ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kPermissionAuditing); -COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kPermissionPredictions); -COMPONENT_EXPORT(CHROME_FEATURES) -extern const base::FeatureParam<double> kPermissionPredictionsHoldbackChance; - -COMPONENT_EXPORT(CHROME_FEATURES) -BASE_DECLARE_FEATURE(kPermissionGeolocationPredictions); -COMPONENT_EXPORT(CHROME_FEATURES) -extern const base::FeatureParam<double> - kPermissionGeolocationPredictionsHoldbackChance; - #if BUILDFLAG(IS_CHROMEOS_ASH) COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kPluginVm); #endif
diff --git a/chrome/common/webui_url_constants.cc b/chrome/common/webui_url_constants.cc index 99d193f..7d9f101 100644 --- a/chrome/common/webui_url_constants.cc +++ b/chrome/common/webui_url_constants.cc
@@ -55,6 +55,7 @@ const char kChromeUIChromeURLsURL[] = "chrome://chrome-urls/"; const char kChromeUIComponentsHost[] = "components"; const char kChromeUIComponentsUrl[] = "chrome://components"; +const char kChromeUIComposeHost[] = "compose"; const char kChromeUIConflictsHost[] = "conflicts"; const char kChromeUIConstrainedHTMLTestURL[] = "chrome://constrained-test/"; const char kChromeUIContentSettingsURL[] = "chrome://settings/content";
diff --git a/chrome/common/webui_url_constants.h b/chrome/common/webui_url_constants.h index bb76bb8..9223af5 100644 --- a/chrome/common/webui_url_constants.h +++ b/chrome/common/webui_url_constants.h
@@ -54,6 +54,7 @@ extern const char kChromeUIChromeURLsURL[]; extern const char kChromeUIComponentsHost[]; extern const char kChromeUIComponentsUrl[]; +extern const char kChromeUIComposeHost[]; extern const char kChromeUIConflictsHost[]; extern const char kChromeUIConstrainedHTMLTestURL[]; extern const char kChromeUIContentSettingsURL[];
diff --git a/chrome/installer/util/BUILD.gn b/chrome/installer/util/BUILD.gn index eec8f3b6..a743a4e 100644 --- a/chrome/installer/util/BUILD.gn +++ b/chrome/installer/util/BUILD.gn
@@ -375,16 +375,4 @@ "//chrome/test/data/installer/", ] } - - source_set("interactive_ui_tests") { - testonly = true - sources = [ "shell_util_interactive_uitest.cc" ] - deps = [ - ":with_no_strings", - "//base", - "//base/test:test_support", - "//build:branding_buildflags", - "//testing/gtest", - ] - } } # is_win
diff --git a/chrome/installer/util/shell_util.cc b/chrome/installer/util/shell_util.cc index b4bba76..7f20d49 100644 --- a/chrome/installer/util/shell_util.cc +++ b/chrome/installer/util/shell_util.cc
@@ -21,7 +21,6 @@ #include <string> #include <utility> -#include "base/base64.h" #include "base/command_line.h" #include "base/files/file_enumerator.h" #include "base/files/file_path.h" @@ -31,7 +30,6 @@ #include "base/hash/md5.h" #include "base/lazy_instance.h" #include "base/logging.h" -#include "base/metrics/histogram_functions.h" #include "base/path_service.h" #include "base/ranges/algorithm.h" #include "base/strings/strcat.h" @@ -43,13 +41,10 @@ #include "base/strings/utf_string_conversions.h" #include "base/synchronization/atomic_flag.h" #include "base/values.h" -#include "base/win/access_token.h" #include "base/win/default_apps_util.h" -#include "base/win/pe_image.h" #include "base/win/registry.h" #include "base/win/scoped_co_mem.h" #include "base/win/shortcut.h" -#include "base/win/sid.h" #include "base/win/win_util.h" #include "base/win/windows_version.h" #include "chrome/common/chrome_constants.h" @@ -96,8 +91,6 @@ const wchar_t kReinstallCommand[] = L"ReinstallCommand"; -constexpr wchar_t kRegHash[] = L"Hash"; - const wchar_t kRegProgId[] = L"ProgId"; const wchar_t kFilePathSeparator[] = L"\\"; @@ -1505,215 +1498,6 @@ return ShellUtil::DeleteApplicationClass(prog_id); } -std::wstring GetSID() { - std::wstring result; - absl::optional<base::win::AccessToken> current_process = - base::win::AccessToken::FromProcess(GetCurrentProcess(), false); - if (!current_process) - return result; - - absl::optional<std::wstring> sid = current_process->User().ToSddlString(); - if (!sid) - return result; - - result = std::move(*sid); - return result; -} - -std::wstring GetCurrentDateTimeForHashing() { - SYSTEMTIME system_time; - ::GetSystemTime(&system_time); - // The user choice hash function uses the registry write time as an input into - // the hash function. Considering only time down to the minute significantly - // increases the chance that the computed hash and registry write time are the - // same. If the registry write occurs near a minute boundary, the hash will - // likely need to be recomputed and rewritten. - system_time.wSecond = 0; - system_time.wMilliseconds = 0; - FILETIME file_time; - ::SystemTimeToFileTime(&system_time, &file_time); - return base::ASCIIToWide(base::StringPrintf( - "%08lx%08lx", file_time.dwHighDateTime, file_time.dwLowDateTime)); -} - -// The user choice hash function uses a shell32 wide string as a salt. This -// function attempts to extract that string. -std::wstring GetShellUserChoiceSalt() { - std::wstring result; - HMODULE shell32 = GetModuleHandle(L"shell32.dll"); - if (!shell32) - return result; - - base::win::PEImage shell32_image(shell32); - IMAGE_SECTION_HEADER* data_section_header = - shell32_image.GetImageSectionHeaderByName(".rdata"); - if (!data_section_header) - data_section_header = shell32_image.GetImageSectionHeaderByName(".text"); - - if (!data_section_header) - return result; - - base::span<const uint8_t> data_section( - reinterpret_cast<const uint8_t*>( - shell32_image.RVAToAddr(data_section_header->VirtualAddress)), - data_section_header->SizeOfRawData); - static constexpr base::WStringPiece kSaltSubstring( - L"User Choice set via Windows User Experience"); - base::span<const uint8_t> subsalt_span( - reinterpret_cast<const uint8_t*>(kSaltSubstring.data()), - kSaltSubstring.size() * sizeof(decltype(kSaltSubstring)::value_type)); - auto salt_start = base::ranges::search(data_section, subsalt_span); - if (salt_start == data_section.end()) - return result; - - static constexpr wchar_t kBracket = L'}'; - base::span<const uint8_t> bracket_span( - reinterpret_cast<const uint8_t*>(&kBracket), sizeof(kBracket)); - // The salt string is currently not expected to be longer than 256 bytes. - // It could be shorter, and so the bracket helps find the end of the string. - auto salt_end_limited = salt_start + 256; - auto salt_end = - std::search(salt_start + subsalt_span.size(), salt_end_limited, - bracket_span.begin(), bracket_span.end()); - if (salt_end == salt_end_limited) - return result; - - const size_t string_size = salt_end - salt_start + sizeof(kBracket); - result.assign(reinterpret_cast<const wchar_t*>(&*salt_start), - string_size / sizeof(wchar_t)); - return result; -} - -std::array<uint32_t, 4> ComputeHash(base::span<const uint8_t> input) { - const size_t items = input.size() / sizeof(uint32_t); - const size_t items_block_aligned = items - (items & 1); - base::span<const uint32_t> input_32( - reinterpret_cast<const uint32_t*>(input.data()), items_block_aligned); - - base::MD5Digest md5_digest; - MD5Sum(input.data(), input.size_bytes(), &md5_digest); - uint32_t md5[2]; - memcpy(md5, md5_digest.a, sizeof(md5)); - - std::array<uint32_t, 4> result{}; - - const uint32_t md5_0 = (md5[0] | 1) + 0x69FB0000; - const uint32_t md5_1 = (md5[1] | 1) + 0x13DB0000; - const uint32_t md5_2 = md5[0] | 1; - const uint32_t md5_3 = md5[1] | 1; - size_t length = input_32.size(); - uint32_t part_1 = 0; - uint32_t part_2 = 0; - for (size_t pos = 0; pos < length; ++pos) { - if (pos & 1) { - const uint32_t prev_part_1 = part_1; - part_1 = input_32[pos] + prev_part_1; - part_1 = part_1 * md5_1 - 0x3CE8EC25 * (part_1 >> 16); - part_1 = 0x59C3AF2D * part_1 - 0x2232E0F1 * (part_1 >> 16); - result[0] = 0x1EC90001 * part_1 + 0x35BD1EC9 * (part_1 >> 16); - result[1] = result[0] + prev_part_1 + result[1]; - - const uint32_t prev_part_2 = part_2; - part_2 = input_32[pos] + prev_part_2; - part_2 = md5_3 * part_2; - part_2 = 0x16F50000 * part_2 + 0xA27416F5 * (part_2 >> 16); - part_2 = 0x96FF0000 * part_2 + 0xD38396FF * (part_2 >> 16); - part_2 = 0x2B890000 * part_2 + 0x7C932B89 * (part_2 >> 16); - result[2] = 0x9F690000 * part_2 + 0xBFA49F69 * (part_2 >> 16); - result[3] = result[2] + prev_part_2 + result[3]; - } else { - part_1 = input_32[pos] + result[0]; - part_1 = part_1 * md5_0 - 0x10FA9605 * (part_1 >> 16); - part_1 = 0x79F8A395 * part_1 + 0x689B6B9F * (part_1 >> 16); - part_1 = 0xEA970001 * part_1 - 0x3C101569 * (part_1 >> 16); - part_2 = md5_2 * (input_32[pos] + result[2]); - part_2 = 0xB1110000 * part_2 + 0xCF98B111 * (part_2 >> 16); - part_2 = 0x5B9F0000 * part_2 + 0x87085B9F * (part_2 >> 16); - part_2 = 0xB96D0000 * part_2 + 0x12CEB96D * (part_2 >> 16); - part_2 = 0x1D830000 * part_2 + 0x257E1D83 * (part_2 >> 16); - } - } - - return result; -} - -std::wstring ComputeUserChoiceHash(const std::wstring& extension, - const std::wstring& sid, - const std::wstring& prog_id, - const std::wstring& datetime, - const std::wstring& salt) { - std::wstring hash_input = base::ToLowerASCII( - base::StrCat({extension, sid, prog_id, datetime, salt})); - base::span<const uint8_t> hash_input_span( - reinterpret_cast<const uint8_t*>(hash_input.c_str()), - sizeof(decltype(hash_input)::value_type) * (hash_input.size() + 1)); - std::array<uint32_t, 4> result = ComputeHash(hash_input_span); - uint32_t input[] = {result[0] ^ result[2], result[1] ^ result[3]}; - return base::UTF8ToWide(base::Base64Encode( - base::span<uint8_t>(reinterpret_cast<uint8_t*>(input), sizeof(input)))); -} - -bool IsUserChoiceHashValid(const base::win::RegKey& user_choice_reg_key, - const std::wstring& extension, - const std::wstring& sid, - const std::wstring& prog_id, - const std::wstring& salt) { - // Manually validate the hash instead of using - // IApplicationAssociationRegistration because - // IApplicationAssociationRegistration may trigger a UI notification and reset - // all of the defaults upon encountering an invalid hash. - FILETIME last_write_time = user_choice_reg_key.GetLastWriteTime(); - SYSTEMTIME last_write_system_time; - ::FileTimeToSystemTime(&last_write_time, &last_write_system_time); - // The hash computation aligns the time to minute boundaries. - last_write_system_time.wSecond = 0; - last_write_system_time.wMilliseconds = 0; - ::SystemTimeToFileTime(&last_write_system_time, &last_write_time); - std::wstring last_write_time_string = base::ASCIIToWide( - base::StringPrintf("%08lx%08lx", last_write_time.dwHighDateTime, - last_write_time.dwLowDateTime)); - std::wstring current_hash; - if (user_choice_reg_key.ReadValue(kRegHash, ¤t_hash) != ERROR_SUCCESS) - return false; - - std::wstring expected_hash = ComputeUserChoiceHash( - extension, sid, prog_id, last_write_time_string, salt); - return current_hash == expected_hash; -} - -bool WriteUserChoiceValues(base::win::RegKey& user_choice_reg_key, - const std::wstring& extension, - const std::wstring& sid, - const std::wstring& prog_id, - const std::wstring& salt) { - // Allow 5 retries in the event the hash is computed near a minute boundary. - for (int i = 0; i < 5; ++i) { - std::wstring datetime = GetCurrentDateTimeForHashing(); - std::wstring hash = - ComputeUserChoiceHash(extension, sid, prog_id, datetime, salt); - user_choice_reg_key.WriteValue(kRegHash, hash.c_str()); - user_choice_reg_key.WriteValue(kRegProgId, prog_id.c_str()); - if (IsUserChoiceHashValid(user_choice_reg_key, extension, sid, prog_id, - salt)) { - return true; - } - } - return false; -} - -enum class DirectSettingAttemptResult { - kSucceeded = 0, - kFailedSID = 1, - kFailedSalt = 2, - kFailedRegistrySet = 3, - kMaxValue = kFailedRegistrySet, -}; - -void ReportDirectSettingResult(DirectSettingAttemptResult result) { - base::UmaHistogramEnumeration("Windows.MakeChromeDefaultDirectly.Result", - result); -} - } // namespace const wchar_t* ShellUtil::kRegAppProtocolHandlers = L"\\AppProtocolHandlers"; @@ -2264,79 +2048,6 @@ return ret; } -bool ShellUtil::MakeChromeDefaultDirectly(int shell_change, - const base::FilePath& chrome_exe, - bool elevate_if_not_admin) { - DCHECK(!(shell_change & SYSTEM_LEVEL) || IsUserAnAdmin()); - - if (!install_static::SupportsSetAsDefaultBrowser()) - return false; - - if (!RegisterChromeBrowser(chrome_exe, std::wstring(), - elevate_if_not_admin)) { - return false; - } - - std::wstring suffix; - if (!GetInstallationSpecificSuffix(chrome_exe, &suffix)) - return false; - - std::wstring prog_id = GetBrowserProgId(suffix); - - std::wstring sid = GetSID(); - if (sid.empty()) { - ReportDirectSettingResult(DirectSettingAttemptResult::kFailedSID); - return false; - } - - std::wstring shell_salt = GetShellUserChoiceSalt(); - if (shell_salt.empty()) { - ReportDirectSettingResult(DirectSettingAttemptResult::kFailedSalt); - return false; - } - - base::win::RegKey url_associations_key( - HKEY_CURRENT_USER, - L"SOFTWARE\\Microsoft\\Windows\\Shell\\Associations\\UrlAssociations", - KEY_READ | KEY_WRITE); - for (size_t i = 0; kBrowserProtocolAssociations[i] != nullptr; ++i) { - std::wstring subkey_path( - base::StrCat({kBrowserProtocolAssociations[i], L"\\UserChoice"})); - // Deleting the key works around the deny set value ACL on UserChoice. - url_associations_key.DeleteKey(subkey_path.c_str()); - base::win::RegKey key(url_associations_key.Handle(), subkey_path.c_str(), - KEY_READ | KEY_WRITE); - if (!WriteUserChoiceValues(key, kBrowserProtocolAssociations[i], sid, - prog_id, shell_salt)) { - ReportDirectSettingResult(DirectSettingAttemptResult::kFailedRegistrySet); - return false; - } - } - - base::win::RegKey file_extensions_key( - HKEY_CURRENT_USER, - L"SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Explorer\\FileExts", - KEY_READ | KEY_WRITE); - for (size_t i = 0; kDefaultFileAssociations[i] != nullptr; ++i) { - std::wstring subkey_path( - base::StrCat({kDefaultFileAssociations[i], L"\\UserChoice"})); - // Deleting the key works around the deny set value ACL on UserChoice. - file_extensions_key.DeleteKey(subkey_path.c_str()); - base::win::RegKey key(file_extensions_key.Handle(), subkey_path.c_str(), - KEY_READ | KEY_WRITE); - if (!WriteUserChoiceValues(key, kDefaultFileAssociations[i], sid, prog_id, - shell_salt)) { - ReportDirectSettingResult(DirectSettingAttemptResult::kFailedRegistrySet); - return false; - } - } - - ::SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, nullptr, nullptr); - - ReportDirectSettingResult(DirectSettingAttemptResult::kSucceeded); - return true; -} - // static bool ShellUtil::LaunchUninstallAppsSettings() { static constexpr wchar_t kControlPanelAppModelId[] = @@ -2989,32 +2700,3 @@ } return true; } - -// static -std::array<uint32_t, 4> ShellUtil::ComputeHashForTesting( - base::span<const uint8_t> input) { - return ComputeHash(input); -} - -// static -std::wstring ShellUtil::ComputeUserChoiceHashForTesting( - const std::wstring& extension, - const std::wstring& sid, - const std::wstring& prog_id, - const std::wstring& datetime) { - std::wstring shell_salt = GetShellUserChoiceSalt(); - if (shell_salt.empty()) - return std::wstring(); - - return ComputeUserChoiceHash(extension, sid, prog_id, datetime, shell_salt); -} - -// static -std::wstring ShellUtil::GetCurrentProgIdForTesting( - const base::FilePath& chrome_exe) { - std::wstring suffix; - if (!GetInstallationSpecificSuffix(chrome_exe, &suffix)) - return std::wstring(); - - return GetBrowserProgId(suffix); -}
diff --git a/chrome/installer/util/shell_util.h b/chrome/installer/util/shell_util.h index 46fb451..9a5cd40f 100644 --- a/chrome/installer/util/shell_util.h +++ b/chrome/installer/util/shell_util.h
@@ -14,7 +14,6 @@ #include <stddef.h> #include <stdint.h> -#include <array> #include <map> #include <memory> #include <set> @@ -24,7 +23,6 @@ #include "base/check.h" #include "base/containers/flat_map.h" -#include "base/containers/span.h" #include "base/files/file_path.h" #include "base/memory/ref_counted.h" #include "chrome/installer/util/work_item_list.h" @@ -520,34 +518,16 @@ // TODO(benwells): Attempt to undo any changes that were successfully made. // http://crbug.com/83970 // - // shell_change: Defines whether to register as default browser at system + // shell_change: Defined whether to register as default browser at system // level or user level. If value has ShellChange::SYSTEM_LEVEL // we should be running as admin user. // chrome_exe: The chrome.exe path to register as default browser. - // elevate_if_not_admin: On Win7 if user is not admin, try to elevate for + // elevate_if_not_admin: On Vista if user is not admin, try to elevate for // Chrome registration. static bool MakeChromeDefault(int shell_change, const base::FilePath& chrome_exe, bool elevate_if_not_admin); - // Make Chrome the default browser on Windows 10. This function works by going - // through the url protocols and file associations that are related to general - // browsing, e.g. http, https, .html etc., and directly setting the relevant - // registry entries for each. If any of these fails the operation will return - // false to indicate failure, which is consistent with the return value of - // shell_integration::GetDefaultBrowser. This function will also return false - // if it can't set the default directly on the current platform. - // - // shell_change: Defines whether to register as default browser at system - // level or user level. If value has ShellChange::SYSTEM_LEVEL - // we should be running as admin user. - // chrome_exe: The chrome.exe path to register as default browser. - // elevate_if_not_admin: If user is not admin, try to elevate for - // Chrome registration. - static bool MakeChromeDefaultDirectly(int shell_change, - const base::FilePath& chrome_exe, - bool elevate_if_not_admin); - // Opens the Apps & Features page in the Windows settings in branded builds. // // This function DCHECKS that it is only called on Windows 10 or higher. @@ -859,18 +839,6 @@ HKEY root, const std::vector<std::unique_ptr<RegistryEntry>>& entries, bool best_effort_no_rollback = false); - - static std::array<uint32_t, 4> ComputeHashForTesting( - base::span<const uint8_t> input); - - static std::wstring ComputeUserChoiceHashForTesting( - const std::wstring& extension, - const std::wstring& sid, - const std::wstring& prog_id, - const std::wstring& datetime); - - static std::wstring GetCurrentProgIdForTesting( - const base::FilePath& chrome_exe); }; #endif // CHROME_INSTALLER_UTIL_SHELL_UTIL_H_
diff --git a/chrome/installer/util/shell_util_interactive_uitest.cc b/chrome/installer/util/shell_util_interactive_uitest.cc deleted file mode 100644 index e78ae0a..0000000 --- a/chrome/installer/util/shell_util_interactive_uitest.cc +++ /dev/null
@@ -1,196 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/installer/util/shell_util.h" - -#include <shobjidl.h> -#include <stddef.h> -#include <wrl/client.h> - -#include <string> - -#include "base/files/scoped_temp_dir.h" -#include "base/memory/raw_ref.h" -#include "base/strings/strcat.h" -#include "base/strings/utf_string_conversions.h" -#include "base/test/test_reg_util_win.h" -#include "base/types/pass_key.h" -#include "base/uuid.h" -#include "base/win/com_init_util.h" -#include "base/win/registry.h" -#include "base/win/scoped_co_mem.h" -#include "build/branding_buildflags.h" -#include "chrome/installer/util/util_constants.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace { - -std::wstring GetCurrentDefault( - IApplicationAssociationRegistration* registration, - const wchar_t* query, - ASSOCIATIONTYPE query_type, - ASSOCIATIONLEVEL query_level) { - base::win::ScopedCoMem<wchar_t> current_app; - if (FAILED(registration->QueryCurrentDefault(query, query_type, query_level, - ¤t_app))) { - return std::wstring(); - } - return current_app.get(); -} - -// Copies one registry key to another location, preserving the destination and -// restoring it at destruction. -class ScopedCopyRegKey { - public: - // absl::optional requires a public constructor, so the constructor requires - // a passkey to ensure callers use Create() to create this object. - using ConstructorPassKey = base::PassKey<ScopedCopyRegKey>; - - // Copies |from|\|key| to |to|\|key|, preserving |to|\|key| and restoring it - // at destruction. Returns nullopt upon failure of preserving |to|. |to| must - // outlive this object. - static absl::optional<ScopedCopyRegKey> Create(const base::win::RegKey& from, - base::win::RegKey& to, - const std::wstring& key) { - absl::optional<ScopedCopyRegKey> copy_regkey; - std::wstring temp_key_name; - base::win::RegKey exists_key(to.Handle(), key.c_str(), KEY_READ); - if (exists_key.Valid()) { - temp_key_name = base::StrCat( - {L"Temp-", base::ASCIIToWide( - base::Uuid::GenerateRandomV4().AsLowercaseString())}); - LONG result = - RegRenameKey(to.Handle(), key.c_str(), temp_key_name.c_str()); - if (result != ERROR_SUCCESS) { - ADD_FAILURE() << "Registry Initial Rename Failed " << result; - return copy_regkey; - } - } - - base::win::RegKey orig_key(from.Handle(), key.c_str(), KEY_READ); - base::win::RegKey dest_key(to.Handle(), key.c_str(), KEY_WRITE); - CopyRecursively(orig_key, dest_key); - copy_regkey.emplace(to, key, temp_key_name, ConstructorPassKey()); - return copy_regkey; - } - - // |to| must outlive this object. - ScopedCopyRegKey(base::win::RegKey& to, - const std::wstring& key, - const std::wstring& temp_key_name, - ConstructorPassKey passkey) - : to_(to), key_(key), temp_key_name_(temp_key_name) {} - - ~ScopedCopyRegKey() { - to_->DeleteKey(key_.c_str()); - - if (!temp_key_name_.empty()) { - LONG result = - RegRenameKey(to_->Handle(), temp_key_name_.c_str(), key_.c_str()); - if (result != ERROR_SUCCESS) - ADD_FAILURE() << "Registry Restore Rename Failed " << result; - } - } - - private: - static void CopyRecursively(const base::win::RegKey& from, - base::win::RegKey& to) { - for (base::win::RegistryValueIterator value_iter(from.Handle(), L""); - value_iter.Valid(); ++value_iter) { - to.WriteValue(value_iter.Name(), value_iter.Value(), - value_iter.ValueSize(), value_iter.Type()); - } - - for (base::win::RegistryKeyIterator key_iter(from.Handle(), L""); - key_iter.Valid(); ++key_iter) { - const wchar_t* subkey_name = key_iter.Name(); - base::win::RegKey orig_key(from.Handle(), subkey_name, KEY_READ); - base::win::RegKey dest_key(to.Handle(), subkey_name, KEY_WRITE); - CopyRecursively(orig_key, dest_key); - } - } - - // This RegKey must outlive this class. - const raw_ref<base::win::RegKey> to_; - const std::wstring key_; - const std::wstring temp_key_name_; -}; - -} // namespace - -TEST(ShellUtilInteractiveTest, MakeChromeDefaultDirectly) { - base::win::AssertComInitialized(); - - base::ScopedTempDir temp_dir; - ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); - // Saving the underlying HKCU\Software\Classes to forward reads from HKCR. - base::win::RegKey original_hkcu_classes( - HKEY_CURRENT_USER, L"Software\\Classes", KEY_READ | KEY_WRITE); - registry_util::RegistryOverrideManager registry_overrides; - ASSERT_NO_FATAL_FAILURE( - registry_overrides.OverrideRegistry(HKEY_CURRENT_USER)); - - Microsoft::WRL::ComPtr<IApplicationAssociationRegistration> registration; - ASSERT_HRESULT_SUCCEEDED( - ::CoCreateInstance(CLSID_ApplicationAssociationRegistration, nullptr, - CLSCTX_INPROC_SERVER, IID_PPV_ARGS(®istration))); - - // IApplicationAssociationRegistration::SetAppAsDefault only works for - // "MSEdgeHTM" for http, https, .htm, and .html on Win10+ and serves as a - // convenient initial environment setup for this test. - // - // However, some environments may not have MSEdgeHTM available, so the checks - // below simply check that the current default isn't the prog id for testing, - // which is sufficient for this test. - ASSERT_HRESULT_SUCCEEDED( - registration->SetAppAsDefault(L"MSEdgeHTM", L"http", AT_URLPROTOCOL)); - ASSERT_HRESULT_SUCCEEDED( - registration->SetAppAsDefault(L"MSEdgeHTM", L"https", AT_URLPROTOCOL)); - ASSERT_HRESULT_SUCCEEDED( - registration->SetAppAsDefault(L"MSEdgeHTM", L".htm", AT_FILEEXTENSION)); - ASSERT_HRESULT_SUCCEEDED( - registration->SetAppAsDefault(L"MSEdgeHTM", L".html", AT_FILEEXTENSION)); - - base::FilePath chrome_exe(temp_dir.GetPath().Append(installer::kChromeExe)); - std::wstring prog_id = ShellUtil::GetCurrentProgIdForTesting(chrome_exe); - - ASSERT_NE(prog_id, GetCurrentDefault(registration.Get(), L"http", - AT_URLPROTOCOL, AL_EFFECTIVE)); - ASSERT_NE(prog_id, GetCurrentDefault(registration.Get(), L"https", - AT_URLPROTOCOL, AL_EFFECTIVE)); - ASSERT_NE(prog_id, GetCurrentDefault(registration.Get(), L".htm", - AT_FILEEXTENSION, AL_EFFECTIVE)); - ASSERT_NE(prog_id, GetCurrentDefault(registration.Get(), L".html", - AT_FILEEXTENSION, AL_EFFECTIVE)); - -#if BUILDFLAG(GOOGLE_CHROME_FOR_TESTING_BRANDING) - ASSERT_FALSE(ShellUtil::MakeChromeDefaultDirectly(ShellUtil::CURRENT_USER, - chrome_exe, false)); -#else - ASSERT_TRUE(ShellUtil::MakeChromeDefaultDirectly(ShellUtil::CURRENT_USER, - chrome_exe, false)); -#endif - - // The following may query HKEY_CLASSES_ROOT for the progid, which merges - // HKEY_CURERNT_USER and HKEY_LOCAL_MACHINE on the backend and bypasses the - // RegistryOverrideManager redirect. This test will copy selected regkeys - // to the underlying HKCU if necessary for correct functionality. - base::win::RegKey redirected_hkcu_classes(HKEY_CURRENT_USER, - L"Software\\Classes", KEY_READ); - absl::optional<ScopedCopyRegKey> copy_regkey = ScopedCopyRegKey::Create( - redirected_hkcu_classes, original_hkcu_classes, prog_id.c_str()); - ASSERT_TRUE(copy_regkey); - - // If the expectations fail below, the default browser mechanism has changed - // and will need to be reexamined. - EXPECT_EQ(prog_id, GetCurrentDefault(registration.Get(), L"http", - AT_URLPROTOCOL, AL_EFFECTIVE)); - EXPECT_EQ(prog_id, GetCurrentDefault(registration.Get(), L"https", - AT_URLPROTOCOL, AL_EFFECTIVE)); - EXPECT_EQ(prog_id, GetCurrentDefault(registration.Get(), L".htm", - AT_FILEEXTENSION, AL_EFFECTIVE)); - EXPECT_EQ(prog_id, GetCurrentDefault(registration.Get(), L".html", - AT_FILEEXTENSION, AL_EFFECTIVE)); -}
diff --git a/chrome/installer/util/shell_util_unittest.cc b/chrome/installer/util/shell_util_unittest.cc index 7457d5d..b276280 100644 --- a/chrome/installer/util/shell_util_unittest.cc +++ b/chrome/installer/util/shell_util_unittest.cc
@@ -28,7 +28,6 @@ #include "chrome/install_static/install_util.h" #include "chrome/installer/util/install_util.h" #include "chrome/installer/util/util_constants.h" -#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" namespace { @@ -1525,87 +1524,3 @@ ASSERT_GE(size, 1U); ASSERT_STREQ(user_name, suffix.substr(1).c_str()); } - -TEST(ShellUtilTest, HashComputationTest) { - // Random selection of data to validate hash behavior. - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0xad, 0x02, 0x99, 0xd7, 0xe6, 0xae, 0x58, 0xb2}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0x09dea6a1, 0x4a8fc186, 0xbc7c90a4, 0xca06d9a3})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0xdf, 0x5e, 0xaa, 0x78, 0xb2, 0xad, 0x92, 0x2f, 0x2a, 0xdc, - 0xcd, 0xaf, 0xda, 0xd3, 0x4e, 0x86}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0xaf9b175d, 0xcc68a9ce, 0x8f9f7b8b, 0x895cd714})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0xdc, 0x94, 0xa7, 0x6f, 0x94, 0xd7, 0x6c, 0xf6, 0xca, 0x95, - 0xc7, 0xf3, 0x54, 0x39, 0xb1, 0xac, 0xb3, 0xa2, 0x7a, 0xa7, - 0x6f, 0xbe, 0xb3, 0xe1, 0xbd, 0x42, 0x22, 0xe3}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0xec3767a8, 0x1e115388, 0x94e1a5fc, 0x9217bd7c})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting( - std::vector<uint8_t>{0x2e, 0x64, 0x7e, 0x26, 0xab, 0xec, 0xe5, - 0xb4, 0x54, 0x16, 0xb1, 0xa2}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0xc5b56876, 0x472a21c8, 0x642c79f7, 0x7214ae18})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting( - std::vector<uint8_t>{0x15, 0xb2, 0xc1, 0x91, 0x5f, 0x8f, 0x12, - 0xad, 0xd4, 0x4c, 0xa7, 0x30}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0xae9a26cd, 0x82769b2e, 0x85ef1ecd, 0x6c94e1a4})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0x9f, 0xf3, 0xdc, 0x20, 0xef, 0xbb, 0x28, 0x29, 0x58, 0x0b, - 0xc0, 0xb3, 0x40, 0xa5, 0x30, 0xb2, 0x32, 0x1c, 0x54, 0xf2}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0xe9765ccb, 0x828b33ad, 0x619d1e26, 0x6e3645c9})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0x45, 0xb4, 0xe8, 0x81, 0x65, 0x6f, 0x6c, 0x76}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0x33c1d050, 0x79fdc457, 0xe677ddba, 0x2eb1dcee})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0x04, 0xbb, 0xd6, 0x1a, 0x8d, 0x40, 0xa6, 0xfd, - 0x79, 0x80, 0x26, 0xc0, 0xfc, 0x8b, 0x4e, 0xc4, - 0x60, 0x0b, 0x44, 0x0e, 0x27, 0x71, 0x0f, 0x57}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0x355884a8, 0x0760d56d, 0xd602215c, 0xe5792b0c})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0x4a, 0xca, 0x02, 0x1f, 0xd4, 0xf0, 0xfd, 0x2c, 0x88, 0x09, - 0xee, 0xf6, 0xeb, 0xd9, 0xf4, 0x8b}), - ::testing::ContainerEq(std::array<uint32_t, 4>{ - 0xe11db6db, 0x3c2728d2, 0xc65e3481, 0x10d6e545})); - EXPECT_THAT( - ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{ - 0x9c, 0x05, 0x18, 0x01, 0xb0, 0x92, 0x8c, 0xec, 0x67, 0x6a, 0xd1, - 0x81, 0xed, 0x6a, 0xb6, 0xf8, 0xad, 0xb0, 0x41, 0xf4, 0x21, 0x34, - 0x30, 0xca, 0x7f, 0x51, 0x47, 0xc4, 0x1c, 0xcf, 0x06, 0x91}), - ::testing::ContainerEq(std::array<uint32_t, 4>{0xec0c887c, 0x36538d64, - 0x302c1cdf, 0x0fe7c73d})); - - // Invalid data that should hash to zeros. - EXPECT_THAT(ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{}), - ::testing::ContainerEq(std::array<uint32_t, 4>{})); - EXPECT_THAT( - ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{0x00, 0x01}), - ::testing::ContainerEq(std::array<uint32_t, 4>{})); - EXPECT_THAT( - ShellUtil::ComputeHashForTesting(std::vector<uint8_t>{0x00, 0x01, 0x02}), - ::testing::ContainerEq(std::array<uint32_t, 4>{})); - EXPECT_THAT(ShellUtil::ComputeHashForTesting( - std::vector<uint8_t>{0x00, 0x01, 0x02, 0x03}), - ::testing::ContainerEq(std::array<uint32_t, 4>{})); -} - -TEST(ShellUtilTest, UserChoiceHashComputationTest) { - // If these tests fail, investigate if the salt changed or if the hash - // function changed. - EXPECT_EQ( - L"EYe0ErlvGho=", - ShellUtil::ComputeUserChoiceHashForTesting( - L".htm", L"S-1-5-21-2745944652-1798522384-4190209206-1001", - L"ChromiumHTM.77HL62E3NQOIRZILVHSWMGHIQE", L"01d88bf3ee5fd000")); - EXPECT_EQ( - L"w4oUasKJq/Y=", - ShellUtil::ComputeUserChoiceHashForTesting( - L".html", L"S-1-5-21-2745944652-1798522384-4190209206-1001", - L"ChromiumHTM.77HL62E3NQOIRZILVHSWMGHIQE", L"01d88bf3ee5fd000")); -}
diff --git a/chrome/renderer/autofill/autofill_renderer_browsertest.cc b/chrome/renderer/autofill/autofill_renderer_browsertest.cc index 9769fe7c..6bfe8df2 100644 --- a/chrome/renderer/autofill/autofill_renderer_browsertest.cc +++ b/chrome/renderer/autofill/autofill_renderer_browsertest.cc
@@ -201,21 +201,21 @@ expected.id_attribute = u"firstname"; expected.name = expected.id_attribute; expected.value = std::u16string(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[0]); expected.id_attribute = u"middlename"; expected.name = expected.id_attribute; expected.value = std::u16string(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[1]); expected.id_attribute = u"lastname"; expected.name = expected.id_attribute; expected.value = std::u16string(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.autocomplete_attribute = "off"; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[2]); @@ -224,7 +224,7 @@ expected.id_attribute = u"state"; expected.name = expected.id_attribute; expected.value = u"?"; - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[3]); @@ -260,7 +260,7 @@ ASSERT_EQ(1UL, forms.size()); ASSERT_EQ(3UL, forms[0].fields.size()); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"second_firstname"; @@ -326,14 +326,14 @@ expected.id_attribute = u"EMAIL_ADDRESS"; expected.name = expected.id_attribute; expected.value.clear(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[7]); expected.id_attribute = u"PHONE_HOME_WHOLE_NUMBER"; expected.name = expected.id_attribute; expected.value.clear(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, forms[0].fields[8]); }
diff --git a/chrome/renderer/autofill/form_autofill_browsertest.cc b/chrome/renderer/autofill/form_autofill_browsertest.cc index 3fa86fa..f2dd6b0 100644 --- a/chrome/renderer/autofill/form_autofill_browsertest.cc +++ b/chrome/renderer/autofill/form_autofill_browsertest.cc
@@ -320,7 +320,7 @@ expected.label = labels[i]; expected.name = names[i]; expected.value = values[i]; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); fields.push_back(expected); } @@ -452,14 +452,14 @@ expected.form_control_type = StringToFormControlType(field_cases[i].form_control_type); expected.max_length = - expected.form_control_type == StringToFormControlType("text") + expected.form_control_type == FormControlType::kInputText ? WebInputElement::DefaultMaxLength() : 0; expected.id_attribute = ASCIIToUTF16(field_cases[i].id_attribute); expected.name = expected.id_attribute; expected.value = ASCIIToUTF16(field_cases[i].initial_value); - if (expected.form_control_type == StringToFormControlType("text") || - expected.form_control_type == StringToFormControlType("month")) { + if (expected.form_control_type == FormControlType::kInputText || + expected.form_control_type == FormControlType::kInputMonth) { expected.label = ASCIIToUTF16(field_cases[i].initial_value); } else { expected.label.clear(); @@ -707,7 +707,7 @@ ASSERT_EQ(4U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -773,7 +773,7 @@ expected.name = expected.id_attribute; expected.value = u"John"; expected.label = u"John"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); @@ -781,7 +781,7 @@ expected.name = expected.id_attribute; expected.value = u"Smith"; expected.label = u"Smith"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); @@ -790,7 +790,7 @@ expected.value = u"john@example.com"; expected.label = u"john@example.com"; expected.autocomplete_attribute = "off"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); expected.autocomplete_attribute.clear(); @@ -799,7 +799,7 @@ expected.name = expected.id_attribute; expected.value = u"123 Fantasy Ln.\nApt. 42"; expected.label.clear(); - expected.form_control_type = StringToFormControlType("textarea"); + expected.form_control_type = FormControlType::kTextArea; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); EXPECT_FORM_FIELD_DATA_EQUALS(expected, field); @@ -832,7 +832,7 @@ ASSERT_EQ(3U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.id_attribute = u"firstname"; expected.name = expected.id_attribute; @@ -875,7 +875,7 @@ const std::vector<FormFieldData>& fields2 = form2.fields; ASSERT_EQ(3U, fields2.size()); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.id_attribute = u"firstname"; expected.name = expected.id_attribute; @@ -926,7 +926,7 @@ ASSERT_EQ(3U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1004,7 +1004,7 @@ ASSERT_EQ(3U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1039,7 +1039,7 @@ const std::vector<FormFieldData>& fields2 = form2.fields; ASSERT_EQ(3U, fields2.size()); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1087,7 +1087,7 @@ ASSERT_EQ(unowned_offset + 3, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"apple"; @@ -1183,7 +1183,7 @@ ASSERT_EQ(3U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1393,7 +1393,7 @@ ASSERT_EQ(6U, fields2.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1462,7 +1462,7 @@ expected.is_autofilled = true; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields2[4]); - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.id_attribute = u"state"; expected.name_attribute = u"state"; expected.name = expected.name_attribute; @@ -1551,7 +1551,7 @@ ASSERT_EQ(3U, fields2.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1667,7 +1667,7 @@ ASSERT_EQ(3U, fields2.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"cc"; @@ -1786,7 +1786,7 @@ ASSERT_EQ(3U, fields2.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"cc"; @@ -1877,7 +1877,7 @@ ASSERT_EQ(9U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -1904,7 +1904,7 @@ expected.label.clear(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); - expected.form_control_type = StringToFormControlType("month"); + expected.form_control_type = FormControlType::kInputMonth; expected.max_length = 0; expected.id_attribute = u"month"; expected.name = expected.id_attribute; @@ -1918,7 +1918,7 @@ expected.label = u"2012-11"; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); - expected.form_control_type = StringToFormControlType("textarea"); + expected.form_control_type = FormControlType::kTextArea; expected.id_attribute = u"textarea"; expected.name = expected.id_attribute; expected.value.clear(); @@ -2012,7 +2012,7 @@ ASSERT_EQ(6U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); // shipping section @@ -2098,14 +2098,14 @@ expected.id_attribute = u"firstname"; expected.name = expected.id_attribute; expected.value.clear(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); expected.id_attribute = u"lastname"; expected.name = expected.id_attribute; expected.value.clear(); - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); @@ -2113,7 +2113,7 @@ expected.name_attribute = u"state"; expected.name = expected.name_attribute; expected.value = u"?"; - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); @@ -2359,7 +2359,7 @@ EXTRACT_NONE, &result1); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"element"; expected.name = expected.id_attribute; @@ -2398,7 +2398,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.value = u"value"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.autocomplete_attribute = "off"; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); @@ -2421,7 +2421,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.value = u"value"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = 5; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); } @@ -2443,7 +2443,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.value = u"value"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.is_autofilled = true; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); @@ -2468,7 +2468,7 @@ expected.id_attribute = u"checkbox"; expected.name = expected.id_attribute; expected.value = u"mail"; - expected.form_control_type = StringToFormControlType("checkbox"); + expected.form_control_type = FormControlType::kInputCheckbox; expected.is_autofilled = true; expected.check_status = FormFieldData::CheckStatus::kChecked; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); @@ -2480,7 +2480,7 @@ expected.id_attribute = u"radio"; expected.name = expected.id_attribute; expected.value = u"male"; - expected.form_control_type = StringToFormControlType("radio"); + expected.form_control_type = FormControlType::kInputRadio; expected.is_autofilled = true; expected.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); @@ -2505,7 +2505,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.max_length = 0; - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.value = u"CA"; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result1); @@ -2552,7 +2552,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.max_length = 0; - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; // We check that the extra attributes have been copied to |result1|. expected.is_autofilled = true; expected.autocomplete_attribute = "off"; @@ -2646,7 +2646,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.max_length = 0; - expected.form_control_type = StringToFormControlType("textarea"); + expected.form_control_type = FormControlType::kTextArea; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); FormFieldData result_with_value; @@ -2674,7 +2674,7 @@ expected.id_attribute = u"element"; expected.name = expected.id_attribute; expected.max_length = 0; - expected.form_control_type = StringToFormControlType("month"); + expected.form_control_type = FormControlType::kInputMonth; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result_sans_value); FormFieldData result_with_value; @@ -2702,7 +2702,7 @@ expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"password"; expected.name = expected.id_attribute; - expected.form_control_type = StringToFormControlType("password"); + expected.form_control_type = FormControlType::kInputPassword; expected.value = u"secret"; EXPECT_FORM_FIELD_DATA_EQUALS(expected, result); } @@ -2986,7 +2986,7 @@ expected.name = expected.id_attribute; expected.value = u"John"; expected.label = u"First name:"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); @@ -2994,7 +2994,7 @@ expected.name = expected.id_attribute; expected.value = u"Smith"; expected.label = u"Last name:"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); @@ -3002,7 +3002,7 @@ expected.name = expected.id_attribute; expected.value = u"123 Fantasy Ln.\nApt. 42"; expected.label = u"Address:"; - expected.form_control_type = StringToFormControlType("textarea"); + expected.form_control_type = FormControlType::kTextArea; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); @@ -3010,7 +3010,7 @@ expected.name = expected.id_attribute; expected.value = u"CA"; expected.label = u"State:"; - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[3]); @@ -3018,7 +3018,7 @@ expected.name = expected.id_attribute; expected.value = u"secret"; expected.label = u"Password:"; - expected.form_control_type = StringToFormControlType("password"); + expected.form_control_type = FormControlType::kInputPassword; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[4]); @@ -3026,7 +3026,7 @@ expected.name = expected.id_attribute; expected.value = u"2011-12"; expected.label = u"Card expiration:"; - expected.form_control_type = StringToFormControlType("month"); + expected.form_control_type = FormControlType::kInputMonth; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[5]); @@ -3283,7 +3283,7 @@ ASSERT_EQ(3U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -3368,7 +3368,7 @@ ASSERT_EQ(4U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname"; @@ -4027,7 +4027,7 @@ expected.label = u"* First Name"; expected.name = expected.id_attribute; expected.value = u"John"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); fields.push_back(expected); @@ -4036,7 +4036,7 @@ expected.label = u"* Middle Name"; expected.name = expected.id_attribute; expected.value = u"Joe"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); fields.push_back(expected); @@ -4045,7 +4045,7 @@ expected.label = u"* Last Name"; expected.name = expected.id_attribute; expected.value = u"Smith"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); fields.push_back(expected); @@ -4054,7 +4054,7 @@ expected.label = u"* Country"; expected.name = expected.id_attribute; expected.value = u"US"; - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.max_length = 0; fields.push_back(expected); @@ -4063,7 +4063,7 @@ expected.label = u"* Email"; expected.name = expected.id_attribute; expected.value = u"john@example.com"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); fields.push_back(expected); @@ -4819,7 +4819,7 @@ ASSERT_EQ(4U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.label = u"Phone:"; @@ -4875,7 +4875,7 @@ ASSERT_EQ(6U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.name_attribute = u"dayphone1"; expected.label = u"Phone:"; @@ -5424,7 +5424,7 @@ expected.name = expected.id_attribute; expected.value = u"John"; expected.label = u"John"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); @@ -5432,7 +5432,7 @@ expected.name = expected.id_attribute; expected.value = u"Smith"; expected.label = u"Smith"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); @@ -5440,7 +5440,7 @@ expected.name = expected.id_attribute; expected.value = u"Albania"; expected.label.clear(); - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); @@ -5457,7 +5457,7 @@ expected.name = expected.id_attribute; expected.value = u"John"; expected.label = u"John"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[0]); @@ -5465,7 +5465,7 @@ expected.name = expected.id_attribute; expected.value = u"Smith"; expected.label = u"Smith"; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[1]); @@ -5473,7 +5473,7 @@ expected.name = expected.id_attribute; expected.value = u"AL"; expected.label.clear(); - expected.form_control_type = StringToFormControlType("select-one"); + expected.form_control_type = FormControlType::kSelectOne; expected.max_length = 0; EXPECT_FORM_FIELD_DATA_EQUALS(expected, fields[2]); } @@ -5515,7 +5515,7 @@ ASSERT_EQ(3U, fields.size()); FormFieldData expected; - expected.form_control_type = StringToFormControlType("text"); + expected.form_control_type = FormControlType::kInputText; expected.max_length = WebInputElement::DefaultMaxLength(); expected.id_attribute = u"firstname";
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 7d48a83..6b98993 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -1011,6 +1011,7 @@ "../browser/ui/ash/app_list/app_list_integration_test.cc", "../browser/ui/ash/quick_settings_integration_test.cc", "../browser/ui/ash/shelf/shelf_integration_test.cc", + "base/chromeos/crosier/helper/test_sudo_helper_client_test.cc", "base/chromeos/crosier/upstart_test.cc", # These cannot live in ":test_support" because they use @@ -1022,6 +1023,7 @@ deps += [ "//chrome/test/base/chromeos/crosier:proto", + "//chrome/test/base/chromeos/crosier/helper:common", "//chromeos/services/machine_learning/public/cpp", ] @@ -1147,6 +1149,7 @@ "../browser/browsing_data/browsing_data_remover_browsertest_base.h", "../browser/browsing_data/chrome_browsing_data_lifetime_manager_browsertest.cc", "../browser/engagement/important_sites_util_browsertest.cc", + "../browser/enterprise/remote_commands/user_remote_commands_service_browsertest.cc", "../browser/fast_checkout/fast_checkout_tab_helper_browsertest.cc", "../browser/installable/installable_manager_browsertest.cc", "../browser/metrics/metrics_log_browsertest.cc", @@ -1216,6 +1219,7 @@ "//components/plus_addresses", "//components/policy:chrome_settings_proto_generated_compile", "//components/policy/core/browser:test_support", + "//components/policy/test_support:test_support", "//components/privacy_sandbox/privacy_sandbox_attestations", "//components/privacy_sandbox/privacy_sandbox_attestations:test_support", "//components/privacy_sandbox/privacy_sandbox_attestations/proto:proto", @@ -2335,7 +2339,7 @@ "../browser/preloading/prefetch/search_prefetch/search_preload_test_response_utils.h", "../browser/preloading/prefetch/search_prefetch/search_preload_unified_browsertest.cc", "../browser/preloading/prefetch/zero_suggest_prefetch/zero_suggest_prefetch_tab_helper_browsertest.cc", - "../browser/privacy_sandbox/privacy_sandbox_attestations_component_installer_browsertest.cc", + "../browser/privacy_sandbox/privacy_sandbox_attestations/privacy_sandbox_attestations_component_installer_browsertest.cc", "../browser/privacy_sandbox/privacy_sandbox_settings_browsertest.cc", "../browser/privacy_sandbox/tracking_protection_notice_browsertest.cc", "../browser/privacy_sandbox/tracking_protection_settings_browsertest.cc", @@ -3092,6 +3096,7 @@ if (!is_chromeos_ash) { sources += [ "../browser/chrome_multiprofile_startup_browsertest.cc", + "../browser/enterprise/remote_commands/user_remote_commands_service_browsertest.cc", "../browser/enterprise/reporting/cloud_profile_reporting_browsertest.cc", "../browser/profiles/avatar_menu_browsertest.cc", "../browser/profiles/delete_profile_helper_browsertest.cc", @@ -3442,6 +3447,7 @@ "../browser/extensions/error_console/error_console_browsertest.cc", "../browser/extensions/error_console/error_console_test_observer.cc", "../browser/extensions/error_console/error_console_test_observer.h", + "../browser/extensions/event_metrics_browsertest.cc", "../browser/extensions/events_apitest.cc", "../browser/extensions/extension_action_runner_browsertest.cc", "../browser/extensions/extension_api_frame_id_map_browsertest.cc", @@ -6111,7 +6117,7 @@ "../browser/preloading/preloading_prefs_unittest.cc", "../browser/privacy/privacy_metrics_service_unittest.cc", "../browser/privacy_sandbox/privacy_sandbox_policy_handler_unittest.cc", - "../browser/privacy_sandbox/privacy_sandbox_service_unittest.cc", + "../browser/privacy_sandbox/privacy_sandbox_service_impl_unittest.cc", "../browser/privacy_sandbox/privacy_sandbox_settings_delegate_unittest.cc", "../browser/profiles/gaia_info_update_service_unittest.cc", "../browser/profiles/incognito_mode_policy_handler_unittest.cc", @@ -7205,6 +7211,7 @@ "../browser/touch_to_fill/touch_to_fill_keyboard_suppressor_unittest.cc", "../browser/translate/android/translate_bridge_unittest.cc", "../browser/translate/translate_manager_render_view_host_android_unittest.cc", + "../browser/ui/android/autofill/autofill_save_card_delegate_android_unittest.cc", "../browser/ui/android/autofill/autofill_vcn_enroll_bottom_sheet_bridge_unittest.cc", "../browser/ui/android/device_dialog/usb_chooser_dialog_android_unittest.cc", "../browser/ui/android/fast_checkout/ui_view_android_utils_unittest.cc", @@ -7256,6 +7263,7 @@ "//chrome/browser/ui/android/hats/test:test_support", "//chrome/services/media_gallery_util:unit_tests", "//components/back_forward_cache", + "//components/browser_ui/device_lock/android", "//components/crash/content/browser", "//components/device_reauth", "//components/device_reauth:test_support", @@ -7945,6 +7953,7 @@ "//components/global_media_controls/public/mojom:device_service", "//components/lens:buildflags", "//components/lens:lens_mojo", + "//components/manta", "//components/media_message_center:test_support", "//components/media_router/common:test_support", "//components/permissions:test_support", @@ -10873,7 +10882,6 @@ "//chrome/app:chrome_dll_resources", "//chrome/elevation_service:public_headers", "//chrome/install_static:install_static_util", - "//chrome/installer/util:interactive_ui_tests", "//chrome/installer/util:strings", "//third_party/isimpledom", "//third_party/webrtc_overrides:webrtc_component",
diff --git a/chrome/test/android/chrome_public_test_support/BUILD.gn b/chrome/test/android/chrome_public_test_support/BUILD.gn index 68d0c0a..ada719a0 100644 --- a/chrome/test/android/chrome_public_test_support/BUILD.gn +++ b/chrome/test/android/chrome_public_test_support/BUILD.gn
@@ -9,10 +9,6 @@ # Used as an additional_apk in test scripts. never_incremental = true - # Multidex requires a custom Application class to initialize it. Simpler to - # just disable it. - enable_multidex = false - deps = [ "//chrome/test/android/test_trusted_web_activity:test_trusted_web_activity_java" ] apk_name = "ChromePublicTestSupport"
diff --git a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.cc b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.cc index 2d069ff8..4ce50f0 100644 --- a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.cc +++ b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.cc
@@ -30,21 +30,18 @@ inline constexpr char kMethodRunCommand[] = "runCommand"; inline constexpr char kKeyCommand[] = "command"; -// Returns a JSON string that wraps a remote command line. -std::string ToJsonRunCommand(const std::string_view command) { - base::Value::Dict dict; - dict.Set(kKeyMethod, kMethodRunCommand); - dict.Set(kKeyCommand, command); - - std::string json_string; - CHECK(base::JSONWriter::Write(dict, &json_string)); - return json_string; +std::string GetServerSocketPath() { + base::CommandLine* command = base::CommandLine::ForCurrentProcess(); + CHECK(command->HasSwitch(crosier::kSwitchSocketPath)) + << "Switch " << crosier::kSwitchSocketPath + << " not specified, can't connect to the test_sudo_helper server."; + return command->GetSwitchValueASCII(crosier::kSwitchSocketPath); } } // namespace -TestSudoHelperClient::TestSudoHelperClient(const std::string_view server_path) - : server_path_(server_path) { +TestSudoHelperClient::TestSudoHelperClient() + : server_path_(GetServerSocketPath()) { CHECK_LT(server_path_.size(), sizeof(sockaddr_un::sun_path)); } @@ -52,47 +49,17 @@ TestSudoHelperClient::Result TestSudoHelperClient::RunCommand( const std::string_view command) { - base::FilePath client_path; - CHECK(base::CreateTemporaryFile(&client_path)); + base::Value::Dict dict; + dict.Set(kKeyMethod, kMethodRunCommand); + dict.Set(kKeyCommand, command); - base::ScopedFD sock = ConnectToServer(client_path); - - // Sends the command line. - crosier::SendString(sock, ToJsonRunCommand(command)); - - // Reads the 1 byte return code. - signed char return_code = 0; - crosier::ReadBuffer(sock, &return_code, 1); - - // Reads the output. - std::string output = crosier::ReadString(sock); - - LOG(INFO) << "RunCommand: " << command; - LOG(INFO) << "Return Code: " << base::NumberToString(return_code); - LOG(INFO) << "Output: " << output; - - sock.reset(); - - // Clean up the client socket path. - unlink(client_path.value().c_str()); - - return Result(return_code, output); + return SendDictAndGetResult(dict); } // static TestSudoHelperClient::Result TestSudoHelperClient::ConnectAndRunCommand( const std::string_view command) { - base::CommandLine* cmdline = base::CommandLine::ForCurrentProcess(); - if (!cmdline->HasSwitch(crosier::kSwitchSocketPath)) { - LOG(ERROR) - << "Switch " << crosier::kSwitchSocketPath - << " not specified, can't connect to the test_sudo_helper server."; - return Result(); - } - - TestSudoHelperClient client( - cmdline->GetSwitchValueASCII(crosier::kSwitchSocketPath)); - return client.RunCommand(command); + return TestSudoHelperClient().RunCommand(command); } base::ScopedFD TestSudoHelperClient::ConnectToServer( @@ -112,3 +79,38 @@ << "exited or crashed in the meantime."; return client_sock; } + +TestSudoHelperClient::Result TestSudoHelperClient::SendDictAndGetResult( + const base::Value::Dict& dict) { + std::string json_string; + CHECK(base::JSONWriter::Write(dict, &json_string)); + + base::FilePath client_path; + CHECK(base::CreateTemporaryFile(&client_path)); + + base::ScopedFD sock = ConnectToServer(client_path); + + // Sends the json string. + crosier::SendString(sock, json_string); + + Result result; + + // Reads the 1 byte return code. + signed char byte_buffer = 0; + crosier::ReadBuffer(sock, &byte_buffer, 1); + result.return_code = byte_buffer; + + // Reads the output. + result.output = crosier::ReadString(sock); + + sock.reset(); + + // Clean up the client socket path. + unlink(client_path.value().c_str()); + + LOG(INFO) << "Json sent: " << json_string; + LOG(INFO) << "Return Code: " << result.return_code; + LOG(INFO) << "Output: " << result.output; + + return result; +}
diff --git a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.h b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.h index f99e438..aa0e029 100644 --- a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.h +++ b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.h
@@ -9,6 +9,7 @@ #include <string_view> #include "base/files/scoped_file.h" +#include "base/values.h" namespace base { class FilePath; @@ -27,7 +28,7 @@ std::string output; // stdout and stderr combined. }; - explicit TestSudoHelperClient(const std::string_view server_path); + TestSudoHelperClient(); TestSudoHelperClient(const TestSudoHelperClient&) = delete; TestSudoHelperClient& operator=(const TestSudoHelperClient&) = delete; ~TestSudoHelperClient(); @@ -43,6 +44,8 @@ private: base::ScopedFD ConnectToServer(const base::FilePath& client_path); + Result SendDictAndGetResult(const base::Value::Dict& dict); + // Socket path where `test_sudo_helper` server is listening. By default, // it is `kTestSudoHelperServerSocketPath`. std::string server_path_;
diff --git a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_main.cc b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_main.cc index 1644aa4..a8f0b7a 100644 --- a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_main.cc +++ b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_main.cc
@@ -18,17 +18,18 @@ void Usage() { printf("Usage:\n"); - printf(" %s -- [remote command]\n", base::CommandLine::ForCurrentProcess() - ->GetProgram() - .BaseName() - .value() - .c_str()); + printf(" %s --%s=<server socket path> -- [remote command]\n", + base::CommandLine::ForCurrentProcess() + ->GetProgram() + .BaseName() + .value() + .c_str(), + crosier::kSwitchSocketPath); } -bool RunCommand(const std::string_view server_path, - const std::string_view command) { +bool RunCommand(const std::string_view command) { LOG(INFO) << "Run: " << command; - return TestSudoHelperClient(server_path).RunCommand(command).return_code == 0; + return TestSudoHelperClient().RunCommand(command).return_code == 0; } } // namespace @@ -44,8 +45,6 @@ Usage(); return 0; } - const std::string server_path = - command->GetSwitchValueASCII(crosier::kSwitchSocketPath); auto args = command->GetArgs(); if (args.empty()) { @@ -53,5 +52,5 @@ return 0; } - return RunCommand(server_path, base::JoinString(args, " ")) ? 0 : -1; + return RunCommand(base::JoinString(args, " ")) ? 0 : -1; }
diff --git a/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_test.cc b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_test.cc new file mode 100644 index 0000000..a0fe49d --- /dev/null +++ b/chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client_test.cc
@@ -0,0 +1,14 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/test/base/chromeos/crosier/helper/test_sudo_helper_client.h" + +#include "base/strings/string_util.h" +#include "testing/gtest/include/gtest/gtest.h" + +TEST(TestSudoHelperClientTest, WhoAmI) { + auto result = TestSudoHelperClient().RunCommand("whoami"); + EXPECT_EQ(result.return_code, 0); + EXPECT_EQ(base::TrimString(result.output, " \n", base::TRIM_ALL), "root"); +}
diff --git a/chrome/test/base/test_browser_window.cc b/chrome/test/base/test_browser_window.cc index 12cddc5f..2932378 100644 --- a/chrome/test/base/test_browser_window.cc +++ b/chrome/test/base/test_browser_window.cc
@@ -359,29 +359,19 @@ } user_education::FeaturePromoResult TestBrowserWindow::MaybeShowFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::BubbleCloseCallback close_callback, - user_education::FeaturePromoSpecification::FormatParameters body_params, - user_education::FeaturePromoSpecification::FormatParameters title_params) { + user_education::FeaturePromoParams params) { if (!feature_promo_controller_) { return user_education::FeaturePromoResult::kBlockedByContext; } - return feature_promo_controller_->MaybeShowPromo( - iph_feature, std::move(close_callback), body_params, title_params); + return feature_promo_controller_->MaybeShowPromo(std::move(params)); } bool TestBrowserWindow::MaybeShowStartupFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::StartupPromoCallback promo_callback, - user_education::FeaturePromoController::BubbleCloseCallback close_callback, - user_education::FeaturePromoSpecification::FormatParameters body_params, - user_education::FeaturePromoSpecification::FormatParameters title_params) { + user_education::FeaturePromoParams params) { if (!feature_promo_controller_) return false; - return feature_promo_controller_->MaybeShowStartupPromo( - iph_feature, std::move(promo_callback), std::move(close_callback), - std::move(body_params), std::move(title_params)); + return feature_promo_controller_->MaybeShowStartupPromo(std::move(params)); } bool TestBrowserWindow::CloseFeaturePromo(
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index 8299778..d85e20ee 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h
@@ -243,23 +243,9 @@ user_education::FeaturePromoResult CanShowFeaturePromo( const base::Feature& iph_feature) const override; user_education::FeaturePromoResult MaybeShowFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::BubbleCloseCallback - close_callback = base::DoNothing(), - user_education::FeaturePromoSpecification::FormatParameters body_params = - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::FormatParameters title_params = - user_education::FeaturePromoSpecification::NoSubstitution()) override; + user_education::FeaturePromoParams params) override; bool MaybeShowStartupFeaturePromo( - const base::Feature& iph_feature, - user_education::FeaturePromoController::StartupPromoCallback - promo_callback = base::DoNothing(), - user_education::FeaturePromoController::BubbleCloseCallback - close_callback = base::DoNothing(), - user_education::FeaturePromoSpecification::FormatParameters body_params = - user_education::FeaturePromoSpecification::NoSubstitution(), - user_education::FeaturePromoSpecification::FormatParameters title_params = - user_education::FeaturePromoSpecification::NoSubstitution()) override; + user_education::FeaturePromoParams params) override; bool CloseFeaturePromo( const base::Feature& iph_feature, user_education::FeaturePromoCloseReason close_reason) override;
diff --git a/chrome/test/chromedriver/client/chromedriver.py b/chrome/test/chromedriver/client/chromedriver.py index 3b19a39..1826a95 100644 --- a/chrome/test/chromedriver/client/chromedriver.py +++ b/chrome/test/chromedriver/client/chromedriver.py
@@ -746,9 +746,9 @@ params = {'accountIndex': index} return self.ExecuteCommand(Command.SELECT_ACCOUNT, params) - def ConfirmIdpSignin(self, vendorId): + def ConfirmIdpLogin(self, vendorId): params = {'vendorId': vendorId} - return self.ExecuteCommand(Command.CONFIRM_IDP_SIGNIN, params) + return self.ExecuteCommand(Command.CONFIRM_IDP_LOGIN, params) def GetAccounts(self): return self.ExecuteCommand(Command.GET_ACCOUNTS, {})
diff --git a/chrome/test/chromedriver/client/command_executor.py b/chrome/test/chromedriver/client/command_executor.py index 82a1687..c13f157 100644 --- a/chrome/test/chromedriver/client/command_executor.py +++ b/chrome/test/chromedriver/client/command_executor.py
@@ -227,9 +227,9 @@ SELECT_ACCOUNT = ( _Method.POST, '/session/:sessionId/fedcm/selectaccount') - CONFIRM_IDP_SIGNIN = ( + CONFIRM_IDP_LOGIN = ( _Method.POST, - '/session/:sessionId/:vendorId/fedcm/confirmidpsignin') + '/session/:sessionId/:vendorId/fedcm/confirmidplogin') GET_ACCOUNTS = ( _Method.GET, '/session/:sessionId/fedcm/accountlist')
diff --git a/chrome/test/chromedriver/fedcm_commands.cc b/chrome/test/chromedriver/fedcm_commands.cc index b2ba07d6..0cbc3b2 100644 --- a/chrome/test/chromedriver/fedcm_commands.cc +++ b/chrome/test/chromedriver/fedcm_commands.cc
@@ -62,11 +62,11 @@ return status; } -Status ExecuteConfirmIdpSignin(Session* session, - WebView* web_view, - const base::Value::Dict& params, - std::unique_ptr<base::Value>* value, - Timeout* timeout) { +Status ExecuteConfirmIdpLogin(Session* session, + WebView* web_view, + const base::Value::Dict& params, + std::unique_ptr<base::Value>* value, + Timeout* timeout) { FedCmTracker* tracker = nullptr; Status status = web_view->GetFedCmTracker(&tracker); if (!status.IsOk()) { @@ -80,7 +80,7 @@ command_params.Set("dialogId", tracker->GetLastDialogId()); std::unique_ptr<base::Value> result; - status = web_view->SendCommandAndGetResult("FedCm.confirmIdpSignin", + status = web_view->SendCommandAndGetResult("FedCm.confirmIdpLogin", command_params, &result); tracker->DialogClosed(); return status;
diff --git a/chrome/test/chromedriver/fedcm_commands.h b/chrome/test/chromedriver/fedcm_commands.h index f47c0497..7f721bd 100644 --- a/chrome/test/chromedriver/fedcm_commands.h +++ b/chrome/test/chromedriver/fedcm_commands.h
@@ -27,11 +27,11 @@ std::unique_ptr<base::Value>* value, Timeout* timeout); -Status ExecuteConfirmIdpSignin(Session* session, - WebView* web_view, - const base::Value::Dict& params, - std::unique_ptr<base::Value>* value, - Timeout* timeout); +Status ExecuteConfirmIdpLogin(Session* session, + WebView* web_view, + const base::Value::Dict& params, + std::unique_ptr<base::Value>* value, + Timeout* timeout); Status ExecuteGetAccounts(Session* session, WebView* web_view,
diff --git a/chrome/test/chromedriver/fedcm_commands_unittest.cc b/chrome/test/chromedriver/fedcm_commands_unittest.cc index 578a8bb..db288d0 100644 --- a/chrome/test/chromedriver/fedcm_commands_unittest.cc +++ b/chrome/test/chromedriver/fedcm_commands_unittest.cc
@@ -44,7 +44,7 @@ account.Set("givenName", "Foo"); account.Set("pictureUrl", "https://pics/pic.jpg"); account.Set("idpConfigUrl", "https://idp.example/fedcm.json"); - account.Set("idpSigninUrl", "https://idp.example/signin"); + account.Set("idpLoginUrl", "https://idp.example/login"); account.Set("loginState", "SignIn"); base::Value::List accounts; @@ -145,9 +145,9 @@ std::string* idpConfigUrl = account->FindString("idpConfigUrl"); ASSERT_TRUE(idpConfigUrl); EXPECT_EQ(*idpConfigUrl, "https://idp.example/fedcm.json"); - std::string* idpSigninUrl = account->FindString("idpSigninUrl"); - ASSERT_TRUE(idpSigninUrl); - EXPECT_EQ(*idpSigninUrl, "https://idp.example/signin"); + std::string* idpLoginUrl = account->FindString("idpLoginUrl"); + ASSERT_TRUE(idpLoginUrl); + EXPECT_EQ(*idpLoginUrl, "https://idp.example/login"); std::string* loginState = account->FindString("loginState"); ASSERT_TRUE(loginState); EXPECT_EQ(*loginState, "SignIn");
diff --git a/chrome/test/chromedriver/server/http_handler.cc b/chrome/test/chromedriver/server/http_handler.cc index c304f59..bdd1c5eb 100644 --- a/chrome/test/chromedriver/server/http_handler.cc +++ b/chrome/test/chromedriver/server/http_handler.cc
@@ -950,9 +950,9 @@ // This command is prefixed because standardization is still pending: // https://github.com/fedidcg/FedCM/pull/436/files VendorPrefixedCommandMapping( - kPost, "session/:sessionId/%s/fedcm/confirmidpsignin", - WrapToCommand("ConfirmIdpSignin", - base::BindRepeating(&ExecuteConfirmIdpSignin))), + kPost, "session/:sessionId/%s/fedcm/confirmidplogin", + WrapToCommand("ConfirmIdpLogin", + base::BindRepeating(&ExecuteConfirmIdpLogin))), CommandMapping(kGet, "session/:sessionId/fedcm/accountlist", WrapToCommand("GetAccounts",
diff --git a/chrome/test/chromedriver/test/run_py_tests.py b/chrome/test/chromedriver/test/run_py_tests.py index 983cf75..a48faed 100755 --- a/chrome/test/chromedriver/test/run_py_tests.py +++ b/chrome/test/chromedriver/test/run_py_tests.py
@@ -6985,7 +6985,7 @@ token = self._driver.ExecuteScript('return getResult()') self.assertEqual('Error: NetworkError: Error retrieving a token.', token) - def testConfirmIdpSignin(self): + def testConfirmIdpLogin(self): self._accounts = "" self._driver.Load(self._https_server.GetUrl() + "/fedcm.html") @@ -6998,12 +6998,12 @@ self.assertTrue(self.WaitForCondition(self.FedCmDialogCondition)) accounts = self._driver.GetAccounts() - self.assertEqual("ConfirmIdpSignin", self._driver.GetDialogType()) + self.assertEqual("ConfirmIdpLogin", self._driver.GetDialogType()) self.assertEqual(0, len(accounts)) self._accounts = self._default_accounts - self._driver.ConfirmIdpSignin(self._vendor_id) + self._driver.ConfirmIdpLogin(self._vendor_id) self.assertTrue(self.WaitForCondition(self.FedCmDialogCondition)) accounts = self._driver.GetAccounts()
diff --git a/chrome/test/chromeos/printing/fake_local_printer_chromeos.cc b/chrome/test/chromeos/printing/fake_local_printer_chromeos.cc index 254fcd2..5f0bc1d 100644 --- a/chrome/test/chromeos/printing/fake_local_printer_chromeos.cc +++ b/chrome/test/chromeos/printing/fake_local_printer_chromeos.cc
@@ -79,6 +79,12 @@ FAIL(); } +void FakeLocalPrinter::AddLocalPrintersObserver( + mojo::PendingRemote<crosapi::mojom::LocalPrintersObserver> remote, + AddLocalPrintersObserverCallback callback) { + FAIL(); +} + void FakeLocalPrinter::GetOAuthAccessToken( const std::string& printer_id, GetOAuthAccessTokenCallback callback) {
diff --git a/chrome/test/chromeos/printing/fake_local_printer_chromeos.h b/chrome/test/chromeos/printing/fake_local_printer_chromeos.h index ee04fd4..be15a1c1 100644 --- a/chrome/test/chromeos/printing/fake_local_printer_chromeos.h +++ b/chrome/test/chromeos/printing/fake_local_printer_chromeos.h
@@ -42,6 +42,9 @@ mojo::PendingRemote<crosapi::mojom::PrintJobObserver> remote, crosapi::mojom::PrintJobSource source, AddPrintJobObserverCallback callback) override; + void AddLocalPrintersObserver( + mojo::PendingRemote<crosapi::mojom::LocalPrintersObserver> remote, + AddLocalPrintersObserverCallback callback) override; void GetOAuthAccessToken(const std::string& printer_id, GetOAuthAccessTokenCallback callback) override; void GetIppClientInfo(const std::string& printer_id,
diff --git a/chrome/test/data/chromedriver/fedcm/fedcm.json b/chrome/test/data/chromedriver/fedcm/fedcm.json index e68a4bf3..210c5ab 100644 --- a/chrome/test/data/chromedriver/fedcm/fedcm.json +++ b/chrome/test/data/chromedriver/fedcm/fedcm.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "accounts.json", "client_metadata_endpoint": "client_metadata.json", "id_assertion_endpoint": "token.json", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/chrome/test/data/dips/v4.sql b/chrome/test/data/dips/v4.sql new file mode 100644 index 0000000..300e725 --- /dev/null +++ b/chrome/test/data/dips/v4.sql
@@ -0,0 +1,61 @@ +PRAGMA foreign_keys = OFF; + +BEGIN TRANSACTION; + +CREATE TABLE IF NOT EXISTS bounces( + site TEXT PRIMARY KEY NOT NULL, + first_site_storage_time INTEGER DEFAULT NULL, + last_site_storage_time INTEGER DEFAULT NULL, + first_user_interaction_time INTEGER DEFAULT NULL, + last_user_interaction_time INTEGER DEFAULT NULL, + first_stateful_bounce_time INTEGER DEFAULT NULL, + last_stateful_bounce_time INTEGER DEFAULT NULL, + first_bounce_time INTEGER DEFAULT NULL, + last_bounce_time INTEGER DEFAULT NULL, + first_web_authn_assertion_time INTEGER DEFAULT NULL, + last_web_authn_assertion_time INTEGER DEFAULT NULL +); + +CREATE TABLE IF NOT EXISTS popups( + opener_site TEXT NOT NULL, + popup_site TEXT NOT NULL, + access_id INTEGER DEFAULT NULL, + last_popup_time INTEGER DEFAULT NULL, + PRIMARY KEY (opener_site, popup_site) +); + +CREATE TABLE meta( + key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, + value LONGVARCHAR +); + +INSERT INTO + meta +VALUES + ('version', '4'); + +INSERT INTO + meta +VALUES + ('last_compatible_version', '4'); + +INSERT INTO + meta +VALUES + ('prepopulated', '1'); + +INSERT INTO + bounces +VALUES + ('storage.test', 1, 1, 4, 4, NULL, NULL, NULL, NULL, NULL, NULL), + ('stateful-bounce.test', NULL, NULL, 4, 4, 1, 1, NULL, NULL, NULL, NULL), + ('stateless-bounce.test', NULL, NULL, 4, 4, NULL, NULL, 1, 1, NULL, NULL), + ('both-bounce-kinds.test', NULL, NULL, 4, 4, 1, 4, 2, 6, NULL, NULL); + +INSERT INTO + popups +VALUES + ('site1.com', '3p-site.com', 123, '2023-10-01 12:00:00'), + ('site2.com', '3p-site.com', 456, '2023-10-02 12:00:00'); + +COMMIT;
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/manifest.json b/chrome/test/data/extensions/api_test/user_scripts/update/manifest.json new file mode 100644 index 0000000..36246b28 --- /dev/null +++ b/chrome/test/data/extensions/api_test/user_scripts/update/manifest.json
@@ -0,0 +1,18 @@ +{ + "name": "User script test extension", + "version": "0.1", + "manifest_version": 3, + "description": "Tests a variety of user scripts API calls for updating user scripts.", + "background": { + "service_worker": "worker.js", + "type": "module" + }, + "permissions": [ + "userScripts", + "scripting" + ], + "host_permissions": [ + "*://hostperms-a.com/*", + "*://hostperms-b.com/*" + ] +}
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/user_script.js b/chrome/test/data/extensions/api_test/user_scripts/update/user_script.js new file mode 100644 index 0000000..e84222c --- /dev/null +++ b/chrome/test/data/extensions/api_test/user_scripts/update/user_script.js
@@ -0,0 +1,7 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var div = document.createElement('div'); +div.id = 'injected_user_script'; +document.body.appendChild(div);
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/user_script_2.js b/chrome/test/data/extensions/api_test/user_scripts/update/user_script_2.js new file mode 100644 index 0000000..ba8b8bc --- /dev/null +++ b/chrome/test/data/extensions/api_test/user_scripts/update/user_script_2.js
@@ -0,0 +1,7 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var div = document.createElement('div'); +div.id = 'injected_user_script_2'; +document.body.appendChild(div);
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/user_script_3.js b/chrome/test/data/extensions/api_test/user_scripts/update/user_script_3.js new file mode 100644 index 0000000..11bd7386 --- /dev/null +++ b/chrome/test/data/extensions/api_test/user_scripts/update/user_script_3.js
@@ -0,0 +1,7 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var div = document.createElement('div'); +div.id = 'injected_user_script_3'; +document.body.appendChild(div);
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/user_script_4.js b/chrome/test/data/extensions/api_test/user_scripts/update/user_script_4.js new file mode 100644 index 0000000..00ba8a46 --- /dev/null +++ b/chrome/test/data/extensions/api_test/user_scripts/update/user_script_4.js
@@ -0,0 +1,7 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +var div = document.createElement('div'); +div.id = 'injected_user_script_4'; +document.body.appendChild(div);
diff --git a/chrome/test/data/extensions/api_test/user_scripts/update/worker.js b/chrome/test/data/extensions/api_test/user_scripts/update/worker.js new file mode 100644 index 0000000..0829de31 --- /dev/null +++ b/chrome/test/data/extensions/api_test/user_scripts/update/worker.js
@@ -0,0 +1,325 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {openTab} from '/_test_resources/test_util/tabs_util.js'; + +// Navigates to an url requested by the extension and returns the opened tab. +async function navigateToRequestedUrl() { + const config = await chrome.test.getConfig(); + const url = `http://hostperms-a.com:${config.testServer.port}/simple.html`; + let tab = await openTab(url); + return tab; +} + +// Returns the injected element ids in `tabId`. +async function getInjectedElementIds(tabId) { + let injectedElements = await chrome.scripting.executeScript({ + target: {tabId: tabId}, + func: () => { + let childIds = []; + for (const child of document.body.children) + childIds.push(child.id); + return childIds.sort(); + } + }); + chrome.test.assertEq(1, injectedElements.length); + return injectedElements[0].result; +}; + +chrome.test.runTests([ + // Test that an error is returned when any of the script IDs specified in + // userScripts.update do not match any registered user script, and that + // the failed operation does not change the previously registered user + // scripts. + async function nonExistentIdError() { + await chrome.userScripts.unregister(); + + // Register a user script. + const existentId = 'existentId' + const scriptsToRegister = [ + {id: existentId, matches: ['*://*/*'], js: [{file: 'user_script.js'}]} + ]; + await chrome.userScripts.register(scriptsToRegister); + + // Updating scripts when one of them has a non-existent id should fail. + const nonExistentId = 'nonExistentId' + const scriptsToUpdate = [ + { + id: existentId, + matches: ['*://hostperms-a.com/*'], + js: [{file: 'user_script_2.js'}] + }, + { + id: nonExistentId, + matches: ['*://hostperms-a.com/*'], + js: [{file: 'user_script_3.js'}] + } + ]; + await chrome.test.assertPromiseRejects( + chrome.userScripts.update(scriptsToUpdate), + `Error: Script with ID '${ + nonExistentId}' does not exist or is not fully registered`); + + // Verify previously registered user script was not affected. + const expectedScripts = [{ + id: existentId, + matches: ['*://*/*'], + js: [{file: 'user_script.js'}], + runAt: 'document_idle', + allFrames: false + }]; + const registeredScripts = await chrome.userScripts.getScripts(); + chrome.test.assertEq(expectedScripts, registeredScripts); + + chrome.test.succeed(); + }, + + // Test that an error is returned if more than one entry specified in + // userScripts.update contains the same script ID, and that the failed + // operation does not change the existent registered user scripts. + async function duplicateScriptIdError() { + await chrome.userScripts.unregister(); + + // Register a user script. + const scriptId = 'us1' + const scriptsToRegister = + [{id: scriptId, matches: ['*://*/*'], js: [{file: 'user_script.js'}]}]; + await chrome.userScripts.register(scriptsToRegister); + + // Updating two scripts with the same ID should fail. + const scriptsToUpdate = [ + { + id: scriptId, + matches: ['*://hostperms-a.com/*'], + js: [{file: 'user_script_2.js'}] + }, + { + id: scriptId, + matches: ['*://abc.com/*'], + js: [{file: 'user_script_2.js'}] + } + ]; + + await chrome.test.assertPromiseRejects( + chrome.userScripts.update(scriptsToUpdate), + `Error: Duplicate script ID '${scriptId}'`); + + // Verify previously registered user script was not affected. + const expectedScripts = [{ + id: 'us1', + matches: ['*://*/*'], + js: [{file: 'user_script.js'}], + runAt: 'document_idle', + allFrames: false + }]; + const registeredScripts = await chrome.userScripts.getScripts(); + chrome.test.assertEq(expectedScripts, registeredScripts); + + chrome.test.succeed(); + }, + + // Test that an error is returned if any script is specified with a file that + // cannot be read in userScripts.update, and that the failed operation does + // not changed the existent registered user scripts. + async function fileNonExistentError() { + await chrome.userScripts.unregister(); + + // Register user script. + const scriptsToRegister = [ + {id: 'us1', matches: ['*://*/*'], js: [{file: 'user_script.js'}]}, + {id: 'us2', matches: ['*://*/*'], js: [{file: 'user_script_2.js'}]} + ]; + await chrome.userScripts.register(scriptsToRegister); + let tab = await navigateToRequestedUrl(); + + // Verify user scripts were registered and injected. + let registeredScripts = await chrome.userScripts.getScripts(); + chrome.test.assertEq(2, registeredScripts.length); + chrome.test.assertEq( + ['injected_user_script', 'injected_user_script_2'], + await getInjectedElementIds(tab.id)); + + // Updating a script with a non existent file should fail. + const nonExistentFile = 'NONEXISTENT.js'; + const scriptsToUpdate = [ + { + id: 'us1', + matches: ['*://hostperms-a.com/*'], + js: [{file: 'user_script_3.js'}] + }, + { + id: 'us2', + matches: ['*://hostperms-a.com/*'], + js: [{file: nonExistentFile}] + } + ]; + + await chrome.test.assertPromiseRejects( + chrome.userScripts.update(scriptsToUpdate), + `Error: Could not load javascript '${ + nonExistentFile}' for content script.`); + + // Verify previously registered user scripts were not affected. + registeredScripts = await chrome.userScripts.getScripts(); + chrome.test.assertEq(2, registeredScripts.length); + chrome.test.assertEq( + ['injected_user_script', 'injected_user_script_2'], + await getInjectedElementIds(tab.id)); + + chrome.test.succeed(); + }, + + // Tests that calling userScripts.update with a specific ID updates such + // script and does not inject them into a (former) matching frame. + async function scriptUpdated() { + await chrome.userScripts.unregister(); + + // Register user script. + const scriptsToRegister = [{ + id: 'us1', + matches: ['*://hostperms-a.com/*'], + excludeMatches: ['*://abc.com/*'], + js: [{file: 'user_script.js'}], + runAt: 'document_end', + allFrames: true + }]; + await chrome.userScripts.register(scriptsToRegister); + + // Verify user script was registered. + let registeredScripts = await chrome.userScripts.getScripts(); + chrome.test.assertEq(1, registeredScripts.length); + + // Verify script file is injected in a matching url. + const config = await chrome.test.getConfig(); + let url = `http://hostperms-a.com:${config.testServer.port}/simple.html`; + let tab = await openTab(url); + chrome.test.assertEq( + ['injected_user_script'], await getInjectedElementIds(tab.id)); + + // Update user script matches and javascript file. + var scriptsToUpdate = [{ + id: 'us1', + matches: ['*://hostperms-b.com/*'], + excludeMatches: ['*://def.com/*'], + js: [{file: 'user_script_2.js'}], + allFrames: false + }]; + await chrome.userScripts.update(scriptsToUpdate); + + // Verify user script was updated. + const expectedScripts = [{ + id: 'us1', + matches: ['*://hostperms-b.com/*'], + excludeMatches: ['*://def.com/*'], + js: [{file: 'user_script_2.js'}], + runAt: 'document_end', + allFrames: false + }]; + registeredScripts = await chrome.userScripts.getScripts(); + chrome.test.assertEq(expectedScripts, registeredScripts); + + // Verify no script file is injected in a non-matching url (which previously + // matched). + url = `http://hostperms-a.com:${config.testServer.port}/simple.html`; + tab = await openTab(url); + chrome.test.assertEq([], await getInjectedElementIds(tab.id)); + + // Verify new script file is injected in the new matching url. + url = `http://hostperms-b.com:${config.testServer.port}/simple.html`; + tab = await openTab(url); + chrome.test.assertEq( + ['injected_user_script_2'], await getInjectedElementIds(tab.id)); + + chrome.test.succeed(); + }, + + // Test that if two userScript.update calls are made in quick succession, + // then both calls should succeed in updating their scripts and the old + // version of these scripts are overwritten. + async function scriptUpdated_ParallelCalls() { + await chrome.userScripts.unregister(); + + // Register two user scripts that each inject a different element into the + // page. + var scriptsToRegister = [ + { + id: 'us1', + matches: ['*://*/*'], + js: [{file: 'user_script.js'}], + runAt: 'document_end', + allFrames: true + }, + { + id: 'us2', + matches: ['*://*/*'], + js: [{file: 'user_script_2.js'}], + runAt: 'document_end', + allFrames: true + } + ]; + await chrome.userScripts.register(scriptsToRegister); + let tab = await navigateToRequestedUrl(); + + // Verify both scripts are injected, and each injected one element. + chrome.test.assertEq( + ['injected_user_script', 'injected_user_script_2'], + await getInjectedElementIds(tab.id)); + + // Now update both scripts to inject different elements. + let scriptToUpdate1 = [{ + id: 'us1', + matches: ['*://*/*'], + js: [{file: 'user_script_3.js'}], + allFrames: false + }]; + let scriptToUpdate2 = [{ + id: 'us2', + matches: ['*://*/*'], + js: [{file: 'user_script_4.js'}], + allFrames: true + }]; + + await Promise.allSettled([ + chrome.userScripts.update(scriptToUpdate1), + chrome.userScripts.update(scriptToUpdate2) + ]); + tab = await navigateToRequestedUrl(); + + // Verify that the old versions of both scripts are not injected by checking + // that the IDs of the elements injected pertain to the updated scripts. + chrome.test.assertEq( + ['injected_user_script_3', 'injected_user_script_4'], + await getInjectedElementIds(tab.id)); + + // Now update one script twice to inject different elements. + scriptToUpdate1 = [{ + id: 'us1', + matches: ['*://*/*'], + js: [{file: 'user_script.js'}], + allFrames: false + }]; + scriptToUpdate2 = [{ + id: 'us1', + matches: ['*://*/*'], + js: [{file: 'user_script_2.js'}], + allFrames: true + }]; + + await Promise.allSettled([ + chrome.userScripts.update(scriptToUpdate1), + chrome.userScripts.update(scriptToUpdate2) + ]); + tab = await navigateToRequestedUrl(); + + // Verify that the double updated script only injects the file from the + // second update. Note that the other script is still injected, since it + // wasn't updated. + chrome.test.assertEq( + ['injected_user_script_2', 'injected_user_script_4'], + await getInjectedElementIds(tab.id)); + + + chrome.test.succeed(); + } +]);
diff --git a/chrome/test/data/extensions/events/metrics/web_navigation/background.js b/chrome/test/data/extensions/events/metrics/web_navigation/background.js new file mode 100644 index 0000000..1296223c --- /dev/null +++ b/chrome/test/data/extensions/events/metrics/web_navigation/background.js
@@ -0,0 +1,20 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +chrome.runtime.onInstalled.addListener((details) => { + // Asynchronously send the message that the listener fired so that the event + // is considered ack'd in the browser C++ code. + setTimeout(() => { + chrome.test.sendMessage('installed listener fired'); + }, 0); +}); + +// TODO(crbug.com/1441221): Why doesn't onCompleted work for our test? +chrome.webNavigation.onBeforeNavigate.addListener((details) => { + // Asynchronously send the message that the listener fired so that the event + // is considered ack'd in the browser C++ code. + setTimeout(() => { + chrome.test.sendMessage('listener fired'); + }, 0); +});
diff --git a/chrome/test/data/extensions/events/metrics/web_navigation/manifest.json b/chrome/test/data/extensions/events/metrics/web_navigation/manifest.json new file mode 100644 index 0000000..73d230a6 --- /dev/null +++ b/chrome/test/data/extensions/events/metrics/web_navigation/manifest.json
@@ -0,0 +1,10 @@ +{ + "name": "Event page webNavigation", + "version": "0.1", + "manifest_version": 2, + "background": { + "scripts": ["background.js"], + "persistent": false + }, + "permissions": ["webNavigation"] +}
diff --git a/chrome/test/data/extensions/events/metrics/web_request/background.js b/chrome/test/data/extensions/events/metrics/web_request/background.js new file mode 100644 index 0000000..8b176ce --- /dev/null +++ b/chrome/test/data/extensions/events/metrics/web_request/background.js
@@ -0,0 +1,23 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +chrome.runtime.onInstalled.addListener((details) => { + // Asynchronously send the message that the listener fired so that the event + // is considered ack'd in the browser C++ code. + setTimeout(() => { + chrome.test.sendMessage('installed listener fired'); + }, 0); +}); + +// TODO(crbug.com/1441221): Why doesn't onCompleted work for our test? +chrome.webRequest.onBeforeRequest.addListener( + (details) => { + // Asynchronously send the message that the listener fired so that the event + // is considered ack'd in the browser C++ code. + setTimeout(() => { + chrome.test.sendMessage('listener fired'); + }, 0); + }, + {urls: ['<all_urls>'], types: ['main_frame']}, + []);
diff --git a/chrome/test/data/extensions/events/metrics/web_request/manifest.json b/chrome/test/data/extensions/events/metrics/web_request/manifest.json new file mode 100644 index 0000000..26bdb0f --- /dev/null +++ b/chrome/test/data/extensions/events/metrics/web_request/manifest.json
@@ -0,0 +1,12 @@ +{ + "name": "Service Worker webRequest", + "version": "0.1", + "manifest_version": 3, + "background": { + "service_worker": "background.js" + }, + "host_permissions": [ + "http://example.com/*" + ], + "permissions": ["webRequest"] +}
diff --git a/chrome/test/data/media/picture-in-picture/autopip-camera.html b/chrome/test/data/media/picture-in-picture/autopip-camera.html index d6455e7..c889e57 100644 --- a/chrome/test/data/media/picture-in-picture/autopip-camera.html +++ b/chrome/test/data/media/picture-in-picture/autopip-camera.html
@@ -8,11 +8,7 @@ <body></body> <script> function openPip(details) { - // These tests should have `automatic` set to true in the - // MediaSessionActionDetails, so only proceed if they do. - if (details.automatic) { - documentPictureInPicture.requestWindow(); - } + documentPictureInPicture.requestWindow(); } navigator.mediaSession.setActionHandler('enterpictureinpicture', openPip);
diff --git a/chrome/test/data/media/picture-in-picture/autopip-delay.html b/chrome/test/data/media/picture-in-picture/autopip-delay.html index 62ca0852..fc1f4e44 100644 --- a/chrome/test/data/media/picture-in-picture/autopip-delay.html +++ b/chrome/test/data/media/picture-in-picture/autopip-delay.html
@@ -9,14 +9,10 @@ </body> <script> function openPip(details) { - // These tests should have `automatic` set to true in the - // MediaSessionActionDetails, so only proceed if they do. - if (details.automatic) { - // Delay opening PiP, but still within the user gesture window. - setTimeout(() => { - documentPictureInPicture.requestWindow(); - }, 100); - } + // Delay opening PiP, but still within the user gesture window. + setTimeout(() => { + documentPictureInPicture.requestWindow(); + }, 100); } navigator.mediaSession.setActionHandler('enterpictureinpicture', openPip);
diff --git a/chrome/test/data/media/picture-in-picture/autopip-document.html b/chrome/test/data/media/picture-in-picture/autopip-document.html index 4292b55..cf7840a6 100644 --- a/chrome/test/data/media/picture-in-picture/autopip-document.html +++ b/chrome/test/data/media/picture-in-picture/autopip-document.html
@@ -20,11 +20,7 @@ } function openPip(details) { - // These tests should have `automatic` set to true in the - // MediaSessionActionDetails, so only proceed if they do. - if (details.automatic) { - documentPictureInPicture.requestWindow(); - } + documentPictureInPicture.requestWindow(); } navigator.mediaSession.setActionHandler('enterpictureinpicture', openPip);
diff --git a/chrome/test/data/media/picture-in-picture/autopip-video.html b/chrome/test/data/media/picture-in-picture/autopip-video.html index 9d5264da..3ac6426 100644 --- a/chrome/test/data/media/picture-in-picture/autopip-video.html +++ b/chrome/test/data/media/picture-in-picture/autopip-video.html
@@ -20,11 +20,7 @@ } function openPip(details) { - // These tests should have `automatic` set to true in the - // MediaSessionActionDetails, so only proceed if they do. - if (details.automatic) { - video.requestPictureInPicture(); - } + video.requestPictureInPicture(); } navigator.mediaSession.setActionHandler('enterpictureinpicture', openPip);
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js index 4bc6e0e..493b1cc 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_icon_test.js
@@ -50,6 +50,30 @@ assertTrue(networkIcon.$$('#icon').classList.contains('cellular-locked')); }); + test('Display locked cellular icon for carrier lock', async function() { + loadTimeData.overrideValues({'isCellularCarrierLockEnabled': true}); + init(); + const networkState = + OncMojo.getDefaultNetworkState(NetworkType.kCellular, 'cellular'); + networkState.typeState.cellular.iccid = '1'; + networkState.typeState.cellular.eid = '1'; + networkState.typeState.cellular.simLocked = true; + networkState.typeState.cellular.simLockType = 'network-pin'; + networkIcon.networkState = networkState; + + networkIcon.deviceState = { + type: NetworkType.kCellular, + deviceState: DeviceStateType.kEnabled, + simInfos: [ + {slot_id: 1, eid: '1', iccid: '1', isPrimary: false}, + ], + scanning: true, + }; + await flushAsync(); + + assertTrue(networkIcon.$$('#icon').classList.contains('cellular-locked')); + }); + [true, false].forEach(isUserLoggedIn => { test('Display unactivated PSim icon', async function() { loadTimeData.overrideValues({
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js b/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js index 3f657133..f129e332 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/network_list_item_test.js
@@ -47,14 +47,16 @@ flush(); } - function initCellularNetwork(iccid, eid, simLocked, name) { + function initCellularNetwork(iccid, eid, simLocked, simLockType, name) { const properties = OncMojo.getDefaultManagedProperties( NetworkType.kCellular, 'cellular', name); properties.typeProperties.cellular.iccid = iccid; properties.typeProperties.cellular.eid = eid; properties.typeProperties.cellular.simLocked = simLocked; mojoApi_.setManagedPropertiesForTest(properties); - return OncMojo.managedPropertiesToNetworkState(properties); + const networkState = OncMojo.managedPropertiesToNetworkState(properties); + networkState.typeState.cellular.simLockType = simLockType; + return networkState; } function setEventListeners() { @@ -163,7 +165,8 @@ const euicc = eSimManagerRemote.addEuiccForTest(/*numProfiles=*/ 1); const providerName = 'provider1'; listItem.item = initCellularNetwork( - /*iccid=*/ '1', /*eid=*/ '1', /*simlock=*/ false, 'nickname'); + /*iccid=*/ '1', /*eid=*/ '1', /*simlock=*/ false, /*simlocktype*/ '', + 'nickname'); await flushAsync(); assertEquals( listItem.i18n('networkListItemTitle', 'nickname', providerName), @@ -172,7 +175,8 @@ // Change eSIM network's name to the same as provider name, verifies that // the title only show the network name. listItem.item = initCellularNetwork( - /*iccid=*/ '1', /*eid=*/ '1', /*simlock=*/ false, providerName); + /*iccid=*/ '1', /*eid=*/ '1', /*simlock=*/ false, /*simlocktype*/ '', + providerName); await flushAsync(); assertEquals(providerName, getTitle()); }); @@ -190,7 +194,7 @@ const badName = '<script>alert("Bad Name");</script>'; listItem.item = initCellularNetwork( /*iccid=*/ '1', /*eid=*/ '1', /*simlock=*/ false, - /*name=*/ badName); + /*simlocktype*/ '', /*name=*/ badName); await flushAsync(); assertTrue(!!listItem); assertTrue(getTitle().startsWith(badName)); @@ -669,6 +673,46 @@ }); test( + 'Show carrier locked sublabel when cellular network is carrier locked', + async () => { + loadTimeData.overrideValues({ + 'isUserLoggedIn': true, + 'isCellularCarrierLockEnabled': true, + }); + init(); + const iccid = '11111111111111111111'; + const eid = '1'; + eSimManagerRemote.addEuiccForTest(/*numProfiles=*/ 1); + const networkStateLockedText = + listItem.i18n('networkListItemUpdatedCellularSimCardCarrierLocked'); + listItem.item = initCellularNetwork( + iccid, eid, /*simlocked=*/ true, /*simlocktype*/ 'network-pin'); + + await flushAsync(); + const sublabel = listItem.$$('#sublabel'); + assertTrue(!!sublabel); + assertEquals(networkStateLockedText, sublabel.textContent.trim()); + }); + + test('Show sim locked sublabel when carrier lock is disabled', async () => { + loadTimeData.overrideValues( + {'isUserLoggedIn': true, 'isCellularCarrierLockEnabled': false}); + init(); + const iccid = '11111111111111111111'; + const eid = '1'; + eSimManagerRemote.addEuiccForTest(/*numProfiles=*/ 1); + const networkStateLockedText = + listItem.i18n('networkListItemUpdatedCellularSimCardLocked'); + listItem.item = initCellularNetwork( + iccid, eid, /*simlocked=*/ true, /*simlocktype*/ 'network-pin'); + + await flushAsync(); + const sublabel = listItem.$$('#sublabel'); + assertTrue(!!sublabel); + assertEquals(networkStateLockedText, sublabel.textContent.trim()); + }); + + test( 'Show locked sublabel when cellular network is locked and scanning', async () => { init();
diff --git a/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js b/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js index c17f566e8..50b36b4 100644 --- a/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js +++ b/chrome/test/data/webui/cr_components/chromeos/network/sim_lock_dialogs_test.js
@@ -78,6 +78,21 @@ assertTrue(!!simLockDialog.$$(`#adminSubtitle`)); }); + test('Unlock dialog not displayed when carrier locked', async function() { + loadTimeData.overrideValues({'isCellularCarrierLockEnabled': true}); + const deviceState = { + simLockStatus: + {lockEnabled: true, lockType: 'network-pin', retriesLeft: 3}, + }; + const dialog = simLockDialog.$$(`#unlockPinDialog`); + assertTrue(!!dialog); + assertFalse(dialog.open); + simLockDialog.deviceState = deviceState; + await flushAsync(); + assertFalse(dialog.open); + }); + + test('Show Unlock PUK dialog', async function() { const deviceState = { simLockStatus: {lockEnabled: true, lockType: 'sim-puk', retriesLeft: 3},
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn index dd9b48a..94d23e1 100644 --- a/chrome/test/data/webui/settings/chromeos/BUILD.gn +++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -235,6 +235,7 @@ "os_languages_page/test_os_languages_browser_proxy.ts", "os_languages_page/test_os_languages_metrics_proxy.ts", + "os_people_page/account_manager_settings_card_test.ts", "os_people_page/account_manager_subpage_test.ts", "os_people_page/add_user_dialog_test.ts", "os_people_page/fingerprint_list_subpage_test.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/internet_page/hotspot_subpage_test.ts b/chrome/test/data/webui/settings/chromeos/internet_page/hotspot_subpage_test.ts index 2389b50..8cdd3ada 100644 --- a/chrome/test/data/webui/settings/chromeos/internet_page/hotspot_subpage_test.ts +++ b/chrome/test/data/webui/settings/chromeos/internet_page/hotspot_subpage_test.ts
@@ -127,8 +127,8 @@ // Simulate state becoming kEnabling. hotspotConfig.setFakeHotspotState(HotspotState.kEnabling); await flushAsync(); - // Toggle should be disabled. - assertTrue(enableHotspotToggle.disabled); + // Toggle should not be disabled. + assertFalse(enableHotspotToggle.disabled); hotspotConfig.setFakeHotspotState(HotspotState.kDisabled); // Simulate AllowStatus becoming kDisallowedByPolicy.
diff --git a/chrome/test/data/webui/settings/chromeos/main_page_container/main_page_container_test.ts b/chrome/test/data/webui/settings/chromeos/main_page_container/main_page_container_test.ts index 7c6d6cb4..0949ec7 100644 --- a/chrome/test/data/webui/settings/chromeos/main_page_container/main_page_container_test.ts +++ b/chrome/test/data/webui/settings/chromeos/main_page_container/main_page_container_test.ts
@@ -4,6 +4,7 @@ import 'chrome://os-settings/os_settings.js'; +import {AccountManagerBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js'; import {createPageAvailabilityForTesting, createRouterForTesting, CrSettingsPrefs, MainPageContainerElement, Router, routes, routesMojom, setContactManagerForTesting, setNearbyShareSettingsForTesting, SettingsPrefsElement} from 'chrome://os-settings/os_settings.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; @@ -12,6 +13,8 @@ import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js'; import {isVisible} from 'chrome://webui-test/test_util.js'; +import {TestAccountManagerBrowserProxy} from '../os_people_page/test_account_manager_browser_proxy.js'; + const {Section} = routesMojom; suite('<main-page-container>', () => { @@ -22,6 +25,7 @@ let prefElement: SettingsPrefsElement; let fakeContactManager: FakeContactManager; let fakeNearbyShareSettings: FakeNearbyShareSettings; + let browserProxy: TestAccountManagerBrowserProxy; suiteSetup(async () => { loadTimeData.overrideValues({isKerberosEnabled: true}); @@ -33,6 +37,9 @@ fakeNearbyShareSettings = new FakeNearbyShareSettings(); setNearbyShareSettingsForTesting(fakeNearbyShareSettings); + browserProxy = new TestAccountManagerBrowserProxy(); + AccountManagerBrowserProxyImpl.setInstanceForTesting(browserProxy); + prefElement = document.createElement('settings-prefs'); document.body.appendChild(prefElement); await CrSettingsPrefs.initialized;
diff --git a/chrome/test/data/webui/settings/chromeos/main_page_container/route_navigation_test.ts b/chrome/test/data/webui/settings/chromeos/main_page_container/route_navigation_test.ts index e85f924e3..2b6c8af 100644 --- a/chrome/test/data/webui/settings/chromeos/main_page_container/route_navigation_test.ts +++ b/chrome/test/data/webui/settings/chromeos/main_page_container/route_navigation_test.ts
@@ -12,6 +12,7 @@ import 'chrome://os-settings/os_settings.js'; +import {AccountManagerBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js'; import {createPageAvailabilityForTesting, CrSettingsPrefs, MainPageContainerElement, Router, routes, routesMojom, setContactManagerForTesting, setNearbyShareSettingsForTesting, SettingsPrefsElement} from 'chrome://os-settings/os_settings.js'; import {assertEquals, assertFalse, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {FakeContactManager} from 'chrome://webui-test/nearby_share/shared/fake_nearby_contact_manager.js'; @@ -19,6 +20,8 @@ import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js'; +import {TestAccountManagerBrowserProxy} from '../os_people_page/test_account_manager_browser_proxy.js'; + const {Section} = routesMojom; suite('<main-page-container> Route Navigation', () => { @@ -26,6 +29,7 @@ let prefElement: SettingsPrefsElement; let fakeContactManager: FakeContactManager; let fakeNearbyShareSettings: FakeNearbyShareSettings; + let browserProxy: TestAccountManagerBrowserProxy; suiteSetup(async () => { // Simulate feature flag enabled for CSS styling purposes. @@ -37,6 +41,9 @@ fakeNearbyShareSettings = new FakeNearbyShareSettings(); setNearbyShareSettingsForTesting(fakeNearbyShareSettings); + browserProxy = new TestAccountManagerBrowserProxy(); + AccountManagerBrowserProxyImpl.setInstanceForTesting(browserProxy); + prefElement = document.createElement('settings-prefs'); await CrSettingsPrefs.initialized; });
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page/account_manager_settings_card_test.ts b/chrome/test/data/webui/settings/chromeos/os_people_page/account_manager_settings_card_test.ts new file mode 100644 index 0000000..9f99725 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/os_people_page/account_manager_settings_card_test.ts
@@ -0,0 +1,85 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://os-settings/os_settings.js'; + +import {Account, AccountManagerBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js'; +import {AccountManagerSettingsCardElement, Router, routes} from 'chrome://os-settings/os_settings.js'; +import {assert} from 'chrome://resources/js/assert_ts.js'; +import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assertEquals, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; + +import {TestAccountManagerBrowserProxy} from './test_account_manager_browser_proxy.js'; + +suite('<account-manager-settings-card>', () => { + let browserProxy: TestAccountManagerBrowserProxy; + let accountManagerSettingsCard: AccountManagerSettingsCardElement; + let primaryDeviceAccount: Account|undefined; + + suiteSetup(async () => { + loadTimeData.overrideValues({isDeviceAccountManaged: true}); + + browserProxy = new TestAccountManagerBrowserProxy(); + AccountManagerBrowserProxyImpl.setInstanceForTesting(browserProxy); + + primaryDeviceAccount = (await browserProxy.getAccounts()) + .find(account => account.isDeviceAccount); + }); + + setup(() => { + accountManagerSettingsCard = + document.createElement('account-manager-settings-card'); + document.body.appendChild(accountManagerSettingsCard); + + Router.getInstance().navigateTo(routes.OS_PEOPLE); + flush(); + }); + + teardown(() => { + accountManagerSettingsCard.remove(); + browserProxy.reset(); + Router.getInstance().resetRouteForTesting(); + }); + + test('managed badge is visible if device account is managed', async () => { + await browserProxy.whenCalled('getAccounts'); + flush(); + + const managedBadge = accountManagerSettingsCard.shadowRoot!.querySelector( + '.device-account-icon .managed-badge'); + + assertTrue(isVisible(managedBadge)); + }); + + test('account full name is correct and visible', async () => { + await browserProxy.whenCalled('getAccounts'); + flush(); + + const accountFullNameEl = + accountManagerSettingsCard.shadowRoot!.querySelector( + '#deviceAccountFullName'); + + assert(accountFullNameEl); + assert(primaryDeviceAccount); + assertTrue(isVisible(accountFullNameEl)); + assertEquals( + primaryDeviceAccount.fullName, accountFullNameEl.textContent!.trim()); + }); + + test('account email is correct and visible', async () => { + await browserProxy.whenCalled('getAccounts'); + flush(); + + const accountEmailEl = accountManagerSettingsCard.shadowRoot!.querySelector( + '#deviceAccountEmail'); + + assert(accountEmailEl); + assert(primaryDeviceAccount); + assertTrue(isVisible(accountEmailEl)); + assertEquals( + primaryDeviceAccount.email, accountEmailEl.textContent!.trim()); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts index f9be9d7..bba54322 100644 --- a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts +++ b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
@@ -13,7 +13,7 @@ import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertEquals, assertFalse, assertStringContains, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; -import {eventToPromise} from 'chrome://webui-test/test_util.js'; +import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js'; import {TestSyncBrowserProxy} from '../test_os_sync_browser_proxy.js'; @@ -57,282 +57,310 @@ Router.getInstance().resetRouteForTesting(); }); - test('Profile name and picture, account manager disabled', async () => { - loadTimeData.overrideValues({ - isAccountManagerEnabled: false, + suite('with isRevampWayfindingEnabled disabled', () => { + setup(() => { + loadTimeData.overrideValues({isRevampWayfindingEnabled: false}); }); - createPage(); - await browserProxy.whenCalled('getProfileInfo'); - await syncBrowserProxy.whenCalled('getSyncStatus'); - flush(); + test('Profile name and picture, account manager disabled', async () => { + loadTimeData.overrideValues({ + isAccountManagerEnabled: false, + }); + createPage(); - // Get page elements. - const profileIconEl = - peoplePage.shadowRoot!.querySelector<HTMLElement>('#profile-icon'); - assertTrue(!!profileIconEl); - const profileRowEl = peoplePage.shadowRoot!.querySelector('#profile-row'); - assertTrue(!!profileRowEl); - const profileNameEl = peoplePage.shadowRoot!.querySelector('#profile-name'); - assertTrue(!!profileNameEl); + await browserProxy.whenCalled('getProfileInfo'); + await syncBrowserProxy.whenCalled('getSyncStatus'); + flush(); - assertEquals( - browserProxy.fakeProfileInfo.name, profileNameEl.textContent!.trim()); - const bg = profileIconEl.style.backgroundImage; - assertTrue(bg.includes(browserProxy.fakeProfileInfo.iconUrl)); - const profileLabelEl = - peoplePage.shadowRoot!.querySelector('#profile-label'); - assertTrue(!!profileLabelEl); - assertEquals('fakeUsername', profileLabelEl.textContent!.trim()); + // Get page elements. + const profileIconEl = + peoplePage.shadowRoot!.querySelector<HTMLElement>('#profile-icon'); + assertTrue(!!profileIconEl); + const profileRowEl = peoplePage.shadowRoot!.querySelector('#profile-row'); + assertTrue(!!profileRowEl); + const profileNameEl = + peoplePage.shadowRoot!.querySelector('#profile-name'); + assertTrue(!!profileNameEl); - const iconDataUrl = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEA' + - 'LAAAAAABAAEAAAICTAEAOw=='; - webUIListenerCallback( - 'profile-info-changed', {name: 'pushedName', iconUrl: iconDataUrl}); + assertEquals( + browserProxy.fakeProfileInfo.name, profileNameEl.textContent!.trim()); + const bg = profileIconEl.style.backgroundImage; + assertTrue(bg.includes(browserProxy.fakeProfileInfo.iconUrl)); + const profileLabelEl = + peoplePage.shadowRoot!.querySelector('#profile-label'); + assertTrue(!!profileLabelEl); + assertEquals('fakeUsername', profileLabelEl.textContent!.trim()); - flush(); - assertEquals('pushedName', profileNameEl.textContent!.trim()); - const newBg = profileIconEl.style.backgroundImage; - assertTrue(newBg.includes(iconDataUrl)); + const iconDataUrl = 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEA' + + 'LAAAAAABAAEAAAICTAEAOw=='; + webUIListenerCallback( + 'profile-info-changed', {name: 'pushedName', iconUrl: iconDataUrl}); - // Profile row items aren't actionable. - assertFalse(profileIconEl.hasAttribute('actionable')); - assertFalse(profileRowEl.hasAttribute('actionable')); + flush(); + assertEquals('pushedName', profileNameEl.textContent!.trim()); + const newBg = profileIconEl.style.backgroundImage; + assertTrue(newBg.includes(iconDataUrl)); - // Sub-page trigger is hidden. - const element = peoplePage.shadowRoot!.querySelector<CrIconButtonElement>( - '#accountManagerSubpageTrigger'); - assertTrue(!!element); - assertTrue(element.hidden); - }); + // Profile row items aren't actionable. + assertFalse(profileIconEl.hasAttribute('actionable')); + assertFalse(profileRowEl.hasAttribute('actionable')); - test('parental controls page is shown when enabled', () => { - loadTimeData.overrideValues({ - // Simulate parental controls. - showParentalControls: true, + // Sub-page trigger is hidden. + const element = peoplePage.shadowRoot!.querySelector<CrIconButtonElement>( + '#accountManagerSubpageTrigger'); + assertTrue(!!element); + assertTrue(element.hidden); }); - createPage(); - // Setup button is shown and enabled. - assert(peoplePage.shadowRoot!.querySelector( - 'settings-parental-controls-page')); - }); + test('parental controls page is shown when enabled', () => { + loadTimeData.overrideValues({ + // Simulate parental controls. + showParentalControls: true, + }); + createPage(); - test('Deep link to parental controls page', async () => { - loadTimeData.overrideValues({ - // Simulate parental controls. - showParentalControls: true, + // Setup button is shown and enabled. + assert(peoplePage.shadowRoot!.querySelector( + 'settings-parental-controls-page')); }); - createPage(); - const params = new URLSearchParams(); - params.append( - 'settingId', settingMojom.Setting.kSetUpParentalControls.toString()); - Router.getInstance().navigateTo(routes.OS_PEOPLE, params); + test('Deep link to parental controls page', async () => { + loadTimeData.overrideValues({ + // Simulate parental controls. + showParentalControls: true, + }); + createPage(); - const element = - peoplePage.shadowRoot!.querySelector('settings-parental-controls-page'); - assertTrue(!!element); - const deepLinkElement = - element.shadowRoot!.querySelector<HTMLElement>('#setupButton'); - assertTrue(!!deepLinkElement); - await waitAfterNextRender(deepLinkElement); - assertEquals( - deepLinkElement, getDeepActiveElement(), - 'Setup button should be focused for settingId=315.'); - }); + const params = new URLSearchParams(); + params.append( + 'settingId', settingMojom.Setting.kSetUpParentalControls.toString()); + Router.getInstance().navigateTo(routes.OS_PEOPLE, params); - test('Deep link to encryption options on old sync page', async () => { - createPage(); - - // Load the sync page. - Router.getInstance().navigateTo(routes.SYNC); - flush(); - await waitAfterNextRender(peoplePage); - - // Make the sync page configurable. - const syncPage = - peoplePage.shadowRoot!.querySelector('os-settings-sync-subpage'); - assertTrue(!!syncPage); - syncPage.syncPrefs = { - customPassphraseAllowed: true, - passphraseRequired: false, - appsManaged: false, - appsRegistered: false, - appsSynced: false, - autofillManaged: false, - autofillRegistered: false, - autofillSynced: false, - bookmarksManaged: false, - bookmarksRegistered: false, - bookmarksSynced: false, - encryptAllData: false, - extensionsManaged: false, - extensionsRegistered: false, - extensionsSynced: false, - passwordsManaged: false, - passwordsRegistered: false, - passwordsSynced: false, - paymentsManaged: false, - paymentsRegistered: false, - paymentsSynced: false, - preferencesManaged: false, - preferencesRegistered: false, - preferencesSynced: false, - readingListManaged: false, - readingListRegistered: false, - readingListSynced: false, - savedTabGroupsManaged: false, - savedTabGroupsRegistered: false, - savedTabGroupsSynced: false, - syncAllDataTypes: false, - tabsManaged: false, - tabsRegistered: false, - tabsSynced: false, - themesManaged: false, - themesRegistered: false, - themesSynced: false, - trustedVaultKeysRequired: false, - typedUrlsManaged: false, - typedUrlsRegistered: false, - typedUrlsSynced: false, - wifiConfigurationsManaged: false, - wifiConfigurationsRegistered: false, - wifiConfigurationsSynced: false, - }; - webUIListenerCallback('page-status-changed', PageStatus.CONFIGURE); - const configureElement = syncPage.shadowRoot!.querySelector<HTMLElement>( - '#' + PageStatus.CONFIGURE); - assertTrue(!!configureElement); - assertFalse(configureElement.hidden); - const spinnerElement = syncPage.shadowRoot!.querySelector<HTMLElement>( - '#' + PageStatus.SPINNER); - assertTrue(!!spinnerElement); - assertTrue(spinnerElement.hidden); - - // Try the deep link. - const params = new URLSearchParams(); - params.append( - 'settingId', - settingMojom.Setting.kNonSplitSyncEncryptionOptions.toString()); - Router.getInstance().navigateTo(routes.SYNC, params); - - // Flush to make sure the dropdown expands. - flush(); - const element = syncPage.shadowRoot!.querySelector( - 'os-settings-sync-encryption-options'); - assertTrue(!!element); - const radioGroupElement = - element.shadowRoot!.querySelector<CrRadioGroupElement>( - '#encryptionRadioGroup'); - assertTrue(!!radioGroupElement); - const radioButton = radioGroupElement.get('buttons_')[0]; - assertTrue(!!radioButton); - const deepLinkElement = radioButton.shadowRoot!.querySelector('#button'); - assert(deepLinkElement); - - await waitAfterNextRender(deepLinkElement); - assertEquals( - deepLinkElement, getDeepActiveElement(), - 'Encryption option should be focused for settingId=316.'); - }); - - test('GAIA name and picture, account manager enabled', async () => { - const fakeOsProfileName = 'Currently signed in as username'; - loadTimeData.overrideValues({ - isAccountManagerEnabled: true, - // settings-account-manager-subpage requires this to have a value. - secondaryGoogleAccountSigninAllowed: true, - osProfileName: fakeOsProfileName, + const element = peoplePage.shadowRoot!.querySelector( + 'settings-parental-controls-page'); + assertTrue(!!element); + const deepLinkElement = + element.shadowRoot!.querySelector<HTMLElement>('#setupButton'); + assertTrue(!!deepLinkElement); + await waitAfterNextRender(deepLinkElement); + assertEquals( + deepLinkElement, getDeepActiveElement(), + 'Setup button should be focused for settingId=315.'); }); - createPage(); - await accountManagerBrowserProxy.whenCalled('getAccounts'); - await syncBrowserProxy.whenCalled('getSyncStatus'); - flush(); + test('Deep link to encryption options on old sync page', async () => { + createPage(); - // Get page elements. - const profileIconEl = - peoplePage.shadowRoot!.querySelector<HTMLElement>('#profile-icon'); - assertTrue(!!profileIconEl); - const profileRowEl = peoplePage.shadowRoot!.querySelector('#profile-row'); - assertTrue(!!profileRowEl); - const profileNameEl = peoplePage.shadowRoot!.querySelector('#profile-name'); - assertTrue(!!profileNameEl); + // Load the sync page. + Router.getInstance().navigateTo(routes.SYNC); + flush(); + await waitAfterNextRender(peoplePage); - assertStringContains( - profileIconEl.style.backgroundImage, - 'data:image/png;base64,primaryAccountPicData'); - assertEquals(fakeOsProfileName, profileNameEl.textContent!.trim()); + // Make the sync page configurable. + const syncPage = + peoplePage.shadowRoot!.querySelector('os-settings-sync-subpage'); + assertTrue(!!syncPage); + syncPage.syncPrefs = { + customPassphraseAllowed: true, + passphraseRequired: false, + appsManaged: false, + appsRegistered: false, + appsSynced: false, + autofillManaged: false, + autofillRegistered: false, + autofillSynced: false, + bookmarksManaged: false, + bookmarksRegistered: false, + bookmarksSynced: false, + encryptAllData: false, + extensionsManaged: false, + extensionsRegistered: false, + extensionsSynced: false, + passwordsManaged: false, + passwordsRegistered: false, + passwordsSynced: false, + paymentsManaged: false, + paymentsRegistered: false, + paymentsSynced: false, + preferencesManaged: false, + preferencesRegistered: false, + preferencesSynced: false, + readingListManaged: false, + readingListRegistered: false, + readingListSynced: false, + savedTabGroupsManaged: false, + savedTabGroupsRegistered: false, + savedTabGroupsSynced: false, + syncAllDataTypes: false, + tabsManaged: false, + tabsRegistered: false, + tabsSynced: false, + themesManaged: false, + themesRegistered: false, + themesSynced: false, + trustedVaultKeysRequired: false, + typedUrlsManaged: false, + typedUrlsRegistered: false, + typedUrlsSynced: false, + wifiConfigurationsManaged: false, + wifiConfigurationsRegistered: false, + wifiConfigurationsSynced: false, + }; + webUIListenerCallback('page-status-changed', PageStatus.CONFIGURE); + const configureElement = syncPage.shadowRoot!.querySelector<HTMLElement>( + '#' + PageStatus.CONFIGURE); + assertTrue(!!configureElement); + assertFalse(configureElement.hidden); + const spinnerElement = syncPage.shadowRoot!.querySelector<HTMLElement>( + '#' + PageStatus.SPINNER); + assertTrue(!!spinnerElement); + assertTrue(spinnerElement.hidden); - // Rather than trying to mock sendWithPromise('getPluralString', ...) - // just force an update. - await peoplePage['updateAccounts_'](); - const profileLabelEl = - peoplePage.shadowRoot!.querySelector('#profile-label'); - assertTrue(!!profileLabelEl); - assertEquals('4 Google Accounts', profileLabelEl.textContent!.trim()); + // Try the deep link. + const params = new URLSearchParams(); + params.append( + 'settingId', + settingMojom.Setting.kNonSplitSyncEncryptionOptions.toString()); + Router.getInstance().navigateTo(routes.SYNC, params); - // Profile row items are actionable. - assertTrue(profileIconEl.hasAttribute('actionable')); - assertTrue(profileRowEl.hasAttribute('actionable')); + // Flush to make sure the dropdown expands. + flush(); + const element = syncPage.shadowRoot!.querySelector( + 'os-settings-sync-encryption-options'); + assertTrue(!!element); + const radioGroupElement = + element.shadowRoot!.querySelector<CrRadioGroupElement>( + '#encryptionRadioGroup'); + assertTrue(!!radioGroupElement); + const radioButton = radioGroupElement.get('buttons_')[0]; + assertTrue(!!radioButton); + const deepLinkElement = radioButton.shadowRoot!.querySelector('#button'); + assert(deepLinkElement); - // Sub-page trigger is shown. - const subpageTrigger = - peoplePage.shadowRoot!.querySelector<CrIconButtonElement>( - '#accountManagerSubpageTrigger'); - assertTrue(!!subpageTrigger); - assertFalse(subpageTrigger.hidden); + await waitAfterNextRender(deepLinkElement); + assertEquals( + deepLinkElement, getDeepActiveElement(), + 'Encryption option should be focused for settingId=316.'); + }); - // Sub-page trigger navigates to Google account manager. - subpageTrigger.click(); - assertEquals(routes.ACCOUNT_MANAGER, Router.getInstance().currentRoute); - }); + test('GAIA name and picture, account manager enabled', async () => { + const fakeOsProfileName = 'Currently signed in as username'; + loadTimeData.overrideValues({ + isAccountManagerEnabled: true, + // settings-account-manager-subpage requires this to have a value. + secondaryGoogleAccountSigninAllowed: true, + osProfileName: fakeOsProfileName, + }); + createPage(); - const subpageTriggerData: SubpageTriggerData[] = [ - { - triggerSelector: '#syncSetupRow', - routeName: 'SYNC', - }, - { - triggerSelector: '#accountManagerSubpageTrigger', - routeName: 'ACCOUNT_MANAGER', - }, - ]; - subpageTriggerData.forEach(({triggerSelector, routeName}) => { - test( - `Row for ${routeName} is focused when returning from subpage`, - async () => { - loadTimeData.overrideValues({ - isAccountManagerEnabled: true, - // settings-account-manager-subpage requires this to have a value. - secondaryGoogleAccountSigninAllowed: true, - osProfileName: 'Currently signed in as Walter White', + await accountManagerBrowserProxy.whenCalled('getAccounts'); + await syncBrowserProxy.whenCalled('getSyncStatus'); + flush(); + + // Get page elements. + const profileIconEl = + peoplePage.shadowRoot!.querySelector<HTMLElement>('#profile-icon'); + assertTrue(!!profileIconEl); + const profileRowEl = peoplePage.shadowRoot!.querySelector('#profile-row'); + assertTrue(!!profileRowEl); + const profileNameEl = + peoplePage.shadowRoot!.querySelector('#profile-name'); + assertTrue(!!profileNameEl); + + assertStringContains( + profileIconEl.style.backgroundImage, + 'data:image/png;base64,primaryAccountPicData'); + assertEquals(fakeOsProfileName, profileNameEl.textContent!.trim()); + + // Rather than trying to mock sendWithPromise('getPluralString', ...) + // just force an update. + await peoplePage['updateAccounts_'](); + const profileLabelEl = + peoplePage.shadowRoot!.querySelector('#profile-label'); + assertTrue(!!profileLabelEl); + assertEquals('4 Google Accounts', profileLabelEl.textContent!.trim()); + + // Profile row items are actionable. + assertTrue(profileIconEl.hasAttribute('actionable')); + assertTrue(profileRowEl.hasAttribute('actionable')); + + // Sub-page trigger is shown. + const subpageTrigger = + peoplePage.shadowRoot!.querySelector<CrIconButtonElement>( + '#accountManagerSubpageTrigger'); + assertTrue(!!subpageTrigger); + assertFalse(subpageTrigger.hidden); + + // Sub-page trigger navigates to Google account manager. + subpageTrigger.click(); + assertEquals(routes.ACCOUNT_MANAGER, Router.getInstance().currentRoute); + }); + + const subpageTriggerData: SubpageTriggerData[] = [ + { + triggerSelector: '#syncSetupRow', + routeName: 'SYNC', + }, + { + triggerSelector: '#accountManagerSubpageTrigger', + routeName: 'ACCOUNT_MANAGER', + }, + ]; + subpageTriggerData.forEach(({triggerSelector, routeName}) => { + test( + `Row for ${routeName} is focused when returning from subpage`, + async () => { + loadTimeData.overrideValues({ + isAccountManagerEnabled: true, + // settings-account-manager-subpage requires this to have a value. + secondaryGoogleAccountSigninAllowed: true, + osProfileName: 'Currently signed in as Walter White', + }); + createPage(); + + await accountManagerBrowserProxy.whenCalled('getAccounts'); + await syncBrowserProxy.whenCalled('getSyncStatus'); + flush(); + + const subpageTrigger = + peoplePage.shadowRoot!.querySelector<HTMLElement>( + triggerSelector); + assertTrue(!!subpageTrigger); + + // Sub-page trigger navigates to subpage for route + subpageTrigger.click(); + assertEquals(routes[routeName], Router.getInstance().currentRoute); + + // Navigate back + const popStateEventPromise = eventToPromise('popstate', window); + Router.getInstance().navigateToPreviousRoute(); + await popStateEventPromise; + await waitAfterNextRender(peoplePage); + + assertEquals( + subpageTrigger, peoplePage.shadowRoot!.activeElement, + `${triggerSelector} should be focused.`); }); - createPage(); + }); + }); - await accountManagerBrowserProxy.whenCalled('getAccounts'); - await syncBrowserProxy.whenCalled('getSyncStatus'); - flush(); + suite('with isRevampWayfindingEnabled enabled', () => { + setup(() => { + loadTimeData.overrideValues({isRevampWayfindingEnabled: true}); + }); - const subpageTrigger = - peoplePage.shadowRoot!.querySelector<HTMLElement>( - triggerSelector); - assertTrue(!!subpageTrigger); + test('account manager settings card is visible', async () => { + createPage(); - // Sub-page trigger navigates to subpage for route - subpageTrigger.click(); - assertEquals(routes[routeName], Router.getInstance().currentRoute); + await accountManagerBrowserProxy.whenCalled('getAccounts'); + await syncBrowserProxy.whenCalled('getSyncStatus'); + flush(); - // Navigate back - const popStateEventPromise = eventToPromise('popstate', window); - Router.getInstance().navigateToPreviousRoute(); - await popStateEventPromise; - await waitAfterNextRender(peoplePage); + const accountManagerSettingsCard = + peoplePage.shadowRoot!.querySelector('account-manager-settings-card'); - assertEquals( - subpageTrigger, peoplePage.shadowRoot!.activeElement, - `${triggerSelector} should be focused.`); - }); + // Account manager settings card is visible. + assertTrue(isVisible(accountManagerSettingsCard)); + }); }); });
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js index e40d46b..e05ab393 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -959,6 +959,10 @@ 'parental_controls_page/parental_controls_page_test.js' ], [ + 'OsPeopleAccountManagerSettingsCard', + 'os_people_page/account_manager_settings_card_test.js', + ], + [ 'OsPeoplePageAccountManagerSubpage', 'os_people_page/account_manager_subpage_test.js', {disabled: ['ash::features::kLacrosOnly']},
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts index 1e57053..eb1f90b 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts +++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_availability_test.ts
@@ -14,12 +14,15 @@ import 'chrome://os-settings/os_settings.js'; +import {AccountManagerBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js'; import {createRouterForTesting, CrSettingsPrefs, MainPageContainerElement, OsSettingsMainElement, OsSettingsUiElement, PageDisplayerElement, Router, routesMojom, SettingsIdleLoadElement} from 'chrome://os-settings/os_settings.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {TestAccountManagerBrowserProxy} from '../os_people_page/test_account_manager_browser_proxy.js'; + import {SECTION_EXPECTATIONS, SectionName} from './page_availability_test_helpers.js'; const {Section} = routesMojom; @@ -29,6 +32,12 @@ let ui: OsSettingsUiElement; let settingsMain: OsSettingsMainElement; let mainPageContainer: MainPageContainerElement; + let browserProxy: TestAccountManagerBrowserProxy; + + suiteSetup(() => { + browserProxy = new TestAccountManagerBrowserProxy(); + AccountManagerBrowserProxyImpl.setInstanceForTesting(browserProxy); + }); async function createUi() { ui = document.createElement('os-settings-ui'); @@ -83,6 +92,9 @@ Router.resetInstanceForTesting(testRouter); await createUi(); + + await browserProxy.whenCalled('getAccounts'); + flush(); }); suiteTeardown(() => { @@ -94,7 +106,7 @@ availableBeforeRevamp, availableAfterRevamp, } of SECTION_EXPECTATIONS) { - test(`${name} page availability`, () => { + test(`${name} page availability`, async () => { const shouldExpectStamped = (isRevampEnabled && availableAfterRevamp) || (!isRevampEnabled && availableBeforeRevamp); @@ -120,6 +132,9 @@ Router.resetInstanceForTesting(testRouter); await createUi(); + + await browserProxy.whenCalled('getAccounts'); + flush(); }); suiteTeardown(() => { @@ -132,7 +147,7 @@ availableAfterRevamp, availableForGuest, } of SECTION_EXPECTATIONS) { - test(`${name} page availability`, () => { + test(`${name} page availability`, async () => { const shouldExpectStamped = availableForGuest && ((isRevampEnabled && availableAfterRevamp) || (!isRevampEnabled && availableBeforeRevamp));
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_revamp_test.ts b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_revamp_test.ts index 2c3db22..8d1246e 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_revamp_test.ts +++ b/chrome/test/data/webui/settings/chromeos/os_settings_ui/os_settings_ui_page_visibility_revamp_test.ts
@@ -14,6 +14,7 @@ import 'chrome://os-settings/os_settings.js'; +import {AccountManagerBrowserProxyImpl} from 'chrome://os-settings/lazy_load.js'; import {createRouterForTesting, CrSettingsPrefs, MainPageContainerElement, OsSettingsMainElement, OsSettingsMenuElement, OsSettingsRoutes, OsSettingsUiElement, PageDisplayerElement, Router, routes, routesMojom, SettingsIdleLoadElement} from 'chrome://os-settings/os_settings.js'; import {assert} from 'chrome://resources/js/assert_ts.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; @@ -22,11 +23,14 @@ import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {isVisible} from 'chrome://webui-test/test_util.js'; +import {TestAccountManagerBrowserProxy} from '../os_people_page/test_account_manager_browser_proxy.js'; + suite('<os-settings-ui> page visibility', () => { let ui: OsSettingsUiElement; let settingsMain: OsSettingsMainElement; let mainPageContainer: MainPageContainerElement; let menu: OsSettingsMenuElement; + let browserProxy: TestAccountManagerBrowserProxy; async function createUi() { ui = document.createElement('os-settings-ui'); @@ -140,6 +144,8 @@ } suiteSetup(async () => { + browserProxy = new TestAccountManagerBrowserProxy(); + AccountManagerBrowserProxyImpl.setInstanceForTesting(browserProxy); assertTrue( loadTimeData.getBoolean('isRevampWayfindingEnabled'), 'This suite expects OsSettingsRevampWayfinding to be enabled.');
diff --git a/chrome/test/data/webui/side_panel/read_anything/font_menu_with_read_aloud.js b/chrome/test/data/webui/side_panel/read_anything/font_menu_with_read_aloud.js new file mode 100644 index 0000000..b174141 --- /dev/null +++ b/chrome/test/data/webui/side_panel/read_anything/font_menu_with_read_aloud.js
@@ -0,0 +1,51 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// out/Debug/browser_tests \ +// --gtest_filter=ReadAnythingAppReadAloudTest.ReadAloud_FontMenu + +// Do not call the real `onConnected()`. As defined in +// ReadAnythingAppController, onConnected creates mojo pipes to connect to the +// rest of the Read Anything feature, which we are not testing here. +(() => { + chrome.readingMode.onConnected = () => {}; + + const readAnythingApp = + document.querySelector('read-anything-app').shadowRoot; + const toolbar = + readAnythingApp.querySelector('read-anything-toolbar').shadowRoot; + + let result = true; + const assertEquals = (actual, expected) => { + const isEqual = actual === expected; + if (!isEqual) { + console.error( + 'Expected: ' + JSON.stringify(expected) + ', ' + + 'Actual: ' + JSON.stringify(actual)); + } + result = result && isEqual; + return isEqual; + }; + const assertNE = (actual, expected) => { + const isNotEqual = actual !== expected; + if (!isNotEqual) { + console.error( + 'Expected ' + JSON.stringify(actual) + ' to be not equal to ' + + JSON.stringify(expected)); + } + result = result && isNotEqual; + return isNotEqual; + }; + + const font_menu_button = toolbar.getElementById('font'); + assertNE(font_menu_button, null); + font_menu_button.click(); + const font_menu = toolbar.getElementById('fontMenu'); + assertEquals(font_menu.open, true); + + const font_select = toolbar.getElementById('font-select'); + assertEquals(font_select, null); + + return result; +})();
diff --git a/chrome/test/data/webui/side_panel/read_anything/font_select_without_read_aloud.js b/chrome/test/data/webui/side_panel/read_anything/font_select_without_read_aloud.js new file mode 100644 index 0000000..b285fa0 --- /dev/null +++ b/chrome/test/data/webui/side_panel/read_anything/font_select_without_read_aloud.js
@@ -0,0 +1,49 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// out/Debug/browser_tests \ +// --gtest_filter=ReadAnythingAppToolbarTest.FontSelectionShows + +// Do not call the real `onConnected()`. As defined in +// ReadAnythingAppController, onConnected creates mojo pipes to connect to the +// rest of the Read Anything feature, which we are not testing here. +(() => { + chrome.readingMode.onConnected = () => {}; + + const readAnythingApp = + document.querySelector('read-anything-app').shadowRoot; + const toolbar = + readAnythingApp.querySelector('read-anything-toolbar').shadowRoot; + + let result = true; + const assertEquals = (actual, expected) => { + const isEqual = actual === expected; + if (!isEqual) { + console.error( + 'Expected: ' + JSON.stringify(expected) + ', ' + + 'Actual: ' + JSON.stringify(actual)); + } + result = result && isEqual; + return isEqual; + }; + const assertNE = (actual, expected) => { + const isNotEqual = actual !== expected; + if (!isNotEqual) { + console.error( + 'Expected ' + JSON.stringify(actual) + ' to be not equal to ' + + JSON.stringify(expected)); + } + result = result && isNotEqual; + return isNotEqual; + }; + + const font_menu_button = toolbar.getElementById('font'); + assertEquals(font_menu_button, null); + + const font_select = toolbar.getElementById('font-select'); + assertNE(font_select, null); + assertNE(font_select.options.length, 0); + + return result; +})();
diff --git a/chrome/test/data/webui/side_panel/read_anything/font_size_buttons_without_read_aloud.js b/chrome/test/data/webui/side_panel/read_anything/font_size_buttons_without_read_aloud.js new file mode 100644 index 0000000..114f4e9 --- /dev/null +++ b/chrome/test/data/webui/side_panel/read_anything/font_size_buttons_without_read_aloud.js
@@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// out/Debug/browser_tests \ +// --gtest_filter=ReadAnythingAppToolbarTest.FontSizeButtonsOnToolbar + +// Do not call the real `onConnected()`. As defined in +// ReadAnythingAppController, onConnected creates mojo pipes to connect to the +// rest of the Read Anything feature, which we are not testing here. +(() => { + chrome.readingMode.onConnected = () => {}; + + const readAnythingApp = + document.querySelector('read-anything-app').shadowRoot; + const toolbar = + readAnythingApp.querySelector('read-anything-toolbar').shadowRoot; + + let result = true; + const assertEquals = (actual, expected) => { + const isEqual = actual === expected; + if (!isEqual) { + console.error( + 'Expected: ' + JSON.stringify(expected) + ', ' + + 'Actual: ' + JSON.stringify(actual)); + } + result = result && isEqual; + return isEqual; + }; + const assertNE = (actual, expected) => { + const isNotEqual = actual !== expected; + if (!isNotEqual) { + console.error( + 'Expected ' + JSON.stringify(actual) + ' to be not equal to ' + + JSON.stringify(expected)); + } + result = result && isNotEqual; + return isNotEqual; + }; + + const font_size_menu_button = toolbar.getElementById('font-size'); + assertEquals(font_size_menu_button, null); + + const font_size_increase_button = + toolbar.getElementById('font-size-increase-old'); + assertNE(font_size_increase_button, null); + const font_size_decrease_button = + toolbar.getElementById('font-size-decrease-old'); + assertNE(font_size_decrease_button, null); + + return result; +})();
diff --git a/chrome/test/data/webui/side_panel/read_anything/font_size_menu_with_read_aloud.js b/chrome/test/data/webui/side_panel/read_anything/font_size_menu_with_read_aloud.js new file mode 100644 index 0000000..633cc1dd --- /dev/null +++ b/chrome/test/data/webui/side_panel/read_anything/font_size_menu_with_read_aloud.js
@@ -0,0 +1,55 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// out/Debug/browser_tests \ +// --gtest_filter=ReadAnythingAppReadAloudTest.ReadAloud_FontSizeMenu + +// Do not call the real `onConnected()`. As defined in +// ReadAnythingAppController, onConnected creates mojo pipes to connect to the +// rest of the Read Anything feature, which we are not testing here. +(() => { + chrome.readingMode.onConnected = () => {}; + + const readAnythingApp = + document.querySelector('read-anything-app').shadowRoot; + const toolbar = + readAnythingApp.querySelector('read-anything-toolbar').shadowRoot; + + let result = true; + const assertEquals = (actual, expected) => { + const isEqual = actual === expected; + if (!isEqual) { + console.error( + 'Expected: ' + JSON.stringify(expected) + ', ' + + 'Actual: ' + JSON.stringify(actual)); + } + result = result && isEqual; + return isEqual; + }; + const assertNE = (actual, expected) => { + const isNotEqual = actual !== expected; + if (!isNotEqual) { + console.error( + 'Expected ' + JSON.stringify(actual) + ' to be not equal to ' + + JSON.stringify(expected)); + } + result = result && isNotEqual; + return isNotEqual; + }; + + const font_size_menu_button = toolbar.getElementById('font-size'); + assertNE(font_size_menu_button, null); + font_size_menu_button.click(); + const font_size_menu = toolbar.getElementById('fontSizeMenu'); + assertEquals(font_size_menu.open, true); + + const font_size_increase_button = + toolbar.getElementById('font-size-increase-old'); + assertEquals(font_size_increase_button, null); + const font_size_decrease_button = + toolbar.getElementById('font-size-decrease-old'); + assertEquals(font_size_decrease_button, null); + + return result; +})();
diff --git a/chrome/test/interaction/README.md b/chrome/test/interaction/README.md index faf7c77..26c8316f 100644 --- a/chrome/test/interaction/README.md +++ b/chrome/test/interaction/README.md
@@ -168,6 +168,7 @@ - `NavigateWebContents()` [Browser] - `WaitForWebContentsReady()` [Browser] - `WaitForWebContentsNavigation()` [Browser] + - `FocusWebContents()` [Browser] - `WaitForStateChange()` [Browser] - **Javascript** verbs execute javascript in an [instrumented WebContents](#webcontents-instrumentation), or verify a result
diff --git a/chrome/test/interaction/interaction_test_util_browser.cc b/chrome/test/interaction/interaction_test_util_browser.cc index b39d168..163c914 100644 --- a/chrome/test/interaction/interaction_test_util_browser.cc +++ b/chrome/test/interaction/interaction_test_util_browser.cc
@@ -82,68 +82,95 @@ InteractionTestUtilSimulatorBrowser() = default; ~InteractionTestUtilSimulatorBrowser() override = default; -#if BUILDFLAG(IS_MAC) - // Browser accelerators must be sent via key events to the window on Mac or - // they don't work properly. Dialog accelerators still appear to work the same - // as on other platforms. ui::test::ActionResult SendAccelerator(ui::TrackedElement* element, ui::Accelerator accelerator) override { - Browser* const browser = - InteractionTestUtilBrowser::GetBrowserFromContext(element->context()); - if (!browser) - return ui::test::ActionResult::kNotAttempted; - - if (!ui_controls::SendKeyPress( - browser->window()->GetNativeWindow(), accelerator.key_code(), - accelerator.IsCtrlDown(), accelerator.IsShiftDown(), - accelerator.IsAltDown(), accelerator.IsCmdDown())) { - LOG(ERROR) << "Failed to send accelerator" - << accelerator.GetShortcutText() << " to " << *element; - return ui::test::ActionResult::kFailed; +#if BUILDFLAG(IS_MAC) + // Browser accelerators must be sent via key events to the window on Mac or + // they don't work properly. Dialog accelerators still appear to work the + // same as on other platforms. + if (Browser* const browser = + InteractionTestUtilBrowser::GetBrowserFromContext( + element->context())) { + if (!ui_controls::SendKeyPress( + browser->window()->GetNativeWindow(), accelerator.key_code(), + accelerator.IsCtrlDown(), accelerator.IsShiftDown(), + accelerator.IsAltDown(), accelerator.IsCmdDown())) { + LOG(ERROR) << "Failed to send accelerator" + << accelerator.GetShortcutText() << " to " << *element; + return ui::test::ActionResult::kFailed; + } + return ui::test::ActionResult::kSucceeded; } - return ui::test::ActionResult::kSucceeded; - } #endif // BUILDFLAG(IS_MAC) + if (auto* const tracked_contents = + element->AsA<TrackedElementWebContents>()) { + if (auto* const view = tracked_contents->owner()->GetWebView()) { + view->GetFocusManager()->ProcessAccelerator(accelerator); + return ui::test::ActionResult::kSucceeded; + } else { + LOG(ERROR) << "No associated view to send accelerators to."; + return ui::test::ActionResult::kFailed; + } + } + + return ui::test::ActionResult::kNotAttempted; + } + // Chrome has better and more thorough functionality for bringing a browser // window to the front, but it's expensive, so only actually use it for // browser windows on platforms where activation requires extra steps. ui::test::ActionResult ActivateSurface(ui::TrackedElement* el) override { -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) - if (!el->IsA<views::TrackedElementViews>()) { + views::View* view = nullptr; + bool is_web_contents = false; + if (auto* view_el = el->AsA<views::TrackedElementViews>()) { + view = view_el->view(); + } else if (auto* contents_el = el->AsA<TrackedElementWebContents>()) { + is_web_contents = true; + view = contents_el->owner()->GetWebView(); + if (!view) { + LOG(ERROR) << "WebContents not associated with any UI element."; + return ui::test::ActionResult::kFailed; + } + } + if (!view) { return ui::test::ActionResult::kNotAttempted; } // Get the browser and browser window associated with the current context. - // If there is none, do not use this implementation. - auto* const browser = - InteractionTestUtilBrowser::GetBrowserFromContext(el->context()); - if (!browser) { - return ui::test::ActionResult::kNotAttempted; - } - auto* const browser_view = BrowserView::GetBrowserViewForBrowser(browser); - if (!browser_view) { - return ui::test::ActionResult::kNotAttempted; - } - - // If the target widget is not the primary window widget, do not use this - // implementation. - if (browser_view->GetWidget() != - el->AsA<views::TrackedElementViews>()->view()->GetWidget()) { - return ui::test::ActionResult::kNotAttempted; - } - - // Bring the browser window to the front using the most aggressive method - // for the current platform. If this is not done, then mouse events might - // not get routed to the correct surface. - if (!ui_test_utils::BringBrowserWindowToFront(browser)) { - LOG(ERROR) << "BringBrowserWindowToFront() failed."; - return ui::test::ActionResult::kFailed; - } - return ui::test::ActionResult::kSucceeded; + // If there is none, or it is not the same widget as the view, do not use + // this implementation. + if (auto* const browser = + InteractionTestUtilBrowser::GetBrowserFromContext(el->context())) { + if (auto* const browser_view = + BrowserView::GetBrowserViewForBrowser(browser)) { + if (browser_view->GetWidget() == view->GetWidget()) { +#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) + // Bring the browser window to the front using the most aggressive + // method for the current platform. If this is not done, then mouse + // events might not get routed to the correct surface. + if (!ui_test_utils::BringBrowserWindowToFront(browser)) { + LOG(ERROR) << "BringBrowserWindowToFront() failed."; + return ui::test::ActionResult::kFailed; + } + return ui::test::ActionResult::kSucceeded; #else - return ui::test::ActionResult::kNotAttempted; + // Use the default logic to activate the browser. + return views::test::InteractionTestUtilSimulatorViews::ActivateWidget( + view->GetWidget()); #endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) + } + } + } + + // Because the fallback Views handler doesn't know about WebContents, handle + // activation here. + if (is_web_contents) { + return views::test::InteractionTestUtilSimulatorViews::ActivateWidget( + view->GetWidget()); + } + + return ui::test::ActionResult::kNotAttempted; } ui::test::ActionResult SelectTab(ui::TrackedElement* tab_collection,
diff --git a/chrome/test/interaction/interactive_browser_test.cc b/chrome/test/interaction/interactive_browser_test.cc index 1c783ca..8ed8dc8 100644 --- a/chrome/test/interaction/interactive_browser_test.cc +++ b/chrome/test/interaction/interactive_browser_test.cc
@@ -26,9 +26,12 @@ #include "chrome/test/interaction/webcontents_interaction_test_util.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/variant.h" +#include "third_party/blink/public/mojom/frame/user_activation_notification_type.mojom-shared.h" +#include "third_party/blink/public/mojom/frame/user_activation_update_types.mojom-shared.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" #include "ui/base/interaction/interaction_sequence.h" +#include "ui/base/interaction/interaction_test_util.h" #include "ui/base/interaction/interactive_test_internal.h" #include "ui/views/interaction/interactive_views_test.h" #include "ui/views/views_delegate.h" @@ -331,6 +334,40 @@ .FormatDescription(base::StrCat({desc, ": %s"})))); } +InteractiveBrowserTestApi::StepBuilder +InteractiveBrowserTestApi::FocusWebContents( + ui::ElementIdentifier webcontents_id) { + StepBuilder builder; + builder.SetElementID(webcontents_id); + builder.SetDescription("FocusWebContents()"); + builder.SetStartCallback(base::BindLambdaForTesting( + [this](ui::InteractionSequence* seq, ui::TrackedElement* el) { + auto* const tracked_el = AsInstrumentedWebContents(el); + if (!tracked_el) { + LOG(ERROR) << "Element is not an instrumented WebContents."; + seq->FailForTesting(); + return; + } + const auto result = test_util().ActivateSurface(el); + test_impl().HandleActionResult(seq, el, "ActivateSurface", result); + if (result != ui::test::ActionResult::kSucceeded) { + return; + } + auto* const contents = tracked_el->web_contents(); + if (!contents || !contents->GetPrimaryMainFrame()) { + LOG(ERROR) << "WebContents not present or no main frame."; + seq->FailForTesting(); + return; + } + content::UpdateUserActivationStateInterceptor + user_activation_interceptor(contents->GetPrimaryMainFrame()); + user_activation_interceptor.UpdateUserActivationState( + blink::mojom::UserActivationUpdateType::kNotifyActivation, + blink::mojom::UserActivationNotificationType::kTest); + })); + return builder; +} + // static InteractiveBrowserTestApi::MultiStep InteractiveBrowserTestApi::WaitForStateChange(
diff --git a/chrome/test/interaction/interactive_browser_test.h b/chrome/test/interaction/interactive_browser_test.h index 12b7902..63b46a2 100644 --- a/chrome/test/interaction/interactive_browser_test.h +++ b/chrome/test/interaction/interactive_browser_test.h
@@ -171,6 +171,12 @@ ui::ElementIdentifier webcontents_id, GURL new_url); + // Raises the surface containing `webcontents_id` and focuses the WebContents + // as if a user had interacted directly with it. This is useful if you want + // the WebContents to e.g. respond to accelerators. + [[nodiscard]] StepBuilder FocusWebContents( + ui::ElementIdentifier webcontents_id); + // Waits for the given `state_change` in `webcontents_id`. The sequence will // fail if the change times out, unless `expect_timeout` is true, in which // case the StateChange *must* timeout, and |state_change.timeout_event| must
diff --git a/chrome/test/interaction/interactive_browser_test_interactive_uitest.cc b/chrome/test/interaction/interactive_browser_test_interactive_uitest.cc index 0bbf33c..0c629f77 100644 --- a/chrome/test/interaction/interactive_browser_test_interactive_uitest.cc +++ b/chrome/test/interaction/interactive_browser_test_interactive_uitest.cc
@@ -17,6 +17,7 @@ #include "chrome/browser/ui/toolbar/app_menu_model.h" #include "chrome/browser/ui/views/bubble/webui_bubble_dialog_view.h" #include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/side_panel/side_panel_entry.h" #include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "content/public/browser/page_navigator.h" @@ -32,9 +33,11 @@ #include "ui/display/screen.h" #include "ui/gfx/geometry/point.h" #include "ui/gfx/geometry/vector2d.h" +#include "ui/gfx/native_widget_types.h" #include "ui/views/event_monitor.h" #include "ui/views/interaction/element_tracker_views.h" #include "ui/views/interaction/interaction_sequence_views.h" +#include "ui/views/interaction/widget_focus_observer.h" #include "ui/views/layout/fill_layout.h" #include "url/gurl.h" @@ -211,19 +214,115 @@ auto* const incognito = CreateIncognitoBrowser(); RunTestSequence( + SetOnIncompatibleAction(OnIncompatibleAction::kHaltTest, + "Some Linux window managers do not allow " + "programmatically raising/activating windows. " + "This invalidates the rest of the test."), InContext(incognito->window()->GetElementContext(), Steps(ActivateSurface(kBrowserViewElementId), MoveMouseTo(kToolbarAppMenuButtonElementId), ClickMouse(), SelectMenuItem(AppMenuModel::kDownloadsMenuItem), WaitForHide(AppMenuModel::kDownloadsMenuItem))), - FlushEvents(), + FlushEvents(), ActivateSurface(kBrowserViewElementId), + MoveMouseTo(kToolbarAppMenuButtonElementId), ClickMouse(), + WaitForShow(AppMenuModel::kDownloadsMenuItem)); +} + +// Tests whether ActivateSurface() results in kCurrentWidgetFocus updating +// correctly. +IN_PROC_BROWSER_TEST_F(InteractiveBrowserTestUiTest, + WatchForBrowserActivation) { + auto* const incognito = CreateIncognitoBrowser(); + + RunTestSequence( SetOnIncompatibleAction(OnIncompatibleAction::kHaltTest, "Some Linux window managers do not allow " "programmatically raising/activating windows. " "This invalidates the rest of the test."), - ActivateSurface(kBrowserViewElementId), - MoveMouseTo(kToolbarAppMenuButtonElementId), ClickMouse(), - WaitForShow(AppMenuModel::kDownloadsMenuItem)); + ObserveState(views::test::kCurrentWidgetFocus), + InContext(incognito->window()->GetElementContext(), + Steps(ActivateSurface(kBrowserViewElementId), + MoveMouseTo(kToolbarAppMenuButtonElementId), ClickMouse(), + SelectMenuItem(AppMenuModel::kDownloadsMenuItem), + WaitForHide(AppMenuModel::kDownloadsMenuItem))), + FlushEvents(), ActivateSurface(kBrowserViewElementId), + WaitForState(views::test::kCurrentWidgetFocus, [this]() { + return BrowserView::GetBrowserViewForBrowser(browser()) + ->GetWidget() + ->GetNativeView(); + })); +} + +// Tests whether ActivateSurface() results in kCurrentWidgetFocus updating +// correctly when targeting a tab's web contents. +IN_PROC_BROWSER_TEST_F(InteractiveBrowserTestUiTest, + WatchForTabWebContentsActivation) { + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsElementId); + auto* const incognito = CreateIncognitoBrowser(); + + RunTestSequence( + SetOnIncompatibleAction(OnIncompatibleAction::kHaltTest, + "Some Linux window managers do not allow " + "programmatically raising/activating windows. " + "This invalidates the rest of the test."), + ObserveState(views::test::kCurrentWidgetFocus), + InContext(incognito->window()->GetElementContext(), + Steps(ActivateSurface(kBrowserViewElementId), + MoveMouseTo(kToolbarAppMenuButtonElementId), ClickMouse(), + SelectMenuItem(AppMenuModel::kDownloadsMenuItem), + WaitForHide(AppMenuModel::kDownloadsMenuItem))), + FlushEvents(), InstrumentTab(kWebContentsElementId), + ActivateSurface(kWebContentsElementId), + WaitForState(views::test::kCurrentWidgetFocus, [this]() { + return BrowserView::GetBrowserViewForBrowser(browser()) + ->GetWidget() + ->GetNativeView(); + })); +} + +// Tests whether ActivateSurface() results in kCurrentWidgetFocus updating +// correctly when targeting a non-tab web contents. +// +// TODO(crbug.com/1471043): These tests can be kind of hairy and we're working +// on making sure these primitives play nice together and do not flake. If you +// see a flake, first, note that these are edge case tests for new test +// infrastructure and do not directly affect Chrome stability. Next, please: +// - Reopen or add to the attached bug. +// - Make sure it is assigned to dfried@chromium.org or another +// chrome/test/interaction owner. +// - [Selectively] disable the test on the offending platforms. +// +// Thank you for working with us to make Chrome test infrastructure better! +IN_PROC_BROWSER_TEST_F(InteractiveBrowserTestUiTest, + WatchForNonTabWebContentsActivation) { + DEFINE_LOCAL_ELEMENT_IDENTIFIER_VALUE(kWebContentsElementId); + constexpr char kWebViewName[] = "Web View"; + auto* const incognito = CreateIncognitoBrowser(); + + gfx::NativeView expected_view = gfx::NativeView(); + + RunTestSequence( + SetOnIncompatibleAction(OnIncompatibleAction::kHaltTest, + "Some Linux window managers do not allow " + "programmatically raising/activating windows. " + "This invalidates the rest of the test."), + ObserveState(views::test::kCurrentWidgetFocus), + InContext(incognito->window()->GetElementContext(), + Steps(ActivateSurface(kBrowserViewElementId), + MoveMouseTo(kToolbarAppMenuButtonElementId), ClickMouse(), + SelectMenuItem(AppMenuModel::kDownloadsMenuItem), + WaitForHide(AppMenuModel::kDownloadsMenuItem))), + FlushEvents(), PressButton(kTabSearchButtonElementId), + WaitForShow(kTabSearchBubbleElementId), + NameDescendantViewByType<views::WebView>(kTabSearchBubbleElementId, + kWebViewName), + InstrumentNonTabWebView(kWebContentsElementId, kWebViewName), + ActivateSurface(kWebContentsElementId), + WithView(kTabSearchBubbleElementId, + [&expected_view](views::View* view) { + expected_view = view->GetWidget()->GetNativeView(); + }), + WaitForState(views::test::kCurrentWidgetFocus, std::ref(expected_view))); } IN_PROC_BROWSER_TEST_F(InteractiveBrowserTestUiTest,
diff --git a/chrome/test/interaction/interactive_browser_test_internal.cc b/chrome/test/interaction/interactive_browser_test_internal.cc index 3ef0f0c9f..17493de 100644 --- a/chrome/test/interaction/interactive_browser_test_internal.cc +++ b/chrome/test/interaction/interactive_browser_test_internal.cc
@@ -9,7 +9,10 @@ #include "base/command_line.h" #include "base/files/file_path.h" +#include "base/scoped_observation.h" #include "base/strings/strcat.h" +#include "chrome/browser/ui/browser_list.h" +#include "chrome/browser/ui/browser_list_observer.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/test/base/devtools_agent_coverage_observer.h" #include "chrome/test/base/test_switches.h" @@ -18,16 +21,53 @@ #include "content/public/browser/web_contents.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" +#include "ui/base/interaction/framework_specific_implementation.h" #include "ui/gfx/native_widget_types.h" +#include "ui/views/interaction/widget_focus_observer.h" namespace internal { +// Focus supplier that watches for browser activation specifically. For some +// reason, on some platforms, in some circumstances, native widget activation +// isn't properly communicated, so this serves as a backup. +class BrowserWidgetFocusSupplier + : public views::test::internal::WidgetFocusSupplier, + public BrowserListObserver { + public: + BrowserWidgetFocusSupplier() { + observation_.Observe(BrowserList::GetInstance()); + } + ~BrowserWidgetFocusSupplier() override = default; + + DECLARE_FRAMEWORK_SPECIFIC_METADATA() + + void OnBrowserSetLastActive(Browser* browser) override { + if (auto* const view = BrowserView::GetBrowserViewForBrowser(browser)) { + if (auto* const widget = view->GetWidget()) { + if (gfx::NativeView native_view = widget->GetNativeView()) { + OnWidgetFocusChanged(native_view); + } + } + } + } + + private: + base::ScopedObservation<BrowserList, BrowserListObserver> observation_{this}; +}; + +DEFINE_FRAMEWORK_SPECIFIC_METADATA(BrowserWidgetFocusSupplier) + InteractiveBrowserTestPrivate::InteractiveBrowserTestPrivate( std::unique_ptr<InteractionTestUtilBrowser> test_util) : InteractiveViewsTestPrivate(std::move(test_util)) {} InteractiveBrowserTestPrivate::~InteractiveBrowserTestPrivate() = default; +void InteractiveBrowserTestPrivate::DoTestSetUp() { + InteractiveViewsTestPrivate::DoTestSetUp(); + widget_focus_suppliers().MaybeRegister<BrowserWidgetFocusSupplier>(); +} + void InteractiveBrowserTestPrivate::DoTestTearDown() { // Release any remaining instrumented WebContents. instrumented_web_contents_.clear();
diff --git a/chrome/test/interaction/interactive_browser_test_internal.h b/chrome/test/interaction/interactive_browser_test_internal.h index 3010d18..d6b743a 100644 --- a/chrome/test/interaction/interactive_browser_test_internal.h +++ b/chrome/test/interaction/interactive_browser_test_internal.h
@@ -37,6 +37,7 @@ ~InteractiveBrowserTestPrivate() override; // views::test::internal::InteractiveViewsTestPrivate: + void DoTestSetUp() override; void DoTestTearDown() override; // Starts code coverage if the proper configuration is present.
diff --git a/chrome/updater/win/setup/setup_util.cc b/chrome/updater/win/setup/setup_util.cc index d1e26843..d04c00a 100644 --- a/chrome/updater/win/setup/setup_util.cc +++ b/chrome/updater/win/setup/setup_util.cc
@@ -59,6 +59,7 @@ // Delete any old registrations first. for (const auto& key_flag : {KEY_WOW64_32KEY, KEY_WOW64_64KEY}) { + VLOG(1) << "Deleting reg_path: " << progid_reg_path; list->AddDeleteRegKeyWorkItem(root, progid_reg_path, key_flag); } @@ -247,6 +248,7 @@ // Delete any old registrations first. for (const auto& reg_path : {iid_reg_path, typelib_reg_path}) { for (const auto& key_flag : {KEY_WOW64_32KEY, KEY_WOW64_64KEY}) { + VLOG(1) << "Deleting reg_path: " << reg_path; list->AddDeleteRegKeyWorkItem(root, reg_path, key_flag); } } @@ -291,6 +293,7 @@ // Delete any old registrations first. for (const auto& reg_path : {clsid_reg_path}) { for (const auto& key_flag : {KEY_WOW64_32KEY, KEY_WOW64_64KEY}) { + VLOG(1) << "Deleting reg_path: " << reg_path; list->AddDeleteRegKeyWorkItem(root, reg_path, key_flag); } } @@ -371,9 +374,11 @@ // and the current install is 64-bit. If any 32-bit keys remain, they will // shadow the 64-bit keys. for (const auto& clsid : clsids) { + const std::wstring clsid_reg_path = GetComServerClsidRegistryPath(clsid); + VLOG(1) << "Deleting reg_path: " << clsid_reg_path; for (const auto& key_flag : {KEY_WOW64_32KEY, KEY_WOW64_64KEY}) { - list->AddDeleteRegKeyWorkItem( - HKEY_LOCAL_MACHINE, GetComServerClsidRegistryPath(clsid), key_flag); + list->AddDeleteRegKeyWorkItem(HKEY_LOCAL_MACHINE, clsid_reg_path, + key_flag); } }
diff --git a/chrome/updater/win/setup/uninstall.cc b/chrome/updater/win/setup/uninstall.cc index 1fbec54..8356d14 100644 --- a/chrome/updater/win/setup/uninstall.cc +++ b/chrome/updater/win/setup/uninstall.cc
@@ -81,6 +81,8 @@ uninstall_all ? GetActiveInterfaces(scope) : std::vector<IID>())) { for (const auto& reg_path : {GetComIidRegistryPath(iid), GetComTypeLibRegistryPath(iid)}) { + VLOG(1) << "Deleting reg_path: " << reg_path + << ": from scope: " << UpdaterScopeToString(scope); installer::DeleteRegistryKey(UpdaterScopeToHKeyRoot(scope), reg_path, WorkItem::kWow64Default); }
diff --git a/chrome/version.gni b/chrome/version.gni index 38fbe62c..1caacc0e 100644 --- a/chrome/version.gni +++ b/chrome/version.gni
@@ -191,6 +191,7 @@ "Chrome: $chrome_version_code", "Monochrome: $monochrome_version_code", "TrichromeChrome: $trichrome_version_code", + "TrichromeChromeOpenBeta: $trichrome_beta_version_code", "TrichromeChromeAuto: $trichrome_auto_version_code", "AndroidWebviewStable: $webview_stable_version_code", "AndroidWebviewBeta: $webview_beta_version_code",
diff --git a/chromecast/BUILD.gn b/chromecast/BUILD.gn index c9d7a45..44da9ce4 100644 --- a/chromecast/BUILD.gn +++ b/chromecast/BUILD.gn
@@ -716,7 +716,6 @@ loadable_modules = [ "$root_out_dir/libchrome_crashpad_handler.so" ] command_line_flags_file = "castshell-command-line" - enable_multidex = true product_config_java_packages = [ "org.chromium.chromecast.shell" ] } @@ -762,8 +761,6 @@ # cast_browser depend on different resource targets. resource_exclusion_regex = "cast_web_contents_activity.xml" - enable_multidex = true - # TODO(b/222780347): Enable when compile errors are resolved on release # builds. proguard_enabled = false
diff --git a/chromeos/OWNERS b/chromeos/OWNERS index 82789f2..4c480e48 100644 --- a/chromeos/OWNERS +++ b/chromeos/OWNERS
@@ -34,7 +34,6 @@ # CET antrim@chromium.org emaxx@chromium.org -rsorokin@google.com # JST hashimoto@chromium.org
diff --git a/chromeos/ash/components/device_activity/BUILD.gn b/chromeos/ash/components/device_activity/BUILD.gn deleted file mode 100644 index 18eb2c3..0000000 --- a/chromeos/ash/components/device_activity/BUILD.gn +++ /dev/null
@@ -1,123 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -import("//build/config/chromeos/ui_mode.gni") -import("//third_party/protobuf/proto_library.gni") - -assert(is_chromeos_ash, "Non-ChromeOS builds cannot depend on //ash") - -component("device_activity") { - output_name = "ash_device_activity" - defines = [ "IS_CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_IMPL" ] - - deps = [ - ":fresnel_service_proto", - "//ash/constants:constants", - "//base", - "//base:i18n", - "//chromeos/ash/components/dbus/private_computing:private_computing", - "//chromeos/ash/components/dbus/private_computing:private_computing_proto", - "//chromeos/ash/components/dbus/session_manager", - "//chromeos/ash/components/dbus/system_clock:system_clock", - "//chromeos/ash/components/network", - "//chromeos/ash/components/system", - "//components/policy/core/common", - "//components/prefs:prefs", - "//components/version_info", - "//crypto:crypto", - "//dbus", - "//google_apis", - "//services/network/public/cpp", - "//third_party/icu", - "//third_party/private_membership:private_membership", - "//third_party/private_membership:private_membership_proto", - "//url", - ] - - sources = [ - "churn_active_status.cc", - "churn_active_status.h", - "churn_cohort_use_case_impl.cc", - "churn_cohort_use_case_impl.h", - "churn_observation_use_case_impl.cc", - "churn_observation_use_case_impl.h", - "daily_use_case_impl.cc", - "daily_use_case_impl.h", - "device_active_use_case.cc", - "device_active_use_case.h", - "device_activity_client.cc", - "device_activity_client.h", - "device_activity_controller.cc", - "device_activity_controller.h", - "fake_psm_delegate.cc", - "fake_psm_delegate.h", - "fresnel_pref_names.cc", - "fresnel_pref_names.h", - "twenty_eight_day_active_use_case_impl.cc", - "twenty_eight_day_active_use_case_impl.h", - ] -} - -source_set("unit_tests") { - testonly = true - - sources = [ - "churn_active_status_unittest.cc", - "churn_cohort_use_case_impl_unittest.cc", - "churn_observation_use_case_impl_unittest.cc", - "daily_use_case_impl_unittest.cc", - "device_active_use_case_unittest.cc", - "device_activity_client_unittest.cc", - "device_activity_controller_unittest.cc", - "twenty_eight_day_active_use_case_impl_unittest.cc", - ] - - deps = [ - ":device_activity", - ":fresnel_service_proto", - "//ash/constants:constants", - "//base", - "//base/test:test_support", - "//chromeos/ash/components/dbus/private_computing:private_computing", - "//chromeos/ash/components/dbus/private_computing:private_computing_proto", - "//chromeos/ash/components/dbus/session_manager:session_manager", - "//chromeos/ash/components/dbus/system_clock:system_clock", - "//chromeos/ash/components/network", - "//chromeos/ash/components/network:test_support", - "//chromeos/ash/components/system", - "//components/policy/core/common:test_support", - "//components/prefs:test_support", - "//components/version_info:channel", - "//dbus", - "//services/device/public/cpp:test_support", - "//services/network:test_support", - "//testing/gmock", - "//testing/gtest", - "//third_party/private_membership:private_membership", - ] - - data = [ - "//chromeos/ash/components/device_activity/testing/private_computing_service_test_data.binarypb", - - # TODO(crbug/1393862): Script should binarypb from textpb. - "//third_party/private_membership/src/internal/testing/regression_test_data/test_data.binarypb", - ] -} - -proto_library("fresnel_service_proto") { - sources = [ "fresnel_service.proto" ] - - extra_configs = - [ "//third_party/private_membership:private_membership_config" ] - - import_dirs = [ - "//third_party/private_membership/src", - "//third_party/shell-encryption/src", - ".", - ] - - proto_in_dir = "//" - - link_deps = [ "//third_party/private_membership:private_membership_proto" ] -}
diff --git a/chromeos/ash/components/device_activity/DEPS b/chromeos/ash/components/device_activity/DEPS deleted file mode 100644 index abe60e1e..0000000 --- a/chromeos/ash/components/device_activity/DEPS +++ /dev/null
@@ -1,11 +0,0 @@ -include_rules = [ - "+chromeos/ash/components/dbus/private_computing", - "+chromeos/ash/components/dbus/system_clock", - "+chromeos/ash/components/dbus/session_manager", - "+chromeos/ash/components/network", - "+chromeos/ash/components/system", - "+components/policy", - "+components/version_info", - "+google_apis", - "+third_party/private_membership", -]
diff --git a/chromeos/ash/components/device_activity/DIR_METADATA b/chromeos/ash/components/device_activity/DIR_METADATA deleted file mode 100644 index 9d3b5fa..0000000 --- a/chromeos/ash/components/device_activity/DIR_METADATA +++ /dev/null
@@ -1,3 +0,0 @@ -monorail: { - component: "OS>Software>Data" -}
diff --git a/chromeos/ash/components/device_activity/OWNERS b/chromeos/ash/components/device_activity/OWNERS deleted file mode 100644 index 107f230b..0000000 --- a/chromeos/ash/components/device_activity/OWNERS +++ /dev/null
@@ -1,2 +0,0 @@ -hirthanan@google.com -qianwan@google.com
diff --git a/chromeos/ash/components/device_activity/README.md b/chromeos/ash/components/device_activity/README.md deleted file mode 100644 index 40990fcd..0000000 --- a/chromeos/ash/components/device_activity/README.md +++ /dev/null
@@ -1,43 +0,0 @@ -# chromeos/ash/components/device_activity - -This directory contains the code required to send active device pings -(segmentable across various dimensions) in a privacy-compliant manner. - -In order to report activity for a given window, the client deterministically -generates a fingerprint using a high entropy seed which is sent to the Google -servers at most once. These are used to determine the device active counts. - -Googlers: See go/chromeos-data-pc - - -## Testing - -If you would like to update the private_computing_service_test_data.binarypb -protobuf representing the PrivateComputingClientRegressionTestData (used in unit testing), -you can add new test cases to private_computing_service_test_data.textpb. - -You may then generate a new binarypb using the updated textpb. - -``` -cd ../chromium/src/chromeos/ash/components/device_activity/testing/ - -# Command used to convert between proto types (i.e textproto to binarypb) -# gqui from textproto:<path_to_textpb> <path_to_proto_message> --outfile=rawproto:<path_to_binarypb_destination> -gqui from textproto:private_computing_service_test_data.textpb proto \ - ~/chromiumos/src/platform2/system_api/dbus/private_computing/private_computing_service.proto:private_computing.PrivateComputingClientRegressionTestData \ - --outfile=rawproto:private_computing_service_test_data.binarypb -``` - -After it has been successfully generated, make sure you update the unit tests. -You can then upload the new textpb and binarypb to Gerrit. - - -``` -# Build the chromeos unittests target. -autoninja -C out/Default chromeos_unittests - -# Run the device_activity/ unit tests. -./out/Default/chromeos_unittests --log-level=0 --enable-logging=stderr \ - --gtest_filter="*DeviceActi*:*UseCase*" -``` -
diff --git a/chromeos/ash/components/device_activity/churn_active_status.cc b/chromeos/ash/components/device_activity/churn_active_status.cc deleted file mode 100644 index 0feadf4..0000000 --- a/chromeos/ash/components/device_activity/churn_active_status.cc +++ /dev/null
@@ -1,329 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/churn_active_status.h" - -#include "base/logging.h" -#include "base/strings/string_number_conversions.h" -#include "base/time/time.h" -#include "chromeos/ash/components/system/statistics_provider.h" - -namespace ash::device_activity { - -namespace { - -// We define the inception date as January 1st 2000 GMT. -// This value is used to keep track of the number of months since the -// inception date in the first 10 bits of the active status -// |value_|. -const char kActiveStatusInceptionDate[] = "2000-01-01 00:00:00 GMT"; - -// Default value for devices that are missing the activate date. -const char kActivateDateKeyNotFound[] = "ACTIVATE_DATE_KEY_NOT_FOUND"; - -// Number of days in a week. -constexpr int kNumberOfDaysInWeek = 7; - -// day_of_week index for Monday in the base::Time::Exploded object. -constexpr int kMondayDayOfWeekIndex = 1; - -base::Time GetFirstMondayFromNewYear(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - // Only the Year, Month, and Day fields should be set. - // All other values such as hour, minute, second should be set to 0. - exploded.hour = 0; - exploded.minute = 0; - exploded.second = 0; - exploded.millisecond = 0; - - // day_of_week field is 0 based starting from Sunday. - int days_to_first_monday; - - if (kMondayDayOfWeekIndex >= exploded.day_of_week) { - // Difference in days between Sunday/Monday to Monday. - days_to_first_monday = kMondayDayOfWeekIndex - exploded.day_of_week; - } else { - // Number of days to get to the next Monday from the current day_of_week. - days_to_first_monday = kNumberOfDaysInWeek - (exploded.day_of_week - 1); - } - - return ts + base::Days(days_to_first_monday); -} - -// VPD field ActivateDate is based on GMT/UTC timezone. -// The ActivateDate vpd field value includes the weeks: %W -// Note: week number of year, with Monday as first day of week (00..53) -base::Time Iso8601DateWeekAsTime(int activate_year, int activate_week_of_year) { - if (activate_year < 0 || activate_week_of_year < 0 || - activate_week_of_year > 53) { - LOG(ERROR) << "Invalid year or week of year" - << ". Variable activate_year = " << activate_year - << ". Variable activate_week_of_year = " - << activate_week_of_year; - return base::Time(); - } - - // Get the first monday of the parsed activate date year as a base::Time - // object. This will make it easier to add the required number of days to get - // the start of the ISO 8601 week standard period. - base::Time new_year_ts; - std::string new_year_date = - "Jan 01 00:00:00 GMT " + std::to_string(activate_year); - bool success = base::Time::FromUTCString(new_year_date.c_str(), &new_year_ts); - - if (!success) { - LOG(ERROR) - << "Failed to store new year in base::Time using FromUTCString method."; - return base::Time(); - } - - // ISO 8601 assigns the weeks to 0 if the stored date was - // before the first monday of the year. - // For example, the first monday of 2020 is Jan 6th, so devices that had - // Activated between [Jan 1st, Jan 5th] have activate week of year set to 0. - if (activate_week_of_year == 0) { - return new_year_ts; - } - - base::Time first_monday_of_year = GetFirstMondayFromNewYear(new_year_ts); - - // Get the number of days to the start of a ISO 8601 week standard period for - // that year from the years first monday. - // This is equal to (activate_week_of_year-1) * 7 days. - int days_in_iso_period = 0; - days_in_iso_period = (activate_week_of_year - 1) * 7; - - // Add the above two steps to get the start of a ISO 8601 week time. - return first_monday_of_year + base::Days(days_in_iso_period); -} - -} // namespace - -ChurnActiveStatus::ChurnActiveStatus() : ChurnActiveStatus(0) {} - -ChurnActiveStatus::ChurnActiveStatus(int value) - : value_(value), - statistics_provider_(system::StatisticsProvider::GetInstance()) { - SetFirstActiveWeek(); -} - -ChurnActiveStatus::~ChurnActiveStatus() = default; - -int ChurnActiveStatus::GetValueAsInt() const { - return static_cast<int>(value_.to_ulong()); -} - -absl::optional<std::bitset<ChurnActiveStatus::kChurnBitSize>> -ChurnActiveStatus::CalculateValue(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - int year = exploded.year; - int month = exploded.month; - - // Calculate total number of months since January 2000 to current month. - // e.g. Dec 2022 should return a total of 275 months. - int new_months_from_inception = - ((year - kInceptionYear) * kMonthsInYear) + (month - 1); - - int previous_months_from_inception = GetMonthsSinceInception(); - - // Check if new_months_from_inception is greater than previous - // months_from_inception which was stored in |value_|. - if (new_months_from_inception <= previous_months_from_inception) { - LOG(ERROR) << "Failed to update churn active status value_. " - << "New months from inception is smaller than the previous " - "number of months from inception."; - LOG(ERROR) << "Previous months from inception = " - << previous_months_from_inception; - LOG(ERROR) << "New months from inception = " << new_months_from_inception; - - return absl::nullopt; - } - - // Calculate new_active_months since we are in a new month. - // Shift the 18 bits N to the left to represent the inactive months, and - // set the last bit to 1 to mark this month as active. - std::bitset<kActiveMonthsBitSize> new_active_months(GetActiveMonthBits()); - new_active_months <<= - (new_months_from_inception - previous_months_from_inception); - new_active_months |= 1; - - // Recreate |value_| formatted with first 10 bits representing months from - // inception to current month. Followed by 18 bits representing last 18 months - // of actives from current month. - std::bitset<kChurnBitSize> updated_value(new_months_from_inception); - - updated_value <<= kActiveMonthsBitSize; - updated_value |= static_cast<int>(new_active_months.to_ulong()); - - return updated_value; -} - -void ChurnActiveStatus::SetValue( - std::bitset<ChurnActiveStatus::kChurnBitSize> val) { - value_ = val; -} - -absl::optional<std::bitset<ChurnActiveStatus::kChurnBitSize>> -ChurnActiveStatus::UpdateValue(base::Time ts) { - absl::optional<std::bitset<ChurnActiveStatus::kChurnBitSize>> active_bits = - CalculateValue(ts); - - if (!active_bits.has_value()) { - LOG(ERROR) << "Active bits was not updated since CalculateValue returned " - << "absl::nullopt."; - return absl::nullopt; - } - - SetValue(active_bits.value()); - return active_bits.value(); -} - -const base::Time ChurnActiveStatus::GetInceptionMonth() const { - base::Time inception_ts; - bool success = - base::Time::FromUTCString(kActiveStatusInceptionDate, &inception_ts); - - if (!success) { - LOG(ERROR) << "Failed to convert kActiveStatusInceptionDate to timestamp " - << "object."; - return base::Time(); - } - - return inception_ts; -} - -int ChurnActiveStatus::GetMonthsSinceInception() const { - // Get first 10 bits of |value_| which represent the total months since - // inception. - std::string month_from_inception = value_.to_string().substr( - kMonthsSinceInceptionBitOffset, - kActiveMonthsBitOffset - kMonthsSinceInceptionBitOffset); - - return static_cast<int>( - std::bitset<kMonthsSinceInceptionSize>(month_from_inception).to_ulong()); -} - -const base::Time ChurnActiveStatus::GetCurrentActiveMonth() const { - DCHECK_GE(GetMonthsSinceInception(), 0); - - base::Time inception_ts = GetInceptionMonth(); - int months_from_inception = GetMonthsSinceInception(); - - int years_from_inception = std::floor(months_from_inception / 12); - int months_from_inception_remaining = months_from_inception % 12; - - base::Time::Exploded exploded; - inception_ts.UTCExplode(&exploded); - - exploded.year += years_from_inception; - exploded.month += months_from_inception_remaining; - - base::Time current_active_month_ts; - bool success = - base::Time::FromUTCExploded(exploded, ¤t_active_month_ts); - - if (!success) { - LOG(ERROR) << "Failed to convert current active month back to timestamp."; - return base::Time(); - } - - return current_active_month_ts; -} - -int ChurnActiveStatus::GetActiveMonthBits() { - // Get bits at [10, 28] of |value_| which represents record of 18 months of - // actives from months since inception. - std::string active_months = value_.to_string().substr( - kActiveMonthsBitOffset, kChurnBitSize - kActiveMonthsBitOffset); - - return static_cast<int>( - std::bitset<kActiveMonthsBitSize>(active_months).to_ulong()); -} - -const base::Time ChurnActiveStatus::GetFirstActiveWeek() const { - return first_active_week_; -} - -base::Time ChurnActiveStatus::GetFirstActiveWeekForTesting( - const std::string& year, - const std::string& weeks) { - // Convert parsed year and weeks to int. - int activate_year; - int activate_week_of_year; - - bool year_success = base::StringToInt(year, &activate_year); - bool week_of_year_success = base::StringToInt(weeks, &activate_week_of_year); - - if (!year_success || !week_of_year_success) { - LOG(ERROR) << "Failed to convert string value year or weeks to type int."; - return base::Time(); - } - - return Iso8601DateWeekAsTime(activate_year, activate_week_of_year); -} - -void ChurnActiveStatus::SetFirstActiveWeek() { - // Retrieve ActivateDate vpd field from machine statistics object. - // Default |first_active_week_| to kActivateDateKeyNotFound if retrieval - // from machine statistics fails. - const absl::optional<base::StringPiece> first_active_week_val = - statistics_provider_->GetMachineStatistic(system::kActivateDateKey); - std::string first_active_week_str = - std::string(first_active_week_val.value_or(kActivateDateKeyNotFound)); - - // TODO(hirthanan): Add UMA histogram to count set vs unset after - // browser start. - if (first_active_week_str == kActivateDateKeyNotFound) { - LOG(ERROR) - << "Failed to retrieve ActivateDate VPD field from machine statistics. " - << "Leaving |first_active_week_| unset."; - return; - } - - // Activate date is formatted: "YYYY-WW" - int delimiter_index = first_active_week_str.find('-'); - - const int expected_first_active_week_size = 7; - const int expected_delimiter_index = 4; - if (first_active_week_str.size() != expected_first_active_week_size || - delimiter_index != expected_delimiter_index) { - LOG(ERROR) << "ActivateDate was retrieved but is not formatted as YYYY-WW. " - << "Received string : " << first_active_week_str; - return; - } - - const int expected_year_size = 4; - const int expected_weeks_size = 2; - - std::string parsed_year = first_active_week_str.substr(0, expected_year_size); - std::string parsed_weeks = first_active_week_str.substr( - expected_delimiter_index + 1, expected_weeks_size); - - // Verify |first_active_week_| string parsed successfully for the - // year and weeks. - if (parsed_year.empty() || parsed_weeks.empty()) { - LOG(ERROR) << "Failed to parse and convert the first active weeks string " - << "year and weeks."; - return; - } - - // Convert parsed year and weeks to int. - int activate_year; - int activate_week_of_year; - - base::StringToInt(parsed_year, &activate_year); - base::StringToInt(parsed_weeks, &activate_week_of_year); - - // Convert an ISO 8601 date week year and week of year to base::Time object. - // The returned base::Time object represents the start of a new ISO 8601 week. - // This will be based on the activate week that is stored by ActivateDate. - first_active_week_ = - Iso8601DateWeekAsTime(activate_year, activate_week_of_year); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/churn_active_status.h b/chromeos/ash/components/device_activity/churn_active_status.h deleted file mode 100644 index dff64812..0000000 --- a/chromeos/ash/components/device_activity/churn_active_status.h +++ /dev/null
@@ -1,116 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_ACTIVE_STATUS_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_ACTIVE_STATUS_H_ - -#include <bitset> - -#include "base/component_export.h" -#include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "third_party/abseil-cpp/absl/types/optional.h" - -namespace ash { - -namespace system { -class StatisticsProvider; -} // namespace system - -namespace device_activity { - -// The Churn use case maintains an instance of this class to represent -// which of the past 18 months the device was active. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - ChurnActiveStatus { - public: - // First 10 bits represent number months from 01/01/2000 to the current month. - // Remaining 18 bits represents past 18 months when device was active from - // current month. - static constexpr int kMonthsSinceInceptionSize = 10; - static constexpr int kActiveMonthsBitSize = 18; - static constexpr int kChurnBitSize = - kMonthsSinceInceptionSize + kActiveMonthsBitSize; - static constexpr int kInceptionYear = 2000; - static constexpr int kMonthsInYear = 12; - static constexpr int kMonthsSinceInceptionBitOffset = 0; - static constexpr int kActiveMonthsBitOffset = 10; - - ChurnActiveStatus(); - explicit ChurnActiveStatus(int value); - ChurnActiveStatus(const ChurnActiveStatus&) = delete; - ChurnActiveStatus& operator=(const ChurnActiveStatus&) = delete; - ~ChurnActiveStatus(); - - int GetValueAsInt() const; - - // Returns a copy of the 28 bit updated value which reflects the current - // month is also active. - absl::optional<std::bitset<kChurnBitSize>> CalculateValue(base::Time ts); - - // Set the |value_| field of the object. - // This value represents the 28 bit active status value that is shared across - // churn cohort and observation use cases. - // - // This method can be passed an integer representing the 28 bit value that is - // being set. This will do an implicit conversion using the - // unsigned long long constructor of the std::bitset class. - void SetValue(std::bitset<kChurnBitSize> val); - - // Update the |value_| to reflect the new 28 bits after the check in request - // is successful. - absl::optional<std::bitset<kChurnBitSize>> UpdateValue(base::Time ts); - - // Returns the base::Time object representing the defined inception date. - const base::Time GetInceptionMonth() const; - - // Returns the int representation of the known months since inception. - int GetMonthsSinceInception() const; - - // Uses the inception month and months since inception in order to return - // a new timestamp representing the current active month. - // - // TODO(hirthanan): Compare against CalculateValue parameter ts month and year - // to see accuracy and correctness of this method. - const base::Time GetCurrentActiveMonth() const; - - // Returns the int representation of the known active months in |value_|. - int GetActiveMonthBits(); - - const base::Time GetFirstActiveWeek() const; - - // Method is used to test the ActivateDate VPD field is able to get translated - // to the correct base::Time object. - base::Time GetFirstActiveWeekForTesting(const std::string& year, - const std::string& weeks); - - private: - // Set |first_active_week_|, which is at the week granularity. - // This field is set by retrieving the ActivateDate vpd field stored in - // machine statistics, which is a string. - // This string is converted to a base::Time object for easier comparison. - void SetFirstActiveWeek(); - - // Value storing the 28 bits for churn active status. - std::bitset<kChurnBitSize> value_; - - // Singleton lives throughout class lifetime. - const raw_ptr<system::StatisticsProvider, ExperimentalAsh> - statistics_provider_; - - // This class is constructed after the machine statistics are loaded. This - // callback logic exists in the device activity controller. - // The |first_active_week_| stores the UTC based ActivateDate VPD field, which - // specifies the date (week granularity) when the device was first activated. - // Note: The exact first active month cannot be determined because of the - // week granularity, but the overall calculation for first active - // should be accurate since most weeks fall within the month. - base::Time first_active_week_; -}; - -} // namespace device_activity - -} // namespace ash - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_ACTIVE_STATUS_H_
diff --git a/chromeos/ash/components/device_activity/churn_active_status_unittest.cc b/chromeos/ash/components/device_activity/churn_active_status_unittest.cc deleted file mode 100644 index 08f0830..0000000 --- a/chromeos/ash/components/device_activity/churn_active_status_unittest.cc +++ /dev/null
@@ -1,668 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/churn_active_status.h" - -#include "base/logging.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace ash::device_activity { - -namespace { - -// Set the first active week from VPD field as "2000-01". -// This value represents the UTC based activate date of the device formatted -// YYYY-WW to reduce privacy granularity. -// See -// https://crsrc.org/o/src/third_party/chromiumos-overlay/chromeos-base/chromeos-activate-date/files/activate_date;l=67 -const char kFakeFirstActivateDate[] = "2000-01"; - -// The inception month for the active status value is Jan 2000. -const char kInceptionTimeString[] = "01 Jan 2000 00:00:00 GMT"; - -template <typename T> -int ConvertBitSetToInt(T bitset) { - return static_cast<int>(bitset.to_ulong()); -} - -base::Time GetNextMonth(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - // Set new time to the first midnight of the next month. - // "+ 11) % 12) + 1" wraps the month around if it goes outside 1..12. - exploded.month = (((exploded.month + 1) + 11) % 12) + 1; - exploded.year += (exploded.month == 1); - exploded.day_of_month = 1; - exploded.hour = exploded.minute = exploded.second = exploded.millisecond = 0; - - base::Time new_month_ts; - EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &new_month_ts)); - - return new_month_ts; -} - -} // namespace - -class ChurnActiveStatusBase : public testing::Test { - public: - ChurnActiveStatusBase() : ChurnActiveStatusBase(0) {} - explicit ChurnActiveStatusBase(int active_status_val) { - // Set the fake instance of statistics provider before - // initializing churn active status. - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - // Initialize base value of ActivateDate vpd field as - // kFakeFirstActivateDate. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, - kFakeFirstActivateDate); - - churn_active_status_ = - std::make_unique<ChurnActiveStatus>(active_status_val); - } - ChurnActiveStatusBase(const ChurnActiveStatusBase&) = delete; - ChurnActiveStatusBase& operator=(const ChurnActiveStatusBase&) = delete; - ~ChurnActiveStatusBase() override = default; - - protected: - ChurnActiveStatus* GetChurnActiveStatus() { - DCHECK(churn_active_status_); - return churn_active_status_.get(); - } - - system::FakeStatisticsProvider statistics_provider_; - - private: - // Object under test. - std::unique_ptr<ChurnActiveStatus> churn_active_status_; -}; - -TEST_F(ChurnActiveStatusBase, ActivateDateWeeksIsLargerThanLimit) { - // Overwrite the ActivateDate key in machine statistics. - // Number of weeks "54" is invalid and should not be a possible value. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2023-54"); - - // Validate that default constructor of base::Time() is returned when number - // of weeks is invalid. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2023", "54"), - base::Time()); -} - -TEST_F(ChurnActiveStatusBase, InvalidFormatActivateDate) { - // Overwrite the ActivateDate key in machine statistics. - // ActivateDate value should be formatted as numbers with YYYY-WW. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "XXXX-XX"); - - // Validate that default constructor of base::Time() is returned when invalid - // input is passed. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("XXXX", "XX"), - base::Time()); -} - -TEST_F(ChurnActiveStatusBase, ZeroWeeksUntilFirstMondayOfYear) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2023-00"); - - base::Time expected_ts; - EXPECT_TRUE(base::Time::FromString("Jan 01 00:00:00 GMT 2023", &expected_ts)); - - // Validate activate date for week 0 of 2023 is Jan 01, 2023. - // Note this date is not a monday since 00 week of year represents - // a non-monday date in ActivateDate. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2023", "00"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, FirstDayOfYearIsMonday) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1996-01"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 01 00:00:00 GMT 1996", &expected_ts)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1996", "01"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, ValidateCertainMonthsHaveFiftyThreeWeeks) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1996-53"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Dec 30 00:00:00 GMT 1996", &expected_ts)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1996", "53"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, GetNewYearDateIfFirstDayOfYearIsNotMonday) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1997-00"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 01 00:00:00 GMT 1997", &expected_ts)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1997", "00"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, GetFirstMondayIfFirstDayOfYearIsNotMonday) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1997-01"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 06 00:00:00 GMT 1997", &expected_ts)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1997", "01"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, ValidateIso8601WeekBetween1And52) { - // Overwrite the ActivateDate key in machine statistics. - // Year 1996 has 53 ISO 8601 weeks standard in it. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1996-52"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Dec 23 00:00:00 GMT 1996", &expected_ts)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1996", "52"), - expected_ts); - - // Validate 1997 week 2 in ISO 8601 week standard. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1997-02"); - base::Time expected_ts2; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 13 00:00:00 GMT 1997", &expected_ts2)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1997", "02"), - expected_ts2); - - // Validate 1997 week 52 in ISO 8601 week standard. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "1997-52"); - base::Time expected_ts3; - EXPECT_TRUE( - base::Time::FromString("Mon Dec 29 00:00:00 GMT 1997", &expected_ts3)); - - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("1997", "52"), - expected_ts3); -} - -TEST_F(ChurnActiveStatusBase, FirstMondayOfYear) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2023-01"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 02 00:00:00 GMT 2023", &expected_ts)); - - // Validate activate date for week 1 of 2023 is Monday Jan 02, 2023. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2023", "01"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, TenthWeekOfYear) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2023-10"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Mar 06 00:00:00 GMT 2023", &expected_ts)); - - // Validate activate date for week 10 of 2023 is Monday Mar 06, 2023. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2023", "10"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, ActivateWeekExceedsFiftyTwo) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2023-53"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 01 00:00:00 GMT 2024", &expected_ts)); - - // Validate activate date for week 53 of 2023 is Monday Jan 01, 2024. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2023", "53"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, ActivateDateWeekNeverSpansTwoYears) { - // Validate expected_ts does not go over year boundary. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2019-52"); - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Dec 30 00:00:00 GMT 2019", &expected_ts)); - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2019", "52"), - expected_ts); - - // Validate expected_ts2 doesn't go prior to current year date. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2020-00"); - base::Time expected_ts2; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 01 00:00:00 GMT 2020", &expected_ts2)); - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2020", "00"), - expected_ts2); - - // Validate expected_ts3 does not go over year boundary. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2020-52"); - base::Time expected_ts3; - EXPECT_TRUE( - base::Time::FromString("Mon Dec 28 00:00:00 GMT 2020", &expected_ts3)); - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2020", "52"), - expected_ts3); -} - -TEST_F(ChurnActiveStatusBase, ActivateDateWeekAtEndOfYear) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2020-52"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Dec 28 00:00:00 GMT 2020", &expected_ts)); - - // Validate activate date for week 52 of 2020 is Monday Dec 30, 2020. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2020", "52"), - expected_ts); -} - -TEST_F(ChurnActiveStatusBase, ActivateDateWeekSpansTwoMonths) { - // Overwrite the ActivateDate key in machine statistics. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, "2020-04"); - - base::Time expected_ts; - EXPECT_TRUE( - base::Time::FromString("Mon Jan 27 00:00:00 GMT 2020", &expected_ts)); - - // Validate activate date for week 4 of 2020 is Monday Jan 27, 2020. - EXPECT_EQ(GetChurnActiveStatus()->GetFirstActiveWeekForTesting("2020", "04"), - expected_ts); -} - -class ChurnActiveStatusAtInceptionDate : public ChurnActiveStatusBase { - public: - // Decimal of 28 bits representing January 2000. - // 0000000000 = 0 months from January 2000. - // 000000000000000000 = No active months - // 0000000000000000000000000000 = 0 - static constexpr int kInceptionDate = 0; - - ChurnActiveStatusAtInceptionDate() : ChurnActiveStatusBase(kInceptionDate) {} -}; - -TEST_F(ChurnActiveStatusAtInceptionDate, GetDefaultConstructorValue) { - EXPECT_EQ(GetChurnActiveStatus()->GetValueAsInt(), 0); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, SetValueWithInt) { - GetChurnActiveStatus()->SetValue(1); - - EXPECT_EQ(GetChurnActiveStatus()->GetActiveMonthBits(), 1); - EXPECT_EQ(GetChurnActiveStatus()->GetMonthsSinceInception(), 0); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, SetValueWithMax28BitValAsInt) { - int max_28_bit_as_int = 268435455; - GetChurnActiveStatus()->SetValue(max_28_bit_as_int); - - // Months since inception and Active months bits should be set correctly. - EXPECT_EQ(GetChurnActiveStatus()->GetMonthsSinceInception(), - std::pow(2, 10) - 1); - EXPECT_EQ(GetChurnActiveStatus()->GetActiveMonthBits(), std::pow(2, 18) - 1); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, ValidateTimestampForInceptionDate) { - base::Time month; - EXPECT_TRUE(base::Time::FromString(kInceptionTimeString, &month)); - - EXPECT_EQ(GetChurnActiveStatus()->GetInceptionMonth(), month); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, SetMaxActiveStatusValueAsInt) { - std::bitset<ChurnActiveStatus::kChurnBitSize> max_28_bits( - "1111111111111111111111111111"); - const int max_28_bits_as_int = 268435455; - EXPECT_EQ(ConvertBitSetToInt(max_28_bits), max_28_bits_as_int); - - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - churn_active_status->SetValue(max_28_bits); - - // Validate the max months since inception is: - // 2^10 - 1, which is equal to 10 bits all turned on.. - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - std::pow(2, 10) - 1); - - // Validate the max active months bits is: - // 2^18 - 1, which is equal to 18 bits all turned on. - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), std::pow(2, 18) - 1); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, GetMinActiveStatusValueAsInt) { - std::bitset<ChurnActiveStatus::kChurnBitSize> min_28_bits( - "0000000000000000000000000000"); - const int min_28_bits_as_int = 0; - EXPECT_EQ(ConvertBitSetToInt(min_28_bits), min_28_bits_as_int); - - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - churn_active_status->SetValue(min_28_bits); - - // Validate the months since inception and active months are both 0. - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), 0); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), 0); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, ActiveMonthsBitsIsZero) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), 0); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, ActiveMonthsBitsIsMaxed) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), 0); - - base::Time month; - EXPECT_TRUE(base::Time::FromString(kInceptionTimeString, &month)); - - for (int exponent = 0; exponent < ChurnActiveStatus::kActiveMonthsBitSize; - exponent++) { - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - std::pow(2, exponent) - 1); - - month = GetNextMonth(month); - churn_active_status->UpdateValue(month); - } - - // Verify that all bits are turned on for the past 18 months of active status. - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - std::pow(2, ChurnActiveStatus::kActiveMonthsBitSize) - 1); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, - ActiveInceptionMonthDoesNotModifyValueBits) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), 0); - - // Inception month should not modify active bits. - base::Time month; - EXPECT_TRUE(base::Time::FromString(kInceptionTimeString, &month)); - - churn_active_status->UpdateValue(month); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), 0); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, UpdateActiveSameMonth) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), 0); - - base::Time month; - EXPECT_TRUE(base::Time::FromString(kInceptionTimeString, &month)); - - // Update active status for inception month + 1 month. - // Inception month does not represent an active month. - month = GetNextMonth(month); - churn_active_status->UpdateValue(month); - - const int active_bits_val = churn_active_status->GetActiveMonthBits(); - const int expected_val = 1; - - EXPECT_EQ(active_bits_val, expected_val); - - // Attempt to update the value again using the same month. - churn_active_status->UpdateValue(month); - - // Verify that same month does not modify active month bits. - EXPECT_EQ(active_bits_val, expected_val); -} - -TEST_F(ChurnActiveStatusAtInceptionDate, ValidateUpdatingActiveStatus) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - base::Time month_1; - EXPECT_TRUE(base::Time::FromString("2000-02-01T00:00:00Z", &month_1)); - churn_active_status->UpdateValue(month_1); - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize> - expected_months_count("0000000001"); - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> expected_active_months( - "000000000000000001"); - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); - - base::Time month_2; - EXPECT_TRUE(base::Time::FromString("2000-03-01T00:00:00Z", &month_2)); - churn_active_status->UpdateValue(month_2); - expected_months_count = - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize>("0000000010"); - expected_active_months = std::bitset<ChurnActiveStatus::kActiveMonthsBitSize>( - "000000000000000011"); - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); - - base::Time month_3; - EXPECT_TRUE(base::Time::FromString("2000-06-01T00:00:00Z", &month_3)); - churn_active_status->UpdateValue(month_3); - expected_months_count = - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize>("0000000101"); - expected_active_months = std::bitset<ChurnActiveStatus::kActiveMonthsBitSize>( - "000000000000011001"); - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); -} - -class ChurnActiveStatusAtFixedDate : public ChurnActiveStatusBase { - public: - // Decimal of 28 bits representing January 2023. - // 0100010100 = 276 months since January 2000 - // 000000000000000001 = Only active in January 2023. - // 0100010100000000000000000001 = 72351745 - static constexpr int kFixedDate = 72351745; - static constexpr char kFixedDateTimeString[] = "01 Jan 2023 00:00:00 GMT"; - - ChurnActiveStatusAtFixedDate() : ChurnActiveStatusBase(kFixedDate) {} -}; - -TEST_F(ChurnActiveStatusAtFixedDate, ValidateCurrentActiveMonth) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - base::Time month; - EXPECT_TRUE(base::Time::FromString(kFixedDateTimeString, &month)); - - EXPECT_EQ(churn_active_status->GetCurrentActiveMonth(), month); -} - -TEST_F(ChurnActiveStatusAtFixedDate, UpdateActiveBefore18Months) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - // Set month_1 to exactly 17 months after January 2023. - base::Time month_1; - EXPECT_TRUE(base::Time::FromString("2024-06-01T00:00:00Z", &month_1)); - churn_active_status->UpdateValue(month_1); - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize> - expected_months_count("0100100101"); - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> expected_active_months( - "100000000000000001"); - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); -} - -TEST_F(ChurnActiveStatusAtFixedDate, UpdateActiveAt18Months) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - // Set month_1 to exactly 18 months after January 2023. - base::Time month_1; - EXPECT_TRUE(base::Time::FromString("2024-07-01T00:00:00Z", &month_1)); - churn_active_status->UpdateValue(month_1); - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize> - expected_months_count("0100100110"); - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> expected_active_months( - "000000000000000001"); - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); -} - -TEST_F(ChurnActiveStatusAtFixedDate, UpdateActiveAfter18Months) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - // Set month_1 to exactly 19 months after January 2023. - base::Time month_1; - EXPECT_TRUE(base::Time::FromString("2024-08-01T00:00:00Z", &month_1)); - churn_active_status->UpdateValue(month_1); - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize> - expected_months_count("0100100111"); - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> expected_active_months( - "000000000000000001"); - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); -} - -TEST_F(ChurnActiveStatusAtFixedDate, UpdateActiveFailsOnSettingBeforeDate) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - // Set month_1 to 1 month prior to January 2023. - // Validate that the |value_| does not change when trying to update with - // a past date. - base::Time month_1; - EXPECT_TRUE(base::Time::FromString("2022-12-01T00:00:00Z", &month_1)); - EXPECT_EQ(churn_active_status->UpdateValue(month_1), absl::nullopt); - - // These two variables represent value for January 2023, NOT December 2022. - std::bitset<ChurnActiveStatus::kMonthsSinceInceptionSize> - expected_months_count("0100010100"); - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> expected_active_months( - "000000000000000001"); - - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - ConvertBitSetToInt(expected_months_count)); - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - ConvertBitSetToInt(expected_active_months)); -} - -struct ChurnActiveStatusTestCase { - // Name of specific test. - std::string test_name; - - // 28 bit integer represents months from inception + 18 months of actives. - int active_status_value; - - // As stored by the ActivateDate script. - // Formatted: YYYY-WW - std::string activate_date; - - // Expected values from given inputs. - int expected_months_since_inception; - - std::string expected_current_active_month; - - int expected_active_month_bits; - - std::string expected_first_active_week; -}; - -class ChurnActiveStatusTest - : public testing::TestWithParam<ChurnActiveStatusTestCase> { - public: - // Construct ChurnActiveStatusTest object with various ActiveStatus values. - ChurnActiveStatusTest() { - // Set the fake instance of statistics provider before - // initializing churn active status. - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - // Initialize value of ActivateDate vpd field as kFakeFirstActivateDate. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, - GetParam().activate_date); - - churn_active_status_ = - std::make_unique<ChurnActiveStatus>(GetParam().active_status_value); - } - ChurnActiveStatusTest(const ChurnActiveStatusTest&) = delete; - ChurnActiveStatusTest& operator=(const ChurnActiveStatusTest&) = delete; - ~ChurnActiveStatusTest() override = default; - - protected: - ChurnActiveStatus* GetChurnActiveStatus() { - DCHECK(churn_active_status_); - return churn_active_status_.get(); - } - - private: - system::FakeStatisticsProvider statistics_provider_; - - // Object under test. - std::unique_ptr<ChurnActiveStatus> churn_active_status_; -}; - -// Add parameterized tests for validating behaviour ChurnActiveStatus for -// different 28 bit ActiveStatus integer values. -INSTANTIATE_TEST_SUITE_P( - VaryingActiveStatusValues, - ChurnActiveStatusTest, - testing::ValuesIn<ChurnActiveStatusTestCase>({ - {"FirstNewMonthFromInception", 262145, "2000-01", 1, - "01 Feb 2000 00:00:00 GMT", 1, "03 Jan 2000 00:00:00 GMT"}, - {"ArbitraryDate1", 1310721, "2000-01", 5, "01 Jun 2000 00:00:00 GMT", 1, - "03 Jan 2000 00:00:00 GMT"}, - {"ActiveValueGreaterThanVPDActivateDate", 72613889, "2023-10", 277, - "01 Feb 2023 00:00:00 GMT", 1, "06 Mar 2023 00:00:00 GMT"}, - }), - [](const testing::TestParamInfo<ChurnActiveStatusTestCase>& info) { - return info.param.test_name; - }); - -TEST_P(ChurnActiveStatusTest, ValidateGetCurrentActiveMonth) { - ChurnActiveStatus* churn_active_status = GetChurnActiveStatus(); - - // Validate the active status value passed to constructor is aligned with - // expected value. - EXPECT_EQ(churn_active_status->GetValueAsInt(), - GetParam().active_status_value); - - // Validate inception month is always Jan 2000 GMT. - base::Time inception_ts; - EXPECT_TRUE(base::Time::FromUTCString(kInceptionTimeString, &inception_ts)); - EXPECT_EQ(churn_active_status->GetInceptionMonth(), inception_ts); - - // Validate expected months since inception. - EXPECT_EQ(churn_active_status->GetMonthsSinceInception(), - GetParam().expected_months_since_inception); - - // Validate current active month is aligned with the - // expected current active month ts. - base::Time current_active_month_ts; - EXPECT_TRUE(base::Time::FromUTCString( - GetParam().expected_current_active_month.c_str(), - ¤t_active_month_ts)); - EXPECT_EQ(churn_active_status->GetCurrentActiveMonth(), - current_active_month_ts); - - // Validate the active month bits from the 28 bit value is aligned with what - // is expected. - EXPECT_EQ(churn_active_status->GetActiveMonthBits(), - GetParam().expected_active_month_bits); - - // Validate first active week is converted correctly based on ISO8601 week - // format. - base::Time first_active_week_ts; - EXPECT_TRUE(base::Time::FromUTCString( - GetParam().expected_first_active_week.c_str(), &first_active_week_ts)); - EXPECT_EQ(churn_active_status->GetFirstActiveWeek(), first_active_week_ts); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl.cc b/chromeos/ash/components/device_activity/churn_cohort_use_case_impl.cc deleted file mode 100644 index 78e706f..0000000 --- a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl.cc +++ /dev/null
@@ -1,146 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h" - -#include "ash/constants/ash_features.h" -#include "base/i18n/time_formatting.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "components/prefs/pref_service.h" -#include "components/version_info/channel.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Convert the 28 length bitset to an integer value. -int GetBitSetAsInt(std::bitset<ChurnActiveStatus::kChurnBitSize> value) { - return static_cast<int>(value.to_ulong()); -} - -bool IsFirstActiveInCohort(base::Time first_active_week, - base::Time cohort_active_ts) { - base::Time::Exploded first_active_exploded; - first_active_week.UTCExplode(&first_active_exploded); - base::Time::Exploded cohort_exploded; - cohort_active_ts.UTCExplode(&cohort_exploded); - return first_active_exploded.year == cohort_exploded.year && - first_active_exploded.month == cohort_exploded.month; -} -} // namespace - -ChurnCohortUseCaseImpl::ChurnCohortUseCaseImpl( - ChurnActiveStatus* churn_active_status_ptr, - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate) - : DeviceActiveUseCase( - psm_device_active_secret, - chrome_passed_device_params, - prefs::kDeviceActiveChurnCohortMonthlyPingTimestamp, - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT, - local_state, - std::move(psm_delegate)), - churn_active_status_ptr_(churn_active_status_ptr) { - DCHECK(churn_active_status_ptr_); -} - -ChurnCohortUseCaseImpl::~ChurnCohortUseCaseImpl() = default; - -// The Churn Cohort window identifier is the year-month when the device -// report its cohort active request to Fresnel. -// -// For example, if the device has reported its active on `20221202`, -// then the Churn Cohort window identifier is `202212` -std::string ChurnCohortUseCaseImpl::GenerateWindowIdentifier( - base::Time ts) const { - return base::UnlocalizedTimeFormatWithPattern(ts, "yyyyMM", - icu::TimeZone::getGMT()); -} - -absl::optional<FresnelImportDataRequest> -ChurnCohortUseCaseImpl::GenerateImportRequestBody() { - // Calculate a temporary active status value for this new cohort month. - auto new_active_bits = - churn_active_status_ptr_->CalculateValue(GetActiveTs()); - - if (!new_active_bits.has_value()) { - LOG(ERROR) << "Cohort import request failed because CalculateValue did not " - << "represent a new month."; - return absl::nullopt; - } - - // Generate Fresnel PSM import request body. - FresnelImportDataRequest import_request; - - // Create fresh |DeviceMetadata| object. - // Note every dimension added to this proto must be approved by privacy. - DeviceMetadata* device_metadata = import_request.mutable_device_metadata(); - device_metadata->set_chromeos_version(GetChromeOSVersion()); - device_metadata->set_chromeos_channel(GetChromeOSChannel()); - device_metadata->set_market_segment(GetMarketSegment()); - device_metadata->set_hardware_id(GetFullHardwareClass()); - - import_request.set_use_case(GetPsmUseCase()); - - std::string psm_id_str = GetPsmIdentifier().value().sensitive_id(); - std::string window_id_str = GetWindowIdentifier().value(); - - FresnelImportData* import_data = import_request.add_import_data(); - import_data->set_plaintext_id(psm_id_str); - import_data->set_window_identifier(window_id_str); - import_data->set_is_pt_window_identifier(true); - - ChurnCohortMetadata* cohort_metadata = - import_data->mutable_churn_cohort_metadata(); - - // Calculate the active status value for the current month. - // Only update the active status value officially if the cohort import request - // successfully sends this import request. - cohort_metadata->set_active_status_value( - GetBitSetAsInt(new_active_bits.value())); - base::Time first_active_week = churn_active_status_ptr_->GetFirstActiveWeek(); - // Only when we can get the ActivateDate from VPD then set whether the - // device is first active during the churn cohort period. If we cannot - // get value from VPD, then we don't set value for this field. - if (first_active_week != base::Time()) { - cohort_metadata->set_is_first_active_in_cohort(IsFirstActiveInCohort( - churn_active_status_ptr_->GetFirstActiveWeek(), GetActiveTs())); - } - - return import_request; -} - -bool ChurnCohortUseCaseImpl::IsEnabledCheckIn() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnCohortCheckIn); -} - -bool ChurnCohortUseCaseImpl::IsEnabledCheckMembership() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnCohortCheckMembership); -} - -private_computing::ActiveStatus ChurnCohortUseCaseImpl::GenerateActiveStatus() { - private_computing::ActiveStatus status; - - status.set_use_case(private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_COHORT); - - // TODO(qianwan) Make sure the date in preserved file is PST. - std::string last_ping_pt_date = - FormatPTDateString(GetLastKnownPingTimestamp()); - status.set_last_ping_date(last_ping_pt_date); - status.set_churn_active_status(churn_active_status_ptr_->GetValueAsInt()); - - return status; -} -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h b/chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h deleted file mode 100644 index 06e5682..0000000 --- a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h +++ /dev/null
@@ -1,52 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_COHORT_USE_CASE_IMPL_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_COHORT_USE_CASE_IMPL_H_ - -#include "base/component_export.h" -#include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" - -class PrefService; - -namespace version_info { -enum class Channel; -} // namespace version_info - -namespace ash::device_activity { - -// Forward declaration from fresnel_service.proto. -class FresnelImportDataRequest; - -// Contains the methods required to report the churn cohort device active. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - ChurnCohortUseCaseImpl : public DeviceActiveUseCase { - public: - ChurnCohortUseCaseImpl( - ChurnActiveStatus* churn_active_status_ptr, - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate); - ChurnCohortUseCaseImpl(const ChurnCohortUseCaseImpl&) = delete; - ChurnCohortUseCaseImpl& operator=(const ChurnCohortUseCaseImpl&) = delete; - ~ChurnCohortUseCaseImpl() override; - - // DeviceActiveUseCase: - std::string GenerateWindowIdentifier(base::Time ts) const override; - absl::optional<FresnelImportDataRequest> GenerateImportRequestBody() override; - bool IsEnabledCheckIn() override; - bool IsEnabledCheckMembership() override; - private_computing::ActiveStatus GenerateActiveStatus() override; - - private: - const raw_ptr<ChurnActiveStatus, ExperimentalAsh> churn_active_status_ptr_; -}; - -} // namespace ash::device_activity - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_COHORT_USE_CASE_IMPL_H_
diff --git a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc b/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc deleted file mode 100644 index 0101732..0000000 --- a/chromeos/ash/components/device_activity/churn_cohort_use_case_impl_unittest.cc +++ /dev/null
@@ -1,211 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h" - -#include "base/i18n/time_formatting.h" -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/device_activity_controller.h" -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// This secret should be of exactly length 64, since it is a 256 bit string -// encoded as a hexadecimal. -constexpr char kFakePsmDeviceActiveSecret[] = - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - -constexpr char kHardwareClassKeyNotFound[] = "HARDWARE_CLASS_KEY_NOT_FOUND"; - -// This value represents the UTC based activate date of the device formatted -// YYYY-WW to reduce privacy granularity. -// See -// https://crsrc.org/o/src/third_party/chromiumos-overlay/chromeos-base/chromeos-activate-date/files/activate_date;l=67 -const char kFakeFirstActivateDate[] = "2022-50"; - -// The decimal representation of the bit string `0100010001 000000000000001101` -// The first 10 bits represent the number of months since 2000 is 275, which -// represents the 2022-12. -// The right 18 bits represent the churn cohort active status for past 18 -// months. The right most bit represents the status of previous active mont, -// in this case, it represent 2022-12. And the second right most bit -// represents 2022-11, etc. -const int kFakeChurnActiveStatus = 71565325; - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -} // namespace - -class ChurnCohortUseCaseImplTest : public testing::Test { - public: - ChurnCohortUseCaseImplTest() = default; - ChurnCohortUseCaseImplTest(const ChurnCohortUseCaseImplTest&) = delete; - ChurnCohortUseCaseImplTest& operator=(const ChurnCohortUseCaseImplTest&) = - delete; - ~ChurnCohortUseCaseImplTest() override = default; - - protected: - // testing::Test: - void SetUp() override { - DeviceActivityController::RegisterPrefs(local_state_.registry()); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - // Set the ActiveDate key in machine statistics as kFakeFirstActivateDate. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, - kFakeFirstActivateDate); - - // Initialize the churn active status to a default value of 0. - churn_active_status_ = std::make_unique<ChurnActiveStatus>(0); - - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids; - churn_cohort_use_case_impl_ = std::make_unique<ChurnCohortUseCaseImpl>( - churn_active_status_.get(), kFakePsmDeviceActiveSecret, - kFakeChromeParameters, &local_state_, - // |FakePsmDelegate| can use any test case parameters. - std::make_unique<FakePsmDelegate>(std::string() /* ec_cipher_key */, - std::string() /* seed */, - std::move(plaintext_ids))); - } - - void TearDown() override { - DCHECK(churn_cohort_use_case_impl_); - DCHECK(churn_active_status_); - - // Safely destruct unique pointers. - churn_cohort_use_case_impl_.reset(); - churn_active_status_.reset(); - } - - std::unique_ptr<ChurnActiveStatus> churn_active_status_; - std::unique_ptr<ChurnCohortUseCaseImpl> churn_cohort_use_case_impl_; - - // Fake pref service for unit testing the local state. - TestingPrefServiceSimple local_state_; - system::FakeStatisticsProvider statistics_provider_; -}; - -class ChurnCohortUseCaseImplEmptyFirstActiveTest : public testing::Test { - public: - ChurnCohortUseCaseImplEmptyFirstActiveTest() = default; - ChurnCohortUseCaseImplEmptyFirstActiveTest( - const ChurnCohortUseCaseImplEmptyFirstActiveTest&) = delete; - ChurnCohortUseCaseImplEmptyFirstActiveTest& operator=( - const ChurnCohortUseCaseImplEmptyFirstActiveTest&) = delete; - ~ChurnCohortUseCaseImplEmptyFirstActiveTest() override = default; - - protected: - // testing::Test: - void SetUp() override { - DeviceActivityController::RegisterPrefs(local_state_.registry()); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - // Initialize the churn active status to a default value of 0. - churn_active_status_ = std::make_unique<ChurnActiveStatus>(0); - - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids; - churn_cohort_use_case_impl_ = std::make_unique<ChurnCohortUseCaseImpl>( - churn_active_status_.get(), kFakePsmDeviceActiveSecret, - kFakeChromeParameters, &local_state_, - // |FakePsmDelegate| can use any test case parameters. - std::make_unique<FakePsmDelegate>(std::string() /* ec_cipher_key */, - std::string() /* seed */, - std::move(plaintext_ids))); - } - - void TearDown() override { - DCHECK(churn_cohort_use_case_impl_); - DCHECK(churn_active_status_); - - // Safely destruct unique pointers. - churn_cohort_use_case_impl_.reset(); - churn_active_status_.reset(); - } - - std::unique_ptr<ChurnActiveStatus> churn_active_status_; - std::unique_ptr<ChurnCohortUseCaseImpl> churn_cohort_use_case_impl_; - - // Fake pref service for unit testing the local state. - TestingPrefServiceSimple local_state_; - system::FakeStatisticsProvider statistics_provider_; -}; - -TEST_F(ChurnCohortUseCaseImplTest, ValidateChurnMetadataWithFirstActiveIsTrue) { - churn_active_status_->SetValue(kFakeChurnActiveStatus); - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Dec 2022 23:59:59 GMT", &new_daily_ts)); - churn_cohort_use_case_impl_->SetWindowIdentifier(new_daily_ts); - std::string window_id_str = - churn_cohort_use_case_impl_->GetWindowIdentifier().value(); - EXPECT_EQ(window_id_str, "202212"); - - FresnelImportDataRequest req = - churn_cohort_use_case_impl_->GenerateImportRequestBody().value(); - EXPECT_EQ(req.device_metadata().hardware_id(), kHardwareClassKeyNotFound); - EXPECT_EQ(req.device_metadata().chromeos_channel(), Channel::CHANNEL_STABLE); - EXPECT_EQ(req.device_metadata().market_segment(), - MarketSegment::MARKET_SEGMENT_UNKNOWN); - EXPECT_FALSE(req.device_metadata().chromeos_version().empty()); - EXPECT_EQ(req.import_data(0).window_identifier(), "202212"); - EXPECT_TRUE( - req.import_data(0).churn_cohort_metadata().is_first_active_in_cohort()); - - base::Time first_active_week = churn_active_status_->GetFirstActiveWeek(); - EXPECT_EQ("202212", - base::UnlocalizedTimeFormatWithPattern(first_active_week, "yyyyMM", - icu::TimeZone::getGMT())); -} - -TEST_F(ChurnCohortUseCaseImplTest, ValidateFirstActiveStatusIsFalse) { - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Nov 2022 23:59:59 GMT", &new_daily_ts)); - churn_cohort_use_case_impl_->SetWindowIdentifier(new_daily_ts); - std::string window_id_str = - churn_cohort_use_case_impl_->GetWindowIdentifier().value(); - EXPECT_EQ(window_id_str, "202211"); - FresnelImportDataRequest req = - churn_cohort_use_case_impl_->GenerateImportRequestBody().value(); - EXPECT_FALSE( - req.import_data(0).churn_cohort_metadata().is_first_active_in_cohort()); -} - -TEST_F(ChurnCohortUseCaseImplEmptyFirstActiveTest, - ValidateFirstActiveStatusWithVPDNullField) { - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Dec 2022 23:59:59 GMT", &new_daily_ts)); - churn_cohort_use_case_impl_->SetWindowIdentifier(new_daily_ts); - std::string window_id_str = - churn_cohort_use_case_impl_->GetWindowIdentifier().value(); - EXPECT_EQ(window_id_str, "202212"); - FresnelImportDataRequest req = - churn_cohort_use_case_impl_->GenerateImportRequestBody().value(); - EXPECT_FALSE(req.import_data(0) - .churn_cohort_metadata() - .has_is_first_active_in_cohort()); - - // First active week should be null. - EXPECT_TRUE(churn_active_status_->GetFirstActiveWeek() == base::Time()); -} -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/churn_observation_use_case_impl.cc b/chromeos/ash/components/device_activity/churn_observation_use_case_impl.cc deleted file mode 100644 index 5ac50d61..0000000 --- a/chromeos/ash/components/device_activity/churn_observation_use_case_impl.cc +++ /dev/null
@@ -1,513 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/churn_observation_use_case_impl.h" - -#include "ash/constants/ash_features.h" -#include "base/i18n/time_formatting.h" -#include "base/strings/stringprintf.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "components/prefs/pref_service.h" -#include "components/version_info/channel.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace { - -// There are 18 bits (indexed 17 to 0, left to right) representing the past 18 -// months of the device actives. The right-most bit will always represent the -// device was active for the current month. -// -// The cohort use case will ping for the current month before -// the observation use case reads the active status bits. -// In other words, the current month is represented at index 0 (right-most bit). -// -// Index (1-3) in the active status bits represents the monthly active churn -// status for the 3 different observation windows. -constexpr int kMonthlyChurnActiveStatusOffsetIndex = 1; - -// Index (13-15) in the active status bits represents the -// yearly active churn status for the 3 different observation windows. -constexpr int kYearlyChurnActiveStatusOffsetIndex = 13; - -// Number of months in a given year. -constexpr int kMonthsInYear = 12; - -base::Time GetNextMonth(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - // Set new time to the first midnight of the next month. - // "+ 11) % 12) + 1" wraps the month around if it goes outside 1..12. - exploded.month = (((exploded.month + 1) + 11) % 12) + 1; - exploded.year += (exploded.month == 1); - exploded.day_of_month = 1; - exploded.hour = exploded.minute = exploded.second = exploded.millisecond = 0; - - base::Time new_month_ts; - return base::Time::FromUTCExploded(exploded, &new_month_ts) ? new_month_ts - : base::Time(); -} - -base::Time GetPreviousMonth(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - // Set new time to the first midnight of the previous month. - // "+ 11) % 12) + 1" wraps the month around if it goes outside 1..12. - exploded.month = (((exploded.month - 1) + 11) % 12) + 1; - exploded.year -= (exploded.month == 12); - exploded.day_of_month = 1; - exploded.hour = exploded.minute = exploded.second = exploded.millisecond = 0; - - base::Time new_month_ts; - return base::Time::FromUTCExploded(exploded, &new_month_ts) ? new_month_ts - : base::Time(); -} - -} // namespace - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -ObservationWindow::ObservationWindow(int period, - const std::string& observation_period) { - SetPeriod(period); - SetObservationPeriod(observation_period); -} - -bool ObservationWindow::IsObservationWindowSet() const { - return (period_ != -1) && (!observation_period_.empty()); -} - -int ObservationWindow::GetPeriod() const { - if (!IsObservationWindowSet()) { - LOG(ERROR) << "Error - period or observation_period is unset."; - } - return period_; -} - -const std::string& ObservationWindow::GetObservationPeriod() const { - if (!IsObservationWindowSet()) { - LOG(ERROR) << "Error - period or observation_period is unset."; - } - return observation_period_; -} - -bool ObservationWindow::SetPeriod(int period) { - if (period < 0 || period > 2) { - LOG(ERROR) << "Error - failed to set period to value that is " - << "not within [0,2] inclusive." << std::endl - << "Attempted to set period as = " << period; - return false; - } - - period_ = period; - return true; -} - -bool ObservationWindow::SetObservationPeriod( - const std::string& observation_period) { - // Perform a simple check to verify observation period is of length - // YYYYMM-YYYYMM. - // - // std::size method includes null terminated character, so we can subtract 1. - if (observation_period.length() != - (std::size(kObservationPeriodFormat) - 1)) { - LOG(ERROR) << "Error - observation period is not set correctly." - << std::endl - << "Attempted to set observation period as = " - << observation_period; - return false; - } - - observation_period_ = observation_period; - return true; -} - -void ObservationWindow::Reset() { - period_ = -1; - observation_period_ = std::string(); -} - -ChurnObservationUseCaseImpl::ChurnObservationUseCaseImpl( - ChurnActiveStatus* churn_active_status_ptr, - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate) - : DeviceActiveUseCase( - psm_device_active_secret, - chrome_passed_device_params, - prefs::kDeviceActiveChurnObservationMonthlyPingTimestamp, - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION, - local_state, - std::move(psm_delegate)), - churn_active_status_ptr_(churn_active_status_ptr) {} - -ChurnObservationUseCaseImpl::~ChurnObservationUseCaseImpl() = default; - -// The Churn observation window identifier is the year-month when the device -// report its observation active request to Fresnel. -// -// For example, if the device has reported its active on `20221202`, -// then the Churn observation window identifier is `202212` -std::string ChurnObservationUseCaseImpl::GenerateWindowIdentifier( - base::Time ts) const { - return base::UnlocalizedTimeFormatWithPattern(ts, "yyyyMM", - icu::TimeZone::getGMT()); -} - -absl::optional<FresnelImportDataRequest> -ChurnObservationUseCaseImpl::GenerateImportRequestBody() { - if (!CohortCheckInSuccessfullyUpdatedActiveStatus()) { - LOG(ERROR) - << "Churn observation use case should only generate import request " - << "if the cohort use case successfully reported and updated the " - "active_status object."; - LOG(ERROR) << "Active status object currently has value = " - << churn_active_status_ptr_->GetValueAsInt(); - return absl::nullopt; - } - - // Initializes the 3 observation period window identifiers based on the - // current active ts month. - SetObservationPeriodWindows(GetActiveTs()); - - // Verify observation periods were set as expected. - if (!observation_window_0_.IsObservationWindowSet() && - !observation_window_1_.IsObservationWindowSet() && - !observation_window_2_.IsObservationWindowSet()) { - LOG(ERROR) << "All observation periods are currently unset. " - << "Returning empty FresnelImportDataRequest."; - return absl::nullopt; - } - - // Generate Fresnel PSM import request body. - FresnelImportDataRequest import_request; - - // Create fresh |DeviceMetadata| object. - // Note every dimension added to this proto must be approved by privacy. - DeviceMetadata* device_metadata = import_request.mutable_device_metadata(); - device_metadata->set_chromeos_version(GetChromeOSVersion()); - device_metadata->set_chromeos_channel(GetChromeOSChannel()); - device_metadata->set_market_segment(GetMarketSegment()); - device_metadata->set_hardware_id(GetFullHardwareClass()); - - import_request.set_use_case(GetPsmUseCase()); - - if (observation_window_0_.IsObservationWindowSet()) { - *import_request.add_import_data() = - GenerateObservationFresnelImportData(observation_window_0_); - } - - if (observation_window_1_.IsObservationWindowSet()) { - *import_request.add_import_data() = - GenerateObservationFresnelImportData(observation_window_1_); - } - - if (observation_window_2_.IsObservationWindowSet()) { - *import_request.add_import_data() = - GenerateObservationFresnelImportData(observation_window_2_); - } - - return import_request; -} - -bool ChurnObservationUseCaseImpl::IsEnabledCheckIn() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnObservationCheckIn); -} - -bool ChurnObservationUseCaseImpl::IsEnabledCheckMembership() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnObservationCheckMembership); -} - -// This method is called after all use cases have completed check in and the -// latest values are updated to the local state. -private_computing::ActiveStatus -ChurnObservationUseCaseImpl::GenerateActiveStatus() { - private_computing::ActiveStatus status; - - status.set_use_case(private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION); - - private_computing::ChurnObservationStatus* period_status = - status.mutable_period_status(); - - // The local state should contain the latest active period booleans. - period_status->set_is_active_current_period_minus_0( - GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - period_status->set_is_active_current_period_minus_1( - GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - period_status->set_is_active_current_period_minus_2( - GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - return status; -} - -FresnelImportData -ChurnObservationUseCaseImpl::GenerateObservationFresnelImportData( - const ObservationWindow& observation_window) const { - DCHECK(observation_window.IsObservationWindowSet()); - - std::string observation_window_id = observation_window.GetObservationPeriod(); - absl::optional<psm_rlwe::RlwePlaintextId> psm_id = - GeneratePsmIdentifier(observation_window_id); - std::string psm_id_str = psm_id.value().sensitive_id(); - - FresnelImportData import_data; - import_data.set_plaintext_id(psm_id_str); - import_data.set_window_identifier(observation_window_id); - import_data.set_is_pt_window_identifier(true); - - // Set the observation metadata used in churn computation. - ChurnObservationMetadata* observation_metadata = - import_data.mutable_churn_observation_metadata(); - observation_metadata->set_monthly_active_status( - IsPreviousMonthlyActive(observation_window)); - observation_metadata->set_yearly_active_status( - IsPreviousYearlyActive(observation_window)); - - absl::optional<ChurnObservationMetadata::FirstActiveDuringCohort> - first_active_during_cohort = - GetFirstActiveDuringCohort(observation_window); - - // Only set the proto observation metadata if we were able to calculate the - // first active during cohort enum successfully. - if (first_active_during_cohort.has_value()) { - observation_metadata->set_first_active_during_cohort( - first_active_during_cohort.value()); - } - - return import_data; -} - -bool ChurnObservationUseCaseImpl::IsPreviousMonthlyActive( - const ObservationWindow& observation_window) const { - DCHECK(churn_active_status_ptr_); - DCHECK(observation_window.IsObservationWindowSet()); - - int active_month_val = churn_active_status_ptr_->GetActiveMonthBits(); - - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> active_month_bits( - active_month_val); - - // Calculate the monthly churn rate by determining whether device was active - // in the previous month of the observation window. - // For example, for observation window "202303-202305", we would check for - // whether "202302" month was active. - return active_month_bits.test(kMonthlyChurnActiveStatusOffsetIndex + - observation_window.GetPeriod()); -} - -bool ChurnObservationUseCaseImpl::IsPreviousYearlyActive( - const ObservationWindow& observation_window) const { - DCHECK(churn_active_status_ptr_); - DCHECK(observation_window.IsObservationWindowSet()); - - int active_month_val = churn_active_status_ptr_->GetActiveMonthBits(); - - std::bitset<ChurnActiveStatus::kActiveMonthsBitSize> active_month_bits( - active_month_val); - - // Calculate the yearly churn rate by determining whether device was active - // 12 months before the previous month of the observation window. - // For example, for observation window "202303-202305", we would check for - // whether "202202" month was active. - return active_month_bits.test(kYearlyChurnActiveStatusOffsetIndex + - observation_window.GetPeriod()); -} - -absl::optional<ChurnObservationMetadata::FirstActiveDuringCohort> -ChurnObservationUseCaseImpl::GetFirstActiveDuringCohort( - const ObservationWindow& observation_window) const { - DCHECK(churn_active_status_ptr_); - DCHECK(observation_window.IsObservationWindowSet()); - - // TODO(hirthanan): Add UMA histogram to measure start of ActivateDate Period - base::Time first_active_week = churn_active_status_ptr_->GetFirstActiveWeek(); - - if (first_active_week == base::Time()) { - LOG(ERROR) - << "Reached an invalid state where the first active week is unset."; - return absl::nullopt; - } - - // This case should never happen since the device reports the churn cohort use - // case before this, churn observation use case. The churn cohort use case - // updates the active month bits for the current month, meaning this value - // should never be 0. - if (churn_active_status_ptr_->GetActiveMonthBits() == 0) { - LOG(ERROR) << "Reached an invalid state where the Active Month Bits is 0."; - return absl::nullopt; - } - - // Determine whether the device was first active in the month previous to the - // observation window. - // 1. Get new timestamp for months since inception. - // 2. IsPreviousMonthlyActive(observation_window) will tell us whether the - // device was active in the month before the observation window. - // 3. It is labelled first active if - // first_active_week == (observation_window_month-1) && bool in step 2 is - // true. - base::Time current_active_month = - churn_active_status_ptr_->GetCurrentActiveMonth(); - base::Time prev_active_month = current_active_month; - - // Get the month before the start of the observation period, [0,2]. - // This depends on the observation window period to know how - // many months back to go from the current active month. - // 1. Period 0 will be 1 month before the current active month. - // 2. Period 1 will be 2 months before the current active month. - // 3. Period 2 will be 3 months before the current active month. - int observation_window_period = observation_window.GetPeriod(); - for (int i = 0; i <= observation_window_period; i++) { - prev_active_month = GetPreviousMonth(prev_active_month); - } - - base::Time::Exploded first_active_week_exploded; - base::Time::Exploded prev_active_month_exploded; - - first_active_week.UTCExplode(&first_active_week_exploded); - prev_active_month.UTCExplode(&prev_active_month_exploded); - - if ((first_active_week_exploded.month == prev_active_month_exploded.month) && - (first_active_week_exploded.year == prev_active_month_exploded.year) && - IsPreviousMonthlyActive(observation_window)) { - return ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_MONTHLY_COHORT; - } - - // Determine whether the device was first active in previous cohort year. - // The previous cohort year is 12 months behind the previous cohort month. - base::Time prev_active_year = prev_active_month; - for (int i = 0; i < kMonthsInYear; i++) { - prev_active_year = GetPreviousMonth(prev_active_year); - } - - base::Time::Exploded prev_active_year_exploded; - prev_active_year.UTCExplode(&prev_active_year_exploded); - - if ((first_active_week_exploded.month == prev_active_year_exploded.month) && - (first_active_week_exploded.year == prev_active_year_exploded.year) && - IsPreviousYearlyActive(observation_window)) { - return ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_YEARLY_COHORT; - } - - // Since the device was not first active in the previous cohort month or - // previous cohort year, return EXISTED_OR_NOT_ACTIVE_YET. - return ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET; -} - -std::string ChurnObservationUseCaseImpl::GetObservationPeriod(int period) { - if (period == 0) { - return observation_window_0_.GetObservationPeriod(); - } - if (period == 1) { - return observation_window_1_.GetObservationPeriod(); - } - if (period == 2) { - return observation_window_2_.GetObservationPeriod(); - } - LOG(ERROR) << "Invalid period passed to method. " - << "There is only 3 observation periods."; - return std::string(); -} - -bool ChurnObservationUseCaseImpl::CohortCheckInSuccessfullyUpdatedActiveStatus() - const { - // Verify the active status object was updated from the inception date. - if (churn_active_status_ptr_->GetActiveMonthBits() == 0) { - LOG(ERROR) << "Active status has no active bits set. " - << "Active status value = " - << churn_active_status_ptr_->GetValueAsInt(); - return false; - } - - base::Time active_status_ts = - churn_active_status_ptr_->GetCurrentActiveMonth(); - base::Time cur_ping_ts = GetActiveTs(); - - // The active_status_ts and cur_ping_ts should already be initialized. - if (active_status_ts == base::Time() || cur_ping_ts == base::Time()) { - LOG(ERROR) << "active status or cur ping ts is not initialized. " - << std::endl - << "Active status ts = " << active_status_ts << std::endl - << "Current ping ts = " << cur_ping_ts; - return false; - } - - // Check that the active status object was updated at some point in this - // month. - base::Time::Exploded active_status_exploded; - active_status_ts.UTCExplode(&active_status_exploded); - base::Time::Exploded cur_ts_exploded; - cur_ping_ts.UTCExplode(&cur_ts_exploded); - return (active_status_exploded.month == cur_ts_exploded.month) && - (active_status_exploded.year == cur_ts_exploded.year); -} - -void ChurnObservationUseCaseImpl::SetObservationPeriodWindows(base::Time ts) { - if (ts == base::Time()) { - LOG(ERROR) << "Timestamp ts is not initialized. " - << "Observation periods are left unset."; - return; - } - - base::Time cur_month_minus_1 = GetPreviousMonth(ts); - base::Time cur_month_minus_2 = GetPreviousMonth(cur_month_minus_1); - - base::Time cur_month_plus_1 = GetNextMonth(ts); - base::Time cur_month_plus_2 = GetNextMonth(cur_month_plus_1); - - if (cur_month_minus_1 == base::Time() || cur_month_minus_2 == base::Time() || - cur_month_plus_1 == base::Time() || cur_month_plus_2 == base::Time()) { - LOG(ERROR) << "Failed to get base::Time object. " - << "Do not set observation periods"; - return; - } - - std::string cur_month_window_id = GenerateWindowIdentifier(ts); - - // Generate the observation period windows. - std::string observation_period_0 = - cur_month_window_id + "-" + GenerateWindowIdentifier(cur_month_plus_2); - std::string observation_period_1 = - GenerateWindowIdentifier(cur_month_minus_1) + "-" + - GenerateWindowIdentifier(cur_month_plus_1); - std::string observation_period_2 = - GenerateWindowIdentifier(cur_month_minus_2) + "-" + cur_month_window_id; - - // Update the observation windows that need to be sent to Fresnel only - // if the last known active period is false. - if (!GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)) { - observation_window_0_ = ObservationWindow(0, observation_period_0); - } else { - observation_window_0_.Reset(); - } - - if (!GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)) { - observation_window_1_ = ObservationWindow(1, observation_period_1); - } else { - observation_window_1_.Reset(); - } - - if (!GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)) { - observation_window_2_ = ObservationWindow(2, observation_period_2); - } else { - observation_window_2_.Reset(); - } -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/churn_observation_use_case_impl.h b/chromeos/ash/components/device_activity/churn_observation_use_case_impl.h deleted file mode 100644 index 3416118..0000000 --- a/chromeos/ash/components/device_activity/churn_observation_use_case_impl.h +++ /dev/null
@@ -1,131 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_OBSERVATION_USE_CASE_IMPL_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_OBSERVATION_USE_CASE_IMPL_H_ - -#include "base/component_export.h" -#include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "fresnel_service.pb.h" - -class PrefService; - -namespace version_info { -enum class Channel; -} // namespace version_info - -namespace ash::device_activity { - -// Forward declaration from fresnel_service.proto. -class FresnelImportDataRequest; - -// For a given device active month, there can be up to 3 observation windows -// that may need to be sent to Fresnel to compute monthly, yearly, and first -// active churn. -// -// For example, a device that comes online in Feb 2023 that has never sent -// observation windows for previous months may send. -// (Period, Observation Window) -// (0, 202302-202304) -// (1, 202301-202303) -// (2, 202212-202302) -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - ObservationWindow { - public: - static constexpr char kObservationPeriodFormat[] = "YYYYMM-YYYYMM"; - - ObservationWindow() = default; - ObservationWindow(int period, const std::string& observation_period); - ObservationWindow(const ObservationWindow&) = delete; - ObservationWindow& operator=(const ObservationWindow&) = default; - ~ObservationWindow() = default; - - bool IsObservationWindowSet() const; - - int GetPeriod() const; - - const std::string& GetObservationPeriod() const; - - bool SetPeriod(int period); - - bool SetObservationPeriod(const std::string& observation_period); - - void Reset(); - - private: - // Observation window period should be between [0, 2]. - int period_ = -1; - - // String representing the observation period formatted - // as "YYYYMM-YYYYMM" where the period length is 3 months. - std::string observation_period_; -}; - -// Contains the methods required to report the churn observation device active. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - ChurnObservationUseCaseImpl : public DeviceActiveUseCase { - public: - ChurnObservationUseCaseImpl( - ChurnActiveStatus* churn_active_status_ptr, - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate); - ChurnObservationUseCaseImpl(const ChurnObservationUseCaseImpl&) = delete; - ChurnObservationUseCaseImpl& operator=(const ChurnObservationUseCaseImpl&) = - delete; - ~ChurnObservationUseCaseImpl() override; - - // DeviceActiveUseCase: - std::string GenerateWindowIdentifier(base::Time ts) const override; - absl::optional<FresnelImportDataRequest> GenerateImportRequestBody() override; - bool IsEnabledCheckIn() override; - bool IsEnabledCheckMembership() override; - private_computing::ActiveStatus GenerateActiveStatus() override; - std::string GetObservationPeriod(int period) override; - - private: - // On successful churn cohort check in, the active status object is updated to - // the current month. If churn cohort check in failed this month, the - // active status object will reflect an old month. - bool CohortCheckInSuccessfullyUpdatedActiveStatus() const; - - // The observation use case generates 3 observation window identifiers - // for the 3 periods that it will need to ping for. - // Sets the |observation_window_0_|, |observation_window_1_|, - // and |observation_window_2_| based on the current ts month. - // - // For example, for the ts representing the date 03/01/2022, this method will - // set the observation period strings to: - // 202203-202205 ,202202-202204, and 202201-202203 respectively. - void SetObservationPeriodWindows(base::Time ts); - - // Generates FresnelImportData message given the window identifier. - // The churn observation use case will call this method 3 times for each of - // it's observation windows. - FresnelImportData GenerateObservationFresnelImportData( - const ObservationWindow& observation_window) const; - - bool IsPreviousMonthlyActive( - const ObservationWindow& observation_window) const; - - bool IsPreviousYearlyActive( - const ObservationWindow& observation_window) const; - - absl::optional<ChurnObservationMetadata::FirstActiveDuringCohort> - GetFirstActiveDuringCohort(const ObservationWindow& observation_window) const; - - const raw_ptr<ChurnActiveStatus, ExperimentalAsh> churn_active_status_ptr_; - - ObservationWindow observation_window_0_; - ObservationWindow observation_window_1_; - ObservationWindow observation_window_2_; -}; - -} // namespace ash::device_activity - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_CHURN_OBSERVATION_USE_CASE_IMPL_H_
diff --git a/chromeos/ash/components/device_activity/churn_observation_use_case_impl_unittest.cc b/chromeos/ash/components/device_activity/churn_observation_use_case_impl_unittest.cc deleted file mode 100644 index 47e01e7..0000000 --- a/chromeos/ash/components/device_activity/churn_observation_use_case_impl_unittest.cc +++ /dev/null
@@ -1,846 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/churn_observation_use_case_impl.h" - -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/device_activity_controller.h" -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Set the current time to the following string. -const char kFakeNowTimeString[] = "2023-01-01 00:00:00 GMT"; - -// Set the first active week from VPD field as "2023-01". -// This value represents the UTC based activate date of the device formatted -// YYYY-WW to reduce privacy granularity. -// See -// https://crsrc.org/o/src/third_party/chromiumos-overlay/chromeos-base/chromeos-activate-date/files/activate_date;l=67 -const char kFakeFirstActivateDate[] = "2023-01"; - -// This secret should be of exactly length 64, since it is a 256 bit string -// encoded as a hexadecimal. -constexpr char kFakePsmDeviceActiveSecret[] = - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -base::Time GetNextMonth(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - // Set new time to the first midnight of the next month. - // "+ 11) % 12) + 1" wraps the month around if it goes outside 1..12. - exploded.month = (((exploded.month + 1) + 11) % 12) + 1; - exploded.year += (exploded.month == 1); - exploded.day_of_month = 1; - exploded.hour = exploded.minute = exploded.second = exploded.millisecond = 0; - - base::Time new_month_ts; - return base::Time::FromUTCExploded(exploded, &new_month_ts) ? new_month_ts - : base::Time(); -} - -// Number of months in a year. -constexpr int kMonthsInYear = 12; - -base::Time GetNextYear(base::Time ts) { - base::Time new_year_ts = ts; - for (int i = 0; i < kMonthsInYear; i++) { - new_year_ts = GetNextMonth(new_year_ts); - } - - return new_year_ts; -} - -} // namespace - -class ChurnObservationUseCaseImplTest : public testing::Test { - public: - ChurnObservationUseCaseImplTest() = default; - ChurnObservationUseCaseImplTest(const ChurnObservationUseCaseImplTest&) = - delete; - ChurnObservationUseCaseImplTest& operator=( - const ChurnObservationUseCaseImplTest&) = delete; - ~ChurnObservationUseCaseImplTest() override = default; - - protected: - // testing::Test: - void SetUp() override { - DeviceActivityController::RegisterPrefs(local_state_.registry()); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - // Set the ActivateDate key in machine statistics as kFakeFirstActivateDate. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, - kFakeFirstActivateDate); - - // Initialize the churn active status to a default value of 0. - churn_active_status_ = std::make_unique<ChurnActiveStatus>(0); - - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids; - churn_observation_use_case_impl_ = - std::make_unique<ChurnObservationUseCaseImpl>( - churn_active_status_.get(), kFakePsmDeviceActiveSecret, - kFakeChromeParameters, &local_state_, - // |FakePsmDelegate| can use any test case parameters. - std::make_unique<FakePsmDelegate>(std::string() /* ec_cipher_key */, - std::string() /* seed */, - std::move(plaintext_ids))); - - // Update reporting ts for use case to kFakeNowTimeString. - base::Time now; - EXPECT_TRUE(base::Time::FromUTCString(kFakeNowTimeString, &now)); - churn_observation_use_case_impl_->SetWindowIdentifier(now); - - // Typically the churn cohort use case will update the - // |churn_active_status_| object before this use case is run. - churn_active_status_->UpdateValue(now); - } - - void TearDown() override { - DCHECK(churn_observation_use_case_impl_); - DCHECK(churn_active_status_); - - // Safely destruct unique pointers. - churn_observation_use_case_impl_.reset(); - churn_active_status_.reset(); - } - - std::unique_ptr<ChurnActiveStatus> churn_active_status_; - std::unique_ptr<ChurnObservationUseCaseImpl> churn_observation_use_case_impl_; - - // Fake pref service for unit testing the local state. - TestingPrefServiceSimple local_state_; - system::FakeStatisticsProvider statistics_provider_; -}; - -TEST_F(ChurnObservationUseCaseImplTest, ValidateWindowIdFormattedCorrectly) { - absl::optional<std::string> window_id = - churn_observation_use_case_impl_->GetWindowIdentifier(); - - EXPECT_TRUE(window_id.value() != std::string()); - EXPECT_EQ(static_cast<int>(window_id.value().size()), 6); - - EXPECT_EQ(window_id.value(), "202301"); -} - -TEST_F(ChurnObservationUseCaseImplTest, GetFirstActiveDuringCohortStatus) { - // Initialize active status object with fake value. - std::bitset<ChurnActiveStatus::kChurnBitSize> max_28_bits( - "1111111111111111111111111111"); - churn_active_status_->SetValue(max_28_bits); - churn_observation_use_case_impl_->GenerateImportRequestBody(); -} - -TEST_F(ChurnObservationUseCaseImplTest, - ValidateObservationWindowsMiddleOfYear) { - // Update reporting date to middle of the year. - base::Time now; - EXPECT_TRUE(base::Time::FromUTCString("2023-05-01 00:00:00 GMT", &now)); - churn_observation_use_case_impl_->SetWindowIdentifier(now); - - // Cohort churn use case should have updated the churn_active_status object - // prior to observation check in. - churn_active_status_->UpdateValue(now); - - // Generate observation windows. - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation windows are expected. - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(0), - "202305-202307"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(1), - "202304-202306"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(2), - "202303-202305"); -} - -TEST_F(ChurnObservationUseCaseImplTest, ValidateObservationWindowsEndOfYear) { - // Update reporting date to end of the year. - base::Time now; - EXPECT_TRUE(base::Time::FromUTCString("2023-12-01 00:00:00 GMT", &now)); - churn_observation_use_case_impl_->SetWindowIdentifier(now); - - // Cohort churn use case should have updated the churn_active_status object - // prior to observation check in. - churn_active_status_->UpdateValue(now); - - // Generate observation windows. - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation windows are expected. - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(0), - "202312-202402"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(1), - "202311-202401"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(2), - "202310-202312"); -} - -TEST_F(ChurnObservationUseCaseImplTest, ValidateObservationWindowsStartOfYear) { - // Update reporting date to start of the year. - base::Time now; - EXPECT_TRUE(base::Time::FromUTCString("2023-01-01 00:00:00 GMT", &now)); - churn_observation_use_case_impl_->SetWindowIdentifier(now); - - // Cohort churn use case should have updated the churn_active_status object - // prior to observation check in. - churn_active_status_->UpdateValue(now); - - // Generate observation windows. - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation windows are expected. - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(0), - "202301-202303"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(1), - "202212-202302"); - EXPECT_EQ(churn_observation_use_case_impl_->GetObservationPeriod(2), - "202211-202301"); -} - -TEST_F(ChurnObservationUseCaseImplTest, - FailedToSetObservationPeriodActiveTsInvalid) { - // Attempt to generate import request body without setting the window id or - // active ts. - churn_observation_use_case_impl_->ClearSavedState(); - EXPECT_EQ(churn_observation_use_case_impl_->GenerateImportRequestBody(), - absl::nullopt); -} - -TEST_F(ChurnObservationUseCaseImplTest, ObservationPeriodZeroIsMonthlyActive) { - // Update reporting date to 1 month after current active ts. - base::Time ts = GetNextMonth(churn_observation_use_case_impl_->GetActiveTs()); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to have been active last month. - // In the constructor we already initialize the active status value to reflect - // the device being active starting Jan 2023. - // We can simply update the value to reflect active in Feb 2023. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 has monthly active. - EXPECT_TRUE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_MONTHLY_COHORT); - - // Validate observation period 1. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 2. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, ObservationPeriodOneIsMonthlyActive) { - // Update reporting date to 2 month after current active ts. - base::Time ts = GetNextMonth( - GetNextMonth(churn_observation_use_case_impl_->GetActiveTs())); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to have been active 2 months ago. - // In the constructor we already initialize the active status value to reflect - // the device being active starting Jan 2023. - // We can simply update the value to reflect active in Mar 2023. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 1 has monthly active. - EXPECT_TRUE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_MONTHLY_COHORT); - - // Validate observation period 2. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, ObservationPeriodTwoIsMonthlyActive) { - // Update reporting date to 3 month after current active ts. - base::Time ts = GetNextMonth(GetNextMonth( - GetNextMonth(churn_observation_use_case_impl_->GetActiveTs()))); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to have been active 3 months ago. - // In the constructor we already initialize the active status value to reflect - // the device being active starting Jan 2023. - // We can simply update the value to reflect active in Apr 2023. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 1. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 2 has monthly active. - EXPECT_TRUE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_MONTHLY_COHORT); -} - -TEST_F(ChurnObservationUseCaseImplTest, - AllOberservationPeriodsHaveFalseMonthlyActive) { - // Set up function only updates the churn active status once. - // This should mean the past 17 months are all inactive, set to 0 bit. - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 has false monthly active. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 1 has false monthly active. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 2 has false monthly active. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, ObservationPeriodZeroIsYearlyActive) { - // Update reporting date to 12 + 1 months after current active month. - // It sets it 13 months ahead because the first active on cohort year - // has a 13 month look back from the current month. - base::Time ts = GetNextYear( - GetNextMonth(churn_observation_use_case_impl_->GetActiveTs())); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to be active 13 months into the future. - // In the constructor we already initialize the active status value to reflect - // the device being active starting Jan 2023. - // We can simply update the value to reflect active in Feb 2024. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 has yearly first active. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_TRUE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_YEARLY_COHORT); - - // Validate observation period 1 has no actives. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 2 has no actives. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, ObservationPeriodOneHasYearlyActive) { - // Update reporting date to 12 + 2 months after current active month. - // It sets the date 14 months ahead because the first active for the previous - // month observation window has a 14 month look back from the current month. - base::Time ts = GetNextYear(GetNextMonth( - GetNextMonth(churn_observation_use_case_impl_->GetActiveTs()))); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to be active 14 months into the future. - // In the constructor we already initialize the active status value to reflect - // the device being active starting Jan 2023. - // We can simply update the value to reflect active in Mar 2024. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 has noactive. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 1 has yearly first active. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_TRUE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_YEARLY_COHORT); - - // Validate observation period 2 has no actives. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, ObservationPeriodTwoHasYearlyActive) { - // Update reporting date to 12 + 3 months after current active month. - // It sets the date 15 months ahead because the first active for the previous - // month observation window has a 15 month look back from the current month. - base::Time ts = GetNextYear(GetNextMonth(GetNextMonth( - GetNextMonth(churn_observation_use_case_impl_->GetActiveTs())))); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to be active 15 months into the future. - // In the constructor we already initialize the active status value to reflect - // the device being active starting Jan 2023. - // We can simply update the value to reflect active in Apr 2024. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 has no actives. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 1 has no actives. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 2 has yearly first active. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_TRUE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_FIRST_ACTIVE_IN_YEARLY_COHORT); -} - -TEST_F(ChurnObservationUseCaseImplTest, - AllObservationPeriodsHaveFalseYearlyActive) { - // Update reporting date to 12 months after the current active month. - base::Time ts = GetNextYear(churn_observation_use_case_impl_->GetActiveTs()); - churn_observation_use_case_impl_->SetWindowIdentifier(ts); - - // Update 28 bit churn active status to be active 12 months from the last - // active ts. - churn_active_status_->UpdateValue(ts); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 has false yearly active. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 1 has false yearly active. - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(1) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(1) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); - - // Validate observation period 2 has false yearly active. - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(2) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(2) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, - ObservationPeriodHasMonthlyActiveButNotMonthlyFirstActive) { - // Update the churn active status for 2 months in a row. - // The first active week is set in the constructor as Jan 2023. - // This section of code updates the active status object to be - // active in Feb 2023, and March 2023. - base::Time ts = churn_observation_use_case_impl_->GetActiveTs(); - - base::Time month_1 = GetNextMonth(ts); - base::Time month_2 = GetNextMonth(month_1); - - churn_active_status_->UpdateValue(month_1); - churn_active_status_->UpdateValue(month_2); - - // Update the current date to reflect the current active status in March 2023. - churn_observation_use_case_impl_->SetWindowIdentifier(month_2); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 is monthly active but is not monthly first - // active. This is because monthly active from March 2023, checks whether the - // device was active in Feb 2023, which is true. - // The device was first active in Jan 2023, which does not align with March - // 2023 monthly cohort period of Feb 2023. - EXPECT_TRUE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, - ObservationPeriodHasYearlyActiveButNotYearlyFirstActive) { - // Update the churn active status for 2 months in a row, followed by being - // active 12 months later. The first active week is set in the constructor as - // Jan 2023. This section of code updates the active status object to be - // active in Feb 2023, March 2023, and then March 2024. - base::Time ts = churn_observation_use_case_impl_->GetActiveTs(); - - base::Time month_1 = GetNextMonth(ts); - base::Time month_2 = GetNextMonth(month_1); - base::Time month_14 = GetNextYear(month_2); - - churn_active_status_->UpdateValue(month_1); - churn_active_status_->UpdateValue(month_2); - churn_active_status_->UpdateValue(month_14); - - // Update the current date to reflect the current active status in March 2024. - churn_observation_use_case_impl_->SetWindowIdentifier(month_14); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - // Validate observation period 0 is yearly active but is not yearly first - // active. This is because yearly active from March 2024, checks whether the - // device was active in Feb 2023, which is true. - // The device was first active in Jan 2023, which does not align with March - // 2024 yearly cohort period of Feb 2023. - EXPECT_FALSE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .monthly_active_status()); - EXPECT_TRUE(observation_req.value() - .import_data(0) - .churn_observation_metadata() - .yearly_active_status()); - EXPECT_EQ( - observation_req.value() - .import_data(0) - .churn_observation_metadata() - .first_active_during_cohort(), - ChurnObservationMetadata_FirstActiveDuringCohort_EXISTED_OR_NOT_ACTIVE_YET); -} - -TEST_F(ChurnObservationUseCaseImplTest, EmptyActiveStatusIsInvalid) { - churn_active_status_->SetValue(0); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - EXPECT_FALSE(observation_req.has_value()); -} - -TEST_F(ChurnObservationUseCaseImplTest, ValueGreaterThanCurrentActiveMonth) { - // Initialize active status object with fake value. - std::bitset<ChurnActiveStatus::kChurnBitSize> max_28_bits( - "1111111111111111111111111111"); - churn_active_status_->SetValue(max_28_bits); - - auto observation_req = - churn_observation_use_case_impl_->GenerateImportRequestBody(); - - EXPECT_FALSE(observation_req.has_value()); -} - -// TODO(hirthanan): Add parameterized tests first active week at start of month, -// end of month, start of year, end of year. Test active status object is all -// actives, all not active, some active. Test other inputs and boundary cases. - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/daily_use_case_impl.cc b/chromeos/ash/components/device_activity/daily_use_case_impl.cc deleted file mode 100644 index a03eb42..0000000 --- a/chromeos/ash/components/device_activity/daily_use_case_impl.cc +++ /dev/null
@@ -1,82 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/daily_use_case_impl.h" - -#include "ash/constants/ash_features.h" -#include "base/strings/stringprintf.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "components/prefs/pref_service.h" -#include "components/version_info/channel.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -DailyUseCaseImpl::DailyUseCaseImpl( - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate) - : DeviceActiveUseCase(psm_device_active_secret, - chrome_passed_device_params, - prefs::kDeviceActiveLastKnownDailyPingTimestamp, - psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY, - local_state, - std::move(psm_delegate)) {} - -DailyUseCaseImpl::~DailyUseCaseImpl() = default; - -absl::optional<FresnelImportDataRequest> -DailyUseCaseImpl::GenerateImportRequestBody() { - // Generate Fresnel PSM import request body. - FresnelImportDataRequest import_request; - - // Create fresh |DeviceMetadata| object. - // Note every dimension added to this proto must be approved by privacy. - DeviceMetadata* device_metadata = import_request.mutable_device_metadata(); - device_metadata->set_chromeos_version(GetChromeOSVersion()); - device_metadata->set_chromeos_channel(GetChromeOSChannel()); - device_metadata->set_market_segment(GetMarketSegment()); - device_metadata->set_hardware_id(GetFullHardwareClass()); - - import_request.set_use_case(GetPsmUseCase()); - - std::string psm_id_str = GetPsmIdentifier().value().sensitive_id(); - std::string window_id_str = GetWindowIdentifier().value(); - - FresnelImportData* import_data = import_request.add_import_data(); - import_data->set_plaintext_id(psm_id_str); - import_data->set_window_identifier(window_id_str); - import_data->set_is_pt_window_identifier(true); - - return import_request; -} - -bool DailyUseCaseImpl::IsEnabledCheckIn() { - return true; -} - -bool DailyUseCaseImpl::IsEnabledCheckMembership() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClientDailyCheckMembership); -} - -private_computing::ActiveStatus DailyUseCaseImpl::GenerateActiveStatus() { - private_computing::ActiveStatus status; - - status.set_use_case( - private_computing::PrivateComputingUseCase::CROS_FRESNEL_DAILY); - - std::string last_ping_pt_date = - FormatPTDateString(GetLastKnownPingTimestamp()); - status.set_last_ping_date(last_ping_pt_date); - - return status; -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/daily_use_case_impl.h b/chromeos/ash/components/device_activity/daily_use_case_impl.h deleted file mode 100644 index 915389c..0000000 --- a/chromeos/ash/components/device_activity/daily_use_case_impl.h +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DAILY_USE_CASE_IMPL_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DAILY_USE_CASE_IMPL_H_ - -#include "base/component_export.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" - -class PrefService; - -namespace version_info { -enum class Channel; -} // namespace version_info - -namespace ash::device_activity { - -// Forward declaration from fresnel_service.proto. -class FresnelImportDataRequest; - -// Contains the methods required to report the daily active use case. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) DailyUseCaseImpl - : public DeviceActiveUseCase { - public: - DailyUseCaseImpl( - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate); - DailyUseCaseImpl(const DailyUseCaseImpl&) = delete; - DailyUseCaseImpl& operator=(const DailyUseCaseImpl&) = delete; - ~DailyUseCaseImpl() override; - - // DeviceActiveUseCase: - absl::optional<FresnelImportDataRequest> GenerateImportRequestBody() override; - - // Whether current device active use case check-in is enabled or not. - bool IsEnabledCheckIn() override; - - // Whether current device active use case check membership is enabled or not. - bool IsEnabledCheckMembership() override; - - private_computing::ActiveStatus GenerateActiveStatus() override; -}; - -} // namespace ash::device_activity - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DAILY_USE_CASE_IMPL_H_
diff --git a/chromeos/ash/components/device_activity/daily_use_case_impl_unittest.cc b/chromeos/ash/components/device_activity/daily_use_case_impl_unittest.cc deleted file mode 100644 index 1cca434..0000000 --- a/chromeos/ash/components/device_activity/daily_use_case_impl_unittest.cc +++ /dev/null
@@ -1,124 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/daily_use_case_impl.h" - -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/device_activity_controller.h" -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// This secret should be of exactly length 64, since it is a 256 bit string -// encoded as a hexadecimal. -constexpr char kFakePsmDeviceActiveSecret[] = - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - -constexpr char kHardwareClassKeyNotFound[] = "HARDWARE_CLASS_KEY_NOT_FOUND"; - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -} // namespace - -class DailyUseCaseImplTest : public testing::Test { - public: - DailyUseCaseImplTest() = default; - DailyUseCaseImplTest(const DailyUseCaseImplTest&) = delete; - DailyUseCaseImplTest& operator=(const DailyUseCaseImplTest&) = delete; - ~DailyUseCaseImplTest() override = default; - - protected: - // testing::Test: - void SetUp() override { - DeviceActivityController::RegisterPrefs(local_state_.registry()); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids; - daily_use_case_impl_ = std::make_unique<DailyUseCaseImpl>( - kFakePsmDeviceActiveSecret, kFakeChromeParameters, &local_state_, - // |FakePsmDelegate| can use any test case parameters. - std::make_unique<FakePsmDelegate>(std::string() /* ec_cipher_key */, - std::string() /* seed */, - std::move(plaintext_ids))); - } - - void TearDown() override { daily_use_case_impl_.reset(); } - - std::unique_ptr<DailyUseCaseImpl> daily_use_case_impl_; - - // Fake pref service for unit testing the local state. - TestingPrefServiceSimple local_state_; - system::FakeStatisticsProvider statistics_provider_; -}; - -TEST_F(DailyUseCaseImplTest, ValidateWindowIdFormattedCorrectly) { - // Create fixed timestamp used to generate a fixed window identifier. - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_daily_ts)); - - std::string window_id = - daily_use_case_impl_->GenerateWindowIdentifier(new_daily_ts); - - EXPECT_EQ(window_id.size(), 8u); - EXPECT_EQ(window_id, "20220101"); -} - -TEST_F(DailyUseCaseImplTest, SameDayTimestampsHaveSameWindowId) { - base::Time daily_ts_1; - base::Time daily_ts_2; - - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &daily_ts_1)); - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &daily_ts_2)); - - EXPECT_EQ(daily_use_case_impl_->GenerateWindowIdentifier(daily_ts_1), - daily_use_case_impl_->GenerateWindowIdentifier(daily_ts_2)); -} - -TEST_F(DailyUseCaseImplTest, DifferentDayTimestampsHaveDifferentWindowId) { - base::Time daily_ts_1; - base::Time daily_ts_2; - - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &daily_ts_1)); - EXPECT_TRUE(base::Time::FromString("02 Jan 2022 00:00:00 GMT", &daily_ts_2)); - - EXPECT_NE(daily_use_case_impl_->GenerateWindowIdentifier(daily_ts_1), - daily_use_case_impl_->GenerateWindowIdentifier(daily_ts_2)); -} - -TEST_F(DailyUseCaseImplTest, ExpectedMetadataIsSet) { - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_daily_ts)); - - // Window identifier must be set before PSM id, and hence import request body - // can be generated. - daily_use_case_impl_->SetWindowIdentifier(new_daily_ts); - - FresnelImportDataRequest req = - daily_use_case_impl_->GenerateImportRequestBody().value(); - EXPECT_EQ(req.device_metadata().hardware_id(), kHardwareClassKeyNotFound); - EXPECT_EQ(req.device_metadata().chromeos_channel(), Channel::CHANNEL_STABLE); - EXPECT_EQ(req.device_metadata().market_segment(), - MarketSegment::MARKET_SEGMENT_UNKNOWN); - EXPECT_FALSE(req.device_metadata().chromeos_version().empty()); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_active_use_case.cc b/chromeos/ash/components/device_activity/device_active_use_case.cc deleted file mode 100644 index 291f8a4..0000000 --- a/chromeos/ash/components/device_activity/device_active_use_case.cc +++ /dev/null
@@ -1,333 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/device_active_use_case.h" - -#include "base/i18n/time_formatting.h" -#include "base/strings/string_number_conversions.h" -#include "base/strings/string_util.h" -#include "chromeos/ash/components/system/statistics_provider.h" -#include "components/prefs/pref_service.h" -#include "components/version_info/version_info.h" -#include "crypto/hmac.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Default value for devices that are missing the hardware class. -const char kHardwareClassKeyNotFound[] = "HARDWARE_CLASS_KEY_NOT_FOUND"; - -} // namespace - -DeviceActiveUseCase::DeviceActiveUseCase( - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - const std::string& use_case_pref_key, - psm_rlwe::RlweUseCase psm_use_case, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate) - : psm_device_active_secret_(psm_device_active_secret), - chrome_passed_device_params_(chrome_passed_device_params), - use_case_pref_key_(use_case_pref_key), - psm_use_case_(psm_use_case), - local_state_(local_state), - psm_delegate_(std::move(psm_delegate)), - statistics_provider_(system::StatisticsProvider::GetInstance()) { - DCHECK(psm_delegate_); - DCHECK(local_state_); -} - -DeviceActiveUseCase::~DeviceActiveUseCase() = default; - -std::string DeviceActiveUseCase::GetObservationPeriod(int period) { - LOG(ERROR) << "Method should only be called for Churn Observation use case." - << "Called for use case = " - << psm_rlwe::RlweUseCase_Name(GetPsmUseCase()) << std::endl - << "Called with parameter period = " << period; - return std::string(); -} - -void DeviceActiveUseCase::ClearSavedState() { - active_ts_ = base::Time(); - - window_id_ = absl::nullopt; - - psm_id_ = absl::nullopt; - - psm_id_to_date_.clear(); - - psm_ids_to_query_.clear(); - - psm_rlwe_client_.reset(); -} - -PrefService* DeviceActiveUseCase::GetLocalState() const { - return local_state_; -} - -base::Time DeviceActiveUseCase::GetLastKnownPingTimestamp() const { - return GetLocalState()->GetTime(use_case_pref_key_); -} - -void DeviceActiveUseCase::SetLastKnownPingTimestamp(base::Time new_ts) { - GetLocalState()->SetTime(use_case_pref_key_, new_ts); -} - -bool DeviceActiveUseCase::IsLastKnownPingTimestampSet() const { - return GetLastKnownPingTimestamp() != base::Time::UnixEpoch(); -} - -psm_rlwe::RlweUseCase DeviceActiveUseCase::GetPsmUseCase() const { - return psm_use_case_; -} - -absl::optional<std::string> DeviceActiveUseCase::GetWindowIdentifier() const { - return window_id_; -} - -bool DeviceActiveUseCase::SetWindowIdentifier(base::Time ts) { - std::string window_id = GenerateWindowIdentifier(ts); - psm_id_ = GeneratePsmIdentifier(window_id); - - // Check if |psm_id_| is generated. - if (!psm_id_.has_value()) { - LOG(ERROR) << "PSM ID has no value."; - return false; - } - - if (!SavePsmIdToDateMap(ts)) { - LOG(ERROR) << "Failed to save PSM identifiers date map for ts = " << ts; - return false; - } - - SetPsmIdentifiersToQuery(); - - if (!SetPsmIdentifiersToImport(ts)) { - LOG(ERROR) << "Failed to set PSM identifiers to import for ts = " << ts; - return false; - } - - active_ts_ = ts; - window_id_ = window_id; - return true; -} - -absl::optional<psm_rlwe::RlwePlaintextId> -DeviceActiveUseCase::GetPsmIdentifier() const { - return psm_id_; -} - -std::string DeviceActiveUseCase::GenerateWindowIdentifier(base::Time ts) const { - return base::UnlocalizedTimeFormatWithPattern(ts, "yyyyMMdd", - icu::TimeZone::getGMT()); -} - -void DeviceActiveUseCase::SetChurnActiveStatus( - ChurnActiveStatus* churn_active_status) { - churn_active_status_ = churn_active_status; -} - -ChurnActiveStatus* DeviceActiveUseCase::GetChurnActiveStatus() { - DCHECK(churn_active_status_); - - return churn_active_status_; -} - -base::Time DeviceActiveUseCase::GetActiveTs() const { - if (active_ts_.is_null()) { - LOG(ERROR) << "active_ts is currently unset."; - } - return active_ts_; -} - -bool DeviceActiveUseCase::SavePsmIdToDateMap(base::Time ts) { - DCHECK(psm_id_.has_value()); - psm_id_to_date_.clear(); - psm_id_to_date_.insert({psm_id_.value().sensitive_id(), ts.UTCMidnight()}); - return true; -} - -void DeviceActiveUseCase::SetPsmIdentifiersToQuery() { - // Clear previous values of id's to query. - psm_ids_to_query_.clear(); - - // Uses |psm_id_to_date_| keys to generate the psm id's to query. - for (auto kv : psm_id_to_date_) { - psm_rlwe::RlwePlaintextId psm_rlwe_id; - psm_rlwe_id.set_sensitive_id(kv.first); - - if (GetPsmUseCase() != psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY) { - VLOG(1) << "Daily use case should not attach the non sensitive id " - << "apart of the hashed query plaintext id. " - << "Import and Query must be consistent when sending " - << "sensitive_id and non_sensitive_id."; - psm_rlwe_id.set_non_sensitive_id(GenerateWindowIdentifier(kv.second)); - } - - psm_ids_to_query_.push_back(psm_rlwe_id); - } -} - -bool DeviceActiveUseCase::SetPsmIdentifiersToImport(base::Time ts) { - DCHECK(psm_id_.has_value()); - - // Clear previous values of id's to import. - new_import_data_.clear(); - - std::string window_id = GenerateWindowIdentifier(ts); - FresnelImportData import_data = FresnelImportData(); - import_data.set_window_identifier(window_id); - import_data.set_plaintext_id(psm_id_.value().sensitive_id()); - - return true; -} - -std::vector<private_membership::rlwe::RlwePlaintextId> -DeviceActiveUseCase::GetPsmIdentifiersToQuery() const { - return psm_ids_to_query_; -} - -std::vector<FresnelImportData> DeviceActiveUseCase::GetImportData() const { - return new_import_data_; -} - -base::Time DeviceActiveUseCase::RetrievePsmIdDate( - private_membership::rlwe::RlwePlaintextId id) { - auto it = psm_id_to_date_.find(id.sensitive_id()); - if (it == psm_id_to_date_.end()) { - return base::Time::UnixEpoch(); - } - return it->second; -} - -std::string DeviceActiveUseCase::GetDigestString( - const std::string& key, - const std::string& message) const { - crypto::HMAC hmac(crypto::HMAC::SHA256); - std::vector<uint8_t> digest(hmac.DigestLength()); - if (!hmac.Init(key) || !hmac.Sign(message, &digest[0], digest.size())) { - return std::string(); - } - return base::HexEncode(&digest[0], digest.size()); -} - -psm_rlwe::PrivateMembershipRlweClient* DeviceActiveUseCase::GetPsmRlweClient() { - return psm_rlwe_client_.get(); -} - -bool DeviceActiveUseCase::IsDevicePingRequired(base::Time new_ping_ts) const { - // Check the last recorded ping timestamp in local state prefs. - // This variable has the default Unix Epoch value if the device is - // new, powerwashed, recovered, or a RMA device. - base::Time prev_ping_ts = GetLastKnownPingTimestamp(); - - std::string prev_ping_window_id = GenerateWindowIdentifier(prev_ping_ts); - std::string new_ping_window_id = GenerateWindowIdentifier(new_ping_ts); - - // Safety check to avoid against clock drift, or unexpected timestamps. - // Check should make sure that we are not reporting window id's for - // day's previous to one that we reported already. - return prev_ping_ts < new_ping_ts && - prev_ping_window_id != new_ping_window_id; -} - -void DeviceActiveUseCase::SetPsmRlweClient( - std::vector<psm_rlwe::RlwePlaintextId> psm_ids) { - DCHECK(!psm_ids.empty()); - - auto status_or_client = - psm_delegate_->CreatePsmClient(GetPsmUseCase(), psm_ids); - - if (!status_or_client.ok()) { - LOG(ERROR) << "Failed to initialize PSM client."; - return; - } - - // Re-assigning the unique_ptr will reset the old unique_ptr. - psm_rlwe_client_ = std::move(status_or_client.value()); -} - - -std::string DeviceActiveUseCase::FormatPTDateString(base::Time ts) { - return base::UnlocalizedTimeFormatWithPattern(ts, "yyyy-MM-dd 00:00:00.000 z", - icu::TimeZone::getGMT()); -} - -absl::optional<psm_rlwe::RlwePlaintextId> -DeviceActiveUseCase::GeneratePsmIdentifier( - absl::optional<std::string> window_id) const { - const std::string psm_use_case = psm_rlwe::RlweUseCase_Name(GetPsmUseCase()); - if (psm_device_active_secret_.empty() || psm_use_case.empty() || - !window_id.has_value()) { - VLOG(1) << "Can not generate PSM id without the psm device secret, use " - "case, and window id being defined."; - return absl::nullopt; - } - - std::string unhashed_psm_id = - base::JoinString({psm_use_case, window_id.value()}, "|"); - - // |psm_id_str| represents a 64 byte hex encoded value by default. - std::string psm_id_str = - GetDigestString(psm_device_active_secret_, unhashed_psm_id); - - if (!psm_id_str.empty()) { - psm_rlwe::RlwePlaintextId psm_rlwe_id; - psm_rlwe_id.set_sensitive_id(psm_id_str); - - return psm_rlwe_id; - } - - // Failed HMAC-SHA256 hash on PSM id. - VLOG(1) << "Failed to calculate HMAC-256 has on PSM id."; - return absl::nullopt; -} - -std::string DeviceActiveUseCase::GetFullHardwareClass() const { - // Retrieve full hardware class from machine statistics object. - // Default |full_hardware_class| to kHardwareClassKeyNotFound if retrieval - // from machine statistics fails. - const absl::optional<base::StringPiece> full_hardware_class = - statistics_provider_->GetMachineStatistic(system::kHardwareClassKey); - return std::string(full_hardware_class.value_or(kHardwareClassKeyNotFound)); -} - -std::string DeviceActiveUseCase::GetChromeOSVersion() const { - return version_info::GetMajorVersionNumber(); -} - -Channel DeviceActiveUseCase::GetChromeOSChannel() const { - switch (chrome_passed_device_params_.chromeos_channel) { - case version_info::Channel::CANARY: - return Channel::CHANNEL_CANARY; - case version_info::Channel::DEV: - return Channel::CHANNEL_DEV; - case version_info::Channel::BETA: - return Channel::CHANNEL_BETA; - case version_info::Channel::STABLE: - return Channel::CHANNEL_STABLE; - case version_info::Channel::UNKNOWN: - default: - return Channel::CHANNEL_UNKNOWN; - } -} - -MarketSegment DeviceActiveUseCase::GetMarketSegment() const { - return chrome_passed_device_params_.market_segment; -} - -const std::string& DeviceActiveUseCase::GetPsmDeviceActiveSecret() const { - if (psm_device_active_secret_.empty()) { - VLOG(1) << "PSM Device Active Secret is not defined."; - } - - return psm_device_active_secret_; -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_active_use_case.h b/chromeos/ash/components/device_activity/device_active_use_case.h deleted file mode 100644 index 2c7ae892..0000000 --- a/chromeos/ash/components/device_activity/device_active_use_case.h +++ /dev/null
@@ -1,287 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVE_USE_CASE_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVE_USE_CASE_H_ - -#include <unordered_map> -#include <vector> - -#include "base/component_export.h" -#include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "chromeos/ash/components/dbus/private_computing/private_computing_service.pb.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "third_party/abseil-cpp/absl/types/optional.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -class PrefService; - -namespace version_info { -enum class Channel; -} // namespace version_info - -namespace ash { - -namespace system { -class StatisticsProvider; -} - -namespace device_activity { - -// Fields used in setting device active metadata, that are explicitly -// required from outside of ASH_CHROME due to the dependency limitations -// on chrome browser. -struct COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - ChromeDeviceMetadataParameters { - version_info::Channel chromeos_channel; - MarketSegment market_segment; -}; - -// Create a delegate which can be used to create fakes in unit tests. -// Fake via. delegate is required for creating deterministic unit tests. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - PsmDelegateInterface { - public: - virtual ~PsmDelegateInterface() = default; - virtual rlwe::StatusOr< - std::unique_ptr<private_membership::rlwe::PrivateMembershipRlweClient>> - CreatePsmClient(private_membership::rlwe::RlweUseCase use_case, - const std::vector<private_membership::rlwe::RlwePlaintextId>& - plaintext_ids) = 0; -}; - -// Base class for device active use cases. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - DeviceActiveUseCase { - public: - DeviceActiveUseCase( - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - const std::string& use_case_pref_key, - private_membership::rlwe::RlweUseCase psm_use_case, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate); - DeviceActiveUseCase(const DeviceActiveUseCase&) = delete; - DeviceActiveUseCase& operator=(const DeviceActiveUseCase&) = delete; - virtual ~DeviceActiveUseCase(); - - // Generate Fresnel PSM import request body. - // This will create the device metadata dimensions sent by PSM import by use - // case. - // - // Important: Each new dimension added to metadata will need to be approved by - // privacy. - virtual absl::optional<FresnelImportDataRequest> - GenerateImportRequestBody() = 0; - - // Whether current device active use case check-in is enabled or not. - virtual bool IsEnabledCheckIn() = 0; - - // Whether current device active use case check membership is enabled or not. - virtual bool IsEnabledCheckMembership() = 0; - - // Generate status storing the last ping pacific date. - virtual private_computing::ActiveStatus GenerateActiveStatus() = 0; - - // Define churn observation use case method in parent class with default - // return value of empty string for all other use cases. - virtual std::string GetObservationPeriod(int period); - - // Method used to reset the non constant saved state of the device active use - // case. The state should be cleared after reporting device actives. - void ClearSavedState(); - - PrefService* GetLocalState() const; - - // Return the last known ping timestamp from local state pref, by use case. - // For example, the 28DA use case will return the last known timestamp - // when the device was active. - base::Time GetLastKnownPingTimestamp() const; - - // Set the last known ping timestamp in local state pref. - void SetLastKnownPingTimestamp(base::Time new_ts); - - // Return true if the |use_case_pref_key_| is not Unix Epoch (default value). - bool IsLastKnownPingTimestampSet() const; - - // Retrieve the PSM use case. - // The PSM dataset on the serverside is segmented by the PSM use case. - private_membership::rlwe::RlweUseCase GetPsmUseCase() const; - - absl::optional<std::string> GetWindowIdentifier() const; - - // Updates the window identifier, which updates the |psm_id_|, - // |psm_id_to_date_|, and |psm_ids_to_query_| fields. - bool SetWindowIdentifier(base::Time ts); - - // This method will return nullopt if this method is called before the window - // identifier was set successfully. - absl::optional<private_membership::rlwe::RlwePlaintextId> GetPsmIdentifier() - const; - - // Generate the window identifier for the use case. - // Granularity of formatted date will be based on the use case. - // - // Method is called to generate |window_id_| every time the machine - // transitions out of the idle state. When reporting the use case is - // completed for a use case, the |window_id_| is reset to absl::nullopt. - virtual std::string GenerateWindowIdentifier(base::Time ts) const; - - // Compute the psm identifiers to date pairs for the use case object. - // This is used to determine when the last sent psm id and its date is. - // Date is rounded to nearest PT midnight for simplicity. - virtual bool SavePsmIdToDateMap(base::Time ts); - - // Generates the |psm_ids_to_query_| using the |psm_id_to_date_| map. - virtual void SetPsmIdentifiersToQuery(); - - // Generates the |psm_ids_to_import_| from the ts. - virtual bool SetPsmIdentifiersToImport(base::Time ts); - - // Return vector of generated ids. - std::vector<private_membership::rlwe::RlwePlaintextId> - GetPsmIdentifiersToQuery() const; - - // Return vector of generated import data. - std::vector<FresnelImportData> GetImportData() const; - - // Return the date that the psm id represents, or empty string if it - // doesn't exist. - base::Time RetrievePsmIdDate(private_membership::rlwe::RlwePlaintextId id); - - // Calculates an HMAC of |message| using |key|, encoded as a hexadecimal - // string. Return empty string if HMAC fails. - std::string GetDigestString(const std::string& key, - const std::string& message) const; - - // Returns memory address to the |psm_rlwe_client_| unique pointer, or null if - // not set. - private_membership::rlwe::PrivateMembershipRlweClient* GetPsmRlweClient(); - - // Determine if a device ping is needed for a given device window. - // Performing this check helps reduce QPS to the |CheckingMembership| - // network requests. - bool IsDevicePingRequired(base::Time new_ping_ts) const; - - // Regenerated when the state machine enters check membership Oprf state. - // Client Generates protos used in request body of Oprf and Query requests. - void SetPsmRlweClient( - std::vector<private_membership::rlwe::RlwePlaintextId> psm_ids); - - // Format a PT adjusted base::Time object to a valid date string. - // This function removes the exact time of day when generating the date string - // by nulling out the hour, minute, second, and millisecond. - // Method is used to store and read the last ping timestamp as a string - // when interacting with preserved files over private_computingd dbus. - std::string FormatPTDateString(base::Time ts); - - // Uniquely identifies a window of time for device active counting. - // - // Generated on demand each time the |window_id_| is regenerated. - // This field is used apart of PSM Oprf, Query, and Import requests. - absl::optional<private_membership::rlwe::RlwePlaintextId> - GeneratePsmIdentifier(absl::optional<std::string> window_id) const; - - // Once the client has initiated churn_active_status object, then pass - // the reference to the churn use cases to get the churn active status. - void SetChurnActiveStatus(ChurnActiveStatus* churn_active_status); - - // Uses the churn_active_status to get the device churn active status - // metadata. - ChurnActiveStatus* GetChurnActiveStatus(); - - // Retrieve the timestamp when the device came active. - base::Time GetActiveTs() const; - - // Retrieve the ChromeOS release channel. - Channel GetChromeOSChannel() const; - - protected: - // Retrieve full hardware class from MachineStatistics. - // |DeviceActivityController| waits for object to finish loading, to avoid - // callback logic in this class. - std::string GetFullHardwareClass() const; - - // Retrieve the ChromeOS major version number. - std::string GetChromeOSVersion() const; - - // Retrieve the ChromeOS device market segment. - MarketSegment GetMarketSegment() const; - - // Retrieve |psm_device_active_secret_|. - const std::string& GetPsmDeviceActiveSecret() const; - - // Generated on demand each time the state machine leaves the idle state. - // This field is used to know which window the psm id is used for. - absl::optional<std::string> window_id_; - - // Generated on demand each time the state machine leaves the idle state. - // This field represents the single identifier that is imported for - // both fixed and n-day use cases. - absl::optional<private_membership::rlwe::RlwePlaintextId> psm_id_; - - // Generates mapping for psm_id to date mapping. - // Field acts as a cache to avoid recomputing psm id's every time we need - // to determine which window id it represents. - std::unordered_map<std::string, base::Time> psm_id_to_date_; - - // Vector of the RlwePlaintextId's to query, stored in |psm_id_to_date_|. - // This vector is directly used in the PSM query request body, if needed. - std::vector<private_membership::rlwe::RlwePlaintextId> psm_ids_to_query_; - - // Vector of new FresnelImportData, based on the last known import date.. - std::vector<FresnelImportData> new_import_data_; - - private: - // Stores the timestamp passed to |SetWindowIdentifier| method. - // In production, this represents the timestamp when the device - // first because active. - base::Time active_ts_; - - // The ChromeOS platform code will provide a derived PSM device active secret - // via callback. - // - // This secret is used to generate a PSM identifier for the reporting window. - const std::string psm_device_active_secret_; - - // Creates a copy of chrome parameters, which is owned throughout - // |DeviceActiveUseCase| object lifetime. - const ChromeDeviceMetadataParameters chrome_passed_device_params_; - - // Key used to query the local state pref for the last ping timestamp. - const std::string use_case_pref_key_; - - // The PSM dataset on the serverside is segmented by the PSM use case. - const private_membership::rlwe::RlweUseCase psm_use_case_; - - // Update last stored device active ping timestamps for PSM use cases. - // On powerwash/recovery update |local_state_| to the most recent timestamp - // |CheckMembership| was performed, as |local_state_| gets deleted. - // |local_state_| outlives the lifetime of this class. - // Used local state prefs are initialized by |DeviceActivityController|. - const raw_ptr<PrefService, ExperimentalAsh> local_state_; - - // Abstract class used to generate the |psm_rlwe_client_|. - std::unique_ptr<PsmDelegateInterface> psm_delegate_; - - // Singleton lives throughout class lifetime. - const raw_ptr<system::StatisticsProvider, ExperimentalAsh> - statistics_provider_; - - // Generated on demand each time the state machine leaves the idle state. - // Client Generates protos used in request body of Oprf and Query requests. - std::unique_ptr<private_membership::rlwe::PrivateMembershipRlweClient> - psm_rlwe_client_; - - // The churn_active_status is used for Churn Cohort and Observation use - // cases to calculate the churn active status metadata. - raw_ptr<ChurnActiveStatus, ExperimentalAsh> churn_active_status_ = nullptr; -}; - -} // namespace device_activity -} // namespace ash - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVE_USE_CASE_H_
diff --git a/chromeos/ash/components/device_activity/device_active_use_case_unittest.cc b/chromeos/ash/components/device_activity/device_active_use_case_unittest.cc deleted file mode 100644 index 8a763d4..0000000 --- a/chromeos/ash/components/device_activity/device_active_use_case_unittest.cc +++ /dev/null
@@ -1,347 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/device_active_use_case.h" - -#include "base/strings/string_util.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/daily_use_case_impl.h" -#include "chromeos/ash/components/device_activity/device_activity_controller.h" -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// This secret should be of exactly length 64, since it is a 256 bit string -// encoded as a hexadecimal. -constexpr char kFakePsmDeviceActiveSecret[] = - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -// PSM expects length of seed to be of size 32. -constexpr char kFakePsmSeed[] = "00000000000000000000000000000000"; -constexpr char kFakeEcCipherKey[] = "FAKE_EC_CIPHER_KEY"; - -} // namespace - -class DeviceActiveUseCaseTest : public testing::Test { - public: - DeviceActiveUseCaseTest() = default; - DeviceActiveUseCaseTest(const DeviceActiveUseCaseTest&) = delete; - DeviceActiveUseCaseTest& operator=(const DeviceActiveUseCaseTest&) = delete; - ~DeviceActiveUseCaseTest() override = default; - - protected: - // testing::Test: - void SetUp() override { - DeviceActivityController::RegisterPrefs(local_state_.registry()); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids; - - // Each specific use case that will be unit tested is added here. - use_cases_.push_back(std::make_unique<DailyUseCaseImpl>( - kFakePsmDeviceActiveSecret, kFakeChromeParameters, &local_state_, - // |FakePsmDelegate| can use any test case parameters. - std::make_unique<FakePsmDelegate>(kFakeEcCipherKey, kFakePsmSeed, - plaintext_ids))); - } - - void TearDown() override { use_cases_.clear(); } - - std::vector<std::unique_ptr<DeviceActiveUseCase>> use_cases_; - - // Fake pref service for unit testing the local state. - TestingPrefServiceSimple local_state_; - system::FakeStatisticsProvider statistics_provider_; -}; - -TEST_F(DeviceActiveUseCaseTest, ClearSavedState) { - // Create fixed timestamp to see if local state updates value correctly. - base::Time new_ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &new_ts)); - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->SetWindowIdentifier(new_ts)); - - EXPECT_TRUE(use_case->GetWindowIdentifier().has_value()); - EXPECT_TRUE(use_case->GetPsmIdentifier().has_value()); - EXPECT_THAT(use_case->GetPsmRlweClient(), testing::IsNull()); - - use_case->ClearSavedState(); - - EXPECT_FALSE(use_case->GetWindowIdentifier().has_value()); - EXPECT_FALSE(use_case->GetPsmIdentifier().has_value()); - EXPECT_THAT(use_case->GetPsmRlweClient(), testing::IsNull()); - } -} - -TEST_F(DeviceActiveUseCaseTest, CheckIfLastKnownPingTimestampNotSet) { - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - EXPECT_FALSE(use_case->IsLastKnownPingTimestampSet()); - } -} - -TEST_F(DeviceActiveUseCaseTest, CheckIfLastKnownPingTimestampSet) { - // Create fixed timestamp to used to update local state timestamps. - base::Time new_ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_ts)); - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - // Update local state with fixed timestamp. - use_case->SetLastKnownPingTimestamp(new_ts); - - EXPECT_EQ(use_case->GetLastKnownPingTimestamp(), new_ts); - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - } -} - -TEST_F(DeviceActiveUseCaseTest, CheckPsmIdEmptyIfWindowIdIsNotSet) { - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // |use_case| must set the window id before generating the psm - // id. - EXPECT_THAT(use_case->GetPsmIdentifier(), testing::Eq(absl::nullopt)); - } -} - -TEST_F(DeviceActiveUseCaseTest, CheckPsmIdGeneratedCorrectly) { - // Create fixed timestamp used to generate a fixed window identifier. - // The window id must be set before generating the psm id. - base::Time new_ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_ts)); - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - use_case->SetWindowIdentifier(new_ts); - - absl::optional<psm_rlwe::RlwePlaintextId> psm_id = - use_case->GetPsmIdentifier(); - - EXPECT_TRUE(psm_id.has_value()); - - // Verify the PSM value is correct for parameters supplied by the unit - // tests. - std::string unhashed_psm_id = - base::JoinString({psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase()), - use_case->GenerateWindowIdentifier(new_ts)}, - "|"); - std::string expected_psm_id_hex = - use_case->GetDigestString(kFakePsmDeviceActiveSecret, unhashed_psm_id); - EXPECT_EQ(psm_id.value().sensitive_id(), expected_psm_id_hex); - } -} - -TEST_F(DeviceActiveUseCaseTest, PingRequiredInNonOverlappingPTWindows) { - base::Time last_ts; - base::Time current_ts; - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Set the last and current timestamps depending on the use case. - switch (use_case->GetPsmUseCase()) { - case psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY: - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 00:00:00 GMT", &last_ts)); - EXPECT_TRUE( - base::Time::FromString("02 Jan 2022 00:00:00 GMT", ¤t_ts)); - - use_case->SetLastKnownPingTimestamp(last_ts); - break; - default: - NOTREACHED() << "Unsupported PSM use case"; - } - - EXPECT_TRUE(use_case->IsDevicePingRequired(current_ts)); - } -} - -TEST_F(DeviceActiveUseCaseTest, PingNotRequiredInOverlappingPTWindows) { - base::Time last_ts; - base::Time current_ts; - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Set the last and current timestamps depending on the use case. - switch (use_case->GetPsmUseCase()) { - case psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY: - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 00:00:00 GMT", &last_ts)); - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", ¤t_ts)); - - use_case->SetLastKnownPingTimestamp(last_ts); - break; - default: - NOTREACHED() << "Unsupported PSM use case"; - } - - EXPECT_FALSE(use_case->IsDevicePingRequired(current_ts)); - } -} - -TEST_F(DeviceActiveUseCaseTest, CheckPingRequiredInPTBoundaryCases) { - base::Time last_ts; - base::Time current_ts; - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Set the last and current timestamps depending on the use case. - switch (use_case->GetPsmUseCase()) { - case psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY: - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", &last_ts)); - EXPECT_TRUE( - base::Time::FromString("02 Jan 2022 00:00:00 GMT", ¤t_ts)); - - use_case->SetLastKnownPingTimestamp(last_ts); - break; - default: - NOTREACHED() << "Unsupported PSM use case"; - } - - EXPECT_TRUE(use_case->IsDevicePingRequired(current_ts)); - } -} - -TEST_F(DeviceActiveUseCaseTest, PingNotRequiredWhenLastTimeAheadOfCurrentTime) { - base::Time last_ts; - base::Time current_ts; - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Set the last and current timestamps depending on the use case. - switch (use_case->GetPsmUseCase()) { - case psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY: - EXPECT_TRUE( - base::Time::FromString("02 Jan 2022 00:00:00 GMT", &last_ts)); - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", ¤t_ts)); - - use_case->SetLastKnownPingTimestamp(last_ts); - break; - default: - NOTREACHED() << "Unsupported PSM use case"; - } - - EXPECT_FALSE(use_case->IsDevicePingRequired(current_ts)); - } -} - -TEST_F(DeviceActiveUseCaseTest, SameWindowIdGeneratesSamePsmId) { - // For simplicity, set |ts_2| as a value that is larger than the largest - // use case window. - base::Time ts; - - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &ts)); - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Generates the window identifier, psm identifier, and psm rlwe client. - use_case->SetWindowIdentifier(ts); - absl::optional<psm_rlwe::RlwePlaintextId> psm_id_1 = - use_case->GetPsmIdentifier(); - - // Resets all saved state in the use case. - // i.e the window identifier, psm identifier, and psm rlwe client will get - // reset. - use_case->ClearSavedState(); - - // Regenerate the window identifier, psm identifier and psm rlwe client - // using the same ts. - use_case->SetWindowIdentifier(ts); - absl::optional<psm_rlwe::RlwePlaintextId> psm_id_2 = - use_case->GetPsmIdentifier(); - - EXPECT_EQ(psm_id_1.value().sensitive_id(), psm_id_2.value().sensitive_id()); - } -} - -TEST_F(DeviceActiveUseCaseTest, DifferentWindowIdGeneratesDifferentPsmId) { - // For simplicity, set |ts_2| as a value that is larger than the largest - // use case window. - base::Time ts_1; - base::Time ts_2; - - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &ts_1)); - EXPECT_TRUE(base::Time::FromString("01 Jan 2023 00:00:00 GMT", &ts_2)); - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - use_case->SetWindowIdentifier(ts_1); - absl::optional<psm_rlwe::RlwePlaintextId> psm_id_1 = - use_case->GetPsmIdentifier(); - - use_case->SetWindowIdentifier(ts_2); - absl::optional<psm_rlwe::RlwePlaintextId> psm_id_2 = - use_case->GetPsmIdentifier(); - - EXPECT_NE(psm_id_1.value().sensitive_id(), psm_id_2.value().sensitive_id()); - } -} - -TEST_F(DeviceActiveUseCaseTest, WindowIdsDependOnTimestamp) { - base::Time ts_1; - EXPECT_TRUE(base::Time::FromString("01 Jan 2023 00:00:00 GMT", &ts_1)); - - for (auto& use_case : use_cases_) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_NE(use_case->GenerateWindowIdentifier(base::Time::UnixEpoch()), - use_case->GenerateWindowIdentifier(ts_1)); - } -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_activity_client.cc b/chromeos/ash/components/device_activity/device_activity_client.cc deleted file mode 100644 index 570bae6..0000000 --- a/chromeos/ash/components/device_activity/device_activity_client.cc +++ /dev/null
@@ -1,1509 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/device_activity_client.h" - -#include "ash/constants/ash_features.h" -#include "base/check.h" -#include "base/debug/alias.h" -#include "base/debug/dump_without_crashing.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -// TODO(https://crbug.com/1269900): Migrate to use SFUL library. -#include "base/metrics/histogram_functions.h" -#include "base/strings/strcat.h" -#include "base/time/time.h" -#include "chromeos/ash/components/dbus/system_clock/system_clock_sync_observation.h" -#include "chromeos/ash/components/network/network_state.h" -#include "chromeos/ash/components/network/network_state_handler.h" -#include "components/prefs/pref_service.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" -#include "third_party/icu/source/i18n/unicode/gregocal.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Amount of time to wait before retriggering repeating timer. -constexpr base::TimeDelta kTimeToRepeat = base::Hours(1); - -// Milliseconds per minute. -constexpr int kMillisecondsPerMinute = 60000; - -// General upper bound of expected Fresnel response size in bytes. -constexpr size_t kMaxFresnelResponseSizeBytes = 5 << 20; // 5MB; - -// Maximum time to wait for time sync before not reporting device as active -// in current attempt. -// This corresponds to at least seven TCP retransmissions attempts to -// the remote server used to update the system clock. -constexpr base::TimeDelta kSystemClockSyncWaitTimeout = base::Seconds(45); - -// Timeout for each Fresnel request. -constexpr base::TimeDelta kHealthCheckRequestTimeout = base::Seconds(10); -constexpr base::TimeDelta kImportRequestTimeout = base::Seconds(15); -constexpr base::TimeDelta kOprfRequestTimeout = base::Seconds(15); -constexpr base::TimeDelta kQueryRequestTimeout = base::Seconds(65); - -// TODO(https://crbug.com/1272922): Move shared configuration constants to -// separate file. -const char kFresnelHealthCheckEndpoint[] = "/v1/fresnel/healthCheck"; -const char kFresnelImportRequestEndpoint[] = "/v1/fresnel/psmRlweImport"; -const char kFresnelOprfRequestEndpoint[] = "/v1/fresnel/psmRlweOprf"; -const char kFresnelQueryRequestEndpoint[] = "/v1/fresnel/psmRlweQuery"; - -// UMA histograms defined in: -// //tools/metrics/histograms/metadata/ash/histograms.xml. -// -// Count number of times a state has been entered. -const char kHistogramStateCount[] = "Ash.DeviceActiveClient.StateCount"; - -// Record the preserved file state. -const char kHistogramsPreservedFileState[] = - "Ash.DeviceActiveClient.PreservedFileState"; - -// Record the Check Membership process cases. -const char kCheckMembershipProcessCase[] = - "Ash.DeviceActiveClient.CheckMembershipCases"; - -// Duration histogram uses State variant in order to create -// unique histograms measuring durations by State. -const char kHistogramDurationPrefix[] = "Ash.DeviceActiveClient.Duration"; - -// Response histogram uses State variant in order to create -// unique histograms measuring responses by State. -const char kHistogramResponsePrefix[] = "Ash.DeviceActiveClient.Response"; - -// Count the number of boolean membership request results. -const char kDeviceActiveClientQueryMembershipResult[] = - "Ash.DeviceActiveClient.QueryMembershipResult"; - -// Record number of successful saves of the preserved file content. -const char kDeviceActiveClientSavePreservedFileSuccess[] = - "Ash.DeviceActiveClient.SavePreservedFileSuccess"; - -// Record the minute the device activity client transitions out of idle. -const char kDeviceActiveClientTransitionOutOfIdleMinute[] = - "Ash.DeviceActiveClient.RecordedTransitionOutOfIdleMinute"; - -// Record the minute the device activity client transitions to check in. -const char kDeviceActiveClientTransitionToCheckInMinute[] = - "Ash.DeviceActiveClient.RecordedTransitionToCheckInMinute"; - -// Record the NetError status integer returned by the OPRF network response. -const char kDeviceActiveClientPsmOprfResponseNetErrorCode[] = - "Ash.DeviceActiveClient.PsmOprfResponseNetErrorCode"; - -// Record a boolean success if the PSM Oprf response body exists. -const char kDeviceActiveClientIsPsmOprfResponseBodySet[] = - "Ash.DeviceActiveClient.IsPsmOprfResponseBodySet"; - -// Record a boolean success if the PSM Oprf response body was parsed correctly -// to the FresnelPsmRlweOprfResponse proto object. -const char kDeviceActiveClientIsPsmOprfResponseParsedCorrectly[] = - "Ash.DeviceActiveClient.IsPsmOprfResponseParsedCorrectly"; - -// Record the NetError status integer returned by the Query network response. -const char kDeviceActiveClientPsmQueryResponseNetErrorCode[] = - "Ash.DeviceActiveClient.PsmQueryResponseNetErrorCode"; - -// Record a boolean success if the PSM Query response body exists. -const char kDeviceActiveClientIsPsmQueryResponseBodySet[] = - "Ash.DeviceActiveClient.IsPsmQueryResponseBodySet"; - -// Record a boolean success if the PSM Query response body was parsed correctly -// to the FresnelPsmRlweQueryResponse proto object. -const char kDeviceActiveClientIsPsmQueryResponseParsedCorrectly[] = - "Ash.DeviceActiveClient.IsPsmQueryResponseParsedCorrectly"; - -// Traffic annotation for check device activity status -const net::NetworkTrafficAnnotationTag check_membership_traffic_annotation = - net::DefineNetworkTrafficAnnotation( - "device_activity_client_check_membership", - R"( - semantics { - sender: "Device Activity" - description: - "Check the status of the Chrome OS devices in a private " - "set, through Private Set Membership (PSM) services." - trigger: "Chrome OS client makes this network request and records " - "the device activity when the default network changes" - data: "Google API Key." - destination: GOOGLE_OWNED_SERVICE - } - policy { - cookies_allowed: NO - setting: "This feature cannot be disabled in settings." - policy_exception_justification: "Not implemented." - })"); - -// Returns the total offset between Pacific Time (PT) and GMT. -// Parameter ts is expected to be GMT/UTC. -// TODO(hirthanan): Create utils library for commonly used methods. -base::Time ConvertToPT(base::Time ts) { - // America/Los_Angleles is PT. - std::unique_ptr<icu::TimeZone> time_zone( - icu::TimeZone::createTimeZone("America/Los_Angeles")); - if (*time_zone == icu::TimeZone::getUnknown()) { - LOG(ERROR) << "Failed to get America/Los_Angeles timezone. " - << "Returning UTC-8 timezone as default."; - return ts - base::Hours(8); - } - - // Calculate timedelta between PT and GMT. This method does not take day light - // savings (DST) into account. - const base::TimeDelta raw_time_diff = - base::Minutes(time_zone->getRawOffset() / kMillisecondsPerMinute); - - UErrorCode status = U_ZERO_ERROR; - auto gregorian_calendar = - std::make_unique<icu::GregorianCalendar>(*time_zone, status); - - // Calculates the time difference adjust by the possible daylight savings - // offset. If the status of any step fails, returns the default time - // difference without considering daylight savings. - if (!gregorian_calendar) { - return ts + raw_time_diff; - } - - // Convert ts object to UDate. - UDate current_date = - static_cast<UDate>(ts.ToDoubleT() * base::Time::kMillisecondsPerSecond); - status = U_ZERO_ERROR; - gregorian_calendar->setTime(current_date, status); - if (U_FAILURE(status)) { - return ts + raw_time_diff; - } - - status = U_ZERO_ERROR; - UBool day_light = gregorian_calendar->inDaylightTime(status); - if (U_FAILURE(status)) { - return ts + raw_time_diff; - } - - // Calculate timedelta between PT and GMT, taking DST into account for an - // accurate PT. - int gmt_offset = time_zone->getRawOffset(); - if (day_light) { - gmt_offset += time_zone->getDSTSavings(); - } - - return ts + base::Minutes(gmt_offset / kMillisecondsPerMinute); -} - -base::Time GetNextMonth(base::Time ts) { - base::Time::Exploded exploded; - ts.UTCExplode(&exploded); - - // Set new time to the first midnight of the next month. - // "+ 11) % 12) + 1" wraps the month around if it goes outside 1..12. - exploded.month = (((exploded.month + 1) + 11) % 12) + 1; - exploded.year += (exploded.month == 1); - exploded.day_of_month = 1; - exploded.hour = exploded.minute = exploded.second = exploded.millisecond = 0; - - base::Time new_month_ts; - return base::Time::FromUTCExploded(exploded, &new_month_ts) ? new_month_ts - : base::Time(); -} - -// Generates the full histogram name for histogram variants based on state. -std::string HistogramVariantName(const std::string& histogram_prefix, - DeviceActivityClient::State state) { - switch (state) { - case DeviceActivityClient::State::kIdle: - return base::StrCat({histogram_prefix, ".Idle"}); - case DeviceActivityClient::State::kCheckingMembershipOprf: - return base::StrCat({histogram_prefix, ".CheckingMembershipOprf"}); - case DeviceActivityClient::State::kCheckingMembershipQuery: - return base::StrCat({histogram_prefix, ".CheckingMembershipQuery"}); - case DeviceActivityClient::State::kCheckingIn: - return base::StrCat({histogram_prefix, ".CheckingIn"}); - case DeviceActivityClient::State::kHealthCheck: - return base::StrCat({histogram_prefix, ".HealthCheck"}); - default: - NOTREACHED() << "Invalid State."; - return base::StrCat({histogram_prefix, ".Unknown"}); - } -} - -void RecordStateCountMetric(DeviceActivityClient::State state) { - base::UmaHistogramEnumeration(kHistogramStateCount, state); -} - -void RecordQueryMembershipResultBoolean(bool is_member) { - base::UmaHistogramBoolean(kDeviceActiveClientQueryMembershipResult, - is_member); -} - -void RecordSavePreservedFile(bool success) { - base::UmaHistogramBoolean(kDeviceActiveClientSavePreservedFileSuccess, - success); -} - -// Return the minute of the current PT time. -int GetCurrentMinute() { - base::Time cur_time = ConvertToPT(base::Time::Now()); - - // Extract minute from exploded |cur_time|. - base::Time::Exploded exploded_utc; - cur_time.UTCExplode(&exploded_utc); - - return exploded_utc.minute; -} - -void RecordTransitionOutOfIdleMinute() { - base::UmaHistogramCustomCounts(kDeviceActiveClientTransitionOutOfIdleMinute, - GetCurrentMinute(), 0, 59, - 60 /* number of histogram buckets */); -} - -void RecordTransitionToCheckInMinute() { - base::UmaHistogramCustomCounts(kDeviceActiveClientTransitionToCheckInMinute, - GetCurrentMinute(), 0, 59, - 60 /* number of histogram buckets */); -} - -// Histogram sliced by duration and state. -void RecordDurationStateMetric(DeviceActivityClient::State state, - const base::TimeDelta duration) { - std::string duration_state_histogram_name = - HistogramVariantName(kHistogramDurationPrefix, state); - base::UmaHistogramCustomTimes(duration_state_histogram_name, duration, - base::Milliseconds(1), base::Seconds(100), - 100 /* number of histogram buckets */); -} - -// Histogram slices by PSM response and state. -void RecordResponseStateMetric(DeviceActivityClient::State state, - int net_code) { - // Mapping status code to PsmResponse is used to record UMA histograms - // for responses by state. - DeviceActivityClient::PsmResponse response; - switch (net_code) { - case net::OK: - response = DeviceActivityClient::PsmResponse::kSuccess; - break; - case net::ERR_TIMED_OUT: - response = DeviceActivityClient::PsmResponse::kTimeout; - break; - default: - response = DeviceActivityClient::PsmResponse::kError; - break; - } - - base::UmaHistogramEnumeration( - HistogramVariantName(kHistogramResponsePrefix, state), response); -} - -// Histogram to record number of each PreservedFileState. -void RecordPreservedFileState( - DeviceActivityClient::PreservedFileState preserved_file_state) { - base::UmaHistogramEnumeration(kHistogramsPreservedFileState, - preserved_file_state); -} - -// Histogram to record number of different failed/success cases for check -// membership process. -void RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases check_membership_case) { - base::UmaHistogramEnumeration(kCheckMembershipProcessCase, - check_membership_case); -} - -// Histogram to record the NetError code returned apart of the PSM Oprf -// Response. -void RecordPsmOprfResponseNetErrorCode(int net_error) { - base::UmaHistogramSparse(kDeviceActiveClientPsmOprfResponseNetErrorCode, - net_error); -} - -// Histogram to record whether the PSM Oprf response body is set. -void RecordIsPsmOprfResponseBodySet(bool is_set) { - base::UmaHistogramBoolean(kDeviceActiveClientIsPsmOprfResponseBodySet, - is_set); -} - -// Histogram to record whether the PSM Oprf response was able to be parsed -// correctly. -void RecordIsPsmOprfResponseParsedCorrectly(bool is_parsed_correctly) { - base::UmaHistogramBoolean(kDeviceActiveClientIsPsmOprfResponseParsedCorrectly, - is_parsed_correctly); -} - -// Histogram to record the NetError code returned apart of the PSM Query -// Response. -void RecordPsmQueryResponseNetErrorCode(int net_error) { - base::UmaHistogramSparse(kDeviceActiveClientPsmQueryResponseNetErrorCode, - net_error); -} - -// Histogram to record whether the PSM Query response body is set. -void RecordIsPsmQueryResponseBodySet(bool is_set) { - base::UmaHistogramBoolean(kDeviceActiveClientIsPsmQueryResponseBodySet, - is_set); -} - -// Histogram to record whether the PSM Query response was able to be parsed -// correctly. -void RecordIsPsmQueryResponseParsedCorrectly(bool is_parsed_correctly) { - base::UmaHistogramBoolean( - kDeviceActiveClientIsPsmQueryResponseParsedCorrectly, - is_parsed_correctly); -} - -std::unique_ptr<network::ResourceRequest> GenerateResourceRequest( - const std::string& request_method, - const GURL& url, - const std::string& api_key) { - auto resource_request = std::make_unique<network::ResourceRequest>(); - resource_request->url = url; - resource_request->method = request_method; - resource_request->headers.SetHeader("x-goog-api-key", api_key); - resource_request->headers.SetHeader(net::HttpRequestHeaders::kContentType, - "application/x-protobuf"); - - return resource_request; -} - -} // namespace - -// static -void DeviceActivityClient::RecordDeviceActivityMethodCalled( - DeviceActivityMethod method_name) { - // Record the device activity method calls. - const char kDeviceActivityMethodCalled[] = "Ash.DeviceActivity.MethodCalled"; - - base::UmaHistogramEnumeration(kDeviceActivityMethodCalled, method_name); -} - -DeviceActivityClient::DeviceActivityClient( - ChurnActiveStatus* churn_active_status_ptr, - PrefService* local_state, - NetworkStateHandler* handler, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - std::unique_ptr<base::RepeatingTimer> report_timer, - const std::string& fresnel_base_url, - const std::string& api_key, - base::Time chrome_first_run_time, - std::vector<std::unique_ptr<DeviceActiveUseCase>> use_cases) - : churn_active_status_ptr_(churn_active_status_ptr), - local_state_(local_state), - network_state_handler_(handler), - url_loader_factory_(url_loader_factory), - report_timer_(std::move(report_timer)), - fresnel_base_url_(fresnel_base_url), - api_key_(api_key), - chrome_first_run_time_(chrome_first_run_time), - use_cases_(std::move(use_cases)) { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientConstructor); - - DCHECK(network_state_handler_); - DCHECK(url_loader_factory_); - DCHECK(report_timer_); - DCHECK(!use_cases_.empty()); - - report_timer_->Start(FROM_HERE, kTimeToRepeat, this, - &DeviceActivityClient::ReportingTriggeredByTimer); - - network_state_handler_observer_.Observe(network_state_handler_.get()); - - // Send DBus method to read preserved files for last ping timestamps. - GetLastPingDatesStatus(); -} - -DeviceActivityClient::~DeviceActivityClient() { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientDestructor); -} - -base::RepeatingTimer* DeviceActivityClient::GetReportTimer() { - return report_timer_.get(); -} - -// Method gets called when the state of the default (primary) -// network OR properties of the default network changes. -void DeviceActivityClient::DefaultNetworkChanged(const NetworkState* network) { - bool was_connected = network_connected_; - network_connected_ = network && network->IsOnline(); - - if (network_connected_ == was_connected) - return; - - if (network_connected_) - OnNetworkOnline(); - else - OnNetworkOffline(); -} - -void DeviceActivityClient::OnShuttingDown() { - network_state_handler_observer_.Reset(); -} - -DeviceActivityClient::State DeviceActivityClient::GetState() const { - return state_; -} - -std::vector<DeviceActiveUseCase*> DeviceActivityClient::GetUseCases() const { - std::vector<DeviceActiveUseCase*> use_cases_ptr; - - for (auto& use_case : use_cases_) { - use_cases_ptr.push_back(use_case.get()); - } - return use_cases_ptr; -} - -DeviceActiveUseCase* DeviceActivityClient::GetUseCasePtr( - psm_rlwe::RlweUseCase psm_use_case) const { - for (auto* use_case : GetUseCases()) { - if (use_case->GetPsmUseCase() == psm_use_case) { - return use_case; - } - } - - VLOG(1) << "Use Case is not supported yet."; - return nullptr; -} - -void DeviceActivityClient::UpdateChurnLocalStateAfterCheckIn( - DeviceActiveUseCase* current_use_case) { - if (current_use_case->GetPsmUseCase() == - private_membership::rlwe::RlweUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - base::Time prev_active_month = - churn_active_status_ptr_->GetCurrentActiveMonth(); - - // Update the active value based on the new ping timestamp. - // This will also require updating the booleans in local state that store - // whether a device has pinged in the past 3 months relative to the current - // month. - churn_active_status_ptr_->UpdateValue(last_transition_out_of_idle_time_); - base::Time new_active_month = - churn_active_status_ptr_->GetCurrentActiveMonth(); - int new_active_value = churn_active_status_ptr_->GetValueAsInt(); - - // No updates were made to the churn active status. - if (prev_active_month == new_active_month) { - return; - } - - // Read the current relative observation period reported status. - bool is_active_current_period_minus_0 = local_state_->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0); - bool is_active_current_period_minus_1 = local_state_->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1); - bool is_active_current_period_minus_2 = local_state_->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2); - - // Determine how many months have passed between new_active_value and - // prev_active_value. This will tell us how many months the relative - // observation status should shift by in the local state. - for (int i = 0; i < 3; i++) { - if (prev_active_month == new_active_month) { - break; - } - - // Shift relative observation windows reported status by 1. - // This is for the cohort use case, which happens before the observation - // use case. This means that after a successful churn cohort ping in a - // new month, the device may have false observation report statuses. - is_active_current_period_minus_2 = is_active_current_period_minus_1; - is_active_current_period_minus_1 = is_active_current_period_minus_0; - is_active_current_period_minus_0 = false; - - prev_active_month = GetNextMonth(prev_active_month); - } - - // Update the local state values after determining all other values. - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, - is_active_current_period_minus_0); - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, - is_active_current_period_minus_1); - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, - is_active_current_period_minus_2); - local_state_->SetInteger(prefs::kDeviceActiveLastKnownChurnActiveStatus, - new_active_value); - } - - // Update the relative local state observation period boolean if the - // observation use case had set a value for the observation period. - if (current_use_case->GetPsmUseCase() == - private_membership::rlwe::RlweUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - if (!current_use_case->GetObservationPeriod(0).empty()) { - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, true); - } - - if (!current_use_case->GetObservationPeriod(1).empty()) { - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true); - } - - if (!current_use_case->GetObservationPeriod(2).empty()) { - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, true); - } - } -} - -void DeviceActivityClient::ReadChurnPreservedFile( - const private_computing::ActiveStatus& status) { - private_computing::PrivateComputingUseCase use_case = status.use_case(); - - if (use_case == private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - int churn_status_value = 0; - if (status.has_churn_active_status()) { - churn_status_value = status.churn_active_status(); - } - if (local_state_->GetInteger( - prefs::kDeviceActiveLastKnownChurnActiveStatus) == 0 && - churn_status_value != 0) { - churn_active_status_ptr_->SetValue(churn_status_value); - local_state_->SetInteger(prefs::kDeviceActiveLastKnownChurnActiveStatus, - churn_status_value); - } - } - - if (use_case == private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - bool is_active_current_period_minus_0 = false; - bool is_active_current_period_minus_1 = false; - bool is_active_current_period_minus_2 = false; - - // Get preserved file period status values. - if (status.has_period_status()) { - private_computing::ChurnObservationStatus period_status = - status.period_status(); - is_active_current_period_minus_0 = - period_status.is_active_current_period_minus_0(); - is_active_current_period_minus_1 = - period_status.is_active_current_period_minus_1(); - is_active_current_period_minus_2 = - period_status.is_active_current_period_minus_2(); - } - - // Try to update the local state using the preserved file values. - // The preserved file may update the period status to true if the device - // sent the observation window previously and then was powerwashed. - // The local state will not currently be updated on recovery since that data - // needs to be recovered using check membership requests in the future. - if (!local_state_->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)) { - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, - is_active_current_period_minus_0); - } - if (!local_state_->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)) { - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, - is_active_current_period_minus_1); - } - if (!local_state_->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)) { - local_state_->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, - is_active_current_period_minus_2); - } - - // Update churn observation last ping timestamp in local state based on - // active status value. The cohort use case is recovered before the - // observation use case, so we use the latest active status value. - local_state_->SetTime( - prefs::kDeviceActiveChurnObservationMonthlyPingTimestamp, - churn_active_status_ptr_->GetCurrentActiveMonth()); - } -} - -private_computing::SaveStatusRequest -DeviceActivityClient::GetSaveStatusRequest() { - // private_computing: - private_computing::SaveStatusRequest request; - - for (auto* use_case : GetUseCases()) { - private_computing::ActiveStatus status = use_case->GenerateActiveStatus(); - if (status.has_use_case()) { - *request.add_active_status() = status; - } - } - - return request; -} - -void DeviceActivityClient::SaveLastPingDatesStatus() { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientSaveLastPingDatesStatus); - private_computing::SaveStatusRequest request = GetSaveStatusRequest(); - - // Call DBus method with callback to |OnSaveLastPingDatesStatusComplete|. - PrivateComputingClient::Get()->SaveLastPingDatesStatus( - request, - base::BindOnce(&DeviceActivityClient::OnSaveLastPingDatesStatusComplete, - weak_factory_.GetWeakPtr())); -} - -void DeviceActivityClient::OnSaveLastPingDatesStatusComplete( - private_computing::SaveStatusResponse response) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSaveLastPingDatesStatusComplete); - if (response.has_error_message()) { - LOG(ERROR) << "Failed to store last ping timestamps with error message: " - << response.error_message(); - RecordSavePreservedFile(false); - } else { - VLOG(1) << "Successfully stored last ping timestamp to preserved file"; - RecordSavePreservedFile(true); - } -} - -void DeviceActivityClient::GetLastPingDatesStatus() { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientGetLastPingDatesStatus); - PrivateComputingClient::Get()->GetLastPingDatesStatus( - base::BindOnce(&DeviceActivityClient::OnGetLastPingDatesStatusFetched, - weak_factory_.GetWeakPtr())); -} - -void DeviceActivityClient::OnGetLastPingDatesStatusFetched( - private_computing::GetStatusResponse response) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnGetLastPingDatesStatusFetched); - // Update the last ping timestamps if the preserved file has a valid - // timestamp value for the use case. - if (!response.has_error_message()) { - VLOG(1) << "Successfully read PSM file."; - // 1. Iterate FileContent for the active_statuses and update use case - // timestamps. - for (auto& status : response.active_status()) { - // One of last_ping_date and period_status is set in ActiveStatus proto. - base::Time last_ping_time; - if (status.has_last_ping_date()) { - std::string last_ping_pt_date = status.last_ping_date(); - - bool success = base::Time::FromUTCString(last_ping_pt_date.c_str(), - &last_ping_time); - - if (!success) { - continue; - } - } - - // TODO(hirthanan): Get/Set period status for churn observation status in - // future CL. - private_computing::ChurnObservationStatus period_status; - if (status.has_period_status()) { - period_status = status.period_status(); - } - - DeviceActiveUseCase* device_active_use_case_ptr; - - private_computing::PrivateComputingUseCase use_case = status.use_case(); - switch (use_case) { - case private_computing::PrivateComputingUseCase::CROS_FRESNEL_DAILY: - device_active_use_case_ptr = - GetUseCasePtr(psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY); - break; - case private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_28DAY_ACTIVE: - device_active_use_case_ptr = - GetUseCasePtr(psm_rlwe::RlweUseCase::CROS_FRESNEL_28DAY_ACTIVE); - break; - case private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_COHORT: - device_active_use_case_ptr = GetUseCasePtr( - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT); - break; - case private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION: - device_active_use_case_ptr = GetUseCasePtr( - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION); - break; - default: - LOG(ERROR) << "PSM use case is not supported yet."; - continue; - } - - // Crashes may occur due to device_active_use_case_ptr not being defined - // at this point. - if (device_active_use_case_ptr == nullptr) { - LOG(ERROR) << "Device active use case is not defined."; - return; - } - - // Recover the churn active value and ChurnActiveStatus - // if set in preserved file but not in local state. - ReadChurnPreservedFile(status); - - if (!device_active_use_case_ptr->IsLastKnownPingTimestampSet()) { - if (use_case == - private_computing::PrivateComputingUseCase::CROS_FRESNEL_DAILY) { - // Only record the successfully read from preserved file for daily use - // case. - RecordPreservedFileState( - DeviceActivityClient::PreservedFileState::kReadOkLocalStateEmpty); - } - VLOG(1) << "Updating local pref timestamp value with file timestamp = " - << last_ping_time; - device_active_use_case_ptr->SetLastKnownPingTimestamp(last_ping_time); - } else { - if (use_case == - private_computing::PrivateComputingUseCase::CROS_FRESNEL_DAILY) { - // Only record the successfully read from preserved file for daily use - // case. - RecordPreservedFileState( - DeviceActivityClient::PreservedFileState::kReadOkLocalStateSet); - } - VLOG(1) << "Preserved File was read successfully but local state is " - "already set. " - << "Device was most likely restarted and not powerwashed, so " - "no need to update local state."; - } - } - } else { - base::Time current_time = base::Time::Now(); - // If the device is not a new device and the local pref is empty, then - // record the error count in uma histogram. - if ((current_time - chrome_first_run_time_) > base::Days(1)) { - DeviceActiveUseCase* device_active_use_case_ptr = - GetUseCasePtr(psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY); - if (!device_active_use_case_ptr->IsLastKnownPingTimestampSet()) { - // Local pref is empty. To avoid when the chrome signout or reboot - // to record unnecessary uma hisgtogram. - RecordPreservedFileState( - DeviceActivityClient::PreservedFileState::kReadFail); - LOG(ERROR) - << "Preserved File read has failed. State of local states is " - "not checked. " - << "Error from DBus: " << response.error_message(); - } - } - } - - // Always trigger step to check for network status changing after reading the - // preserved file. - DefaultNetworkChanged(network_state_handler_->DefaultNetwork()); -} - -void DeviceActivityClient::ReportingTriggeredByTimer() { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportingTriggeredByTimer); - - // Terminate if the state of the client while reporting device actives is not - // what is expected. This may occur if the client is in the middle of - // reporting actives or is disconnected from the network. - if (!network_connected_ || state_ != State::kIdle || - !pending_use_cases_.empty()) { - TransitionToIdle(nullptr); - return; - } - - OnNetworkOnline(); -} - -void DeviceActivityClient::OnNetworkOnline() { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnNetworkOnline); - - // Asynchronously wait for the system clock to synchronize on network - // connection. - system_clock_sync_observation_ = - SystemClockSyncObservation::WaitForSystemClockSync( - SystemClockClient::Get(), kSystemClockSyncWaitTimeout, - base::BindOnce(&DeviceActivityClient::OnSystemClockSyncResult, - weak_factory_.GetWeakPtr())); -} - -void DeviceActivityClient::OnSystemClockSyncResult( - bool system_clock_synchronized) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSystemClockSyncResult); - - if (system_clock_synchronized) - ReportUseCases(); - else - TransitionToIdle(nullptr); -} - -void DeviceActivityClient::OnNetworkOffline() { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnNetworkOffline); - CancelUseCases(); -} - -GURL DeviceActivityClient::GetFresnelURL() const { - GURL base_url(fresnel_base_url_); - GURL::Replacements replacements; - - switch (state_) { - case State::kCheckingMembershipOprf: - replacements.SetPathStr(kFresnelOprfRequestEndpoint); - break; - case State::kCheckingMembershipQuery: - replacements.SetPathStr(kFresnelQueryRequestEndpoint); - break; - case State::kCheckingIn: - replacements.SetPathStr(kFresnelImportRequestEndpoint); - break; - case State::kHealthCheck: - replacements.SetPathStr(kFresnelHealthCheckEndpoint); - break; - case State::kIdle: // Fallthrough to |kUnknown| case. - [[fallthrough]]; - case State::kUnknown: - NOTREACHED(); - break; - } - - return base_url.ReplaceComponents(replacements); -} - -// TODO(https://crbug.com/1262189): Add callback to report actives only after -// synchronizing the system clock. -void DeviceActivityClient::ReportUseCases() { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportUseCases); - - DCHECK(!use_cases_.empty()); - - if (!network_connected_ || state_ != State::kIdle) { - TransitionToIdle(nullptr); - return; - } - - // Adjust UTC time object to represent PT for entire device activity client. - last_transition_out_of_idle_time_ = ConvertToPT(base::Time::Now()); - - for (auto& use_case : use_cases_) { - // Ownership of the use cases will be maintained by the |use_cases_| vector. - pending_use_cases_.push(use_case.get()); - } - - // Pop from |pending_use_cases_| queue in |TransitionToIdle|, after the - // use case has tried to be reported. - TransitionOutOfIdle(pending_use_cases_.front()); -} - -void DeviceActivityClient::CancelUseCases() { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientCancelUseCases); - - // Use RAII to reset |url_loader_| after current function scope. - // Delete |url_loader_| before the callback is invoked cancels the sent out - // request. - // No callback will be invoked in the case a network request is sent, - // and the device internet disconnects. - auto url_loader = std::move(url_loader_); - - // Use RAII to clear the queue. - std::queue<DeviceActiveUseCase*> pending_use_cases; - std::swap(pending_use_cases_, pending_use_cases); - - for (auto* use_case : GetUseCases()) { - use_case->ClearSavedState(); - } - - TransitionToIdle(nullptr); -} - -void DeviceActivityClient::TransitionOutOfIdle( - DeviceActiveUseCase* current_use_case) { - RecordTransitionOutOfIdleMinute(); - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientTransitionOutOfIdle); - - DCHECK(current_use_case); - - // Begin phase one of checking membership if the device has not pinged yet - // within the given use case window. - // TODO(https://crbug.com/1262187): Remove hardcoded use case when adding - // support for additional use cases. - if (current_use_case->IsDevicePingRequired( - last_transition_out_of_idle_time_)) { - bool success = current_use_case->SetWindowIdentifier( - last_transition_out_of_idle_time_); - - if (!success) { - TransitionToIdle(current_use_case); - return; - } - - // Check membership continues when the cached local state pref - // is not set. The local state pref may not be set if the device is - // new, powerwashed, recovered, RMA, or the local state was corrupted. - if (current_use_case->IsEnabledCheckMembership() && - !current_use_case->IsLastKnownPingTimestampSet()) { - TransitionToCheckMembershipOprf(current_use_case); - return; - } - - // |TransitionToCheckIn| if the local state pref is set. - // During rollout, we perform CheckIn without CheckMembership for - // powerwash, recovery, or RMA devices. - if (current_use_case->IsEnabledCheckIn()) { - TransitionToCheckIn(current_use_case); - return; - } - } - - TransitionToIdle(current_use_case); -} - -void DeviceActivityClient::TransitionToHealthCheck() { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientTransitionToHealthCheck); - - DCHECK_EQ(state_, State::kIdle); - DCHECK(!url_loader_); - - const net::NetworkTrafficAnnotationTag traffic_annotation = - net::DefineNetworkTrafficAnnotation("device_activity_client_health_check", - R"( - semantics { - sender: "Device Activity Health Check" - description: - "Send Health Check network request of Chrome OS device. " - "Provide a health check service for client. " - "The health check will include cpu utilization, " - "memory usage and disk space. " - "The server will return health status of the service immediately. " - "The health status will include if the device is actively running " - "or the device is not successfully sending heartbeats to servers " - "or the device is not eligible for health monitoring. " - trigger: "This request is deprecated, and never happens." - data: "Google API Key." - destination: GOOGLE_OWNED_SERVICE - } - policy { - cookies_allowed: NO - setting: "This feature cannot be disabled in settings." - policy_exception_justification: "Not implemented." - })"); - - state_timer_ = base::ElapsedTimer(); - - // |state_| must be set correctly in order to generate correct URL. - state_ = State::kHealthCheck; - - // Report UMA histogram for transitioning state to |kHealthCheck|. - RecordStateCountMetric(state_); - - auto resource_request = GenerateResourceRequest( - net::HttpRequestHeaders::kGetMethod, GetFresnelURL(), api_key_); - - // TODO(https://crbug.com/1266972): Refactor |url_loader_| network request - // call to a shared helper method. - url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request), - traffic_annotation); - - url_loader_->SetTimeoutDuration(kHealthCheckRequestTimeout); - url_loader_->DownloadToString( - url_loader_factory_.get(), - base::BindOnce(&DeviceActivityClient::OnHealthCheckDone, - weak_factory_.GetWeakPtr()), - kMaxFresnelResponseSizeBytes); -} - -void DeviceActivityClient::OnHealthCheckDone( - std::unique_ptr<std::string> response_body) { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnHealthCheckDone); - - DCHECK_EQ(state_, State::kHealthCheck); - - // Use RAII to reset |url_loader_| after current function scope. - // Resetting |url_loader_| also invalidates the |response_info| variable. - auto url_loader = std::move(url_loader_); - - int net_code = url_loader->NetError(); - RecordResponseStateMetric(state_, net_code); - - // Record duration of |kHealthCheck| state. - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - - // Transition back to kIdle state after performing a health check on servers. - TransitionToIdle(nullptr); -} - -void DeviceActivityClient::TransitionToCheckMembershipOprf( - DeviceActiveUseCase* current_use_case) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientTransitionToCheckMembershipOprf); - - DCHECK_EQ(state_, State::kIdle); - DCHECK(!url_loader_); - - state_timer_ = base::ElapsedTimer(); - - // |state_| must be set correctly in order to generate correct URL. - state_ = State::kCheckingMembershipOprf; - - // Report UMA histogram for transitioning state to |kCheckingMembershipOprf|. - RecordStateCountMetric(state_); - - std::vector<psm_rlwe::RlwePlaintextId> psm_ids = - current_use_case->GetPsmIdentifiersToQuery(); - - // Initializes the PSM rlwe client with the appropriate psm id values that we - // want to check membership for. This varies by fixed and n-day use cases. - current_use_case->SetPsmRlweClient(psm_ids); - - // Generate PSM Oprf request body. - const auto status_or_oprf_request = - current_use_case->GetPsmRlweClient()->CreateOprfRequest(); - if (!status_or_oprf_request.ok()) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kOprfResponseBodyFailed); - TransitionToIdle(current_use_case); - return; - } - - psm_rlwe::PrivateMembershipRlweOprfRequest oprf_request = - status_or_oprf_request.value(); - - // Wrap PSM Oprf request body by FresnelPsmRlweOprfRequest proto. - // This proto is expected by the Fresnel service. - device_activity::FresnelPsmRlweOprfRequest fresnel_oprf_request; - *fresnel_oprf_request.mutable_rlwe_oprf_request() = oprf_request; - - std::string request_body; - fresnel_oprf_request.SerializeToString(&request_body); - - auto resource_request = GenerateResourceRequest( - net::HttpRequestHeaders::kPostMethod, GetFresnelURL(), api_key_); - - // TODO(https://crbug.com/1266972): Refactor |url_loader_| network request - // call to a shared helper method. - url_loader_ = network ::SimpleURLLoader ::Create( - std::move(resource_request), check_membership_traffic_annotation); - url_loader_->AttachStringForUpload(request_body, "application/x-protobuf"); - url_loader_->SetTimeoutDuration(kOprfRequestTimeout); - url_loader_->DownloadToString( - url_loader_factory_.get(), - base::BindOnce(&DeviceActivityClient::OnCheckMembershipOprfDone, - weak_factory_.GetWeakPtr(), current_use_case), - kMaxFresnelResponseSizeBytes); -} - -void DeviceActivityClient::OnCheckMembershipOprfDone( - DeviceActiveUseCase* current_use_case, - std::unique_ptr<std::string> response_body) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnCheckMembershipOprfDone); - - DCHECK_EQ(state_, State::kCheckingMembershipOprf); - - // Use RAII to reset |url_loader_| after current function scope. - // Resetting |url_loader_| also invalidates the |response_info| variable. - auto url_loader = std::move(url_loader_); - - int net_code = url_loader->NetError(); - RecordResponseStateMetric(state_, net_code); - RecordPsmOprfResponseNetErrorCode(net_code); - - // TODO(crbug.com/1441199): Remove logs and crash report dumps used for - // debugging purposes. Logs are used to determine why ~15% of devices are - // getting back failed Oprf response. - Channel device_channel = current_use_case->GetChromeOSChannel(); - if ((net_code == -105 || net_code == -379 || net_code == -501) && - (device_channel != Channel::CHANNEL_UNKNOWN && - device_channel != Channel::CHANNEL_STABLE)) { - // Store variables that will be checked in crash report. - std::vector<psm_rlwe::RlwePlaintextId> psm_ids = - current_use_case->GetPsmIdentifiersToQuery(); - std::string psm_use_case_str = - psm_rlwe::RlweUseCase_Name(current_use_case->GetPsmUseCase()); - base::Time last_known_ts = current_use_case->GetLastKnownPingTimestamp(); - base::Time current_ts = last_transition_out_of_idle_time_; - int psm_ids_size = psm_ids.size(); - - base::debug::Alias(&net_code); - base::debug::Alias(&device_channel); - DEBUG_ALIAS_FOR_CSTR(local_psm_use_case_str, psm_use_case_str.c_str(), 64); - base::debug::Alias(&last_known_ts); - base::debug::Alias(¤t_ts); - base::debug::Alias(&psm_ids); - base::debug::Alias(&psm_ids_size); - - LOG(ERROR) << "Debug log - Net code = " << net_code; - LOG(ERROR) << "Debug log - Device Channel = " << device_channel; - LOG(ERROR) << "Debug log - Psm use case = " << local_psm_use_case_str; - LOG(ERROR) << "Debug log - Last known ts = " << last_known_ts; - LOG(ERROR) << "Debug log - number of psm ids being queried = " - << psm_ids_size; - - if (psm_ids_size > 0) { - LOG(ERROR) - << "Debug log - Logging plaintext and window id being queried.."; - std::string plaintext_id = psm_ids.at(0).sensitive_id(); - std::string window_id = psm_ids.at(0).non_sensitive_id(); - - DEBUG_ALIAS_FOR_CSTR(local_plaintext_id, plaintext_id.c_str(), 64); - DEBUG_ALIAS_FOR_CSTR(local_window_id, window_id.c_str(), 64); - - LOG(ERROR) << "Debug log - Psm querying plaintext id (sensitive id) = " - << local_plaintext_id; - LOG(ERROR) << "Debug log - Psm querying window id (non sensitive id) = " - << local_window_id; - } - - base::debug::DumpWithoutCrashing(); - } - - // Convert serialized response body to oprf response protobuf. - // Add UMA histogram for diagnostic purposes. - FresnelPsmRlweOprfResponse psm_oprf_response; - bool is_response_body_set = response_body.get() != nullptr; - RecordIsPsmOprfResponseBodySet(is_response_body_set); - - if (!is_response_body_set || - !psm_oprf_response.ParseFromString(*response_body)) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kOprfResponseBodyFailed); - RecordIsPsmOprfResponseParsedCorrectly(false); - - TransitionToIdle(current_use_case); - return; - } - - // Oprf response was parsed successfully. - RecordIsPsmOprfResponseParsedCorrectly(true); - - // Parse |fresnel_oprf_response| for oprf_response. - if (!psm_oprf_response.has_rlwe_oprf_response()) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kNotHasRlweOprfResponse); - TransitionToIdle(current_use_case); - return; - } - - psm_rlwe::PrivateMembershipRlweOprfResponse oprf_response = - psm_oprf_response.rlwe_oprf_response(); - - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - TransitionToCheckMembershipQuery(oprf_response, current_use_case); -} - -void DeviceActivityClient::TransitionToCheckMembershipQuery( - const psm_rlwe::PrivateMembershipRlweOprfResponse& oprf_response, - DeviceActiveUseCase* current_use_case) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientTransitionToCheckMembershipQuery); - - DCHECK_EQ(state_, State::kCheckingMembershipOprf); - DCHECK(!url_loader_); - - state_timer_ = base::ElapsedTimer(); - - // |state_| must be set correctly in order to generate correct URL. - state_ = State::kCheckingMembershipQuery; - - // Report UMA histogram for transitioning state to |kCheckingMembershipQuery|. - RecordStateCountMetric(state_); - - // Generate PSM Query request body. - const auto status_or_query_request = - current_use_case->GetPsmRlweClient()->CreateQueryRequest(oprf_response); - if (!status_or_query_request.ok()) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kCreateQueryRequestFailed); - TransitionToIdle(current_use_case); - return; - } - - psm_rlwe::PrivateMembershipRlweQueryRequest query_request = - status_or_query_request.value(); - - // Wrap PSM Query request body by FresnelPsmRlweQueryRequest proto. - // This proto is expected by the Fresnel service. - device_activity::FresnelPsmRlweQueryRequest fresnel_query_request; - *fresnel_query_request.mutable_rlwe_query_request() = query_request; - - std::string request_body; - fresnel_query_request.SerializeToString(&request_body); - - auto resource_request = GenerateResourceRequest( - net::HttpRequestHeaders::kPostMethod, GetFresnelURL(), api_key_); - - // TODO(https://crbug.com/1266972): Refactor |url_loader_| network request - // call to a shared helper method. - url_loader_ = network ::SimpleURLLoader ::Create( - std::move(resource_request), check_membership_traffic_annotation); - url_loader_->AttachStringForUpload(request_body, "application/x-protobuf"); - url_loader_->SetTimeoutDuration(kQueryRequestTimeout); - url_loader_->DownloadToString( - url_loader_factory_.get(), - base::BindOnce(&DeviceActivityClient::OnCheckMembershipQueryDone, - weak_factory_.GetWeakPtr(), current_use_case), - kMaxFresnelResponseSizeBytes); -} - -void DeviceActivityClient::OnCheckMembershipQueryDone( - DeviceActiveUseCase* current_use_case, - std::unique_ptr<std::string> response_body) { - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnCheckMembershipQueryDone); - - DCHECK_EQ(state_, State::kCheckingMembershipQuery); - - // Use RAII to reset |url_loader_| after current function scope. - // Resetting |url_loader_| also invalidates the |response_info| variable. - auto url_loader = std::move(url_loader_); - - int net_code = url_loader->NetError(); - RecordResponseStateMetric(state_, net_code); - RecordPsmQueryResponseNetErrorCode(net_code); - - // Convert serialized response body to fresnel query response protobuf. - FresnelPsmRlweQueryResponse psm_query_response; - bool is_response_body_set = response_body.get() != nullptr; - RecordIsPsmQueryResponseBodySet(is_response_body_set); - - if (!is_response_body_set || - !psm_query_response.ParseFromString(*response_body)) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kQueryResponseBodyFailed); - RecordIsPsmQueryResponseParsedCorrectly(false); - - TransitionToIdle(current_use_case); - return; - } - - // Query response body was parsed successfully. - RecordIsPsmQueryResponseParsedCorrectly(true); - - // Parse |fresnel_query_response| for psm query_response. - if (!psm_query_response.has_rlwe_query_response()) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kNotHasRlweQueryResponse); - TransitionToIdle(current_use_case); - return; - } - - psm_rlwe::PrivateMembershipRlweQueryResponse query_response = - psm_query_response.rlwe_query_response(); - auto status_or_response = - current_use_case->GetPsmRlweClient()->ProcessQueryResponse( - query_response); - - if (!status_or_response.ok()) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kProcessQueryResponseFailed); - TransitionToIdle(current_use_case); - return; - } - - // Ensure the existence of one membership response. Then, verify that it is - // regarding the current PSM ID. - psm_rlwe::RlweMembershipResponses rlwe_membership_responses = - status_or_response.value(); - - if (rlwe_membership_responses.membership_responses_size() != 1) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kMembershipResponsesSizeIsNotOne); - TransitionToIdle(current_use_case); - return; - } - - private_membership::MembershipResponse membership_response = - rlwe_membership_responses.membership_responses(0).membership_response(); - - bool is_psm_id_member = membership_response.is_member(); - - // Record the query membership result to UMA histogram. - RecordQueryMembershipResultBoolean(is_psm_id_member); - - if (!is_psm_id_member) { - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases::kIsNotPsmIdMember); - TransitionToCheckIn(current_use_case); - return; - } - - // Update local state to signal ping has already been sent for use case - // window. - current_use_case->SetLastKnownPingTimestamp( - last_transition_out_of_idle_time_); - - RecordCheckMembershipCases( - DeviceActivityClient::CheckMembershipResponseCases:: - kSuccessfullySetLocalState); - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - TransitionToIdle(current_use_case); - return; -} - -void DeviceActivityClient::TransitionToCheckIn( - DeviceActiveUseCase* current_use_case) { - RecordTransitionToCheckInMinute(); - RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientTransitionToCheckIn); - - DCHECK(!url_loader_); - - const net::NetworkTrafficAnnotationTag traffic_annotation = - net::DefineNetworkTrafficAnnotation("device_activity_client_check_in", R"( - semantics { - sender: "Device Activity" - description: - "After checking that the Chrome device doesn't have the " - "membership of PSM, Chrome devices make an 'import network' " - "request which lets Fresnel Service import data into " - "PSM storage and Google web server Logs. Fresnel Service " - "is operating system images to be retrieved and provisioned " - "from anywhere internet access is available. So when a new " - "Chrome OS device joins a LAN, it gets added to the Private " - "Set of that LAN. After that, it can view the health status " - "(CPU/RAM/disk usage) of other Chrome OS devices " - "on the same LAN." - trigger: "Chrome OS client makes this network request and records " - "the device activity when the default network changes" - data: "Google API Key." - destination: GOOGLE_OWNED_SERVICE - } - policy { - cookies_allowed: NO - setting: "This feature cannot be disabled in settings." - policy_exception_justification: "Not implemented." - })"); - - state_timer_ = base::ElapsedTimer(); - - // |state_| must be set correctly in order to generate correct URL. - state_ = State::kCheckingIn; - - // Report UMA histogram for transitioning state to |kCheckingIn|. - RecordStateCountMetric(state_); - - // Generate Fresnel PSM import request body. - absl::optional<FresnelImportDataRequest> import_request = - current_use_case->GenerateImportRequestBody(); - - if (!import_request.has_value()) { - TransitionToIdle(current_use_case); - return; - } - - std::string request_body; - import_request.value().SerializeToString(&request_body); - - auto resource_request = GenerateResourceRequest( - net::HttpRequestHeaders::kPostMethod, GetFresnelURL(), api_key_); - - // TODO(https://crbug.com/1266972): Refactor |url_loader_| network request - // call to a shared helper method. - url_loader_ = network::SimpleURLLoader::Create(std::move(resource_request), - traffic_annotation); - url_loader_->AttachStringForUpload(request_body, "application/x-protobuf"); - url_loader_->SetTimeoutDuration(kImportRequestTimeout); - url_loader_->DownloadToString( - url_loader_factory_.get(), - base::BindOnce(&DeviceActivityClient::OnCheckInDone, - weak_factory_.GetWeakPtr(), current_use_case), - kMaxFresnelResponseSizeBytes); -} - -void DeviceActivityClient::OnCheckInDone( - DeviceActiveUseCase* current_use_case, - std::unique_ptr<std::string> response_body) { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnCheckInDone); - - DCHECK_EQ(state_, State::kCheckingIn); - - // Use RAII to reset |url_loader_| after current function scope. - // Resetting |url_loader_| also invalidates the |response_info| variable. - auto url_loader = std::move(url_loader_); - - int net_code = url_loader->NetError(); - RecordResponseStateMetric(state_, net_code); - - // Successful import request - PSM ID was imported successfully. - if (net_code == net::OK) { - // Update local state pref to record reporting device active. - current_use_case->SetLastKnownPingTimestamp( - last_transition_out_of_idle_time_); - - // Update churn local state and active status values after successful - // churn use case ping (either cohort or observation). - UpdateChurnLocalStateAfterCheckIn(current_use_case); - } - - RecordDurationStateMetric(state_, state_timer_.Elapsed()); - TransitionToIdle(current_use_case); -} - -void DeviceActivityClient::TransitionToIdle( - DeviceActiveUseCase* current_use_case) { - RecordDeviceActivityMethodCalled(DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientTransitionToIdle); - - DCHECK(!url_loader_); - state_ = State::kIdle; - - if (current_use_case) { - current_use_case->ClearSavedState(); - current_use_case = nullptr; - - // Pop the front of the queue since the use case has tried reporting. - if (!pending_use_cases_.empty()) - pending_use_cases_.pop(); - } - - // Try to report the remaining pending use cases. - if (!pending_use_cases_.empty()) { - TransitionOutOfIdle(pending_use_cases_.front()); - return; - } - - // Send DBus method to update last ping timestamps in preserved file. - SaveLastPingDatesStatus(); - - // Report UMA histogram for transitioning state back to |kIdle|. - RecordStateCountMetric(state_); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_activity_client.h b/chromeos/ash/components/device_activity/device_activity_client.h deleted file mode 100644 index 0bc75b2c..0000000 --- a/chromeos/ash/components/device_activity/device_activity_client.h +++ /dev/null
@@ -1,378 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVITY_CLIENT_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVITY_CLIENT_H_ - -#include <memory> -#include <queue> - -#include "base/component_export.h" -#include "base/memory/raw_ptr.h" -#include "base/memory/scoped_refptr.h" -#include "base/memory/weak_ptr.h" -#include "base/time/time.h" -#include "base/timer/elapsed_timer.h" -#include "base/timer/timer.h" -#include "chromeos/ash/components/dbus/private_computing/private_computing_client.h" -#include "chromeos/ash/components/dbus/private_computing/private_computing_service.pb.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "chromeos/ash/components/network/network_state_handler_observer.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" -#include "url/gurl.h" - -class PrefService; - -namespace network { -class SimpleURLLoader; -class SharedURLLoaderFactory; -} // namespace network - -namespace ash { - -class NetworkState; -class NetworkStateHandler; -class SystemClockSyncObservation; - -namespace device_activity { - -// Forward declaration from device_active_use_case.h -class DeviceActiveUseCase; - -// Observes the network for connected state to determine whether the device -// is active in a given window. -// State Transition flow: -// kIdle -> kCheckingMembershipOprf -> kCheckingMembershipQuery -// -> kIdle or (kCheckingIn -> kIdle) -// -// TODO(https://crbug.com/1302175): Move methods passing DeviceActiveUseCase* to -// methods of DeviceActiveUseCase class. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - DeviceActivityClient : public NetworkStateHandlerObserver { - public: - // Tracks the state the client is in, given the use case (i.e DAILY). - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class State { - kUnknown = 0, // Default value, typically we should never be in this state. - kIdle = 1, // Wait on network connection OR |report_timer_| to trigger. - kCheckingMembershipOprf = 2, // Phase 1 of the |CheckMembership| request. - kCheckingMembershipQuery = 3, // Phase 2 of the |CheckMembership| request. - kCheckingIn = 4, // |CheckIn| PSM device active request. - kHealthCheck = 5, // Query to perform server health check. - kMaxValue = kHealthCheck, - }; - - // Categorize PSM response codes which will be used when bucketing UMA - // histograms. - // - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class PsmResponse { - kUnknown = 0, // Uncategorized response type returned. - kSuccess = 1, // Successfully completed PSM request. - kError = 2, // Error completing PSM request. - kTimeout = 3, // Timed out while completing PSM request. - kMaxValue = kTimeout, - }; - - // Categorize the preserved file state which will be used when bucketing UMA - // histograms. - // - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class PreservedFileState { - kUnknown = 0, // Uncategorized state. - kReadOkLocalStateEmpty = 1, // Preserved file read successfully and local - // state empty. - kReadOkLocalStateSet = 2, // Preserved file read successfully but local - // state is already set. - kReadFail = 3, // Preserved file read failed and local state can either be - // empty or set. - kMaxValue = kReadFail, - }; - - // Categorize device activity methods which will be used when bucketing UMA - // histograms by number of calls to each method. - // Enum listed keys map to methods in |DeviceActivityController| and - // |DeviceActivityClient|. - // - // These values are persisted to logs. Entries should not be renumbered and - // numeric values should never be reused. - enum class DeviceActivityMethod { - kUnknown = 0, - kDeviceActivityControllerConstructor = 1, - kDeviceActivityControllerDestructor = 2, - kDeviceActivityControllerStart = 3, - kDeviceActivityControllerOnPsmDeviceActiveSecretFetched = 4, - kDeviceActivityControllerOnMachineStatisticsLoaded = 5, - kDeviceActivityClientConstructor = 6, - kDeviceActivityClientDestructor = 7, - kDeviceActivityClientOnNetworkOnline = 8, - kDeviceActivityClientOnNetworkOffline = 9, - kDeviceActivityClientReportUseCases = 10, - kDeviceActivityClientCancelUseCases = 11, - kDeviceActivityClientTransitionOutOfIdle = 12, - kDeviceActivityClientTransitionToHealthCheck = 13, - kDeviceActivityClientOnHealthCheckDone = 14, - kDeviceActivityClientTransitionToCheckMembershipOprf = 15, - kDeviceActivityClientOnCheckMembershipOprfDone = 16, - kDeviceActivityClientTransitionToCheckMembershipQuery = 17, - kDeviceActivityClientOnCheckMembershipQueryDone = 18, - kDeviceActivityClientTransitionToCheckIn = 19, - kDeviceActivityClientOnCheckInDone = 20, - kDeviceActivityClientTransitionToIdle = 21, - kDeviceActivityClientOnSystemClockSyncResult = 22, - kDeviceActivityClientReportingTriggeredByTimer = 23, - kDeviceActivityClientSaveLastPingDatesStatus = 24, - kDeviceActivityClientOnSaveLastPingDatesStatusComplete = 25, - kDeviceActivityClientGetLastPingDatesStatus = 26, - kDeviceActivityClientOnGetLastPingDatesStatusFetched = 27, - kMaxValue = kDeviceActivityClientOnGetLastPingDatesStatusFetched, - }; - - // Records UMA histogram for different failed cases before set the last - // ping time to local_state_ after checking membership has response. - enum class CheckMembershipResponseCases { - kUnknown = 0, - kCreateOprfRequestFailed = 1, - kOprfResponseBodyFailed = 2, - kNotHasRlweOprfResponse = 3, - kCreateQueryRequestFailed = 4, - kQueryResponseBodyFailed = 5, - kNotHasRlweQueryResponse = 6, - kProcessQueryResponseFailed = 7, - kMembershipResponsesSizeIsNotOne = 8, - kIsNotPsmIdMember = 9, - kSuccessfullySetLocalState = 10, - kMaxValue = kSuccessfullySetLocalState, - }; - - // Records UMA histogram for number of times various methods are called in - // device_activity/. - static void RecordDeviceActivityMethodCalled( - DeviceActivityMethod method_name); - - // Fires device active pings while the device network is connected. - DeviceActivityClient( - ChurnActiveStatus* churn_active_status_ptr, - PrefService* local_state, - NetworkStateHandler* handler, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - std::unique_ptr<base::RepeatingTimer> report_timer, - const std::string& fresnel_server_url, - const std::string& api_key, - base::Time chrome_first_run_time, - std::vector<std::unique_ptr<DeviceActiveUseCase>> use_cases); - DeviceActivityClient(const DeviceActivityClient&) = delete; - DeviceActivityClient& operator=(const DeviceActivityClient&) = delete; - ~DeviceActivityClient() override; - - // Returns pointer to |report_timer_|. - base::RepeatingTimer* GetReportTimer(); - - // NetworkStateHandlerObserver overridden method. - void DefaultNetworkChanged(const NetworkState* network) override; - void OnShuttingDown() override; - - State GetState() const; - - std::vector<DeviceActiveUseCase*> GetUseCases() const; - - DeviceActiveUseCase* GetUseCasePtr( - private_membership::rlwe::RlweUseCase psm_use_case) const; - - // Update the local state values based after cohort check in updates the - // active status value. - // Specifically, the churn observation local state fields are relative to - // the previous active status value: - // 1. kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0 - // 2. kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1 - // 3. kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2 - void UpdateChurnLocalStateAfterCheckIn(DeviceActiveUseCase* current_use_case); - - // Read the cohort active status int32 and - // period status booleans that indicate which observation periods - // were already reported. - // - // Note the observation periods are relative to the current month stored - // in the active status int32. - // Method must also update the observation last ping timestamp in local state. - void ReadChurnPreservedFile(const private_computing::ActiveStatus& status); - - // Generate the proto with the latest last ping date values. - private_computing::SaveStatusRequest GetSaveStatusRequest(); - - // Write the last ping dates for all use cases to preserved files via - // the private_computingd dbus daemon. - void SaveLastPingDatesStatus(); - - // After the dbus call is complete, return response via this method. - void OnSaveLastPingDatesStatusComplete( - private_computing::SaveStatusResponse response); - - // Read the last ping dates status for all use cases from preserved files - // via the private_comutingd dbus daemon. - void GetLastPingDatesStatus(); - - // After the dbus call is complete, return response via this method. - void OnGetLastPingDatesStatusFetched( - private_computing::GetStatusResponse response); - - private: - // |report_timer_| triggers method to retry reporting device actives if - // necessary. - void ReportingTriggeredByTimer(); - - // Handles device network connecting successfully. - void OnNetworkOnline(); - - // Called when the system clock has been synchronized or a timeout has been - // reached while waiting for the system clock sync. - // Report use cases if the system clock sync was successful. - void OnSystemClockSyncResult(bool system_clock_synchronized); - - // Handle device network disconnecting successfully. - void OnNetworkOffline(); - - // Return Fresnel server network request endpoints determined by the |state_|. - GURL GetFresnelURL() const; - - // Called when device network comes online or |report_timer_| executing. - // Reports each use case in a sequenced order. - void ReportUseCases(); - - // Called when device network goes offline. - // Since the network connection is severed, any pending network requests will - // be cleaned up. - // After calling this method: |state_| set to |kIdle|. - void CancelUseCases(); - - // Callback from |ReportUseCases()| handling whether a use case needs - // to be reported for the time window. - void TransitionOutOfIdle(DeviceActiveUseCase* current_use_case); - - // Send Health Check network request and update |state_|. - // Before calling this method: |state_| is expected to be |kIdle|. - // After calling this method: |state_| set to |kHealthCheck|. - void TransitionToHealthCheck(); - - // Callback from asynchronous method |TransitionToHealthCheck|. - void OnHealthCheckDone(std::unique_ptr<std::string> response_body); - - // Send Oprf network request and update |state_|. - // Before calling this method: |state_| is expected to be |kIdle|. - // After calling this method: |state_| set to |kCheckingMembershipOprf|. - void TransitionToCheckMembershipOprf(DeviceActiveUseCase* current_use_case); - - // Callback from asynchronous method |TransitionToCheckMembershipOprf|. - void OnCheckMembershipOprfDone(DeviceActiveUseCase* current_use_case, - std::unique_ptr<std::string> response_body); - - // Send Query network request and update |state_|. - // Before calling this method: |state_| is expected to be - // |kCheckingMembershipOprf|. - // After calling this method: |state_| set to |kCheckingMembershipQuery|. - void TransitionToCheckMembershipQuery( - const private_membership::rlwe::PrivateMembershipRlweOprfResponse& - oprf_response, - DeviceActiveUseCase* current_use_case); - - // Callback from asynchronous method |TransitionToCheckMembershipQuery|. - // Check in PSM id based on |response_body| from CheckMembershipQuery. - void OnCheckMembershipQueryDone(DeviceActiveUseCase* current_use_case, - std::unique_ptr<std::string> response_body); - - // Send Import network request and update |state_|. - // Before calling this method: |state_| is expected to be either - // |kCheckingMembershipQuery| or |kIdle|. - // After calling this method: |state_| set to |kCheckingIn|. - void TransitionToCheckIn(DeviceActiveUseCase* current_use_case); - - // Callback from asynchronous method |TransitionToCheckIn|. - void OnCheckInDone(DeviceActiveUseCase* current_use_case, - std::unique_ptr<std::string> response_body); - - // Updates |state_| to |kIdle| and resets state based member variables. - void TransitionToIdle(DeviceActiveUseCase* current_use_case); - - // Tracks the current state of the DeviceActivityClient. - State state_ = State::kIdle; - - // Used by the client to recover and maintain an updated value of churn active - // status for the device active churn use cases. - // |churn_active_status_ptr_| outlives the lifetime of this class and is owned - // by the DeviceActivityController class. - const raw_ptr<ChurnActiveStatus, ExperimentalAsh> churn_active_status_ptr_; - - // Used by client to store and retrieve values stored in local state prefs. - // |local_state_| outlives the lifetime of this class and interacts with the - // churn active status, and churn observation period statuses. - const raw_ptr<PrefService, ExperimentalAsh> local_state_; - - // Keep track of whether the device is connected to the network. - bool network_connected_ = false; - - // Time the device last transitioned out of idle state. - base::Time last_transition_out_of_idle_time_; - - // Generated when entering new |state_| and reset when leaving |state_|. - // This field is only used to determine total state duration, which is - // reported to UMA via. histograms. - base::ElapsedTimer state_timer_; - - // Tracks the visible networks and their properties. - // |network_state_handler_| outlives the lifetime of this class. - // |ChromeBrowserMainPartsAsh| initializes the network_state object as - // part of the |dbus_services_|, before |DeviceActivityClient| is initialized. - // Similarly, |DeviceActivityClient| is destructed before |dbus_services_|. - const raw_ptr<NetworkStateHandler, ExperimentalAsh> network_state_handler_; - - // Shared |url_loader_| object used to handle ongoing network requests. - std::unique_ptr<network::SimpleURLLoader> url_loader_; - - // The URLLoaderFactory we use to issue network requests. - // |url_loader_factory_| outlives |url_loader_|. - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory_; - - // Tries reporting device actives every |kTimeToRepeat| from when this class - // is initialized. Time of class initialization depends on when the device is - // turned on (when |ChromeBrowserMainPartsAsh::PostBrowserStart| is run). - std::unique_ptr<base::RepeatingTimer> report_timer_; - - // Base Fresnel server URL is set by |DeviceActivityClient| constructor. - const std::string fresnel_base_url_; - - // API key used to authenticate with the Fresnel server. This key is read from - // the chrome-internal repository and is not publicly exposed in Chromium. - const std::string api_key_; - - // The chrome first run sentinel creation time. - base::Time chrome_first_run_time_; - - // Vector of supported use cases containing the methods and metadata required - // to counting device actives. - std::vector<std::unique_ptr<DeviceActiveUseCase>> use_cases_; - - // Contains the use cases to report active for. - // The front of the queue represents the use case trying to be reported. - // |ReportUseCases| initializes this field using the |use_cases_|. - // |TransitionToIdle| pops from this field to report each pending use case. - std::queue<DeviceActiveUseCase*> pending_use_cases_; - - // Used to wait until the system clock to be synchronized. - std::unique_ptr<SystemClockSyncObservation> system_clock_sync_observation_; - - NetworkStateHandlerScopedObservation network_state_handler_observer_{this}; - - // Automatically cancels callbacks when the referent of weakptr gets - // destroyed. - base::WeakPtrFactory<DeviceActivityClient> weak_factory_{this}; -}; - -} // namespace device_activity -} // namespace ash - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVITY_CLIENT_H_
diff --git a/chromeos/ash/components/device_activity/device_activity_client_unittest.cc b/chromeos/ash/components/device_activity/device_activity_client_unittest.cc deleted file mode 100644 index 203c2c7..0000000 --- a/chromeos/ash/components/device_activity/device_activity_client_unittest.cc +++ /dev/null
@@ -1,2146 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/device_activity_client.h" - -#include "ash/constants/ash_features.h" -#include "base/files/file_path.h" -#include "base/files/file_util.h" -#include "base/no_destructor.h" -#include "base/path_service.h" -#include "base/test/metrics/histogram_tester.h" -#include "base/test/scoped_feature_list.h" -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "base/timer/mock_timer.h" -#include "chromeos/ash/components/dbus/private_computing/fake_private_computing_client.h" -#include "chromeos/ash/components/dbus/private_computing/private_computing_service.pb.h" -#include "chromeos/ash/components/dbus/system_clock/system_clock_client.h" -#include "chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h" -#include "chromeos/ash/components/device_activity/churn_observation_use_case_impl.h" -#include "chromeos/ash/components/device_activity/daily_use_case_impl.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "chromeos/ash/components/device_activity/device_activity_controller.h" -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h" -#include "chromeos/ash/components/network/network_state_handler_observer.h" -#include "chromeos/ash/components/network/network_state_test_helper.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" -#include "services/network/test/test_shared_url_loader_factory.h" -#include "services/network/test/test_url_loader_factory.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/cros_system_api/dbus/shill/dbus-constants.h" -#include "third_party/icu/source/i18n/unicode/gregocal.h" -#include "third_party/icu/source/i18n/unicode/timezone.h" -#include "third_party/private_membership/src/internal/testing/regression_test_data/regression_test_data.pb.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Set the current time to the following string. -// Note that we use midnight PST (UTC-8) for the unit tests. -const char kFakeNowTimeString[] = "2023-01-01 08:00:00 GMT"; - -// This value represents the UTC based activate date of the device formatted -// YYYY-WW to reduce privacy granularity. -// See -// https://crsrc.org/o/src/third_party/chromiumos-overlay/chromeos-base/chromeos-activate-date/files/activate_date;l=67 -const char kFakeFirstActivateDate[] = "2022-50"; - -// Milliseconds per minute. -constexpr int kMillisecondsPerMinute = 60000; - -// URLs for the different network requests being performed. -const char kTestFresnelBaseUrl[] = "https://dummy.googleapis.com"; -const char kPsmImportRequestEndpoint[] = "/v1/fresnel/psmRlweImport"; -const char kPsmOprfRequestEndpoint[] = "/v1/fresnel/psmRlweOprf"; -const char kPsmQueryRequestEndpoint[] = "/v1/fresnel/psmRlweQuery"; - -// This secret should be of exactly length 64, since it is a 256 bit string -// encoded as a hexadecimal. -constexpr char kFakePsmDeviceActiveSecret[] = - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - -constexpr char kFakeFresnelApiKey[] = "FAKE_FRESNEL_API_KEY"; - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -// Number of test cases exist in cros_test_data.binarypb file, which is part of -// private_membership third_party library. -const int kNumberOfPsmTestCases = 10; - -// Number of test cases exist in private_computing_service_test_data.binarypb. -const int kNumberOfPrivateComputingServiceTestCases = 9; - -// PrivateSetMembership regression tests maximum file size which is 4MB. -const size_t kMaxFileSizeInBytes = 4 * (1 << 20); - -std::string GetFresnelTestEndpoint(const std::string& endpoint) { - return kTestFresnelBaseUrl + endpoint; -} - -bool ParseProtoFromFile(const base::FilePath& file_path, - google::protobuf::MessageLite* out_proto) { - if (!out_proto) - return false; - - std::string file_content; - if (!base::ReadFileToStringWithMaxSize(file_path, &file_content, - kMaxFileSizeInBytes)) { - return false; - } - return out_proto->ParseFromString(file_content); -} - -// Returns the total offset between Pacific Time (PT) and GMT. -// Parameter ts is expected to be GMT/UTC. -// TODO(hirthanan): Create utils library for commonly used methods. -base::Time ConvertToPT(base::Time ts) { - // America/Los_Angleles is PT. - std::unique_ptr<icu::TimeZone> time_zone( - icu::TimeZone::createTimeZone("America/Los_Angeles")); - if (*time_zone == icu::TimeZone::getUnknown()) { - LOG(ERROR) << "Failed to get America/Los_Angeles timezone. " - << "Returning UTC-8 timezone as default."; - return ts - base::Hours(8); - } - - // Calculate timedelta between PT and GMT. This method does not take day light - // savings (DST) into account. - const base::TimeDelta raw_time_diff = - base::Minutes(time_zone->getRawOffset() / kMillisecondsPerMinute); - - UErrorCode status = U_ZERO_ERROR; - auto gregorian_calendar = - std::make_unique<icu::GregorianCalendar>(*time_zone, status); - - // Calculates the time difference adjust by the possible daylight savings - // offset. If the status of any step fails, returns the default time - // difference without considering daylight savings. - if (!gregorian_calendar) { - return ts + raw_time_diff; - } - - // Convert ts object to UDate. - UDate current_date = - static_cast<UDate>(ts.ToDoubleT() * base::Time::kMillisecondsPerSecond); - status = U_ZERO_ERROR; - gregorian_calendar->setTime(current_date, status); - if (U_FAILURE(status)) { - return ts + raw_time_diff; - } - - status = U_ZERO_ERROR; - UBool day_light = gregorian_calendar->inDaylightTime(status); - if (U_FAILURE(status)) { - return ts + raw_time_diff; - } - - // Calculate timedelta between PT and GMT, taking DST into account for an - // accurate PT. - int gmt_offset = time_zone->getRawOffset(); - if (day_light) { - gmt_offset += time_zone->getDSTSavings(); - } - - return ts + base::Minutes(gmt_offset / kMillisecondsPerMinute); -} - -base::TimeDelta TimeUntilNextPTMidnight() { - const auto pt_adjusted_ts = ConvertToPT(base::Time::Now()); - - base::Time new_pt_midnight = - pt_adjusted_ts.UTCMidnight() + base::Hours(base::Time::kHoursPerDay); - - return new_pt_midnight - pt_adjusted_ts; -} - -base::TimeDelta TimeUntilNewPTMonth() { - const auto current_ts = base::Time::Now(); - - base::Time::Exploded exploded_current_ts; - current_ts.UTCExplode(&exploded_current_ts); - - // Exploded structure uses 1-based month (values 1 = January, etc.) - // Increment current ts to be the new month/year. - // "+ 11) % 12) + 1" wraps the month around if it goes outside 1..12. - exploded_current_ts.month = (((exploded_current_ts.month + 1) + 11) % 12) + 1; - exploded_current_ts.year += (exploded_current_ts.month == 1); - - // New timestamp should reflect first day of new month. - exploded_current_ts.day_of_month = 1; - - base::Time new_ts; - EXPECT_TRUE(base::Time::FromUTCExploded(exploded_current_ts, &new_ts)); - - return new_ts - current_ts; -} - -// Holds data used to create deterministic PSM network request/response protos. -struct PsmTestData { - // Holds the response bodies used to test the case where the plaintext id is - // a member of the PSM dataset. - psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase - member_test_case; - - // Holds the response bodies used to test the case where the plaintext id is - // not a member of the PSM dataset. - psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase - nonmember_test_case; -}; - -std::vector<psm_rlwe::RlwePlaintextId> GetPlaintextIds( - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) { - // Return well formed plaintext ids used in faking PSM network requests. - return {test_case.plaintext_id()}; -} - -// Holds data to test various PrivateComputingClient responses from DBus. -struct PrivateComputingClientTestData { - std::vector< - private_computing::PrivateComputingClientRegressionTestData::TestCase> - test_cases; -}; - -class DailyUseCaseImplUnderTest : public DailyUseCaseImpl { - public: - DailyUseCaseImplUnderTest( - PrefService* local_state, - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) - : DailyUseCaseImpl( - kFakePsmDeviceActiveSecret, - kFakeChromeParameters, - local_state, - std::make_unique<FakePsmDelegate>(test_case.ec_cipher_key(), - test_case.seed(), - GetPlaintextIds(test_case))) {} - DailyUseCaseImplUnderTest(const DailyUseCaseImplUnderTest&) = delete; - DailyUseCaseImplUnderTest& operator=(const DailyUseCaseImplUnderTest&) = - delete; - ~DailyUseCaseImplUnderTest() override = default; -}; - -class TwentyEightDayActiveUseCaseImplUnderTest - : public TwentyEightDayActiveUseCaseImpl { - public: - TwentyEightDayActiveUseCaseImplUnderTest( - PrefService* local_state, - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) - : TwentyEightDayActiveUseCaseImpl( - kFakePsmDeviceActiveSecret, - kFakeChromeParameters, - local_state, - std::make_unique<FakePsmDelegate>(test_case.ec_cipher_key(), - test_case.seed(), - GetPlaintextIds(test_case))) {} - TwentyEightDayActiveUseCaseImplUnderTest( - const TwentyEightDayActiveUseCaseImplUnderTest&) = delete; - TwentyEightDayActiveUseCaseImplUnderTest& operator=( - const TwentyEightDayActiveUseCaseImplUnderTest&) = delete; - ~TwentyEightDayActiveUseCaseImplUnderTest() override = default; -}; - -class ChurnCohortUseCaseImplUnderTest : public ChurnCohortUseCaseImpl { - public: - ChurnCohortUseCaseImplUnderTest( - ChurnActiveStatus* churn_active_status_ptr, - PrefService* local_state, - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) - : ChurnCohortUseCaseImpl( - churn_active_status_ptr, - kFakePsmDeviceActiveSecret, - kFakeChromeParameters, - local_state, - std::make_unique<FakePsmDelegate>(test_case.ec_cipher_key(), - test_case.seed(), - GetPlaintextIds(test_case))) {} - ChurnCohortUseCaseImplUnderTest(const ChurnCohortUseCaseImplUnderTest&) = - delete; - ChurnCohortUseCaseImplUnderTest& operator=( - const ChurnCohortUseCaseImplUnderTest&) = delete; - ~ChurnCohortUseCaseImplUnderTest() override = default; -}; - -class ChurnObservationUseCaseImplUnderTest - : public ChurnObservationUseCaseImpl { - public: - ChurnObservationUseCaseImplUnderTest( - ChurnActiveStatus* churn_active_status_ptr, - PrefService* local_state, - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) - : ChurnObservationUseCaseImpl( - churn_active_status_ptr, - kFakePsmDeviceActiveSecret, - kFakeChromeParameters, - local_state, - std::make_unique<FakePsmDelegate>(test_case.ec_cipher_key(), - test_case.seed(), - GetPlaintextIds(test_case))) {} - ChurnObservationUseCaseImplUnderTest( - const ChurnObservationUseCaseImplUnderTest&) = delete; - ChurnObservationUseCaseImplUnderTest& operator=( - const ChurnObservationUseCaseImplUnderTest&) = delete; - ~ChurnObservationUseCaseImplUnderTest() override = default; -}; - -} // namespace - -// TODO(crbug/1317652): Refactor checking if current use case local pref is -// unset. We may also want to abstract the psm network responses for the unit -// tests. -class DeviceActivityClientTest : public testing::Test { - public: - DeviceActivityClientTest() - : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} - DeviceActivityClientTest(const DeviceActivityClientTest&) = delete; - DeviceActivityClientTest& operator=(const DeviceActivityClientTest&) = delete; - ~DeviceActivityClientTest() override = default; - - static PsmTestData* GetPsmTestData() { - static base::NoDestructor<PsmTestData> data; - return data.get(); - } - - static void CreatePsmTestCase() { - base::FilePath src_root_dir; - ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_root_dir)); - const base::FilePath kPsmTestDataPath = - src_root_dir.AppendASCII("third_party") - .AppendASCII("private_membership") - .AppendASCII("src") - .AppendASCII("internal") - .AppendASCII("testing") - .AppendASCII("regression_test_data") - .AppendASCII("test_data.binarypb"); - ASSERT_TRUE(base::PathExists(kPsmTestDataPath)); - psm_rlwe::PrivateMembershipRlweClientRegressionTestData test_data; - ASSERT_TRUE(ParseProtoFromFile(kPsmTestDataPath, &test_data)); - - // Note that the test cases can change since it's read from the binarypb. - // This can cause unexpected failures for the unit tests below. - // As a safety precaution, check whether the number of tests change. - ASSERT_EQ(test_data.test_cases_size(), kNumberOfPsmTestCases); - - // Sets |psm_test_case_| to have one of the fake PSM request/response - // protos. - // - // Test case 0 contains a response where check membership returns true. - // Test case 5 contains a response where check membership returns false. - GetPsmTestData()->member_test_case = test_data.test_cases(0); - GetPsmTestData()->nonmember_test_case = test_data.test_cases(5); - } - - static const psm_rlwe::PrivateMembershipRlweClientRegressionTestData:: - TestCase& - GetPsmNonMemberTestCase() { - return GetPsmTestData()->nonmember_test_case; - } - - static PrivateComputingClientTestData* GetPrivateComputingClientTestData() { - static base::NoDestructor<PrivateComputingClientTestData> data; - return data.get(); - } - - static void CreatePrivateComputingTestData() { - base::FilePath src_root_dir; - ASSERT_TRUE(base::PathService::Get(base::DIR_SOURCE_ROOT, &src_root_dir)); - const base::FilePath kPrivateComputingTestDataPath = - src_root_dir.AppendASCII("chromeos") - .AppendASCII("ash") - .AppendASCII("components") - .AppendASCII("device_activity") - .AppendASCII("testing") - .AppendASCII("private_computing_service_test_data.binarypb"); - ASSERT_TRUE(base::PathExists(kPrivateComputingTestDataPath)); - private_computing::PrivateComputingClientRegressionTestData test_data; - ASSERT_TRUE(ParseProtoFromFile(kPrivateComputingTestDataPath, &test_data)); - - // Note that the test cases can change since it's read from the binarypb. - // This can cause unexpected failures for the unit tests below. - // As a safety precaution, check whether the number of tests change. - ASSERT_EQ(test_data.test_cases_size(), - kNumberOfPrivateComputingServiceTestCases); - - // Assign the test data test cases to static variable containing all test - // cases from the read binary protobuf. - GetPrivateComputingClientTestData()->test_cases = std::vector( - test_data.test_cases().begin(), test_data.test_cases().end()); - } - - static private_computing::PrivateComputingClientRegressionTestData::TestCase - GetPrivateComputingRegressionTestCase( - private_computing::PrivateComputingClientRegressionTestData::TestName - test_name) { - for (const auto& test : GetPrivateComputingClientTestData()->test_cases) { - if (test.name() == test_name) - return test; - } - - LOG(ERROR) << "Error finding test_name " - << private_computing::PrivateComputingClientRegressionTestData:: - TestName_Name(test_name); - return private_computing::PrivateComputingClientRegressionTestData:: - TestCase(); - } - - static void SetUpTestSuite() { - // Initialize |psm_test_case_| which is used to generate deterministic psm - // protos. - CreatePsmTestCase(); - - // Initialize static PrivateComputingClientTestData. - CreatePrivateComputingTestData(); - } - - protected: - // Initialize well formed OPRF response body used to deterministically fake - // PSM network responses. - const std::string GetFresnelOprfResponse( - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) { - FresnelPsmRlweOprfResponse psm_oprf_response; - *psm_oprf_response.mutable_rlwe_oprf_response() = test_case.oprf_response(); - return psm_oprf_response.SerializeAsString(); - } - - // Initialize well formed Query response body used to deterministically fake - // PSM network responses. - const std::string GetFresnelQueryResponse( - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - test_case) { - FresnelPsmRlweQueryResponse psm_query_response; - *psm_query_response.mutable_rlwe_query_response() = - test_case.query_response(); - return psm_query_response.SerializeAsString(); - } - - PrivateComputingClient::TestInterface* client_test_interface() { - return PrivateComputingClient::Get()->GetTestInterface(); - } - - // testing::Test: - void SetUp() override { - // Initialize the fake PrivateComputingClient used to send DBus calls. - PrivateComputingClient::InitializeFake(); - - // Default network to being synchronized and available. - SystemClockClient::InitializeFake(); - GetSystemClockTestInterface()->SetServiceIsAvailable(true); - GetSystemClockTestInterface()->SetNetworkSynchronized(true); - - network_state_test_helper_ = std::make_unique<NetworkStateTestHelper>( - /*use_default_devices_and_services=*/false); - CreateWifiNetworkConfig(); - - // Initialize |local_state_| prefs used by device_activity_client class. - DeviceActivityController::RegisterPrefs(local_state_.registry()); - test_shared_loader_factory_ = - base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( - &test_url_loader_factory_); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - // ActivateDate VPD field is read from machine statistics in downstream - // dependency. - statistics_provider_.SetMachineStatistic(system::kActivateDateKey, - kFakeFirstActivateDate); - - SetUpDeviceActivityClient( - { - features::kDeviceActiveClientDailyCheckMembership, - features::kDeviceActiveClient28DayActiveCheckIn, - features::kDeviceActiveClient28DayActiveCheckMembership, - features::kDeviceActiveClientChurnCohortCheckIn, - features::kDeviceActiveClientChurnCohortCheckMembership, - features::kDeviceActiveClientChurnObservationCheckIn, - features::kDeviceActiveClientChurnObservationCheckMembership, - }, - GetPsmNonMemberTestCase(), - GetPrivateComputingRegressionTestCase( - private_computing::PrivateComputingClientRegressionTestData:: - GET_FAIL_SAVE_FAIL)); - } - - void TearDown() override { - DCHECK(device_activity_client_); - DCHECK(churn_active_status_); - - device_activity_client_.reset(); - - // Initialized in the SetUp method and safely destructed here. - churn_active_status_.reset(); - - // The system clock must be shutdown after the |device_activity_client_| is - // destroyed. - SystemClockClient::Shutdown(); - - // The private computing client must be shutdown after the - // |device_activity_client_| is destroyed. - PrivateComputingClient::Shutdown(); - } - - SystemClockClient::TestInterface* GetSystemClockTestInterface() { - return SystemClockClient::Get()->GetTestInterface(); - } - - void SetUpDeviceActivityClient( - std::vector<base::test::FeatureRef> enabled_features, - const psm_rlwe::PrivateMembershipRlweClientRegressionTestData::TestCase& - psm_test_case, - const private_computing::PrivateComputingClientRegressionTestData:: - TestCase& pc_test_case) { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/enabled_features, - /*disabled_features*/ {}); - - // Remote env. runs unit tests assuming base::Time::Now() is unix epoch. - // Forward current time |kFakeNowTimeString|. - base::Time new_ts; - EXPECT_TRUE(base::Time::FromUTCString(kFakeNowTimeString, &new_ts)); - task_environment_.FastForwardBy(new_ts - base::Time::Now()); - task_environment_.RunUntilIdle(); - - // Use fake private computing daemon responses from test case. - client_test_interface()->SetGetLastPingDatesStatusResponse( - pc_test_case.get_response()); - client_test_interface()->SetSaveLastPingDatesStatusResponse( - pc_test_case.save_response()); - - // Initialize the churn active status to a default value of 0. - churn_active_status_ = std::make_unique<ChurnActiveStatus>(0); - - // Create vector of device active use cases, which device activity client - // should maintain ownership of. - std::vector<std::unique_ptr<DeviceActiveUseCase>> use_cases; - - // Append use case if any related feature flag is enabled. - if (base::FeatureList::IsEnabled( - features::kDeviceActiveClientDailyCheckMembership)) { - use_cases.push_back(std::make_unique<DailyUseCaseImplUnderTest>( - &local_state_, psm_test_case)); - } - if (base::FeatureList::IsEnabled( - features::kDeviceActiveClient28DayActiveCheckIn) || - base::FeatureList::IsEnabled( - features::kDeviceActiveClient28DayActiveCheckMembership)) { - use_cases.push_back( - std::make_unique<TwentyEightDayActiveUseCaseImplUnderTest>( - &local_state_, psm_test_case)); - } - if (base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnCohortCheckIn) || - base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnCohortCheckMembership)) { - use_cases.push_back(std::make_unique<ChurnCohortUseCaseImplUnderTest>( - churn_active_status_.get(), &local_state_, psm_test_case)); - } - if (base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnObservationCheckIn) || - base::FeatureList::IsEnabled( - features::kDeviceActiveClientChurnObservationCheckMembership)) { - use_cases.push_back( - std::make_unique<ChurnObservationUseCaseImplUnderTest>( - churn_active_status_.get(), &local_state_, psm_test_case)); - } - - device_activity_client_ = std::make_unique<DeviceActivityClient>( - churn_active_status_.get(), &local_state_, - network_state_test_helper_->network_state_handler(), - test_shared_loader_factory_, - std::make_unique<base::MockRepeatingTimer>(), kTestFresnelBaseUrl, - kFakeFresnelApiKey, base::Time(), std::move(use_cases)); - } - - PrefService* GetLocalState() { return &local_state_; } - - // Simulate powerwashing device by removing the local state prefs. - void SimulateLocalStateOnPowerwash() { - local_state_.RemoveUserPref( - prefs::kDeviceActiveLastKnownDailyPingTimestamp); - local_state_.RemoveUserPref( - prefs::kDeviceActiveLastKnown28DayActivePingTimestamp); - local_state_.RemoveUserPref( - prefs::kDeviceActiveChurnCohortMonthlyPingTimestamp); - local_state_.RemoveUserPref( - prefs::kDeviceActiveChurnObservationMonthlyPingTimestamp); - local_state_.RemoveUserPref(prefs::kDeviceActiveLastKnownChurnActiveStatus); - local_state_.RemoveUserPref( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0); - local_state_.RemoveUserPref( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1); - local_state_.RemoveUserPref( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2); - - // On device powerwash, the churn active status value will get erased. - churn_active_status_->SetValue(0); - } - - void SimulateOprfResponse(const std::string& serialized_response_body, - net::HttpStatusCode response_code) { - test_url_loader_factory_.SimulateResponseForPendingRequest( - GetFresnelTestEndpoint(kPsmOprfRequestEndpoint), - serialized_response_body, response_code); - } - - void SimulateQueryResponse(const std::string& serialized_response_body, - net::HttpStatusCode response_code) { - test_url_loader_factory_.SimulateResponseForPendingRequest( - GetFresnelTestEndpoint(kPsmQueryRequestEndpoint), - serialized_response_body, response_code); - } - - void SimulateImportResponse(const std::string& serialized_response_body, - net::HttpStatusCode response_code) { - test_url_loader_factory_.SimulateResponseForPendingRequest( - GetFresnelTestEndpoint(kPsmImportRequestEndpoint), - serialized_response_body, response_code); - } - - void CreateWifiNetworkConfig() { - ASSERT_TRUE(wifi_network_service_path_.empty()); - - std::stringstream ss; - ss << "{" - << " \"GUID\": \"" - << "wifi_guid" - << "\"," - << " \"Type\": \"" << shill::kTypeWifi << "\"," - << " \"State\": \"" << shill::kStateIdle << "\"" - << "}"; - - wifi_network_service_path_ = - network_state_test_helper_->ConfigureService(ss.str()); - } - - // |network_state| is a shill network state, e.g. "shill::kStateIdle". - void SetWifiNetworkState(std::string network_state) { - network_state_test_helper_->SetServiceProperty(wifi_network_service_path_, - shill::kStateProperty, - base::Value(network_state)); - task_environment_.RunUntilIdle(); - } - - // Used in tests, after |device_activity_client_| is generated. - // Triggers the repeating timer in the client code. - void FireTimer() { - base::MockRepeatingTimer* mock_timer = - static_cast<base::MockRepeatingTimer*>( - device_activity_client_->GetReportTimer()); - if (mock_timer->IsRunning()) - mock_timer->Fire(); - - // Ensure all pending tasks after the timer fires are executed - // synchronously. - task_environment_.RunUntilIdle(); - } - - base::test::TaskEnvironment task_environment_; - - base::test::ScopedFeatureList scoped_feature_list_; - std::unique_ptr<ChurnActiveStatus> churn_active_status_; - TestingPrefServiceSimple local_state_; - scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; - network::TestURLLoaderFactory test_url_loader_factory_; - std::unique_ptr<NetworkStateTestHelper> network_state_test_helper_; - std::unique_ptr<DeviceActivityClient> device_activity_client_; - std::string wifi_network_service_path_; - base::HistogramTester histogram_tester_; - system::FakeStatisticsProvider statistics_provider_; -}; - -TEST_F(DeviceActivityClientTest, ValidateActiveUseCases) { - EXPECT_EQ(static_cast<int>(device_activity_client_->GetUseCases().size()), 4); -} - -TEST_F(DeviceActivityClientTest, - StayIdleIfSystemClockServiceUnavailableOnNetworkConnection) { - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - GetSystemClockTestInterface()->SetServiceIsAvailable(false); - GetSystemClockTestInterface()->NotifyObserversSystemClockUpdated(); - - // Network has come online. - SetWifiNetworkState(shill::kStateOnline); - - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnNetworkOnline, - 1); - - // |OnSystemClockSyncResult| is not called because the service for syncing the - // clock is unavailble. - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSystemClockSyncResult, - 0); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportUseCases, - 0); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, - StayIdleIfSystemClockIsNotNetworkSynchronized) { - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - GetSystemClockTestInterface()->SetNetworkSynchronized(false); - GetSystemClockTestInterface()->NotifyObserversSystemClockUpdated(); - - // Network has come online. - SetWifiNetworkState(shill::kStateOnline); - - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnNetworkOnline, - 1); - - // |OnSystemClockSyncResult| callback is not executed if the network is not - // synchronized. - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSystemClockSyncResult, - 0); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportUseCases, - 0); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, - CheckMembershipOnTimerRetryIfSystemClockIsNotInitiallySynced) { - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - GetSystemClockTestInterface()->SetNetworkSynchronized(false); - GetSystemClockTestInterface()->NotifyObserversSystemClockUpdated(); - - // Network has come online. - SetWifiNetworkState(shill::kStateOnline); - - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnNetworkOnline, - 1); - - // |OnSystemClockSyncResult| callback is not executed if the network is not - // synchronized. - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSystemClockSyncResult, - 0); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportUseCases, - 0); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - // Timer executes client and blocks to wait for the system clock - // synchronization result. - FireTimer(); - - // Synchronously complete pending tasks before validating histogram counts - // below. - GetSystemClockTestInterface()->SetNetworkSynchronized(true); - GetSystemClockTestInterface()->NotifyObserversSystemClockUpdated(); - task_environment_.RunUntilIdle(); - - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSystemClockSyncResult, - 1); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportUseCases, - 1); - - // Begins check membership flow. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); -} - -TEST_F(DeviceActivityClientTest, - CheckMembershipIfSystemClockServiceAvailableOnNetworkConnection) { - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - // Network has come online. - SetWifiNetworkState(shill::kStateOnline); - - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnNetworkOnline, - 1); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnSystemClockSyncResult, - 1); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientReportUseCases, - 1); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); -} - -TEST_F(DeviceActivityClientTest, DefaultStatesAreInitializedProperly) { - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_FALSE(use_case->IsLastKnownPingTimestampSet()); - } - - EXPECT_TRUE(device_activity_client_->GetReportTimer()->IsRunning()); -} - -TEST_F(DeviceActivityClientTest, NetworkRequestsUseFakeApiKey) { - // When network comes online, the device performs a check membership - // network request. - SetWifiNetworkState(shill::kStateOnline); - - network::TestURLLoaderFactory::PendingRequest* request = - test_url_loader_factory_.GetPendingRequest(0); - task_environment_.RunUntilIdle(); - - std::string api_key_header_value; - request->request.headers.GetHeader("X-Goog-Api-Key", &api_key_header_value); - - EXPECT_EQ(api_key_header_value, kFakeFresnelApiKey); -} - -// Fire timer to run |TransitionOutOfIdle|. Network is currently disconnected -// so the client is expected to go back to |kIdle| state. -TEST_F(DeviceActivityClientTest, - FireTimerWithoutNetworkKeepsClientinIdleState) { - SetWifiNetworkState(shill::kStateIdle); - FireTimer(); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, NetworkReconnectsAfterSuccessfulCheckIn) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - // Reconnecting network connection triggers |TransitionOutOfIdle|. - SetWifiNetworkState(shill::kStateIdle); - SetWifiNetworkState(shill::kStateOnline); - - // Check that no additional network requests are pending since all use cases - // have already been imported. - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); -} - -TEST_F(DeviceActivityClientTest, - CheckMembershipOnLocalStateUnsetAndPingRequired) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // On first ever ping, we begin the check membership protocol - // since the local state pref for that use case is by default unix - // epoch. - EXPECT_FALSE(use_case->IsLastKnownPingTimestampSet()); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - } - - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, CheckInOnLocalStateSetAndPingRequired) { - // Set the use cases last ping timestamps to the previous date to - // |kFakeNowTimeString|. - base::Time expected = base::Time::Now() - base::Days(1); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(expected); - } - - // Device active reporting starts check in on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // base::Time::Now() is updated in |DeviceActivityClientTest| constructor. - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), expected); - } - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, TransitionClientToIdleOnInvalidOprfResponse) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - auto use_cases = device_activity_client_->GetUseCases(); - - for (auto* use_case : use_cases) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - // Return an invalid Fresnel OPRF response. - SimulateOprfResponse(/*fresnel_oprf_response*/ std::string(), net::HTTP_OK); - - task_environment_.RunUntilIdle(); - } - - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActiveClient.CheckMembershipCases", - DeviceActivityClient::CheckMembershipResponseCases:: - kNotHasRlweOprfResponse, - use_cases.size()); -} - -TEST_F(DeviceActivityClientTest, TransitionClientToIdleOnInvalidQueryResponse) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - // Return a valid OPRF response. - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Return an invalid Query response. - SimulateQueryResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, DailyCheckInFailsButRemainingUseCasesSucceed) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // On first ever ping, we begin the check membership protocol - // since the local state pref for that use case is by default unix - // epoch. - EXPECT_FALSE(use_case->IsLastKnownPingTimestampSet()); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY) { - // Daily use case will terminate while failing to parse - // this invalid OPRF response. - SimulateOprfResponse(std::string(), net::HTTP_OK); - - task_environment_.RunUntilIdle(); - - // Failed to update the local state since the OPRF response was invalid. - EXPECT_FALSE(use_case->IsLastKnownPingTimestampSet()); - } else { - // All remaining use cases will return valid psm network request - // responses. - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - - task_environment_.RunUntilIdle(); - - // Successfully imported and updated the last ping timestamp to the - // current mocked time for this test. - EXPECT_EQ(use_case->GetLastKnownPingTimestamp(), - ConvertToPT(base::Time::Now())); - } - } - - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, SuccessfulMembershipCheckAndImport) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // On first ever ping, we begin the check membership protocol - // since the local state pref for that use case is by default unix - // epoch. - EXPECT_FALSE(use_case->IsLastKnownPingTimestampSet()); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - // Remaining use cases will return valid psm network request responses. - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - - task_environment_.RunUntilIdle(); - - // Successfully imported and updated the last ping timestamp to the - // current mocked time for this test. - EXPECT_EQ(use_case->GetLastKnownPingTimestamp(), - ConvertToPT(base::Time::Now())); - } - - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, CurrentTimeIsBeforeLocalStateTimeStamp) { - // Update last ping timestamps to a time in the future. - base::Time expected; - ASSERT_TRUE(base::Time::FromUTCString("2100-01-01 00:00:00", &expected)); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(expected); - } - - // Device active reporting is triggered by network connection. - SetWifiNetworkState(shill::kStateOnline); - - // Device pings are not required since the last ping timestamps are in the - // future. Client will stay in |kIdle| state. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, StayIdleIfTimerFiresWithoutNetworkConnected) { - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - SetWifiNetworkState(shill::kStateIdle); - FireTimer(); - - // Verify that no network requests were sent. - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, CheckInIfCheckMembershipReturnsFalse) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - base::Time prev_time = use_case->GetLastKnownPingTimestamp(); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After a PSM identifier is checked in, local state prefs is updated. - EXPECT_LT(prev_time, use_case->GetLastKnownPingTimestamp()); - } - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, NetworkDisconnectsWhileWaitingForResponse) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - // We expect the size of the use cases to be greater than 0. - EXPECT_GT(device_activity_client_->GetUseCases().size(), 0u); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - // Currently there is at least 1 pending request that has not received it's - // response. - EXPECT_GT(test_url_loader_factory_.NumPending(), 0); - - // Disconnect network. - SetWifiNetworkState(shill::kStateIdle); - - // All pending requests should be cancelled, and our device activity client - // should get set back to |kIdle|. - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, - ReportGracefullyAfterNetworkDisconnectsDuringPreviousRun) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - DeviceActiveUseCase* first_use_case = - device_activity_client_->GetUseCases().front(); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - EXPECT_NE(first_use_case->GetWindowIdentifier(), absl::nullopt); - EXPECT_NE(first_use_case->GetPsmIdentifier(), absl::nullopt); - EXPECT_NE(first_use_case->GetPsmRlweClient(), nullptr); - - // While waiting for OPRF request, simulate network disconnection. - SetWifiNetworkState(shill::kStateIdle); - - // Network offline should cancel all pending use cases, and clear the saved - // state of the attempted pings. - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Currently the use cases stores window id, psm id, and psm rlwe client - // pointer in state. - EXPECT_EQ(use_case->GetWindowIdentifier(), absl::nullopt); - EXPECT_EQ(use_case->GetPsmIdentifier(), absl::nullopt); - EXPECT_EQ(use_case->GetPsmRlweClient(), nullptr); - } - - // Return back to |kIdle| state after a successful check-in. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - // Attempt to report actives gracefully. - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - // Return back to |kIdle| state after a successful check-in. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - // Verify that |OnCheckInDone| is called for each use case. - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActivity.MethodCalled", - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityClientOnCheckInDone, - device_activity_client_->GetUseCases().size()); - - // Verify the last known ping timestamp is set for each use case. - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - } - - // Returned back to |kIdle| state after a successful check-in. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, NetworkDisconnectionClearsUseCaseState) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - // After the network comes online, the client triggers device active reporting - // for the front use case first. It will block on waiting for a response from - // the OPRF network request. At this point the window id, psm id, and psm rlwe - // client should be set by the client for just the front use case. - DeviceActiveUseCase* first_use_case = - device_activity_client_->GetUseCases().front(); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - EXPECT_NE(first_use_case->GetWindowIdentifier(), absl::nullopt); - EXPECT_NE(first_use_case->GetPsmIdentifier(), absl::nullopt); - EXPECT_NE(first_use_case->GetPsmRlweClient(), nullptr); - - // While waiting for OPRF response, simulate network disconnection. - SetWifiNetworkState(shill::kStateIdle); - - // Network offline should cancel all pending use cases, and clear the saved - // state of the attempted pings. - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Currently the use cases stores window id, psm id, and psm rlwe client - // pointer in state. - EXPECT_EQ(use_case->GetWindowIdentifier(), absl::nullopt); - EXPECT_EQ(use_case->GetPsmIdentifier(), absl::nullopt); - EXPECT_EQ(use_case->GetPsmRlweClient(), nullptr); - } - - // Return back to |kIdle| state after the network goes offline. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, CheckInAfterNextPTMidnight) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - // Return back to |kIdle| state after a successful check-in. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - task_environment_.FastForwardBy(TimeUntilNextPTMidnight()); - task_environment_.RunUntilIdle(); - - FireTimer(); - - // Check that at least 1 network request is pending since the PSM id - // has NOT been imported for the new PT period. - EXPECT_GT(test_url_loader_factory_.NumPending(), 0); - - // Verify state is |kCheckingIn| since local state was updated - // with the last check in timestamp during the previous day check ins. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - // Return well formed Import response body for the daily and nday use cases. - // The time was forwarded by 1 day, which only require daily and nday use - // cases to report active again. - for (auto* use_case : device_activity_client_->GetUseCases()) { - psm_rlwe::RlweUseCase psm_use_case = use_case->GetPsmUseCase(); - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(psm_use_case)); - if (psm_use_case == psm_rlwe::RlweUseCase::CROS_FRESNEL_DAILY || - psm_use_case == psm_rlwe::RlweUseCase::CROS_FRESNEL_28DAY_ACTIVE) { - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - } - - // Return back to |kIdle| state after another successful check-in of - // the daily and nday use cases. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, DoNotCheckInTwiceBeforeNextPTDay) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - // Return back to |kIdle| state after the first successful check-in. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - base::TimeDelta before_pt_meridian = - TimeUntilNextPTMidnight() - base::Minutes(1); - task_environment_.FastForwardBy(before_pt_meridian); - task_environment_.RunUntilIdle(); - - // Trigger attempt to report device active. - FireTimer(); - - // Client should not send network requests since device is still in same - // PT day. - EXPECT_EQ(test_url_loader_factory_.NumPending(), 0); - - // Remains in |kIdle| state since the device is still in same PT day. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, CheckInAfterNextPTMonth) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - // Return back to |kIdle| state after a successful check-in. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); - - task_environment_.FastForwardBy(TimeUntilNewPTMonth()); - task_environment_.RunUntilIdle(); - - FireTimer(); - - // Check that at least 1 network request is pending since the PSM id - // has NOT been imported for the new PT period. - EXPECT_GT(test_url_loader_factory_.NumPending(), 0); - - // Verify state is |kCheckingIn| since local state was updated - // with the last check in timestamp during the previous day check ins. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - // Return well formed Import response body. - // The time was forwarded to a new month, which means the daily and 28DA - // use cases will report active again. - for (auto* use_case : device_activity_client_->GetUseCases()) { - psm_rlwe::RlweUseCase psm_use_case = use_case->GetPsmUseCase(); - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(psm_use_case)); - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - // Return back to |kIdle| state after successful check-in of daily use case. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -// Powerwashing a device resets the local state. This will result in the -// client re-importing a PSM ID, on the same day. -TEST_F(DeviceActivityClientTest, CheckInAgainOnLocalStateReset) { - // Device active reporting starts check membership on network connect. - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - base::Time prev_time = use_case->GetLastKnownPingTimestamp(); - - // Mock Successful |kCheckingMembershipOprf|. - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Mock Successful |kCheckingMembershipQuery|. - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Mock Successful |kCheckingIn|. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - base::Time new_time = use_case->GetLastKnownPingTimestamp(); - - // After a PSM identifier is checked in, local state prefs is updated. - EXPECT_LT(prev_time, new_time); - } - - // Simulate powerwashing device by removing related local state prefs. - SimulateLocalStateOnPowerwash(); - - // Retrigger |TransitionOutOfIdle| codepath by either firing timer or - // reconnecting network. - FireTimer(); - - // Verify each use case performs check in successfully after local state prefs - // is reset. - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Verify that the |kCheckingIn| state is reached. - // Indicator is used to verify that we are checking in the PSM ID again - // after powerwash/recovery scenario. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingMembershipOprf); - - base::Time prev_time = use_case->GetLastKnownPingTimestamp(); - - // Mock Successful |kCheckingMembershipOprf|. - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Mock Successful |kCheckingMembershipQuery|. - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Mock Successful |kCheckingIn|. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - base::Time new_time = use_case->GetLastKnownPingTimestamp(); - - // After a PSM identifier is checked in, local state prefs is updated. - EXPECT_LT(prev_time, new_time); - } - - // Transitions back to |kIdle| state. - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kIdle); -} - -TEST_F(DeviceActivityClientTest, InitialUmaHistogramStateCount) { - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActiveClient.StateCount", - DeviceActivityClient::State::kCheckingMembershipOprf, 0); - histogram_tester_.ExpectBucketCount( - "Ash.DeviceActiveClient.StateCount", - DeviceActivityClient::State::kCheckingMembershipQuery, 0); - histogram_tester_.ExpectBucketCount("Ash.DeviceActiveClient.StateCount", - DeviceActivityClient::State::kCheckingIn, - 0); -} - -TEST_F(DeviceActivityClientTest, UmaHistogramStateCountAfterFirstCheckIn) { - // Device active reporting starts membership check on network connect. - SetWifiNetworkState(shill::kStateOnline); - - std::vector<DeviceActiveUseCase*> use_cases = - device_activity_client_->GetUseCases(); - - for (auto* use_case : use_cases) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - // Mock Successful |kCheckingMembershipOprf|. - SimulateOprfResponse(GetFresnelOprfResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Mock Successful |kCheckingMembershipQuery|. - SimulateQueryResponse(GetFresnelQueryResponse(GetPsmNonMemberTestCase()), - net::HTTP_OK); - - // Mock Successful |kCheckingIn|. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - histogram_tester_.ExpectBucketCount("Ash.DeviceActiveClient.StateCount", - DeviceActivityClient::State::kCheckingIn, - use_cases.size()); -} - -TEST_F(DeviceActivityClientTest, - UpdateChurnActiveStatusAfterChurnCohortCheckIn) { - // The decimal representation of the bit string `100010001000000000000001101` - // The first 10 bits represent the number of months since 2000 is 273, which - // represents the 2022-10. - // The right 18 bits represent the churn cohort active status for past 18 - // months. The right most bit represents the status of previous active mont, - // in this case, it represent 2022-10. And the second right most bit - // represents 2022-09, etc. - int kFakeBeforeChurnActiveStatus = 71565325; - int kFakeAfterChurnActvieStatus = 72351849; - - // Set the past ping month to 2022-10. - base::Time new_daily_ts = base::Time::Now() - base::Days(70); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-10, months is 273 - // Current Churn Cohort month is: 2023-01, months is 276 - // 273->276: 0100010001->0100010100 - // 2022-10 active value: 71565325 -> 0100010001 000000000000001101 - // 2023-01 active value: 72351849 -> 0100010100 000000000001101001 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActvieStatus); -} - -TEST_F(DeviceActivityClientTest, ChurnActiveStatusTest) { - int kFakeBeforeChurnActiveStatus = 71565325; - int kFakeAfterChurnActiveStatus = 72351849; - - // Set the past ping month to 2022-10. - base::Time new_daily_ts = base::Time::Now() - base::Days(70); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-10, months is 273 - // Current Churn Cohort month is: 2023-01, months is 276 - // 273->276: 0100010001->0100010100 - // 2022-10 active value: 71565325 -> 0100010001 000000000000001101 - // 2023-01 active value: 72351849 -> 0100010100 000000000001101001 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus); - - private_computing::SaveStatusRequest save_request = - device_activity_client_->GetSaveStatusRequest(); - for (auto status : save_request.active_status()) { - if (status.use_case() == private_computing::PrivateComputingUseCase:: - CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - EXPECT_EQ(status.churn_active_status(), kFakeAfterChurnActiveStatus); - } - } -} - -TEST_F(DeviceActivityClientTest, ReportAgainAfterThreeMonths) { - int kFakeBeforeChurnActiveStatus = 71565325; - int kFakeAfterChurnActiveStatus = 72351849; - - // Set the past ping month to 2022-10. - base::Time new_daily_ts = base::Time::Now() - base::Days(70); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Set the relative observation local state booleans to all be true. - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, true); - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-10, months is 273 - // Current Churn Cohort month is: 2023-01, months is 276 - // 273->276: 0100010001->0100010100 - // 2022-10 active value: 71565325 -> 0100010001 000000000000001101 - // 2023-01 active value: 72351849 -> 0100010100 000000000001101001 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - // Before cohort import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After cohort import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - // Before observation import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After observation import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else { - // Successfully import for all remaining use cases. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus); -} - -TEST_F(DeviceActivityClientTest, ReportAgainAfterTwoMonths) { - int kFakeBeforeChurnActiveStatus = 71827469; - int kFakeAfterChurnActiveStatus = 72351797; - - // Set the past ping month to 2022-11. - base::Time new_daily_ts = base::Time::Now() - base::Days(40); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Set the relative observation local state booleans to all be true. - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, true); - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-11, months is 274 - // Current Churn Cohort month is: 2023-01, months is 276 - // 274->276: 0100010010->0100010100 - // 2022-11 active value: 71827469 -> 0100010010 000000000000001101 - // 2023-01 active value: 72351797 -> 0100010100 000000000000110101 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - // Before cohort import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After cohort import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - // Before observation import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After observation import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else { - // Successfully import for all remaining use cases. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus); -} - -TEST_F(DeviceActivityClientTest, ReportAgainAfterOneMonth) { - int kFakeBeforeChurnActiveStatus = 72089613; - int kFakeAfterChurnActiveStatus = 72351771; - - // Set the past ping month to 2022-12. - base::Time new_daily_ts = base::Time::Now() - base::Days(10); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Set the relative observation local state booleans to all be true. - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, true); - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-12, months is 275 - // Current Churn Cohort month is: 2023-01, months is 276 - // 275->276: 0100010011->0100010100 - // 2022-12 active value: 72089613 -> 0100010011 000000000000001101 - // 2023-01 active value: 72351771 -> 0100010100 000000000000011011 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - // Before cohort import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After cohort import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - // Before observation import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After observation import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else { - // Successfully import for all remaining use cases. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus); -} - -TEST_F(DeviceActivityClientTest, - ObservationPeriodGeneratedAfterNewCohortMonth) { - int kFakeBeforeChurnActiveStatus = 72089613; - int kFakeAfterChurnActiveStatus = 72351771; - - // Set the past ping month to 2022-12. - base::Time new_daily_ts = base::Time::Now() - base::Days(10); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Set the relative observation local state booleans to all be true. - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, true); - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-12, months is 275 - // Current Churn Cohort month is: 2023-01, months is 276 - // 275->276: 0100010011->0100010100 - // 2022-12 active value: 72089613 -> 0100010011 000000000000001101 - // 2023-01 active value: 72351771 -> 0100010100 000000000000011011 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - EXPECT_TRUE(use_case->IsLastKnownPingTimestampSet()); - - EXPECT_EQ(device_activity_client_->GetState(), - DeviceActivityClient::State::kCheckingIn); - - if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - // Before cohort import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After cohort import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - // Before observation import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_EQ(use_case->GetObservationPeriod(0), "202301-202303"); - EXPECT_EQ(use_case->GetObservationPeriod(1), std::string()); - EXPECT_EQ(use_case->GetObservationPeriod(2), std::string()); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After observation import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else { - // Successfully import for all remaining use cases. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus); -} - -TEST_F(DeviceActivityClientTest, ValidateObservationPeriodForUnsetLocalState) { - int kFakeBeforeChurnActiveStatus = 72089613; - int kFakeAfterChurnActiveStatus = 72351771; - - // Set the past ping month to 2022-12. - base::Time new_daily_ts = base::Time::Now() - base::Days(10); - for (auto* use_case : device_activity_client_->GetUseCases()) { - use_case->SetLastKnownPingTimestamp(new_daily_ts); - } - - // Set the relative observation local state booleans. - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, false); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, true); - GetLocalState()->SetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, false); - - // Initialize the churn_active_value to kFakeBeforeChurnActiveStatus. - churn_active_status_->SetValue(kFakeBeforeChurnActiveStatus); - - // Last Churn Cohort month is: 2022-12, months is 275 - // Current Churn Cohort month is: 2023-01, months is 276 - // 275->276: 0100010011->0100010100 - // 2022-12 active value: 72089613 -> 0100010011 000000000000001101 - // 2023-01 active value: 72351771 -> 0100010100 000000000000011011 - - SetWifiNetworkState(shill::kStateOnline); - - for (auto* use_case : device_activity_client_->GetUseCases()) { - SCOPED_TRACE(testing::Message() - << "PSM use case: " - << psm_rlwe::RlweUseCase_Name(use_case->GetPsmUseCase())); - - if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_COHORT) { - // Before cohort import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After cohort import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else if (use_case->GetPsmUseCase() == - psm_rlwe::RlweUseCase::CROS_FRESNEL_CHURN_MONTHLY_OBSERVATION) { - // Before observation import request. - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_FALSE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - EXPECT_EQ(use_case->GetObservationPeriod(0), "202301-202303"); - EXPECT_EQ(use_case->GetObservationPeriod(1), "202212-202302"); - EXPECT_EQ(use_case->GetObservationPeriod(2), std::string()); - - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - - // After observation import request. - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1)); - EXPECT_TRUE(GetLocalState()->GetBoolean( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2)); - } else { - // Successfully import for all remaining use cases. - SimulateImportResponse(std::string(), net::HTTP_OK); - task_environment_.RunUntilIdle(); - } - - EXPECT_GE(use_case->GetLastKnownPingTimestamp(), new_daily_ts); - } - - // Check the new churn active status after ping. - int updated_active_status_value = churn_active_status_->GetValueAsInt(); - EXPECT_EQ(updated_active_status_value, kFakeAfterChurnActiveStatus); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_activity_controller.cc b/chromeos/ash/components/device_activity/device_activity_controller.cc deleted file mode 100644 index 25552bf..0000000 --- a/chromeos/ash/components/device_activity/device_activity_controller.cc +++ /dev/null
@@ -1,401 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/device_activity_controller.h" - -#include "base/check_op.h" -#include "base/metrics/histogram_functions.h" -#include "base/rand_util.h" -#include "base/task/single_thread_task_runner.h" -#include "base/task/task_traits.h" -#include "base/task/thread_pool.h" -#include "base/time/time.h" -#include "base/timer/timer.h" -#include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" -#include "chromeos/ash/components/device_activity/churn_cohort_use_case_impl.h" -#include "chromeos/ash/components/device_activity/churn_observation_use_case_impl.h" -#include "chromeos/ash/components/device_activity/daily_use_case_impl.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "chromeos/ash/components/device_activity/device_activity_client.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h" -#include "chromeos/ash/components/network/network_state.h" -#include "chromeos/ash/components/network/network_state_handler.h" -#include "components/prefs/pref_registry_simple.h" -#include "components/prefs/pref_service.h" -#include "components/version_info/channel.h" -#include "google_apis/google_api_keys.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { -DeviceActivityController* g_ash_device_activity_controller = nullptr; - -// Policy device modes that should be classified as not being set. -static const std::unordered_set<policy::DeviceMode>& DeviceModeNotSet() { - static const std::unordered_set<policy::DeviceMode> kModeNotSet( - {policy::DeviceMode::DEVICE_MODE_PENDING, - policy::DeviceMode::DEVICE_MODE_NOT_SET}); - return kModeNotSet; -} - -// Policy device modes that should be classified as consumer devices. -static const std::unordered_set<policy::DeviceMode>& DeviceModeConsumer() { - static const std::unordered_set<policy::DeviceMode> kModeConsumer( - {policy::DeviceMode::DEVICE_MODE_CONSUMER, - policy::DeviceMode::DEVICE_MODE_CONSUMER_KIOSK_AUTOLAUNCH}); - return kModeConsumer; -} - -// Policy device modes that should be classified as enterprise devices. -static const std::unordered_set<policy::DeviceMode>& DeviceModeEnterprise() { - static const std::unordered_set<policy::DeviceMode> kModeEnterprise( - {policy::DeviceMode::DEVICE_MODE_ENTERPRISE, - policy::DeviceMode::DEVICE_MODE_DEMO}); - return kModeEnterprise; -} - -// Production edge server for reporting device actives. -// TODO(https://crbug.com/1267432): Enable passing base url as a runtime flag. -const char kFresnelBaseUrl[] = "https://crosfresnel-pa.googleapis.com"; - -// Number of minutes to wait before retrying -// reading the .oobe_completed file again. -constexpr base::TimeDelta kOobeReadFailedRetryDelay = base::Minutes(60); - -// Number of times to retry before failing to report any device actives. -constexpr int kNumberOfRetriesBeforeFail = 120; - -// Count the number of PSM device active secret that is set. -const char kDeviceActiveControllerPsmDeviceActiveSecretIsSet[] = - "Ash.DeviceActiveController.PsmDeviceActiveSecretIsSet"; - -// Count the number of devices that are testimage builds. -const char kDeviceActiveControllerIsTestImageDevice[] = - "Ash.DeviceActiveController.IsTestImageDevice"; - -void RecordPsmDeviceActiveSecretIsSet(bool is_set) { - base::UmaHistogramBoolean(kDeviceActiveControllerPsmDeviceActiveSecretIsSet, - is_set); -} - -void RecordIsTestImageDevice(bool is_test_image) { - base::UmaHistogramBoolean(kDeviceActiveControllerIsTestImageDevice, - is_test_image); -} - -class PsmDelegateImpl : public PsmDelegateInterface { - public: - PsmDelegateImpl() = default; - PsmDelegateImpl(const PsmDelegateImpl&) = delete; - PsmDelegateImpl& operator=(const PsmDelegateImpl&) = delete; - ~PsmDelegateImpl() override = default; - - // PsmDelegateInterface: - rlwe::StatusOr<std::unique_ptr<psm_rlwe::PrivateMembershipRlweClient>> - CreatePsmClient( - psm_rlwe::RlweUseCase use_case, - const std::vector<psm_rlwe::RlwePlaintextId>& plaintext_ids) override { - return psm_rlwe::PrivateMembershipRlweClient::Create(use_case, - plaintext_ids); - } -}; - -} // namespace - -DeviceActivityController* DeviceActivityController::Get() { - return g_ash_device_activity_controller; -} - -// static -void DeviceActivityController::RegisterPrefs(PrefRegistrySimple* registry) { - const base::Time unix_epoch = base::Time::UnixEpoch(); - registry->RegisterTimePref(prefs::kDeviceActiveLastKnownDailyPingTimestamp, - unix_epoch); - registry->RegisterTimePref( - prefs::kDeviceActiveLastKnown28DayActivePingTimestamp, unix_epoch); - registry->RegisterTimePref( - prefs::kDeviceActiveChurnCohortMonthlyPingTimestamp, unix_epoch); - registry->RegisterTimePref( - prefs::kDeviceActiveChurnObservationMonthlyPingTimestamp, unix_epoch); - registry->RegisterIntegerPref(prefs::kDeviceActiveLastKnownChurnActiveStatus, - 0); - registry->RegisterBooleanPref( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0, false); - registry->RegisterBooleanPref( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1, false); - registry->RegisterBooleanPref( - prefs::kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2, false); -} - -// static -base::TimeDelta DeviceActivityController::DetermineStartUpDelay( - base::Time chrome_first_run_ts) { - // Wait at least 10 minutes from the first chrome run sentinel file creation - // time. This creation time is used as an indicator of when the device last - // reset (powerwashed/recovery/RMA). PSM servers take 10 minutes from CheckIn - // to return the correct response for CheckMembership requests, since the PSM - // servers need to update their cache. - // - // This delay avoids the scenario where a device checks in, powerwashes, and - // on device start up, gets the wrong check membership response. - base::TimeDelta delay_on_first_chrome_run; - base::Time current_ts = base::Time::Now(); - if (current_ts < (chrome_first_run_ts + base::Minutes(10))) { - delay_on_first_chrome_run = - chrome_first_run_ts + base::Minutes(10) - current_ts; - } - - return delay_on_first_chrome_run; -} - -// static -MarketSegment DeviceActivityController::GetMarketSegment( - policy::DeviceMode device_mode, - policy::MarketSegment device_market_segment) { - // Determine Fresnel market segment using the retrieved device policy - // |device_mode| and |device_market_segment|. - if (DeviceModeNotSet().count(device_mode)) { - return MARKET_SEGMENT_UNKNOWN; - } - - if (DeviceModeConsumer().count(device_mode)) { - return MARKET_SEGMENT_CONSUMER; - } - - if (DeviceModeEnterprise().count(device_mode)) { - if (device_market_segment == policy::MarketSegment::ENTERPRISE) { - return MARKET_SEGMENT_ENTERPRISE; - } - - if (device_market_segment == policy::MarketSegment::EDUCATION) { - return MARKET_SEGMENT_EDUCATION; - } - - return MARKET_SEGMENT_ENTERPRISE_ENROLLED_BUT_UNKNOWN; - } - - return MARKET_SEGMENT_UNKNOWN; -} - -DeviceActivityController::DeviceActivityController( - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::Time chrome_first_run_time, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback) - : chrome_first_run_time_(chrome_first_run_time), - chrome_passed_device_params_(chrome_passed_device_params), - statistics_provider_(system::StatisticsProvider::GetInstance()), - oobe_completed_timer_(std::make_unique<base::OneShotTimer>()) { - DeviceActivityClient::RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityControllerConstructor); - - DCHECK(local_state); - DCHECK(!g_ash_device_activity_controller); - - g_ash_device_activity_controller = this; - - // Halt if device is a testimage/unknown channel. - if (chrome_passed_device_params.chromeos_channel == - version_info::Channel::UNKNOWN) { - RecordIsTestImageDevice(true); - LOG(ERROR) << "Halt - Client should enter device active reporting logic. " - << "Unknown and test image channels should not be counted as " - << "legitimate device counts."; - return; - } else { - RecordIsTestImageDevice(false); - } - - // Check if active status value is set in local state. If not set, we will - // attempt to restore from preserved file in the device activity client. - // If set, override the |churn_active_status_|. If both layers of caching - // is empty, we will perform check membership requests on the cohort requests - // (contains active status objects) to determine the last known value. - int churn_active_value = - local_state->GetInteger(prefs::kDeviceActiveLastKnownChurnActiveStatus); - if (churn_active_value == 0) { - LOG(ERROR) << "Active status is not set in the local state."; - LOG(ERROR) << "Setting value for |churn_active_status_ptr_| to 0."; - } - - churn_active_status_.SetValue(churn_active_value); - - base::SingleThreadTaskRunner::GetCurrentDefault()->PostDelayedTask( - FROM_HERE, - base::BindOnce(&device_activity::DeviceActivityController::Start, - weak_factory_.GetWeakPtr(), local_state, - url_loader_factory, - std::move(check_oobe_completed_callback)), - DeviceActivityController::DetermineStartUpDelay(chrome_first_run_time)); -} - -DeviceActivityController::~DeviceActivityController() { - DeviceActivityClient::RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityControllerDestructor); - DCHECK_EQ(this, g_ash_device_activity_controller); - Stop(); - g_ash_device_activity_controller = nullptr; -} - -int DeviceActivityController::GetRetryOobeCompletedCountForTesting() const { - return retry_oobe_completed_count_; -} - -base::OneShotTimer* -DeviceActivityController::GetOobeCompletedTimerForTesting() { - DCHECK(oobe_completed_timer_.get() != nullptr); - return oobe_completed_timer_.get(); -} - -void DeviceActivityController::Start( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback) { - DeviceActivityClient::RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityControllerStart); - - CheckOobeCompletedInWorker(local_state, url_loader_factory, - std::move(check_oobe_completed_callback)); -} - -void DeviceActivityController::Stop() { - if (da_client_network_) { - da_client_network_.reset(); - } -} - -void DeviceActivityController::CheckOobeCompletedInWorker( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback) { - base::ThreadPool::PostTaskAndReplyWithResult( - FROM_HERE, - {base::MayBlock(), base::TaskPriority::BEST_EFFORT, - base::TaskShutdownBehavior::SKIP_ON_SHUTDOWN}, - base::BindOnce(check_oobe_completed_callback), - base::BindOnce(&DeviceActivityController::OnOobeFileWritten, - weak_factory_.GetWeakPtr(), local_state, - url_loader_factory, check_oobe_completed_callback)); -} - -void DeviceActivityController::OnOobeFileWritten( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, - base::TimeDelta time_since_oobe_file_written) { - // We block if the oobe completed file is not written. - // ChromeOS devices should go through oobe to be considered a real device. - // The ActivateDate is also only set after oobe is written. - if (retry_oobe_completed_count_ >= kNumberOfRetriesBeforeFail) { - LOG(ERROR) << "Retry failed - .oobe_completed file was not written for " - << "1 minute after retrying 120 times. " - << "There was a 60 minute wait between each retry and spanned " - << "5 days."; - return; - } - - if (time_since_oobe_file_written < base::Minutes(1)) { - retry_oobe_completed_count_ += 1; - - LOG(ERROR) << "Time since oobe file created was less than 1 minute. " - << std::endl - << "Wait and retry again after 1 minute to ensure that " - << "the ActivateDate VPD field is set. " << std::endl - << "TimeDelta since oobe flag file was created = " - << time_since_oobe_file_written - << ". Retry count = " << retry_oobe_completed_count_; - - oobe_completed_timer_->Start( - FROM_HERE, kOobeReadFailedRetryDelay, - base::BindOnce(&DeviceActivityController::CheckOobeCompletedInWorker, - weak_factory_.GetWeakPtr(), local_state, - url_loader_factory, - std::move(check_oobe_completed_callback))); - - return; - } - - // Wrap with callback from |psm_device_active_secret_| retrieval using - // |SessionManagerClient| DBus. - SessionManagerClient::Get()->GetPsmDeviceActiveSecret(base::BindOnce( - &device_activity::DeviceActivityController:: - OnPsmDeviceActiveSecretFetched, - weak_factory_.GetWeakPtr(), local_state, url_loader_factory)); -} - -void DeviceActivityController::OnPsmDeviceActiveSecretFetched( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - const std::string& psm_device_active_secret) { - DeviceActivityClient::RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityControllerOnPsmDeviceActiveSecretFetched); - - // In order for the device actives to be reported, the psm device active - // secret must be retrieved successfully. - if (psm_device_active_secret.empty()) { - RecordPsmDeviceActiveSecretIsSet(false); - VLOG(1) << "Can not generate PSM id without the psm device secret " - "being defined."; - return; - } - - RecordPsmDeviceActiveSecretIsSet(true); - - // Continue when machine statistics are loaded, to avoid blocking. - statistics_provider_->ScheduleOnMachineStatisticsLoaded(base::BindOnce( - &device_activity::DeviceActivityController::OnMachineStatisticsLoaded, - weak_factory_.GetWeakPtr(), local_state, url_loader_factory, - psm_device_active_secret)); -} - -void DeviceActivityController::OnMachineStatisticsLoaded( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - const std::string& psm_device_active_secret) { - DeviceActivityClient::RecordDeviceActivityMethodCalled( - DeviceActivityClient::DeviceActivityMethod:: - kDeviceActivityControllerOnMachineStatisticsLoaded); - - // Block virtual machines and debug builds (dev mode enabled). - if (statistics_provider_->IsRunningOnVm() || - statistics_provider_->IsCrosDebugMode()) { - LOG(ERROR) << "Terminate - device is running in VM or with cros_debug mode " - "enabled."; - return; - } - - std::vector<std::unique_ptr<DeviceActiveUseCase>> use_cases; - use_cases.push_back(std::make_unique<DailyUseCaseImpl>( - psm_device_active_secret, chrome_passed_device_params_, local_state, - std::make_unique<PsmDelegateImpl>())); - use_cases.push_back(std::make_unique<TwentyEightDayActiveUseCaseImpl>( - psm_device_active_secret, chrome_passed_device_params_, local_state, - std::make_unique<PsmDelegateImpl>())); - use_cases.push_back(std::make_unique<ChurnCohortUseCaseImpl>( - &churn_active_status_, psm_device_active_secret, - chrome_passed_device_params_, local_state, - std::make_unique<PsmDelegateImpl>())); - use_cases.push_back(std::make_unique<ChurnObservationUseCaseImpl>( - &churn_active_status_, psm_device_active_secret, - chrome_passed_device_params_, local_state, - std::make_unique<PsmDelegateImpl>())); - - da_client_network_ = std::make_unique<DeviceActivityClient>( - &churn_active_status_, local_state, - NetworkHandler::Get()->network_state_handler(), url_loader_factory, - std::make_unique<base::RepeatingTimer>(), kFresnelBaseUrl, - google_apis::GetFresnelAPIKey(), chrome_first_run_time_, - std::move(use_cases)); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/device_activity_controller.h b/chromeos/ash/components/device_activity/device_activity_controller.h deleted file mode 100644 index ead6f0a0..0000000 --- a/chromeos/ash/components/device_activity/device_activity_controller.h +++ /dev/null
@@ -1,133 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVITY_CONTROLLER_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVITY_CONTROLLER_H_ - -#include <memory> - -#include "base/component_export.h" -#include "base/memory/raw_ptr.h" -#include "base/time/time.h" -#include "base/timer/timer.h" -#include "chromeos/ash/components/device_activity/churn_active_status.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "chromeos/ash/components/system/statistics_provider.h" -#include "components/policy/core/common/cloud/cloud_policy_constants.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" - -class PrefRegistrySimple; -class PrefService; - -namespace version_info { -enum class Channel; -} // namespace version_info - -namespace ash::device_activity { - -class DeviceActivityClient; - -struct ChromeDeviceMetadataParameters; - -// Counts device actives in a privacy compliant way. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - DeviceActivityController { - public: - // Retrieves a singleton instance. - static DeviceActivityController* Get(); - - // Registers local state preferences. - static void RegisterPrefs(PrefRegistrySimple* registry); - - // Determines the total start up delay before starting device activity - // reporting. - static base::TimeDelta DetermineStartUpDelay(base::Time chrome_first_run_ts); - - // Determines the market segment from the loaded ChromeOS device policies. - static MarketSegment GetMarketSegment( - policy::DeviceMode device_mode, - policy::MarketSegment device_market_segment); - - DeviceActivityController( - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::Time chrome_first_run_time, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback); - DeviceActivityController(const DeviceActivityController&) = delete; - DeviceActivityController& operator=(const DeviceActivityController&) = delete; - ~DeviceActivityController(); - - // Testing methods to validate behaviour of class. - int GetRetryOobeCompletedCountForTesting() const; - base::OneShotTimer* GetOobeCompletedTimerForTesting(); - - private: - // Start Device Activity reporting. - void Start( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback); - - // Stop Device Activity reporting. - void Stop(); - - // Wrapper method for the PostTaskAndReplyWithResult, which is used to spawn - // a worker thread to check oobe completed file time delta. - void CheckOobeCompletedInWorker( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback); - - // Retry method every kOobeReadFailedRetryDelay minute until confirming - // 1 minute has passed since /home/chronos/.oobe_completed file was written. - // Maximum retry count is kNumberOfRetriesBeforeFail. - void OnOobeFileWritten( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback, - base::TimeDelta time_since_oobe_file_written); - - void OnPsmDeviceActiveSecretFetched( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - const std::string& psm_device_active_secret); - - void OnMachineStatisticsLoaded( - PrefService* local_state, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - const std::string& psm_device_active_secret); - - // ChurnActiveStatus object stores the active history for the device. - // This bit value will be persisted in local state and preserved files. - ChurnActiveStatus churn_active_status_; - - // Reads the creation time of the first run sentinel file. If the first run - // sentinel file does not exist, it will return base::Time(). - const base::Time chrome_first_run_time_; - - // Creates a copy of chrome parameters, which is owned throughout - // |DeviceActivityController| object lifetime. - const ChromeDeviceMetadataParameters chrome_passed_device_params_; - - // Singleton lives throughout class lifetime. - const raw_ptr<system::StatisticsProvider, ExperimentalAsh> - statistics_provider_; - - // Number of retry attempts at reading the oobe completed file. - int retry_oobe_completed_count_ = 0; - - // Timer used to retry reading oobe_completed file. - std::unique_ptr<base::OneShotTimer> oobe_completed_timer_; - - std::unique_ptr<DeviceActivityClient> da_client_network_; - - // Automatically cancels callbacks when the referent of weakptr gets - // destroyed. - base::WeakPtrFactory<DeviceActivityController> weak_factory_{this}; -}; - -} // namespace ash::device_activity - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_DEVICE_ACTIVITY_CONTROLLER_H_
diff --git a/chromeos/ash/components/device_activity/device_activity_controller_unittest.cc b/chromeos/ash/components/device_activity/device_activity_controller_unittest.cc deleted file mode 100644 index eeeb9ad..0000000 --- a/chromeos/ash/components/device_activity/device_activity_controller_unittest.cc +++ /dev/null
@@ -1,162 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/device_activity_controller.h" - -#include "base/test/task_environment.h" -#include "base/time/time.h" -#include "base/timer/mock_timer.h" -#include "chromeos/ash/components/dbus/session_manager/session_manager_client.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/policy/core/common/cloud/cloud_policy_constants.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" -#include "services/network/test/test_shared_url_loader_factory.h" -#include "services/network/test/test_url_loader_factory.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace ash::device_activity { - -namespace { - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -// Number of times to retry before failing to report any device actives. -constexpr int kNumberOfRetriesBeforeFail = 120; - -} // namespace - -class DeviceActivityControllerTest : public testing::Test { - public: - // Create a fake callback that returns successful TimeDelta - // time since oobe file written of 1 minute. - DeviceActivityControllerTest() - : DeviceActivityControllerTest( - base::BindRepeating([]() { return base::Minutes(1); })) {} - explicit DeviceActivityControllerTest( - base::RepeatingCallback<base::TimeDelta()> check_oobe_completed_callback) - : oobe_completed_callback_(std::move(check_oobe_completed_callback)), - task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} - DeviceActivityControllerTest(const DeviceActivityControllerTest&) = delete; - DeviceActivityControllerTest& operator=(const DeviceActivityControllerTest&) = - delete; - ~DeviceActivityControllerTest() override = default; - - TestingPrefServiceSimple* local_state() { return &local_state_; } - - DeviceActivityController* GetDeviceActivityController() { - return device_activity_controller_.get(); - } - - protected: - // testing::Test: - void SetUp() override { - SessionManagerClient::InitializeFake(); - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - DeviceActivityController::RegisterPrefs(local_state()->registry()); - - test_shared_loader_factory_ = - base::MakeRefCounted<network::WeakWrapperSharedURLLoaderFactory>( - &test_url_loader_factory_); - - device_activity_controller_ = std::make_unique<DeviceActivityController>( - kFakeChromeParameters, local_state(), test_shared_loader_factory_, - /* first_run_sentinel_time*/ base::Time(), oobe_completed_callback_); - - // Continue execution of the Start method since there is no start up delay - // in the post delay task. - RunUntilIdle(); - } - - void TearDown() override { device_activity_controller_.reset(); } - - void RunUntilIdle() { task_environment_.RunUntilIdle(); } - - private: - // The repeating callback is owned by this test class. - base::RepeatingCallback<base::TimeDelta()> oobe_completed_callback_; - - base::test::TaskEnvironment task_environment_; - - std::unique_ptr<DeviceActivityController> device_activity_controller_; - - system::FakeStatisticsProvider statistics_provider_; - TestingPrefServiceSimple local_state_; - scoped_refptr<network::SharedURLLoaderFactory> test_shared_loader_factory_; - network::TestURLLoaderFactory test_url_loader_factory_; -}; - -TEST_F(DeviceActivityControllerTest, - CheckDeviceActivityControllerSingletonInitialized) { - EXPECT_NE(DeviceActivityController::Get(), nullptr); -} - -TEST_F(DeviceActivityControllerTest, - CheckLocalStatePingTimestampsInitializedToUnixEpoch) { - base::Time daily_ts = - local_state()->GetTime(prefs::kDeviceActiveLastKnownDailyPingTimestamp); - EXPECT_EQ(daily_ts, base::Time::UnixEpoch()); - - base::Time cohort_monthly_ts = local_state()->GetTime( - prefs::kDeviceActiveChurnCohortMonthlyPingTimestamp); - EXPECT_EQ(cohort_monthly_ts, base::Time::UnixEpoch()); - - base::Time observation_monthly_ts = local_state()->GetTime( - prefs::kDeviceActiveChurnObservationMonthlyPingTimestamp); - EXPECT_EQ(observation_monthly_ts, base::Time::UnixEpoch()); -} - -TEST_F(DeviceActivityControllerTest, - CheckOobeCompletedFileSuccessfullyWritten) { - // Validate that there were no retries with the |oobe_completed_callback_| - // being successful. - EXPECT_EQ( - GetDeviceActivityController()->GetRetryOobeCompletedCountForTesting(), 0); -} - -class DeviceActivityControllerOobeFileRetryFailsTest - : public DeviceActivityControllerTest { - public: - // Create a fake callback that retry oobe check kNumberOfRetriesBeforeFail - // times and fails. It fails by returning empty TimeDelta object. - DeviceActivityControllerOobeFileRetryFailsTest() - : DeviceActivityControllerTest( - base::BindRepeating([]() { return base::TimeDelta(); })) {} - DeviceActivityControllerOobeFileRetryFailsTest( - const DeviceActivityControllerOobeFileRetryFailsTest&) = delete; - DeviceActivityControllerOobeFileRetryFailsTest& operator=( - const DeviceActivityControllerOobeFileRetryFailsTest&) = delete; - ~DeviceActivityControllerOobeFileRetryFailsTest() override = default; -}; - -TEST_F(DeviceActivityControllerOobeFileRetryFailsTest, - StopReportingIfOobeFileFailedToBeWritten) { - base::OneShotTimer* timer = - GetDeviceActivityController()->GetOobeCompletedTimerForTesting(); - - for (int retry_count = 1; retry_count <= kNumberOfRetriesBeforeFail; - retry_count++) { - // Attempt at reading file failed. - EXPECT_EQ( - GetDeviceActivityController()->GetRetryOobeCompletedCountForTesting(), - retry_count); - - // Retry, which happens after 1 hour on "real" devices. - timer->FireNow(); - RunUntilIdle(); - } - - EXPECT_EQ( - GetDeviceActivityController()->GetRetryOobeCompletedCountForTesting(), - kNumberOfRetriesBeforeFail); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/fake_psm_delegate.cc b/chromeos/ash/components/device_activity/fake_psm_delegate.cc deleted file mode 100644 index 3393e46..0000000 --- a/chromeos/ash/components/device_activity/fake_psm_delegate.cc +++ /dev/null
@@ -1,29 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -FakePsmDelegate::FakePsmDelegate( - const std::string& ec_cipher_key, - const std::string& seed, - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids) - : ec_cipher_key_(ec_cipher_key), - seed_(seed), - plaintext_ids_(plaintext_ids) {} - -FakePsmDelegate::~FakePsmDelegate() = default; - -rlwe::StatusOr<std::unique_ptr<psm_rlwe::PrivateMembershipRlweClient>> -FakePsmDelegate::CreatePsmClient( - psm_rlwe::RlweUseCase use_case, - const std::vector<psm_rlwe::RlwePlaintextId>& plaintext_ids) { - return psm_rlwe::PrivateMembershipRlweClient::CreateForTesting( - use_case, plaintext_ids_, ec_cipher_key_, seed_); -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/fake_psm_delegate.h b/chromeos/ash/components/device_activity/fake_psm_delegate.h deleted file mode 100644 index 87f4674..0000000 --- a/chromeos/ash/components/device_activity/fake_psm_delegate.h +++ /dev/null
@@ -1,41 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_FAKE_PSM_DELEGATE_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_FAKE_PSM_DELEGATE_H_ - -#include "base/component_export.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) FakePsmDelegate - : public PsmDelegateInterface { - public: - FakePsmDelegate(const std::string& ec_cipher_key, - const std::string& seed, - const std::vector<private_membership::rlwe::RlwePlaintextId> - plaintext_ids); - FakePsmDelegate(const FakePsmDelegate&) = delete; - FakePsmDelegate& operator=(const FakePsmDelegate&) = delete; - ~FakePsmDelegate() override; - - // PsmDelegateInterface: - rlwe::StatusOr< - std::unique_ptr<private_membership::rlwe::PrivateMembershipRlweClient>> - CreatePsmClient(private_membership::rlwe::RlweUseCase use_case, - const std::vector<private_membership::rlwe::RlwePlaintextId>& - plaintext_ids) override; - - private: - // Used by the PSM client to generate deterministic request/response protos. - std::string ec_cipher_key_; - std::string seed_; - std::vector<private_membership::rlwe::RlwePlaintextId> plaintext_ids_; -}; - -} // namespace ash::device_activity - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_FAKE_PSM_DELEGATE_H_
diff --git a/chromeos/ash/components/device_activity/fresnel_pref_names.cc b/chromeos/ash/components/device_activity/fresnel_pref_names.cc deleted file mode 100644 index b4ed0e44..0000000 --- a/chromeos/ash/components/device_activity/fresnel_pref_names.cc +++ /dev/null
@@ -1,42 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" - -namespace ash::prefs { - -// Timestamp of last known daily ping to Fresnel. -const char kDeviceActiveLastKnownDailyPingTimestamp[] = - "device_active.last_known_daily_ping_timestamp"; - -// Timestamp of last known 28 day active ping to Fresnel. -const char kDeviceActiveLastKnown28DayActivePingTimestamp[] = - "device_active.last_known_28day_active_ping_timestamp"; - -// Timestamp of last known monthly churn cohort ping to Fresnel. -const char kDeviceActiveChurnCohortMonthlyPingTimestamp[] = - "device_active.last_known_churn_cohort_monthly_ping_timestamp"; - -// Timestamp of last known monthly churn observation ping to Fresnel. -const char kDeviceActiveChurnObservationMonthlyPingTimestamp[] = - "device_active.last_known_churn_observation_monthly_ping_timestamp"; - -// Int representing the 28 bit Active Status used for the churn use case. -// The first 10 bits represent number months from 01/01/2000 to current month. -// Remaining 18 bits represents past 18 months when device was active from -// current month. -const char kDeviceActiveLastKnownChurnActiveStatus[] = - "device_active.last_known_churn_active_status"; - -// The observation status for the past three periods from the current date. -// The current date is determined based on the first 10 bits of -// |kDeviceActiveLastKnownChurnActiveStatus|. -const char kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0[] = - "device_active.last_known_is_active_current_period_minus_0"; -const char kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1[] = - "device_active.last_known_is_active_current_period_minus_1"; -const char kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2[] = - "device_active.last_known_is_active_current_period_minus_2"; - -} // namespace ash::prefs
diff --git a/chromeos/ash/components/device_activity/fresnel_pref_names.h b/chromeos/ash/components/device_activity/fresnel_pref_names.h deleted file mode 100644 index 8333d4bd..0000000 --- a/chromeos/ash/components/device_activity/fresnel_pref_names.h +++ /dev/null
@@ -1,35 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_FRESNEL_PREF_NAMES_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_FRESNEL_PREF_NAMES_H_ - -#include "base/component_export.h" - -namespace ash::prefs { - -// --------------------------------------------------------------------------- -// Prefs related to ChromeOS device active pings. -// --------------------------------------------------------------------------- - -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveLastKnownDailyPingTimestamp[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveLastKnown28DayActivePingTimestamp[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveChurnCohortMonthlyPingTimestamp[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveChurnObservationMonthlyPingTimestamp[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveLastKnownChurnActiveStatus[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveLastKnownIsActiveCurrentPeriodMinus0[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveLastKnownIsActiveCurrentPeriodMinus1[]; -COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) -extern const char kDeviceActiveLastKnownIsActiveCurrentPeriodMinus2[]; - -} // namespace ash::prefs - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_FRESNEL_PREF_NAMES_H_
diff --git a/chromeos/ash/components/device_activity/fresnel_service.proto b/chromeos/ash/components/device_activity/fresnel_service.proto deleted file mode 100644 index b6b95c8..0000000 --- a/chromeos/ash/components/device_activity/fresnel_service.proto +++ /dev/null
@@ -1,201 +0,0 @@ -// Copyright 2021 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -syntax = "proto2"; - -package ash.device_activity; - -import "private_membership_rlwe.proto"; - -option optimize_for = LITE_RUNTIME; - -// This proto represents the data transmitted over network -// requests while reporting Device Actives to Fresnel server. - -// The possible channels for ChromeOS installations. -// See details in //components/version_info/channel.h -enum Channel { - CHANNEL_UNKNOWN = 0; - CHANNEL_CANARY = 1; - CHANNEL_DEV = 2; - CHANNEL_BETA = 3; - CHANNEL_STABLE = 4; -} - -enum MarketSegment { - // Default segment, should not be in this state. - MARKET_SEGMENT_UNSPECIFIED = 0; - // Device is not yet enrolled, owned or have market segment available. - MARKET_SEGMENT_UNKNOWN = 1; - // Device is locally owned as a consumer device. - MARKET_SEGMENT_CONSUMER = 2; - // Device is enterprise enrolled but does not have enterprise market segment. - MARKET_SEGMENT_ENTERPRISE_ENROLLED_BUT_UNKNOWN = 3; - // Device is enterprise enrolled and has enterprise market segment. - MARKET_SEGMENT_ENTERPRISE = 4; - // Device is enterprise enrolled and has education market segment. - MARKET_SEGMENT_EDUCATION = 5; -}; - -// The Chrome OS device metadata which is sent in PSM import requests. -// Each new field to this message requires privacy approval. -// Next ID: 6 -message DeviceMetadata { - // Chrome OS Hardware IDs (HWIDs) are strings that uniquely identify the - // hardware configuration of a Chrome OS device. - // See: go/gvc-g3/logs/chromeos-metrics.md - optional string hardware_id = 1; - - // Represent the current release milestone of the ChromeOS device. - // See chrome://version -> Google Chrome: - // i.e. 96.0.4664.55 (Official Build) (x86_64) would set field as "96". - optional string chromeos_version = 2; - - // Country code is represented by a 2-letter string (aka ISO 3166-1). - // i.e. US for United States of America, CA for Canada. - optional string country_code = 3; - - // Device market segment is one of the northstar breakout dimensions for - // active device counting. - optional MarketSegment market_segment = 4; - - // ChromeOS channel is used to determine the breakdown of devices that are - // coming from canary, dev, beta, stable, or unknown channels. - // This can be used with the ChromeOS version in order to determine - // questions like, what percentage of devices are in the M100 stable channel. - optional Channel chromeos_channel = 5; -} - -// The metadata which is related to Churn Cohort request. -message ChurnCohortMetadata { - // This 28 bits value represents the device monthly cohort active statuses for - // the past 18 months. The left 10 bits represent the number of months since - // Jan. 2000, and the right 18 bits represent the device's monthly cohort - // active statuses for the past 18 months, with a value of 1 indicating that - // the device was active and a value of 0 indicating that the device was not - // active in that month. - // - // If the device is active when the time switches to a new month (e.g., from - // 1/31 to 2/1), the number of months will increase by 1 and the first 10 bits - // will be updated. Also, use the number of months modulo 18 to get the index - // in the right 18 bits and set that index bit to 1. - // - // If the device was not active for a couple of months, after the device - // becomes active again and reports the cohort request successfully, it needs - // to set the bits of the inactive months to 0 before updating the number of - // months for the left 10 bits and the current month bit. - optional int32 active_status_value = 1; - - // Compare the first active weeks obtained from the VPD to determine if the - // device is new during the cohort month. - optional bool is_first_active_in_cohort = 2; -} - -// The metadata which is related to Churn Observation request. -message ChurnObservationMetadata { - // The device's first active status in different cohort month. - enum FirstActiveDuringCohort { - // The device is either an existing device that was activated before the - // cohort month, or it is a new device that has not yet been activated - // during the cohort month. - EXISTED_OR_NOT_ACTIVE_YET = 0; - // The device was first activated during the corresponding monthly cohort - // period. - FIRST_ACTIVE_IN_MONTHLY_COHORT = 1; - // The device was first activated during the corresponding yearly cohort - // period. - FIRST_ACTIVE_IN_YEARLY_COHORT = 2; - } - - // Whether the device was `active` during monthly cohort period. - optional bool monthly_active_status = 1; - - // Whether the device was `active` during yearly cohort period. - optional bool yearly_active_status = 2; - - // Whether the device was `first active` during the corresponding cohort - // period. - optional FirstActiveDuringCohort first_active_during_cohort = 3; -} - -// This message is part of the import request. For some use cases, such as -// N-Day use case, they may need to batch import the requests to Fresnel. -// We make a general import data message for all use cases. -message FresnelImportData { - // The Device active window identifier, generated by client side. - // For example, for Daily active pings, the active window identifier could be - // '07012021'; for 28DA, it could be the start date when device was active. - optional string window_identifier = 1; - - // The device derived id: hash(device_stable_identifier, use_case, date) - optional string plaintext_id = 2; - - // The plaintext identifiers - value pair to be imported. - // For example, this can be the cohort active status history byte for Churn - // use case. - optional bytes value = 3; - - // Boolean used to indicate whether client is sending UTC (false) or PT - // (true) timezone for the window_identifier. - optional bool is_pt_window_identifier = 4; - - // The metadata related to Churn Cohort check-in request. - optional ChurnCohortMetadata churn_cohort_metadata = 5; - - // The metadata related to Churn Observation check-in request. - optional ChurnObservationMetadata churn_observation_metadata = 6; -} - -// This proto will represent the data sent to Fresnel used to generate a PSM -// import request on the server side. -// Next ID: 5 -message FresnelImportDataRequest { - // This field will be deprecated. - optional string window_identifier = 1 [deprecated = true]; - - // Device active metadata sent along with active pings for counting purposes. - optional DeviceMetadata device_metadata = 2; - - // The name of the use case associated with the plaintext_id. - optional private_membership.rlwe.RlweUseCase use_case = 3; - - // This field will be deprecated. - optional string plaintext_identifier = 4 [deprecated = true]; - - // This field will be deprecated. - optional bytes value = 5 [deprecated = true]; - - // The imported data which is related to use case. - repeated FresnelImportData import_data = 6; -} - -// The request of PsmRlweOprf sent by the client for checking PSM membership. -// Next ID: 2 -message FresnelPsmRlweOprfRequest { - optional private_membership.rlwe.PrivateMembershipRlweOprfRequest - rlwe_oprf_request = 1; -} - -// The response of PsmRlweOprf sent by the Fresnel Service for checking -// PSM membership. -// Next ID: 2 -message FresnelPsmRlweOprfResponse { - optional private_membership.rlwe.PrivateMembershipRlweOprfResponse - rlwe_oprf_response = 1; -} - -// The request of PsmRlweQuery sent by the client for checking PSM membership. -// Next ID: 2 -message FresnelPsmRlweQueryRequest { - optional private_membership.rlwe.PrivateMembershipRlweQueryRequest - rlwe_query_request = 1; -} - -// The response of PsmRlweQuery sent by the Fresnel Service for checking -// PSM membership. -// Next ID: 2 -message FresnelPsmRlweQueryResponse { - optional private_membership.rlwe.PrivateMembershipRlweQueryResponse - rlwe_query_response = 1; -}
diff --git a/chromeos/ash/components/device_activity/testing/private_computing_service_test_data.binarypb b/chromeos/ash/components/device_activity/testing/private_computing_service_test_data.binarypb deleted file mode 100644 index b3945cd..0000000 --- a/chromeos/ash/components/device_activity/testing/private_computing_service_test_data.binarypb +++ /dev/null Binary files differ
diff --git a/chromeos/ash/components/device_activity/testing/private_computing_service_test_data.textpb b/chromeos/ash/components/device_activity/testing/private_computing_service_test_data.textpb deleted file mode 100644 index 70473cd..0000000 --- a/chromeos/ash/components/device_activity/testing/private_computing_service_test_data.textpb +++ /dev/null
@@ -1,95 +0,0 @@ -test_cases: { - name: GET_SUCCESS_SAVE_SUCCESS - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "2022-01-01 00:00:00.000 PST" - } - } - save_response: { - } -} -test_cases: { - name: GET_SUCCESS_SAVE_FAIL - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "2022-01-01 00:00:00.000 PST" - } - } - save_response: { - error_message: "ERROR - Save Request Failed" - } -} -test_cases: { - name: GET_FAIL_SAVE_SUCCESS - get_response: { - error_message: "ERROR - Get Request Failed" - } - save_response: { - } -} -test_cases: { - name: GET_FAIL_SAVE_FAIL - get_response: { - error_message: "ERROR - Get Request Failed" - } - save_response: { - error_message: "ERROR - Save Request Failed" - } -} -test_cases: { - name: GET_SUCCESS_FUTURE_PING_DATE_SAVE_SUCCESS - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "2023-01-01 00:00:00.000 PST" - } - } - save_response: { - } -} -test_cases: { - name: GET_SUCCESS_SAME_PING_DATE_SAVE_SUCCESS - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "2022-01-01 00:00:00.000 PST" - } - } - save_response: { - } -} -test_cases: { - name: GET_SUCCESS_PAST_PING_DATE_SAVE_SUCCESS - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "2021-01-01 00:00:00.000 PST" - } - } - save_response: { - } -} -test_cases: { - name: GET_SUCCESS_UNIX_EPOCH_PING_DATE_SAVE_SUCCESS - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "1970-01-01 00:00:00.000 UTC" - } - } - save_response: { - } -} -test_cases: { - name: GET_INVALID_PING_DATE_SAVE_SUCCESS - get_response: { - active_status: { - use_case: CROS_FRESNEL_DAILY - last_ping_date: "XXXX-XX-XX XX:XX:XX.XXX XXX" - } - } - save_response: { - } -}
diff --git a/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.cc b/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.cc deleted file mode 100644 index 123e1d4..0000000 --- a/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.cc +++ /dev/null
@@ -1,163 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h" - -#include "ash/constants/ash_features.h" -#include "base/debug/dump_without_crashing.h" -#include "base/strings/stringprintf.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/device_activity/fresnel_service.pb.h" -#include "components/prefs/pref_service.h" -#include "components/version_info/channel.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Used to configure the last N days to send plaintext id check membership -// requests. -constexpr size_t kRollingWindowSize = 28; - -} // namespace - -TwentyEightDayActiveUseCaseImpl::TwentyEightDayActiveUseCaseImpl( - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate) - : DeviceActiveUseCase(psm_device_active_secret, - chrome_passed_device_params, - prefs::kDeviceActiveLastKnown28DayActivePingTimestamp, - psm_rlwe::RlweUseCase::CROS_FRESNEL_28DAY_ACTIVE, - local_state, - std::move(psm_delegate)) {} - -TwentyEightDayActiveUseCaseImpl::~TwentyEightDayActiveUseCaseImpl() = default; - -absl::optional<FresnelImportDataRequest> -TwentyEightDayActiveUseCaseImpl::GenerateImportRequestBody() { - // Generate Fresnel PSM import request body. - FresnelImportDataRequest import_request; - - import_request.set_use_case(GetPsmUseCase()); - - // Create fresh |DeviceMetadata| object. - // Note every dimension added to this proto must be approved by privacy. - DeviceMetadata* device_metadata = import_request.mutable_device_metadata(); - device_metadata->set_chromeos_version(GetChromeOSVersion()); - device_metadata->set_chromeos_channel(GetChromeOSChannel()); - - // Enable sending these during 28DA check in - // without check membership for debugging purposes. - device_metadata->set_hardware_id(GetFullHardwareClass()); - device_metadata->set_market_segment(GetMarketSegment()); - - for (auto v : new_import_data_) { - FresnelImportData* import_data = import_request.add_import_data(); - import_data->set_window_identifier(v.window_identifier()); - import_data->set_plaintext_id(v.plaintext_id()); - import_data->set_is_pt_window_identifier(v.is_pt_window_identifier()); - } - - return import_request; -} - -bool TwentyEightDayActiveUseCaseImpl::IsEnabledCheckIn() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClient28DayActiveCheckIn); -} - -bool TwentyEightDayActiveUseCaseImpl::IsEnabledCheckMembership() { - return base::FeatureList::IsEnabled( - features::kDeviceActiveClient28DayActiveCheckMembership); -} - -private_computing::ActiveStatus -TwentyEightDayActiveUseCaseImpl::GenerateActiveStatus() { - private_computing::ActiveStatus status; - - status.set_use_case( - private_computing::PrivateComputingUseCase::CROS_FRESNEL_28DAY_ACTIVE); - - std::string last_ping_pt_date = - FormatPTDateString(GetLastKnownPingTimestamp()); - status.set_last_ping_date(last_ping_pt_date); - - return status; -} - -bool TwentyEightDayActiveUseCaseImpl::SavePsmIdToDateMap(base::Time cur_ts) { - // Generate |kRollingWindowSize| days of PSM identifiers to search. - std::unordered_map<std::string, base::Time> psm_id_to_date_temp; - - for (int i = 0; i < static_cast<int>(kRollingWindowSize); i++) { - base::Time day_n = cur_ts - base::Days(i); - - absl::optional<psm_rlwe::RlwePlaintextId> id = - GeneratePsmIdentifier(GenerateWindowIdentifier(day_n)); - - if (!id.has_value()) { - LOG(ERROR) << "PSM ID is empty"; - return false; - } - - psm_id_to_date_temp.insert( - {id.value().sensitive_id(), day_n.UTCMidnight()}); - } - - psm_id_to_date_ = psm_id_to_date_temp; - return true; -} - -bool TwentyEightDayActiveUseCaseImpl::SetPsmIdentifiersToImport( - base::Time cur_ts) { - DCHECK(psm_id_.has_value()); - - // Clear previous values of id's to import. - new_import_data_.clear(); - - // Normalize current ts and last known ts to midnight. - // Not doing so will cause missing imports depending on the HH/MM/SS. - base::Time cur_ts_midnight = cur_ts.UTCMidnight(); - base::Time last_known_ping_ts_midnight = - GetLastKnownPingTimestamp().UTCMidnight(); - - // Iterate from days [cur_ts, cur_ts+27], which represents the 28 day window. - for (int i = 0; i < static_cast<int>(kRollingWindowSize); i++) { - base::Time day_n = cur_ts_midnight + base::Days(i); - - // Only generate import data for new identifiers to import. - // last_known_ping_ts + 27 gives us the last day we previously sent an - // import data request for. - if (day_n <= - (last_known_ping_ts_midnight + base::Days(kRollingWindowSize - 1))) { - continue; - } - - std::string window_id = GenerateWindowIdentifier(day_n); - absl::optional<psm_rlwe::RlwePlaintextId> id = - GeneratePsmIdentifier(window_id); - - if (window_id.empty() || !id.has_value()) { - LOG(ERROR) << "Window id or PSM ID is empty."; - return false; - } - - FresnelImportData import_data = FresnelImportData(); - import_data.set_window_identifier(window_id); - import_data.set_plaintext_id(id.value().sensitive_id()); - import_data.set_is_pt_window_identifier(true); - - new_import_data_.push_back(import_data); - } - - return true; -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h b/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h deleted file mode 100644 index 78fa699..0000000 --- a/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h +++ /dev/null
@@ -1,60 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_TWENTY_EIGHT_DAY_ACTIVE_USE_CASE_IMPL_H_ -#define CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_TWENTY_EIGHT_DAY_ACTIVE_USE_CASE_IMPL_H_ - -#include "base/component_export.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/device_active_use_case.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -class PrefService; - -namespace version_info { -enum class Channel; -} // namespace version_info - -namespace ash::device_activity { - -// Forward declaration from fresnel_service.proto. -class FresnelImportDataRequest; - -// Contains the methods required to report the 28 day active (28da) use case. -class COMPONENT_EXPORT(CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY) - TwentyEightDayActiveUseCaseImpl : public DeviceActiveUseCase { - public: - TwentyEightDayActiveUseCaseImpl( - const std::string& psm_device_active_secret, - const ChromeDeviceMetadataParameters& chrome_passed_device_params, - PrefService* local_state, - std::unique_ptr<PsmDelegateInterface> psm_delegate); - TwentyEightDayActiveUseCaseImpl(const TwentyEightDayActiveUseCaseImpl&) = - delete; - TwentyEightDayActiveUseCaseImpl& operator=( - const TwentyEightDayActiveUseCaseImpl&) = delete; - ~TwentyEightDayActiveUseCaseImpl() override; - - // DeviceActiveUseCase: - absl::optional<FresnelImportDataRequest> GenerateImportRequestBody() override; - private_computing::ActiveStatus GenerateActiveStatus() override; - - // Whether current device active use case check-in is enabled or not. - bool IsEnabledCheckIn() override; - - // Whether current device active use case check membership is enabled or not. - bool IsEnabledCheckMembership() override; - - // For example, the 28 day lookback queries on 01/28/2022 will generate the - // vector of psm ids for days 01, 02, 03, 04, 05, 06, ..., 28 of January 2022. - bool SavePsmIdToDateMap(base::Time cur_ts) override; - - // For example, the 28 day ping ahead imports on 01/01/2022 will generate the - // vector of psm ids for days 01, 02, 03, 04, 05, 06, ..., 28 of January 2022. - bool SetPsmIdentifiersToImport(base::Time cur_ts) override; -}; - -} // namespace ash::device_activity - -#endif // CHROMEOS_ASH_COMPONENTS_DEVICE_ACTIVITY_TWENTY_EIGHT_DAY_ACTIVE_USE_CASE_IMPL_H_
diff --git a/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl_unittest.cc b/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl_unittest.cc deleted file mode 100644 index 9a1b14a..0000000 --- a/chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl_unittest.cc +++ /dev/null
@@ -1,510 +0,0 @@ -// Copyright 2022 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chromeos/ash/components/device_activity/twenty_eight_day_active_use_case_impl.h" - -#include "ash/constants/ash_features.h" -#include "base/strings/string_util.h" -#include "base/test/scoped_feature_list.h" -#include "base/time/time.h" -#include "chromeos/ash/components/device_activity/device_activity_controller.h" -#include "chromeos/ash/components/device_activity/fake_psm_delegate.h" -#include "chromeos/ash/components/device_activity/fresnel_pref_names.h" -#include "chromeos/ash/components/system/fake_statistics_provider.h" -#include "components/prefs/testing_pref_service.h" -#include "components/version_info/channel.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/private_membership/src/private_membership_rlwe_client.h" - -namespace ash::device_activity { - -namespace psm_rlwe = private_membership::rlwe; - -namespace { - -// Used to configure the last N days to send plaintext id check membership -// requests. -constexpr size_t kRollingWindowSize = 28; - -// Initialize fake value used by the TwentyEightDayActiveUseCaseImpl. -// This secret should be of exactly length 64, since it is a 256 bit string -// encoded as a hexadecimal. -constexpr char kFakePsmDeviceActiveSecret[] = - "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA"; - -// TODO(hirthanan): Enable when rolling out check membership requests. -// constexpr char kHardwareClassKeyNotFound[] = "HARDWARE_CLASS_KEY_NOT_FOUND"; - -constexpr ChromeDeviceMetadataParameters kFakeChromeParameters = { - version_info::Channel::STABLE /* chromeos_channel */, - MarketSegment::MARKET_SEGMENT_UNKNOWN /* market_segment */, -}; - -} // namespace - -class TwentyEightDayActiveUseCaseImplTest : public testing::Test { - public: - TwentyEightDayActiveUseCaseImplTest() = default; - TwentyEightDayActiveUseCaseImplTest( - const TwentyEightDayActiveUseCaseImplTest&) = delete; - TwentyEightDayActiveUseCaseImplTest& operator=( - const TwentyEightDayActiveUseCaseImplTest&) = delete; - ~TwentyEightDayActiveUseCaseImplTest() override = default; - - protected: - // testing::Test: - void SetUp() override { - scoped_feature_list_.InitWithFeatures( - /*enabled_features=*/ - {features::kDeviceActiveClient28DayActiveCheckMembership}, - /*disabled_features*/ {}); - - DeviceActivityController::RegisterPrefs(local_state_.registry()); - - system::StatisticsProvider::SetTestProvider(&statistics_provider_); - - const std::vector<psm_rlwe::RlwePlaintextId> plaintext_ids; - twenty_eight_day_active_use_case_impl_ = - std::make_unique<TwentyEightDayActiveUseCaseImpl>( - kFakePsmDeviceActiveSecret, kFakeChromeParameters, &local_state_, - // |FakePsmDelegate| can use any test case parameters. - std::make_unique<FakePsmDelegate>(std::string() /* ec_cipher_key */, - std::string() /* seed */, - std::move(plaintext_ids))); - } - - void TearDown() override { twenty_eight_day_active_use_case_impl_.reset(); } - - std::unique_ptr<TwentyEightDayActiveUseCaseImpl> - twenty_eight_day_active_use_case_impl_; - - // Fake pref service for unit testing the local state. - TestingPrefServiceSimple local_state_; - base::test::ScopedFeatureList scoped_feature_list_; - system::FakeStatisticsProvider statistics_provider_; -}; - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - ValidateWindowIdFormattedCorrectly) { - // Create fixed timestamp used to generate a fixed window identifier. - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_daily_ts)); - - std::string window_id = - twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - new_daily_ts); - - EXPECT_EQ(static_cast<int>(window_id.size()), 8); - EXPECT_EQ(window_id, "20220101"); -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, SameDayTimestampsHaveSameWindowId) { - base::Time daily_ts_1; - base::Time daily_ts_2; - - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &daily_ts_1)); - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &daily_ts_2)); - - EXPECT_EQ(twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - daily_ts_1), - twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - daily_ts_2)); -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - DifferentDayTimestampsHaveDifferentWindowId) { - base::Time daily_ts_1; - base::Time daily_ts_2; - - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &daily_ts_1)); - EXPECT_TRUE(base::Time::FromString("02 Jan 2022 00:00:00 GMT", &daily_ts_2)); - - EXPECT_NE(twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - daily_ts_1), - twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - daily_ts_2)); -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, ExpectedMetadataIsSet) { - base::Time new_daily_ts; - EXPECT_TRUE( - base::Time::FromString("01 Jan 2022 23:59:59 GMT", &new_daily_ts)); - - // Window identifier must be set before PSM id, and hence import request body - // can be generated. - twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(new_daily_ts); - - FresnelImportDataRequest req = - twenty_eight_day_active_use_case_impl_->GenerateImportRequestBody() - .value(); - EXPECT_EQ(req.device_metadata().chromeos_channel(), Channel::CHANNEL_STABLE); - EXPECT_FALSE(req.device_metadata().chromeos_version().empty()); - - // TODO(hirthanan): Enable when rolling out check membership requests. - // EXPECT_EQ(req.device_metadata().hardware_id(), kHardwareClassKeyNotFound); - // EXPECT_EQ(req.device_metadata().market_segment(), - // MarketSegment::MARKET_SEGMENT_UNKNOWN); -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - VerifyNumberOfPsmIdsInQueryRequest) { - // PSM identifiers to query is unknown since there is no window id set yet. - std::vector<psm_rlwe::RlwePlaintextId> psm_ids = - twenty_eight_day_active_use_case_impl_->GetPsmIdentifiersToQuery(); - - EXPECT_EQ(static_cast<int>(twenty_eight_day_active_use_case_impl_ - ->GetPsmIdentifiersToQuery() - .size()), - 0); - - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &ts)); - - // Set the window id to some active date. - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - EXPECT_EQ( - twenty_eight_day_active_use_case_impl_->GetPsmIdentifiersToQuery().size(), - kRollingWindowSize); -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - PsmIdToDatesIsInitializedCorrectly) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &ts)); - - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<std::string> expected_psm_window_ids = { - "20220101", "20211231", "20211230", "20211229", "20211228", "20211227", - "20211226", "20211225", "20211224", "20211223", "20211222", "20211221", - "20211220", "20211219", "20211218", "20211217", "20211216", "20211215", - "20211214", "20211213", "20211212", "20211211", "20211210", "20211209", - "20211208", "20211207", "20211206", "20211205", - }; - - EXPECT_EQ(expected_psm_window_ids.size(), kRollingWindowSize); - - // Verify that each of the expected psm window ids are contained in the - // |psm_id_to_date_| map. - for (auto& window_id : expected_psm_window_ids) { - psm_rlwe::RlwePlaintextId expected_psm_id = - twenty_eight_day_active_use_case_impl_->GeneratePsmIdentifier(window_id) - .value(); - - // Method should return a non Unix Epoch date if found. - EXPECT_NE(twenty_eight_day_active_use_case_impl_->RetrievePsmIdDate( - expected_psm_id), - base::Time::UnixEpoch()); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - SearchForLastTwentyEightIdentifiersFromRegularDate) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 23:59:59 GMT", &ts)); - - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<std::string> expected_psm_window_ids = { - "20220101", "20211231", "20211230", "20211229", - "20211228", "20211227", "20211226"}; - - for (auto& expected_window_id : expected_psm_window_ids) { - psm_rlwe::RlwePlaintextId expected_psm_id = - twenty_eight_day_active_use_case_impl_ - ->GeneratePsmIdentifier(expected_window_id) - .value(); - - // Validate that all query PSM ids are correctly generated from the reported - // ts date. Note that the only input to the - // |twenty_eight_day_active_use_case_impl_| is where the window identifier - // is set. This generates the expected psm id to window dates that is - // verified here. - std::string actual_window_id = - twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - twenty_eight_day_active_use_case_impl_->RetrievePsmIdDate( - expected_psm_id)); - EXPECT_EQ(actual_window_id, expected_window_id); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - SearchForLastTwentyEightIdentifiersFromLeapYearDate) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Mar 2020 23:59:59 GMT", &ts)); - - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<psm_rlwe::RlwePlaintextId> psm_ids = - twenty_eight_day_active_use_case_impl_->GetPsmIdentifiersToQuery(); - - EXPECT_EQ(psm_ids.size(), kRollingWindowSize); - - std::vector<std::string> expected_psm_window_ids = { - "20200301", "20200229", "20200228", "20200227", - "20200226", "20200225", "20200224"}; - - for (auto& expected_window_id : expected_psm_window_ids) { - psm_rlwe::RlwePlaintextId expected_psm_id = - twenty_eight_day_active_use_case_impl_ - ->GeneratePsmIdentifier(expected_window_id) - .value(); - - // Validate that all query PSM ids are correctly generated from the reported - // ts date. Note that the only input to the - // |twenty_eight_day_active_use_case_impl_| is where the window identifier - // is set. This generates the expected psm id to window dates that is - // verified here. - std::string actual_window_id = - twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - twenty_eight_day_active_use_case_impl_->RetrievePsmIdDate( - expected_psm_id)); - EXPECT_EQ(actual_window_id, expected_window_id); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - SearchForLastTwentyEightIdentifiersFromNonLeapYearDate) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Mar 2021 23:59:59 GMT", &ts)); - - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<psm_rlwe::RlwePlaintextId> psm_ids = - twenty_eight_day_active_use_case_impl_->GetPsmIdentifiersToQuery(); - - EXPECT_EQ(psm_ids.size(), kRollingWindowSize); - - std::vector<std::string> expected_psm_window_ids = { - "20210301", "20210228", "20210227", "20210226", "20210225", "20210224", - "20210223", "20210222", "20210221", "20210223", "20210222", "20210221", - "20210220", "20210219", "20210218", "20210217", "20210216", "20210215", - "20210214", "20210213", "20210212", "20210211", "20210210", "20210209", - "20210208", "20210207", "20210206", "20210205", - }; - - for (auto& expected_window_id : expected_psm_window_ids) { - psm_rlwe::RlwePlaintextId expected_psm_id = - twenty_eight_day_active_use_case_impl_ - ->GeneratePsmIdentifier(expected_window_id) - .value(); - - // Validate that all query PSM ids are correctly generated from the reported - // ts date. Note that the only input to the - // |twenty_eight_day_active_use_case_impl_| is where the window identifier - // is set. This generates the expected psm id to window dates that is - // verified here. - std::string actual_window_id = - twenty_eight_day_active_use_case_impl_->GenerateWindowIdentifier( - twenty_eight_day_active_use_case_impl_->RetrievePsmIdDate( - expected_psm_id)); - EXPECT_EQ(actual_window_id, expected_window_id); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - CheckInEntireRollingWindowOnEmptyLocalState) { - // Set local state to unix epoch. - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp( - base::Time::UnixEpoch()); - - // Update current ts to 20220102 - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data.size(), kRollingWindowSize); - - std::vector<std::string> expected_window_ids = { - "20220101", "20220102", "20220103", "20220104", "20220105", "20220106", - "20220107", "20220108", "20220109", "20220110", "20220111", "20220112", - "20220113", "20220114", "20220115", "20220116", "20220117", "20220118", - "20220119", "20220120", "20220121", "20220122", "20220123", "20220124", - "20220125", "20220126", "20220127", "20220128", - }; - - for (auto& v : import_data) { - EXPECT_TRUE(std::find(expected_window_ids.begin(), - expected_window_ids.end(), - v.window_identifier()) != expected_window_ids.end()); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - CheckInPartialRollingWindowOnDeviceThatReportedYesterday) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &ts)); - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp(ts); - - // Update current ts to 20220102 - EXPECT_TRUE(base::Time::FromString("02 Jan 2022 00:00:00 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data.size(), 1u); - std::vector<std::string> expected_window_ids = {"20220129"}; - - for (auto& v : import_data) { - EXPECT_TRUE(std::find(expected_window_ids.begin(), - expected_window_ids.end(), - v.window_identifier()) != expected_window_ids.end()); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - CheckInPartialRollingWindowOnDeviceThatReportedTwoDaysAgo) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &ts)); - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp(ts); - - // Update current ts to 20220103 - EXPECT_TRUE(base::Time::FromString("03 Jan 2022 00:00:00 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data.size(), 2u); - - std::vector<std::string> expected_window_ids = {"20220129", "20220130"}; - - for (auto& v : import_data) { - EXPECT_TRUE(std::find(expected_window_ids.begin(), - expected_window_ids.end(), - v.window_identifier()) != expected_window_ids.end()); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - CheckInPartialRollingWindowOnDeviceThatReportedTwentyEightDaysAgo) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("01 Jan 2022 00:00:00 GMT", &ts)); - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp(ts); - - // Update current ts to 20220127 - EXPECT_TRUE(base::Time::FromString("28 Jan 2022 00:00:00 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data.size(), 27u); - - std::vector<std::string> expected_window_ids = { - "20220129", "20220130", "20220131", "20220201", "20220202", "20220203", - "20220204", "20220205", "20220206", "20220207", "20220208", "20220209", - "20220210", "20220211", "20220212", "20220213", "20220214", "20220215", - "20220216", "20220217", "20220218", "20220219", "20220220", "20220221", - "20220222", "20220223", "20220224"}; - - for (auto& v : import_data) { - EXPECT_TRUE(std::find(expected_window_ids.begin(), - expected_window_ids.end(), - v.window_identifier()) != expected_window_ids.end()); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, - CheckInEmptyOnDeviceThatReportedFuture) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("03 Jan 2022 00:00:00 GMT", &ts)); - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp(ts); - - // Update current ts to a previous date 20220102. - // This may happen if the system clock goes back in time due to NTP sync - // error. - EXPECT_TRUE(base::Time::FromString("02 Jan 2022 00:00:00 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - // Client should not import any data. - EXPECT_EQ(import_data.size(), 0u); -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, CheckInSingleDayInMiddleOfYear) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("04 May 2023 00:04:22.962 GMT", &ts)); - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp(ts); - - EXPECT_TRUE(base::Time::FromString("05 May 2023 00:00:20.924 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data.size(), 1u); - std::vector<std::string> expected_window_ids = {"20230601"}; - - for (auto& v : import_data) { - EXPECT_TRUE(std::find(expected_window_ids.begin(), - expected_window_ids.end(), - v.window_identifier()) != expected_window_ids.end()); - } -} - -TEST_F(TwentyEightDayActiveUseCaseImplTest, CheckInSingleDayWithVaryingHours) { - base::Time ts; - EXPECT_TRUE(base::Time::FromString("04 May 2023 00:00:22.962 GMT", &ts)); - twenty_eight_day_active_use_case_impl_->SetLastKnownPingTimestamp(ts); - - // Test when last known ping ts hour is smaller than current ts hour. - EXPECT_TRUE(base::Time::FromString("05 May 2023 00:04:20.924 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data.size(), 1u); - std::vector<std::string> expected_window_ids = {"20230601"}; - - for (auto& v : import_data) { - EXPECT_TRUE(std::find(expected_window_ids.begin(), - expected_window_ids.end(), - v.window_identifier()) != expected_window_ids.end()); - } - - // Test when last known ping ts hour is equal to current ts hour. - EXPECT_TRUE(base::Time::FromString("05 May 2023 00:00:22.962 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data_2 = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data_2.size(), 1u); - std::vector<std::string> expected_window_ids_2 = {"20230601"}; - - for (auto& v : import_data_2) { - EXPECT_TRUE(std::find(expected_window_ids_2.begin(), - expected_window_ids_2.end(), - v.window_identifier()) != expected_window_ids.end()); - } - - // Test when last known ping ts hour is greater than current ts hour. - EXPECT_TRUE(base::Time::FromString("05 May 2023 23:59:59.000 GMT", &ts)); - EXPECT_TRUE(twenty_eight_day_active_use_case_impl_->SetWindowIdentifier(ts)); - - std::vector<FresnelImportData> import_data_3 = - twenty_eight_day_active_use_case_impl_->GetImportData(); - - EXPECT_EQ(import_data_3.size(), 1u); - std::vector<std::string> expected_window_ids_3 = {"20230601"}; - - for (auto& v : import_data_3) { - EXPECT_TRUE(std::find(expected_window_ids_3.begin(), - expected_window_ids_3.end(), - v.window_identifier()) != expected_window_ids.end()); - } -} - -} // namespace ash::device_activity
diff --git a/chromeos/ash/components/network/cellular_esim_installer.cc b/chromeos/ash/components/network/cellular_esim_installer.cc index 9a4bb89..51e39d0a 100644 --- a/chromeos/ash/components/network/cellular_esim_installer.cc +++ b/chromeos/ash/components/network/cellular_esim_installer.cc
@@ -179,8 +179,8 @@ const bool is_user_error = status.has_value() && CellularNetworkMetricsLogger::HermesResponseStatusIsUserError(*status); - const CellularNetworkMetricsLogger::ESimInstallResult result = - CellularNetworkMetricsLogger::ComputeESimInstallResult(status); + const CellularNetworkMetricsLogger::ESimOperationResult result = + CellularNetworkMetricsLogger::ComputeESimOperationResult(status); if (is_managed) { CellularNetworkMetricsLogger::LogESimPolicyInstallResult(
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler.cc b/chromeos/ash/components/network/cellular_esim_profile_handler.cc index 2c91c325b..0fca17b 100644 --- a/chromeos/ash/components/network/cellular_esim_profile_handler.cc +++ b/chromeos/ash/components/network/cellular_esim_profile_handler.cc
@@ -208,10 +208,12 @@ DCHECK(info->callback); if (!inhibit_lock) { - // TODO(b/278135630): Emit - // Network.Ash.Cellular.ESim.SMDSScan.{SMDSType}.{ResultType}. + DCHECK(!info->smds_activation_codes.empty()); NET_LOG(ERROR) << "Failed to inhibit cellular for requesting available profiles"; + CellularNetworkMetricsLogger::LogSmdsScanResult( + info->smds_activation_codes.front(), + /*result=*/absl::nullopt); std::move(info->callback) .Run(cellular_setup::mojom::ESimOperationResult::kFailure, std::vector<CellularESimProfile>()); @@ -302,6 +304,7 @@ DCHECK(info->callback); DCHECK(inhibit_lock); + CellularNetworkMetricsLogger::LogSmdsScanResult(smds_activation_code, status); CellularNetworkMetricsLogger::LogSmdsScanDuration( base::TimeTicks::Now() - start_time, status == HermesResponseStatus::kSuccess, smds_activation_code);
diff --git a/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc b/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc index eaf8052..b49b606 100644 --- a/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc +++ b/chromeos/ash/components/network/cellular_esim_profile_handler_impl_unittest.cc
@@ -22,6 +22,7 @@ #include "chromeos/ash/components/network/cellular_inhibitor.h" #include "chromeos/ash/components/network/cellular_utils.h" #include "chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h" +#include "chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.h" #include "chromeos/ash/components/network/network_state_test_helper.h" #include "chromeos/ash/components/network/network_type_pattern.h" #include "chromeos/ash/services/cellular_setup/public/mojom/esim_manager.mojom.h" @@ -264,29 +265,29 @@ size_t gsma_count, bool success) { if (success) { - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanOtherDurationSuccess, other_count); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanAndroidDurationSuccess, android_count); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanGsmaDurationSuccess, gsma_count); return; } - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanOtherDurationFailure, other_count); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanAndroidDurationFailure, android_count); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanGsmaDurationFailure, gsma_count); } - const base::HistogramTester& histogram_tester() { return histogram_tester_; } + const base::HistogramTester* histogram_tester() { return &histogram_tester_; } base::test::TaskEnvironment* task_environment() { return &task_environment_; } @@ -720,9 +721,9 @@ EXPECT_EQ(2u, profiles.size()); EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[0].state()); EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[1].state()); - histogram_tester().ExpectBucketCount(kDisableProfileResultHistogram, - HermesResponseStatus::kSuccess, - /*expected_count=*/1); + histogram_tester()->ExpectBucketCount(kDisableProfileResultHistogram, + HermesResponseStatus::kSuccess, + /*expected_count=*/1); } TEST_F(CellularESimProfileHandlerImplTest_SmdsSupportEnabled, NoEuicc) { @@ -1089,9 +1090,9 @@ EXPECT_EQ(2u, profiles.size()); EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[0].state()); EXPECT_EQ(CellularESimProfile::State::kInactive, profiles[1].state()); - histogram_tester().ExpectBucketCount(kDisableProfileResultHistogram, - HermesResponseStatus::kSuccess, - /*expected_count=*/1); + histogram_tester()->ExpectBucketCount(kDisableProfileResultHistogram, + HermesResponseStatus::kSuccess, + /*expected_count=*/1); } TEST_F(CellularESimProfileHandlerImplTest_SmdsSupportEnabled, @@ -1107,7 +1108,10 @@ absl::optional<ESimOperationResult> result; absl::optional<std::vector<CellularESimProfile>> profile_list; - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 0, + cellular_metrics::ESimSmdsScanHistogramState histogram_state; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/true); base::RunLoop run_loop; @@ -1138,7 +1142,13 @@ ASSERT_TRUE(result.has_value()); EXPECT_EQ(*result, cellular_setup::mojom::ESimOperationResult::kSuccess); - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 1, + histogram_state.smds_scan_android_user_errors_filtered.success_count++; + histogram_state.smds_scan_android_user_errors_included.success_count++; + histogram_state.smds_scan_gsma_user_errors_filtered.success_count++; + histogram_state.smds_scan_gsma_user_errors_included.success_count++; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/1, /*gsma_counts=*/1, /*success=*/true); const std::vector<std::string> smds_activation_codes = @@ -1153,11 +1163,11 @@ smds_activation_codes.end()); } - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanProfileCount, /*expected_count=*/1); EXPECT_EQ(static_cast<int64_t>(smds_activation_codes.size()), - histogram_tester().GetTotalSum( + histogram_tester()->GetTotalSum( CellularNetworkMetricsLogger::kSmdsScanProfileCount)); } @@ -1174,7 +1184,10 @@ absl::optional<ESimOperationResult> result; absl::optional<std::vector<CellularESimProfile>> profile_list; - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 0, + cellular_metrics::ESimSmdsScanHistogramState histogram_state; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/false); // Queue errors for each of the expected SM-DS scans. @@ -1206,7 +1219,13 @@ ASSERT_TRUE(result.has_value()); EXPECT_EQ(*result, cellular_setup::mojom::ESimOperationResult::kSuccess); - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 1, + histogram_state.smds_scan_android_user_errors_filtered.hermes_failed_count++; + histogram_state.smds_scan_android_user_errors_included.hermes_failed_count++; + histogram_state.smds_scan_gsma_user_errors_filtered.hermes_failed_count++; + histogram_state.smds_scan_gsma_user_errors_included.hermes_failed_count++; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/1, /*gsma_counts=*/1, /*success=*/false); ASSERT_TRUE(profile_list.has_value()); @@ -1316,10 +1335,13 @@ // failure to inhibit by making the next attempt to set a property fail. SetErrorForNextSetPropertyAttempt("error_name"); + cellular_metrics::ESimSmdsScanHistogramState histogram_state; + histogram_state.Check(histogram_tester()); + absl::optional<ESimOperationResult> result; absl::optional<std::vector<CellularESimProfile>> profile_list; - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 0, + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/true); { @@ -1342,13 +1364,17 @@ ASSERT_TRUE(profile_list.has_value()); EXPECT_TRUE(profile_list->empty()); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanProfileCount, /*expected_count=*/0); - EXPECT_EQ(0, histogram_tester().GetTotalSum( + EXPECT_EQ(0, histogram_tester()->GetTotalSum( CellularNetworkMetricsLogger::kSmdsScanProfileCount)); - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 0, + histogram_state.smds_scan_android_user_errors_filtered.inhibit_failed_count++; + histogram_state.smds_scan_android_user_errors_included.inhibit_failed_count++; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/true); { @@ -1368,15 +1394,21 @@ EXPECT_EQ(result, cellular_setup::mojom::ESimOperationResult::kSuccess); EXPECT_FALSE(profile_list->empty()); - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 1, + histogram_state.smds_scan_android_user_errors_filtered.success_count++; + histogram_state.smds_scan_android_user_errors_included.success_count++; + histogram_state.smds_scan_gsma_user_errors_filtered.success_count++; + histogram_state.smds_scan_gsma_user_errors_included.success_count++; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/1, /*gsma_counts=*/1, /*success=*/true); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanProfileCount, /*expected_count=*/1); EXPECT_EQ( static_cast<int64_t>(cellular_utils::GetSmdsActivationCodes().size()), - histogram_tester().GetTotalSum( + histogram_tester()->GetTotalSum( CellularNetworkMetricsLogger::kSmdsScanProfileCount)); } @@ -1390,7 +1422,10 @@ absl::optional<ESimOperationResult> result; absl::optional<std::vector<CellularESimProfile>> profile_list; - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 0, + cellular_metrics::ESimSmdsScanHistogramState histogram_state; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/true); base::RunLoop run_loop; @@ -1417,14 +1452,18 @@ EXPECT_EQ(smds_activation_codes.front(), profile_list->front().activation_code()); - ExpectScanDurationMetricsCount(/*other_count=*/1, /*android_count*/ 0, + histogram_state.smds_scan_other_user_errors_filtered.success_count++; + histogram_state.smds_scan_other_user_errors_included.success_count++; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/1, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/true); - histogram_tester().ExpectTotalCount( + histogram_tester()->ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanProfileCount, /*expected_count=*/1); EXPECT_EQ(static_cast<int64_t>(smds_activation_codes.size()), - histogram_tester().GetTotalSum( + histogram_tester()->GetTotalSum( CellularNetworkMetricsLogger::kSmdsScanProfileCount)); } @@ -1438,7 +1477,10 @@ absl::optional<ESimOperationResult> result; absl::optional<std::vector<CellularESimProfile>> profile_list; - ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count*/ 0, + cellular_metrics::ESimSmdsScanHistogramState histogram_state; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/0, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/false); // Queue errors for each of the expected SM-DS scans. @@ -1470,7 +1512,11 @@ ASSERT_TRUE(result.has_value()); EXPECT_EQ(*result, cellular_setup::mojom::ESimOperationResult::kSuccess); - ExpectScanDurationMetricsCount(/*other_count=*/1, /*android_count*/ 0, + histogram_state.smds_scan_other_user_errors_filtered.hermes_failed_count++; + histogram_state.smds_scan_other_user_errors_included.hermes_failed_count++; + histogram_state.Check(histogram_tester()); + + ExpectScanDurationMetricsCount(/*other_count=*/1, /*android_count=*/0, /*gsma_counts=*/0, /*success=*/false); ASSERT_TRUE(profile_list.has_value());
diff --git a/chromeos/ash/components/network/cellular_policy_handler.cc b/chromeos/ash/components/network/cellular_policy_handler.cc index 61cb05db..7e02519 100644 --- a/chromeos/ash/components/network/cellular_policy_handler.cc +++ b/chromeos/ash/components/network/cellular_policy_handler.cc
@@ -435,6 +435,12 @@ << "Failed to inhibit cellular for refreshing SM-DX profiles"; auto current_request = std::move(remaining_install_requests_.front()); + if (current_request->activation_code.type() == + policy_util::SmdxActivationCode::Type::SMDS) { + CellularNetworkMetricsLogger::LogSmdsScanResult( + current_request->activation_code.value(), + /*result=*/absl::nullopt); + } PopRequest(); ScheduleRetryAndProcessRequests(std::move(current_request), InstallRetryReason::kInternalError); @@ -459,17 +465,19 @@ const std::vector<dbus::ObjectPath>& profile_paths) { DCHECK(inhibit_lock); + auto& current_request = remaining_install_requests_.front(); + const bool is_smds = remaining_install_requests_.front()->activation_code.type() == policy_util::SmdxActivationCode::Type::SMDS; if (is_smds) { + CellularNetworkMetricsLogger::LogSmdsScanResult( + current_request->activation_code.value(), status); CellularNetworkMetricsLogger::LogSmdsScanProfileCount(profile_paths.size()); CellularNetworkMetricsLogger::LogSmdsScanDuration( base::TimeTicks::Now() - start_time, status == HermesResponseStatus::kSuccess, - remaining_install_requests_.front()->activation_code.ToString()); - // TODO(b/278135630): Emit - // Network.Ash.Cellular.ESim.SMDSScan.{SMDSType}.{ResultType}. + current_request->activation_code.ToString()); } std::unique_ptr<CellularESimProfileWaiter> waiter =
diff --git a/chromeos/ash/components/network/cellular_policy_handler_unittest.cc b/chromeos/ash/components/network/cellular_policy_handler_unittest.cc index f8b4ceb..8221ee6 100644 --- a/chromeos/ash/components/network/cellular_policy_handler_unittest.cc +++ b/chromeos/ash/components/network/cellular_policy_handler_unittest.cc
@@ -20,6 +20,7 @@ #include "chromeos/ash/components/network/cellular_utils.h" #include "chromeos/ash/components/network/managed_cellular_pref_handler.h" #include "chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h" +#include "chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.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_handler.h" @@ -146,6 +147,7 @@ size_t scan_duration_android_failure_count = 0u; size_t scan_duration_gsma_success_count = 0u; size_t scan_duration_gsma_failure_count = 0u; + cellular_metrics::ESimSmdsScanHistogramState smds_scan_state; }; CellularPolicyHandlerTest( @@ -368,6 +370,7 @@ histogram_tester_.ExpectTotalCount( CellularNetworkMetricsLogger::kSmdsScanGsmaDurationFailure, /*expected_count=*/state.scan_duration_gsma_failure_count); + state.smds_scan_state.Check(&histogram_tester_); } // This functionality was explicitly separated from InstallProfile() since @@ -496,6 +499,7 @@ ExpectedHistogramState expected_state; CheckHistogramState(expected_state); + const policy_util::SmdxActivationCode activation_code( policy_util::SmdxActivationCode::Type::SMDP, HermesEuiccClient::Get() @@ -584,6 +588,10 @@ expected_state.smds_scan_profile_sum++; expected_state.install_method_via_smds_count++; expected_state.scan_duration_other_success_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_filtered + .success_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_included + .success_count++; CheckHistogramState(expected_state); } @@ -623,6 +631,10 @@ EXPECT_FALSE(HasESimMetadata(activation_code.value())); expected_state.smds_scan_profile_total_count++; expected_state.scan_duration_other_failure_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_filtered + .hermes_failed_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_included + .hermes_failed_count++; CheckHistogramState(expected_state); } @@ -771,6 +783,10 @@ expected_state.smds_scan_profile_sum = 5; expected_state.install_method_via_smds_count++; expected_state.scan_duration_other_success_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_filtered + .success_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_included + .success_count++; CheckHistogramState(expected_state); } @@ -1089,6 +1105,10 @@ expected_state.smds_scan_profile_total_count++; expected_state.smds_scan_profile_sum++; expected_state.scan_duration_other_success_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_filtered + .success_count++; + expected_state.smds_scan_state.smds_scan_other_user_errors_included + .success_count++; CheckHistogramState(expected_state); }
diff --git a/chromeos/ash/components/network/hotspot_controller.cc b/chromeos/ash/components/network/hotspot_controller.cc index 5df298c..9db037f 100644 --- a/chromeos/ash/components/network/hotspot_controller.cc +++ b/chromeos/ash/components/network/hotspot_controller.cc
@@ -50,9 +50,11 @@ } void HotspotController::EnableHotspot(HotspotControlCallback callback) { - if (current_disable_request_) { - NET_LOG(ERROR) - << "Failed to enable hotspot as a disable request is in progress"; + if (current_disable_request_ && + current_disable_request_->disable_reason != + hotspot_config::mojom::DisableReason::kRestart) { + NET_LOG(ERROR) << "Failed to enable hotspot as a non-restart disable " + "request is in progress"; HotspotMetricsHelper::RecordSetTetheringEnabledResult( /*enabled=*/true, hotspot_config::mojom::HotspotControlResult::kInvalid); @@ -240,7 +242,7 @@ } if (result == HotspotControlResult::kSuccess) { - NotifyHotspotTurnedOn(wifi_turned_off_); + NotifyHotspotTurnedOn(); } std::move(current_enable_request_->callback).Run(result); current_enable_request_.reset(); @@ -353,9 +355,9 @@ EnableHotspot(base::DoNothing()); } -void HotspotController::NotifyHotspotTurnedOn(bool wifi_turned_off) { +void HotspotController::NotifyHotspotTurnedOn() { for (auto& observer : observer_list_) { - observer.OnHotspotTurnedOn(wifi_turned_off); + observer.OnHotspotTurnedOn(); } }
diff --git a/chromeos/ash/components/network/hotspot_controller.h b/chromeos/ash/components/network/hotspot_controller.h index 68c3c4e6..c8cc0a1 100644 --- a/chromeos/ash/components/network/hotspot_controller.h +++ b/chromeos/ash/components/network/hotspot_controller.h
@@ -37,7 +37,7 @@ public: ~Observer() override = default; - virtual void OnHotspotTurnedOn(bool wifi_turned_off) = 0; + virtual void OnHotspotTurnedOn() = 0; virtual void OnHotspotTurnedOff( hotspot_config::mojom::DisableReason disable_reason) = 0; @@ -127,7 +127,7 @@ hotspot_config::mojom::HotspotControlResult result); void CompleteDisableRequest( hotspot_config::mojom::HotspotControlResult result); - void NotifyHotspotTurnedOn(bool wifi_turned_off); + void NotifyHotspotTurnedOn(); void NotifyHotspotTurnedOff( hotspot_config::mojom::DisableReason disable_reason);
diff --git a/chromeos/ash/components/network/hotspot_controller_unittest.cc b/chromeos/ash/components/network/hotspot_controller_unittest.cc index 32d95f6..cb453f6 100644 --- a/chromeos/ash/components/network/hotspot_controller_unittest.cc +++ b/chromeos/ash/components/network/hotspot_controller_unittest.cc
@@ -37,9 +37,7 @@ ~TestObserver() override = default; // HotspotStateHandler::Observer: - void OnHotspotTurnedOn(bool wifi_turned_off) override { - hotspot_turned_on_count_++; - } + void OnHotspotTurnedOn() override { hotspot_turned_on_count_++; } void OnHotspotTurnedOff( hotspot_config::mojom::DisableReason disable_reason) override { last_disable_reason_ = disable_reason;
diff --git a/chromeos/ash/components/network/hotspot_enabled_state_notifier.cc b/chromeos/ash/components/network/hotspot_enabled_state_notifier.cc index 861ca3ed..7914121 100644 --- a/chromeos/ash/components/network/hotspot_enabled_state_notifier.cc +++ b/chromeos/ash/components/network/hotspot_enabled_state_notifier.cc
@@ -46,9 +46,9 @@ } } -void HotspotEnabledStateNotifier::OnHotspotTurnedOn(bool wifi_turned_off) { +void HotspotEnabledStateNotifier::OnHotspotTurnedOn() { for (auto& observer : observers_) { - observer->OnHotspotTurnedOn(wifi_turned_off); + observer->OnHotspotTurnedOn(); } }
diff --git a/chromeos/ash/components/network/hotspot_enabled_state_notifier.h b/chromeos/ash/components/network/hotspot_enabled_state_notifier.h index e4265ffd..754baf1 100644 --- a/chromeos/ash/components/network/hotspot_enabled_state_notifier.h +++ b/chromeos/ash/components/network/hotspot_enabled_state_notifier.h
@@ -42,7 +42,7 @@ void OnHotspotStatusChanged() override; // HotspotController::Observer: - void OnHotspotTurnedOn(bool wifi_turned_off) override; + void OnHotspotTurnedOn() override; void OnHotspotTurnedOff( hotspot_config::mojom::DisableReason disable_reason) override;
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc index 76f384a..2ba3ac0 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.cc
@@ -117,6 +117,35 @@ } } +bool IsAndroidActivationCode(const std::string& smds_activation_code) { + return smds_activation_code == cellular_utils::kSmdsAndroidProduction || + smds_activation_code == cellular_utils::kSmdsAndroidStaging; +} + +bool IsGmsaActivationCode(const std::string& smds_activation_code) { + return smds_activation_code == cellular_utils::kSmdsGsma; +} + +const char* GetSmdsScanResultHistogram(const std::string& smds_activation_code, + bool user_errors_included) { + if (IsAndroidActivationCode(smds_activation_code)) { + return user_errors_included ? CellularNetworkMetricsLogger:: + kESimSmdsScanAndroidUserErrorsIncluded + : CellularNetworkMetricsLogger:: + kESimSmdsScanAndroidUserErrorsFiltered; + } + if (smds_activation_code == cellular_utils::kSmdsGsma) { + return user_errors_included ? CellularNetworkMetricsLogger:: + kESimSmdsScanGsmaUserErrorsIncluded + : CellularNetworkMetricsLogger:: + kESimSmdsScanGsmaUserErrorsFiltered; + } + return user_errors_included ? CellularNetworkMetricsLogger:: + kESimSmdsScanOtherUserErrorsIncluded + : CellularNetworkMetricsLogger:: + kESimSmdsScanOtherUserErrorsFiltered; +} + } // namespace CellularNetworkMetricsLogger::CellularNetworkMetricsLogger( @@ -249,18 +278,16 @@ bool success, const std::string& smds_activation_code) { std::string histogram; - if (smds_activation_code == cellular_utils::kSmdsAndroidProduction || - smds_activation_code == cellular_utils::kSmdsAndroidStaging) { + if (IsAndroidActivationCode(smds_activation_code)) { histogram = success ? kSmdsScanAndroidDurationSuccess : kSmdsScanAndroidDurationFailure; - } else if (smds_activation_code == cellular_utils::kSmdsGsma) { + } else if (IsGmsaActivationCode(smds_activation_code)) { histogram = success ? kSmdsScanGsmaDurationSuccess : kSmdsScanGsmaDurationFailure; } else { histogram = success ? kSmdsScanOtherDurationSuccess : kSmdsScanOtherDurationFailure; } - base::UmaHistogramTimes(histogram, duration); } @@ -279,7 +306,7 @@ // static void CellularNetworkMetricsLogger::LogESimUserInstallResult( ESimUserInstallMethod method, - ESimInstallResult result, + ESimOperationResult result, bool is_user_error) { if (!is_user_error) { base::UmaHistogramEnumeration(kESimUserInstallUserErrorsFilteredAll, @@ -297,7 +324,7 @@ // static void CellularNetworkMetricsLogger::LogESimPolicyInstallResult( ESimPolicyInstallMethod method, - ESimInstallResult result, + ESimOperationResult result, bool is_initial, bool is_user_error) { if (!is_user_error) { @@ -314,19 +341,40 @@ GetESimPolicyInstallationResultHistogram( method, /*is_initial=*/is_initial, /*user_errors_included=*/true), result); - GetESimPolicyInstallationResultHistogram(method, is_initial, is_user_error); } // static -CellularNetworkMetricsLogger::ESimInstallResult -CellularNetworkMetricsLogger::ComputeESimInstallResult( +void CellularNetworkMetricsLogger::LogSmdsScanResult( + const std::string& smds_activation_code, + absl::optional<HermesResponseStatus> status) { + const bool is_user_error = + status.has_value() && + CellularNetworkMetricsLogger::HermesResponseStatusIsUserError(*status); + const ESimOperationResult result = + CellularNetworkMetricsLogger::ComputeESimOperationResult(status); + + if (!is_user_error) { + base::UmaHistogramEnumeration( + GetSmdsScanResultHistogram(smds_activation_code, + /*user_errors_included=*/false), + result); + } + base::UmaHistogramEnumeration( + GetSmdsScanResultHistogram(smds_activation_code, + /*user_errors_included=*/true), + result); +} + +// static +CellularNetworkMetricsLogger::ESimOperationResult +CellularNetworkMetricsLogger::ComputeESimOperationResult( absl::optional<HermesResponseStatus> status) { if (status.has_value()) { return *status == HermesResponseStatus::kSuccess - ? ESimInstallResult::kSuccess - : ESimInstallResult::kHermesFailed; + ? ESimOperationResult::kSuccess + : ESimOperationResult::kHermesFailed; } - return ESimInstallResult::kInhibitFailed; + return ESimOperationResult::kInhibitFailed; } // static
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h index 1c7c5b53..1b71ee3 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger.h
@@ -54,7 +54,7 @@ // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. - enum class ESimInstallResult { + enum class ESimOperationResult { kSuccess = 0, kInhibitFailed = 1, kHermesFailed = 2, @@ -229,6 +229,18 @@ "ViaQrCodeSkippedSmds"; static constexpr char kESimUserInstallUserErrorsIncludedViaSmds[] = "Network.Ash.Cellular.ESim.UserInstall.UserErrorsIncluded.ViaSmds"; + static constexpr char kESimSmdsScanOtherUserErrorsFiltered[] = + "Network.Ash.Cellular.ESim.SmdsScan.Other.UserErrorsFiltered"; + static constexpr char kESimSmdsScanOtherUserErrorsIncluded[] = + "Network.Ash.Cellular.ESim.SmdsScan.Other.UserErrorsIncluded"; + static constexpr char kESimSmdsScanAndroidUserErrorsFiltered[] = + "Network.Ash.Cellular.ESim.SmdsScan.Android.UserErrorsFiltered"; + static constexpr char kESimSmdsScanAndroidUserErrorsIncluded[] = + "Network.Ash.Cellular.ESim.SmdsScan.Android.UserErrorsIncluded"; + static constexpr char kESimSmdsScanGsmaUserErrorsFiltered[] = + "Network.Ash.Cellular.ESim.SmdsScan.Gsma.UserErrorsFiltered"; + static constexpr char kESimSmdsScanGsmaUserErrorsIncluded[] = + "Network.Ash.Cellular.ESim.SmdsScan.Gsma.UserErrorsIncluded"; static constexpr char kUserAllowTextMessagesSuppressionStateHistogram[] = "Network.Ash.Cellular.AllowTextMessages.User.SuppressionState"; @@ -276,17 +288,22 @@ // the "filtered" version of our histograms so that we may have a better // understanding of eSIM installations on ChromeOS with minimal noise. static void LogESimUserInstallResult(ESimUserInstallMethod method, - ESimInstallResult result, + ESimOperationResult result, bool is_user_error); static void LogESimPolicyInstallResult(ESimPolicyInstallMethod method, - ESimInstallResult result, + ESimOperationResult result, bool is_initial, bool is_user_error); + // Record the result of a single SM-DS scan of a single SM-DS server. When + // |status| is not provided this function assumes that we failed to inhibit + // the cellular device. + static void LogSmdsScanResult(const std::string& smds_activation_code, + absl::optional<HermesResponseStatus> status); // Returns the eSIM installation result for the provided Hermes response // status. When the status is unavailable, assume that we failed to inhibit // the cellular device. - static ESimInstallResult ComputeESimInstallResult( + static ESimOperationResult ComputeESimOperationResult( absl::optional<HermesResponseStatus> status); // Returns whether |status| is considered a "user error" and should be
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger_unittest.cc b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger_unittest.cc index 2296ad8..b1c9820 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_logger_unittest.cc +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_logger_unittest.cc
@@ -342,7 +342,7 @@ } TEST_F(CellularNetworkMetricsLoggerTest, ESimUserInstall) { - using ESimInstallResult = CellularNetworkMetricsLogger::ESimInstallResult; + using ESimOperationResult = CellularNetworkMetricsLogger::ESimOperationResult; using ESimUserInstallMethod = CellularNetworkMetricsLogger::ESimUserInstallMethod; @@ -350,20 +350,19 @@ state.Check(histogram_tester()); auto do_increment = - [](ash::cellular_metrics::ESimInstallHistogramState::HistogramState* - state, - ESimInstallResult result) { - if (result == ESimInstallResult::kSuccess) { + [](ash::cellular_metrics::ESimOperationResultBucket* state, + ESimOperationResult result) { + if (result == ESimOperationResult::kSuccess) { state->success_count++; - } else if (result == ESimInstallResult::kInhibitFailed) { + } else if (result == ESimOperationResult::kInhibitFailed) { state->inhibit_failed_count++; - } else if (result == ESimInstallResult::kHermesFailed) { + } else if (result == ESimOperationResult::kHermesFailed) { state->hermes_failed_count++; } }; auto increment_user_errors_filtered = [&](ESimUserInstallMethod method, - ESimInstallResult result) { + ESimOperationResult result) { do_increment(&state.user_install_user_errors_filtered_all, result); if (method == ESimUserInstallMethod::kViaSmds) { do_increment(&state.user_install_user_errors_filtered_via_smds, result); @@ -389,7 +388,7 @@ }; auto increment_user_errors_included = [&](ESimUserInstallMethod method, - ESimInstallResult result) { + ESimOperationResult result) { do_increment(&state.user_install_user_errors_included_all, result); if (method == ESimUserInstallMethod::kViaSmds) { do_increment(&state.user_install_user_errors_included_via_smds, result); @@ -415,9 +414,9 @@ }; auto emit_and_check = [this, &increment_user_errors_filtered, - &increment_user_errors_included, - &state](ESimUserInstallMethod method, - ESimInstallResult result, bool is_user_error) { + &increment_user_errors_included, &state]( + ESimUserInstallMethod method, + ESimOperationResult result, bool is_user_error) { CellularNetworkMetricsLogger::LogESimUserInstallResult(method, result, is_user_error); if (!is_user_error) { @@ -433,8 +432,8 @@ ESimUserInstallMethod::kViaActivationCodeAfterSmds, ESimUserInstallMethod::kViaActivationCodeSkippedSmds}) { for (auto result : - {ESimInstallResult::kSuccess, ESimInstallResult::kInhibitFailed, - ESimInstallResult::kHermesFailed}) { + {ESimOperationResult::kSuccess, ESimOperationResult::kInhibitFailed, + ESimOperationResult::kHermesFailed}) { for (auto is_user_error : {true, false}) { emit_and_check(method, result, is_user_error); } @@ -443,7 +442,7 @@ } TEST_F(CellularNetworkMetricsLoggerTest, ESimPolicyInstall) { - using ESimInstallResult = CellularNetworkMetricsLogger::ESimInstallResult; + using ESimOperationResult = CellularNetworkMetricsLogger::ESimOperationResult; using ESimPolicyInstallMethod = CellularNetworkMetricsLogger::ESimPolicyInstallMethod; @@ -451,19 +450,18 @@ state.Check(histogram_tester()); auto do_increment = - [](ash::cellular_metrics::ESimInstallHistogramState::HistogramState* - state, - ESimInstallResult result) { - if (result == ESimInstallResult::kSuccess) { + [](ash::cellular_metrics::ESimOperationResultBucket* state, + ESimOperationResult result) { + if (result == ESimOperationResult::kSuccess) { state->success_count++; - } else if (result == ESimInstallResult::kInhibitFailed) { + } else if (result == ESimOperationResult::kInhibitFailed) { state->inhibit_failed_count++; - } else if (result == ESimInstallResult::kHermesFailed) { + } else if (result == ESimOperationResult::kHermesFailed) { state->hermes_failed_count++; } }; - auto increment_user_errors_filtered_smdp = [&](ESimInstallResult result, + auto increment_user_errors_filtered_smdp = [&](ESimOperationResult result, bool is_initial) { if (is_initial) { do_increment(&state.policy_install_user_errors_filtered_smdp_initial, @@ -474,7 +472,7 @@ } }; - auto increment_user_errors_filtered_smds = [&](ESimInstallResult result, + auto increment_user_errors_filtered_smds = [&](ESimOperationResult result, bool is_initial) { if (is_initial) { do_increment(&state.policy_install_user_errors_filtered_smds_initial, @@ -486,7 +484,7 @@ }; auto increment_user_errors_filtered = [&](ESimPolicyInstallMethod method, - ESimInstallResult result, + ESimOperationResult result, bool is_initial) { do_increment(&state.policy_install_user_errors_filtered_all, result); if (method == ESimPolicyInstallMethod::kViaSmdp) { @@ -496,7 +494,7 @@ } }; - auto increment_user_errors_included_smdp = [&](ESimInstallResult result, + auto increment_user_errors_included_smdp = [&](ESimOperationResult result, bool is_initial) { if (is_initial) { do_increment(&state.policy_install_user_errors_included_smdp_initial, @@ -507,7 +505,7 @@ } }; - auto increment_user_errors_included_smds = [&](ESimInstallResult result, + auto increment_user_errors_included_smds = [&](ESimOperationResult result, bool is_initial) { if (is_initial) { do_increment(&state.policy_install_user_errors_included_smds_initial, @@ -519,7 +517,7 @@ }; auto increment_user_errors_included = [&](ESimPolicyInstallMethod method, - ESimInstallResult result, + ESimOperationResult result, bool is_initial) { do_increment(&state.policy_install_user_errors_included_all, result); if (method == ESimPolicyInstallMethod::kViaSmdp) { @@ -531,7 +529,7 @@ auto emit_and_check = [this, &increment_user_errors_filtered, &increment_user_errors_included, - &state](ESimPolicyInstallMethod method, ESimInstallResult result, + &state](ESimPolicyInstallMethod method, ESimOperationResult result, bool is_initial, bool is_user_error) { CellularNetworkMetricsLogger::LogESimPolicyInstallResult( method, result, is_initial, is_user_error); @@ -545,8 +543,8 @@ for (auto method : {ESimPolicyInstallMethod::kViaSmdp, ESimPolicyInstallMethod::kViaSmds}) { for (auto result : - {ESimInstallResult::kSuccess, ESimInstallResult::kInhibitFailed, - ESimInstallResult::kHermesFailed}) { + {ESimOperationResult::kSuccess, ESimOperationResult::kInhibitFailed, + ESimOperationResult::kHermesFailed}) { for (auto is_initial : {true, false}) { for (auto is_user_error : {true, false}) { emit_and_check(method, result, is_initial, is_user_error);
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.cc b/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.cc index 1914bd2..5f80091 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.cc +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.cc
@@ -12,118 +12,116 @@ namespace ash { namespace cellular_metrics { +void ESimOperationResultBucket::Check(const base::HistogramTester* tester, + const char* histogram) const { + DCHECK(histogram); + using InstallESimProfileResult = + CellularNetworkMetricsLogger::ESimOperationResult; + tester->ExpectBucketCount(histogram, InstallESimProfileResult::kSuccess, + /*expected_count=*/success_count); + tester->ExpectBucketCount(histogram, InstallESimProfileResult::kInhibitFailed, + /*expected_count=*/inhibit_failed_count); + tester->ExpectBucketCount(histogram, InstallESimProfileResult::kHermesFailed, + /*expected_count=*/hermes_failed_count); +} + ESimInstallHistogramState::ESimInstallHistogramState() = default; void ESimInstallHistogramState::Check( const base::HistogramTester* tester) const { DCHECK(tester); - CheckHistogram( + policy_install_user_errors_filtered_all.Check( tester, - CellularNetworkMetricsLogger::kESimPolicyInstallUserErrorsFilteredAll, - policy_install_user_errors_filtered_all); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsFilteredViaSmdpInitial, - policy_install_user_errors_filtered_smdp_initial); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsFilteredViaSmdpRetry, - policy_install_user_errors_filtered_smdp_retry); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsFilteredViaSmdsInitial, - policy_install_user_errors_filtered_smds_initial); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsFilteredViaSmdsRetry, - policy_install_user_errors_filtered_smds_retry); - CheckHistogram( + CellularNetworkMetricsLogger::kESimPolicyInstallUserErrorsFilteredAll); + policy_install_user_errors_filtered_smdp_initial.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsFilteredViaSmdpInitial); + policy_install_user_errors_filtered_smdp_retry.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsFilteredViaSmdpRetry); + policy_install_user_errors_filtered_smds_initial.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsFilteredViaSmdsInitial); + policy_install_user_errors_filtered_smds_retry.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsFilteredViaSmdsRetry); + policy_install_user_errors_included_all.Check( tester, - CellularNetworkMetricsLogger::kESimPolicyInstallUserErrorsIncludedAll, - policy_install_user_errors_included_all); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsIncludedViaSmdpInitial, - policy_install_user_errors_included_smdp_initial); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsIncludedViaSmdpRetry, - policy_install_user_errors_included_smdp_retry); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsIncludedViaSmdsInitial, - policy_install_user_errors_included_smds_initial); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimPolicyInstallUserErrorsIncludedViaSmdsRetry, - policy_install_user_errors_included_smds_retry); - CheckHistogram( + CellularNetworkMetricsLogger::kESimPolicyInstallUserErrorsIncludedAll); + policy_install_user_errors_included_smdp_initial.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsIncludedViaSmdpInitial); + policy_install_user_errors_included_smdp_retry.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsIncludedViaSmdpRetry); + policy_install_user_errors_included_smds_initial.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsIncludedViaSmdsInitial); + policy_install_user_errors_included_smds_retry.Check( + tester, CellularNetworkMetricsLogger:: + kESimPolicyInstallUserErrorsIncludedViaSmdsRetry); + user_install_user_errors_filtered_all.Check( tester, - CellularNetworkMetricsLogger::kESimUserInstallUserErrorsFilteredAll, - user_install_user_errors_filtered_all); - CheckHistogram( + CellularNetworkMetricsLogger::kESimUserInstallUserErrorsFilteredAll); + user_install_user_errors_filtered_via_activation_code_after_smds.Check( + tester, CellularNetworkMetricsLogger:: + kESimUserInstallUserErrorsFilteredViaActivationCodeAfterSmds); + user_install_user_errors_filtered_via_activation_code_skipped_smds.Check( tester, CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsFilteredViaActivationCodeAfterSmds, - user_install_user_errors_filtered_via_activation_code_after_smds); - CheckHistogram( + kESimUserInstallUserErrorsFilteredViaActivationCodeSkippedSmds); + user_install_user_errors_filtered_via_qr_code_after_smds.Check( + tester, CellularNetworkMetricsLogger:: + kESimUserInstallUserErrorsFilteredViaQrCodeAfterSmds); + user_install_user_errors_filtered_via_qr_code_skipped_smds.Check( + tester, CellularNetworkMetricsLogger:: + kESimUserInstallUserErrorsFilteredViaQrCodeSkippedSmds); + user_install_user_errors_filtered_via_smds.Check( + tester, + CellularNetworkMetricsLogger::kESimUserInstallUserErrorsFilteredViaSmds); + user_install_user_errors_included_all.Check( + tester, + CellularNetworkMetricsLogger::kESimUserInstallUserErrorsIncludedAll); + user_install_user_errors_included_via_activation_code_after_smds.Check( + tester, CellularNetworkMetricsLogger:: + kESimUserInstallUserErrorsIncludedViaActivationCodeAfterSmds); + user_install_user_errors_included_via_activation_code_skipped_smds.Check( tester, CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsFilteredViaActivationCodeSkippedSmds, - user_install_user_errors_filtered_via_activation_code_skipped_smds); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsFilteredViaQrCodeAfterSmds, - user_install_user_errors_filtered_via_qr_code_after_smds); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsFilteredViaQrCodeSkippedSmds, - user_install_user_errors_filtered_via_qr_code_skipped_smds); - CheckHistogram( + kESimUserInstallUserErrorsIncludedViaActivationCodeSkippedSmds); + user_install_user_errors_included_via_qr_code_after_smds.Check( + tester, CellularNetworkMetricsLogger:: + kESimUserInstallUserErrorsIncludedViaQrCodeAfterSmds); + user_install_user_errors_included_via_qr_code_skipped_smds.Check( + tester, CellularNetworkMetricsLogger:: + kESimUserInstallUserErrorsIncludedViaQrCodeSkippedSmds); + user_install_user_errors_included_via_smds.Check( tester, - CellularNetworkMetricsLogger::kESimUserInstallUserErrorsFilteredViaSmds, - user_install_user_errors_filtered_via_smds); - CheckHistogram( - tester, - CellularNetworkMetricsLogger::kESimUserInstallUserErrorsIncludedAll, - user_install_user_errors_included_all); - CheckHistogram( - tester, - CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsIncludedViaActivationCodeAfterSmds, - user_install_user_errors_included_via_activation_code_after_smds); - CheckHistogram( - tester, - CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsIncludedViaActivationCodeSkippedSmds, - user_install_user_errors_included_via_activation_code_skipped_smds); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsIncludedViaQrCodeAfterSmds, - user_install_user_errors_included_via_qr_code_after_smds); - CheckHistogram(tester, - CellularNetworkMetricsLogger:: - kESimUserInstallUserErrorsIncludedViaQrCodeSkippedSmds, - user_install_user_errors_included_via_qr_code_skipped_smds); - CheckHistogram( - tester, - CellularNetworkMetricsLogger::kESimUserInstallUserErrorsIncludedViaSmds, - user_install_user_errors_included_via_smds); + CellularNetworkMetricsLogger::kESimUserInstallUserErrorsIncludedViaSmds); } -void ESimInstallHistogramState::CheckHistogram( - const base::HistogramTester* tester, - const char* histogram, - const HistogramState& state) const { - DCHECK(histogram); - using InstallESimProfileResult = - CellularNetworkMetricsLogger::ESimInstallResult; - tester->ExpectBucketCount(histogram, InstallESimProfileResult::kSuccess, - /*expected_count=*/state.success_count); - tester->ExpectBucketCount(histogram, InstallESimProfileResult::kInhibitFailed, - /*expected_count=*/state.inhibit_failed_count); - tester->ExpectBucketCount(histogram, InstallESimProfileResult::kHermesFailed, - /*expected_count=*/state.hermes_failed_count); +ESimSmdsScanHistogramState::ESimSmdsScanHistogramState() = default; + +void ESimSmdsScanHistogramState::Check( + const base::HistogramTester* tester) const { + smds_scan_other_user_errors_filtered.Check( + tester, + CellularNetworkMetricsLogger::kESimSmdsScanOtherUserErrorsFiltered); + smds_scan_other_user_errors_included.Check( + tester, + CellularNetworkMetricsLogger::kESimSmdsScanOtherUserErrorsIncluded); + smds_scan_android_user_errors_filtered.Check( + tester, + CellularNetworkMetricsLogger::kESimSmdsScanAndroidUserErrorsFiltered); + smds_scan_android_user_errors_included.Check( + tester, + CellularNetworkMetricsLogger::kESimSmdsScanAndroidUserErrorsIncluded); + smds_scan_gsma_user_errors_filtered.Check( + tester, + CellularNetworkMetricsLogger::kESimSmdsScanGsmaUserErrorsFiltered); + smds_scan_gsma_user_errors_included.Check( + tester, + CellularNetworkMetricsLogger::kESimSmdsScanGsmaUserErrorsIncluded); } } // namespace cellular_metrics
diff --git a/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.h b/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.h index b4fed90..e00d9ae 100644 --- a/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.h +++ b/chromeos/ash/components/network/metrics/cellular_network_metrics_test_helper.h
@@ -14,49 +14,65 @@ namespace ash { namespace cellular_metrics { +struct ESimOperationResultBucket { + void Check(const base::HistogramTester* tester, const char* histogram) const; + + size_t success_count = 0u; + size_t inhibit_failed_count = 0u; + size_t hermes_failed_count = 0u; +}; + // This helper struct is used in tests to simplify the logic around checking the // many eSIM installation histograms. This struct allows clients to assert the // counts for all histograms without any added complexity when writing tests. struct ESimInstallHistogramState { - struct HistogramState { - size_t success_count = 0u; - size_t inhibit_failed_count = 0u; - size_t hermes_failed_count = 0u; - }; - ESimInstallHistogramState(); void Check(const base::HistogramTester* tester) const; - void CheckHistogram(const base::HistogramTester* tester, - const char* histogram, - const HistogramState& state) const; - HistogramState policy_install_user_errors_filtered_all; - HistogramState policy_install_user_errors_filtered_smdp_initial; - HistogramState policy_install_user_errors_filtered_smdp_retry; - HistogramState policy_install_user_errors_filtered_smds_initial; - HistogramState policy_install_user_errors_filtered_smds_retry; - HistogramState policy_install_user_errors_included_all; - HistogramState policy_install_user_errors_included_smdp_initial; - HistogramState policy_install_user_errors_included_smdp_retry; - HistogramState policy_install_user_errors_included_smds_initial; - HistogramState policy_install_user_errors_included_smds_retry; - HistogramState user_install_user_errors_filtered_all; - HistogramState + ESimOperationResultBucket policy_install_user_errors_filtered_all; + ESimOperationResultBucket policy_install_user_errors_filtered_smdp_initial; + ESimOperationResultBucket policy_install_user_errors_filtered_smdp_retry; + ESimOperationResultBucket policy_install_user_errors_filtered_smds_initial; + ESimOperationResultBucket policy_install_user_errors_filtered_smds_retry; + ESimOperationResultBucket policy_install_user_errors_included_all; + ESimOperationResultBucket policy_install_user_errors_included_smdp_initial; + ESimOperationResultBucket policy_install_user_errors_included_smdp_retry; + ESimOperationResultBucket policy_install_user_errors_included_smds_initial; + ESimOperationResultBucket policy_install_user_errors_included_smds_retry; + ESimOperationResultBucket user_install_user_errors_filtered_all; + ESimOperationResultBucket user_install_user_errors_filtered_via_activation_code_after_smds; - HistogramState + ESimOperationResultBucket user_install_user_errors_filtered_via_activation_code_skipped_smds; - HistogramState user_install_user_errors_filtered_via_qr_code_after_smds; - HistogramState user_install_user_errors_filtered_via_qr_code_skipped_smds; - HistogramState user_install_user_errors_filtered_via_smds; - HistogramState user_install_user_errors_included_all; - HistogramState + ESimOperationResultBucket + user_install_user_errors_filtered_via_qr_code_after_smds; + ESimOperationResultBucket + user_install_user_errors_filtered_via_qr_code_skipped_smds; + ESimOperationResultBucket user_install_user_errors_filtered_via_smds; + ESimOperationResultBucket user_install_user_errors_included_all; + ESimOperationResultBucket user_install_user_errors_included_via_activation_code_after_smds; - HistogramState + ESimOperationResultBucket user_install_user_errors_included_via_activation_code_skipped_smds; - HistogramState user_install_user_errors_included_via_qr_code_after_smds; - HistogramState user_install_user_errors_included_via_qr_code_skipped_smds; - HistogramState user_install_user_errors_included_via_smds; + ESimOperationResultBucket + user_install_user_errors_included_via_qr_code_after_smds; + ESimOperationResultBucket + user_install_user_errors_included_via_qr_code_skipped_smds; + ESimOperationResultBucket user_install_user_errors_included_via_smds; +}; + +struct ESimSmdsScanHistogramState { + ESimSmdsScanHistogramState(); + + void Check(const base::HistogramTester* tester) const; + + ESimOperationResultBucket smds_scan_other_user_errors_filtered; + ESimOperationResultBucket smds_scan_other_user_errors_included; + ESimOperationResultBucket smds_scan_android_user_errors_filtered; + ESimOperationResultBucket smds_scan_android_user_errors_included; + ESimOperationResultBucket smds_scan_gsma_user_errors_filtered; + ESimOperationResultBucket smds_scan_gsma_user_errors_included; }; } // namespace cellular_metrics
diff --git a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc index 951a253..600cc5f 100644 --- a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc +++ b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.cc
@@ -383,7 +383,7 @@ GetMetricsDisableReason(reason)); } -void HotspotMetricsHelper::OnHotspotTurnedOn(bool wifi_turned_off) { +void HotspotMetricsHelper::OnHotspotTurnedOn() { is_hotspot_active_ = true; LogUpstreamStatus(); LogUsageConfig();
diff --git a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h index 7c8e49e..9a5c709 100644 --- a/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h +++ b/chromeos/ash/components/network/metrics/hotspot_metrics_helper.h
@@ -220,7 +220,7 @@ void LoggedInStateChanged() override; // hotspot_config::mojom::HotspotEnabledStateObserver: - void OnHotspotTurnedOn(bool wifi_turned_off) override; + void OnHotspotTurnedOn() override; void OnHotspotTurnedOff(hotspot_config::mojom::DisableReason reason) override; void LogAllowStatus();
diff --git a/chromeos/ash/components/scanning/scanner.h b/chromeos/ash/components/scanning/scanner.h index 59f1cdb..5844bf8f 100644 --- a/chromeos/ash/components/scanning/scanner.h +++ b/chromeos/ash/components/scanning/scanner.h
@@ -54,6 +54,12 @@ // Name to display in a UI. std::string display_name; + // Name of manufacturer. + std::string manufacturer; + + // Name of model. + std::string model; + // Map of ScanProtocol to a set of corresponding ScannerDeviceNames that can // be used with the lorgnette D-Bus service. Clients are responsible for // selecting which device name to use.
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.cc b/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.cc index 99964cc..fe6fe25 100644 --- a/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.cc +++ b/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.cc
@@ -39,7 +39,7 @@ void FakeCrosHotspotConfig::EnableHotspot(EnableHotspotCallback callback) { hotspot_info_->state = mojom::HotspotState::kEnabled; NotifyHotspotInfoObservers(); - NotifyHotspotTurnedOn(/*wifi_turned_off=*/false); + NotifyHotspotTurnedOn(); std::move(callback).Run(mojom::HotspotControlResult::kSuccess); } @@ -67,9 +67,9 @@ } } -void FakeCrosHotspotConfig::NotifyHotspotTurnedOn(bool wifi_turned_off) { +void FakeCrosHotspotConfig::NotifyHotspotTurnedOn() { for (auto& observer : hotspot_enabled_state_observers_) { - observer->OnHotspotTurnedOn(wifi_turned_off); + observer->OnHotspotTurnedOn(); } }
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.h b/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.h index fa5d9f0..c89637c 100644 --- a/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.h +++ b/chromeos/ash/services/hotspot_config/public/cpp/fake_cros_hotspot_config.h
@@ -38,7 +38,7 @@ private: void NotifyHotspotInfoObservers(); - void NotifyHotspotTurnedOn(bool wifi_turned_off); + void NotifyHotspotTurnedOn(); void NotifyHotspotTurnedOff(mojom::DisableReason reason); mojom::HotspotInfoPtr hotspot_info_;
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc index bccad24..96778b8 100644 --- a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc +++ b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.cc
@@ -14,7 +14,7 @@ return receiver().BindNewPipeAndPassRemote(); } -void HotspotEnabledStateTestObserver::OnHotspotTurnedOn(bool wifi_turned_off) { +void HotspotEnabledStateTestObserver::OnHotspotTurnedOn() { hotspot_turned_on_count_++; }
diff --git a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h index 1b1dc13..dea7d318 100644 --- a/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h +++ b/chromeos/ash/services/hotspot_config/public/cpp/hotspot_enabled_state_test_observer.h
@@ -27,7 +27,7 @@ mojo::PendingRemote<mojom::HotspotEnabledStateObserver> GenerateRemote(); // mojom::HotspotEnabledStateObserver: - void OnHotspotTurnedOn(bool wifi_turned_off) override; + void OnHotspotTurnedOn() override; void OnHotspotTurnedOff(mojom::DisableReason disable_reason) override;
diff --git a/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom b/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom index 1812172e..eb34b30 100644 --- a/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom +++ b/chromeos/ash/services/hotspot_config/public/mojom/cros_hotspot_config.mojom
@@ -179,9 +179,8 @@ // HotspotEnabledStateObserver is implemented by any module that needs // to observe changes to the hotspot enabled state. interface HotspotEnabledStateObserver { - // Called when Hotspot is successfully turned on. `wifi_turned_off` - // indicates that WiFi was disabled in order to turn on Hotspot. - OnHotspotTurnedOn(bool wifi_turned_off); + // Called when Hotspot is successfully turned on. + OnHotspotTurnedOn(); // Called when Hotspot is successfully turned off. `disable_reason` // indicates the reason why Hotspot was turned off.
diff --git a/chromeos/crosapi/mojom/local_printer.mojom b/chromeos/crosapi/mojom/local_printer.mojom index d723e34..81cd8f5 100644 --- a/chromeos/crosapi/mojom/local_printer.mojom +++ b/chromeos/crosapi/mojom/local_printer.mojom
@@ -272,6 +272,14 @@ kExtension, }; +// This interface is used to notify Lacros about local printer events. +[Stable] +interface LocalPrintersObserver { + // Fires for any update to a local printer and sends the full set of connected + // local printers. + OnLocalPrintersUpdated@0(array<LocalDestinationInfo> printers); +}; + // This union of structs represents the OAuth-related status of a printer. [Stable] struct OAuthNotNeeded {}; @@ -364,4 +372,9 @@ [MinVersion=5] GetIppClientInfo@15(string printer_id) => (array<printing.mojom.IppClientInfo> settings); + + // Adds a local printers observer. + [MinVersion=6] + AddLocalPrintersObserver@16(pending_remote<LocalPrintersObserver> observer) + => (array<LocalDestinationInfo> printers); };
diff --git a/clank b/clank index c3b5fed..aa3c18d 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit c3b5fedc549373d6593a9fccb650bc1fd6567ef8 +Subproject commit aa3c18d7af25c04cdf5ff613708d191707815647
diff --git a/components/android_autofill/browser/form_data_android_unittest.cc b/components/android_autofill/browser/form_data_android_unittest.cc index 1d57f6b..0db1149f 100644 --- a/components/android_autofill/browser/form_data_android_unittest.cc +++ b/components/android_autofill/browser/form_data_android_unittest.cc
@@ -47,7 +47,7 @@ f.name = std::move(name); f.name_attribute = f.name; f.id_attribute = u"some_id"; - f.form_control_type = StringToFormControlType("text"); + f.form_control_type = FormControlType::kInputText; f.check_status = FormFieldData::CheckStatus::kChecked; f.role = FormFieldData::RoleAttribute::kOther; f.is_focusable = true;
diff --git a/components/android_autofill/browser/form_field_data_android_unittest.cc b/components/android_autofill/browser/form_field_data_android_unittest.cc index 2ea0905..502e77d 100644 --- a/components/android_autofill/browser/form_field_data_android_unittest.cc +++ b/components/android_autofill/browser/form_field_data_android_unittest.cc
@@ -43,7 +43,7 @@ f.name = u"SomeName"; f.name_attribute = f.name; f.id_attribute = u"some_id"; - f.form_control_type = StringToFormControlType("text"); + f.form_control_type = FormControlType::kInputText; f.check_status = FormFieldData::CheckStatus::kChecked; return f; } @@ -136,7 +136,7 @@ // If form control types differ, they are not similar. f2 = f1; - f2.form_control_type = StringToFormControlType("password"); + f2.form_control_type = FormControlType::kInputPassword; EXPECT_FALSE(af.SimilarFieldAs(f2)); // If global ids differ, they are not similar.
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java index 079c3e7..0d1e675 100644 --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProvider.java
@@ -111,6 +111,7 @@ } public void destroy() { + mAutofillUMA.recordSession(); detachFromJavaAutofillProvider(); mAutofillManager.destroy(); } @@ -565,6 +566,7 @@ public void setWebContents(WebContents webContents) { if (webContents == mWebContents) return; + mAutofillUMA.recordSession(); if (mWebContents != null) mRequest = null; mWebContents = webContents; detachFromJavaAutofillProvider();
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProviderUMA.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProviderUMA.java index 1fd9a38..d67ff8a9 100644 --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProviderUMA.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillProviderUMA.java
@@ -312,6 +312,8 @@ public void onFormSubmitted(int submissionSource) { if (mRecorder != null) mRecorder.record(SessionRecorder.EVENT_FORM_SUBMITTED); recordSession(); + // TODO(crbug.com/1484985): Consider moving the call to the ServerPredictionRecorder + // into recordSession. Is it unclear why this is only recorded on form submission. if (mServerPredictionRecorder != null) mServerPredictionRecorder.recordHistograms(); // We record this no matter autofill service is disabled or not. RecordHistogram.recordEnumeratedHistogram(UMA_AUTOFILL_SUBMISSION_SOURCE, @@ -401,18 +403,25 @@ } } - private static void recordUmaAutofillProvider(int autofillProvider) { - RecordHistogram.recordEnumeratedHistogram( - UMA_AUTOFILL_PROVIDER, autofillProvider, AUTOFILL_PROVIDER_MAX); - } - - private void recordSession() { + /** + * Records the session-related Autofill metrics, i.e. the witnessed Autofill + * events and the AUTOFILL_SESSION UMA. + * + * After recording, it resets the SessionRecorder. Calling it again is a + * no-op until a new session has been started. + */ + public void recordSession() { if (mAutofillDisabled != null && !mAutofillDisabled.booleanValue() && mRecorder != null) { mRecorder.recordHistogram(); } mRecorder = null; } + private static void recordUmaAutofillProvider(int autofillProvider) { + RecordHistogram.recordEnumeratedHistogram( + UMA_AUTOFILL_PROVIDER, autofillProvider, AUTOFILL_PROVIDER_MAX); + } + private int toUMASubmissionSource(int source) { switch (source) { case SubmissionSource.SAME_DOCUMENT_NAVIGATION:
diff --git a/components/attribution_reporting/constants.h b/components/attribution_reporting/constants.h index d70083e..0ecba63f 100644 --- a/components/attribution_reporting/constants.h +++ b/components/attribution_reporting/constants.h
@@ -31,6 +31,10 @@ static_assert(kMinSourceExpiry < kMaxSourceExpiry); +constexpr base::TimeDelta kMinReportWindow = base::Hours(1); + +static_assert(kMinReportWindow <= kMinSourceExpiry); + } // namespace attribution_reporting #endif // COMPONENTS_ATTRIBUTION_REPORTING_CONSTANTS_H_
diff --git a/components/attribution_reporting/event_report_windows.cc b/components/attribution_reporting/event_report_windows.cc index c94c794..84d4f99 100644 --- a/components/attribution_reporting/event_report_windows.cc +++ b/components/attribution_reporting/event_report_windows.cc
@@ -35,8 +35,6 @@ constexpr char kStartTime[] = "start_time"; constexpr char kEndTimes[] = "end_times"; -constexpr base::TimeDelta kMinReportWindow = base::Hours(1); - bool EventReportWindowsValid(base::TimeDelta start_time, const base::flat_set<base::TimeDelta>& end_times) { // TODO(apaseltiner): This should also check `*end_times.begin() >= @@ -280,7 +278,7 @@ return base::unexpected( SourceRegistrationError::kEventReportWindowsEndTimeValueWrongType); } - if (item_int.value() < 0) { + if (item_int.value() <= 0) { return base::unexpected( SourceRegistrationError::kEventReportWindowsEndTimeValueInvalid); }
diff --git a/components/attribution_reporting/event_report_windows_unittest.cc b/components/attribution_reporting/event_report_windows_unittest.cc index 1222187..2d8d1de72 100644 --- a/components/attribution_reporting/event_report_windows_unittest.cc +++ b/components/attribution_reporting/event_report_windows_unittest.cc
@@ -298,6 +298,15 @@ SourceRegistrationError::kEventReportWindowsEndTimeValueInvalid), }, { + "event_report_windows_end_times_value_zero", + R"json({"event_report_windows":{ + "start_time":0, + "end_times":[0] + }})json", + ErrorIs( + SourceRegistrationError::kEventReportWindowsEndTimeValueInvalid), + }, + { "event_report_windows_start_time_equal_end", R"json({"event_report_windows":{ "start_time":3600,
diff --git a/components/attribution_reporting/registration.mojom b/components/attribution_reporting/registration.mojom index 4d48df9..e92717e 100644 --- a/components/attribution_reporting/registration.mojom +++ b/components/attribution_reporting/registration.mojom
@@ -91,9 +91,9 @@ // bounds of a report being generated with this source. EventReportWindows? event_report_windows; - // Optionally specifies how long after source registration an aggregatable + // Specifies how long after source registration an aggregatable // report can be generated with this source. - mojo_base.mojom.TimeDelta? aggregatable_report_window; + mojo_base.mojom.TimeDelta aggregatable_report_window; // Specifies how many event-level reports can be generated with this source. int32 max_event_level_reports;
diff --git a/components/attribution_reporting/registration_mojom_traits.h b/components/attribution_reporting/registration_mojom_traits.h index 218a883e..8d1daed 100644 --- a/components/attribution_reporting/registration_mojom_traits.h +++ b/components/attribution_reporting/registration_mojom_traits.h
@@ -173,7 +173,7 @@ return source.expiry; } - static absl::optional<base::TimeDelta> aggregatable_report_window( + static base::TimeDelta aggregatable_report_window( const attribution_reporting::SourceRegistration& source) { return source.aggregatable_report_window; }
diff --git a/components/attribution_reporting/source_registration.cc b/components/attribution_reporting/source_registration.cc index 8ed8e02..859a044e 100644 --- a/components/attribution_reporting/source_registration.cc +++ b/components/attribution_reporting/source_registration.cc
@@ -150,6 +150,11 @@ ParseLegacyDuration( *value, SourceRegistrationError::kAggregatableReportWindowValueInvalid)); + + result.aggregatable_report_window = std::clamp( + result.aggregatable_report_window, kMinReportWindow, result.expiry); + } else { + result.aggregatable_report_window = result.expiry; } if (const base::Value* value = registration.Find(kMaxEventLevelReports)) { @@ -230,8 +235,8 @@ return false; } - if (aggregatable_report_window.has_value() && - aggregatable_report_window->is_negative()) { + if (aggregatable_report_window < kMinReportWindow || + aggregatable_report_window > expiry) { return false; }
diff --git a/components/attribution_reporting/source_registration.h b/components/attribution_reporting/source_registration.h index 79e6d53..d91940f 100644 --- a/components/attribution_reporting/source_registration.h +++ b/components/attribution_reporting/source_registration.h
@@ -61,7 +61,7 @@ // the `Parse()` and `IsValid()` methods. base::TimeDelta expiry = kMaxSourceExpiry; absl::optional<EventReportWindows> event_report_windows; - absl::optional<base::TimeDelta> aggregatable_report_window; + base::TimeDelta aggregatable_report_window = expiry; // Must be non-negative and <= `kMaxSettableEventLevelAttributions`. // This is verified by the `Parse()` and `IsValid()` methods. int max_event_level_reports = 0;
diff --git a/components/attribution_reporting/source_registration_unittest.cc b/components/attribution_reporting/source_registration_unittest.cc index e47b5d6..36c6c2a 100644 --- a/components/attribution_reporting/source_registration_unittest.cc +++ b/components/attribution_reporting/source_registration_unittest.cc
@@ -75,7 +75,7 @@ Field(&SourceRegistration::expiry, base::Days(30)), Field(&SourceRegistration::event_report_windows, absl::nullopt), Field(&SourceRegistration::aggregatable_report_window, - absl::nullopt), + base::Days(30)), Field(&SourceRegistration::max_event_level_reports, 3), Field(&SourceRegistration::priority, 0), Field(&SourceRegistration::filter_data, FilterData()), @@ -240,6 +240,18 @@ SourceRegistrationError::kAggregatableReportWindowValueInvalid), }, { + "aggregatable_report_window_clamped_min", + R"json({"aggregatable_report_window":3599,"destination":"https://d.example"})json", + ValueIs(Field(&SourceRegistration::aggregatable_report_window, + base::Seconds(3600))), + }, + { + "aggregatable_report_window_clamped_max", + R"json({"aggregatable_report_window":259200,"expiry":172800,"destination":"https://d.example"})json", + ValueIs(Field(&SourceRegistration::aggregatable_report_window, + base::Seconds(172800))), + }, + { "max_event_level_reports_omitted_event", R"json({"destination":"https://d.example"})json", ValueIs(Field(&SourceRegistration::max_event_level_reports, 1)), @@ -356,6 +368,7 @@ { SourceRegistration(destination), R"json({ + "aggregatable_report_window": 2592000, "debug_reporting": false, "destination":"https://d.example", "expiry": 2592000, @@ -410,26 +423,37 @@ EXPECT_FALSE(SourceRegistrationWith(destination, [](SourceRegistration& r) { r.expiry = base::Days(1) - base::Microseconds(1); + r.aggregatable_report_window = r.expiry; }).IsValid()); EXPECT_FALSE(SourceRegistrationWith(destination, [](SourceRegistration& r) { r.expiry = base::Days(30) + base::Microseconds(1); + r.aggregatable_report_window = r.expiry; }).IsValid()); EXPECT_TRUE(SourceRegistrationWith(destination, [](SourceRegistration& r) { r.expiry = base::Days(1); + r.aggregatable_report_window = r.expiry; }).IsValid()); EXPECT_TRUE(SourceRegistrationWith(destination, [](SourceRegistration& r) { r.expiry = base::Days(30); + r.aggregatable_report_window = r.expiry; }).IsValid()); EXPECT_FALSE(SourceRegistrationWith(destination, [](SourceRegistration& r) { - r.aggregatable_report_window = base::Microseconds(-1); + r.aggregatable_report_window = + base::Hours(1) - base::Microseconds(1); + }).IsValid()); + + EXPECT_FALSE(SourceRegistrationWith(destination, [](SourceRegistration& r) { + r.expiry = base::Days(1); + r.aggregatable_report_window = + r.expiry + base::Microseconds(1); }).IsValid()); EXPECT_TRUE(SourceRegistrationWith(destination, [](SourceRegistration& r) { - r.aggregatable_report_window = base::Microseconds(0); + r.aggregatable_report_window = base::Hours(1); }).IsValid()); EXPECT_FALSE(SourceRegistrationWith(destination, [](SourceRegistration& r) {
diff --git a/components/autofill/content/renderer/form_autofill_util.cc b/components/autofill/content/renderer/form_autofill_util.cc index 850f6347..ef46006 100644 --- a/components/autofill/content/renderer/form_autofill_util.cc +++ b/components/autofill/content/renderer/form_autofill_util.cc
@@ -2275,7 +2275,7 @@ // The typed value is preserved for all passwords. It is also preserved for // potential usernames, as long as the |value| is not deemed acceptable. - if (field->form_control_type == StringToFormControlType("password") || + if (field->form_control_type == FormControlType::kInputPassword || !ScriptModifiedUsernameAcceptable(field->value, user_input, field_data_manager)) { field->user_input = user_input;
diff --git a/components/autofill/content/renderer/password_autofill_agent.cc b/components/autofill/content/renderer/password_autofill_agent.cc index 9dde6e43..94d2022 100644 --- a/components/autofill/content/renderer/password_autofill_agent.cc +++ b/components/autofill/content/renderer/password_autofill_agent.cc
@@ -522,7 +522,7 @@ // block a form submission. Note: Don't use |check_status != // kNotCheckable|, a radio button is considered a "checkable" element too, // but it should block a submission. - return field.form_control_type == StringToFormControlType("checkbox"); + return field.form_control_type == FormControlType::kInputCheckbox; }; for (size_t i = username_index + 1; i < password_index; ++i) {
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 2ae0fbc..79f31fa 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -299,6 +299,8 @@ "metrics/form_events/form_event_logger_base.cc", "metrics/form_events/form_event_logger_base.h", "metrics/form_events/form_events.h", + "metrics/granular_filling_metrics.cc", + "metrics/granular_filling_metrics.h", "metrics/log_event.cc", "metrics/log_event.h", "metrics/payments/better_auth_metrics.cc", @@ -489,8 +491,6 @@ "ui/region_combobox_model.h", "ui/suggestion.cc", "ui/suggestion.h", - "ui/suggestion_selection.cc", - "ui/suggestion_selection.h", "ui/touch_to_fill_delegate.h", "validation.cc", "validation.h",
diff --git a/components/autofill/core/browser/DEPS b/components/autofill/core/browser/DEPS index f0a90881..3e189da 100644 --- a/components/autofill/core/browser/DEPS +++ b/components/autofill/core/browser/DEPS
@@ -1,4 +1,5 @@ include_rules = [ + "+components/browser_ui/device_lock/android", "+components/device_reauth/device_authenticator.h", "+components/feature_engagement", "+components/google/core/common/google_util.h",
diff --git a/components/autofill/core/browser/autocomplete_history_manager.cc b/components/autofill/core/browser/autocomplete_history_manager.cc index 632c104..fe686ee 100644 --- a/components/autofill/core/browser/autocomplete_history_manager.cc +++ b/components/autofill/core/browser/autocomplete_history_manager.cc
@@ -39,11 +39,11 @@ const int kMaxAutocompleteMenuItems = 6; bool IsTextField(const FormFieldData& field) { - return field.form_control_type == StringToFormControlType("text") || - field.form_control_type == StringToFormControlType("search") || - field.form_control_type == StringToFormControlType("tel") || - field.form_control_type == StringToFormControlType("url") || - field.form_control_type == StringToFormControlType("email"); + return field.form_control_type == FormControlType::kInputText || + field.form_control_type == FormControlType::kInputSearch || + field.form_control_type == FormControlType::kInputTelephone || + field.form_control_type == FormControlType::kInputUrl || + field.form_control_type == FormControlType::kInputEmail; } // Returns true if the field has a meaningful name. @@ -91,7 +91,7 @@ CancelPendingQueries(handler.get()); if (!IsMeaningfulFieldName(field.name) || !client.IsAutocompleteEnabled() || - field.form_control_type == StringToFormControlType("textarea") || + field.form_control_type == FormControlType::kTextArea || IsInAutofillSuggestionsDisabledExperiment()) { SendSuggestions({}, QueryHandler(field.global_id(), trigger_source, field.value, handler));
diff --git a/components/autofill/core/browser/autocomplete_history_manager_unittest.cc b/components/autofill/core/browser/autocomplete_history_manager_unittest.cc index 4634c26..02090be9 100644 --- a/components/autofill/core/browser/autocomplete_history_manager_unittest.cc +++ b/components/autofill/core/browser/autocomplete_history_manager_unittest.cc
@@ -152,7 +152,7 @@ valid_cc.name = u"ccnum"; valid_cc.value = u"4012888888881881"; valid_cc.properties_mask |= kUserTyped; - valid_cc.form_control_type = StringToFormControlType("text"); + valid_cc.form_control_type = FormControlType::kInputText; form.fields.push_back(valid_cc); EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)).Times(0); @@ -176,7 +176,7 @@ invalid_cc.name = u"ccnum"; invalid_cc.value = u"4580123456789012"; invalid_cc.properties_mask |= kUserTyped; - invalid_cc.form_control_type = StringToFormControlType("text"); + invalid_cc.form_control_type = FormControlType::kInputText; form.fields.push_back(invalid_cc); EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)); @@ -197,7 +197,7 @@ ssn.name = u"ssn"; ssn.value = u"078-05-1120"; ssn.properties_mask |= kUserTyped; - ssn.form_control_type = StringToFormControlType("text"); + ssn.form_control_type = FormControlType::kInputText; form.fields.push_back(ssn); EXPECT_CALL(*web_data_service_, AddFormFields(_)).Times(0); @@ -219,7 +219,7 @@ search_field.name = u"search"; search_field.value = u"my favorite query"; search_field.properties_mask |= kUserTyped; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; form.fields.push_back(search_field); EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)); @@ -240,7 +240,7 @@ search_field.name = u"search"; search_field.value = u"my favorite query"; search_field.properties_mask |= kUserTyped; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; form.fields.push_back(search_field); EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)).Times(0); @@ -264,7 +264,7 @@ search_field.name = u"search"; search_field.value = u""; search_field.properties_mask |= kUserTyped; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; form.fields.push_back(search_field); // Single whitespace. @@ -272,7 +272,7 @@ search_field.name = u"other search"; search_field.value = u" "; search_field.properties_mask |= kUserTyped; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; form.fields.push_back(search_field); // Multiple whitespaces. @@ -280,7 +280,7 @@ search_field.name = u"other search"; search_field.value = u" "; search_field.properties_mask |= kUserTyped; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; form.fields.push_back(search_field); EXPECT_CALL(*(web_data_service_.get()), AddFormFields(_)).Times(0); @@ -305,7 +305,7 @@ field.name = u"esoterica"; field.value = u"a truly esoteric value, I assure you"; field.properties_mask |= kUserTyped; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.should_autocomplete = false; form.fields.push_back(field); @@ -330,7 +330,7 @@ search_field.name = u"search"; search_field.value = u"my favorite query"; search_field.properties_mask |= kUserTyped; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; form.fields.push_back(search_field); EXPECT_CALL(*web_data_service_, AddFormFields(_)).Times(0); @@ -354,7 +354,7 @@ search_field.label = u"Search"; search_field.name = u"search"; search_field.value = u"my favorite query"; - search_field.form_control_type = StringToFormControlType("search"); + search_field.form_control_type = FormControlType::kInputSearch; search_field.properties_mask |= kUserTyped; search_field.is_focusable = false; form.fields.push_back(search_field); @@ -380,7 +380,7 @@ field.name = u"esoterica"; field.value = u"a truly esoteric value, I assure you"; field.properties_mask |= kUserTyped; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.role = FormFieldData::RoleAttribute::kPresentation; form.fields.push_back(field);
diff --git a/components/autofill/core/browser/autofill_download_manager_unittest.cc b/components/autofill/core/browser/autofill_download_manager_unittest.cc index 16cfa28..d189154 100644 --- a/components/autofill/core/browser/autofill_download_manager_unittest.cc +++ b/components/autofill/core/browser/autofill_download_manager_unittest.cc
@@ -293,37 +293,37 @@ FormFieldData field; field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"email2"; field.name = u"email2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); std::vector<std::unique_ptr<FormStructure>> form_structures; @@ -333,22 +333,22 @@ field.label = u"address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"address2"; field.name = u"address2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"city"; field.name = u"city"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); form_structures.push_back(std::make_unique<FormStructure>(form)); @@ -357,17 +357,17 @@ field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); form_structures.push_back(std::make_unique<FormStructure>(form)); @@ -484,7 +484,7 @@ // Modify form structures to miss the cache. field.label = u"Address line 2"; field.name = u"address2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); form_structures.push_back(std::make_unique<FormStructure>(form)); @@ -539,12 +539,12 @@ field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); std::vector<std::unique_ptr<FormStructure>> form_structures; @@ -636,7 +636,7 @@ FormFieldData field; field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); std::vector<std::unique_ptr<FormStructure>> form_structures; @@ -745,12 +745,12 @@ field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); FormStructure form_structure(form); @@ -823,11 +823,11 @@ FormFieldData field; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); FormStructure form_structure(form); form_structure.set_submission_source(SubmissionSource::FORM_SUBMISSION); @@ -886,22 +886,22 @@ FormFieldData field; field.label = u"address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"address2"; field.name = u"address2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"city"; field.name = u"city"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); std::vector<std::unique_ptr<FormStructure>> form_structures; @@ -959,22 +959,22 @@ FormFieldData field; field.label = u"address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"address2"; field.name = u"address2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"city"; field.name = u"city"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); auto form_structure = std::make_unique<FormStructure>(form); @@ -1048,22 +1048,22 @@ FormFieldData field; field.label = u"address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"address2"; field.name = u"address2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"city"; field.name = u"city"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); std::vector<std::unique_ptr<FormStructure>> form_structures; @@ -1124,22 +1124,22 @@ FormFieldData field; field.label = u"address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"address2"; field.name = u"address2"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"city"; field.name = u"city"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); base::HistogramTester histogram; @@ -1210,7 +1210,7 @@ FormFieldData field; field.label = base::NumberToString16(i); field.name = base::NumberToString16(i); - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); } form_structures.push_back(std::make_unique<FormStructure>(form)); @@ -1230,7 +1230,7 @@ FormFieldData field; field.label = base::NumberToString16(i); field.name = base::NumberToString16(i); - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); } form_structures.push_back(std::make_unique<FormStructure>(form)); @@ -1244,7 +1244,7 @@ FormData form; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"username"; field.name = u"username"; @@ -1597,7 +1597,7 @@ field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); std::vector<std::unique_ptr<FormStructure>> form_structures; @@ -1612,17 +1612,17 @@ field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name:"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Email:"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); AutofillDownloadManager download_manager( @@ -1645,7 +1645,7 @@ FormFieldData field; field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FormData form; form.fields.push_back(field); @@ -1685,7 +1685,7 @@ FormFieldData field; field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FormData form; form.fields.push_back(field); @@ -1756,7 +1756,7 @@ FormFieldData field; field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FormData form; form.fields.push_back(field); @@ -1801,7 +1801,7 @@ FormFieldData field; field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FormData form; form.fields.push_back(field); @@ -1863,7 +1863,7 @@ field.label = u"field-label"; field.aria_label = u"field-aria-label"; field.aria_description = u"field-aria-description"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.css_classes = u"field-css-classes"; field.placeholder = u"field-placeholder"; form.fields.push_back(field); @@ -1875,7 +1875,7 @@ field.label = u"field-label"; field.aria_label = u"field-aria-label"; field.aria_description = u"field-aria-description"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.css_classes = u"field-css-classes"; field.placeholder = u"field-placeholder"; form.fields.push_back(field); @@ -1887,7 +1887,7 @@ field.label = u"field-label"; field.aria_label = u"field-aria-label"; field.aria_description = u"field-aria-description"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.css_classes = u"field-css-classes"; field.placeholder = u"field-placeholder"; form.fields.push_back(field); @@ -1950,7 +1950,7 @@ field.label = u"field-label"; field.aria_label = u"field-aria-label"; field.aria_description = u"field-aria-descriptionm"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.css_classes = u"field-css-classes"; field.placeholder = u"field-placeholder"; form.fields.push_back(field); @@ -1961,7 +1961,7 @@ field.label = u"field-label"; field.aria_label = u"field-aria-label"; field.aria_description = u"field-aria-descriptionm"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.css_classes = u"field-css-classes"; field.placeholder = u"field-placeholder"; form.fields.push_back(field); @@ -1972,7 +1972,7 @@ field.label = u"field-label"; field.aria_label = u"field-aria-label"; field.aria_description = u"field-aria-descriptionm"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.css_classes = u"field-css-classes"; field.placeholder = u"field-placeholder"; form.fields.push_back(field); @@ -2046,17 +2046,17 @@ field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name:"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Email:"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); AutofillDownloadManager download_manager( @@ -2104,19 +2104,19 @@ field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); small_form.fields.push_back(field); field.label = u"Last Name:"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); small_form.fields.push_back(field); field.label = u"Email:"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); AutofillDownloadManager download_manager( @@ -2193,17 +2193,17 @@ field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name:"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Email:"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); AutofillDownloadManager download_manager( @@ -2252,17 +2252,17 @@ field.label = u"First Name:"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Last Name:"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); field.label = u"Email:"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; form.fields.push_back(field); AutofillDownloadManager download_manager(
diff --git a/components/autofill/core/browser/autofill_external_delegate.cc b/components/autofill/core/browser/autofill_external_delegate.cc index 7557325..bea161cd 100644 --- a/components/autofill/core/browser/autofill_external_delegate.cc +++ b/components/autofill/core/browser/autofill_external_delegate.cc
@@ -29,6 +29,7 @@ #include "components/autofill/core/browser/browser_autofill_manager.h" #include "components/autofill/core/browser/metrics/address_rewriter_in_profile_subset_metrics.h" #include "components/autofill/core/browser/metrics/autofill_metrics.h" +#include "components/autofill/core/browser/metrics/granular_filling_metrics.h" #include "components/autofill/core/browser/metrics/suggestions_list_metrics.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/common/autofill_features.h" @@ -603,6 +604,7 @@ void AutofillExternalDelegate::OnDeleteDialogClosed(const std::string& guid, bool user_accepted_delete) { + autofill_metrics::LogDeleteAddressProfileDialogClosed(user_accepted_delete); if (user_accepted_delete) { PersonalDataManager* pdm = manager_->client().GetPersonalDataManager(); if (!pdm_observation_.IsObserving()) {
diff --git a/components/autofill/core/browser/autofill_external_delegate_unittest.cc b/components/autofill/core/browser/autofill_external_delegate_unittest.cc index 3860b8f..61a3ca3 100644 --- a/components/autofill/core/browser/autofill_external_delegate_unittest.cc +++ b/components/autofill/core/browser/autofill_external_delegate_unittest.cc
@@ -520,6 +520,7 @@ TEST_F(AutofillExternalDelegateUnitTest, UserCancelsDeletion) { IssueOnQuery(); + base::HistogramTester histogram; const std::string guid = base::Uuid().AsLowercaseString(); ON_CALL(personal_data_manager_, GetProfileByGUID(guid)) .WillByDefault(Return(&profile_)); @@ -542,6 +543,7 @@ external_delegate_->DidAcceptSuggestion( suggestion, 0, AutofillSuggestionTriggerSource::kFormControlElementClicked); + histogram.ExpectUniqueSample("Autofill.ExtendedMenu.DeleteAddress", 0, 1); } // Test that the correct Autofill profile is deleted when the user accepts the @@ -549,6 +551,7 @@ TEST_F(AutofillExternalDelegateUnitTest, UserAcceptsDeletion) { IssueOnQuery(); + base::HistogramTester histogram; const std::string guid = base::Uuid().AsLowercaseString(); ON_CALL(personal_data_manager_, GetProfileByGUID(guid)) .WillByDefault(Return(&profile_)); @@ -573,6 +576,7 @@ AutofillSuggestionTriggerSource::kFormControlElementClicked); external_delegate_->OnPersonalDataFinishedProfileTasks(); + histogram.ExpectUniqueSample("Autofill.ExtendedMenu.DeleteAddress", 1, 1); } // Test the situation when AutofillExternalDelegate is destroyed before the
diff --git a/components/autofill/core/browser/autofill_field.cc b/components/autofill/core/browser/autofill_field.cc index 33bf7c68..e84a179 100644 --- a/components/autofill/core/browser/autofill_field.cc +++ b/components/autofill/core/browser/autofill_field.cc
@@ -573,25 +573,25 @@ DeprecatedFormControlType AutofillField::FormControlType() const { // Keep in sync with https://html.spec.whatwg.org/#attr-input-type. - if (form_control_type == StringToFormControlType("text") || - form_control_type == StringToFormControlType("search") || - form_control_type == StringToFormControlType("tel") || - form_control_type == StringToFormControlType("url") || - form_control_type == StringToFormControlType("email") || - form_control_type == StringToFormControlType("password") || - form_control_type == StringToFormControlType("number")) { + if (form_control_type == FormControlType::kInputText || + form_control_type == FormControlType::kInputSearch || + form_control_type == FormControlType::kInputTelephone || + form_control_type == FormControlType::kInputUrl || + form_control_type == FormControlType::kInputEmail || + form_control_type == FormControlType::kInputPassword || + form_control_type == FormControlType::kInputNumber) { return DeprecatedFormControlType::kText; - } else if (form_control_type == StringToFormControlType("textarea")) { + } else if (form_control_type == FormControlType::kTextArea) { return DeprecatedFormControlType::kTextarea; - } else if (form_control_type == StringToFormControlType("checkbox")) { + } else if (form_control_type == FormControlType::kInputCheckbox) { return DeprecatedFormControlType::kCheckbox; - } else if (form_control_type == StringToFormControlType("radio")) { + } else if (form_control_type == FormControlType::kInputRadio) { return DeprecatedFormControlType::kRadio; - } else if (form_control_type == StringToFormControlType("select-one")) { + } else if (form_control_type == FormControlType::kSelectOne) { return DeprecatedFormControlType::kSelectOne; - } else if (form_control_type == StringToFormControlType("selectlist")) { + } else if (form_control_type == FormControlType::kSelectList) { return DeprecatedFormControlType::kSelectlist; - } else if (form_control_type == StringToFormControlType("")) { + } else if (form_control_type == FormControlType::kEmpty) { return DeprecatedFormControlType::kEmpty; } else { return DeprecatedFormControlType::kOther;
diff --git a/components/autofill/core/browser/autofill_form_test_utils.cc b/components/autofill/core/browser/autofill_form_test_utils.cc index 9bec000..529ab02 100644 --- a/components/autofill/core/browser/autofill_form_test_utils.cc +++ b/components/autofill/core/browser/autofill_form_test_utils.cc
@@ -99,7 +99,7 @@ for (const FieldDescription& dd : d.fields) { FormFieldData ff = CreateFieldByRole(dd.role); ff.form_control_type = StringToFormControlType(dd.form_control_type); - if (ff.form_control_type == StringToFormControlType("select-one") && + if (ff.form_control_type == FormControlType::kSelectOne && !dd.select_options.empty()) { ff.options = dd.select_options; }
diff --git a/components/autofill/core/browser/autofill_merge_unittest.cc b/components/autofill/core/browser/autofill_merge_unittest.cc index 4935a6ad..1202fd6 100644 --- a/components/autofill/core/browser/autofill_merge_unittest.cc +++ b/components/autofill/core/browser/autofill_merge_unittest.cc
@@ -201,7 +201,7 @@ field.label = field_type; field.name = field_type; field.value = value; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.is_focusable = true; form.fields.push_back(field); }
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.cc b/components/autofill/core/browser/autofill_suggestion_generator.cc index 2f768a1..854d21a1 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator.cc
@@ -16,16 +16,21 @@ #include "build/build_config.h" #include "components/autofill/core/browser/autofill_browser_util.h" #include "components/autofill/core/browser/autofill_client.h" +#include "components/autofill/core/browser/autofill_data_util.h" #include "components/autofill/core/browser/autofill_experiments.h" +#include "components/autofill/core/browser/autofill_granular_filling_utils.h" #include "components/autofill/core/browser/autofill_optimization_guide.h" #include "components/autofill/core/browser/data_model/autofill_offer_data.h" #include "components/autofill/core/browser/data_model/autofill_profile.h" #include "components/autofill/core/browser/data_model/autofill_profile_comparator.h" +#include "components/autofill/core/browser/data_model/borrowed_transliterator.h" #include "components/autofill/core/browser/data_model/credit_card.h" #include "components/autofill/core/browser/data_model/iban.h" #include "components/autofill/core/browser/field_filler.h" #include "components/autofill/core/browser/field_types.h" +#include "components/autofill/core/browser/form_parsing/address_field.h" #include "components/autofill/core/browser/form_structure.h" +#include "components/autofill/core/browser/geo/address_i18n.h" #include "components/autofill/core/browser/metrics/autofill_metrics.h" #include "components/autofill/core/browser/metrics/payments/card_metadata_metrics.h" #include "components/autofill/core/browser/payments/autofill_offer_manager.h" @@ -34,7 +39,6 @@ #include "components/autofill/core/browser/ui/label_formatter.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/browser/ui/suggestion.h" -#include "components/autofill/core/browser/ui/suggestion_selection.h" #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" @@ -43,6 +47,8 @@ #include "components/feature_engagement/public/feature_constants.h" #include "components/grit/components_scaled_resources.h" #include "components/strings/grit/components_strings.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" +#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_formatter.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/resource/resource_bundle.h" @@ -103,6 +109,295 @@ #endif } +Suggestion GetEditAddressProfileSuggestion(Suggestion::BackendId backend_id) { + Suggestion suggestion(l10n_util::GetStringUTF16( + IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED)); + suggestion.popup_item_id = PopupItemId::kEditAddressProfile; + suggestion.icon = "editIcon"; + suggestion.payload = backend_id; + suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED); + return suggestion; +} + +// Creates the suggestion that will open the delete address profile dialog. +Suggestion GetDeleteAddressProfileSuggestion(Suggestion::BackendId backend_id) { + Suggestion suggestion(l10n_util::GetStringUTF16( + IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED)); + suggestion.popup_item_id = PopupItemId::kDeleteAddressProfile; + suggestion.icon = "deleteIcon"; + suggestion.payload = backend_id; + suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED); + return suggestion; +} + +// Creates the suggestion that will fill all address related fields. +Suggestion GetFillFullAddressSuggestion(Suggestion::BackendId backend_id) { + Suggestion suggestion(l10n_util::GetStringUTF16( + IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED)); + suggestion.popup_item_id = PopupItemId::kFillFullAddress; + suggestion.payload = backend_id; + suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED); + return suggestion; +} + +// Creates the suggestion that will fill all name related fields. +Suggestion GetFillFullNameSuggestion(Suggestion::BackendId backend_id) { + Suggestion suggestion(l10n_util::GetStringUTF16( + IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED)); + suggestion.popup_item_id = PopupItemId::kFillFullName; + suggestion.payload = backend_id; + suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED); + + return suggestion; +} + +// Creates the suggestion that will fill the whole form for the profile. This +// suggestion is displayed once the users is on group filling level or field by +// field level. It is used as a way to allow users to go back to filling the +// whole form. +Suggestion GetFillEverythingFromAddressProfileSuggestion( + Suggestion::BackendId backend_id) { + Suggestion suggestion(l10n_util::GetStringUTF16( + IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED)); + suggestion.popup_item_id = PopupItemId::kFillEverythingFromAddressProfile; + suggestion.icon = "magicIcon"; + suggestion.payload = backend_id; + suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED); + return suggestion; +} + +// Append new suggestions to `suggestions` based on the `ServerFieldType` list +// provided. Suggestions are not added if their info is not found in the +// provided `profile`. Returns true if any suggestion was added. +bool AddFieldByFieldSuggestions(const std::vector<ServerFieldType>& types, + const AutofillProfile& profile, + const std::string& app_locale, + std::vector<Suggestion>& suggestions) { + bool any_suggestion_added = false; + for (auto type : types) { + std::u16string value = profile.GetInfo(type, app_locale); + if (!value.empty()) { + suggestions.emplace_back(value, PopupItemId::kFieldByFieldFilling); + any_suggestion_added = true; + } + } + return any_suggestion_added; +} + +// Given an address `type` and `sub_type`, returns whether the `sub_type` info +// stored in `profile` is a substring of the info stored in `profile` for +// `type`. +bool CheckIfTypeContainsSubtype(ServerFieldType type, + ServerFieldType sub_type, + const AutofillProfile& profile, + const std::string& app_locale) { + if (!profile.HasInfo(type) || !profile.HasInfo(sub_type)) { + return false; + } + + std::u16string value = profile.GetInfo(type, app_locale); + std::u16string sub_value = profile.GetInfo(sub_type, app_locale); + return value != sub_value && value.find(sub_value) != std::u16string::npos; +} + +// Adds name related child suggestions to build autofill popup submenu. +// The param `type` refers to the triggering field type (clicked by the users) +// and is used to define whether the `PopupItemId::kFillFullName` suggestion +// will be available. +void AddNameChildSuggestions(FieldTypeGroup trigger_field_type_group, + const AutofillProfile& profile, + const std::string& app_locale, + Suggestion& suggestion) { + if (trigger_field_type_group == FieldTypeGroup::kName) { + // Note that this suggestion can only be added if name infos exist in the + // profile. + suggestion.children.push_back( + GetFillFullNameSuggestion(Suggestion::BackendId(profile.guid()))); + } + if (AddFieldByFieldSuggestions({NAME_FIRST, NAME_MIDDLE, NAME_LAST}, profile, + app_locale, suggestion.children)) { + suggestion.children.push_back( + AutofillSuggestionGenerator::CreateSeparator()); + }; +} + +// Adds address line suggestions (ADDRESS_HOME_LINE1 and/or +// ADDRESS_HOME_LINE2) to `suggestions.children`. It potentially includes +// sub-children if one of the added suggestions contains +// ADDRESS_HOME_HOUSE_NUMBER and/or ADDRESS_HOME_STREET_NAME. Returns true if at +// least one suggestion was appended to `suggestions.children`. +bool AddAddressLineChildSuggestions(const AutofillProfile& profile, + const std::string& app_locale, + std::vector<Suggestion>& suggestions) { + auto add_address_line = [&](ServerFieldType type) -> bool { + CHECK(type == ADDRESS_HOME_LINE1 || type == ADDRESS_HOME_LINE2); + + if (!AddFieldByFieldSuggestions({type}, profile, app_locale, suggestions)) { + return false; + } + + if (CheckIfTypeContainsSubtype(type, ADDRESS_HOME_HOUSE_NUMBER, profile, + app_locale) && + AddFieldByFieldSuggestions({ADDRESS_HOME_HOUSE_NUMBER}, profile, + app_locale, suggestions.back().children)) { + Suggestion& address_line_suggestion = suggestions.back().children.back(); + address_line_suggestion.labels = { + {Suggestion::Text(l10n_util::GetStringUTF16( + IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT))}}; + address_line_suggestion + .acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED); + } + if (CheckIfTypeContainsSubtype(type, ADDRESS_HOME_STREET_NAME, profile, + app_locale) && + AddFieldByFieldSuggestions({ADDRESS_HOME_STREET_NAME}, profile, + app_locale, suggestions.back().children)) { + Suggestion& address_line_suggestion = suggestions.back().children.back(); + address_line_suggestion.labels = { + {Suggestion::Text(l10n_util::GetStringUTF16( + IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT))}}; + address_line_suggestion + .acceptance_a11y_announcement = l10n_util::GetStringUTF16( + IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED); + } + + return true; + }; + bool added_address_line1 = add_address_line(ADDRESS_HOME_LINE1); + bool added_address_line2 = add_address_line(ADDRESS_HOME_LINE2); + return added_address_line1 || added_address_line2; +} + +// Adds address related child suggestions to build autofill popup submenu. +// The param `type` refers to the triggering field type (clicked by the users) +// and is used to define whether the `PopupItemId::kFillFullAddress` suggestion +// will be available. +void AddAddressChildSuggestions(FieldTypeGroup trigger_field_type_group, + const AutofillProfile& profile, + const std::string& app_locale, + Suggestion& suggestion) { + if (trigger_field_type_group == FieldTypeGroup::kAddress) { + // Note that this suggestion can only be added if address infos exist in the + // profile. + suggestion.children.push_back( + GetFillFullAddressSuggestion(Suggestion::BackendId(profile.guid()))); + } + + bool added_any_address_line = + AddAddressLineChildSuggestions(profile, app_locale, suggestion.children); + bool added_zip = AddFieldByFieldSuggestions({ADDRESS_HOME_ZIP}, profile, + app_locale, suggestion.children); + if (added_any_address_line || added_zip) { + suggestion.children.push_back( + AutofillSuggestionGenerator::CreateSeparator()); + } +} + +// Adds contact related child suggestions (i.e email and phone number) to +// build autofill popup submenu. The param `type` refers to the triggering field +// type (clicked by the users) and is used to define whether the phone number +// suggestion will behave as `PopupItemId::kFieldByFieldFilling` or as +// `PopupItemId::kFillFullPhoneNumber`. +void AddContactChildSuggestions(FieldTypeGroup trigger_field_type_group, + const AutofillProfile& profile, + const std::string& app_locale, + Suggestion& suggestion) { + // Creates a phone number suggestion for the autofill submenu. When triggered + // from a phone number field this suggestion will fill every phone number + // field. Otherwise it fills a specific field. + bool phone_number_suggestion_added = false; + if (profile.HasInfo(PHONE_HOME_WHOLE_NUMBER)) { + Suggestion phone_number_suggestion( + profile.GetInfo(PHONE_HOME_WHOLE_NUMBER, app_locale)); + const bool is_phone_field = + trigger_field_type_group == FieldTypeGroup::kPhone; + phone_number_suggestion.popup_item_id = + is_phone_field ? PopupItemId::kFillFullPhoneNumber + : PopupItemId::kFieldByFieldFilling; + phone_number_suggestion.payload = Suggestion::BackendId(profile.guid()); + suggestion.children.push_back(std::move(phone_number_suggestion)); + phone_number_suggestion_added = true; + } + if (AddFieldByFieldSuggestions({EMAIL_ADDRESS}, profile, app_locale, + suggestion.children) || + phone_number_suggestion_added) { + suggestion.children.push_back( + AutofillSuggestionGenerator::CreateSeparator()); + } +} + +// Adds footer child suggestions to build autofill popup submenu. +void AddFooterChildSuggestions( + const AutofillProfile& profile, + absl::optional<ServerFieldTypeSet> last_targeted_fields, + Suggestion& suggestion) { + // If the last filling granularity was not full form, add the + // `PopupItemId::kFillEverythingFromAddressProfile` suggestion. This allows + // the user to go back to filling the whole form once in a more fine grained + // filling experience. + if (!last_targeted_fields || *last_targeted_fields != kAllServerFieldTypes) { + suggestion.children.push_back(GetFillEverythingFromAddressProfileSuggestion( + Suggestion::BackendId(profile.guid()))); + } + suggestion.children.push_back( + GetEditAddressProfileSuggestion(Suggestion::BackendId(profile.guid()))); + suggestion.children.push_back( + GetDeleteAddressProfileSuggestion(Suggestion::BackendId(profile.guid()))); +} + +// Sets the `popup_item_id` for `suggestion` depending on +// `last_filling_granularity`. If the `last_filling_granularity` for a certain +// form was group filling, also add labels to give users feedback about the next +// filling behaviour. +// `last_targeted_fields` specified the last set of fields target by the user. +// When not present, we default to full form. +// TODO(crbug.com/1466116): Add tests when this is actually used. +// TODO(crbug.com/1466116): Add labels when `last_filling_granularity` is group +// filling. +void AddSuggestionDetailsForCurrentFillingGranularity( + absl::optional<ServerFieldTypeSet> optional_last_targeted_fields, + FieldTypeGroup triggering_field_type_group, + Suggestion& suggestion) { + const ServerFieldTypeSet& last_targeted_fields = + optional_last_targeted_fields.value_or(kAllServerFieldTypes); + + if (AreFieldsGranularFillingGroup(last_targeted_fields)) { + switch (triggering_field_type_group) { + case FieldTypeGroup::kName: + suggestion.popup_item_id = PopupItemId::kFillFullName; + break; + case FieldTypeGroup::kAddress: + suggestion.popup_item_id = PopupItemId::kFillFullAddress; + break; + case FieldTypeGroup::kPhone: + suggestion.popup_item_id = PopupItemId::kFillFullPhoneNumber; + break; + default: + // If the 'current_granularity' is group filling, BUT the current + // focused field is not one for which group we offer group filling + // (kName, kAddress and kPhone), we default back to fill full form + // behaviour/pre-granular filling popup id. + suggestion.popup_item_id = PopupItemId::kAddressEntry; + } + } else if (last_targeted_fields == kAllServerFieldTypes) { + suggestion.popup_item_id = PopupItemId::kAddressEntry; + } else if (last_targeted_fields.size() == 1) { + // Note: This does not affect SingleFieldFormFillers such + // Autocomplete, IBANs and merchand promo. Even though they also fill only + // one field, they have different code paths, therefore their suggestions + // are not generated here. Furthermore, we do not store + // `last_targeted_fields` for them. + suggestion.popup_item_id = PopupItemId::kFieldByFieldFilling; + } else { + NOTREACHED_NORETURN(); + } +} + // Returns for each profile in `profiles` one label string to be used as a // secondary text in the corresponding suggestion bubble. `field_types` the // types of the fields that will be filled by the suggestion @@ -207,6 +502,65 @@ } } +// Returns whether the `suggestion_canon` is a valid match given +// `field_contents_canon`. +bool IsValidSuggestionForFieldContents(std::u16string suggestion_canon, + std::u16string field_contents_canon, + const AutofillType& type, + bool is_masked_server_card, + bool field_is_autofilled) { + // Phones should do a substring match because they can be trimmed to remove + // the first parts (e.g. country code or prefix). + if (type.group() == FieldTypeGroup::kPhone && + suggestion_canon.find(field_contents_canon) != std::u16string::npos) { + return true; + } + + // For card number fields, suggest the card if: + // - the number matches any part of the card, or + // - it's a masked card and there are 6 or fewer typed so far. + // - it's a masked card, field is autofilled, and the last 4 digits in the + // field match the last 4 digits of the card. + if (type.GetStorableType() == CREDIT_CARD_NUMBER) { + if (suggestion_canon.find(field_contents_canon) != std::u16string::npos) { + return true; + } + + if (is_masked_server_card) { + if (field_contents_canon.length() < 6) { + return true; + } + if (field_is_autofilled) { + int field_contents_length = field_contents_canon.length(); + DCHECK(field_contents_length >= 4); + if (suggestion_canon.find(field_contents_canon.substr( + field_contents_length - 4, field_contents_length)) != + std::u16string::npos) { + return true; + } + } + } + + return false; + } + + return base::StartsWith(suggestion_canon, field_contents_canon, + base::CompareCase::SENSITIVE); +} + +// Normalizes text for comparison based on the type of the field `text` was +// entered into. +std::u16string NormalizeForComparisonForType(const std::u16string& text, + ServerFieldType type) { + if (GroupTypeOfServerFieldType(type) == FieldTypeGroup::kEmail) { + // For emails, keep special characters so that if the user has two emails + // `test@foo.xyz` and `test1@foo.xyz` saved, only the first one is suggested + // upon entering `test@` into the email field. + return RemoveDiacriticsAndConvertToLowerCase(text); + } + return AutofillProfileComparator::NormalizeForComparison(text); +} + } // namespace AutofillSuggestionGenerator::AutofillSuggestionGenerator( @@ -247,8 +601,7 @@ bool field_is_autofilled, const ServerFieldTypeSet& field_types) { std::u16string field_contents_canon = - suggestion_selection::NormalizeForComparisonForType( - field_contents, type.GetStorableType()); + NormalizeForComparisonForType(field_contents, type.GetStorableType()); // Get the profiles to suggest, which are already sorted. std::vector<AutofillProfile*> sorted_profiles = @@ -263,9 +616,8 @@ } std::vector<const AutofillProfile*> matched_profiles = - GetPrefixMatchedProfiles( - sorted_profiles, type, field_contents, field_contents_canon, - personal_data_->app_locale(), field_is_autofilled); + GetPrefixMatchedProfiles(sorted_profiles, type, field_contents, + field_contents_canon, field_is_autofilled); const AutofillProfileComparator comparator(personal_data_->app_locale()); // Don't show two suggestions if one is a subset of the other. @@ -299,8 +651,8 @@ for (const AutofillProfile* profile : profiles) { // Compute the main text to be displayed in the suggestion bubble. - std::u16string main_text = suggestion_selection::GetSuggestionMainText( - profile, trigger_field_type, app_locale); + std::u16string main_text = + GetProfileSuggestionMainText(profile, trigger_field_type); if (trigger_field_type.group() == FieldTypeGroup::kPhone) { main_text = FieldFiller::GetPhoneNumberValueForInput( trigger_field_max_length, main_text, @@ -337,11 +689,11 @@ if (base::FeatureList::IsEnabled( features::kAutofillGranularFillingAvailable)) { - suggestion_selection::AddGranularFillingChildSuggestions( - trigger_field_type, last_targeted_fields, *profile, app_locale, - suggestions.back()); - suggestion_selection::AddSuggestionDetailsForCurrentFillingGranularity( - last_targeted_fields, trigger_field_type, suggestions.back()); + AddGranularFillingChildSuggestions(trigger_field_type.group(), + last_targeted_fields, *profile, + suggestions.back()); + AddSuggestionDetailsForCurrentFillingGranularity( + last_targeted_fields, trigger_field_type.group(), suggestions.back()); } else { // Granular filling handles assigning the popup type where the suggestion // is created. @@ -371,8 +723,8 @@ // `kAutofillUseAddressRewriterInProfileSubsetComparison` launches. std::vector<std::u16string> suggestion_main_text; for (const AutofillProfile* profile : matched_profiles) { - suggestion_main_text.push_back(suggestion_selection::GetSuggestionMainText( - profile, trigger_field_type, comparator.app_locale())); + suggestion_main_text.push_back( + GetProfileSuggestionMainText(profile, trigger_field_type)); } std::vector<const AutofillProfile*> unique_matched_profiles; @@ -434,7 +786,6 @@ const AutofillType& trigger_field_type, const std::u16string& raw_field_contents, const std::u16string& field_contents_canon, - const std::string& app_locale, bool field_is_autofilled) { std::vector<const AutofillProfile*> matched_profiles; for (const AutofillProfile* profile : profiles) { @@ -454,18 +805,17 @@ } #endif // BUILDFLAG(IS_ANDROID) - std::u16string main_text = suggestion_selection::GetSuggestionMainText( - profile, trigger_field_type, app_locale); + std::u16string main_text = + GetProfileSuggestionMainText(profile, trigger_field_type); // Discard profiles that do not have a value for the trigger field. if (main_text.empty()) { continue; } - std::u16string suggestion_canon = - suggestion_selection::NormalizeForComparisonForType( - main_text, trigger_field_type.GetStorableType()); - if (suggestion_selection::IsValidSuggestionForFieldContents( + std::u16string suggestion_canon = NormalizeForComparisonForType( + main_text, trigger_field_type.GetStorableType()); + if (IsValidSuggestionForFieldContents( suggestion_canon, field_contents_canon, trigger_field_type, /*is_masked_server_card=*/false, field_is_autofilled)) { matched_profiles.push_back(profile); @@ -486,6 +836,61 @@ num_profiles_suppressed); } +std::u16string AutofillSuggestionGenerator::GetProfileSuggestionMainText( + const AutofillProfile* profile, + const AutofillType& type) { + std::string app_locale = personal_data_->app_locale(); + ::i18n::addressinput::AddressField address_field; + if (i18n::FieldForType(type.GetStorableType(), &address_field) && + address_field == ::i18n::addressinput::STREET_ADDRESS) { + std::string street_address_line; + ::i18n::addressinput::GetStreetAddressLinesAsSingleLine( + *i18n::CreateAddressDataFromAutofillProfile(*profile, app_locale), + &street_address_line); + return base::UTF8ToUTF16(street_address_line); + } + + std::u16string value = profile->GetInfo(type, app_locale); + + if (type.group() == FieldTypeGroup::kPhone) { + bool format_phone; + +#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) + format_phone = base::FeatureList::IsEnabled( + features::kAutofillUseMobileLabelDisambiguation); +#else + format_phone = base::FeatureList::IsEnabled( + features::kAutofillUseImprovedLabelDisambiguation); +#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) + + if (format_phone) { + // Formats, e.g., the US phone numbers 15084880800, 508 488 0800, and + // +15084880800, as (508) 488-0800, and the Brazilian phone numbers + // 21987650000 and +55 11 2648-0254 as (21) 98765-0000 and + // (11) 2648-0254, respectively. + value = base::UTF8ToUTF16(i18n::FormatPhoneNationallyForDisplay( + base::UTF16ToUTF8(value), + data_util::GetCountryCodeWithFallback(*profile, app_locale))); + } + } + return value; +} + +void AutofillSuggestionGenerator::AddGranularFillingChildSuggestions( + FieldTypeGroup trigger_field_type_group, + absl::optional<ServerFieldTypeSet> last_targeted_fields, + const AutofillProfile& profile, + Suggestion& suggestion) { + std::string app_locale = personal_data_->app_locale(); + AddNameChildSuggestions(trigger_field_type_group, profile, app_locale, + suggestion); + AddAddressChildSuggestions(trigger_field_type_group, profile, app_locale, + suggestion); + AddContactChildSuggestions(trigger_field_type_group, profile, app_locale, + suggestion); + AddFooterChildSuggestions(profile, last_targeted_fields, suggestion); +} + std::vector<Suggestion> AutofillSuggestionGenerator::GetSuggestionsForCreditCards( const FormFieldData& field, @@ -527,7 +932,7 @@ if (creditcard_field_value.empty()) continue; - if (suggestion_selection::IsValidSuggestionForFieldContents( + if (IsValidSuggestionForFieldContents( base::i18n::ToLower(creditcard_field_value), field_contents_lower, type, credit_card.record_type() ==
diff --git a/components/autofill/core/browser/autofill_suggestion_generator.h b/components/autofill/core/browser/autofill_suggestion_generator.h index 2f806d5..46f52c35 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator.h +++ b/components/autofill/core/browser/autofill_suggestion_generator.h
@@ -198,7 +198,6 @@ const AutofillType& trigger_field_type, const std::u16string& raw_field_contents, const std::u16string& field_contents_canon, - const std::string& app_locale, bool field_is_autofilled); // Removes profiles that haven't been used after `min_last_used` from @@ -207,6 +206,23 @@ base::Time min_last_used, std::vector<AutofillProfile*>& profiles); + // In addition to just getting the values out of the profile, this function + // handles type-specific formatting. + std::u16string GetProfileSuggestionMainText(const AutofillProfile* profile, + const AutofillType& type); + + // Creates nested/child suggestions for `suggestion` with the `profile` + // information. Uses `trigger_field_type_group` to define what group filling + // suggestion to add (name, address or phone). The existence of child + // suggestions defines whether the autofill popup will have submenus. + // `last_targeted_fields` specified the last set of fields target by the user. + // When not present, we default to full form. + void AddGranularFillingChildSuggestions( + FieldTypeGroup trigger_field_type_group, + absl::optional<ServerFieldTypeSet> last_targeted_fields, + const AutofillProfile& profile, + Suggestion& suggestion); + // Return the texts shown as the first line of the suggestion, based on the // `credit_card` and the focused field `type`. The first index in the pair // represents the main text, and the second index represents the minor text.
diff --git a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc index d0833c6..740ef50 100644 --- a/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc +++ b/components/autofill/core/browser/autofill_suggestion_generator_unittest.cc
@@ -32,7 +32,6 @@ #include "components/autofill/core/browser/ui/label_formatter_utils.h" #include "components/autofill/core/browser/ui/popup_item_ids.h" #include "components/autofill/core/browser/ui/suggestion.h" -#include "components/autofill/core/browser/ui/suggestion_selection.h" #include "components/autofill/core/browser/webdata/autofill_webdata_service.h" #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_features.h"
diff --git a/components/autofill/core/browser/autofill_test_utils.cc b/components/autofill/core/browser/autofill_test_utils.cc index 2c31f4b..05a0585 100644 --- a/components/autofill/core/browser/autofill_test_utils.cc +++ b/components/autofill/core/browser/autofill_test_utils.cc
@@ -334,7 +334,6 @@ Iban GetServerIban() { Iban iban(Iban::InstrumentId("1234567")); - // Set the prefix, suffix and length of the server IBAN. iban.set_prefix(u"FR76"); iban.set_suffix(u"0189"); iban.set_length(27); @@ -342,6 +341,24 @@ return iban; } +Iban GetServerIban2() { + Iban iban(Iban::InstrumentId("1234568")); + iban.set_prefix(u"BE71"); + iban.set_suffix(u"8676"); + iban.set_length(16); + iban.set_nickname(u"My sister's IBAN"); + return iban; +} + +Iban GetServerIban3() { + Iban iban(Iban::InstrumentId("1234569")); + iban.set_prefix(u"DE91"); + iban.set_suffix(u"6789"); + iban.set_length(22); + iban.set_nickname(u"My IBAN"); + return iban; +} + Iban GetIbanWithoutNickname() { Iban iban(Iban::Guid(base::Uuid::GenerateRandomV4().AsLowercaseString())); iban.set_value(base::UTF8ToUTF16(std::string(kIbanValue_2)));
diff --git a/components/autofill/core/browser/autofill_test_utils.h b/components/autofill/core/browser/autofill_test_utils.h index 063fc57..10b3eaa 100644 --- a/components/autofill/core/browser/autofill_test_utils.h +++ b/components/autofill/core/browser/autofill_test_utils.h
@@ -147,8 +147,10 @@ // Returns an IBAN full of dummy info, different to the above. Iban GetIban2(); -// Returns a server-based IBAN full of dummy info. +// Returns server-based IBANs full of dummy info. Iban GetServerIban(); +Iban GetServerIban2(); +Iban GetServerIban3(); // Returns an IBAN full of dummy info, different to the above and without // nickname.
diff --git a/components/autofill/core/browser/autofill_type_unittest.cc b/components/autofill/core/browser/autofill_type_unittest.cc index eb2ba3b..74de517e 100644 --- a/components/autofill/core/browser/autofill_type_unittest.cc +++ b/components/autofill/core/browser/autofill_type_unittest.cc
@@ -112,7 +112,7 @@ : public ::testing::TestWithParam<std::underlying_type_t<HtmlFieldType>> { public: HtmlFieldType html_field_type() const { - return static_cast<HtmlFieldType>(GetParam()); + return ToSafeHtmlFieldType(GetParam(), HtmlFieldType::kUnrecognized); } }; @@ -123,11 +123,13 @@ base::to_underlying(HtmlFieldType::kMaxValue))); TEST_P(AutofillTypeTestForHtmlFieldTypes, GroupsOfHtmlFieldTypes) { - // Some HtmlFieldTypes have no ServerFieldType representation. - if (html_field_type() == HtmlFieldType::kFullAddress || - html_field_type() == HtmlFieldType::kOneTimeCode || - html_field_type() == HtmlFieldType::kTransactionAmount || - html_field_type() == HtmlFieldType::kTransactionCurrency) { + if (HtmlFieldTypeToBestCorrespondingServerFieldType(html_field_type()) == + UNKNOWN_TYPE) { + return; + } + // TODO(crbug.com/1476882): AutofillType(HtmlFieldType::kOneTimeCode).group() + // is kNoGroup, but AutofillType(ONE_TIME_CODE).group() is kUnfillable. + if (html_field_type() == HtmlFieldType::kOneTimeCode) { return; } AutofillType t(html_field_type());
diff --git a/components/autofill/core/browser/browser_autofill_manager_unittest.cc b/components/autofill/core/browser/browser_autofill_manager_unittest.cc index f72e1ab..ddffd2c 100644 --- a/components/autofill/core/browser/browser_autofill_manager_unittest.cc +++ b/components/autofill/core/browser/browser_autofill_manager_unittest.cc
@@ -3407,7 +3407,7 @@ Suggestion("two", "", "", PopupItemId::kAutocompleteEntry)); } -// The method `suggestion_selection::GetPrefixMatchedSuggestions` prevents +// The method `AutofillSuggestionGenerator::GetPrefixMatchedProfiles` prevents // that Android users see values that would override already filled fields // due to the narrow surface and a missing preview. #if !BUILDFLAG(IS_ANDROID)
diff --git a/components/autofill/core/browser/data_model/address.cc b/components/autofill/core/browser/data_model/address.cc index 4a3e9ac..8481388 100644 --- a/components/autofill/core/browser/data_model/address.cc +++ b/components/autofill/core/browser/data_model/address.cc
@@ -226,11 +226,6 @@ return !country_code.empty(); } - if (type.html_type() == HtmlFieldType::kFullAddress) { - // Parsing a full address is too hard. - return false; - } - ServerFieldType storable_type = type.GetStorableType(); if (storable_type == ADDRESS_HOME_COUNTRY && !value.empty()) { std::string country_code =
diff --git a/components/autofill/core/browser/data_model/autofill_profile.cc b/components/autofill/core/browser/data_model/autofill_profile.cc index 36e4349..847d56e 100644 --- a/components/autofill/core/browser/data_model/autofill_profile.cc +++ b/components/autofill/core/browser/data_model/autofill_profile.cc
@@ -1050,17 +1050,6 @@ std::u16string AutofillProfile::GetInfoImpl( const AutofillType& type, const std::string& app_locale) const { - if (type.html_type() == HtmlFieldType::kFullAddress) { - std::unique_ptr<AddressData> address_data = - i18n::CreateAddressDataFromAutofillProfile(*this, app_locale); - if (!addressinput::HasAllRequiredFields(*address_data)) - return std::u16string(); - - std::vector<std::string> lines; - ::i18n::addressinput::GetFormattedNationalAddress(*address_data, &lines); - return base::UTF8ToUTF16(base::JoinString(lines, "\n")); - } - const FormGroup* form_group = FormGroupForType(type); if (!form_group) return std::u16string();
diff --git a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc index a8baee41..b25d3bb 100644 --- a/components/autofill/core/browser/data_model/autofill_profile_unittest.cc +++ b/components/autofill/core/browser/data_model/autofill_profile_unittest.cc
@@ -1407,45 +1407,6 @@ EXPECT_EQ(u"user@example.com", profile.GetRawInfo(EMAIL_ADDRESS)); } -TEST(AutofillProfileTest, FullAddress) { - AutofillProfile profile; - test::SetProfileInfo(&profile, "Marion", "Mitchell", "Morrison", - "marion@me.xyz", "Fox", "123 Zoo St.", "unit 5", - "Hollywood", "CA", "91601", "US", "12345678910"); - - AutofillType full_address(HtmlFieldType::kFullAddress); - std::u16string formatted_address( - u"Marion Mitchell Morrison\n" - u"Fox\n" - u"123 Zoo St.\n" - u"unit 5\n" - u"Hollywood, CA 91601"); - EXPECT_EQ(formatted_address, profile.GetInfo(full_address, "en-US")); - // This should fail and leave the profile unchanged. - EXPECT_FALSE(profile.SetInfo(full_address, u"foobar", "en-US")); - EXPECT_EQ(formatted_address, profile.GetInfo(full_address, "en-US")); - - // Some things can be missing... - profile.SetInfo(ADDRESS_HOME_LINE2, std::u16string(), "en-US"); - profile.SetInfo(EMAIL_ADDRESS, std::u16string(), "en-US"); - EXPECT_EQ( - u"Marion Mitchell Morrison\n" - u"Fox\n" - u"123 Zoo St.\n" - u"Hollywood, CA 91601", - profile.GetInfo(full_address, "en-US")); - - // ...but nothing comes out if a required field is missing. - profile.SetInfo(ADDRESS_HOME_STATE, std::u16string(), "en-US"); - EXPECT_TRUE(profile.GetInfo(full_address, "en-US").empty()); - - // Restore the state but remove country. This should also fail. - profile.SetInfo(ADDRESS_HOME_STATE, u"CA", "en-US"); - EXPECT_FALSE(profile.GetInfo(full_address, "en-US").empty()); - profile.SetInfo(ADDRESS_HOME_COUNTRY, std::u16string(), "en-US"); - EXPECT_TRUE(profile.GetInfo(full_address, "en-US").empty()); -} - TEST(AutofillProfileTest, SaveAdditionalInfo_Name_AddingNameFull) { AutofillProfile a;
diff --git a/components/autofill/core/browser/data_model/iban.cc b/components/autofill/core/browser/data_model/iban.cc index 74e3c786..61c62f3 100644 --- a/components/autofill/core/browser/data_model/iban.cc +++ b/components/autofill/core/browser/data_model/iban.cc
@@ -196,8 +196,9 @@ Iban& Iban::operator=(const Iban& iban) = default; AutofillMetadata Iban::GetMetadata() const { + CHECK_NE(record_type_, Iban::kUnknown); AutofillMetadata metadata = AutofillDataModel::GetMetadata(); - metadata.id = guid(); + metadata.id = record_type_ == Iban::kLocalIban ? guid() : instrument_id(); return metadata; } @@ -307,7 +308,7 @@ } bool Iban::operator==(const Iban& iban) const { - return guid() == iban.guid() && Compare(iban) == 0; + return Compare(iban) == 0; } bool Iban::operator!=(const Iban& iban) const {
diff --git a/components/autofill/core/browser/field_filler.cc b/components/autofill/core/browser/field_filler.cc index 5ec31bec..e3ad9d6 100644 --- a/components/autofill/core/browser/field_filler.cc +++ b/components/autofill/core/browser/field_filler.cc
@@ -678,7 +678,7 @@ const std::u16string& address_value, const std::string& address_language_code, FormFieldData* field) { - if (field->form_control_type == StringToFormControlType("textarea")) { + if (field->form_control_type == FormControlType::kTextArea) { return address_value; } @@ -903,7 +903,7 @@ std::string* failure_to_fill) { ServerFieldType storable_type = field.Type().GetStorableType(); - if (field.form_control_type == StringToFormControlType("month")) { + if (field.form_control_type == FormControlType::kInputMonth) { return GetExpirationForMonthControl(credit_card); } else { switch (storable_type) {
diff --git a/components/autofill/core/browser/field_filler_unittest.cc b/components/autofill/core/browser/field_filler_unittest.cc index 2f2c463..7ae19bfb 100644 --- a/components/autofill/core/browser/field_filler_unittest.cc +++ b/components/autofill/core/browser/field_filler_unittest.cc
@@ -321,7 +321,7 @@ EXPECT_EQ("1606968241", field.FieldSignatureAsStr()); // Field form control type is set. - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; EXPECT_EQ("502192749", field.FieldSignatureAsStr()); // Heuristic type does not affect FieldSignature. @@ -710,7 +710,7 @@ TEST_P(ExpirationYearTest, FillExpirationYearInput) { auto test_case = GetParam(); AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.SetHtmlType(test_case.field_type, HtmlFieldMode()); field.max_length = test_case.field_max_length; @@ -817,7 +817,7 @@ } AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.SetHtmlType(test_case.field_type, HtmlFieldMode()); field.max_length = test_case.field_max_length; @@ -1517,7 +1517,7 @@ TEST_F(AutofillFieldFillerTest, FillMonthControl) { AutofillField field; - field.form_control_type = StringToFormControlType("month"); + field.form_control_type = FormControlType::kInputMonth; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_EXP_4_DIGIT_YEAR); @@ -1540,7 +1540,7 @@ TEST_F(AutofillFieldFillerTest, FillStreetAddressTextArea) { AutofillField field; - field.form_control_type = StringToFormControlType("textarea"); + field.form_control_type = FormControlType::kTextArea; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), ADDRESS_HOME_STREET_ADDRESS); @@ -1564,7 +1564,7 @@ TEST_F(AutofillFieldFillerTest, FillStreetAddressTextField) { AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.set_server_predictions( {::autofill::test::CreateFieldPrediction(ADDRESS_HOME_STREET_ADDRESS)}); FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); @@ -2163,7 +2163,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualMonth) { AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_EXP_MONTH); @@ -2187,7 +2187,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualYear) { AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_EXP_4_DIGIT_YEAR); @@ -2213,7 +2213,7 @@ // Test reducing 4 digit year to 2 digits. AutofillField field; field.max_length = 2; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_EXP_4_DIGIT_YEAR); @@ -2229,7 +2229,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualDate) { AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR); @@ -2265,7 +2265,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualShortenedDate) { // Test reducing dates to various max length field values. AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.max_length = 4; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), @@ -2316,7 +2316,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualCVC) { AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_VERIFICATION_CODE); @@ -2332,7 +2332,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualCVCAmericanExpress) { AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_VERIFICATION_CODE); @@ -2349,7 +2349,7 @@ TEST_F(AutofillFieldFillerTest, PreviewVirtualCardNumber) { AutofillField field; field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_NUMBER); - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; CreditCard card = test::GetVirtualCard(); card.SetNumber(u"5454545454545454"); @@ -2376,7 +2376,7 @@ AutofillField field; field.max_length = 17; field.set_credit_card_number_offset(18); - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_NUMBER); CreditCard card = test::GetVirtualCard(); @@ -2401,7 +2401,7 @@ std::u16string name = u"Jone Doe"; AutofillField field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; FieldFiller filler(/*app_locale=*/"en-US", /*address_normalizer=*/nullptr); field.set_heuristic_type(GetActiveHeuristicSource(), CREDIT_CARD_NAME_FULL);
diff --git a/components/autofill/core/browser/field_types.cc b/components/autofill/core/browser/field_types.cc index 3ad40b22..037b0a3e 100644 --- a/components/autofill/core/browser/field_types.cc +++ b/components/autofill/core/browser/field_types.cc
@@ -605,7 +605,6 @@ case HtmlFieldType::kCountryCode: case HtmlFieldType::kCountryName: case HtmlFieldType::kPostalCode: - case HtmlFieldType::kFullAddress: return FieldTypeGroup::kAddress; case HtmlFieldType::kCreditCardNameFull: @@ -716,10 +715,6 @@ case HtmlFieldType::kPostalCode: return ADDRESS_HOME_ZIP; - // Full address is composed of other types; it can't be stored. - case HtmlFieldType::kFullAddress: - return UNKNOWN_TYPE; - case HtmlFieldType::kCreditCardNameFull: return CREDIT_CARD_NAME_FULL;
diff --git a/components/autofill/core/browser/field_types.h b/components/autofill/core/browser/field_types.h index d044c0a9..31354c6 100644 --- a/components/autofill/core/browser/field_types.h +++ b/components/autofill/core/browser/field_types.h
@@ -507,6 +507,20 @@ : fallback_value; } +constexpr HtmlFieldType ToSafeHtmlFieldType( + std::underlying_type_t<HtmlFieldType> raw_value, + HtmlFieldType fallback_value) { + using underlying_type_t = std::underlying_type_t<HtmlFieldType>; + auto IsValid = [](underlying_type_t t) { + return static_cast<underlying_type_t>(HtmlFieldType::kMinValue) <= t && + t <= static_cast<underlying_type_t>(HtmlFieldType::kMaxValue) && + // Full address is deprecated. + t != 17; + }; + return IsValid(raw_value) ? static_cast<HtmlFieldType>(raw_value) + : fallback_value; +} + constexpr ServerFieldTypeSet kAllServerFieldTypes = [] { ServerFieldTypeSet fields; for (std::underlying_type_t<ServerFieldType> i = 0; i < MAX_VALID_FIELD_TYPE;
diff --git a/components/autofill/core/browser/form_data_importer.cc b/components/autofill/core/browser/form_data_importer.cc index f28982f..8093438c 100644 --- a/components/autofill/core/browser/form_data_importer.cc +++ b/components/autofill/core/browser/form_data_importer.cc
@@ -988,7 +988,7 @@ types_seen.insert(server_field_type); // If |field| is an HTML5 month input, handle it as a special case. - if (field->form_control_type == StringToFormControlType("month")) { + if (field->form_control_type == FormControlType::kInputMonth) { DCHECK_EQ(CREDIT_CARD_EXP_DATE_4_DIGIT_YEAR, server_field_type); result.card.SetInfoForMonthInputType(value); continue;
diff --git a/components/autofill/core/browser/form_parsing/credit_card_field.cc b/components/autofill/core/browser/form_parsing/credit_card_field.cc index 3e5f85e5..a6a1480a 100644 --- a/components/autofill/core/browser/form_parsing/credit_card_field.cc +++ b/components/autofill/core/browser/form_parsing/credit_card_field.cc
@@ -524,8 +524,8 @@ LogManager* log_manager, const LanguageCode& page_language, PatternSource pattern_source) { - if (!expiration_date_ && scanner->Cursor()->form_control_type == - StringToFormControlType("month")) { + if (!expiration_date_ && + scanner->Cursor()->form_control_type == FormControlType::kInputMonth) { expiration_date_ = scanner->Cursor(); expiration_month_ = nullptr; expiration_year_ = nullptr;
diff --git a/components/autofill/core/browser/form_structure.cc b/components/autofill/core/browser/form_structure.cc index cda304b..91889a3 100644 --- a/components/autofill/core/browser/form_structure.cc +++ b/components/autofill/core/browser/form_structure.cc
@@ -364,7 +364,7 @@ if (!ShouldSkipField(field)) ++active_field_count_; - if (field.form_control_type == StringToFormControlType("password")) { + if (field.form_control_type == FormControlType::kInputPassword) { has_password_field_ = true; } else { all_fields_are_passwords_ = false;
diff --git a/components/autofill/core/browser/form_structure_unittest.cc b/components/autofill/core/browser/form_structure_unittest.cc index 90a1d8c..27d02c9 100644 --- a/components/autofill/core/browser/form_structure_unittest.cc +++ b/components/autofill/core/browser/form_structure_unittest.cc
@@ -338,7 +338,7 @@ // not by autofill. field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -349,7 +349,7 @@ // not by autofill. field.label = u"password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -359,7 +359,7 @@ // be picked up by autofill only if there is no minimum field enforcement. field.label = u"Full Name"; field.name = u"fullname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -369,7 +369,7 @@ // be picked up by autofill only if there is no minimum field enforcement. field.label = u"Address Line 1"; field.name = u"address1"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -378,7 +378,7 @@ // We now have three auto-fillable fields. It's always autofillable. field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("email"); + field.form_control_type = FormControlType::kInputEmail; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -417,7 +417,7 @@ void AddTextField() { FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; AddField(field); } @@ -445,7 +445,7 @@ { FormFieldData field; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; - field.form_control_type = StringToFormControlType("radio"); + field.form_control_type = FormControlType::kInputRadio; AddField(field); } EXPECT_FALSE(test_api(form_structure()).ShouldBeParsed()); @@ -456,7 +456,7 @@ { FormFieldData field; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; - field.form_control_type = StringToFormControlType("checkbox"); + field.form_control_type = FormControlType::kInputCheckbox; AddField(field); } EXPECT_FALSE(test_api(form_structure()).ShouldBeParsed()); @@ -491,7 +491,7 @@ TEST_F(FormStructureTestImpl_ShouldBeParsed_Test, FalseIfOnlySelectField) { { FormFieldData field; - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; AddField(field); } EXPECT_FALSE(test_api(form_structure()).ShouldBeParsed()); @@ -507,7 +507,7 @@ TEST_F(FormStructureTestImpl_ShouldBeParsed_Test, FalseIfOnlySelectListField) { { FormFieldData field; - field.form_control_type = StringToFormControlType("selectlist"); + field.form_control_type = FormControlType::kSelectList; AddField(field); } EXPECT_FALSE(test_api(form_structure()).ShouldBeParsed()); @@ -546,7 +546,7 @@ TEST_F(FormStructureTestImpl_ShouldBeParsed_Test, TrueIfOnlyPasswordFields) { { FormFieldData field; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; AddField(field); } EXPECT_TRUE(test_api(form_structure()).ShouldBeParsed()); @@ -563,7 +563,7 @@ { FormFieldData field; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; AddField(field); } EXPECT_TRUE(test_api(form_structure()).ShouldBeParsed()); @@ -594,7 +594,7 @@ FormFieldData field; field.parsed_autocomplete = AutocompleteParsingResult{ .section = "my-billing-section", .field_type = HtmlFieldType::kName}; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; AddField(field); } EXPECT_TRUE(test_api(form_structure()).ShouldBeParsed()); @@ -976,7 +976,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"firstname"; @@ -1046,7 +1046,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Promo Code"; field.name = u"promocode"; @@ -1243,7 +1243,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Your First Name:"; field.name = u"bill.first"; @@ -1292,7 +1292,7 @@ field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -1332,7 +1332,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"E-mail address"; field.name = u"email"; @@ -1367,7 +1367,7 @@ field.label = std::u16string(); field.name = u"Submit"; field.value = u"continue"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -1403,7 +1403,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = std::u16string(); @@ -1442,7 +1442,7 @@ field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -1478,7 +1478,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Name on Card"; field.name = u"name_on_card"; @@ -1507,7 +1507,7 @@ field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -1540,7 +1540,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Name on Card"; field.name = u"name_on_card"; @@ -1576,7 +1576,7 @@ field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -1611,7 +1611,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Address Line1"; field.name = u"Address"; @@ -1657,7 +1657,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Address Line1"; field.name = u"shipping.address.addressLine1"; @@ -1706,7 +1706,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Street:"; field.name = u"FOPIH_RgWebCC_0_IHAddress_ads1"; @@ -1754,7 +1754,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Address Line1"; field.name = u"address1"; @@ -1792,7 +1792,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Address Line1"; field.name = u"Address"; @@ -1831,7 +1831,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name*:"; field.name = u"editBillingAddress$firstNameBox"; @@ -1915,7 +1915,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Phone:"; field.name = u"dayphone1"; @@ -1964,7 +1964,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Name on Card"; field.name = u"name_on_card"; @@ -2021,7 +2021,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Card number"; field.name = u"ccnumber"; @@ -2087,7 +2087,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Cardholder Name"; field.name = u"cc_first_name"; @@ -2151,7 +2151,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Name on Card"; field.name = u"name_on_card"; @@ -2432,7 +2432,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"firstname"; @@ -2452,7 +2452,7 @@ field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("email"); + field.form_control_type = FormControlType::kInputEmail; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {EMAIL_ADDRESS}, {AutofillProfile::INVALID}); @@ -2461,7 +2461,7 @@ field.label = u"Phone"; field.name = u"phone"; - field.form_control_type = StringToFormControlType("number"); + field.form_control_type = FormControlType::kInputNumber; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {PHONE_HOME_WHOLE_NUMBER}, {AutofillProfile::EMPTY}); @@ -2470,7 +2470,7 @@ field.label = u"Country"; field.name = u"country"; - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {ADDRESS_HOME_COUNTRY}, {AutofillProfile::VALID}); @@ -2561,7 +2561,7 @@ for (size_t i = 0; i < 2; ++i) { field.label = u"Address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); test::InitializePossibleTypesAndValidities( @@ -2612,7 +2612,7 @@ form.url = GURL("http://www.foo.com/"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"firstname"; @@ -2632,7 +2632,7 @@ field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("email"); + field.form_control_type = FormControlType::kInputEmail; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {EMAIL_ADDRESS}, {AutofillProfile::INVALID}); @@ -2641,7 +2641,7 @@ field.label = u"Phone"; field.name = u"phone"; - field.form_control_type = StringToFormControlType("number"); + field.form_control_type = FormControlType::kInputNumber; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {PHONE_HOME_WHOLE_NUMBER}, {AutofillProfile::EMPTY}); @@ -2650,7 +2650,7 @@ field.label = u"Country"; field.name = u"country"; - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {ADDRESS_HOME_COUNTRY}, {AutofillProfile::VALID}); @@ -2736,7 +2736,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"firstname"; @@ -2756,7 +2756,7 @@ field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("email"); + field.form_control_type = FormControlType::kInputEmail; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {EMAIL_ADDRESS}, {AutofillProfile::INVALID, AutofillProfile::VALID}); @@ -2765,7 +2765,7 @@ field.label = u"Phone"; field.name = u"phone"; - field.form_control_type = StringToFormControlType("number"); + field.form_control_type = FormControlType::kInputNumber; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {PHONE_HOME_WHOLE_NUMBER}, @@ -2775,7 +2775,7 @@ field.label = u"Country"; field.name = u"country"; - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {ADDRESS_HOME_COUNTRY}, {AutofillProfile::VALID, AutofillProfile::VALID}); @@ -2860,7 +2860,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"firstname"; @@ -2878,7 +2878,7 @@ field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("email"); + field.form_control_type = FormControlType::kInputEmail; test::InitializePossibleTypesAndValidities( possible_field_types, possible_field_types_validities, {EMAIL_ADDRESS}); field.unique_renderer_id = test::MakeFieldRendererId(); @@ -2886,7 +2886,7 @@ field.label = u"Phone"; field.name = u"phone"; - field.form_control_type = StringToFormControlType("number"); + field.form_control_type = FormControlType::kInputNumber; test::InitializePossibleTypesAndValidities(possible_field_types, possible_field_types_validities, {PHONE_HOME_WHOLE_NUMBER}); @@ -2895,7 +2895,7 @@ field.label = u"Country"; field.name = u"country"; - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; test::InitializePossibleTypesAndValidities(possible_field_types, possible_field_types_validities, {ADDRESS_HOME_COUNTRY}); @@ -2980,7 +2980,7 @@ for (size_t i = 0; i < 2; ++i) { field.label = u"Address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); test::InitializePossibleTypesAndValidities( @@ -3031,7 +3031,7 @@ for (size_t i = 0; i < 300; ++i) { field.label = u"Address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); test::InitializePossibleTypesAndValidities( @@ -3321,7 +3321,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"firstname"; @@ -3342,7 +3342,7 @@ field.label = u"Email"; field.name = u"email"; field.name_attribute = field.name; - field.form_control_type = StringToFormControlType("email"); + field.form_control_type = FormControlType::kInputEmail; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); test::InitializePossibleTypesAndValidities( @@ -3403,7 +3403,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; // No label for the first field. field.unique_renderer_id = test::MakeFieldRendererId(); @@ -3476,7 +3476,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -3563,7 +3563,7 @@ form.name = u"myform"; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -3789,7 +3789,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Cardholder name"; field.name = u"cc-name"; @@ -3930,7 +3930,7 @@ form.is_form_tag = true; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"First Name"; field.name = u"first"; @@ -4188,7 +4188,7 @@ form.is_form_tag = false; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"email"; field.name = u"email"; @@ -4566,7 +4566,7 @@ // One form field needed to be valid form. FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"email"; field.name = u"email"; field.unique_renderer_id = test::MakeFieldRendererId(); @@ -4598,7 +4598,7 @@ FormData form; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"email"; field.name = u"email"; @@ -4613,7 +4613,7 @@ // Checkable fields shouldn't affect the signature. field.label = u"Select"; field.name = u"Select"; - field.form_control_type = StringToFormControlType("checkbox"); + field.form_control_type = FormControlType::kInputCheckbox; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4645,7 +4645,7 @@ field.check_status = FormFieldData::CheckStatus::kNotCheckable; field.label = u"Random Field label"; field.name = u"random1234"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4676,19 +4676,19 @@ large_form.url = GURL("http://foo.com/login?q=a#ref"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; large_form.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; large_form.fields.push_back(field2); FormFieldData field3; - field3.form_control_type = StringToFormControlType("email"); + field3.form_control_type = FormControlType::kInputEmail; large_form.fields.push_back(field3); FormFieldData field4; - field4.form_control_type = StringToFormControlType("tel"); + field4.form_control_type = FormControlType::kInputTelephone; large_form.fields.push_back(field4); // Alternative form signature string of a form with more than two fields @@ -4704,11 +4704,11 @@ small_form_path.url = GURL("http://foo.com/login?q=a#ref"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; small_form_path.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; small_form_path.fields.push_back(field2); // Alternative form signature string of a form with 2 fields or less should @@ -4724,11 +4724,11 @@ small_form_ref.url = GURL("http://foo.com?q=a#ref"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; small_form_ref.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; small_form_ref.fields.push_back(field2); // Alternative form signature string of a form with 2 fields or less and @@ -4745,11 +4745,11 @@ small_form_query.url = GURL("http://foo.com?q=a"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; small_form_query.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; small_form_query.fields.push_back(field2); // Alternative form signature string of a form with 2 fields or less and @@ -4770,19 +4770,19 @@ FormFieldData field; field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = std::u16string(); field.name = u"Submit"; - field.form_control_type = StringToFormControlType("submit"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4798,20 +4798,20 @@ FormFieldData field; field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"select"; field.name = u"select"; - field.form_control_type = StringToFormControlType("checkbox"); + field.form_control_type = FormControlType::kInputCheckbox; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = std::u16string(); field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.check_status = FormFieldData::CheckStatus::kNotCheckable; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4851,19 +4851,19 @@ FormFieldData field; // No label on the first field. field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Enter your Email address"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Enter your Password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4899,7 +4899,7 @@ FormFieldData field; // No label on the first field. field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4910,13 +4910,13 @@ u"What Marketers Do! We Know That Your Email Address Has The Possibility " u"Of Exceeding A Certain Number Of Characters..."; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Enter your Password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -4953,14 +4953,14 @@ FormFieldData field; field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = std::u16string(); // No name set for this field. field.name = u""; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.check_status = FormFieldData::CheckStatus::kNotCheckable; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -5117,7 +5117,7 @@ FormData form_data; FormFieldData field; form_data.url = GURL("http://foo.com"); - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; // First name field. field.label = u"Nombre"; @@ -5178,7 +5178,7 @@ FormData form_data; FormFieldData field; form_data.url = GURL("http://foo.com"); - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; // Field for the name. field.label = u"Name"; @@ -5386,7 +5386,7 @@ // Create an iframe form with a single field. std::vector<FormFieldData> fields; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.name = u"name"; field.unique_renderer_id = test::MakeFieldRendererId(); field.host_form_signature = FormSignature(host_form_signature); @@ -5442,7 +5442,7 @@ // 12345 or 67890. The first two fields have identical field signatures. std::vector<FormFieldData> fields; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.name = u"name"; field.unique_renderer_id = test::MakeFieldRendererId(); @@ -5559,7 +5559,7 @@ FormData form; form.url = GURL("http://foo.com"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"fullname"; field.name = u"fullname"; @@ -5574,7 +5574,7 @@ // Checkable fields should be ignored in parsing FormFieldData checkable_field; checkable_field.label = u"radio_button"; - checkable_field.form_control_type = StringToFormControlType("radio"); + checkable_field.form_control_type = FormControlType::kInputRadio; checkable_field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; checkable_field.unique_renderer_id = test::MakeFieldRendererId(); @@ -5593,7 +5593,7 @@ field.label = u"password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; field.unique_renderer_id = test::MakeFieldRendererId(); form2.fields.push_back(field); @@ -6013,7 +6013,7 @@ FormData form; form.url = GURL("http://foo.com"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.max_length = 10000; field.should_autocomplete = false; @@ -6081,7 +6081,7 @@ FormData form; form.url = GURL("http://foo.com"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.max_length = 10000; field.should_autocomplete = false; @@ -6149,7 +6149,7 @@ FormData form; form.url = GURL("http://foo.com"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.max_length = 10000; field.should_autocomplete = false; @@ -6297,7 +6297,7 @@ FormFieldData field; // Check that the form with 250 fields are processed correctly. for (size_t i = 0; i < 250; ++i) { - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.name = u"text" + base::NumberToString16(i); field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -6321,7 +6321,7 @@ FormData form; FormFieldData field; field.name = u"Password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -6380,7 +6380,7 @@ FormData form; form.url = GURL("http://foo.com"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.max_length = 10000; field.label = u"Full Name"; @@ -6720,7 +6720,7 @@ FormData form; form.url = GURL("http://foo.com"); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.max_length = 10000; field.label = u"Full Name"; @@ -6768,7 +6768,7 @@ // Add 6 fields. for (int i = 0; i < 6; i++) { FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = field.name = base::NumberToString16(i); field.unique_renderer_id = test::MakeFieldRendererId(); form_data.fields.push_back(field); @@ -6903,7 +6903,7 @@ LocalFrameToken frame_token, FormRendererId host_form_id) { FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.name = name; field.unique_renderer_id = test::MakeFieldRendererId(); field.host_frame = frame_token;
diff --git a/components/autofill/core/browser/heuristic_classification_unittests.cc b/components/autofill/core/browser/heuristic_classification_unittests.cc index 071650a..3cace8e 100644 --- a/components/autofill/core/browser/heuristic_classification_unittests.cc +++ b/components/autofill/core/browser/heuristic_classification_unittests.cc
@@ -342,13 +342,13 @@ "tel", "text", "time", "url", "week", "textarea"}; if (const std::string* type = field_dict.FindString("type_attr")) { if (*type == "select") { - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; } else if (*type == "input") { - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; } else if (base::Contains(valid_control_types, *type)) { field.form_control_type = StringToFormControlType(*type); } else { - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; } } if (const std::string* autocomplete =
diff --git a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc index 0d7b92d..4c66d5b 100644 --- a/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc +++ b/components/autofill/core/browser/metrics/autofill_metrics_unittest.cc
@@ -655,7 +655,7 @@ FieldSignature field_signature[2]; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"fullname"; field.name = u"fullname"; @@ -753,7 +753,7 @@ FieldSignature field_signature[3]; FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"Country"; field.name = u"country"; @@ -772,7 +772,7 @@ field.label = u"State"; field.name = u"state"; field.is_focusable = false; - field.form_control_type = StringToFormControlType("select-one"); + field.form_control_type = FormControlType::kSelectOne; form.fields.push_back(field); // Regardless of the order of appearance, hidden fields are rationalized // before their corresponding visible one. @@ -6520,7 +6520,7 @@ form.url = GURL("http://foo.com"); form.main_frame_origin = url::Origin::Create(GURL("http://foo_root.com")); FormFieldData field; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.label = u"fullname"; field.name = u"fullname"; @@ -6533,7 +6533,7 @@ // Checkable fields should be ignored in parsing. FormFieldData checkable_field; checkable_field.label = u"radio_button"; - checkable_field.form_control_type = StringToFormControlType("radio"); + checkable_field.form_control_type = FormControlType::kInputRadio; checkable_field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; form.fields.push_back(checkable_field); @@ -6547,7 +6547,7 @@ field.label = u"password"; field.name = u"password"; - field.form_control_type = StringToFormControlType("password"); + field.form_control_type = FormControlType::kInputPassword; form.fields.push_back(field); owned_forms_.push_back(std::make_unique<FormStructure>(form)); @@ -8150,19 +8150,19 @@ FormFieldData field; field.label = u"State"; field.name = u"state"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Street"; field.name = u""; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Number"; field.name = u""; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -8239,19 +8239,19 @@ FormFieldData field; field.label = u"State"; field.name = u"state"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Street"; field.name = u""; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Number"; field.name = u""; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -8435,7 +8435,7 @@ FormFieldData field; field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.autocomplete_attribute = "family-name"; field.parsed_autocomplete = ParseAutocompleteAttribute("family-name"); field.unique_renderer_id = test::MakeFieldRendererId(); @@ -8444,7 +8444,7 @@ // Heuristic value will NOT match with Autocomplete attribute. field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.autocomplete_attribute = "additional-name"; field.parsed_autocomplete = ParseAutocompleteAttribute("additional-name"); field.unique_renderer_id = test::MakeFieldRendererId(); @@ -8453,7 +8453,7 @@ // No autocomplete attribute. field.label = u"Address"; field.name = u"address"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.autocomplete_attribute = "off"; field.parsed_autocomplete = ParseAutocompleteAttribute("off"); field.unique_renderer_id = test::MakeFieldRendererId(); @@ -8462,7 +8462,7 @@ // Heuristic value will be unknown. field.label = u"Garbage label"; field.name = u"garbage"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.autocomplete_attribute = "postal-code"; field.parsed_autocomplete = ParseAutocompleteAttribute("postal-code"); field.unique_renderer_id = test::MakeFieldRendererId(); @@ -8470,7 +8470,7 @@ field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.autocomplete_attribute = "garbage"; field.parsed_autocomplete = ParseAutocompleteAttribute("garbage"); field.unique_renderer_id = test::MakeFieldRendererId(); @@ -8871,14 +8871,14 @@ FormFieldData field; field.label = u"Option 1"; field.name = u"Option 1"; - field.form_control_type = StringToFormControlType("checkbox"); + field.form_control_type = FormControlType::kInputCheckbox; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Option 2"; field.name = u"Option 2"; - field.form_control_type = StringToFormControlType("checkbox"); + field.form_control_type = FormControlType::kInputCheckbox; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -8909,21 +8909,21 @@ FormFieldData field; field.label = u"username"; field.name = u"username"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); // Two checkable radio buttons. field.label = u"female"; field.name = u"female"; - field.form_control_type = StringToFormControlType("radio"); + field.form_control_type = FormControlType::kInputRadio; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"male"; field.name = u"male"; - field.form_control_type = StringToFormControlType("radio"); + field.form_control_type = FormControlType::kInputRadio; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -8931,7 +8931,7 @@ // One checkable checkbox. field.label = u"save"; field.name = u"save"; - field.form_control_type = StringToFormControlType("checkbox"); + field.form_control_type = FormControlType::kInputCheckbox; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -8965,27 +8965,27 @@ FormFieldData field; field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); // Two checkable radio buttons. field.label = u"female"; field.name = u"female"; - field.form_control_type = StringToFormControlType("radio"); + field.form_control_type = FormControlType::kInputRadio; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"male"; field.name = u"male"; - field.form_control_type = StringToFormControlType("radio"); + field.form_control_type = FormControlType::kInputRadio; field.check_status = FormFieldData::CheckStatus::kCheckableButUnchecked; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -9095,20 +9095,20 @@ FormFieldData field; field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); // Selectlist. field.label = u"Country"; field.name = u"country"; - field.form_control_type = StringToFormControlType("selectlist"); + field.form_control_type = FormControlType::kSelectList; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); @@ -9155,21 +9155,21 @@ FormFieldData field; field.label = u"First Name"; field.name = u"firstname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.host_frame = form.host_frame; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Last Name"; field.name = u"lastname"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.host_frame = test::MakeLocalFrameToken(test::RandomizeFrame(true)); field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field); field.label = u"Email"; field.name = u"email"; - field.form_control_type = StringToFormControlType("text"); + field.form_control_type = FormControlType::kInputText; field.host_frame = form.host_frame; field.unique_renderer_id = test::MakeFieldRendererId(); form.fields.push_back(field);
diff --git a/components/autofill/core/browser/metrics/granular_filling_metrics.cc b/components/autofill/core/browser/metrics/granular_filling_metrics.cc new file mode 100644 index 0000000..575d79d --- /dev/null +++ b/components/autofill/core/browser/metrics/granular_filling_metrics.cc
@@ -0,0 +1,16 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/autofill/core/browser/metrics/granular_filling_metrics.h" + +#include "base/metrics/histogram_functions.h" + +namespace autofill::autofill_metrics { + +void LogDeleteAddressProfileDialogClosed(bool user_accepted_delete) { + base::UmaHistogramBoolean("Autofill.ExtendedMenu.DeleteAddress", + user_accepted_delete); +} + +} // namespace autofill::autofill_metrics
diff --git a/components/autofill/core/browser/metrics/granular_filling_metrics.h b/components/autofill/core/browser/metrics/granular_filling_metrics.h new file mode 100644 index 0000000..8d5f690 --- /dev/null +++ b/components/autofill/core/browser/metrics/granular_filling_metrics.h
@@ -0,0 +1,16 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_GRANULAR_FILLING_METRICS_H_ +#define COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_GRANULAR_FILLING_METRICS_H_ + +namespace autofill::autofill_metrics { + +// This metric is only relevant for granular filling, i.e. when the delete +// dialog is opened from the Autofill popup. +void LogDeleteAddressProfileDialogClosed(bool user_accepted_delete); + +} // namespace autofill::autofill_metrics + +#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_METRICS_GRANULAR_FILLING_METRICS_H_
diff --git a/components/autofill/core/browser/payments/autofill_save_card_delegate.cc b/components/autofill/core/browser/payments/autofill_save_card_delegate.cc index c5563de6..5049fbe 100644 --- a/components/autofill/core/browser/payments/autofill_save_card_delegate.cc +++ b/components/autofill/core/browser/payments/autofill_save_card_delegate.cc
@@ -10,11 +10,12 @@ AutofillSaveCardDelegate::AutofillSaveCardDelegate( absl::variant<AutofillClient::LocalSaveCardPromptCallback, - AutofillClient::UploadSaveCardPromptCallback> callback, + AutofillClient::UploadSaveCardPromptCallback> + save_card_callback, AutofillClient::SaveCreditCardOptions options) : options_(options), had_user_interaction_(false), - callback_(std::move(callback)) {} + save_card_callback_(std::move(save_card_callback)) {} AutofillSaveCardDelegate::~AutofillSaveCardDelegate() = default; @@ -23,7 +24,9 @@ is_for_upload(), options_); } -void AutofillSaveCardDelegate::OnUiAccepted() { +void AutofillSaveCardDelegate::OnUiAccepted(base::OnceClosure callback) { + on_finished_gathering_consent_callback_ = std::move(callback); + // Acceptance can be logged immediately if: // 1. the user is accepting local save. // 2. or when we don't need more info in order to upload. @@ -35,17 +38,13 @@ is_for_upload(), options_); } LogUserAction(AutofillMetrics::INFOBAR_ACCEPTED); - RunSaveCardPromptCallback( - AutofillClient::SaveCardOfferUserDecision::kAccepted, - /*user_provided_details=*/{}); + GatherAdditionalConsentIfApplicable(/*user_provided_details=*/{}); } void AutofillSaveCardDelegate::OnUiUpdatedAndAccepted( AutofillClient::UserProvidedCardDetails user_provided_details) { LogUserAction(AutofillMetrics::INFOBAR_ACCEPTED); - RunSaveCardPromptCallback( - AutofillClient::SaveCardOfferUserDecision::kAccepted, - user_provided_details); + GatherAdditionalConsentIfApplicable(user_provided_details); } void AutofillSaveCardDelegate::OnUiCanceled() { @@ -70,19 +69,36 @@ } } +void AutofillSaveCardDelegate::OnFinishedGatheringConsent( + AutofillClient::SaveCardOfferUserDecision user_decision, + AutofillClient::UserProvidedCardDetails user_provided_details) { + RunSaveCardPromptCallback(user_decision, user_provided_details); + if (!on_finished_gathering_consent_callback_.is_null()) { + std::move(on_finished_gathering_consent_callback_).Run(); + } +} + void AutofillSaveCardDelegate::RunSaveCardPromptCallback( AutofillClient::SaveCardOfferUserDecision user_decision, AutofillClient::UserProvidedCardDetails user_provided_details) { if (is_for_upload()) { absl::get<AutofillClient::UploadSaveCardPromptCallback>( - std::move(callback_)) + std::move(save_card_callback_)) .Run(user_decision, user_provided_details); } else { - absl::get<AutofillClient::LocalSaveCardPromptCallback>(std::move(callback_)) + absl::get<AutofillClient::LocalSaveCardPromptCallback>( + std::move(save_card_callback_)) .Run(user_decision); } } +void AutofillSaveCardDelegate::GatherAdditionalConsentIfApplicable( + AutofillClient::UserProvidedCardDetails user_provided_details) { + OnFinishedGatheringConsent( + AutofillClient::SaveCardOfferUserDecision::kAccepted, + user_provided_details); +} + void AutofillSaveCardDelegate::LogUserAction( AutofillMetrics::InfoBarMetric user_action) { DCHECK(!had_user_interaction_);
diff --git a/components/autofill/core/browser/payments/autofill_save_card_delegate.h b/components/autofill/core/browser/payments/autofill_save_card_delegate.h index 92567fc..429cffd 100644 --- a/components/autofill/core/browser/payments/autofill_save_card_delegate.h +++ b/components/autofill/core/browser/payments/autofill_save_card_delegate.h
@@ -18,23 +18,33 @@ public: AutofillSaveCardDelegate( absl::variant<AutofillClient::LocalSaveCardPromptCallback, - AutofillClient::UploadSaveCardPromptCallback> callback, + AutofillClient::UploadSaveCardPromptCallback> + save_card_callback, AutofillClient::SaveCreditCardOptions options); - ~AutofillSaveCardDelegate(); + virtual ~AutofillSaveCardDelegate(); bool is_for_upload() const { return absl::holds_alternative< - AutofillClient::UploadSaveCardPromptCallback>(callback_); + AutofillClient::UploadSaveCardPromptCallback>(save_card_callback_); } void OnUiShown(); - void OnUiAccepted(); + // `on_save_card_completed` will be triggered after the save card flow has + // finished. + void OnUiAccepted( + base::OnceClosure on_save_card_completed = base::NullCallback()); void OnUiUpdatedAndAccepted( AutofillClient::UserProvidedCardDetails user_provided_details); void OnUiCanceled(); void OnUiIgnored(); + protected: + // Called when all of the prerequisites for saving a card have been met. + void OnFinishedGatheringConsent( + AutofillClient::SaveCardOfferUserDecision user_decision, + AutofillClient::UserProvidedCardDetails user_provided_details); + private: friend class AutofillSaveCardInfoBarDelegateMobileTest; @@ -48,6 +58,15 @@ AutofillClient::SaveCardOfferUserDecision user_decision, AutofillClient::UserProvidedCardDetails user_provided_details); + // TODO(crbug.com/1486941): Make GatherAdditionalConsentIfApplicable() a pure + // virtual function. + // This function by default saves the credit card, but allows subclasses to + // override if there are prerequisites to saving the card (ex: Android + // automotive requires a pin/password to be set on the device and must + // redirect to that flow before saving card information). + virtual void GatherAdditionalConsentIfApplicable( + AutofillClient::UserProvidedCardDetails user_provided_details); + void LogUserAction(AutofillMetrics::InfoBarMetric user_action); // If the cardholder name is missing, request the name from the user before @@ -62,7 +81,13 @@ // credit card offer-to-save prompt. absl::variant<AutofillClient::LocalSaveCardPromptCallback, AutofillClient::UploadSaveCardPromptCallback> - callback_; + save_card_callback_; + + // Callback to run immediately after `save_card_callback_`. An example of a + // callback is cleaning up pointers to delegates that have their lifecycle + // extended due to user going through device lock setup flows before saving a + // card. + base::OnceClosure on_finished_gathering_consent_callback_; }; } // namespace autofill
diff --git a/components/autofill/core/browser/payments/autofill_save_card_delegate_unittest.cc b/components/autofill/core/browser/payments/autofill_save_card_delegate_unittest.cc index b58e890..f1b22d2 100644 --- a/components/autofill/core/browser/payments/autofill_save_card_delegate_unittest.cc +++ b/components/autofill/core/browser/payments/autofill_save_card_delegate_unittest.cc
@@ -5,6 +5,7 @@ #include <string> #include "base/test/metrics/histogram_tester.h" +#include "base/test/mock_callback.h" #include "components/autofill/core/browser/autofill_client.h" #include "components/autofill/core/browser/metrics/payments/credit_card_save_metrics.h" #include "components/autofill/core/browser/payments/autofill_save_card_delegate.h" @@ -86,6 +87,16 @@ EqualToUserProvidedCardDetails(details))); } +TEST_F(AutofillSaveCardDelegateTest, + OnUiAcceptedWithCallbackArgumentRunsCallback) { + auto delegate = AutofillSaveCardDelegate(MakeLocalCallback(), + /*options=*/{}); + + base::MockOnceClosure mock_finish_gathering_consent_callback; + EXPECT_CALL(mock_finish_gathering_consent_callback, Run).Times(1); + delegate.OnUiAccepted(mock_finish_gathering_consent_callback.Get()); +} + TEST_F(AutofillSaveCardDelegateTest, OnUiAcceptedRunsLocalCallback) { auto delegate = AutofillSaveCardDelegate(MakeLocalCallback(), /*options=*/{});
diff --git a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc index a43bea5..400a203 100644 --- a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc +++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.cc
@@ -106,8 +106,15 @@ } bool AutofillSaveCardInfoBarDelegateMobile::Accept() { +#if BUILDFLAG(IS_ANDROID) + delegate_->OnUiAccepted( + base::BindOnce(&AutofillSaveCardInfoBarDelegateMobile::RemoveInfobar, + base::Unretained(this))); + return false; +#else delegate_->OnUiAccepted(); return true; +#endif } #if BUILDFLAG(IS_IOS) @@ -124,4 +131,12 @@ } #endif // BUILDFLAG(IS_IOS) +#if BUILDFLAG(IS_ANDROID) +void AutofillSaveCardInfoBarDelegateMobile::RemoveInfobar() { + if (infobar()) { + infobar()->RemoveSelf(); + } +} +#endif + } // namespace autofill
diff --git a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h index 52438432..d0d7632 100644 --- a/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h +++ b/components/autofill/core/browser/payments/autofill_save_card_infobar_delegate_mobile.h
@@ -100,6 +100,10 @@ #endif // BUILDFLAG(IS_IOS) private: +#if BUILDFLAG(IS_ANDROID) + void RemoveInfobar(); +#endif + // Strings and assets provided to the info bar UI. AutofillSaveCardUiInfo ui_info_; // UI actions (accept, cancel, dismiss etc.) are forwarded to this object that
diff --git a/components/autofill/core/browser/payments/credit_card_risk_based_authenticator_unittest.cc b/components/autofill/core/browser/payments/credit_card_risk_based_authenticator_unittest.cc index 4dfcb59..a48bd1a9 100644 --- a/components/autofill/core/browser/payments/credit_card_risk_based_authenticator_unittest.cc +++ b/components/autofill/core/browser/payments/credit_card_risk_based_authenticator_unittest.cc
@@ -15,7 +15,7 @@ namespace autofill { namespace { -constexpr absl::string_view kTestNumber = "4234567890123456"; +constexpr std::string_view kTestNumber = "4234567890123456"; constexpr int64_t kTestBillingCustomerNumber = 123456; } // namespace
diff --git a/components/autofill/core/browser/personal_data_manager.cc b/components/autofill/core/browser/personal_data_manager.cc index 6cecec3..659d8a4b 100644 --- a/components/autofill/core/browser/personal_data_manager.cc +++ b/components/autofill/core/browser/personal_data_manager.cc
@@ -59,7 +59,6 @@ #include "components/autofill/core/browser/ui/label_formatter.h" #include "components/autofill/core/browser/ui/label_formatter_utils.h" #include "components/autofill/core/browser/ui/suggestion.h" -#include "components/autofill/core/browser/ui/suggestion_selection.h" #include "components/autofill/core/browser/validation.h" #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_constants.h" @@ -515,30 +514,33 @@ pending_creditcard_billing_addresses_query_ || pending_creditcards_query_ || pending_server_creditcards_query_ || pending_server_creditcard_cloud_token_data_query_ || - pending_ibans_query_ || pending_customer_data_query_ || - pending_offer_data_query_ || pending_virtual_card_usage_data_query_); + pending_local_ibans_query_ || pending_server_ibans_query_ || + pending_customer_data_query_ || pending_offer_data_query_ || + pending_virtual_card_usage_data_query_); if (!result) { // Error from the web database. - if (h == pending_synced_local_profiles_query_) + if (h == pending_synced_local_profiles_query_) { pending_synced_local_profiles_query_ = 0; - else if (h == pending_account_profiles_query_) + } else if (h == pending_account_profiles_query_) { pending_account_profiles_query_ = 0; - else if (h == pending_creditcard_billing_addresses_query_) + } else if (h == pending_creditcard_billing_addresses_query_) { pending_creditcard_billing_addresses_query_ = 0; - else if (h == pending_creditcards_query_) + } else if (h == pending_creditcards_query_) { pending_creditcards_query_ = 0; - else if (h == pending_server_creditcards_query_) + } else if (h == pending_server_creditcards_query_) { pending_server_creditcards_query_ = 0; - else if (h == pending_server_creditcard_cloud_token_data_query_) + } else if (h == pending_server_creditcard_cloud_token_data_query_) { pending_server_creditcard_cloud_token_data_query_ = 0; - else if (h == pending_ibans_query_) - pending_ibans_query_ = 0; - else if (h == pending_customer_data_query_) + } else if (h == pending_local_ibans_query_) { + pending_local_ibans_query_ = 0; + } else if (h == pending_server_ibans_query_) { + pending_server_ibans_query_ = 0; + } else if (h == pending_customer_data_query_) { pending_customer_data_query_ = 0; - else if (h == pending_offer_data_query_) + } else if (h == pending_offer_data_query_) { pending_offer_data_query_ = 0; - else if (h == pending_virtual_card_usage_data_query_) { + } else if (h == pending_virtual_card_usage_data_query_) { pending_virtual_card_usage_data_query_ = 0; } } else { @@ -581,10 +583,15 @@ &server_credit_card_cloud_token_data_); break; case AUTOFILL_IBANS_RESULT: - DCHECK_EQ(h, pending_ibans_query_) - << "received ibans from invalid request."; - ReceiveLoadedDbValues(h, result.get(), &pending_ibans_query_, - &local_ibans_); + if (h == pending_local_ibans_query_) { + ReceiveLoadedDbValues(h, result.get(), &pending_local_ibans_query_, + &local_ibans_); + } else { + DCHECK_EQ(h, pending_server_ibans_query_) + << "received ibans from invalid request."; + ReceiveLoadedDbValues(h, result.get(), &pending_server_ibans_query_, + &server_ibans_); + } break; case AUTOFILL_CUSTOMERDATA_RESULT: DCHECK_EQ(h, pending_customer_data_query_) @@ -1242,6 +1249,7 @@ // that the data changed and then this class will re-fetch. Preemptively // clear so that tests can synchronously verify that this data was cleared. server_credit_cards_.clear(); + server_ibans_.clear(); credit_card_billing_addresses_.clear(); payments_customer_data_.reset(); server_credit_card_cloud_token_data_.clear(); @@ -1252,6 +1260,7 @@ void PersonalDataManager::ClearAllLocalData() { database_helper_->GetLocalDatabase()->ClearAllLocalData(); local_credit_cards_.clear(); + local_ibans_.clear(); synced_local_profiles_.clear(); } @@ -1452,6 +1461,19 @@ return result; } +std::vector<const Iban*> PersonalDataManager::GetServerIbans() const { + std::vector<const Iban*> result; + if (!IsAutofillWalletImportEnabled()) { + return result; + } + + result.reserve(server_ibans_.size()); + for (const std::unique_ptr<Iban>& iban : server_ibans_) { + result.push_back(iban.get()); + } + return result; +} + PaymentsCustomerData* PersonalDataManager::GetPaymentsCustomerData() const { return payments_customer_data_ ? payments_customer_data_.get() : nullptr; } @@ -2110,9 +2132,15 @@ return; } - CancelPendingLocalQuery(&pending_ibans_query_); + CancelPendingLocalQuery(&pending_local_ibans_query_); + CancelPendingServerQuery(&pending_server_ibans_query_); - pending_ibans_query_ = database_helper_->GetLocalDatabase()->GetIbans(this); + pending_local_ibans_query_ = + database_helper_->GetLocalDatabase()->GetIbans(this); + if (database_helper_->GetServerDatabase()) { + pending_server_ibans_query_ = + database_helper_->GetServerDatabase()->GetServerIbans(this); + } } void PersonalDataManager::LoadAutofillOffers() { @@ -2165,6 +2193,7 @@ CancelPendingServerQuery(&pending_server_creditcards_query_); CancelPendingServerQuery(&pending_customer_data_query_); CancelPendingServerQuery(&pending_server_creditcard_cloud_token_data_query_); + CancelPendingServerQuery(&pending_server_ibans_query_); CancelPendingServerQuery(&pending_offer_data_query_); CancelPendingServerQuery(&pending_virtual_card_usage_data_query_); }
diff --git a/components/autofill/core/browser/personal_data_manager.h b/components/autofill/core/browser/personal_data_manager.h index 5912f99..778c97b5 100644 --- a/components/autofill/core/browser/personal_data_manager.h +++ b/components/autofill/core/browser/personal_data_manager.h
@@ -378,6 +378,8 @@ // Returns local IBANs. virtual std::vector<Iban*> GetLocalIbans() const; + // Returns server IBANs. + virtual std::vector<const Iban*> GetServerIbans() const; // Returns the Payments customer data. Returns nullptr if no data is present. virtual PaymentsCustomerData* GetPaymentsCustomerData() const; @@ -817,8 +819,9 @@ std::vector<std::unique_ptr<CreditCard>> local_credit_cards_; std::vector<std::unique_ptr<CreditCard>> server_credit_cards_; - // Cached versions of the local IBANs. + // Cached versions of the local and server IBANs. std::vector<std::unique_ptr<Iban>> local_ibans_; + std::vector<std::unique_ptr<Iban>> server_ibans_; // Cached version of the CreditCardCloudTokenData obtained from the database. std::vector<std::unique_ptr<CreditCardCloudTokenData>> @@ -847,7 +850,8 @@ WebDataServiceBase::Handle pending_server_creditcards_query_ = 0; WebDataServiceBase::Handle pending_server_creditcard_cloud_token_data_query_ = 0; - WebDataServiceBase::Handle pending_ibans_query_ = 0; + WebDataServiceBase::Handle pending_local_ibans_query_ = 0; + WebDataServiceBase::Handle pending_server_ibans_query_ = 0; WebDataServiceBase::Handle pending_customer_data_query_ = 0; WebDataServiceBase::Handle pending_offer_data_query_ = 0; WebDataServiceBase::Handle pending_virtual_card_usage_data_query_ = 0;
diff --git a/components/autofill/core/browser/personal_data_manager_cleaner.cc b/components/autofill/core/browser/personal_data_manager_cleaner.cc index 53121a5..f0d0ae9 100644 --- a/components/autofill/core/browser/personal_data_manager_cleaner.cc +++ b/components/autofill/core/browser/personal_data_manager_cleaner.cc
@@ -109,15 +109,24 @@ } } -void PersonalDataManagerCleaner::ApplyAddressFixesAndCleanups() { - // Once per major version, otherwise NOP. +bool PersonalDataManagerCleaner::ApplyAddressFixesAndCleanups() { + // Check if de-duplication has already been performed on this major version. + if (!is_autofill_profile_cleanup_pending_) { + DVLOG(1) + << "Autofill profile de-duplication already performed for this version"; + return false; + } + ApplyDedupingRoutine(); - - // Once per major version, otherwise NOP. DeleteDisusedAddresses(); - - // Once per user profile startup. RemoveInaccessibleProfileValues(); + + is_autofill_profile_cleanup_pending_ = false; + // Set the pref to the current major version. + pref_service_->SetInteger(prefs::kAutofillLastVersionDeduped, + CHROME_VERSION_MAJOR); + + return true; } void PersonalDataManagerCleaner::ApplyCardFixesAndCleanups() { @@ -151,13 +160,6 @@ } bool PersonalDataManagerCleaner::ApplyDedupingRoutine() { - // Check if de-duplication has already been performed on this major version. - if (!is_autofill_profile_cleanup_pending_) { - DVLOG(1) - << "Autofill profile de-duplication already performed for this version"; - return false; - } - const std::vector<AutofillProfile*>& profiles = base::FeatureList::IsEnabled( features::kAutofillAccountProfileStorage) @@ -200,11 +202,6 @@ UpdateCardsBillingAddressReference(guids_merge_map); - is_autofill_profile_cleanup_pending_ = false; - // Set the pref to the current major version. - pref_service_->SetInteger(prefs::kAutofillLastVersionDeduped, - CHROME_VERSION_MAJOR); - return true; }
diff --git a/components/autofill/core/browser/personal_data_manager_cleaner.h b/components/autofill/core/browser/personal_data_manager_cleaner.h index 7a11974..9ece38f 100644 --- a/components/autofill/core/browser/personal_data_manager_cleaner.h +++ b/components/autofill/core/browser/personal_data_manager_cleaner.h
@@ -38,12 +38,20 @@ // Applies address/credit card fixes and cleanups depending on the // |model_type|. + // TODO(crbug.com/1477292): For syncing users, SyncStarted is called just once + // when the sync is enabled. Instead, it should be called every time on + // browser startup. void SyncStarted(syncer::ModelType model_type); #if defined(UNIT_TEST) // A wrapper around |ApplyDedupingRoutine()| used for testing purposes. bool ApplyDedupingRoutineForTesting() { return ApplyDedupingRoutine(); } + // A wrapper around `ApplyAddressFixesAndCleanups` used for testing purposes. + bool ApplyAddressFixesAndCleanupsForTesting() { + return ApplyAddressFixesAndCleanups(); + } + // A wrapper around |RemoveInaccessibleProfileValues()| used for testing // purposes. void RemoveInaccessibleProfileValuesForTesting() { @@ -88,7 +96,7 @@ private: // Applies various fixes and cleanups on autofill addresses. - void ApplyAddressFixesAndCleanups(); + bool ApplyAddressFixesAndCleanups(); // Applies various fixes and cleanups on autofill credit cards. void ApplyCardFixesAndCleanups();
diff --git a/components/autofill/core/browser/personal_data_manager_cleaner_unittest.cc b/components/autofill/core/browser/personal_data_manager_cleaner_unittest.cc index 8cba2f0..fe6a751 100644 --- a/components/autofill/core/browser/personal_data_manager_cleaner_unittest.cc +++ b/components/autofill/core/browser/personal_data_manager_cleaner_unittest.cc
@@ -633,7 +633,8 @@ EXPECT_EQ(2U, personal_data_->GetProfiles().size()); // The deduping routine should be run a first time. - EXPECT_TRUE(personal_data_manager_cleaner_->ApplyDedupingRoutineForTesting()); + EXPECT_TRUE( + personal_data_manager_cleaner_->ApplyAddressFixesAndCleanupsForTesting()); PersonalDataProfileTaskWaiter(*personal_data_).Wait(); std::vector<AutofillProfile*> profiles = personal_data_->GetProfiles(); @@ -654,7 +655,7 @@ // The deduping routine should not be run. EXPECT_FALSE( - personal_data_manager_cleaner_->ApplyDedupingRoutineForTesting()); + personal_data_manager_cleaner_->ApplyAddressFixesAndCleanupsForTesting()); // The two duplicate profiles should still be present. EXPECT_EQ(2U, personal_data_->GetProfiles().size());
diff --git a/components/autofill/core/browser/personal_data_manager_unittest.cc b/components/autofill/core/browser/personal_data_manager_unittest.cc index 498ce36..aaa1f3f 100644 --- a/components/autofill/core/browser/personal_data_manager_unittest.cc +++ b/components/autofill/core/browser/personal_data_manager_unittest.cc
@@ -43,7 +43,6 @@ #include "components/autofill/core/browser/test_autofill_clock.h" #include "components/autofill/core/browser/ui/label_formatter_utils.h" #include "components/autofill/core/browser/ui/suggestion.h" -#include "components/autofill/core/browser/ui/suggestion_selection.h" #include "components/autofill/core/common/autofill_clock.h" #include "components/autofill/core/common/autofill_constants.h" #include "components/autofill/core/common/autofill_features.h" @@ -965,6 +964,25 @@ } #endif // BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_ANDROID) +// Test that server IBANs can be added and automatically loaded/cached. +TEST_F(PersonalDataManagerTest, AddAndReloadServerIbans) { + Iban server_iban1 = test::GetServerIban(); + Iban server_iban2 = test::GetServerIban2(); + + GetServerDataTable()->SetServerIbans({server_iban1, server_iban2}); + std::vector<const Iban*> expected_ibans = {&server_iban1, &server_iban2}; + personal_data_->Refresh(); + PersonalDataProfileTaskWaiter(*personal_data_).Wait(); + ExpectSameElements(expected_ibans, personal_data_->GetServerIbans()); + + // Reset the PersonalDataManager. This tests that the personal data was saved + // to the web database, and that we can load the IBANs from the web database. + ResetPersonalDataManager(); + + // Verify that we've reloaded the IBANs from the web database. + ExpectSameElements(expected_ibans, personal_data_->GetServerIbans()); +} + TEST_F(PersonalDataManagerTest, NoIbansAddedIfDisabled) { prefs::SetAutofillCreditCardEnabled(prefs_.get(), false);
diff --git a/components/autofill/core/browser/test_personal_data_manager.cc b/components/autofill/core/browser/test_personal_data_manager.cc index f9092b5..75d21a9 100644 --- a/components/autofill/core/browser/test_personal_data_manager.cc +++ b/components/autofill/core/browser/test_personal_data_manager.cc
@@ -210,14 +210,23 @@ } void TestPersonalDataManager::LoadIbans() { - pending_ibans_query_ = 128; + pending_local_ibans_query_ = 128; + pending_server_ibans_query_ = 129; { std::vector<std::unique_ptr<Iban>> ibans; local_ibans_.swap(ibans); std::unique_ptr<WDTypedResult> result = std::make_unique<WDResult<std::vector<std::unique_ptr<Iban>>>>( AUTOFILL_IBANS_RESULT, std::move(ibans)); - OnWebDataServiceRequestDone(pending_ibans_query_, std::move(result)); + OnWebDataServiceRequestDone(pending_local_ibans_query_, std::move(result)); + } + { + std::vector<std::unique_ptr<Iban>> server_ibans; + server_ibans_.swap(server_ibans); + std::unique_ptr<WDTypedResult> result = + std::make_unique<WDResult<std::vector<std::unique_ptr<Iban>>>>( + AUTOFILL_IBANS_RESULT, std::move(server_ibans)); + OnWebDataServiceRequestDone(pending_server_ibans_query_, std::move(result)); } }
diff --git a/components/autofill/core/browser/ui/suggestion_selection.cc b/components/autofill/core/browser/ui/suggestion_selection.cc deleted file mode 100644 index 8bfbaa9..0000000 --- a/components/autofill/core/browser/ui/suggestion_selection.cc +++ /dev/null
@@ -1,430 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#include "components/autofill/core/browser/ui/suggestion_selection.h" - -#include <string> -#include <unordered_set> -#include <vector> - -#include "base/containers/cxx20_erase_vector.h" -#include "base/strings/string_util.h" -#include "base/strings/utf_string_conversions.h" -#include "base/time/time.h" -#include "build/build_config.h" -#include "components/autofill/core/browser/autofill_data_util.h" -#include "components/autofill/core/browser/autofill_granular_filling_utils.h" -#include "components/autofill/core/browser/autofill_suggestion_generator.h" -#include "components/autofill/core/browser/autofill_type.h" -#include "components/autofill/core/browser/data_model/autofill_profile.h" -#include "components/autofill/core/browser/data_model/autofill_profile_comparator.h" -#include "components/autofill/core/browser/data_model/borrowed_transliterator.h" -#include "components/autofill/core/browser/field_types.h" -#include "components/autofill/core/browser/geo/address_i18n.h" -#include "components/autofill/core/browser/metrics/autofill_metrics.h" -#include "components/autofill/core/browser/ui/suggestion.h" -#include "components/autofill/core/common/autofill_clock.h" -#include "components/autofill/core/common/autofill_features.h" -#include "components/autofill/core/common/autofill_util.h" -#include "components/strings/grit/components_strings.h" -#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_data.h" -#include "third_party/libaddressinput/src/cpp/include/libaddressinput/address_formatter.h" -#include "ui/base/l10n/l10n_util.h" - -namespace autofill::suggestion_selection { - -namespace { -using ::i18n::addressinput::AddressField; -using ::i18n::addressinput::GetStreetAddressLinesAsSingleLine; -using ::i18n::addressinput::STREET_ADDRESS; - -Suggestion GetEditAddressProfileSuggestion(Suggestion::BackendId backend_id) { - Suggestion suggestion(l10n_util::GetStringUTF16( - IDS_AUTOFILL_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED)); - suggestion.popup_item_id = PopupItemId::kEditAddressProfile; - suggestion.icon = "editIcon"; - suggestion.payload = backend_id; - suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_A11Y_ANNOUNCE_EDIT_ADDRESS_PROFILE_POPUP_OPTION_SELECTED); - return suggestion; -} - -// Creates the suggestion that will open the delete address profile dialog. -Suggestion GetDeleteAddressProfileSuggestion(Suggestion::BackendId backend_id) { - Suggestion suggestion(l10n_util::GetStringUTF16( - IDS_AUTOFILL_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED)); - suggestion.popup_item_id = PopupItemId::kDeleteAddressProfile; - suggestion.icon = "deleteIcon"; - suggestion.payload = backend_id; - suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_A11Y_ANNOUNCE_DELETE_ADDRESS_PROFILE_POPUP_OPTION_SELECTED); - return suggestion; -} - -// Creates the suggestion that will fill all address related fields. -Suggestion GetFillFullAddressSuggestion(Suggestion::BackendId backend_id) { - Suggestion suggestion(l10n_util::GetStringUTF16( - IDS_AUTOFILL_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED)); - suggestion.popup_item_id = PopupItemId::kFillFullAddress; - suggestion.payload = backend_id; - suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_ADDRESS_GROUP_POPUP_OPTION_SELECTED); - return suggestion; -} - -// Creates the suggestion that will fill all name related fields. -Suggestion GetFillFullNameSuggestion(Suggestion::BackendId backend_id) { - Suggestion suggestion(l10n_util::GetStringUTF16( - IDS_AUTOFILL_FILL_NAME_GROUP_POPUP_OPTION_SELECTED)); - suggestion.popup_item_id = PopupItemId::kFillFullName; - suggestion.payload = backend_id; - suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_NAME_GROUP_POPUP_OPTION_SELECTED); - - return suggestion; -} - -// Creates the suggestion that will fill the whole form for the profile. This -// suggestion is displayed once the users is on group filling level or field by -// field level. It is used as a way to allow users to go back to filling the -// whole form. -Suggestion GetFillEverythingFromAddressProfileSuggestion( - Suggestion::BackendId backend_id) { - Suggestion suggestion(l10n_util::GetStringUTF16( - IDS_AUTOFILL_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED)); - suggestion.popup_item_id = PopupItemId::kFillEverythingFromAddressProfile; - suggestion.icon = "magicIcon"; - suggestion.payload = backend_id; - suggestion.acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_A11Y_ANNOUNCE_FILL_EVERYTHING_FROM_ADDRESS_PROFILE_POPUP_OPTION_SELECTED); - return suggestion; -} - -// Append new suggestions to `suggestions` based on the `ServerFieldType` list -// provided. Suggestions are not added if their info is not found in the -// provided `profile`. Returns true if any suggestion was added. -bool AddFieldByFieldSuggestions(const std::vector<ServerFieldType>& types, - const AutofillProfile& profile, - const std::string& app_locale, - std::vector<Suggestion>& suggestions) { - bool any_suggestion_added = false; - for (auto type : types) { - std::u16string value = profile.GetInfo(type, app_locale); - if (!value.empty()) { - suggestions.emplace_back(value, PopupItemId::kFieldByFieldFilling); - any_suggestion_added = true; - } - } - return any_suggestion_added; -} - -// Given an address `type` and `sub_type`, returns whether the `sub_type` info -// stored in `profile` is a substring of the info stored in `profile` for -// `type`. -bool CheckIfTypeContainsSubtype(ServerFieldType type, - ServerFieldType sub_type, - const AutofillProfile& profile, - const std::string& app_locale) { - if (!profile.HasInfo(type) || !profile.HasInfo(sub_type)) { - return false; - } - - std::u16string value = profile.GetInfo(type, app_locale); - std::u16string sub_value = profile.GetInfo(sub_type, app_locale); - return value != sub_value && value.find(sub_value) != std::u16string::npos; -} - -// Adds name related child suggestions to build autofill popup submenu. -// The param `type` refers to the triggering field type (clicked by the users) -// and is used to define whether the `PopupItemId::kFillFullName` suggestion -// will be available. -void AddNameChildSuggestions(const AutofillType& type, - const AutofillProfile& profile, - const std::string& app_locale, - Suggestion& suggestion) { - const FieldTypeGroup field_type_group = type.group(); - if (field_type_group == FieldTypeGroup::kName) { - // Note that this suggestion can only be added if name infos exist in the - // profile. - suggestion.children.push_back( - GetFillFullNameSuggestion(Suggestion::BackendId(profile.guid()))); - } - if (AddFieldByFieldSuggestions({NAME_FIRST, NAME_MIDDLE, NAME_LAST}, profile, - app_locale, suggestion.children)) { - suggestion.children.push_back( - AutofillSuggestionGenerator::CreateSeparator()); - }; -} - -// Adds address line suggestions (ADDRESS_HOME_LINE1 and/or -// ADDRESS_HOME_LINE2) to `suggestions.children`. It potentially includes -// sub-children if one of the added suggestions contains -// ADDRESS_HOME_HOUSE_NUMBER and/or ADDRESS_HOME_STREET_NAME. Returns true if at -// least one suggestion was appended to `suggestions.children`. -bool AddAddressLineChildSuggestions(const AutofillProfile& profile, - const std::string& app_locale, - std::vector<Suggestion>& suggestions) { - auto add_address_line = [&](ServerFieldType type) -> bool { - CHECK(type == ADDRESS_HOME_LINE1 || type == ADDRESS_HOME_LINE2); - - if (!AddFieldByFieldSuggestions({type}, profile, app_locale, suggestions)) { - return false; - } - - if (CheckIfTypeContainsSubtype(type, ADDRESS_HOME_HOUSE_NUMBER, profile, - app_locale) && - AddFieldByFieldSuggestions({ADDRESS_HOME_HOUSE_NUMBER}, profile, - app_locale, suggestions.back().children)) { - Suggestion& address_line_suggestion = suggestions.back().children.back(); - address_line_suggestion.labels = { - {Suggestion::Text(l10n_util::GetStringUTF16( - IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT))}}; - address_line_suggestion - .acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_HOUSE_NUMBER_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED); - } - if (CheckIfTypeContainsSubtype(type, ADDRESS_HOME_STREET_NAME, profile, - app_locale) && - AddFieldByFieldSuggestions({ADDRESS_HOME_STREET_NAME}, profile, - app_locale, suggestions.back().children)) { - Suggestion& address_line_suggestion = suggestions.back().children.back(); - address_line_suggestion.labels = { - {Suggestion::Text(l10n_util::GetStringUTF16( - IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT))}}; - address_line_suggestion - .acceptance_a11y_announcement = l10n_util::GetStringUTF16( - IDS_AUTOFILL_STREET_NAME_SUGGESTION_SECONDARY_TEXT_OPTION_SELECTED); - } - - return true; - }; - bool added_address_line1 = add_address_line(ADDRESS_HOME_LINE1); - bool added_address_line2 = add_address_line(ADDRESS_HOME_LINE2); - return added_address_line1 || added_address_line2; -} - -// Adds address related child suggestions to build autofill popup submenu. -// The param `type` refers to the triggering field type (clicked by the users) -// and is used to define whether the `PopupItemId::kFillFullAddress` suggestion -// will be available. -void AddAddressChildSuggestions(const AutofillType& type, - const AutofillProfile& profile, - const std::string& app_locale, - Suggestion& suggestion) { - const FieldTypeGroup field_type_group = type.group(); - if (field_type_group == FieldTypeGroup::kAddress) { - // Note that this suggestion can only be added if address infos exist in the - // profile. - suggestion.children.push_back( - GetFillFullAddressSuggestion(Suggestion::BackendId(profile.guid()))); - } - - bool added_any_address_line = - AddAddressLineChildSuggestions(profile, app_locale, suggestion.children); - bool added_zip = AddFieldByFieldSuggestions({ADDRESS_HOME_ZIP}, profile, - app_locale, suggestion.children); - if (added_any_address_line || added_zip) { - suggestion.children.push_back( - AutofillSuggestionGenerator::CreateSeparator()); - } -} - -// Adds contact related child suggestions (i.e email and phone number) to -// build autofill popup submenu. The param `type` refers to the triggering field -// type (clicked by the users) and is used to define whether the phone number -// suggestion will behave as `PopupItemId::kFieldByFieldFilling` or as -// `PopupItemId::kFillFullPhoneNumber`. -void AddContactChildSuggestions(const AutofillType& type, - const AutofillProfile& profile, - const std::string& app_locale, - Suggestion& suggestion) { - // Creates a phone number suggestion for the autofill submenu. When triggered - // from a phone number field this suggestion will fill every phone number - // field. Otherwise it fills a specific field. - bool phone_number_suggestion_added = false; - if (profile.HasInfo(PHONE_HOME_WHOLE_NUMBER)) { - Suggestion phone_number_suggestion( - profile.GetInfo(PHONE_HOME_WHOLE_NUMBER, app_locale)); - const bool is_phone_field = type.group() == FieldTypeGroup::kPhone; - phone_number_suggestion.popup_item_id = - is_phone_field ? PopupItemId::kFillFullPhoneNumber - : PopupItemId::kFieldByFieldFilling; - phone_number_suggestion.payload = Suggestion::BackendId(profile.guid()); - suggestion.children.push_back(std::move(phone_number_suggestion)); - phone_number_suggestion_added = true; - } - if (AddFieldByFieldSuggestions({EMAIL_ADDRESS}, profile, app_locale, - suggestion.children) || - phone_number_suggestion_added) { - suggestion.children.push_back( - AutofillSuggestionGenerator::CreateSeparator()); - } -} - -// Adds footer child suggestions to build autofill popup submenu. -void AddFooterChildSuggestions( - const AutofillProfile& profile, - absl::optional<ServerFieldTypeSet> last_targeted_fields, - Suggestion& suggestion) { - // If the last filling granularity was not full form, add the - // `PopupItemId::kFillEverythingFromAddressProfile` suggestion. This allows - // the user to go back to filling the whole form once in a more fine grained - // filling experience. - if (!last_targeted_fields || *last_targeted_fields != kAllServerFieldTypes) { - suggestion.children.push_back(GetFillEverythingFromAddressProfileSuggestion( - Suggestion::BackendId(profile.guid()))); - } - suggestion.children.push_back( - GetEditAddressProfileSuggestion(Suggestion::BackendId(profile.guid()))); - suggestion.children.push_back( - GetDeleteAddressProfileSuggestion(Suggestion::BackendId(profile.guid()))); -} - -} // namespace - -std::u16string GetSuggestionMainText(const AutofillProfile* profile, - const AutofillType& type, - const std::string& app_locale) { - AddressField address_field; - if (i18n::FieldForType(type.GetStorableType(), &address_field) && - address_field == STREET_ADDRESS) { - std::string street_address_line; - GetStreetAddressLinesAsSingleLine( - *i18n::CreateAddressDataFromAutofillProfile(*profile, app_locale), - &street_address_line); - return base::UTF8ToUTF16(street_address_line); - } - - std::u16string value = profile->GetInfo(type, app_locale); - - if (type.group() == FieldTypeGroup::kPhone) { - bool format_phone; - -#if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) - format_phone = base::FeatureList::IsEnabled( - features::kAutofillUseMobileLabelDisambiguation); -#else - format_phone = base::FeatureList::IsEnabled( - features::kAutofillUseImprovedLabelDisambiguation); -#endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) - - if (format_phone) { - // Formats, e.g., the US phone numbers 15084880800, 508 488 0800, and - // +15084880800, as (508) 488-0800, and the Brazilian phone numbers - // 21987650000 and +55 11 2648-0254 as (21) 98765-0000 and - // (11) 2648-0254, respectively. - value = base::UTF8ToUTF16(i18n::FormatPhoneNationallyForDisplay( - base::UTF16ToUTF8(value), - data_util::GetCountryCodeWithFallback(*profile, app_locale))); - } - } - return value; -} - -void AddSuggestionDetailsForCurrentFillingGranularity( - absl::optional<ServerFieldTypeSet> optional_last_targeted_fields, - const AutofillType& triggering_field_type, - Suggestion& suggestion) { - const ServerFieldTypeSet& last_targeted_fields = - optional_last_targeted_fields.value_or(kAllServerFieldTypes); - - if (AreFieldsGranularFillingGroup(last_targeted_fields)) { - switch (triggering_field_type.group()) { - case FieldTypeGroup::kName: - suggestion.popup_item_id = PopupItemId::kFillFullName; - break; - case FieldTypeGroup::kAddress: - suggestion.popup_item_id = PopupItemId::kFillFullAddress; - break; - case FieldTypeGroup::kPhone: - suggestion.popup_item_id = PopupItemId::kFillFullPhoneNumber; - break; - default: - // If the 'current_granularity' is group filling, BUT the current - // focused field is not one for which group we offer group filling - // (kName, kAddress and kPhone), we default back to fill full form - // behaviour/pre-granular filling popup id. - suggestion.popup_item_id = PopupItemId::kAddressEntry; - } - } else if (last_targeted_fields == kAllServerFieldTypes) { - suggestion.popup_item_id = PopupItemId::kAddressEntry; - } else if (last_targeted_fields.size() == 1) { - // Note: This does not affect SingleFieldFormFillers such - // Autocomplete, IBANs and merchand promo. Even though they also fill only - // one field, they have different code paths, therefore their suggestions - // are not generated here. Furthermore, we do not store - // `last_targeted_fields` for them. - suggestion.popup_item_id = PopupItemId::kFieldByFieldFilling; - } else { - NOTREACHED_NORETURN(); - } -} - -void AddGranularFillingChildSuggestions( - const AutofillType& type, - absl::optional<ServerFieldTypeSet> last_targeted_fields, - const AutofillProfile& profile, - const std::string& app_locale, - Suggestion& suggestion) { - AddNameChildSuggestions(type, profile, app_locale, suggestion); - AddAddressChildSuggestions(type, profile, app_locale, suggestion); - AddContactChildSuggestions(type, profile, app_locale, suggestion); - AddFooterChildSuggestions(profile, last_targeted_fields, suggestion); -} - -std::u16string NormalizeForComparisonForType(const std::u16string& text, - ServerFieldType type) { - if (GroupTypeOfServerFieldType(type) == FieldTypeGroup::kEmail) { - // For emails, keep special characters so that if the user has two emails - // `test@foo.xyz` and `test1@foo.xyz` saved, only the first one is suggested - // upon entering `test@` into the email field. - return RemoveDiacriticsAndConvertToLowerCase(text); - } - return AutofillProfileComparator::NormalizeForComparison(text); -} - -bool IsValidSuggestionForFieldContents(std::u16string suggestion_canon, - std::u16string field_contents_canon, - const AutofillType& type, - bool is_masked_server_card, - bool field_is_autofilled) { - // Phones should do a substring match because they can be trimmed to remove - // the first parts (e.g. country code or prefix). - if (type.group() == FieldTypeGroup::kPhone && - suggestion_canon.find(field_contents_canon) != std::u16string::npos) { - return true; - } - - // For card number fields, suggest the card if: - // - the number matches any part of the card, or - // - it's a masked card and there are 6 or fewer typed so far. - // - it's a masked card, field is autofilled, and the last 4 digits in the - // field match the last 4 digits of the card. - if (type.GetStorableType() == CREDIT_CARD_NUMBER) { - if (suggestion_canon.find(field_contents_canon) != std::u16string::npos) { - return true; - } - - if (is_masked_server_card) { - if (field_contents_canon.length() < 6) { - return true; - } - if (field_is_autofilled) { - int field_contents_length = field_contents_canon.length(); - DCHECK(field_contents_length >= 4); - if (suggestion_canon.find(field_contents_canon.substr( - field_contents_length - 4, field_contents_length)) != - std::u16string::npos) { - return true; - } - } - } - - return false; - } - - return base::StartsWith(suggestion_canon, field_contents_canon, - base::CompareCase::SENSITIVE); -} - -} // namespace autofill::suggestion_selection
diff --git a/components/autofill/core/browser/ui/suggestion_selection.h b/components/autofill/core/browser/ui/suggestion_selection.h deleted file mode 100644 index fbcdb2a..0000000 --- a/components/autofill/core/browser/ui/suggestion_selection.h +++ /dev/null
@@ -1,71 +0,0 @@ -// Copyright 2018 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -#ifndef COMPONENTS_AUTOFILL_CORE_BROWSER_UI_SUGGESTION_SELECTION_H_ -#define COMPONENTS_AUTOFILL_CORE_BROWSER_UI_SUGGESTION_SELECTION_H_ - -#include <string> -#include <vector> - -#include "base/time/time.h" -#include "components/autofill/core/browser/autofill_trigger_details.h" -#include "components/autofill/core/browser/field_types.h" -#include "components/autofill/core/browser/ui/suggestion.h" - -namespace autofill { - -class AutofillProfile; -class AutofillType; - -namespace suggestion_selection { - -// Sets the `popup_item_id` for `suggestion` depending on -// `last_filling_granularity`. If the `last_filling_granularity` for a certain -// form was group filling, also add labels to give users feedback about the next -// filling behaviour. -// `last_targeted_fields` specified the last set of fields target by the user. -// When not present, we default to full form. -// TODO(crbug.com/1466116): Add tests when this is actually used. -// TODO(crbug.com/1466116): Add labels when `last_filling_granularity` is group -// filling. -void AddSuggestionDetailsForCurrentFillingGranularity( - absl::optional<ServerFieldTypeSet> last_targeted_fields, - const AutofillType& triggering_field_type, - Suggestion& suggestion); - -// Creates nested/child suggestions for `suggestion` with the `profile` -// information. Uses `type` to define what group filling suggestion to add -// (name, address or phone). The existence of child suggestions defines whether -// the autofill popup will have submenus. -// `last_targeted_fields` specified the last set of fields target by the user. -// When not present, we default to full form. -void AddGranularFillingChildSuggestions( - const AutofillType& type, - absl::optional<ServerFieldTypeSet> last_targeted_fields, - const AutofillProfile& profile, - const std::string& app_locale, - Suggestion& suggestion); - -// In addition to just getting the values out of the autocomplete profile, this -// function handles formatting of the street addresses and phone numbers. -std::u16string GetSuggestionMainText(const AutofillProfile* profile, - const AutofillType& type, - const std::string& app_locale); - -// Normalizes text for comparison based on the type of the field `text` was -// entered into. -std::u16string NormalizeForComparisonForType(const std::u16string& text, - ServerFieldType type); - -// Returns whether the `suggestion_canon` is a valid match given -// `field_contents_canon`. -bool IsValidSuggestionForFieldContents(std::u16string suggestion_canon, - std::u16string field_contents_canon, - const AutofillType& type, - bool is_masked_server_card, - bool field_is_autofilled); - -} // namespace suggestion_selection -} // namespace autofill - -#endif // COMPONENTS_AUTOFILL_CORE_BROWSER_UI_SUGGESTION_SELECTION_H_
diff --git a/components/autofill/core/browser/webdata/autofill_table.cc b/components/autofill/core/browser/webdata/autofill_table.cc index d444645..695aa42 100644 --- a/components/autofill/core/browser/webdata/autofill_table.cc +++ b/components/autofill/core/browser/webdata/autofill_table.cc
@@ -1958,7 +1958,7 @@ insert.BindString(index++, profile.language_code()); insert.Run(); - insert.Reset(true); + insert.Reset(/*clear_bound_vars=*/true); if (update_metadata) { // Save the use count and use date of the profile. @@ -2577,6 +2577,44 @@ return s.Succeeded(); } +bool AutofillTable::AddOrUpdateServerIbanMetadata(const Iban& iban) { + CHECK_EQ(Iban::RecordType::kServerIban, iban.record_type()); + // There's no need to verify if removal succeeded, because if it's a new IBAN, + // the removal call won't do anything. + RemoveServerIbanMetadata(iban.instrument_id()); + + sql::Statement s; + InsertBuilder(db_, s, kMaskedIbansMetadataTable, + {kInstrumentId, kUseCount, kUseDate}); + s.BindString(0, iban.GetMetadata().id); + s.BindInt64(1, iban.GetMetadata().use_count); + s.BindTime(2, iban.GetMetadata().use_date); + return s.Run(); +} + +bool AutofillTable::RemoveServerIbanMetadata(const std::string& instrument_id) { + return DeleteWhereColumnEq(db_, kMaskedIbansMetadataTable, kInstrumentId, + instrument_id); +} + +std::vector<AutofillMetadata> AutofillTable::GetServerIbansMetadata() const { + sql::Statement s; + SelectBuilder(db_, s, kMaskedIbansMetadataTable, + {kInstrumentId, kUseCount, kUseDate}); + + std::vector<AutofillMetadata> ibans_metadata; + while (s.Step()) { + int index = 0; + AutofillMetadata iban_metadata; + iban_metadata.id = s.ColumnString(index++); + iban_metadata.use_count = s.ColumnInt64(index++); + iban_metadata.use_date = + base::Time::FromInternalValue(s.ColumnInt64(index++)); + ibans_metadata.push_back(iban_metadata); + } + return ibans_metadata; +} + void AutofillTable::SetServerCardsData( const std::vector<CreditCard>& credit_cards) { sql::Transaction transaction(db_); @@ -2617,7 +2655,7 @@ masked_insert.BindString(index++, card.card_art_url().spec()); masked_insert.BindString16(index++, card.product_description()); masked_insert.Run(); - masked_insert.Reset(true); + masked_insert.Reset(/*clear_bound_vars=*/true); } // Delete all items in the unmasked table that aren't in the new set. @@ -2655,7 +2693,7 @@ insert_cloud_token.BindString(4, data.card_art_url); insert_cloud_token.BindString(5, data.instrument_token); insert_cloud_token.Run(); - insert_cloud_token.Reset(true); + insert_cloud_token.Reset(/*clear_bound_vars=*/true); } transaction.Commit(); } @@ -2686,6 +2724,61 @@ return s.Succeeded(); } +std::vector<std::unique_ptr<Iban>> AutofillTable::GetServerIbans() { + sql::Statement s; + SelectBuilder(db_, s, kMaskedIbansTable, + {kInstrumentId, kUseCount, kUseDate, kNickname, kPrefix, + kSuffix, kLength}, + "LEFT OUTER JOIN masked_ibans_metadata USING (instrument_id)"); + + std::vector<std::unique_ptr<Iban>> ibans; + while (s.Step()) { + int index = 0; + std::unique_ptr<Iban> iban = + std::make_unique<Iban>(Iban::InstrumentId(s.ColumnString(index++))); + iban->set_use_count(s.ColumnInt64(index++)); + iban->set_use_date(base::Time::FromTimeT(s.ColumnInt64(index++))); + iban->set_nickname(s.ColumnString16(index++)); + iban->set_prefix(s.ColumnString16(index++)); + iban->set_suffix(s.ColumnString16(index++)); + iban->set_length(s.ColumnInt64(index++)); + ibans.push_back(std::move(iban)); + } + + return ibans; +} + +bool AutofillTable::SetServerIbans(const std::vector<Iban>& ibans) { + sql::Transaction transaction(db_); + if (!transaction.Begin()) { + return false; + } + + // Delete all old ones first. + Delete(db_, kMaskedIbansTable); + Delete(db_, kMaskedIbansMetadataTable); + sql::Statement s; + InsertBuilder(db_, s, kMaskedIbansTable, + {kInstrumentId, kNickname, kPrefix, kSuffix, kLength}); + for (const Iban& iban : ibans) { + CHECK_EQ(Iban::RecordType::kServerIban, iban.record_type()); + int index = 0; + s.BindString(index++, iban.instrument_id()); + s.BindString16(index++, iban.nickname()); + s.BindString16(index++, iban.prefix()); + s.BindString16(index++, iban.suffix()); + s.BindInt64(index++, iban.length()); + if (!s.Run()) { + return false; + } + s.Reset(/*clear_bound_vars=*/true); + + // Save the use count and use date of the IBAN. + AddOrUpdateServerIbanMetadata(iban); + } + return transaction.Commit(); +} + void AutofillTable::SetPaymentsCustomerData( const PaymentsCustomerData* customer_data) { sql::Transaction transaction(db_); @@ -2748,7 +2841,7 @@ insert_offers.BindString(7, data.GetDisplayStrings().usage_instructions_text); insert_offers.Run(); - insert_offers.Reset(true); + insert_offers.Reset(/*clear_bound_vars=*/true); for (const int64_t instrument_id : data.GetEligibleInstrumentIds()) { // Insert new offer_eligible_instrument values. @@ -2895,7 +2988,7 @@ for (const VirtualCardUsageData& data : virtual_card_usage_data) { BindVirtualCardUsageDataToStatement(data, insert_data); insert_data.Run(); - insert_data.Reset(true); + insert_data.Reset(/*clear_bound_vars=*/true); } transaction.Commit(); } @@ -2926,7 +3019,7 @@ bool changed = false; for (std::string_view table_name : - {kMaskedCreditCardsTable, kUnmaskedCreditCardsTable, + {kMaskedCreditCardsTable, kMaskedIbansTable, kUnmaskedCreditCardsTable, kServerAddressesTable, kServerCardMetadataTable, kServerAddressMetadataTable, kPaymentsCustomerDataTable, kServerCardCloudTokenDataTable, kOfferDataTable, @@ -2947,7 +3040,7 @@ RemoveAllAutofillProfiles(AutofillProfile::Source::kLocalOrSyncable); bool changed = db_->GetLastChangeCount() > 0; - ClearCreditCards(); + ClearLocalPaymentMethodsData(); changed |= db_->GetLastChangeCount() > 0; transaction.Commit(); @@ -3071,9 +3164,10 @@ return true; } -void AutofillTable::ClearCreditCards() { +void AutofillTable::ClearLocalPaymentMethodsData() { Delete(db_, kLocalStoredCvcTable); Delete(db_, kCreditCardsTable); + Delete(db_, kLocalIbansTable); } bool AutofillTable::GetAllSyncMetadata(syncer::ModelType model_type, @@ -3810,7 +3904,7 @@ masked_insert.BindString(index++, card.card_art_url().spec()); masked_insert.BindString16(index++, card.product_description()); masked_insert.Run(); - masked_insert.Reset(true); + masked_insert.Reset(/*clear_bound_vars=*/true); // Save the use count and use date of the card. UpdateServerCardMetadata(card);
diff --git a/components/autofill/core/browser/webdata/autofill_table.h b/components/autofill/core/browser/webdata/autofill_table.h index 67bd6be5..b4a9ba7 100644 --- a/components/autofill/core/browser/webdata/autofill_table.h +++ b/components/autofill/core/browser/webdata/autofill_table.h
@@ -773,8 +773,8 @@ // Get all server cvcs from `server_stored_cvc` table. std::vector<std::unique_ptr<ServerCvc>> GetAllServerCvcs() const; - // Methods to add, update, remove and get the metadata for server cards and - // addresses. + // Methods to add, update, remove and get the metadata for server cards, + // addresses, and IBANs. Return true if the operations succeeded. bool AddServerCardMetadata(const AutofillMetadata& card_metadata); bool UpdateServerCardMetadata(const CreditCard& credit_card); bool UpdateServerCardMetadata(const AutofillMetadata& card_metadata); @@ -787,6 +787,9 @@ bool RemoveServerAddressMetadata(const std::string& id); bool GetServerAddressesMetadata( std::map<std::string, AutofillMetadata>* addresses_metadata) const; + bool AddOrUpdateServerIbanMetadata(const Iban& iban); + bool RemoveServerIbanMetadata(const std::string& instrument_id); + std::vector<AutofillMetadata> GetServerIbansMetadata() const; // Methods to add the server cards and addresses data independently from the // metadata. @@ -801,6 +804,11 @@ std::vector<std::unique_ptr<CreditCardCloudTokenData>>* credit_card_cloud_token_data); + // Gets the list of server IBANs from the database. + std::vector<std::unique_ptr<Iban>> GetServerIbans(); + // Overwrite the IBANs in the database with the given `ibans`. + bool SetServerIbans(const std::vector<Iban>& ibans); + // Setters and getters related to the Google Payments customer data. // Passing null to the setter will clear the data. void SetPaymentsCustomerData(const PaymentsCustomerData* customer_data); @@ -861,8 +869,8 @@ bool RemoveOriginURLsModifiedBetween(const base::Time& delete_begin, const base::Time& delete_end); - // Clear all credit cards. - void ClearCreditCards(); + // Clear all local payment methods (credit cards and IBANs). + void ClearLocalPaymentMethodsData(); // Read all the stored metadata for |model_type| and fill |metadata_batch| // with it.
diff --git a/components/autofill/core/browser/webdata/autofill_table_unittest.cc b/components/autofill/core/browser/webdata/autofill_table_unittest.cc index bed398b9..a861be8e 100644 --- a/components/autofill/core/browser/webdata/autofill_table_unittest.cc +++ b/components/autofill/core/browser/webdata/autofill_table_unittest.cc
@@ -1172,6 +1172,23 @@ EXPECT_FALSE(db_iban); } +// Test that masked IBANs can be added and loaded successfully. +TEST_F(AutofillTableTest, MaskedServerIban) { + Iban iban_0 = test::GetServerIban(); + Iban iban_1 = test::GetServerIban2(); + Iban iban_2 = test::GetServerIban3(); + std::vector<Iban> ibans = {iban_0, iban_1, iban_2}; + + EXPECT_TRUE(table_->SetServerIbans(ibans)); + + std::vector<std::unique_ptr<Iban>> masked_server_ibans = + table_->GetServerIbans(); + EXPECT_EQ(3U, masked_server_ibans.size()); + EXPECT_THAT(ibans, UnorderedElementsAre(*masked_server_ibans[0], + *masked_server_ibans[1], + *masked_server_ibans[2])); +} + TEST_F(AutofillTableTest, CreditCard) { base::test::ScopedFeatureList features( features::kAutofillEnableCvcStorageAndFilling); @@ -1297,19 +1314,22 @@ EXPECT_EQ(u"", db_card->cvc()); } -// Tests that verify ClearCreditCards function working as expected. -TEST_F(AutofillTableTest, ClearCreditCards) { +// Tests that verify ClearLocalPaymentMethodsData function working as expected. +TEST_F(AutofillTableTest, ClearLocalPaymentMethodsData) { base::test::ScopedFeatureList features( features::kAutofillEnableCvcStorageAndFilling); CreditCard card = test::WithCvc(test::GetCreditCard()); EXPECT_TRUE(table_->AddCreditCard(card)); std::unique_ptr<CreditCard> db_card = table_->GetCreditCard(card.guid()); EXPECT_EQ(card.cvc(), db_card->cvc()); + Iban iban = test::GetIban(); + EXPECT_TRUE(table_->AddIban(iban)); - // After ClearCreditCards, local_stored_cvc table and credit_cards table - // should be empty. - table_->ClearCreditCards(); + // After calling ClearLocalPaymentMethodsData, the local_stored_cvc, + // credit_cards, and local_ibans tables should be empty. + table_->ClearLocalPaymentMethodsData(); EXPECT_FALSE(table_->GetCreditCard(card.guid())); + EXPECT_FALSE(table_->GetIban(iban.guid())); sql::Statement s(db_->GetSQLConnection()->GetUniqueStatement( "SELECT guid FROM local_stored_cvc WHERE guid=?")); s.BindString(0, card.guid()); @@ -2227,6 +2247,28 @@ EXPECT_EQ(0U, outputs.size()); } +// Test that masked IBAN metadata can be added, retrieved and removed +// successfully. +TEST_F(AutofillTableTest, SetGetRemoveServerIbanMetadata) { + Iban iban = test::GetServerIban(); + // Set the metadata. + iban.set_use_count(50); + iban.set_use_date(AutofillClock::Now()); + EXPECT_TRUE(table_->AddOrUpdateServerIbanMetadata(iban)); + + // Make sure it was added correctly. + std::vector<AutofillMetadata> outputs = table_->GetServerIbansMetadata(); + ASSERT_EQ(1U, outputs.size()); + EXPECT_EQ(iban.GetMetadata(), outputs[0]); + + // Remove the metadata from the table. + EXPECT_TRUE(table_->RemoveServerIbanMetadata(outputs[0].id)); + + // Make sure it was removed correctly. + outputs = table_->GetServerIbansMetadata(); + EXPECT_EQ(0u, outputs.size()); +} + TEST_F(AutofillTableTest, AddUpdateServerAddressMetadata) { // Create and set the metadata. AutofillMetadata input; @@ -2354,6 +2396,32 @@ EXPECT_EQ(0, outputs[0]->Compare(*outputs2[0])); } +// Test that updating masked IBAN metadata won't affect IBAN data. +TEST_F(AutofillTableTest, UpdateServerIbanMetadataDoesNotChangeData) { + std::vector<Iban> inputs = {test::GetServerIban()}; + table_->SetServerIbans(inputs); + + std::vector<std::unique_ptr<Iban>> outputs = table_->GetServerIbans(); + ASSERT_EQ(1U, outputs.size()); + EXPECT_EQ(inputs[0].instrument_id(), outputs[0]->instrument_id()); + + // Update metadata in the IBAN. + outputs[0]->set_use_count(outputs[0]->use_count() + 1); + + EXPECT_TRUE(table_->AddOrUpdateServerIbanMetadata(*outputs[0])); + + // Make sure it was updated correctly. + std::vector<AutofillMetadata> output_metadata = + table_->GetServerIbansMetadata(); + ASSERT_EQ(1U, output_metadata.size()); + EXPECT_EQ(outputs[0]->GetMetadata(), output_metadata[0]); + + // Make sure nothing else got updated. + std::vector<std::unique_ptr<Iban>> outputs2 = table_->GetServerIbans(); + ASSERT_EQ(1U, outputs2.size()); + EXPECT_EQ(0, outputs[0]->Compare(*outputs2[0])); +} + TEST_F(AutofillTableTest, RemoveWrongServerCardMetadata) { // Crete and set some metadata. AutofillMetadata input;
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc index d992d54b..44b0d90 100644 --- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc +++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.cc
@@ -657,6 +657,15 @@ AUTOFILL_IBANS_RESULT, std::move(ibans)); } +std::unique_ptr<WDTypedResult> AutofillWebDataBackendImpl::GetServerIbans( + WebDatabase* db) { + DCHECK(owning_task_runner()->RunsTasksInCurrentSequence()); + std::vector<std::unique_ptr<Iban>> ibans = + AutofillTable::FromWebDatabase(db)->GetServerIbans(); + return std::make_unique<WDResult<std::vector<std::unique_ptr<Iban>>>>( + AUTOFILL_IBANS_RESULT, std::move(ibans)); +} + WebDatabase::State AutofillWebDataBackendImpl::AddIban(const Iban& iban, WebDatabase* db) { DCHECK(owning_task_runner()->RunsTasksInCurrentSequence());
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h index c7dcc37e7..236db85 100644 --- a/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h +++ b/components/autofill/core/browser/webdata/autofill_webdata_backend_impl.h
@@ -187,8 +187,9 @@ std::unique_ptr<WDTypedResult> GetCreditCards(WebDatabase* db); std::unique_ptr<WDTypedResult> GetServerCreditCards(WebDatabase* db); - // Returns a vector of local IBANs from the web database. + // Returns a vector of local/server IBANs from the web database. std::unique_ptr<WDTypedResult> GetIbans(WebDatabase* db); + std::unique_ptr<WDTypedResult> GetServerIbans(WebDatabase* db); // Adds an IBAN to the web database. Valid only for local IBANs. WebDatabase::State AddIban(const Iban& iban, WebDatabase* db);
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.cc b/components/autofill/core/browser/webdata/autofill_webdata_service.cc index b33160f..400edda 100644 --- a/components/autofill/core/browser/webdata/autofill_webdata_service.cc +++ b/components/autofill/core/browser/webdata/autofill_webdata_service.cc
@@ -236,6 +236,15 @@ consumer); } +WebDataServiceBase::Handle AutofillWebDataService::GetServerIbans( + WebDataServiceConsumer* consumer) { + return wdbs_->ScheduleDBTaskWithResult( + FROM_HERE, + base::BindOnce(&AutofillWebDataBackendImpl::GetServerIbans, + autofill_backend_), + consumer); +} + void AutofillWebDataService::UpdateIban(const Iban& iban) { wdbs_->ScheduleDBTask(FROM_HERE, base::BindOnce(&AutofillWebDataBackendImpl::UpdateIban,
diff --git a/components/autofill/core/browser/webdata/autofill_webdata_service.h b/components/autofill/core/browser/webdata/autofill_webdata_service.h index c4bd04b..ca0caff 100644 --- a/components/autofill/core/browser/webdata/autofill_webdata_service.h +++ b/components/autofill/core/browser/webdata/autofill_webdata_service.h
@@ -121,11 +121,12 @@ // Schedules a task to add IBAN to the web database. void AddIban(const Iban& iban); - // Initiates the request for local IBANs. The method + // Initiates the request for local/server IBANs. The method // OnWebDataServiceRequestDone of |consumer| gets called when the request is // finished, with the IBAN included in the argument |result|. The consumer // owns the IBAN. WebDataServiceBase::Handle GetIbans(WebDataServiceConsumer* consumer); + WebDataServiceBase::Handle GetServerIbans(WebDataServiceConsumer* consumer); // Schedules a task to update iban in the web database. void UpdateIban(const Iban& iban);
diff --git a/components/autofill/core/common/field_data_manager_unittest.cc b/components/autofill/core/common/field_data_manager_unittest.cc index 0e7f296..8b0d960 100644 --- a/components/autofill/core/common/field_data_manager_unittest.cc +++ b/components/autofill/core/common/field_data_manager_unittest.cc
@@ -20,13 +20,13 @@ FormFieldData field1; field1.id_attribute = u"name1"; field1.value = u"first"; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; field1.unique_renderer_id = FieldRendererId(1); control_elements_.push_back(field1); FormFieldData field2; field2.id_attribute = u"name2"; - field2.form_control_type = StringToFormControlType("password"); + field2.form_control_type = FormControlType::kInputPassword; field2.unique_renderer_id = FieldRendererId(2); control_elements_.push_back(field2); }
diff --git a/components/autofill/core/common/form_data_unittest.cc b/components/autofill/core/common/form_data_unittest.cc index 96714fd2..cbd535315 100644 --- a/components/autofill/core/common/form_data_unittest.cc +++ b/components/autofill/core/common/form_data_unittest.cc
@@ -141,7 +141,7 @@ field_data.label = u"label"; field_data.name = u"name"; field_data.value = u"value"; - field_data.form_control_type = StringToFormControlType("password"); + field_data.form_control_type = FormControlType::kInputPassword; field_data.autocomplete_attribute = "off"; field_data.max_length = 200; field_data.is_autofilled = true;
diff --git a/components/autofill/core/common/form_field_data.cc b/components/autofill/core/common/form_field_data.cc index b779dc3..4f6e24b 100644 --- a/components/autofill/core/common/form_field_data.cc +++ b/components/autofill/core/common/form_field_data.cc
@@ -352,25 +352,25 @@ } bool FormFieldData::IsTextInputElement() const { - return form_control_type == StringToFormControlType("text") || - form_control_type == StringToFormControlType("password") || - form_control_type == StringToFormControlType("search") || - form_control_type == StringToFormControlType("tel") || - form_control_type == StringToFormControlType("url") || - form_control_type == StringToFormControlType("email") || - form_control_type == StringToFormControlType("number"); + return form_control_type == FormControlType::kInputText || + form_control_type == FormControlType::kInputPassword || + form_control_type == FormControlType::kInputSearch || + form_control_type == FormControlType::kInputTelephone || + form_control_type == FormControlType::kInputUrl || + form_control_type == FormControlType::kInputEmail || + form_control_type == FormControlType::kInputNumber; } bool FormFieldData::IsPasswordInputElement() const { - return form_control_type == StringToFormControlType("password"); + return form_control_type == FormControlType::kInputPassword; } bool FormFieldData::IsSelectElement() const { - return form_control_type == StringToFormControlType("select-one"); + return form_control_type == FormControlType::kSelectOne; } bool FormFieldData::IsSelectListElement() const { - return form_control_type == StringToFormControlType("selectlist"); + return form_control_type == FormControlType::kSelectList; } bool FormFieldData::IsSelectOrSelectListElement() const {
diff --git a/components/autofill/core/common/form_field_data_unittest.cc b/components/autofill/core/common/form_field_data_unittest.cc index 91b8a6f..0ac8b71 100644 --- a/components/autofill/core/common/form_field_data_unittest.cc +++ b/components/autofill/core/common/form_field_data_unittest.cc
@@ -18,7 +18,7 @@ data->label = u"label"; data->name = u"name"; data->value = u"value"; - data->form_control_type = StringToFormControlType("password"); + data->form_control_type = FormControlType::kInputPassword; data->autocomplete_attribute = "off"; data->max_length = 200; data->is_autofilled = true;
diff --git a/components/autofill/core/common/html_field_types.cc b/components/autofill/core/common/html_field_types.cc index ffc9395..1dc7641 100644 --- a/components/autofill/core/common/html_field_types.cc +++ b/components/autofill/core/common/html_field_types.cc
@@ -44,8 +44,6 @@ return "HTML_TYPE_COUNTRY_NAME"; case HtmlFieldType::kPostalCode: return "HTML_TYPE_POSTAL_CODE"; - case HtmlFieldType::kFullAddress: - return "HTML_TYPE_FULL_ADDRESS"; case HtmlFieldType::kCreditCardNameFull: return "HTML_TYPE_CREDIT_CARD_NAME_FULL"; case HtmlFieldType::kCreditCardNameFirst:
diff --git a/components/autofill/core/common/mojom/autofill_types.mojom b/components/autofill/core/common/mojom/autofill_types.mojom index 1fbfb47..a291b08b 100644 --- a/components/autofill/core/common/mojom/autofill_types.mojom +++ b/components/autofill/core/common/mojom/autofill_types.mojom
@@ -71,7 +71,7 @@ kCountryCode = 14, // The ISO 3166-1-alpha-2 country code. kCountryName = 15, // The localized country name. kPostalCode = 16, - kFullAddress = 17, // The complete address, formatted for display. + // kFullAddress = 17 is deprecated. // Credit card types. kCreditCardNameFull = 18,
diff --git a/components/autofill/core/common/signatures_unittest.cc b/components/autofill/core/common/signatures_unittest.cc index cb1e3e0..a73c40f 100644 --- a/components/autofill/core/common/signatures_unittest.cc +++ b/components/autofill/core/common/signatures_unittest.cc
@@ -16,12 +16,12 @@ actual_form.name = u"form_name_12345"; FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; field1.name = u"field_name_12345"; actual_form.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; field2.name = u"field_name_1234"; actual_form.fields.push_back(field2); @@ -42,19 +42,19 @@ large_form.url = GURL("http://foo.com/login?q=a#ref"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; large_form.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; large_form.fields.push_back(field2); FormFieldData field3; - field3.form_control_type = StringToFormControlType("email"); + field3.form_control_type = FormControlType::kInputEmail; large_form.fields.push_back(field3); FormFieldData field4; - field4.form_control_type = StringToFormControlType("tel"); + field4.form_control_type = FormControlType::kInputTelephone; large_form.fields.push_back(field4); // Alternative form signature string of a form with more than two fields @@ -68,11 +68,11 @@ small_form_path.url = GURL("http://foo.com/login?q=a#ref"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; small_form_path.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; small_form_path.fields.push_back(field2); // Alternative form signature string of a form with 2 fields or less should @@ -86,11 +86,11 @@ small_form_ref.url = GURL("http://foo.com?q=a#ref"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; small_form_ref.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; small_form_ref.fields.push_back(field2); // Alternative form signature string of a form with 2 fields or less and @@ -105,11 +105,11 @@ small_form_query.url = GURL("http://foo.com?q=a"); FormFieldData field1; - field1.form_control_type = StringToFormControlType("text"); + field1.form_control_type = FormControlType::kInputText; small_form_query.fields.push_back(field1); FormFieldData field2; - field2.form_control_type = StringToFormControlType("text"); + field2.form_control_type = FormControlType::kInputText; small_form_query.fields.push_back(field2); // Alternative form signature string of a form with 2 fields or less and
diff --git a/components/autofill/ios/browser/autofill_agent_unittests.mm b/components/autofill/ios/browser/autofill_agent_unittests.mm index 9174130..d743fc8 100644 --- a/components/autofill/ios/browser/autofill_agent_unittests.mm +++ b/components/autofill/ios/browser/autofill_agent_unittests.mm
@@ -138,7 +138,7 @@ form.unique_renderer_id = FormRendererId(1); autofill::FormFieldData field; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.label = u"Card number"; field.name = u"number"; field.name_attribute = field.name;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java index ab464356..1bfbb29 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java
@@ -104,7 +104,6 @@ public void onBindViewHolder(PreferenceViewHolder holder) { super.onBindViewHolder(holder); TextView titleView = (TextView) holder.findViewById(android.R.id.title); - titleView.setAllCaps(true); titleView.setTextColor(mPrefAccentColor); }
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb index 5a727400..69f2336 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_af.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tik om na <ph name="URL_OF_THE_CURRENT_TAB" /> terug te keer</translation> <translation id="2079545284768500474">Ontdoen</translation> <translation id="2091887806945687916">Klank</translation> +<translation id="2096716221239095980">Vee alle data uit</translation> <translation id="2117655453726830283">Volgende skyfie</translation> <translation id="2148716181193084225">Vandag</translation> <translation id="216989819110952009">Selfs met die groen brille wat hul oë beskerm het, was Dorothy en haar vriende in die begin verblind deur die</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Laat werwe toe om webkoekiedata te stoor en te lees (aanbeveel)</translation> <translation id="2932883381142163287">Gee misbruik aan</translation> <translation id="2968755619301702150">Sertifikaatbekyker</translation> -<translation id="300526633675317032">Dit sal al <ph name="SIZE_IN_KB" /> se webwerfberging uitvee.</translation> <translation id="3008272652534848354">Stel toestemmings terug</translation> <translation id="301521992641321250">Outomaties geblokkeer</translation> <translation id="3069226013421428034">Laat aanmelding deur derde partye vir ’n spesifieke werf toe.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Toegelaat</translation> <translation id="429312253194641664">'n Werf speel tans media</translation> <translation id="42981349822642051">Vou uit</translation> -<translation id="4336434711095810371">Vee alle data uit</translation> <translation id="4338831206024587507">Alle werwe onder <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Keer dat werwe weet wanneer jy hierdie toestel aktief gebruik</translation> <translation id="4412992751769744546">Laat derdeparty-webkoekies toe</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Deel tans jou skerm</translation> <translation id="5922967540311291836">Blokkeer derdepartywebkoekies:</translation> <translation id="5939518447894949180">Stel terug</translation> +<translation id="5964247741333118902">Ingebedde inhoud</translation> <translation id="5968921426641056619">Voer webadres in</translation> <translation id="5975083100439434680">Zoem uit</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Herlaai</translation> <translation id="7188508872042490670">Werfdata op toestel</translation> <translation id="7203150201908454328">Uitgevou</translation> +<translation id="7219254577985949841">Vee werfdata uit?</translation> <translation id="723171743924126238">Kies prente</translation> <translation id="7243308994586599757">Opsies is naby die onderkant van die skerm beskikbaar</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> gekies</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_am.xtb index b4de5d3d..8f15210 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">ወደ <ph name="URL_OF_THE_CURRENT_TAB" /> ለመመለስ መታ ያድርጉ</translation> <translation id="2079545284768500474">ቀልብስ</translation> <translation id="2091887806945687916">ድምፅ</translation> +<translation id="2096716221239095980">ሁሉንም ውሂብ ሰርዝ</translation> <translation id="2117655453726830283">ቀጣይ ተንሸራታች</translation> <translation id="2148716181193084225">ዛሬ</translation> <translation id="216989819110952009">ዓይኖች በአረንጓዴ መነጽሮች ቢጠበቁም ዶሮቲ እና ጓደኞቿ በመጀመሪያ ላይ ፈዘው ነበር በ</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">ጣቢያዎች የኩኪ ውሂብ እንዲያስቀምጡ እና እንዲያነቡ ይፍቀዱ (የሚመከር)</translation> <translation id="2932883381142163287">የአላግባብ መጠቀምን ሪፖርት ያድርጉ</translation> <translation id="2968755619301702150">የእውቅና ማረጋገጫ መመልከቻ</translation> -<translation id="300526633675317032">ይህ ሁሉንም <ph name="SIZE_IN_KB" /> የድር ጣቢያ ማከማቻ ያጸዳል።</translation> <translation id="3008272652534848354">ፈቃዶችን ዳግም ያቀናብሩ</translation> <translation id="301521992641321250">በራስ-ሰር ታግዷል</translation> <translation id="3069226013421428034">ለአንድ የተወሰነ ጣቢያ የሦስተኛ ወገን መግባትን ይፍቀዱ።</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ተፈቅዷል</translation> <translation id="429312253194641664">አንድ ጣቢያ ሚዲያን በማጫወት ላይ ነው</translation> <translation id="42981349822642051">ዘርጋ</translation> -<translation id="4336434711095810371">ሁሉንም ውሂብ አጽዳ</translation> <translation id="4338831206024587507">በ<ph name="DOMAIN" /> ስር ያሉ ሁሉም ጣቢያዎች</translation> <translation id="4402755511846832236">እርስዎ ይህን መሣሪያ በንቃት ሲጠቀሙ ጣቢያዎች እንዳያውቁ ያግዱ</translation> <translation id="4412992751769744546">የሶስተኛ ወገን ኩኪዎችን ፍቀድ</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">ማያ ገጽዎን በማጋራት ላይ</translation> <translation id="5922967540311291836">የሶስተኛ ወገን ኩኪዎችን ያግዱ፦</translation> <translation id="5939518447894949180">ዳግም አስጀምር</translation> +<translation id="5964247741333118902">የተከተተ ይዘት</translation> <translation id="5968921426641056619">የድር አድራሻን ያስገቡ</translation> <translation id="5975083100439434680">አሳንስ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />፣ <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">አድስ</translation> <translation id="7188508872042490670">በመሣሪያ ላይ ያለ የጣቢያ ውሂብ</translation> <translation id="7203150201908454328">ተዘርግቷል</translation> +<translation id="7219254577985949841">የጣቢያ ውሂብ ይሰረዝ?</translation> <translation id="723171743924126238">ምስሎችን ይምረጡ</translation> <translation id="7243308994586599757">አማራጮች ከማያ ገጹ ግርጌ አጠገብ ይገኛሉ</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ተመርጠዋል</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 5b279728..6e3afa85 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">يُرجى النقر للرجوع إلى <ph name="URL_OF_THE_CURRENT_TAB" />.</translation> <translation id="2079545284768500474">تراجع</translation> <translation id="2091887806945687916">الصوت</translation> +<translation id="2096716221239095980">حذف كل البيانات</translation> <translation id="2117655453726830283">الشريحة التالية</translation> <translation id="2148716181193084225">اليوم</translation> <translation id="216989819110952009">على الرغم من احتماء "دورثي" ورفاقها خلف نظارات خضراء، انبهرت عيونهم للوهلة الأولى بسبب</translation> @@ -116,7 +117,6 @@ <translation id="2913331724188855103">ألسماح للمواقع الإلكترونية بحفظ بيانات ملفات تعريف الارتباط وقراءتها (يُنصح به)</translation> <translation id="2932883381142163287">الإبلاغ عن إساءة الاستخدام</translation> <translation id="2968755619301702150">عارض الشهادات</translation> -<translation id="300526633675317032">سيؤدي هذا إلى محو مساحة التخزين البالغة <ph name="SIZE_IN_KB" /> بأكملها من مساحة تخزين المواقع الإلكترونية.</translation> <translation id="3008272652534848354">إعادة ضبط الأذونات</translation> <translation id="301521992641321250">تم الحظر تلقائيًا</translation> <translation id="3069226013421428034">يمكنك السماح بتسجيل الدخول في الخدمات التابعة لجهات خارجية في موقع إلكتروني محدَّد.</translation> @@ -193,7 +193,6 @@ <translation id="4278390842282768270">مسموح به</translation> <translation id="429312253194641664">تفعيل موقع إلكتروني للوسائط</translation> <translation id="42981349822642051">توسيع</translation> -<translation id="4336434711095810371">محو جميع البيانات</translation> <translation id="4338831206024587507">جميع المواقع الإلكترونية ضمن <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">منع المواقع الإلكترونية من رصد استخدامك النشط لهذا الجهاز</translation> <translation id="4412992751769744546">السماح بملفات تعريف الارتباط التابعة لجهات خارجية</translation> @@ -284,6 +283,7 @@ <translation id="5922853908706496913">جارٍ مشاركة شاشتك</translation> <translation id="5922967540311291836">حظر ملفات تعريف الارتباط التابعة لجهات خارجية:</translation> <translation id="5939518447894949180">إعادة الضبط</translation> +<translation id="5964247741333118902">المحتوى المضمَّن</translation> <translation id="5968921426641056619">أدخِل عنوان الويب.</translation> <translation id="5975083100439434680">تصغير</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -352,6 +352,7 @@ <translation id="7180611975245234373">إعادة التحميل</translation> <translation id="7188508872042490670">بيانات المواقع الإلكترونية على الجهاز فقط</translation> <translation id="7203150201908454328">موسع</translation> +<translation id="7219254577985949841">هل تريد حذف بيانات الموقع الإلكتروني؟</translation> <translation id="723171743924126238">اختيار الصور</translation> <translation id="7243308994586599757">الخيارات المتاحة بالقرب من الجزء السفلي من الشاشة</translation> <translation id="7250468141469952378">تم اختيار <ph name="ITEM_COUNT" /> عنصراً</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb index e3d93d9..518c8b8 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_as.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" />লৈ উভতি যাবলৈ টিপক</translation> <translation id="2079545284768500474">আনডু কৰক</translation> <translation id="2091887806945687916">শব্দ</translation> +<translation id="2096716221239095980">আটাইবোৰ ডেটা মচক</translation> <translation id="2117655453726830283">পৰৱৰ্তী শ্লাইড</translation> <translation id="2148716181193084225">আজি</translation> <translation id="216989819110952009">ডৰথী আৰু তাইৰ বন্ধুবৰ্গয়ে সেউজীয়া চশমাৰ দ্বাৰা সুৰক্ষিত চকুৰেও প্ৰথমে চমৎকাৰ হৈ পৰিছিল</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">ছাইটসমূহক কুকি ডেটা ছেভ কৰিবলৈ আৰু পঢ়িবলৈ অনুমতি দিয়ক (আমি চুপাৰিছ কৰোঁ)</translation> <translation id="2932883381142163287">দুৰ্ব্যৱহাৰৰ অভিযোগ দিয়ক</translation> <translation id="2968755619301702150">প্ৰমাণপত্ৰ ভিউৱাৰ</translation> -<translation id="300526633675317032">এইটোৱে ৱেবছাইটৰ ষ্ট’ৰেজৰ সম্পূৰ্ণ <ph name="SIZE_IN_KB" /> মচি পেলাব।</translation> <translation id="3008272652534848354">অনুমতি ৰিছেট কৰক</translation> <translation id="301521992641321250">স্বয়ংক্ৰিয়ভাৱে অৱৰোধ কৰা হৈছে</translation> <translation id="3069226013421428034">নিৰ্দিষ্ট কোনো ছাইটৰ বাবে তৃতীয় পক্ষৰ ছাইন ইনৰ অনুমতি দিয়ক।</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">অনুমতি দিয়া হৈছে</translation> <translation id="429312253194641664">ছাইটটোৱে মিডিয়া প্লে’ কৰি আছে</translation> <translation id="42981349822642051">বিস্তাৰ কৰক</translation> -<translation id="4336434711095810371">সকলো ডেটা মচক</translation> <translation id="4338831206024587507"><ph name="DOMAIN" />ৰ অধীনত থকা আটাইবোৰ ছাইট</translation> <translation id="4402755511846832236">আপুনি এই ডিভাইচটো সক্ৰিয়ভাৱে ব্যৱহাৰ কৰি থকাৰ বিষয়ে ছাইটসমূহে জনাটো অৱৰোধ কৰক</translation> <translation id="4412992751769744546">তৃতীয় পক্ষৰ কুকিৰ অনুমতি দিয়ক</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">আপোনাৰ স্ক্ৰীন শ্বেয়াৰ কৰি থকা হৈছে</translation> <translation id="5922967540311291836">তৃতীয় পক্ষৰ কুকি অৱৰোধ কৰক:</translation> <translation id="5939518447894949180">ৰিছেট কৰক</translation> +<translation id="5964247741333118902">এম্বেড কৰা সমল</translation> <translation id="5968921426641056619">ৱেবৰ ঠিকনা দিয়ক</translation> <translation id="5975083100439434680">জুম আউট কৰক</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ৰিফ্ৰেশ্ব কৰক</translation> <translation id="7188508872042490670">ডিভাইচত থকা ছাইটৰ ডেটা</translation> <translation id="7203150201908454328">বিস্তাৰিত</translation> +<translation id="7219254577985949841">ছাইটৰ ডেটা মচিবনে?</translation> <translation id="723171743924126238">ছবি বাছনি কৰক</translation> <translation id="7243308994586599757">স্ক্ৰীনৰ কাষৰ বুটামত উপলব্ধ বিকল্প</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />টা বাছনি কৰা হৈছে</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb index 751574a..a2f61cc2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_az.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> bölməsinə qayıtmaq üçün toxunun</translation> <translation id="2079545284768500474">Geri qaytarın</translation> <translation id="2091887806945687916">Səs</translation> +<translation id="2096716221239095980">Bütün datanı silin</translation> <translation id="2117655453726830283">Növbəti slayd</translation> <translation id="2148716181193084225">Bu gün</translation> <translation id="216989819110952009">Doroti və dostları gözlərini yaşıl eynəklə qoruduğu halda, əvvəlcə gözləri qamaşdı</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Saytlara kuki datanı saxlamağa və oxumağa imkan verir (tövsiyə olunur)</translation> <translation id="2932883381142163287">Sui-istifadəni xəbər verin</translation> <translation id="2968755619301702150">Sertifikat izləyici</translation> -<translation id="300526633675317032">Bu, veb sayt yaddaşının <ph name="SIZE_IN_KB" /> hissəsini siləcək</translation> <translation id="3008272652534848354">İcazələri sıfırlayın</translation> <translation id="301521992641321250">Avtomatik olaraq blok edildi</translation> <translation id="3069226013421428034">Müəyyən bir sayt üçün üçüncü tərəfin girişinə icazə verin.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">İcazə verilib</translation> <translation id="429312253194641664">Sayt media oxudur</translation> <translation id="42981349822642051">Genişləndirin</translation> -<translation id="4336434711095810371">Bütün datanı silin</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> domenindəki bütün saytlar</translation> <translation id="4402755511846832236">Saytların bu cihazdan nə zaman aktiv şəkildə istifadə etdiyinizi bilməsini bloklayın</translation> <translation id="4412992751769744546">Üçüncü tərəf kukilərinə icazə verin</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Ekranınız paylaşılır</translation> <translation id="5922967540311291836">Üçüncü tərəf kukiləri bloklayın:</translation> <translation id="5939518447894949180">Sıfırlayın</translation> +<translation id="5964247741333118902">Daxil edilmiş kontent</translation> <translation id="5968921426641056619">Veb ünvanını daxil edin</translation> <translation id="5975083100439434680">Kiçildin</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />-<ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Yeniləyin</translation> <translation id="7188508872042490670">Cihazda olan sayt məlumatları</translation> <translation id="7203150201908454328">Genişləndirilmiş</translation> +<translation id="7219254577985949841">Sayt datası silinsin?</translation> <translation id="723171743924126238">Şəkil seçin</translation> <translation id="7243308994586599757">Seçənəklər ekranın aşağısına yaxın yerdə əlçatandır</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> seçildi</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 451f71db..72139cc5 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Націсніце, каб вярнуцца на ўкладку <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Адрабіць</translation> <translation id="2091887806945687916">Гук</translation> +<translation id="2096716221239095980">Выдаліць усе даныя</translation> <translation id="2117655453726830283">Наступны слайд</translation> <translation id="2148716181193084225">Сёння</translation> <translation id="216989819110952009">Нават надзеўшы зялёныя акуляры, Дораці і яе сябры былі ашаломленыя</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Дазволіць сайтам захоўваць і чытаць даныя файлаў cookie (рэкамендуецца)</translation> <translation id="2932883381142163287">Паскардзіцца на парушэнне</translation> <translation id="2968755619301702150">Звесткі пра сертыфікат</translation> -<translation id="300526633675317032">Гэта вызваліць <ph name="SIZE_IN_KB" /> у сховішчы вэб-сайтаў.</translation> <translation id="3008272652534848354">Скінуць дазволы</translation> <translation id="301521992641321250">Заблакіравана аўтаматычна</translation> <translation id="3069226013421428034">Дазволіць уваход праз староннія сэрвісы для канкрэтнага сайта.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Дазволена</translation> <translation id="429312253194641664">Сайт прайграе мультымедыя</translation> <translation id="42981349822642051">Разгарнуць</translation> -<translation id="4336434711095810371">Выдаліць усе даныя</translation> <translation id="4338831206024587507">Усе сайты дамена <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Не даваць сайтам знаць, калі вы карыстаецеся гэтай прыладай</translation> <translation id="4412992751769744546">Дазволіць староннія файлы cookie</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Ваш экран абагульваецца</translation> <translation id="5922967540311291836">Блакіраваць староннія файлы cookie:</translation> <translation id="5939518447894949180">Скінуць</translation> +<translation id="5964247741333118902">Убудаванае змесціва</translation> <translation id="5968921426641056619">Увядзіце вэб-адрас</translation> <translation id="5975083100439434680">Паменшыць</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Абнавіць</translation> <translation id="7188508872042490670">Даныя сайтаў, захаваныя на прыладзе</translation> <translation id="7203150201908454328">Разгорнута</translation> +<translation id="7219254577985949841">Выдаліць гэтыя даныя?</translation> <translation id="723171743924126238">Выберыце відарысы</translation> <translation id="7243308994586599757">Параметры знаходзяцца ў ніжняй частцы экрана</translation> <translation id="7250468141469952378">Выбрана: <ph name="ITEM_COUNT" /></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 2232643..41254a9 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Докоснете, за да се върнете към <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Отмяна</translation> <translation id="2091887806945687916">Звук</translation> +<translation id="2096716221239095980">Изтриване на всички данни</translation> <translation id="2117655453726830283">Следващият слайд</translation> <translation id="2148716181193084225">днес</translation> <translation id="216989819110952009">Макар зелените очила да предпазваха очите им, отначало Дороти и приятелите ѝ бяха заслепени от</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Разрешаване на сайтовете да запазват „бисквитки“ и да четат данни от такива (препоръчително)</translation> <translation id="2932883381142163287">Подаване на сигнал за злоупотреба</translation> <translation id="2968755619301702150">Визуализатор на сертификатите</translation> -<translation id="300526633675317032">Така ще се изчистят всички съхранявани данни от уебсайтове (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Нулиране на разрешенията</translation> <translation id="301521992641321250">Автоматично блокирано</translation> <translation id="3069226013421428034">Разрешаване на влизането с профили от трети страни за конкретен сайт.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Разрешено</translation> <translation id="429312253194641664">Сайт възпроизвежда мултимедийно съдържание</translation> <translation id="42981349822642051">Разгъване</translation> -<translation id="4336434711095810371">Изчистване на всички данни</translation> <translation id="4338831206024587507">Всички сайтове от <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Блокиране на сайтовете, така че да не знаят дали това устройство се използва активно</translation> <translation id="4412992751769744546">Разрешаване на „бисквитките“ на трети страни</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Екранът ви се споделя</translation> <translation id="5922967540311291836">Блокиране на „бисквитките“ на трети страни:</translation> <translation id="5939518447894949180">Нулиране</translation> +<translation id="5964247741333118902">Вградено съдържание</translation> <translation id="5968921426641056619">Въведете уеб адрес</translation> <translation id="5975083100439434680">Намаляване на мащаба</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Опресняване</translation> <translation id="7188508872042490670">Локални данни за сайтовете</translation> <translation id="7203150201908454328">Разгънато</translation> +<translation id="7219254577985949841">Да се изтрият ли данните за сайтовете?</translation> <translation id="723171743924126238">Избиране на изображения</translation> <translation id="7243308994586599757">Опциите са в долната част на екрана</translation> <translation id="7250468141469952378">Избрани: <ph name="ITEM_COUNT" /></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 93b3cc1..dc6cbda 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" />-এ ফিরে যেতে ট্যাপ করুন</translation> <translation id="2079545284768500474">আগের অবস্থায় ফিরুন</translation> <translation id="2091887806945687916">আওয়াজ</translation> +<translation id="2096716221239095980">সব ডেটা মুছুন</translation> <translation id="2117655453726830283">পরবর্তী স্লাইড</translation> <translation id="2148716181193084225">আজ</translation> <translation id="216989819110952009">চোখে সবুজ চশমা লাগানো থাকলেও, ডরোথি ও তার বন্ধুরা অপূর্ব এই শহরের প্রথম চমক দেখেই অবাক হয়ে গেছিল</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">সাইটগুলিকে কুকি ডেটা পড়ার এবং সংরক্ষণ করার অনুমতি দিন (প্রস্তাবিত)</translation> <translation id="2932883381142163287">আপত্তিজনক হিসাবে অভিযোগ করুন</translation> <translation id="2968755619301702150">সার্টিফিকেট প্রদর্শনকারী</translation> -<translation id="300526633675317032">এটা ওয়েবসাইট স্টোরেজের <ph name="SIZE_IN_KB" />-এর পুরোটা সাফ করবে।</translation> <translation id="3008272652534848354">অনুমতি রিসেট করুন</translation> <translation id="301521992641321250">স্বয়ংক্রিয়ভাবে ব্লক করা হয়েছে</translation> <translation id="3069226013421428034">কোনও নির্দিষ্ট সাইটের জন্য থার্ড-পার্টি সাইন-ইনের অনুমতি দিন।</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">মঞ্জুরিপ্রাপ্ত</translation> <translation id="429312253194641664">একটি সাইট মিডিয়া চালাচ্ছে</translation> <translation id="42981349822642051">প্রসারিত করুন</translation> -<translation id="4336434711095810371">সব ডেটা মুছে ফেলুন</translation> <translation id="4338831206024587507"><ph name="DOMAIN" />-এর সবকটি সাইট</translation> <translation id="4402755511846832236">আপনি ডিভাইস কখন সক্রিয়ভাবে ব্যবহার করছেন, সাইট যাতে জানতে না পারে তার জন্য সাইট ব্লক করুন</translation> <translation id="4412992751769744546">তৃতীয় পক্ষের কুকিজ মঞ্জুর করুন</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">আপনার স্ক্রিন শেয়ার করা হচ্ছে</translation> <translation id="5922967540311291836">থার্ড-পার্টি কুকি ব্লক করুন:</translation> <translation id="5939518447894949180">রিসেট করুন</translation> +<translation id="5964247741333118902">এম্বেড করা কন্টেন্ট</translation> <translation id="5968921426641056619">ওয়েব ঠিকানা লিখুন</translation> <translation id="5975083100439434680">ছোট করুন</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">রিফ্রেশ করুন</translation> <translation id="7188508872042490670">অন-ডিভাইস সাইট ডেটা</translation> <translation id="7203150201908454328">প্রসারিত</translation> +<translation id="7219254577985949841">সাইট ডেটা মুছবেন?</translation> <translation id="723171743924126238">ছবি বেছে নিন</translation> <translation id="7243308994586599757">স্ক্রীনের প্রায় নীচের দিকে বিকল্পগুলি উপলব্ধ</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />টি বেছে নেওয়া হয়েছে</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 812f7c4..6b82afe 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Dodirnite da se vratite na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Vrati</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="2096716221239095980">Izbriši sve podatke</translation> <translation id="2117655453726830283">Sljedeći slajd</translation> <translation id="2148716181193084225">Danas</translation> <translation id="216989819110952009">Čak i s očima zaštićenim zelenim naočalama, Dorothy i njene prijateljice su isprva bile zaslijepljene</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Omogućite web lokacijama da sačuvaju i čitaju podatke o kolačićima (preporučeno)</translation> <translation id="2932883381142163287">Prijavite zloupotrebu</translation> <translation id="2968755619301702150">Preglednik certifikata</translation> -<translation id="300526633675317032">Ovim će se izbrisati svih <ph name="SIZE_IN_KB" /> web pohrane.</translation> <translation id="3008272652534848354">Poništi odobrenja</translation> <translation id="301521992641321250">Automatski blokirano</translation> <translation id="3069226013421428034">Dozvolite prijavu trećih stana za određenu web lokaciju.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Dozvoljeno</translation> <translation id="429312253194641664">Web lokacija reproducira medij</translation> <translation id="42981349822642051">Proširi</translation> -<translation id="4336434711095810371">Obriši sve podatke</translation> <translation id="4338831206024587507">Sve web lokacije pod domenom <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Blokirajte web lokacijama informacije o vašem aktivnom korištenju ovog uređaja</translation> <translation id="4412992751769744546">Dopusti kolačiće trećih strana</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Dijeljenje ekrana</translation> <translation id="5922967540311291836">Blokirajte kolačiće treće strane:</translation> <translation id="5939518447894949180">Vrati na zadano</translation> +<translation id="5964247741333118902">Ugrađeni sadržaj</translation> <translation id="5968921426641056619">Unesite web adresu</translation> <translation id="5975083100439434680">Umanjivanje</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Osvježi</translation> <translation id="7188508872042490670">Podaci web lokacije na uređaju</translation> <translation id="7203150201908454328">Prošireno</translation> +<translation id="7219254577985949841">Izbrisati podatke web lokacije?</translation> <translation id="723171743924126238">Odaberi slike</translation> <translation id="7243308994586599757">Opcije su dostupne pri dnu ekrana</translation> <translation id="7250468141469952378">Odabrano <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb index ae27d7e..5aef4bb 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ca.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Toca per tornar a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Desfés</translation> <translation id="2091887806945687916">So</translation> +<translation id="2096716221239095980">Suprimeix totes les dades</translation> <translation id="2117655453726830283">Diapositiva següent</translation> <translation id="2148716181193084225">Avui</translation> <translation id="216989819110952009">Fins i tot amb els ulls protegits per les ulleres verdes, la Dorothy i els seus amics van quedar enlluernats per la</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permet que els llocs web desin i llegeixin les dades de les galetes (opció recomanada)</translation> <translation id="2932883381142163287">Informa d'un ús abusiu</translation> <translation id="2968755619301702150">Lector de certificats</translation> -<translation id="300526633675317032">Amb aquesta acció s'esborraran <ph name="SIZE_IN_KB" /> d'emmagatzematge del lloc web.</translation> <translation id="3008272652534848354">Restableix els permisos</translation> <translation id="301521992641321250">Bloquejada automàticament</translation> <translation id="3069226013421428034">Permet l'inici de sessió de tercers en un lloc web concret.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Permès</translation> <translation id="429312253194641664">Un lloc web està reproduint contingut multimèdia</translation> <translation id="42981349822642051">Desplega</translation> -<translation id="4336434711095810371">Esborra totes les dades</translation> <translation id="4338831206024587507">Tots els llocs web de <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Bloqueja els llocs web perquè no sàpiguen quan estàs utilitzant aquest dispositiu de manera activa</translation> <translation id="4412992751769744546">Permet les galetes de tercers</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">S'està compartint la pantalla</translation> <translation id="5922967540311291836">Bloqueja les galetes de tercers:</translation> <translation id="5939518447894949180">Restableix</translation> +<translation id="5964247741333118902">Contingut inserit</translation> <translation id="5968921426641056619">Introdueix l'adreça web</translation> <translation id="5975083100439434680">Redueix</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualitza</translation> <translation id="7188508872042490670">Dades dels llocs web al dispositiu</translation> <translation id="7203150201908454328">Ampliat</translation> +<translation id="7219254577985949841">Vols suprimir les dades del lloc web?</translation> <translation id="723171743924126238">Selecciona imatges</translation> <translation id="7243308994586599757">Opcions disponibles a la part inferior de la pantalla</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elements seleccionats</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 15f7370..c915bb21 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Klepnutím se vrátíte na web <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Vrátit zpět</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="2096716221239095980">Vymazat všechna data</translation> <translation id="2117655453726830283">Další snímek</translation> <translation id="2148716181193084225">Dnes</translation> <translation id="216989819110952009">I přestože měli oči chráněné zelenými brýlemi, Dorotka a její přátelé byli oslněni</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Povolit webům ukládat a číst data souborů cookie (doporučeno)</translation> <translation id="2932883381142163287">Nahlásit zneužití</translation> <translation id="2968755619301702150">Prohlížeč certifikátů</translation> -<translation id="300526633675317032">Tímto vymažete celé úložiště webů (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Resetovat oprávnění</translation> <translation id="301521992641321250">Automaticky blokováno</translation> <translation id="3069226013421428034">Povolení přihlášení třetích stran na konkrétní web.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Povoleno</translation> <translation id="429312253194641664">Web přehrává média</translation> <translation id="42981349822642051">Rozbalit</translation> -<translation id="4336434711095810371">Vymazat všechna data</translation> <translation id="4338831206024587507">Všechny weby v doméně <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Nedovolit webům zjistit, kdy aktivně používáte toto zařízení</translation> <translation id="4412992751769744546">Povolit cookies třetích stran</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Sdílíte obrazovku</translation> <translation id="5922967540311291836">Blokovat soubory cookie třetích stran:</translation> <translation id="5939518447894949180">Resetovat</translation> +<translation id="5964247741333118902">Vložený obsah</translation> <translation id="5968921426641056619">Zadejte webovou adresu</translation> <translation id="5975083100439434680">Oddálit</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Obnovit</translation> <translation id="7188508872042490670">Data webu v zařízení</translation> <translation id="7203150201908454328">Rozbaleno</translation> +<translation id="7219254577985949841">Vymazat data webu?</translation> <translation id="723171743924126238">Vyberte fotky</translation> <translation id="7243308994586599757">Možnosti jsou k dispozici ve spodní části obrazovky</translation> <translation id="7250468141469952378">Vybráno: <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb index 9a00d02..7ba486a1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_cy.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tapiwch i ddychwelyd i <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Dadwneud</translation> <translation id="2091887806945687916">Sain</translation> +<translation id="2096716221239095980">Dileu'r holl ddata</translation> <translation id="2117655453726830283">Sleid nesaf</translation> <translation id="2148716181193084225">Heddiw</translation> <translation id="216989819110952009">Hyd yn oed gyda'u llygaid wedi'u hamddiffyn gan y sbectol werdd roedd Dorothy a'i ffrindiau wedi'u syfrdanu i ddechrau gan y</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Caniatáu i wefannau gadw a darllen data cwcis (argymhellir)</translation> <translation id="2932883381142163287">Rhoi gwybod am gamddefnydd</translation> <translation id="2968755619301702150">Gwyliwr tystysgrifau</translation> -<translation id="300526633675317032">Bydd hyn yn clirio'r holl <ph name="SIZE_IN_KB" /> o le storio gwefan.</translation> <translation id="3008272652534848354">Ailosod caniatadau</translation> <translation id="301521992641321250">Rhwystrwyd yn awtomatig</translation> <translation id="3069226013421428034">Caniatáu mewngofnodi trydydd parti ar gyfer gwefan benodol.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Caniateir</translation> <translation id="429312253194641664">Mae gwefan yn chwarae cyfryngau</translation> <translation id="42981349822642051">Ehangu</translation> -<translation id="4336434711095810371">Clirio'r holl ddata</translation> <translation id="4338831206024587507">Pob gwefan o dan <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Rhwystro gwefannau rhag gwybod pan fyddwch wrthi'n defnyddio'r ddyfais hon</translation> <translation id="4412992751769744546">Caniatáu cwcis trydydd parti</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Wrthi'n rhannu eich sgrîn</translation> <translation id="5922967540311291836">Rhwystro cwcis trydydd parti:</translation> <translation id="5939518447894949180">Ailosod</translation> +<translation id="5964247741333118902">Cynnwys wedi'i fewnblannu</translation> <translation id="5968921426641056619">Rhowch gyfeiriad gwe</translation> <translation id="5975083100439434680">Pellhau</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Ail-lwytho</translation> <translation id="7188508872042490670">Data gwefan ar y ddyfais</translation> <translation id="7203150201908454328">Wedi'i ehangu</translation> +<translation id="7219254577985949841">Dileu data gwefan?</translation> <translation id="723171743924126238">Dewis lluniau</translation> <translation id="7243308994586599757">Mae opsiynau ar gael yn agos at waelod y sgrîn</translation> <translation id="7250468141469952378">Mae <ph name="ITEM_COUNT" /> wedi'u dewis</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 6a03fa9fa..0a760c9f 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tryk for at vende tilbage til <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Fortryd</translation> <translation id="2091887806945687916">Lyd</translation> +<translation id="2096716221239095980">Slet alle data</translation> <translation id="2117655453726830283">Næste dias</translation> <translation id="2148716181193084225">I dag</translation> <translation id="216989819110952009">Selv med øjnene beskyttet bag de grønne briller blev Dorothy og hendes venner først forblændet af den</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Tillad, at websites gemmer og læser cookiedata (anbefales)</translation> <translation id="2932883381142163287">Rapportér misbrug</translation> <translation id="2968755619301702150">Certifikatfremviser</translation> -<translation id="300526633675317032">Dette rydder alle <ph name="SIZE_IN_KB" /> i websitelagerpladsen.</translation> <translation id="3008272652534848354">Nulstil tilladelser</translation> <translation id="301521992641321250">Automatisk blokering</translation> <translation id="3069226013421428034">Tillad tredjepartslogin for et bestemt website.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Tilladt</translation> <translation id="429312253194641664">Et website afspiller medier</translation> <translation id="42981349822642051">Udvid</translation> -<translation id="4336434711095810371">Ryd alle data</translation> <translation id="4338831206024587507">Alle websites på <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Bloker websites fra at vide, hvornår du aktivt bruger denne enhed</translation> <translation id="4412992751769744546">Tillad tredjepartscookies</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Deling af din skærm</translation> <translation id="5922967540311291836">Bloker tredjepartscookies:</translation> <translation id="5939518447894949180">Nulstil</translation> +<translation id="5964247741333118902">Indlejret indhold</translation> <translation id="5968921426641056619">Angiv webadresse</translation> <translation id="5975083100439434680">Zoom ud</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Opdater</translation> <translation id="7188508872042490670">Websitedata på enheden</translation> <translation id="7203150201908454328">Udvidet</translation> +<translation id="7219254577985949841">Vil du slette websitedata?</translation> <translation id="723171743924126238">Vælg billeder</translation> <translation id="7243308994586599757">Du finder indstillingerne nederst på skærmen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er markeret</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 da94870..2b0c773 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tippen, um zu <ph name="URL_OF_THE_CURRENT_TAB" /> zurückzukehren</translation> <translation id="2079545284768500474">Rückgängig machen</translation> <translation id="2091887806945687916">Ton</translation> +<translation id="2096716221239095980">Alle Daten löschen</translation> <translation id="2117655453726830283">Nächste Folie</translation> <translation id="2148716181193084225">Heute</translation> <translation id="216989819110952009">Obwohl ihre Augen durch die grünen Gläser der Brillen geschützt waren, wurden Dorothy und ihren Freunden vom Glanz und vom Schimmer der</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Websites dürfen Cookiedaten speichern und lesen (empfohlen)</translation> <translation id="2932883381142163287">Missbrauch melden</translation> <translation id="2968755619301702150">Zertifikats-Viewer</translation> -<translation id="300526633675317032">Der gesamte Websitespeicher (<ph name="SIZE_IN_KB" />) wird gelöscht.</translation> <translation id="3008272652534848354">Berechtigungen zurücksetzen</translation> <translation id="301521992641321250">Automatisch blockiert</translation> <translation id="3069226013421428034">Hier kannst du Websites angeben, für die die Drittanbieter-Anmeldung erlaubt werden soll.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Zugelassen</translation> <translation id="429312253194641664">Eine Website gibt Medien wieder</translation> <translation id="42981349822642051">Maximieren</translation> -<translation id="4336434711095810371">Alle Daten löschen</translation> <translation id="4338831206024587507">Alle Websites unter <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Websites daran hindern, Informationen zu deiner aktiven Nutzung dieses Geräts abzurufen</translation> <translation id="4412992751769744546">Drittanbieter-Cookies zulassen</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Bildschirmfreigabe läuft</translation> <translation id="5922967540311291836">Drittanbieter-Cookies blockieren:</translation> <translation id="5939518447894949180">Zurücksetzen</translation> +<translation id="5964247741333118902">Eingebettete Inhalte</translation> <translation id="5968921426641056619">Webadresse eingeben</translation> <translation id="5975083100439434680">Verkleinern</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Aktualisieren</translation> <translation id="7188508872042490670">Websitedaten auf dem Gerät</translation> <translation id="7203150201908454328">Erweitert</translation> +<translation id="7219254577985949841">Websitedaten löschen?</translation> <translation id="723171743924126238">Bilder auswählen</translation> <translation id="7243308994586599757">Optionen unten auf dem Bildschirm verfügbar</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ausgewählt</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb index c18ad29..25c7e6b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_el.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Πατήστε για επιστροφή σε <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Αναίρεση</translation> <translation id="2091887806945687916">Ήχος</translation> +<translation id="2096716221239095980">Διαγραφή όλων των δεδομένων</translation> <translation id="2117655453726830283">Επόμενη διαφάνεια</translation> <translation id="2148716181193084225">Σήμερα</translation> <translation id="216989819110952009">Ακόμα και με την προστασία που πρόσφεραν στα μάτια τους τα πράσινα γυαλιά, η Ντόροθι και οι φίλοι της στην αρχή θαμπώθηκαν από</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Να επιτρέπεται στους ιστότοπους η αποθήκευση και η ανάγνωση δεδομένων cookie (συνιστάται)</translation> <translation id="2932883381142163287">Αναφορά κατάχρησης</translation> <translation id="2968755619301702150">Πρόγρ. προβολής πιστοποιητικού</translation> -<translation id="300526633675317032">Αυτό θα διαγράψει και τα <ph name="SIZE_IN_KB" /> του αποθηκευτικού χώρου ιστοτόπων.</translation> <translation id="3008272652534848354">Επαναφορά αδειών</translation> <translation id="301521992641321250">Αποκλείστηκε αυτόματα</translation> <translation id="3069226013421428034">Να επιτρέπεται η σύνδεση τρίτου μέρους για έναν συγκεκριμένο ιστότοπο.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Επιτρέπεται</translation> <translation id="429312253194641664">Ένας ιστότοπος κάνει αναπαραγωγή μέσων</translation> <translation id="42981349822642051">Επέκταση</translation> -<translation id="4336434711095810371">Διαγραφή όλων των δεδομένων</translation> <translation id="4338831206024587507">Όλοι οι ιστότοποι στον τομέα <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Να μην επιτρέπεται σε ιστοτόπους να γνωρίζουν πότε χρησιμοποιείτε τη συσκευή ενεργά</translation> <translation id="4412992751769744546">Αποδοχή cookie τρίτου μέρους</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Κοινή χρήση της οθόνης σας</translation> <translation id="5922967540311291836">Αποκλεισμός cookie τρίτου μέρους:</translation> <translation id="5939518447894949180">Επαναφορά</translation> +<translation id="5964247741333118902">Ενσωματωμένο περιεχόμενο</translation> <translation id="5968921426641056619">Εισαγωγή διεύθυνσης ιστού</translation> <translation id="5975083100439434680">Σμίκρυνση</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Ανανέωση</translation> <translation id="7188508872042490670">Δεδομένα ιστοτόπων στη συσκευή</translation> <translation id="7203150201908454328">Ανεπτυγμένο</translation> +<translation id="7219254577985949841">Διαγραφή δεδομένων ιστοτόπου;</translation> <translation id="723171743924126238">Επιλέξτε εικόνες</translation> <translation id="7243308994586599757">Διαθέσιμες επιλογές κοντά κάτω μέρος της οθόνης</translation> <translation id="7250468141469952378">Επιλέχθηκαν <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb index 70cedd1..40b35609 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_en-GB.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tap to return to <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Undo</translation> <translation id="2091887806945687916">Sound</translation> +<translation id="2096716221239095980">Delete all data</translation> <translation id="2117655453726830283">Next slide</translation> <translation id="2148716181193084225">Today</translation> <translation id="216989819110952009">Even with eyes protected by the green spectacles, Dorothy and her friends were at first dazzled by the</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Allow sites to save and read cookie data (recommended)</translation> <translation id="2932883381142163287">Report abuse</translation> <translation id="2968755619301702150">Certificate viewer</translation> -<translation id="300526633675317032">This will clear all <ph name="SIZE_IN_KB" /> of website storage.</translation> <translation id="3008272652534848354">Reset permissions</translation> <translation id="301521992641321250">Automatically blocked</translation> <translation id="3069226013421428034">Allow third-party sign-in for a specific site.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Allowed</translation> <translation id="429312253194641664">A site is playing media</translation> <translation id="42981349822642051">Expand</translation> -<translation id="4336434711095810371">Clear all data</translation> <translation id="4338831206024587507">All sites under <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Block sites from knowing when you're actively using this device</translation> <translation id="4412992751769744546">Allow third-party cookies</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Sharing your screen</translation> <translation id="5922967540311291836">Block third-party cookies:</translation> <translation id="5939518447894949180">Reset</translation> +<translation id="5964247741333118902">Embedded content</translation> <translation id="5968921426641056619">Enter web address</translation> <translation id="5975083100439434680">Zoom out</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Refresh</translation> <translation id="7188508872042490670">On-device site data</translation> <translation id="7203150201908454328">Expanded</translation> +<translation id="7219254577985949841">Delete site data?</translation> <translation id="723171743924126238">Select images</translation> <translation id="7243308994586599757">Options available near bottom of the screen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selected</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 340663e..bc18d9eb 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Presiona para volver a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Deshacer</translation> <translation id="2091887806945687916">Sonido</translation> +<translation id="2096716221239095980">Borrar todos los datos</translation> <translation id="2117655453726830283">Siguiente diapositiva</translation> <translation id="2148716181193084225">Hoy</translation> <translation id="216989819110952009">Incluso con los ojos protegidos por las gafas verdes, Dorothy y sus amigos quedaron deslumbrados cuando vieron</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permitir que todos los sitios guarden y lean datos de cookies (recomendado)</translation> <translation id="2932883381142163287">Informar sobre abusos</translation> <translation id="2968755619301702150">Visualizador de certificados</translation> -<translation id="300526633675317032">Se borrarán <ph name="SIZE_IN_KB" /> del almacenamiento del sitio web.</translation> <translation id="3008272652534848354">Restablecer permisos</translation> <translation id="301521992641321250">Bloqueado de forma automática</translation> <translation id="3069226013421428034">Permite el acceso de terceros a un sitio específico.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Permitido</translation> <translation id="429312253194641664">Un sitio está reproduciendo contenido multimedia</translation> <translation id="42981349822642051">Expandir</translation> -<translation id="4336434711095810371">Borrar todos los datos</translation> <translation id="4338831206024587507">Todos los sitios en <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">No permitir que los sitios sepan cuando estás usando activamente este dispositivo</translation> <translation id="4412992751769744546">Permitir cookies de terceros</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Compartiendo tu pantalla</translation> <translation id="5922967540311291836">Bloquear cookies de terceros:</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5964247741333118902">Contenido incorporado</translation> <translation id="5968921426641056619">Ingresa una dirección web</translation> <translation id="5975083100439434680">Alejar</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualizar</translation> <translation id="7188508872042490670">Datos de sitios en el dispositivo</translation> <translation id="7203150201908454328">Expandido</translation> +<translation id="7219254577985949841">¿Quieres borrar los datos del sitio?</translation> <translation id="723171743924126238">Seleccionar imágenes</translation> <translation id="7243308994586599757">Opciones disponibles junto a la parte inferior de la pantalla</translation> <translation id="7250468141469952378">Elementos seleccionados: <ph name="ITEM_COUNT" /></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 93f22fc0..bad081a 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Toca para volver a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Deshacer</translation> <translation id="2091887806945687916">Sonido</translation> +<translation id="2096716221239095980">Eliminar todos los datos</translation> <translation id="2117655453726830283">Diapositiva siguiente</translation> <translation id="2148716181193084225">Hoy</translation> <translation id="216989819110952009">Aun con los ojos protegidos por los anteojos verdes, la brillantez de la maravillosa ciudad encandiló</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permitir que los sitios guarden y lean datos de cookies (recomendado)</translation> <translation id="2932883381142163287">Notificar uso inadecuado</translation> <translation id="2968755619301702150">Visor de certificados</translation> -<translation id="300526633675317032">Se borrarán los <ph name="SIZE_IN_KB" /> de almacenamiento del sitio web.</translation> <translation id="3008272652534848354">Borrar permisos</translation> <translation id="301521992641321250">Bloqueado automáticamente</translation> <translation id="3069226013421428034">Permite el inicio de sesión de terceros en un sitio específico.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Permitido</translation> <translation id="429312253194641664">Un sitio web está reproduciendo elementos multimedia</translation> <translation id="42981349822642051">Mostrar</translation> -<translation id="4336434711095810371">Borrar todos los datos</translation> <translation id="4338831206024587507">Todos los sitios de <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Impide que los sitios detecten cuándo usas activamente este dispositivo</translation> <translation id="4412992751769744546">Permitir cookies de terceros</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Compartiendo tu pantalla</translation> <translation id="5922967540311291836">Bloquea cookies de terceros:</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5964247741333118902">Contenido insertado</translation> <translation id="5968921426641056619">Introduce una dirección web</translation> <translation id="5975083100439434680">Reducir</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualizar</translation> <translation id="7188508872042490670">Datos de sitios en el dispositivo</translation> <translation id="7203150201908454328">Ampliado</translation> +<translation id="7219254577985949841">¿Eliminar datos del sitio?</translation> <translation id="723171743924126238">Seleccionar imágenes</translation> <translation id="7243308994586599757">Opciones disponibles cerca de la parte inferior de la pantalla</translation> <translation id="7250468141469952378">Elementos seleccionados: <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb index e6ec82a..1594d92 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_et.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Puudutage vahelehele <ph name="URL_OF_THE_CURRENT_TAB" /> naasmiseks</translation> <translation id="2079545284768500474">Võta tagasi</translation> <translation id="2091887806945687916">Heli</translation> +<translation id="2096716221239095980">Kustuta kõik andmed</translation> <translation id="2117655453726830283">Järgmine slaid</translation> <translation id="2148716181193084225">Täna</translation> <translation id="216989819110952009">Kuigi rohelised prillid olid silmade kaitseks ninale asetatud, olid Dorothy ja tema sõbrad esialgu</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Lubab saitidel salvestada küpsiseid ja lugeda küpsiste andmeid (soovitatav)</translation> <translation id="2932883381142163287">Teata väärkasutusest</translation> <translation id="2968755619301702150">Sertifikaadikuvaja</translation> -<translation id="300526633675317032">See tühjendab veebisaidi salvestusruumi mahuga <ph name="SIZE_IN_KB" />.</translation> <translation id="3008272652534848354">Lähtesta load</translation> <translation id="301521992641321250">Automaatselt blokeeritud</translation> <translation id="3069226013421428034">Konkreetse saidi jaoks kolmanda osapoole sisselogimise lubamine.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Lubatud</translation> <translation id="429312253194641664">Sait esitab meediasisu</translation> <translation id="42981349822642051">Laienda</translation> -<translation id="4336434711095810371">Kustuta kõik andmed</translation> <translation id="4338831206024587507">Kõik saidid domeenil <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Keelake saitidel selle tuvastamine, millal seda seadet aktiivselt kasutate</translation> <translation id="4412992751769744546">Kolmanda osapoole küpsiste lubamine</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Ekraanikuva jagamine</translation> <translation id="5922967540311291836">Kolmanda osapoole küpsisefailide blokeerimine</translation> <translation id="5939518447894949180">Lähtesta</translation> +<translation id="5964247741333118902">Manustatud sisu</translation> <translation id="5968921426641056619">Sisestage veebiaadress</translation> <translation id="5975083100439434680">Suumib välja</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Värskenda</translation> <translation id="7188508872042490670">Seadmes olevad saidi andmed</translation> <translation id="7203150201908454328">Laiendatud</translation> +<translation id="7219254577985949841">Kas kustutada saidi andmed?</translation> <translation id="723171743924126238">Kujutiste valimine</translation> <translation id="7243308994586599757">Valikud on saadaval ekraani allosas</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> on valitud</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb index 337f9bdb..25a4c3e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_eu.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Sakatu hau <ph name="URL_OF_THE_CURRENT_TAB" /> webgunera itzultzeko</translation> <translation id="2079545284768500474">Desegin</translation> <translation id="2091887806945687916">Soinua</translation> +<translation id="2096716221239095980">Ezabatu datu guztiak</translation> <translation id="2117655453726830283">Hurrengo diapositiba</translation> <translation id="2148716181193084225">Gaur</translation> <translation id="216989819110952009">Begiak betaurreko berdeekin babestuta bazituzten ere, Dorothy eta haren lagunak txundituta geratu ziren</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Baimendu webguneei cookieen datuak gordetzea eta irakurtzea (gomendatua)</translation> <translation id="2932883381142163287">Eman erabilera okerren berri</translation> <translation id="2968755619301702150">Ziurtagiri-ikustailea</translation> -<translation id="300526633675317032"><ph name="SIZE_IN_KB" /> ezabatuko dira webguneen datuetatik.</translation> <translation id="3008272652534848354">Berrezarri baimenak</translation> <translation id="301521992641321250">Automatikoki blokeatuta</translation> <translation id="3069226013421428034">Eman webgune jakin batean saioa hasteko baimena hirugarrenei.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Baimenduta</translation> <translation id="429312253194641664">Webgune bat multimedia-edukia erreproduzitzen ari da</translation> <translation id="42981349822642051">Zabaldu</translation> -<translation id="4336434711095810371">Garbitu datu guztiak</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> domeinuko webgune guztiak</translation> <translation id="4402755511846832236">Ez utzi jakiten webguneei gailua noiz erabiltzen ari zaren</translation> <translation id="4412992751769744546">Onartu hirugarrenen cookieak</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Pantaila partekatzen</translation> <translation id="5922967540311291836">Blokeatu hirugarrenen cookieak:</translation> <translation id="5939518447894949180">Berrezarri</translation> +<translation id="5964247741333118902">Eduki kapsulatua</translation> <translation id="5968921426641056619">Idatzi web-helbidea</translation> <translation id="5975083100439434680">Txikitu</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />: <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Freskatu</translation> <translation id="7188508872042490670">Gailuan gordetako webguneetako datuak</translation> <translation id="7203150201908454328">Zabalduta</translation> +<translation id="7219254577985949841">Webguneko datuak ezabatu nahi dituzu?</translation> <translation id="723171743924126238">Hautatu irudiak</translation> <translation id="7243308994586599757">Pantailaren behealdean agertzen dira dauden aukerak</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> hautatu dira</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 82c86c4..eb51336 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">برای برگشتن به <ph name="URL_OF_THE_CURRENT_TAB" /> ضربه بزنید</translation> <translation id="2079545284768500474">لغو</translation> <translation id="2091887806945687916">صدا</translation> +<translation id="2096716221239095980">حذف همه دادهها</translation> <translation id="2117655453726830283">اسلاید بعدی</translation> <translation id="2148716181193084225">امروز</translation> <translation id="216989819110952009">دوروتی و دوستانش بااینکه عینکهای سبز به چشم داشتند، اولش با درخشش شهر شگفتانگیز ماتومبهوت شدند</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">سایتها مجاز به ذخیره و خواندن دادههای کوکی باشند (توصیه میشود)</translation> <translation id="2932883381142163287">گزارش سوءاستفاده</translation> <translation id="2968755619301702150">بیننده گواهی</translation> -<translation id="300526633675317032">این کار کل <ph name="SIZE_IN_KB" /> فضای ذخیرهسازی وبسایت را پاک میکند.</translation> <translation id="3008272652534848354">بازنشانی مجوزها</translation> <translation id="301521992641321250">مسدودشده بهطور خودکار</translation> <translation id="3069226013421428034">ورود به سیستم شخص ثالث برای سایت خاصی مجاز میشود.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">مجاز است</translation> <translation id="429312253194641664">سایتی درحال پخش رسانه است</translation> <translation id="42981349822642051">بزرگ کردن</translation> -<translation id="4336434711095810371">پاک کردن همه دادهها</translation> <translation id="4338831206024587507">همه سایتهای تحت <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">از اینکه سایتها بدانند چه زمانی بهصورت فعال از این دستگاه استفاده میکنید جلوگیری میشود</translation> <translation id="4412992751769744546">اجازه به کوکیهای شخص ثالث</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">درحال همرسانی صفحهنمایش</translation> <translation id="5922967540311291836">مسدود کردن کوکیهای شخص ثالث:</translation> <translation id="5939518447894949180">بازنشانی</translation> +<translation id="5964247741333118902">محتوای جاسازیشده</translation> <translation id="5968921426641056619">نشانی وب را وارد کنید</translation> <translation id="5975083100439434680">دورنمایی کردن</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">بازآوری</translation> <translation id="7188508872042490670">دادههای سایتها در دستگاه</translation> <translation id="7203150201908454328">باز شده</translation> +<translation id="7219254577985949841">دادههای سایت حذف شود؟</translation> <translation id="723171743924126238">انتخاب تصاویر</translation> <translation id="7243308994586599757">گزینهها در نزدیک پایین صفحه نمایش در دسترس هستند</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> مورد انتخاب شد</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb index 33962d69..ae48b92b 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fi.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Napauta, niin palaat tänne: <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Kumoa</translation> <translation id="2091887806945687916">Ääni</translation> +<translation id="2096716221239095980">Poista kaikki data</translation> <translation id="2117655453726830283">Seuraava dia</translation> <translation id="2148716181193084225">Tänään</translation> <translation id="216989819110952009">Vihreistä silmälaseista huolimatta Dorothy ja ystävät sokaistuivat aluksi</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Salli sivustojen tallentaa ja lukea evästetietoja (suositus)</translation> <translation id="2932883381142163287">Ilmoita väärinkäytöstä</translation> <translation id="2968755619301702150">Varmennetiedot</translation> -<translation id="300526633675317032">Tämä tyhjentää yhteensä <ph name="SIZE_IN_KB" /> tallennettuja sivustotietoja.</translation> <translation id="3008272652534848354">Nollaa luvat</translation> <translation id="301521992641321250">Estetty automaattisesti</translation> <translation id="3069226013421428034">Salli kolmannen osapuolen sisäänkirjautuminen tietylle sivustolle.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Sallittu</translation> <translation id="429312253194641664">Sivusto toistaa mediaa</translation> <translation id="42981349822642051">Laajenna</translation> -<translation id="4336434711095810371">Poista kaikki data</translation> <translation id="4338831206024587507">Kaikki sivustot, jotka kuuluvat verkkotunnukseen <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Estä sivustoja tietämästä, kun käytät tätä laitetta aktiivisesti</translation> <translation id="4412992751769744546">Salli kolmannen osapuolen evästeet</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Näyttösi jaetaan</translation> <translation id="5922967540311291836">Estä kolmannen osapuolen evästeet:</translation> <translation id="5939518447894949180">Tyhjennä</translation> +<translation id="5964247741333118902">Upotettu sisältö</translation> <translation id="5968921426641056619">Lisää verkko-osoite</translation> <translation id="5975083100439434680">Loitonna</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Päivitä</translation> <translation id="7188508872042490670">Laitepohjainen sivustodata</translation> <translation id="7203150201908454328">Laajennettu</translation> +<translation id="7219254577985949841">Poistetaanko sivustodata?</translation> <translation id="723171743924126238">Valitse kuvat</translation> <translation id="7243308994586599757">Asetukset löytyvät näytön alalaidasta.</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> valittu</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 0d8b331..7110a22e 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Mag-tap para bumalik sa <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">I-undo</translation> <translation id="2091887806945687916">Tunog</translation> +<translation id="2096716221239095980">I-delete ang lahat ng data</translation> <translation id="2117655453726830283">Susunod na slide</translation> <translation id="2148716181193084225">Ngayong Araw</translation> <translation id="216989819110952009">Kahit na pinoprotektahan ng berdeng salamin ang mga mata, sa una ay nasilaw si Dorothy at ang kanyang mga kaibigan sa</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Payagan ang mga site na mag-save at magbasa ng data ng cookie (inirerekomenda)</translation> <translation id="2932883381142163287">I-ulat ang pang-aabuso</translation> <translation id="2968755619301702150">Viewer ng certificate</translation> -<translation id="300526633675317032">Iki-clear nito ang lahat ng <ph name="SIZE_IN_KB" /> ng storage ng website.</translation> <translation id="3008272652534848354">I-reset ang mga pahintulot</translation> <translation id="301521992641321250">Awtomatikong na-block</translation> <translation id="3069226013421428034">Payagan ang third-party na pag-sign in para sa partikular na site.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Pinapayagan</translation> <translation id="429312253194641664">May site na nagpe-play ng media</translation> <translation id="42981349822642051">Palawakin</translation> -<translation id="4336434711095810371">I-clear ang lahat ng data</translation> <translation id="4338831206024587507">Lahat ng site sa ilalim ng <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Pigilan ang mga site na malaman kung kailan mo aktibong ginagamit ang device na ito</translation> <translation id="4412992751769744546">Payagan ang third-party na cookies</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Ibinabahagi ang iyong screen</translation> <translation id="5922967540311291836">I-block ang third-party na cookies:</translation> <translation id="5939518447894949180">I-reset</translation> +<translation id="5964247741333118902">Naka-embed na content</translation> <translation id="5968921426641056619">Ilagay ang address sa web</translation> <translation id="5975083100439434680">Mag-zoom out</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">I-refresh</translation> <translation id="7188508872042490670">On-device na data ng site</translation> <translation id="7203150201908454328">Pinalawak</translation> +<translation id="7219254577985949841">I-delete ang data ng site?</translation> <translation id="723171743924126238">Pumili ng mga larawan</translation> <translation id="7243308994586599757">May mga opsyon malapit sa ibaba ng screen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ang napili</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb index 793e4e2..ca623b3 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_fr-CA.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Touchez pour revenir à <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Annuler</translation> <translation id="2091887806945687916">Son</translation> +<translation id="2096716221239095980">Supprimer toutes les données</translation> <translation id="2117655453726830283">Diapositive suivante</translation> <translation id="2148716181193084225">Aujourd'hui</translation> <translation id="216989819110952009">Malgré leurs lunettes vertes, Dorothée et ses amis, au début, furent éblouis par</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Autoriser les sites à enregistrer et à lire les données des témoins (recommandé)</translation> <translation id="2932883381142163287">Signaler un abus</translation> <translation id="2968755619301702150">Lecteur de certificats</translation> -<translation id="300526633675317032">Cette action entraînera la suppression de l'ensemble des <ph name="SIZE_IN_KB" /> d'espace de stockage des sites Web.</translation> <translation id="3008272652534848354">Réinitialiser les autorisations</translation> <translation id="301521992641321250">Bloquée automatiquement</translation> <translation id="3069226013421428034">Autorisez la connexion de tiers pour un site particulier.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Autorisé</translation> <translation id="429312253194641664">Un site lit du contenu multimédia</translation> <translation id="42981349822642051">Développer</translation> -<translation id="4336434711095810371">Effacer toutes les données</translation> <translation id="4338831206024587507">Tous les sites associés à <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Empêcher les sites de savoir quand vous êtes en train d'utiliser cet appareil</translation> <translation id="4412992751769744546">Autoriser les témoins tiers</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Partage de votre écran en cours…</translation> <translation id="5922967540311291836">Bloquer les témoins tiers :</translation> <translation id="5939518447894949180">Recommencer</translation> +<translation id="5964247741333118902">Contenu intégré</translation> <translation id="5968921426641056619">Entrez l'adresse Web</translation> <translation id="5975083100439434680">Zoom arrière</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> : <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualiser</translation> <translation id="7188508872042490670">Données relatives aux sites sur l’appareil</translation> <translation id="7203150201908454328">Agrandi</translation> +<translation id="7219254577985949841">Supprimer les données relatives aux sites?</translation> <translation id="723171743924126238">Sélectionner des images</translation> <translation id="7243308994586599757">Options disponibles vers le bas de l’écran</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> élément(s) sélectionné(s)</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 d3df0b2..77d9009 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Appuyez pour revenir à l'adresse <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Annuler</translation> <translation id="2091887806945687916">Son</translation> +<translation id="2096716221239095980">Supprimer toutes les données</translation> <translation id="2117655453726830283">Diapositive suivante</translation> <translation id="2148716181193084225">Aujourd'hui</translation> <translation id="216989819110952009">Malgré leurs lunettes vertes, Dorothée et ses amis furent d'abord éblouis par l'éclat</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Autoriser les sites à enregistrer et à lire les données des cookies (recommandé)</translation> <translation id="2932883381142163287">Signaler un abus</translation> <translation id="2968755619301702150">Lecteur de certificat</translation> -<translation id="300526633675317032">Cette action aura pour effet de libérer l'espace de stockage utilisé pour les données de site (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Réinitialiser les autorisations</translation> <translation id="301521992641321250">Bloquée automatiquement</translation> <translation id="3069226013421428034">Autorisez la connexion tierce pour un site spécifique.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Autorisé</translation> <translation id="429312253194641664">Un site est en train de lire un contenu multimédia</translation> <translation id="42981349822642051">Développer</translation> -<translation id="4336434711095810371">Effacer toutes les données</translation> <translation id="4338831206024587507">Tous les sites du domaine <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Empêcher les sites de savoir si vous utilisez activement cet appareil</translation> <translation id="4412992751769744546">Autoriser les cookies tiers</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Partage de votre écran…</translation> <translation id="5922967540311291836">Bloquer les cookies tiers :</translation> <translation id="5939518447894949180">Réinitialiser</translation> +<translation id="5964247741333118902">Contenu intégré</translation> <translation id="5968921426641056619">Saisissez une adresse Web</translation> <translation id="5975083100439434680">Zoom arrière</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualiser</translation> <translation id="7188508872042490670">Données des sites sur l'appareil</translation> <translation id="7203150201908454328">Développé</translation> +<translation id="7219254577985949841">Supprimer les données du site ?</translation> <translation id="723171743924126238">Sélectionner des images</translation> <translation id="7243308994586599757">Options disponibles au bas de l'écran</translation> <translation id="7250468141469952378">Nombre d'éléments sélectionnés : <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb index a2b08a7..1b5f582 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gl.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Toca para volver a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Desfacer</translation> <translation id="2091887806945687916">Son</translation> +<translation id="2096716221239095980">Eliminar todos os datos</translation> <translation id="2117655453726830283">Seguinte diapositiva</translation> <translation id="2148716181193084225">Hoxe</translation> <translation id="216989819110952009">Ao principio, aínda cos ollos protexidos polas lentes verdes, Dorothy e os seus amigos quedaron cegados polo brillo</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permitir que os sitios garden e lean datos de cookies (recomendado)</translation> <translation id="2932883381142163287">Informar de uso inadecuado</translation> <translation id="2968755619301702150">Visor de certificados</translation> -<translation id="300526633675317032">Eliminaranse os <ph name="SIZE_IN_KB" /> de almacenamento do sitio web.</translation> <translation id="3008272652534848354">Restablecer permisos</translation> <translation id="301521992641321250">Bloqueado automaticamente</translation> <translation id="3069226013421428034">Permite o inicio de sesión de terceiros para un sitio específico.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Permitida</translation> <translation id="429312253194641664">Un sitio está reproducindo contido multimedia</translation> <translation id="42981349822642051">Ampliar</translation> -<translation id="4336434711095810371">Borrar todos os datos</translation> <translation id="4338831206024587507">Todos os sitios do dominio <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Impide que os sitios saiban se estás utilizando este dispositivo de maneira activa</translation> <translation id="4412992751769744546">Permitir cookies de terceiros</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Compartindo pantalla</translation> <translation id="5922967540311291836">Bloquea as cookies de terceiros:</translation> <translation id="5939518447894949180">Restablecer</translation> +<translation id="5964247741333118902">Contido inserido</translation> <translation id="5968921426641056619">Indica o enderezo web</translation> <translation id="5975083100439434680">Afastar</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />: <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualizar</translation> <translation id="7188508872042490670">Datos dos sitios no dispositivo</translation> <translation id="7203150201908454328">Ampliado</translation> +<translation id="7219254577985949841">Eliminar datos do sitio?</translation> <translation id="723171743924126238">Selecciona imaxes</translation> <translation id="7243308994586599757">Opcións dispoñibles na parte inferior da pantalla</translation> <translation id="7250468141469952378">Elementos seleccionados: <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb index dacfd1a..a81f2b9 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_gu.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> પર પરત ફરવા માટે, ટૅપ કરો</translation> <translation id="2079545284768500474">છેલ્લો ફેરફાર રદ કરો</translation> <translation id="2091887806945687916">ધ્વનિ</translation> +<translation id="2096716221239095980">બધો ડેટા ડિલીટ કરો</translation> <translation id="2117655453726830283">આગલી સ્લાઇડ</translation> <translation id="2148716181193084225">આજે</translation> <translation id="216989819110952009">લીલા ચશ્માં દ્વારા આંખો સુરક્ષિત હોવા છતાં પણ, ડોરોથી અને તેના મિત્રો પહેલાં તો આનાથી અંજાઈ ગયા હતા</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">સાઇટને કુકી ડેટા સાચવવા અને વાંચવાની મંજૂરી આપો (સુઝાવ આપીએ છીએ)</translation> <translation id="2932883381142163287">દુરુપયોગ જણાવો</translation> <translation id="2968755619301702150">પ્રમાણપત્ર દર્શક</translation> -<translation id="300526633675317032">આ <ph name="SIZE_IN_KB" /> નું બધું વેબસાઇટ સ્ટોરેજ સાફ કરશે.</translation> <translation id="3008272652534848354">પરવાનગીઓ રીસેટ કરો</translation> <translation id="301521992641321250">ઑટોમૅટિક રીતે બ્લૉક થયું</translation> <translation id="3069226013421428034">ચોક્કસ સાઇટ માટે ત્રીજા પક્ષ દ્વારા સાઇન-ઇનને મંજૂરી આપો.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">મંજૂર</translation> <translation id="429312253194641664">સાઇટ મીડિયા ચલાવી રહી છે</translation> <translation id="42981349822642051">વિસ્તૃત કરો</translation> -<translation id="4336434711095810371">બધો ડેટા સાફ કરો</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> હેઠળની બધી સાઇટ</translation> <translation id="4402755511846832236">તમે સક્રિય રીતે આ ડિવાઇસનો ઉપયોગ ક્યારે કરો છો, તેની જાણ ન થાય એ માટે સાઇટ બ્લૉક કરો</translation> <translation id="4412992751769744546">તૃતીય-પક્ષ કૂકીઝને મંજૂરી આપો</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">તમારી સ્ક્રીન શેર કરીએ છીએ</translation> <translation id="5922967540311291836">ત્રીજા પક્ષની કુકીને બ્લૉક કરો:</translation> <translation id="5939518447894949180">રીસેટ કરો</translation> +<translation id="5964247741333118902">શામેલ કરેલું કન્ટેન્ટ</translation> <translation id="5968921426641056619">વેબ ઍડ્રેસ દાખલ કરો</translation> <translation id="5975083100439434680">ઝૂમ ઘટાડો</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">રિફ્રેશ કરો</translation> <translation id="7188508872042490670">ડિવાઇસ પર સાઇટનો ડેટા</translation> <translation id="7203150201908454328">વિસ્તૃત કરેલ</translation> +<translation id="7219254577985949841">શું સાઇટનો ડેટા ડિલીટ કરીએ?</translation> <translation id="723171743924126238">છબીઓ પસંદ કરો</translation> <translation id="7243308994586599757">સ્ક્રીનના તળિયા નજીક વિકલ્પો ઉપલબ્ધ છે</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />ની પસંદગી કરી</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 1a05b5b4..79000037 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> पर वापस जाने के लिए टैप करें</translation> <translation id="2079545284768500474">पहले जैसा करें</translation> <translation id="2091887806945687916">आवाज़</translation> +<translation id="2096716221239095980">सारा डेटा मिटाएं</translation> <translation id="2117655453726830283">अगली स्लाइड</translation> <translation id="2148716181193084225">आज</translation> <translation id="216989819110952009">यहां तक कि आंखों के बचाव के लिए हरे रंग का चश्मा पहनने के बावजूद, डोरोथी और उनके दोस्त शुरुआत में इस शानदार शहर को देखने पर हैरान थे.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">साइटों को कुकी डेटा सेव करने और पढ़ने की अनुमति दें (सुझाए गए)</translation> <translation id="2932883381142163287">बुरे बर्ताव की शिकायत करें</translation> <translation id="2968755619301702150">प्रमाणपत्र व्यूअर</translation> -<translation id="300526633675317032">इससे वेबसाइट की पूरी <ph name="SIZE_IN_KB" /> मेमोरी साफ़ हो जाएगी.</translation> <translation id="3008272652534848354">अनुमतियां रीसेट करें</translation> <translation id="301521992641321250">ऑटोमैटिक रूप से ब्लॉक है</translation> <translation id="3069226013421428034">किसी साइट पर, तीसरे पक्ष के खाते से साइन इन करने की अनुमति दें.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">अनुमति है</translation> <translation id="429312253194641664">किसी साइट पर मीडिया चल रहा है</translation> <translation id="42981349822642051">विस्तृत करें</translation> -<translation id="4336434711095810371">सारा डेटा मिटाएं</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> की सभी साइटें</translation> <translation id="4402755511846832236">साइटों को यह जानने से रोकें कि आप इस डिवाइस का इस्तेमाल कब करते हैं</translation> <translation id="4412992751769744546">तृतीय-पक्ष कुकी को अनुमति दें</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">आपकी स्क्रीन शेयर की जा रही है</translation> <translation id="5922967540311291836">तीसरे पक्ष की कुकी ब्लॉक करें:</translation> <translation id="5939518447894949180">रीसेट करें</translation> +<translation id="5964247741333118902">एम्बेड किया गया कॉन्टेंट</translation> <translation id="5968921426641056619">वेब पता डालें</translation> <translation id="5975083100439434680">ज़ूम आउट</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">रीफ्रेश करें</translation> <translation id="7188508872042490670">उपयोगकर्ता के डिवाइस पर साइट डेटा</translation> <translation id="7203150201908454328">विस्तृत</translation> +<translation id="7219254577985949841">क्या आपको साइट डेटा मिटाना है?</translation> <translation id="723171743924126238">फ़ोटो चुनें</translation> <translation id="7243308994586599757">विकल्प स्क्रीन के नीचे उपलब्ध हैं</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> चुने गए</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 7bd93562..a3ef3b0 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Dodirnite da biste se vratili na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Poništi</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="2096716221239095980">Izbriši sve podatke</translation> <translation id="2117655453726830283">Sljedeći slajd</translation> <translation id="2148716181193084225">Danas</translation> <translation id="216989819110952009">Iako su im oči bile zaštićene zelenim naočalama, Dorothy i njezine prijatelje u početku su zadivili</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Dopusti web-lokacijama da spremaju i čitaju podatke kolačića (preporučeno)</translation> <translation id="2932883381142163287">Prijavi zloupotrebu</translation> <translation id="2968755619301702150">Preglednik certifikata</translation> -<translation id="300526633675317032">Time će se izbrisati cijela pohrana web-lokacije veličine <ph name="SIZE_IN_KB" />.</translation> <translation id="3008272652534848354">Poništi dopuštenja</translation> <translation id="301521992641321250">Automatski blokirano</translation> <translation id="3069226013421428034">Dopusti prijavu treće strane za određenu web-lokaciju.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Dopušteno</translation> <translation id="429312253194641664">Web-lokacija reproducira medije</translation> <translation id="42981349822642051">Proširi</translation> -<translation id="4336434711095810371">Izbriši sve podatke</translation> <translation id="4338831206024587507">Sve web-lokacije na domeni <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Onemogućivanje web-lokacijama da znaju kad aktivno upotrebljavate ovaj uređaj</translation> <translation id="4412992751769744546">Dopusti kolačiće trećih strana</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Dijeljenje zaslona</translation> <translation id="5922967540311291836">Blokiraj kolačiće trećih strana:</translation> <translation id="5939518447894949180">Ponovno postavi</translation> +<translation id="5964247741333118902">Ugrađeni sadržaj</translation> <translation id="5968921426641056619">Unesite web-adresu</translation> <translation id="5975083100439434680">Smanji</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Osvježi</translation> <translation id="7188508872042490670">Podaci web-lokacije na uređaju</translation> <translation id="7203150201908454328">Proširen</translation> +<translation id="7219254577985949841">Želite li izbrisati podatke web-lokacije?</translation> <translation id="723171743924126238">Odaberite slike</translation> <translation id="7243308994586599757">Opcije dostupne pri dnu zaslona</translation> <translation id="7250468141469952378">Odabrano: <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb index 764a64c..c4ead2f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_hu.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Koppintson, hogy visszatérjen ide: <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Visszavonás</translation> <translation id="2091887806945687916">Hang</translation> +<translation id="2096716221239095980">Minden adat törlése</translation> <translation id="2117655453726830283">Következő dia</translation> <translation id="2148716181193084225">Ma</translation> <translation id="216989819110952009">Dorkát és barátait még a zöld szemüvegen át is elkápráztatta a</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Cookie-adatok mentésének és olvasásának engedélyezése a webhelyeken (ajánlott)</translation> <translation id="2932883381142163287">Visszaélés bejelentése</translation> <translation id="2968755619301702150">Tanúsítványmegtekintő</translation> -<translation id="300526633675317032">Ezzel törli a webhely teljes tárhelyét: <ph name="SIZE_IN_KB" />.</translation> <translation id="3008272652534848354">Engedélyek visszavonása</translation> <translation id="301521992641321250">Automatikusan letiltva</translation> <translation id="3069226013421428034">Engedélyezheti a harmadik félen keresztüli bejelentkezést adott webhelyeken.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Engedélyezve</translation> <translation id="429312253194641664">Az egyik webhely médiatartalmat játszik le</translation> <translation id="42981349822642051">Kibontás</translation> -<translation id="4336434711095810371">Az összes adat törlése</translation> <translation id="4338831206024587507">Minden <ph name="DOMAIN" /> alatti webhely</translation> <translation id="4402755511846832236">A webhelyek nem kaphatnak információt arról, hogy Ön mikor használja aktívan ezt az eszközt.</translation> <translation id="4412992751769744546">Harmadik felektől származó cookie-k engedélyezése</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Képernyő megosztása</translation> <translation id="5922967540311291836">Harmadik féltől származó cookie-k letiltása</translation> <translation id="5939518447894949180">Visszaállítás</translation> +<translation id="5964247741333118902">Beágyazott tartalom</translation> <translation id="5968921426641056619">Adja meg a kívánt internetcímet</translation> <translation id="5975083100439434680">Kicsinyítés</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Frissítés</translation> <translation id="7188508872042490670">Eszközön tárolt webhelyadatok</translation> <translation id="7203150201908454328">Kibontott</translation> +<translation id="7219254577985949841">Törli a webhelyadatokat?</translation> <translation id="723171743924126238">Képek kiválasztása</translation> <translation id="7243308994586599757">A beállítások a képernyő alsó részén találhatók</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elem kiválasztva</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 af5918c..a25c878 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Հպեք՝ <ph name="URL_OF_THE_CURRENT_TAB" /> վերադառնալու համար</translation> <translation id="2079545284768500474">Հետարկել</translation> <translation id="2091887806945687916">Ձայն</translation> +<translation id="2096716221239095980">Ջնջել բոլոր տվյալները</translation> <translation id="2117655453726830283">Հաջորդ սլայդը</translation> <translation id="2148716181193084225">Այսօր</translation> <translation id="216989819110952009">Նույնիսկ դնելով կանաչ ապակիներով ակնոցներ՝ Դորոթին և իր ընկերները շլացան այս</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Թույլատրել կայքերին պահել և կարդալ քուքիների տվյալները (խորհուրդ է տրվում)</translation> <translation id="2932883381142163287">Հաղորդել չարաշահման մասին</translation> <translation id="2968755619301702150">Վկայագրերի դիտում</translation> -<translation id="300526633675317032">Կազատվի կայքի օգտագործած <ph name="SIZE_IN_KB" /> տարածք:</translation> <translation id="3008272652534848354">Վերակայել թույլտվությունները</translation> <translation id="301521992641321250">Ավտոմատ արգելափակված է</translation> <translation id="3069226013421428034">Նշեք այն կայքերը, որոնց համար երրորդ կողմի ծառայությունների միջոցով մուտքը պետք է թույլատրվի։</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Թույլատրված է</translation> <translation id="429312253194641664">Կայքում մեդիա ֆայլ է նվագարկվում</translation> <translation id="42981349822642051">Ընդարձակել</translation> -<translation id="4336434711095810371">Մաքրել բոլոր տվյալները</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> տիրույթով բոլոր կայքերը</translation> <translation id="4402755511846832236">Արգելել կայքերին տեղեկանալ, երբ դուք ակտիվորեն օգտագործում եք այս սարքը</translation> <translation id="4412992751769744546">Թույլատրել 3-րդ կողմի քուքիները</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Էկրանը ցուցադրվում է</translation> <translation id="5922967540311291836">Արգելափակել երրորդ կողմի քուքիները․</translation> <translation id="5939518447894949180">Վերակայել</translation> +<translation id="5964247741333118902">Զետեղված բովանդակություն</translation> <translation id="5968921426641056619">Մուտքագրեք վեբ հասցեն</translation> <translation id="5975083100439434680">Փոքրացնել</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Թարմացնել</translation> <translation id="7188508872042490670">Կայքերի տվյալները սարքում</translation> <translation id="7203150201908454328">Ընդլայնված</translation> +<translation id="7219254577985949841">Ջնջե՞լ կայքի տվյալները</translation> <translation id="723171743924126238">Ընտրեք պատկերներ</translation> <translation id="7243308994586599757">Ընտրանքները հասանելի են էկրանի ստորին հատվածում</translation> <translation id="7250468141469952378">Ընտրված է <ph name="ITEM_COUNT" /> տարր</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb index bd61e2c..bcbc288d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_id.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Ketuk untuk kembali ke <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Urungkan</translation> <translation id="2091887806945687916">Suara</translation> +<translation id="2096716221239095980">Hapus semua data</translation> <translation id="2117655453726830283">Slide berikutnya</translation> <translation id="2148716181193084225">Hari ini</translation> <translation id="216989819110952009">Meskipun mengenakan kacamata berwarna hijau, Dorothy dan teman-temannya pada awalnya terpesona oleh</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Izinkan situs untuk menyimpan dan membaca data cookie (disarankan)</translation> <translation id="2932883381142163287">Laporkan penyalahgunaan</translation> <translation id="2968755619301702150">Penampil sertifikat</translation> -<translation id="300526633675317032">Ini akan menghapus seluruh penyimpanan situs web, sebesar <ph name="SIZE_IN_KB" />.</translation> <translation id="3008272652534848354">Reset izin</translation> <translation id="301521992641321250">Diblokir secara otomatis</translation> <translation id="3069226013421428034">Izinkan login pihak ketiga untuk situs tertentu.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Diizinkan</translation> <translation id="429312253194641664">Sebuah situs sedang memutar media</translation> <translation id="42981349822642051">Luaskan</translation> -<translation id="4336434711095810371">Hapus semua data</translation> <translation id="4338831206024587507">Semua situs di bawah <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Blokir situs agar tidak mengetahui saat Anda aktif menggunakan perangkat ini</translation> <translation id="4412992751769744546">Izinkan cookie pihak ketiga</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Membagikan layar Anda</translation> <translation id="5922967540311291836">Blokir cookie pihak ketiga:</translation> <translation id="5939518447894949180">Reset</translation> +<translation id="5964247741333118902">Konten yang disematkan</translation> <translation id="5968921426641056619">Masukkan alamat web</translation> <translation id="5975083100439434680">Perkecil</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Perbarui</translation> <translation id="7188508872042490670">Data situs di perangkat</translation> <translation id="7203150201908454328">Diperluas</translation> +<translation id="7219254577985949841">Hapus data situs?</translation> <translation id="723171743924126238">Pilih gambar</translation> <translation id="7243308994586599757">Opsi terdapat di dekat bagian bawah layar</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</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 aab5862..bacc5411 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Ýttu til að fara aftur á <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Afturkalla</translation> <translation id="2091887806945687916">Hljóð</translation> +<translation id="2096716221239095980">Eyða öllum gögnum</translation> <translation id="2117655453726830283">Næsta skyggna</translation> <translation id="2148716181193084225">Í dag</translation> <translation id="216989819110952009">Jafnvel þótt grænu gleraugun veittu augunum vernd blinduðust Dórótea og vinir hennar í fyrstu af</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Leyfa vefsvæðum að vista og lesa fótsporagögn (ráðlagt)</translation> <translation id="2932883381142163287">Tilkynna misnotkun</translation> <translation id="2968755619301702150">Vottorðaskoðari</translation> -<translation id="300526633675317032">Þetta mun losa alls um <ph name="SIZE_IN_KB" /> af geymslu vefsvæða.</translation> <translation id="3008272652534848354">Endurstilla heimildir</translation> <translation id="301521992641321250">Sjálfkrafa lokað á</translation> <translation id="3069226013421428034">Leyfa innskráningu þriðja aðila á tilteknu vefsvæði.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Leyft</translation> <translation id="429312253194641664">Vefsvæði er að spila efni</translation> <translation id="42981349822642051">Stækka</translation> -<translation id="4336434711095810371">Hreinsa öll gögn</translation> <translation id="4338831206024587507">Öll vefsvæði undir <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Lokaðu á að vefsvæði geti séð hvenær þú notar þetta tæki</translation> <translation id="4412992751769744546">Leyfa fótspor þriðja aðilla</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Deiling skjásins þíns</translation> <translation id="5922967540311291836">Loka á fótspor þriðju aðila:</translation> <translation id="5939518447894949180">Endurstilla</translation> +<translation id="5964247741333118902">Innfellt efni</translation> <translation id="5968921426641056619">Sláðu inn vefslóð</translation> <translation id="5975083100439434680">Minnka aðdrátt</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Endurnýja</translation> <translation id="7188508872042490670">Vefsvæðagögn í tækinu</translation> <translation id="7203150201908454328">Stækkað</translation> +<translation id="7219254577985949841">Eyða vefsvæðagögnum?</translation> <translation id="723171743924126238">Veldu myndir</translation> <translation id="7243308994586599757">Valkostir eru neðst á skjánum</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> valin</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb index 03940cb..9df8f34 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_it.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tocca per tornare a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Annulla</translation> <translation id="2091887806945687916">Audio</translation> +<translation id="2096716221239095980">Elimina tutti i dati</translation> <translation id="2117655453726830283">Diapositiva successiva</translation> <translation id="2148716181193084225">Oggi</translation> <translation id="216989819110952009">Nonostante gli occhiali verdi, i cinque rimasero ugualmente abbagliati dallo splendore</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Consenti ai siti di salvare e leggere i dati dei cookie (opzione consigliata)</translation> <translation id="2932883381142163287">Segnala abuso</translation> <translation id="2968755619301702150">Visualizzatore certificati</translation> -<translation id="300526633675317032">Verranno cancellati tutti i <ph name="SIZE_IN_KB" /> di memoria utilizzata dai siti web.</translation> <translation id="3008272652534848354">Reimposta le autorizzazioni</translation> <translation id="301521992641321250">Bloccata automaticamente</translation> <translation id="3069226013421428034">Consenti l'accesso di terze parti per un sito specifico.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Autorizzazione consentita</translation> <translation id="429312253194641664">Un sito sta riproducendo contenuti multimediali</translation> <translation id="42981349822642051">Espandi</translation> -<translation id="4336434711095810371">Cancella tutti i dati</translation> <translation id="4338831206024587507">Tutti i siti in <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Impedisci ai siti di sapere quando usi attivamente questo dispositivo</translation> <translation id="4412992751769744546">Consenti cookie di terze parti</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Condivisione dello schermo</translation> <translation id="5922967540311291836">Blocca cookie di terze parti:</translation> <translation id="5939518447894949180">Reimposta</translation> +<translation id="5964247741333118902">Contenuti incorporati</translation> <translation id="5968921426641056619">Inserisci l'indirizzo web</translation> <translation id="5975083100439434680">Diminuisci lo zoom</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Aggiorna</translation> <translation id="7188508872042490670">Dati dei siti sul dispositivo</translation> <translation id="7203150201908454328">Espanso</translation> +<translation id="7219254577985949841">Vuoi eliminare i dati del sito?</translation> <translation id="723171743924126238">Seleziona immagini</translation> <translation id="7243308994586599757">Opzioni disponibili nella parte inferiore dello schermo</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> elementi selezionati</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb index 517e73e7..676918f 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_iw.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">כדי לחזור אל <ph name="URL_OF_THE_CURRENT_TAB" />, יש להקיש כאן</translation> <translation id="2079545284768500474">ביטול הפעולה</translation> <translation id="2091887806945687916">צליל</translation> +<translation id="2096716221239095980">מחיקת כל הנתונים</translation> <translation id="2117655453726830283">לשקף הבא</translation> <translation id="2148716181193084225">היום</translation> <translation id="216989819110952009">אפילו שהרכיבו משקפיים ירוקות שהגנו על עיניהם, דורותי וחבריה נדהמו כשהגיעו לראשונה</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">אתרים יוכלו לשמור ולקרוא נתונים של קובצי Cookie (מומלץ)</translation> <translation id="2932883381142163287">דיווח על שימוש לרעה</translation> <translation id="2968755619301702150">מציג האישורים</translation> -<translation id="300526633675317032">פעולה זו תמחק את כל נתוני האתר המאוחסנים (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">איפוס הרשאות</translation> <translation id="301521992641321250">נחסמה אוטומטית</translation> <translation id="3069226013421428034">אישור הכניסה של צד שלישי לאתר ספציפי.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">מותר</translation> <translation id="429312253194641664">אתר מסוים מפעיל מדיה</translation> <translation id="42981349822642051">הרחבה</translation> -<translation id="4336434711095810371">ניקוי כל הנתונים</translation> <translation id="4338831206024587507">כל האתרים בדומיין <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">אתרים לא יוכלו לדעת מתי המכשיר הזה משמש אותך באופן פעיל</translation> <translation id="4412992751769744546">התר קובצי Cookie של צד שלישי</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">מתבצע שיתוף מסך</translation> <translation id="5922967540311291836">חסימת קובצי cookie של צד שלישי:</translation> <translation id="5939518447894949180">איפוס</translation> +<translation id="5964247741333118902">תוכן מוטמע</translation> <translation id="5968921426641056619">צריך להזין כתובת אינטרנט</translation> <translation id="5975083100439434680">התרחקות</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">רענון</translation> <translation id="7188508872042490670">נתונים מאתרים ששמורים במכשיר</translation> <translation id="7203150201908454328">מורחב</translation> +<translation id="7219254577985949841">למחוק את הנתונים מהאתר?</translation> <translation id="723171743924126238">בחירת תמונות</translation> <translation id="7243308994586599757">אפשרויות הזמינות באזור החלק התחתון של המסך</translation> <translation id="7250468141469952378">נבחרו <ph name="ITEM_COUNT" /></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 1e38585..44dab75f 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">タップして <ph name="URL_OF_THE_CURRENT_TAB" /> に戻る</translation> <translation id="2079545284768500474">元に戻す</translation> <translation id="2091887806945687916">音声</translation> +<translation id="2096716221239095980">すべてのデータを削除</translation> <translation id="2117655453726830283">次のスライド</translation> <translation id="2148716181193084225">今日</translation> <translation id="216989819110952009">緑色の眼鏡で眼を守っていても、ドロシーと彼女の仲間たちは目が眩みました</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">サイトに Cookie データの保存と読み取りを許可する(推奨)</translation> <translation id="2932883381142163287">不正行為を報告</translation> <translation id="2968755619301702150">証明書ビューア</translation> -<translation id="300526633675317032">ウェブサイトのストレージ <ph name="SIZE_IN_KB" /> のデータをすべて削除します。</translation> <translation id="3008272652534848354">権限をリセット</translation> <translation id="301521992641321250">自動でブロックされました</translation> <translation id="3069226013421428034">特定のサイトのサードパーティのログインを許可します。</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">許可</translation> <translation id="429312253194641664">サイトでメディアが再生されています</translation> <translation id="42981349822642051">展開</translation> -<translation id="4336434711095810371">データをすべて消去</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> のすべてのサイト</translation> <translation id="4402755511846832236">サイトによるこのデバイスのアクティブ状態の検出をブロックする</translation> <translation id="4412992751769744546">サードパーティの Cookie を許可</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">画面を共有しています</translation> <translation id="5922967540311291836">サードパーティの Cookie をブロックする:</translation> <translation id="5939518447894949180">リセット</translation> +<translation id="5964247741333118902">埋め込みコンテンツ</translation> <translation id="5968921426641056619">ウェブアドレスを入力</translation> <translation id="5975083100439434680">縮小する</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />~<ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">更新</translation> <translation id="7188508872042490670">デバイス上のサイトデータ</translation> <translation id="7203150201908454328">展開表示中</translation> +<translation id="7219254577985949841">サイトデータを削除しますか?</translation> <translation id="723171743924126238">画像を選択</translation> <translation id="7243308994586599757">画面の下の方にオプションがあります</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> 件選択されています</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 b50dc979..bd79ac4 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">შეეხეთ <ph name="URL_OF_THE_CURRENT_TAB" />-ზე დასაბრუნებლად</translation> <translation id="2079545284768500474">მოქმედების გაუქმება</translation> <translation id="2091887806945687916">ხმა</translation> +<translation id="2096716221239095980">ყველა მონაცემის წაშლა</translation> <translation id="2117655453726830283">შემდეგი სლაიდი</translation> <translation id="2148716181193084225">დღეს</translation> <translation id="216989819110952009">მართალია, მწვანე სათვალეები ეკეთათ, მაგრამ დოროთი და მისი მეგობრები ამ საკვირველი ქალაქის ბრწყინვალებამ მაინც გააოცა.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">საშუალებას აძლევს საიტებს შეინახონ და გაეცნონ ქუქი ფაილებს (რეკომენდირებული)</translation> <translation id="2932883381142163287">არასათანადო მოპყრობის შესახებ შეტყობინება</translation> <translation id="2968755619301702150">სერტიფიკატთა მაჩვენებელი</translation> -<translation id="300526633675317032">ეს მოქმედება მთლიანად გაასუფთავებს ვებსაიტების მეხსიერებას (სულ: <ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">ნებართვების გადაყენება</translation> <translation id="301521992641321250">დაბლოკილია ავტომატურად</translation> <translation id="3069226013421428034">მესამე მხარის მეშვეობით სისტემაში შესვლის დაშვება კონკრეტული საიტისთვის.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">დაშვებულია</translation> <translation id="429312253194641664">საიტზე გაშვებულია მედია-კონტენტი</translation> <translation id="42981349822642051">გაშლა</translation> -<translation id="4336434711095810371">ყველა მონაცემის გასუფთავება</translation> <translation id="4338831206024587507">ყველა საიტი <ph name="DOMAIN" />-ის ფარგლებში</translation> <translation id="4402755511846832236">საიტებისთვის ამ მოწყობილობის აქტიურად გამოყენების შესახებ ინფორმაციის მიღების დაბლოკვა</translation> <translation id="4412992751769744546">მეს. მხარის ქ. ფაილების დაშვება</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">თქვენი ეკრანი ზიარდება</translation> <translation id="5922967540311291836">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა:</translation> <translation id="5939518447894949180">გადატვირთვა</translation> +<translation id="5964247741333118902">ჩაშენებული კონტენტი</translation> <translation id="5968921426641056619">შეიყვანეთ ვებ-მისამართი</translation> <translation id="5975083100439434680">დაშორება</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> — <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">განახლება</translation> <translation id="7188508872042490670">მოწყობილობაზე შენახული საიტების მონაცემები</translation> <translation id="7203150201908454328">გაშლილი</translation> +<translation id="7219254577985949841">გსურთ, წაშალოთ საიტის მონაცემები?</translation> <translation id="723171743924126238">აირჩიეთ სურათები</translation> <translation id="7243308994586599757">ვარიანტები ხელმისაწვდომია ეკრანის ქვედა ნაწილთან</translation> <translation id="7250468141469952378">არჩეულია <ph name="ITEM_COUNT" /></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 1ceda95..149aafd 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> қойындысына оралу үшін түртіңіз.</translation> <translation id="2079545284768500474">Қайтару</translation> <translation id="2091887806945687916">Дыбыс</translation> +<translation id="2096716221239095980">Барлық деректі жою</translation> <translation id="2117655453726830283">Келесі слайд</translation> <translation id="2148716181193084225">Бүгін</translation> <translation id="216989819110952009">Жасыл көзілдірік таққан Дороти мен оның достары қалаға алғаш келгенде, оның ғажайып көркіне таңғалды.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Сайттарға cookie деректерін сақтауға және оқуға рұқсат беру (ұсынылған)</translation> <translation id="2932883381142163287">Бұзақылық туралы хабарлау</translation> <translation id="2968755619301702150">Сертификат көру құралы</translation> -<translation id="300526633675317032">Вебсайттың барлық деректері жойылады (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Рұқсаттарды бастапқы күйіне қайтару</translation> <translation id="301521992641321250">Автоматты түрде блокталған</translation> <translation id="3069226013421428034">Белгілі бір сайт үшін бөгде қызметтер арқылы кіруге рұқсат беру.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Рұқсат етілген</translation> <translation id="429312253194641664">Сайтта мультимедиа ойнатылуда</translation> <translation id="42981349822642051">Жаю</translation> -<translation id="4336434711095810371">Барлық деректі өшіру</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> доменіндегі барлық сайт</translation> <translation id="4402755511846832236">Сайттарды бөгеу арқылы олардың құрылғыны қашан белсенді пайдаланғаныңыз туралы ақпаратты алуына жол берілмейді.</translation> <translation id="4412992751769744546">Үшінші тарап cookie файлдарына рұқсат беру</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Экранды бөлісіп жатырсыз.</translation> <translation id="5922967540311291836">Үшінші тарап cookie файлдарын бөгеу:</translation> <translation id="5939518447894949180">Қалпына келтіру</translation> +<translation id="5964247741333118902">Ендірілген контент</translation> <translation id="5968921426641056619">Веб-мекенжайды енгізіңіз</translation> <translation id="5975083100439434680">Кішірейту</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Жаңарту</translation> <translation id="7188508872042490670">Құрылғыдағы сайт деректері</translation> <translation id="7203150201908454328">Кеңейтілген</translation> +<translation id="7219254577985949841">Сайт деректерін жою керек пе?</translation> <translation id="723171743924126238">Кескіндерді таңдау</translation> <translation id="7243308994586599757">Опциялар экранның төменгі жағында тұрады</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> таңдалды</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 b2e59c2..d143dc7 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">ចុចដើម្បីត្រឡប់ទៅ <ph name="URL_OF_THE_CURRENT_TAB" /> វិញ</translation> <translation id="2079545284768500474">ត្រឡប់វិញ</translation> <translation id="2091887806945687916">សំឡេង</translation> +<translation id="2096716221239095980">លុបទិន្នន័យទាំងអស់</translation> <translation id="2117655453726830283">ស្លាយបន្ទាប់</translation> <translation id="2148716181193084225">ថ្ងៃនេះ</translation> <translation id="216989819110952009">សូម្បីតែមានពាក់វ៉ែនតាពណ៌បៃតងការពារភ្នែកក៏ដោយ ក៏ដំបូងឡើយ Dorothy និងមិត្តភ័ក្តិរបស់គាត់មានភាពភ្ញាក់ផ្អើលដោយ</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">អនុញ្ញាតឲ្យគេហទំព័ររក្សាទុក និងអានទិន្នន័យខុកឃី (បានណែនាំ)</translation> <translation id="2932883381142163287">របាយការណ៏នៃការបំពាន</translation> <translation id="2968755619301702150">កម្មវិធីមើលវិញ្ញាបនប័ត្រ</translation> -<translation id="300526633675317032">វានឹងជម្រះ <ph name="SIZE_IN_KB" /> ទាំងស្រុងនៃទំហំផ្ទុកគេហទំព័រ</translation> <translation id="3008272652534848354">កំណត់ការអនុញ្ញាតឡើងវិញ</translation> <translation id="301521992641321250">បានទប់ស្កាត់ដោយស្វ័យប្រវត្តិ</translation> <translation id="3069226013421428034">អនុញ្ញាតការចូលរបស់ភាគីទីបីសម្រាប់គេហទំព័រជាក់លាក់។</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">បានអនុញ្ញាត</translation> <translation id="429312253194641664">គេហទំព័រកំពុងចាក់មេឌៀ</translation> <translation id="42981349822642051">ពង្រីក</translation> -<translation id="4336434711095810371">សម្អាតទិន្នន័យទាំងអស់</translation> <translation id="4338831206024587507">គេហទំព័រទាំងអស់នៅក្រោម <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">ទប់ស្កាត់គេហទំព័រមិនឱ្យដឹងអំពីពេលវេលាដែលអ្នកកំពុងប្រើឧបករណ៍នេះយ៉ាងសកម្ម</translation> <translation id="4412992751769744546">អនុញ្ញាតខុកឃីភាគីទីបី</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">កំពុងចែករំលែកអេក្រង់របស់អ្នក</translation> <translation id="5922967540311291836">ទប់ស្កាត់ខូគីភាគីទីបី៖</translation> <translation id="5939518447894949180">កំណត់ឡើងវិញ</translation> +<translation id="5964247741333118902">ខ្លឹមសារដែលបានបង្កប់</translation> <translation id="5968921426641056619">បញ្ចូលអាសយដ្ឋានទំព័រ</translation> <translation id="5975083100439434680">បង្រួម</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ធ្វើឲ្យថ្មីឡើងវិញ…</translation> <translation id="7188508872042490670">ទិន្នន័យគេហទំព័រនៅលើឧបករណ៍</translation> <translation id="7203150201908454328">បានពង្រីក</translation> +<translation id="7219254577985949841">លុបទិន្នន័យគេហទំព័រឬ?</translation> <translation id="723171743924126238">ជ្រើសរើសរូបភាព</translation> <translation id="7243308994586599757">មានជម្រើសនៅក្បែរផ្នែកខាងក្រោមអេក្រង់</translation> <translation id="7250468141469952378">បានជ្រើសរើស <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb index ee414547..da95862 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_kn.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> ಗೆ ಮರಳಲು ಟ್ಯಾಪ್ ಮಾಡಿ</translation> <translation id="2079545284768500474">ರದ್ದುಮಾಡಿ</translation> <translation id="2091887806945687916">ಶಬ್ಧ</translation> +<translation id="2096716221239095980">ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ಅಳಿಸಿ</translation> <translation id="2117655453726830283">ಮುಂದಿನ ಸ್ಲೈಡ್</translation> <translation id="2148716181193084225">ಇಂದು</translation> <translation id="216989819110952009">ಡೋರೊಥಿ ಮತ್ತು ಅವಳ ಸ್ನೇಹಿತರು ತಮ್ಮ ಕಣ್ಣುಗಳ ರಕ್ಷಣೆಗಾಗಿ ಹಸಿರು ಕನ್ನಡಕಗಳನ್ನು ತೊಟ್ಟಿದ್ದರೂ ಸಹ ಆ ಅದ್ಭುತ ನಗರದ ವೈಭವ ಮೊದಲ ನೋಟದಲ್ಲೇ ಅವರ ಕಣ್ಣುಗಳನ್ನು ಕೋರೈಸಿತು.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">ಕುಕೀ ಡೇಟಾವನ್ನು ಉಳಿಸಲು ಮತ್ತು ರೀಡ್ ಮಾಡಲು ಸೈಟ್ಗಳನ್ನು ಅನುಮತಿಸಿ (ಶಿಫಾರಸು ಮಾಡಲಾಗಿದೆ)</translation> <translation id="2932883381142163287">ನಿಂದನೆ ವರದಿ ಮಾಡಿ</translation> <translation id="2968755619301702150">ಪ್ರಮಾಣಪತ್ರ ವೀಕ್ಷಕ</translation> -<translation id="300526633675317032">ಇದು ವೆಬ್ಸೈಟ್ ಸಂಗ್ರಹಣೆಯ ಎಲ್ಲಾ <ph name="SIZE_IN_KB" /> ಅನ್ನು ತೆರವುಗೊಳಿಸುತ್ತದೆ.</translation> <translation id="3008272652534848354">ಅನುಮತಿಗಳನ್ನು ಮರುಹೊಂದಿಸಿ</translation> <translation id="301521992641321250">ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ</translation> <translation id="3069226013421428034">ನಿರ್ದಿಷ್ಟ ಸೈಟ್ಗಾಗಿ ಥರ್ಡ್-ಪಾರ್ಟಿ ಸೈನ್ ಇನ್ ಅನ್ನು ಅನುಮತಿಸಿ.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ಅನುಮತಿಸಲಾಗಿದೆ</translation> <translation id="429312253194641664">ಒಂದು ಸೈಟ್, ಮಾಧ್ಯಮವನ್ನು ಪ್ಲೇ ಮಾಡುತ್ತಿದೆ</translation> <translation id="42981349822642051">ವಿಸ್ತರಿಸಿ</translation> -<translation id="4336434711095810371">ಎಲ್ಲಾ ಡೇಟಾವನ್ನು ತೆರವುಗೊಳಿಸಿ</translation> <translation id="4338831206024587507">ಎಲ್ಲಾ ವೆಬ್ಸೈಟ್ಗಳು <ph name="DOMAIN" /> ಅಡಿಯಲ್ಲಿವೆ</translation> <translation id="4402755511846832236">ನೀವು ಈ ಸಾಧನವನ್ನು ಸಕ್ರಿಯವಾಗಿ ಬಳಸುತ್ತಿರುವಾಗ ಸೈಟ್ಗಳು ನಿಮ್ಮ ಉಪಸ್ಥಿತಿಯ ಕುರಿತು ತಿಳಿದುಕೊಳ್ಳದಂತೆ ನಿರ್ಬಂಧಿಸಿ</translation> <translation id="4412992751769744546">ಮೂರನೇ-ವ್ಯಕ್ತಿಯ ಕುಕೀಗಳನ್ನು ಅನುಮತಿಸಿ</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">ನಿಮ್ಮ ಸ್ಕ್ರೀನ್ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಲಾಗುತ್ತಿದೆ</translation> <translation id="5922967540311291836">ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ:</translation> <translation id="5939518447894949180">ಮರುಹೊಂದಿಸು</translation> +<translation id="5964247741333118902">ಎಂಬೆಡ್ ಮಾಡಲಾದ ಕಂಟೆಂಟ್</translation> <translation id="5968921426641056619">ವೆಬ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ</translation> <translation id="5975083100439434680">ಝೂಮ್ ಔಟ್</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ರಿಫ್ರೆಶ್ ಮಾಡಿ</translation> <translation id="7188508872042490670">ಸಾಧನದಲ್ಲಿರುವ ಸೈಟ್ ಡೇಟಾ</translation> <translation id="7203150201908454328">ವಿಸ್ತೃತವಾದ</translation> +<translation id="7219254577985949841">ಸೈಟ್ ಡೇಟಾವನ್ನು ಅಳಿಸಬೇಕೆ?</translation> <translation id="723171743924126238">ಚಿತ್ರಗಳನ್ನು ಆಯ್ಕೆಮಾಡಿ</translation> <translation id="7243308994586599757">ಪರದೆಯ ಕೆಳಗೆ ಲಭ್ಯವಿರುವ ಆಯ್ಕೆಗಳು</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ಅನ್ನು ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb index 93bc2c3..404155e2 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ko.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">탭하여 <ph name="URL_OF_THE_CURRENT_TAB" />(으)로 돌아가기</translation> <translation id="2079545284768500474">실행취소</translation> <translation id="2091887806945687916">소리</translation> +<translation id="2096716221239095980">모든 데이터 삭제</translation> <translation id="2117655453726830283">다음 슬라이드</translation> <translation id="2148716181193084225">오늘</translation> <translation id="216989819110952009">도로시와 친구들은 녹색 안경으로 눈을 보호했지만, 처음에는 멋진 도시의 광채에 눈이 부셨습니다.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">사이트에서 쿠키 데이터를 저장하고 읽도록 허용(권장)</translation> <translation id="2932883381142163287">악용사례 신고</translation> <translation id="2968755619301702150">인증서 뷰어</translation> -<translation id="300526633675317032">웹사이트 저장공간 <ph name="SIZE_IN_KB" />가 모두 삭제됩니다.</translation> <translation id="3008272652534848354">권한 재설정</translation> <translation id="301521992641321250">자동으로 차단됨</translation> <translation id="3069226013421428034">특정 사이트에 대해 서드 파티 로그인을 허용합니다.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">허용됨</translation> <translation id="429312253194641664">사이트에서 미디어 재생 중</translation> <translation id="42981349822642051">펼치기</translation> -<translation id="4336434711095810371">모든 데이터 삭제</translation> <translation id="4338831206024587507"><ph name="DOMAIN" />의 모든 사이트</translation> <translation id="4402755511846832236">사용자가 현재 기기를 사용 중인지 사이트에서 알 수 없도록 차단합니다.</translation> <translation id="4412992751769744546">서드 파티 쿠키 허용</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">화면 공유</translation> <translation id="5922967540311291836">서드 파티 쿠키 차단:</translation> <translation id="5939518447894949180">초기화</translation> +<translation id="5964247741333118902">삽입한 콘텐츠</translation> <translation id="5968921426641056619">웹 주소 입력</translation> <translation id="5975083100439434680">축소</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">새로고침</translation> <translation id="7188508872042490670">기기 내 사이트 데이터</translation> <translation id="7203150201908454328">펼쳐짐</translation> +<translation id="7219254577985949841">사이트 데이터를 삭제하시겠습니까?</translation> <translation id="723171743924126238">이미지 선택</translation> <translation id="7243308994586599757">화면 하단에서 옵션 선택 가능</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />개 선택됨</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 05e3d8a9..25d7d17 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> кайтуу үчүн таптап коюңуз</translation> <translation id="2079545284768500474">Кайтаруу</translation> <translation id="2091887806945687916">Үн</translation> +<translation id="2096716221239095980">Бардык нерселерди өчүрүү</translation> <translation id="2117655453726830283">Кийинки слайд</translation> <translation id="2148716181193084225">Бүгүн</translation> <translation id="216989819110952009">Жашыл көз айнек менен корголгон Доротинин көздөрү саамга эч нерсе көрбөй калды</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Сайттарга куки дайындарын сактоого жана окууга уруксат берүү (сунушталат)</translation> <translation id="2932883381142163287">Адепсиздик тууралуу кабарлоо</translation> <translation id="2968755619301702150">Тастыктаманы көрүүчү</translation> -<translation id="300526633675317032">Ушуну менен <ph name="SIZE_IN_KB" /> сайттардын дайындарынын баары тазаланат.</translation> <translation id="3008272652534848354">Уруксаттарды өзгөртүү</translation> <translation id="301521992641321250">Автоматтык түрдө бөгөттөлдү</translation> <translation id="3069226013421428034">Белгилүү бир сайтка үчүнчү тараптан кирүүгө уруксат бериңиз.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Уруксат берилген</translation> <translation id="429312253194641664">Сайтта медиа файл ойнотулууда</translation> <translation id="42981349822642051">Жайып көрсөтүү</translation> -<translation id="4336434711095810371">Бардык маалыматты өчүрүү</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> домениндеги бардык сайттар</translation> <translation id="4402755511846832236">Түзмөгүңүз активдүү колдонулуп жаткан учур сайттардан жашырылсын</translation> <translation id="4412992751769744546">Үчнчү жактн кукилрне урукст брүү</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Экраныңыз бөлүшүлүүдө</translation> <translation id="5922967540311291836">Үчүнчү тараптын cookie файлдарын бөгөттөө:</translation> <translation id="5939518447894949180">Кайра коюу</translation> +<translation id="5964247741333118902">Жалгаштырылган контент</translation> <translation id="5968921426641056619">Веб дарегин киргизиңиз</translation> <translation id="5975083100439434680">Кичирейтүү</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />, <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Жаңылоо</translation> <translation id="7188508872042490670">Түзмөктөгү сайттын маалыматы</translation> <translation id="7203150201908454328">Жайылып көрсөтүлгөн</translation> +<translation id="7219254577985949841">Сайттагы маалымат өчүрүлсүнбү?</translation> <translation id="723171743924126238">Сүрөттөрдү тандаңыз</translation> <translation id="7243308994586599757">Параметрлер экрандын түбүндө берилген</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> нерсе тандалды</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb index 7d1f34b3..e254f2e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lo.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">ແຕະເພື່ອກັບຄືນຫາ <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">ບໍ່ເຮັດ</translation> <translation id="2091887806945687916">ສຽງ</translation> +<translation id="2096716221239095980">ລຶບຂໍ້ມູນທັງໝົດ</translation> <translation id="2117655453726830283">ສະໄລ້ຕໍ່ໄປ</translation> <translation id="2148716181193084225">ມື້ນີ້</translation> <translation id="216989819110952009">ເຖິງແມ່ນວ່າມີຕາທີ່ປ້ອງກັນດ້ວຍແວ່ນສາຍຕາສີຂຽວ, ທຳອິດໂດໂຣທີ ແລະ ໝູ່ຂອງລາວກໍຕື່ນຕາຕື່ນໃຈກັບ</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">ອະນຸຍາດໃຫ້ເວັບໄຊທ໌ບັນທຶກ ແລະອ່ານຂໍ້ມູນຄຸກກີ້ (ແນະນຳໃຫ້)</translation> <translation id="2932883381142163287">ລາຍງານການນຳໃຊ້ຜິດ</translation> <translation id="2968755619301702150">ຕົວເບິ່ງໃບຢັ້ງຢືນ</translation> -<translation id="300526633675317032">ນີ້ຈະລຶບລ້າງທັງໝົດ <ph name="SIZE_IN_KB" /> ຂອງບ່ອນເກັບຂໍ້ມູນເວັບໄຊ.</translation> <translation id="3008272652534848354">ຣີເຊັດການອະນຸຍາດ</translation> <translation id="301521992641321250">ບລັອກອັດຕະໂນມັດແລ້ວ</translation> <translation id="3069226013421428034">ອະນຸຍາດໃຫ້ເຂົ້າສູ່ລະບົບພາກສ່ວນທີສາມສຳລັບເວັບໄຊສະເພາະໃດໜຶ່ງ.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ອະນຸຍາດແລ້ວ</translation> <translation id="429312253194641664">ເວັບໄຊກຳລັງຫຼິ້ນສື່ຢູ່</translation> <translation id="42981349822642051">ຂະຫຍາຍ</translation> -<translation id="4336434711095810371">ລຶບລ້າງຂໍ້ມູນທັງໝົດ</translation> <translation id="4338831206024587507">ເວັບໄຊທັງໝົດພາຍໃຕ້ <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">ບລັອກບໍ່ໃຫ້ເວັບໄຊຮູ້ໃນເວລາທີ່ທ່ານກຳລັງໃຊ້ອຸປະກອນນີ້ຢູ່</translation> <translation id="4412992751769744546">ອະນຸຍາດຄຸກກີ້ບຸກຄົນທີສາມ</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">ກຳລັງແບ່ງປັນໜ້າຈໍຂອງທ່ານ</translation> <translation id="5922967540311291836">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມ:</translation> <translation id="5939518447894949180">ຕັ້ງຄ່າຄືນໃໝ່</translation> +<translation id="5964247741333118902">ເນື້ອຫາທີ່ຝັງໄວ້</translation> <translation id="5968921426641056619">ລະບຸທີ່ຢູ່ເວັບ</translation> <translation id="5975083100439434680">ຊູມອອກ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ຣີເຟຣຊ</translation> <translation id="7188508872042490670">ຂໍ້ມູນເວັບໄຊຢູ່ອຸປະກອນ</translation> <translation id="7203150201908454328">ຂະຫຍາຍແລ້ວ</translation> +<translation id="7219254577985949841">ລຶບຂໍ້ມູນເວັບໄຊອອກບໍ?</translation> <translation id="723171743924126238">ເລືອກຮູບ</translation> <translation id="7243308994586599757">ທາງເລືອກມີໃຫ້ໃກ້ປຸ່ມຂອງໜ້າຈໍ</translation> <translation id="7250468141469952378">ເລືອກ <ph name="ITEM_COUNT" /> ລາຍການແລ້ວ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb index 5bb5220..393837a 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_lt.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Palieskite, kad grįžtumėte į <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Anuliuoti</translation> <translation id="2091887806945687916">Garsas</translation> +<translation id="2096716221239095980">Ištrinti visus duomenis</translation> <translation id="2117655453726830283">Kita skaidrė</translation> <translation id="2148716181193084225">Šiandien</translation> <translation id="216989819110952009">Netgi žaliais akiniais apsaugoję akis Dorotė ir jos draugai iš pradžių buvo apstulbinti</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Leisti svetainėms išsaugoti ir nuskaityti slapukų duomenis (rekomenduojama)</translation> <translation id="2932883381142163287">Pranešti apie piktnaudžiavimą</translation> <translation id="2968755619301702150">Sertifikato peržiūros priemonė</translation> -<translation id="300526633675317032">Bus išvalyta visa <ph name="SIZE_IN_KB" /> svetainės saugykla.</translation> <translation id="3008272652534848354">Iš naujo nustatyti leidimus</translation> <translation id="301521992641321250">Automatiškai užblokuota</translation> <translation id="3069226013421428034">Leisti trečiajai šaliai prisijungti prie konkrečios svetainės.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Leidžiama</translation> <translation id="429312253194641664">Svetainėje leidžiama medija</translation> <translation id="42981349822642051">Išskleisti</translation> -<translation id="4336434711095810371">Išvalyti visus duomenis</translation> <translation id="4338831206024587507">Visos svetainės su domenu <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Neleisti svetainėms žinoti, kada aktyviai naudojate šį įrenginį</translation> <translation id="4412992751769744546">Leisti trečiųjų šalių slapukus</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Bendrinamas ekranas</translation> <translation id="5922967540311291836">Blokuoti trečiųjų šalių slapukus:</translation> <translation id="5939518447894949180">Nustatyti iš naujo</translation> +<translation id="5964247741333118902">Įterptas turinys</translation> <translation id="5968921426641056619">Įveskite žiniatinklio adresą</translation> <translation id="5975083100439434680">Tolinti</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Atnaujinti</translation> <translation id="7188508872042490670">Įrenginyje esantys svetainių duomenys</translation> <translation id="7203150201908454328">Išskleista</translation> +<translation id="7219254577985949841">Ištrinti svetainės duomenis?</translation> <translation id="723171743924126238">Pasirinkti vaizdus</translation> <translation id="7243308994586599757">Parinktys pasiekiamos netoli ekrano apačios</translation> <translation id="7250468141469952378">Pasirinkta: <ph name="ITEM_COUNT" /></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 118f84d..c0068ad 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Pieskarieties, lai atgrieztos cilnē <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Atsaukt</translation> <translation id="2091887806945687916">Signāls</translation> +<translation id="2096716221239095980">Dzēst visus datus</translation> <translation id="2117655453726830283">Nākamais slaids</translation> <translation id="2148716181193084225">Šodien</translation> <translation id="216989819110952009">Pat raugoties caur zaļajām brillēm, kas sargāja acis, Dorotija un viņas draugi sākotnēji apžilba no</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Atļaut vietnēm saglabāt un lasīt sīkfailu datus (ieteicams)</translation> <translation id="2932883381142163287">Ziņot par ļaunprātīgu izmantošanu</translation> <translation id="2968755619301702150">Sertifikātu skatītājs</translation> -<translation id="300526633675317032">Tādējādi tiks notīrīti visi vietnes krātuves dati (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Atiestatīt atļaujas</translation> <translation id="301521992641321250">Automātiski bloķēta</translation> <translation id="3069226013421428034">Atļauja trešajai pusei pierakstīties konkrētā vietnē</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Atļauts</translation> <translation id="429312253194641664">Vietne atskaņo multivides saturu</translation> <translation id="42981349822642051">Izvērst</translation> -<translation id="4336434711095810371">Notīrīt visus datus</translation> <translation id="4338831206024587507">Visas vietnes domēnā <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Nerādīt vietnēm, kad jūs aktīvi lietojat šo ierīci</translation> <translation id="4412992751769744546">Atļaut trešo pušu sīkfailus</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Notiek jūsu ekrāna kopīgošana</translation> <translation id="5922967540311291836">Bloķēt trešo pušu sīkfailus:</translation> <translation id="5939518447894949180">Atiestatīt</translation> +<translation id="5964247741333118902">Iegultais saturs</translation> <translation id="5968921426641056619">Ievadiet tīmekļa adresi</translation> <translation id="5975083100439434680">Tālināt</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> — <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Atsvaidzināt</translation> <translation id="7188508872042490670">Vietnes dati ierīcē</translation> <translation id="7203150201908454328">Izvērsts</translation> +<translation id="7219254577985949841">Vai dzēst vietnes datus?</translation> <translation id="723171743924126238">Atlasīt attēlus</translation> <translation id="7243308994586599757">Opcijas, kas pieejamas ekrāna apakšējā daļā</translation> <translation id="7250468141469952378">Atlasīti vienumi: <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb index b45ca06..6a930e50 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mk.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Допрете за да се вратите на <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Врати</translation> <translation id="2091887806945687916">Звук</translation> +<translation id="2096716221239095980">Избриши ги сите податоци</translation> <translation id="2117655453726830283">Следен слајд</translation> <translation id="2148716181193084225">Денес</translation> <translation id="216989819110952009">Дури и со заштитени очи со помош на зелените очила, Дороти и нејзините пријатели беа маѓепсани првично од</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Дозволете локациите да зачувуваат и читаат податоци за колачињата (препорачано)</translation> <translation id="2932883381142163287">Пријави злоупотреба</translation> <translation id="2968755619301702150">Прикажувач на сертификат</translation> -<translation id="300526633675317032">Ова ќе ги избрише сите <ph name="SIZE_IN_KB" /> од просторот на веб-сајтот.</translation> <translation id="3008272652534848354">Ресетирај ги дозволите</translation> <translation id="301521992641321250">Автоматски блокирана</translation> <translation id="3069226013421428034">Дозволете најавување на трети лица за конкретен сајт.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Дозволено</translation> <translation id="429312253194641664">Сајтот репродуцира аудиовизуелни содржини</translation> <translation id="42981349822642051">Прошири</translation> -<translation id="4336434711095810371">Избриши ги сите податоци</translation> <translation id="4338831206024587507">Сите сајтови под <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Не дозволувај сајтовите да знаат кога активно го користам уредов</translation> <translation id="4412992751769744546">Дозволи колачиња од трети лица</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Се споделува екранот</translation> <translation id="5922967540311291836">Блокирајте колачиња од трети страни:</translation> <translation id="5939518447894949180">Ресетирај</translation> +<translation id="5964247741333118902">Вметнати содржини</translation> <translation id="5968921426641056619">Внесете интернет-адреса</translation> <translation id="5975083100439434680">Одзумирај</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Освежи</translation> <translation id="7188508872042490670">Податоци за сајт на уред</translation> <translation id="7203150201908454328">Проширено</translation> +<translation id="7219254577985949841">Да се избришат податоците од сајтот?</translation> <translation id="723171743924126238">Изберете слики</translation> <translation id="7243308994586599757">Достапни се опции на дното на екранот</translation> <translation id="7250468141469952378">Избрани ставки: <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb index cd148d8..67b0cb29 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ml.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> എന്നതിലേക്ക് മടങ്ങാൻ ടാപ്പ് ചെയ്യുക</translation> <translation id="2079545284768500474">പഴയപടിയാക്കുക</translation> <translation id="2091887806945687916">ശബ്ദം</translation> +<translation id="2096716221239095980">എല്ലാ ഡാറ്റയും ഇല്ലാതാക്കുക</translation> <translation id="2117655453726830283">അടുത്ത സ്ലൈഡ്</translation> <translation id="2148716181193084225">ഇന്ന്</translation> <translation id="216989819110952009">ഡോറോത്തിയും അവളുടെ സുഹൃത്തുക്കളും ധരിച്ചിരുന്ന പച്ചക്കണ്ണടകൾക്ക് പോലും ആ കാഴ്ചയുടെ തീക്ഷ്ണതയെ പ്രതിരോധിക്കാൻ കഴിഞ്ഞില്ല</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">കുക്കി ഡാറ്റ സംരക്ഷിക്കുന്നതിനും വായിക്കുന്നതിനും സൈറ്റുകളെ അനുവദിക്കുക (ശുപാർശചെയ്തത്)</translation> <translation id="2932883381142163287">ദുരുപയോഗം റിപ്പോര്ട്ട് ചെയ്യുക</translation> <translation id="2968755619301702150">സർട്ടിഫിക്കറ്റ് വ്യൂവർ</translation> -<translation id="300526633675317032">ഇത് വെബ്സൈറ്റ് സ്റ്റോറേജിലെ <ph name="SIZE_IN_KB" /> പൂർണ്ണമായും മായ്ക്കും.</translation> <translation id="3008272652534848354">അനുമതികൾ പുനഃസജ്ജീകരിക്കുക</translation> <translation id="301521992641321250">സ്വയമേവ ബ്ലോക്കുചെയ്തു</translation> <translation id="3069226013421428034">നിർദ്ദിഷ്ട സൈറ്റിനായി മൂന്നാം കക്ഷി സൈൻ ഇൻ അനുവദിക്കുക.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">അനുവദനീയം</translation> <translation id="429312253194641664">സൈറ്റ്, മീഡിയ പ്ലേ ചെയ്യുന്നു</translation> <translation id="42981349822642051">വികസിപ്പിക്കുക</translation> -<translation id="4336434711095810371">എല്ലാ ഡാറ്റയും മായ്ക്കുക</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> എന്നതിന് കീഴിലുള്ള എല്ലാ സൈറ്റുകളും</translation> <translation id="4402755511846832236">നിങ്ങൾ ഈ ഉപകരണം സജീവമായി ഉപയോഗിക്കുന്നത് അറിയുന്നതിൽ നിന്ന് സൈറ്റുകളെ ബ്ലോക്ക് ചെയ്യുന്നു</translation> <translation id="4412992751769744546">മൂന്നാം കക്ഷി കുക്കികളെ അനുവദിക്കുക</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">നിങ്ങളുടെ സ്ക്രീൻ പങ്കിടുന്നു</translation> <translation id="5922967540311291836">മൂന്നാം-കക്ഷി കുക്കികള് ബ്ലോക്ക് ചെയ്യുക:</translation> <translation id="5939518447894949180">റീസെറ്റ് ചെയ്യുക</translation> +<translation id="5964247741333118902">ഉൾച്ചേർത്ത ഉള്ളടക്കം</translation> <translation id="5968921426641056619">വെബ് വിലാസം നൽകുക</translation> <translation id="5975083100439434680">സൂം ഔട്ട് ചെയ്യുക</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">റീഫ്രഷ് ചെയ്യുക</translation> <translation id="7188508872042490670">ഉപകരണത്തിലുള്ള സൈറ്റ് ഡാറ്റ</translation> <translation id="7203150201908454328">വിപുലീകരിച്ചത്</translation> +<translation id="7219254577985949841">സൈറ്റ് ഡാറ്റ ഇല്ലാതാക്കണോ?</translation> <translation id="723171743924126238">ചിത്രങ്ങൾ തിരഞ്ഞെടുക്കുക</translation> <translation id="7243308994586599757">സ്ക്രീനിന്റെ ചുവടെ ഓപ്ഷനുകൾ ലഭ്യമാണ്</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> എണ്ണം തിരഞ്ഞെടുത്തു</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 471606f..dfac2888 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> руу буцах бол товшино уу</translation> <translation id="2079545284768500474">Буцаах</translation> <translation id="2091887806945687916">Дуу</translation> +<translation id="2096716221239095980">Бүх өгөгдлийг устгах</translation> <translation id="2117655453726830283">Дараагийн слайд</translation> <translation id="2148716181193084225">Өнөөдөр</translation> <translation id="216989819110952009">Дороти болон түүний нөхөд ногоон өнгийн шилээр нүдээ хамгаалсан байсан ч гайхамшигт хотын гялтганах гэрэлд нүд гялбаж байлаа.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Cookie data-г хадгалах мөн унших боломжийг сайтуудад олгох (зөвлөж байна)</translation> <translation id="2932883381142163287">Зөрчлийг мэдэгдэх</translation> <translation id="2968755619301702150">Сертификат харагч</translation> -<translation id="300526633675317032">Энэ нь веб хуудасны сангийн бүх <ph name="SIZE_IN_KB" />-г устгах болно.</translation> <translation id="3008272652534848354">Зөвшөөрлийг шинэчлэх</translation> <translation id="301521992641321250">Автоматаар блок хийсэн</translation> <translation id="3069226013421428034">Тодорхой сайтын гуравдагч талын нэвтрэлтийг зөвшөөрнө үү.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Зөвшөөрөгдсөн</translation> <translation id="429312253194641664">Сайт медиа тоглуулж байна</translation> <translation id="42981349822642051">Өргөтгөх</translation> -<translation id="4336434711095810371">Бүх өгөгдлийг устгах</translation> <translation id="4338831206024587507"><ph name="DOMAIN" />-н доорх бүх сайт</translation> <translation id="4402755511846832236">Сайтуудыг таныг энэ төхөөрөмжийг хэзээ идэвхтэй ашиглаж буйг мэдэхийг нь блоклоно</translation> <translation id="4412992751769744546">Гуравдагч этгээдийн cookies-г зөвшөөрөх</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Таны дэлгэцийг хуваалцаж байна</translation> <translation id="5922967540311291836">Гуравдагч талын күүкиг блоклох:</translation> <translation id="5939518447894949180">Дахин сэргээх</translation> +<translation id="5964247741333118902">Оруулсан контент</translation> <translation id="5968921426641056619">Веб хаяг оруулна уу</translation> <translation id="5975083100439434680">Багасгаж харах</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Дахин сэргээх</translation> <translation id="7188508872042490670">Төхөөрөмж дээрх сайтын өгөгдөл</translation> <translation id="7203150201908454328">Өргөтгөсөн</translation> +<translation id="7219254577985949841">Сайтын өгөгдлийг устгах уу?</translation> <translation id="723171743924126238">Зураг сонгох</translation> <translation id="7243308994586599757">Дэлгэцийн доод хэсэгт сонголт боломжтой</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" />-г сонгосон</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb index 86eb61a..0dc1cf1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_mr.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> वर परत जाण्यासाठी टॅप करा</translation> <translation id="2079545284768500474">पहिल्यासारखे करा</translation> <translation id="2091887806945687916">ध्वनी</translation> +<translation id="2096716221239095980">सर्व डेटा हटवा</translation> <translation id="2117655453726830283">पुढील स्लाइड</translation> <translation id="2148716181193084225">आज</translation> <translation id="216989819110952009">डोरोथी आणि तिच्या मित्रमैत्रिणींचे डोळे हिरव्या चष्म्याने झाकले असले तरीही अद्भुत शहराच्या झगमगाटाने ते चकित झाले</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">कुकी डेटा सेव्ह करणे आणि वाचण्यासाठी साइटना अनुमती द्या (शिफारस केलेले)</translation> <translation id="2932883381142163287">गैरवापराची तक्रार करा</translation> <translation id="2968755619301702150">सर्टिफिकेट दर्शक</translation> -<translation id="300526633675317032">हे सर्व <ph name="SIZE_IN_KB" /> वेबसाइट स्टोरेज साफ करेल.</translation> <translation id="3008272652534848354">परवानग्या रीसेट करा</translation> <translation id="301521992641321250">आपोआप ब्लॉक केलेले</translation> <translation id="3069226013421428034">विशिष्ट साइटसाठी तृतीय पक्ष साइन-इनला अनुमती द्या.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">अनुमत</translation> <translation id="429312253194641664">साइट मीडिया प्ले करत आहे</translation> <translation id="42981349822642051">विस्तृत करा</translation> -<translation id="4336434711095810371">सर्व डेटा साफ करा</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> अंतर्गत सर्व साइट</translation> <translation id="4402755511846832236">तुम्ही हे डिव्हाइस ॲक्टिव्हपणे कधी वापरता हे साइटना जाणून घेण्यापासून ब्लॉक करा</translation> <translation id="4412992751769744546">तृतीय-पक्ष कुकीजना अनुमती द्या</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">तुमची स्क्रीन शेअर करत आहे</translation> <translation id="5922967540311291836">तृतीय पक्ष कुकी ब्लॉक करा:</translation> <translation id="5939518447894949180">रीसेट करा</translation> +<translation id="5964247741333118902">एंबेड केलेला आशय</translation> <translation id="5968921426641056619">वेब अॅड्रेस एंटर करा</translation> <translation id="5975083100439434680">झूम कमी करा</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">रिफ्रेश करा</translation> <translation id="7188508872042490670">डिव्हाइसवरील साइट डेटा</translation> <translation id="7203150201908454328">विस्तृत केलेले</translation> +<translation id="7219254577985949841">साइट डेटा हटवायचा आहे का?</translation> <translation id="723171743924126238">इमेज निवडा</translation> <translation id="7243308994586599757">स्क्रीनच्या तळाशी पर्याय उपलब्ध आहेत</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> निवडले</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 313e29a..1ec90e4 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Ketik untuk kembali kepada <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Buat asal</translation> <translation id="2091887806945687916">Bunyi</translation> +<translation id="2096716221239095980">Padamkan semua data</translation> <translation id="2117655453726830283">Slaid seterusnya</translation> <translation id="2148716181193084225">Hari ini</translation> <translation id="216989819110952009">Walaupun dengan mata yang terlindung disebalik cermin mata berwarna hijau, pada mulanya Dorothy dan rakan-rakannya terpesona dengan</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Benarkan tapak untuk menyimpan dan membaca data kuki (disyorkan)</translation> <translation id="2932883381142163287">Laporkan penyalahgunaan</translation> <translation id="2968755619301702150">Pemapar sijil</translation> -<translation id="300526633675317032">Tindakan ini akan menghapuskan semua <ph name="SIZE_IN_KB" /> daripada storan laman web.</translation> <translation id="3008272652534848354">Tetapkan semula kebenaran</translation> <translation id="301521992641321250">Disekat secara automatik</translation> <translation id="3069226013421428034">Benarkan log masuk pihak ketiga untuk laman tertentu.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Dibenarkan</translation> <translation id="429312253194641664">Tapak sedang memainkan media</translation> <translation id="42981349822642051">Kembangkan</translation> -<translation id="4336434711095810371">Kosongkan semua data</translation> <translation id="4338831206024587507">Semua laman di bawah <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Sekat tapak daripada mengetahui waktu anda menggunakan peranti ini dengan aktif</translation> <translation id="4412992751769744546">Benarkan kuki pihak ketiga</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Berkongsi skrin anda</translation> <translation id="5922967540311291836">Sekat kuki pihak ketiga:</translation> <translation id="5939518447894949180">Tetapkan semula</translation> +<translation id="5964247741333118902">Kandungan terbenam</translation> <translation id="5968921426641056619">Masukkan alamat web</translation> <translation id="5975083100439434680">Zum keluar</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Muat semula</translation> <translation id="7188508872042490670">Data laman pada peranti</translation> <translation id="7203150201908454328">Diperluas</translation> +<translation id="7219254577985949841">Padamkan data laman?</translation> <translation id="723171743924126238">Pilih imej</translation> <translation id="7243308994586599757">Pilihan tersedia berhampiran bahagian bawah skrin</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> dipilih</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 41684ed..fb5ef126 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> သို့ပြန်သွားရန် တို့ပါ</translation> <translation id="2079545284768500474">တစ်ဆင့်နောက်ပြန်ရန်</translation> <translation id="2091887806945687916">အသံ</translation> +<translation id="2096716221239095980">ဒေတာအားလုံး ဖျက်ရန်</translation> <translation id="2117655453726830283">လာမည့်ဆလိုက်</translation> <translation id="2148716181193084225">ယနေ့</translation> <translation id="216989819110952009">မျက်လုံးများကို အစိမ်းရောင်မျက်မှန်ဖြင့် ကာကွယ်ထားသော်လည်း Dorothy နှင့် သူငယ်ချင်းများက အစပိုင်းတွင် မျက်စိကျိန်းသွားကြသည်</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">ဆိုဒ်များကို ကွက်ကီးများ ဖတ်ရန်နှင့် သိမ်းရန် ခွင့်ပြုသည် (အကြံပြုထား)</translation> <translation id="2932883381142163287">အလွဲသုံးစားပြုခြင်းအား အစီရင်ခံရန်</translation> <translation id="2968755619301702150">လက်မှတ်ကို ကြည့်ရှုသူ</translation> -<translation id="300526633675317032">၎င်းသည် ဝဘ်ဆိုက်သိုလှောင်ခန်း၏ <ph name="SIZE_IN_KB" /> ကို ရှင်းလင်းလိုက်ပါမည်။</translation> <translation id="3008272652534848354">ခွင့်ပြုချက်များကို ပြင်ဆင်သတ်မှတ်ရန်</translation> <translation id="301521992641321250">အလိုအလျောက် ပိတ်ထားသည်</translation> <translation id="3069226013421428034">သတ်မှတ်ဝဘ်ဆိုက်အတွက် ပြင်ပအဖွဲ့အစည်းသို့ လက်မှတ်ထိုးဝင်ခြင်းကို ခွင့်ပြုနိုင်သည်။</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ခွင့်ပြုထား</translation> <translation id="429312253194641664">ဝဘ်ဆိုက်တစ်ခုက မီဒီယာကို ဖွင့်နေသည်</translation> <translation id="42981349822642051">တိုးချဲ့</translation> -<translation id="4336434711095810371">ဒေတာအားလုံး ရှင်းထုတ်ရန်</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> အောက်ရှိ ဝဘ်ဆိုက်အားလုံး</translation> <translation id="4402755511846832236">ဤကိရိယာသုံးနေချိန်ကို ဝဘ်ဆိုက်များကသိခြင်းအား ပိတ်ထားရန်</translation> <translation id="4412992751769744546">တတိယပါတီ ကွတ်ကီးများ ခွင့်ပြု</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">သင့်ဖန်သားပြင်ကို မျှဝေနေသည်</translation> <translation id="5922967540311291836">ပြင်ပကုမ္ပဏီ၏ကွတ်ကီးများကို ပိတ်ထားခြင်း-</translation> <translation id="5939518447894949180">ပြင်ဆင်သတ်မှတ်ရန်</translation> +<translation id="5964247741333118902">မြှုပ်သွင်းထားသော အကြောင်းအရာ</translation> <translation id="5968921426641056619">ဝဘ်လိပ်စာထည့်ပါ</translation> <translation id="5975083100439434680">ဇူးမ်ဖြုတ်ရန်</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ပြန်လည်စတင်ရန်</translation> <translation id="7188508872042490670">စက်ပစ္စည်းပေါ်ရှိ ဝဘ်ဆိုက်ဒေတာ</translation> <translation id="7203150201908454328">တိုးချဲ့ထား</translation> +<translation id="7219254577985949841">ဝဘ်ဆိုက်ဒေတာ ဖျက်မလား။</translation> <translation id="723171743924126238">ပုံများကို ရွေးရန်</translation> <translation id="7243308994586599757">ရွေးစရာများမှာ မျက်နှာပြင်၏ အောက်ခြေပိုင်းနားမှာ ရှိကြသည်</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ခု ရွေးထားသည်</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb index c5e9f4b..cf00b4e 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ne.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> मा फर्कन ट्याप गर्नुहोस्</translation> <translation id="2079545284768500474">अन्डू गर्नुहोस्</translation> <translation id="2091887806945687916">आवाज</translation> +<translation id="2096716221239095980">सबै डेटा मेटाउनुहोस्</translation> <translation id="2117655453726830283">अर्को स्लाइड</translation> <translation id="2148716181193084225">आज</translation> <translation id="216989819110952009">डोरोथी र उनका साथीहरूले सुरक्षाका लागि आँखामा हरियो चस्मा लगाएका भए पनि उनीहरू सुरुमा निकै आश्चर्यचकित भए</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">साइटहरूलाई कुकी डेटा सुरक्षित गर्ने र पढ्ने अनुमति दिनुहोस् (सिफारिस गरिएको)</translation> <translation id="2932883381142163287">दुरूपयोग रिपोर्ट गर्नुहोस्</translation> <translation id="2968755619301702150">प्रमाणपत्र दर्शक</translation> -<translation id="300526633675317032">यसले वेबसाइटको भण्डारणको सबै <ph name="SIZE_IN_KB" /> खाली गर्ने छ।</translation> <translation id="3008272652534848354">अनुमतिहरू रिसेट गर्नुहोस्</translation> <translation id="301521992641321250">स्वतः रोक लगाइयो</translation> <translation id="3069226013421428034">निश्चित साइटमा तेस्रो पक्षको खातामार्फत साइन इन गर्न दिनुहोस्।</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">अनुमति प्राप्त</translation> <translation id="429312253194641664">कुनै साइटले मिडियो प्ले गरिरहेको छ</translation> <translation id="42981349822642051">विस्तृत गर्नुहोस्</translation> -<translation id="4336434711095810371">सबै डेटा मेटाउनुहोस्</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> अन्तर्गतका सबै साइटहरू</translation> <translation id="4402755511846832236">तपाईं यो डिभाइस चलाउँदै हुनुहुन्छ कि हुनुहुन्न भन्ने कुरा साइटहरूलाई थाहा पाउन नदिनुहोस्</translation> <translation id="4412992751769744546">तेस्रो पक्षीय कुकीहरूलाई अनुमति दिनुहोस्</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">तपाईंको स्क्रिन सेयर गर्दै</translation> <translation id="5922967540311291836">तेस्रो पक्षीय कुकीहरू ब्लक गरियोस्:</translation> <translation id="5939518447894949180">रिसेट गर्नुहोस्</translation> +<translation id="5964247741333118902">इम्बेड गरिएको सामग्री</translation> <translation id="5968921426641056619">वेब ठेगाना हाल्नुहोस्</translation> <translation id="5975083100439434680">जुम आउट</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />, <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ताजा गर्नुहोस्</translation> <translation id="7188508872042490670">डिभाइसमै सेभ गरिने साइट डेटा</translation> <translation id="7203150201908454328">विस्तारित</translation> +<translation id="7219254577985949841">साइट डेटा मेटाउने हो?</translation> <translation id="723171743924126238">फोटो चयन गर्नुहोस्</translation> <translation id="7243308994586599757">विकल्पहरू स्क्रिनको तल नजिकै उपलब्ध छ</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> चयन गरिए</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 fdcedf9b..63aeafde 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Tik om terug te gaan naar <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Ongedaan maken</translation> <translation id="2091887806945687916">Geluid</translation> +<translation id="2096716221239095980">Alle gegevens verwijderen</translation> <translation id="2117655453726830283">Volgende dia</translation> <translation id="2148716181193084225">Vandaag</translation> <translation id="216989819110952009">Hoewel hun ogen werden beschermd door de groene bril, werden Dorothy en haar vrienden eerst verblind door de</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Sites toestaan cookiegegevens op te slaan en te lezen (aanbevolen)</translation> <translation id="2932883381142163287">Misbruik melden</translation> <translation id="2968755619301702150">Certificaatviewer</translation> -<translation id="300526633675317032">Hiermee wordt de volledige <ph name="SIZE_IN_KB" /> aan site-opslag gewist.</translation> <translation id="3008272652534848354">Rechten resetten</translation> <translation id="301521992641321250">Automatisch geblokkeerd</translation> <translation id="3069226013421428034">Externe login toestaan voor een specifieke site.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Toegestaan</translation> <translation id="429312253194641664">Een site speelt media af</translation> <translation id="42981349822642051">Uitvouwen</translation> -<translation id="4336434711095810371">Alle gegevens wissen</translation> <translation id="4338831206024587507">Alle sites onder <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Voorkomen dat sites weten wanneer je dit apparaat actief gebruikt</translation> <translation id="4412992751769744546">Cookies van derden toestaan</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Je scherm delen</translation> <translation id="5922967540311291836">Cookies van derden blokkeren:</translation> <translation id="5939518447894949180">Resetten</translation> +<translation id="5964247741333118902">Ingesloten content</translation> <translation id="5968921426641056619">Webadres opgeven</translation> <translation id="5975083100439434680">Uitzoomen</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Vernieuwen</translation> <translation id="7188508872042490670">Sitegegevens op het apparaat</translation> <translation id="7203150201908454328">Uitgevouwen</translation> +<translation id="7219254577985949841">Sitegegevens verwijderen?</translation> <translation id="723171743924126238">Afbeeldingen selecteren</translation> <translation id="7243308994586599757">Opties beschikbaar onder aan het scherm</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> geselecteerd</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 15cff6db..bb0d9ba 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Trykk for å gå tilbake til <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Angre</translation> <translation id="2091887806945687916">Lyd</translation> +<translation id="2096716221239095980">Slett alle data</translation> <translation id="2117655453726830283">Neste lysbilde</translation> <translation id="2148716181193084225">I dag</translation> <translation id="216989819110952009">Selv om øynene deres var beskyttet av de grønne brillene, ble Dorothy og vennene hennes overveldet ved synet av</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Tillat at nettsteder lagrer og leser data i informasjonskapsler (anbefales)</translation> <translation id="2932883381142163287">Rapportér uriktig bruk</translation> <translation id="2968755619301702150">Visningsprogram for sertifikater</translation> -<translation id="300526633675317032">Dette sletter alle dataene (<ph name="SIZE_IN_KB" />) fra nettstedslagringen.</translation> <translation id="3008272652534848354">Tilbakestill tillatelser</translation> <translation id="301521992641321250">Automatisk blokkert</translation> <translation id="3069226013421428034">Tillat tredjepartspålogging for et bestemt nettsted.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Tillatt</translation> <translation id="429312253194641664">Et nettsted spiller av medier</translation> <translation id="42981349822642051">Vis</translation> -<translation id="4336434711095810371">Slett alle data</translation> <translation id="4338831206024587507">Alle nettsteder under <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Blokkér nettsteder fra å vite når du bruker denne enheten aktivt</translation> <translation id="4412992751769744546">Tillat informasjonskapsler fra tredjeparter</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Deler skjermen din</translation> <translation id="5922967540311291836">Blokker informasjonskapsler fra tredjeparter:</translation> <translation id="5939518447894949180">Tilbakestill</translation> +<translation id="5964247741333118902">Innebygd innhold</translation> <translation id="5968921426641056619">Skriv inn en nettadresse</translation> <translation id="5975083100439434680">Zoom ut</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Last inn på nytt</translation> <translation id="7188508872042490670">Nettstedsdata på enheten</translation> <translation id="7203150201908454328">Utvidet</translation> +<translation id="7219254577985949841">Vil du slette nettstedsdata?</translation> <translation id="723171743924126238">Velg bilder</translation> <translation id="7243308994586599757">Du finner alternativer ved bunnen av skjermen</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> er valgt</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 ebd543a..f27f810 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" />କୁ ଫେରିବା ପାଇଁ ଟାପ୍ କରନ୍ତୁ</translation> <translation id="2079545284768500474">ପୂର୍ବବତ୍</translation> <translation id="2091887806945687916">ଧ୍ୱନି</translation> +<translation id="2096716221239095980">ସମସ୍ତ ଡାଟାକୁ ଡିଲିଟ କରନ୍ତୁ</translation> <translation id="2117655453726830283">ପରବର୍ତ୍ତୀ ସ୍ଲାଇଡ</translation> <translation id="2148716181193084225">ଆଜି</translation> <translation id="216989819110952009">ଆଖିରେ ସବୁଜ ଚଷମା ପିନ୍ଧିଥିଲେ ସୁଦ୍ଧା ଡୋରୋଥି ଓ ତା’ ସାଙ୍ଗମାନେ ଏହା ଦ୍ୱାରା ପ୍ରଥମେ ଚକିତ ହୋଇଯାଇଥିଲେ</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">କୁକୀ ଡାଟାଗୁଡ଼ିକୁ ସେଭ୍ କରିବାକୁ ଏବଂ ପଢ଼ିବା ପାଇଁ ସାଇଟ୍ଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ (ସୁପାରିଶ୍ କରାଯାଇଛି)</translation> <translation id="2932883381142163287">ନିର୍ଯ୍ୟାତନାର ରିପୋର୍ଟ କରନ୍ତୁ</translation> <translation id="2968755619301702150">ସାର୍ଟିଫିକେଟ୍ ଭ୍ୟୁଅର୍</translation> -<translation id="300526633675317032">ଏହା ୱେବ୍ସାଇଟ୍ ଷ୍ଟୋରେଜ୍ର ସମସ୍ତ <ph name="SIZE_IN_KB" /> ଡାଟା ଖାଲି କରିବ।</translation> <translation id="3008272652534848354">ଅନୁମତି ରିସେଟ୍ କରନ୍ତୁ</translation> <translation id="301521992641321250">ସ୍ୱଚାଳିତ ଭାବେ ବ୍ଲକ୍ କରାଗଲା</translation> <translation id="3069226013421428034">ଏକ ନିର୍ଦ୍ଦିଷ୍ଟ ସାଇଟ ପାଇଁ ତୃତୀୟ ପକ୍ଷ ସାଇନ-ଇନକୁ ଅନୁମତି ଦିଅନ୍ତୁ।</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ଅନୁମୋଦିତ</translation> <translation id="429312253194641664">କୌଣସି ସାଇଟ୍ ମିଡିଆ ଚଲାଉଛି</translation> <translation id="42981349822642051">ପ୍ରସାରଣ କରନ୍ତୁ</translation> -<translation id="4336434711095810371">ସମସ୍ତ ଡାଟା ଖାଲି କରନ୍ତୁ</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> ଅଧୀନରେ ଥିବା ସମସ୍ତ ସାଇଟ</translation> <translation id="4402755511846832236">ଆପଣ କେତେବେଳେ ସକ୍ରିୟ ଭାବେ ଏହି ଡିଭାଇସକୁ ବ୍ୟବହାର କରୁଛନ୍ତି ତାହା ଜାଣିବାରୁ ସାଇଟଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="4412992751769744546">ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ଅନୁମତି ଦିଅନ୍ତୁ</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">ଆପଣଙ୍କ ସ୍କ୍ରିନ୍ ସେୟାର୍ କରାଯାଉଛି</translation> <translation id="5922967540311291836">ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ବ୍ଲକ କରନ୍ତୁ:</translation> <translation id="5939518447894949180">ପୁନଃସେଟ୍</translation> +<translation id="5964247741333118902">ଏମ୍ବେଡ କରାଯାଇଥିବା ବିଷୟବସ୍ତୁ</translation> <translation id="5968921426641056619">ୱେବ ଠିକଣା ଲେଖନ୍ତୁ</translation> <translation id="5975083100439434680">ଜୁମ୍ କମାନ୍ତୁ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ରିଫ୍ରେଶ୍</translation> <translation id="7188508872042490670">ଅନ-ଡିଭାଇସ ସାଇଟ ଡାଟା</translation> <translation id="7203150201908454328">ପ୍ରସାରିତ ହୋଇଛି</translation> +<translation id="7219254577985949841">ସାଇଟ ଡାଟା ଡିଲିଟ କରିବେ?</translation> <translation id="723171743924126238">ଛବିଗୁଡ଼ିକ ଚୟନ କରନ୍ତୁ</translation> <translation id="7243308994586599757">ସ୍କ୍ରିନ୍ର ନିମ୍ନରେ ବିକଳ୍ପଗୁଡ଼ିକ ଉପଲବ୍ଧ ଅଛି</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ଚୟନିତ</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 d35117c..df2cfd6 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> 'ਤੇ ਵਾਪਸ ਜਾਣ ਲਈ ਟੈਪ ਕਰੋ</translation> <translation id="2079545284768500474">ਅਣਕੀਤਾ ਕਰੋ</translation> <translation id="2091887806945687916">ਧੁਨੀ</translation> +<translation id="2096716221239095980">ਸਾਰਾ ਡਾਟਾ ਮਿਟਾਓ</translation> <translation id="2117655453726830283">ਅਗਲੀ ਸਲਾਈਡ</translation> <translation id="2148716181193084225">ਅੱਜ</translation> <translation id="216989819110952009">ਹਰੇ ਰੰਗ ਦੀਆਂ ਐਨਕਾਂ ਲਗਾ ਕੇ ਵੀ ਡੋਰਥੀ ਅਤੇ ਉਸ ਦੇ ਦੋਸਤ ਨਿਰਾਲੇ ਸ਼ਹਿਰ ਦੀ ਚਮਕ-ਦਮਕ ਦੇਖ ਕੇ ਹੈਰਾਨ ਸਨ।</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">ਸਾਈਟਾਂ ਨੂੰ ਕੁਕੀ ਡਾਟਾ ਰੱਖਿਅਤ ਕਰਨ ਅਤੇ ਪੜ੍ਹਨ ਦੀ ਇਜਾਜ਼ਤ ਦਿਓ (ਸਿਫ਼ਾਰਸ਼ੀ)</translation> <translation id="2932883381142163287">ਦੁਰਵਿਵਹਾਰ ਦੀ ਰਿਪੋਰਟ ਕਰੋ</translation> <translation id="2968755619301702150">ਪ੍ਰਮਾਣ-ਪੱਤਰ ਵਿਊਅਰ</translation> -<translation id="300526633675317032">ਇਸ ਨਾਲ ਵੈੱਬਸਾਈਟ ਸਟੋਰੇਜ ਦਾ ਸਾਰਾ <ph name="SIZE_IN_KB" /> ਡਾਟਾ ਕਲੀਅਰ ਹੋ ਜਾਵੇਗਾ।</translation> <translation id="3008272652534848354">ਇਜਾਜ਼ਤਾਂ ਰੀਸੈੱਟ ਕਰੋ</translation> <translation id="301521992641321250">ਸਵੈਚਲਿਤ ਤੌਰ 'ਤੇ ਬਲੌਕ ਕੀਤੀ ਗਈ</translation> <translation id="3069226013421428034">ਕਿਸੇ ਖਾਸ ਸਾਈਟ ਲਈ ਤੀਜੀ-ਧਿਰ ਦੇ ਸਾਈਨ-ਇਨ ਦੀ ਆਗਿਆ ਦਿਓ।</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ਆਗਿਆ ਦਿੱਤੀ</translation> <translation id="429312253194641664">ਕੋਈ ਸਾਈਟ ਮੀਡੀਆ ਫ਼ਾਈਲ ਨੂੰ ਚਲਾ ਰਹੀ ਹੈ</translation> <translation id="42981349822642051">ਵਿਸਤਾਰ ਕਰੋ</translation> -<translation id="4336434711095810371">ਸਾਰਾ ਡਾਟਾ ਕਲੀਅਰ ਕਰੋ</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> ਅਧੀਨ ਸਾਰੀਆਂ ਸਾਈਟਾਂ</translation> <translation id="4402755511846832236">ਸਾਈਟਾਂ ਨੂੰ ਇਹ ਜਾਣਨ ਤੋਂ ਰੋਕਣ ਲਈ ਬਲਾਕ ਕਰੋ ਕਿ ਤੁਸੀਂ ਕਿਰਿਆਸ਼ੀਲ ਤੌਰ 'ਤੇ ਇਸ ਡੀਵਾਈਸ ਦੀ ਵਰਤੋਂ ਕਦੋਂ ਕਰਦੇ ਹੋ</translation> <translation id="4412992751769744546">ਤੀਜੀ-ਪਾਰਟੀ ਕੁਕੀਜ਼ ਦੀ ਆਗਿਆ ਦਿਓ</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">ਤੁਹਾਡੀ ਸਕ੍ਰੀਨ ਸਾਂਝੀ ਕੀਤੀ ਜਾ ਰਹੀ ਹੈ</translation> <translation id="5922967540311291836">ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਲਾਕ ਕਰੋ:</translation> <translation id="5939518447894949180">ਰੀਸੈਟ ਕਰੋ</translation> +<translation id="5964247741333118902">ਜੋੜੀ ਗਈ ਸਮੱਗਰੀ</translation> <translation id="5968921426641056619">ਵੈੱਬ ਪਤਾ ਦਾਖਲ ਕਰੋ</translation> <translation id="5975083100439434680">ਜ਼ੂਮ ਘਟਾਓ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ਰਿਫ੍ਰੈਸ਼ ਕਰੋ</translation> <translation id="7188508872042490670">ਵਰਤੋਂਕਾਰ ਦੇ ਡੀਵਾਈਸ 'ਤੇ ਸਾਈਟ ਡਾਟਾ</translation> <translation id="7203150201908454328">ਵਿਸਤ੍ਰਿਤ</translation> +<translation id="7219254577985949841">ਕੀ ਸਾਈਟ ਡਾਟਾ ਮਿਟਾਉਣਾ ਹੈ?</translation> <translation id="723171743924126238">ਚਿੱਤਰ ਚੁਣੋ</translation> <translation id="7243308994586599757">ਵਿਕਲਪ ਸਕ੍ਰੀਨ ਦੇ ਹੇਠਲੇ ਪਾਸੇ ਦੇ ਕੋਲ ਉਪਲਬਧ ਹਨ</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ਨੂੰ ਚੁਣਿਆ ਗਿਆ</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 52436e9..6d70a247 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Kliknij, by wrócić na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Cofnij</translation> <translation id="2091887806945687916">Dźwięk</translation> +<translation id="2096716221239095980">Usuń wszystkie dane</translation> <translation id="2117655453726830283">Następny slajd</translation> <translation id="2148716181193084225">Dzisiaj</translation> <translation id="216989819110952009">Chociaż oczy ich osłaniały zielone okulary, Dorotę i jej przyjaciół po prostu oślepił przepych</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Zezwalaj witrynom na zapisywanie danych w plikach cookie i ich odczytywanie (zalecane)</translation> <translation id="2932883381142163287">Zgłoś nadużycie</translation> <translation id="2968755619301702150">Przeglądarka certyfikatów</translation> -<translation id="300526633675317032">Spowoduje to usunięcie <ph name="SIZE_IN_KB" /> danych witryn.</translation> <translation id="3008272652534848354">Zresetuj uprawnienia</translation> <translation id="301521992641321250">Automatycznie zablokowane</translation> <translation id="3069226013421428034">Zezwalanie na logowanie przez usługę zewnętrzną w określonej witrynie.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Dozwolone</translation> <translation id="429312253194641664">Strona odtwarza multimedia</translation> <translation id="42981349822642051">Rozwiń</translation> -<translation id="4336434711095810371">Wyczyść wszystkie dane</translation> <translation id="4338831206024587507">Wszystkie witryny w domenie <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Nie pozwalaj stronom sprawdzać, czy aktualnie używasz urządzenia</translation> <translation id="4412992751769744546">Zezwalaj na pliki cookie innych firm</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Udostępnianie ekranu</translation> <translation id="5922967540311291836">Blokuj pliki cookie innych firm:</translation> <translation id="5939518447894949180">Resetuj</translation> +<translation id="5964247741333118902">Umieszczona treść</translation> <translation id="5968921426641056619">Podaj adres internetowy</translation> <translation id="5975083100439434680">Pomniejsz</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Odśwież</translation> <translation id="7188508872042490670">Dane witryn na urządzeniu</translation> <translation id="7203150201908454328">Rozwinięty</translation> +<translation id="7219254577985949841">Usunąć dane witryny?</translation> <translation id="723171743924126238">Wybierz zdjęcia</translation> <translation id="7243308994586599757">Opcje dostępne u dołu ekranu</translation> <translation id="7250468141469952378">Wybrano <ph name="ITEM_COUNT" /></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 4b7c97a..efb74cd 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Toque para voltar para <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Desfazer</translation> <translation id="2091887806945687916">Som</translation> +<translation id="2096716221239095980">Excluir todos os dados</translation> <translation id="2117655453726830283">Próximo slide</translation> <translation id="2148716181193084225">Hoje</translation> <translation id="216989819110952009">Mesmo com os olhos protegidos pelos óculos verdes, Dorothy e seus amigos ficaram encantados pelo</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permitir que os sites salvem e leiam os dados de arquivos "cookies" - que armazenam temporariamente o que você visitou na rede. (Recomendado)</translation> <translation id="2932883381142163287">Denunciar abuso</translation> <translation id="2968755619301702150">Leitor de certificados</translation> -<translation id="300526633675317032">Essa ação vai apagar tudo, <ph name="SIZE_IN_KB" /> de dados de armazenamento de sites.</translation> <translation id="3008272652534848354">Redefinir permissões</translation> <translation id="301521992641321250">Bloqueada automaticamente</translation> <translation id="3069226013421428034">Permita o login de terceiros em um site específico.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Permitido</translation> <translation id="429312253194641664">Um site está com mídia aberta</translation> <translation id="42981349822642051">Expandir</translation> -<translation id="4336434711095810371">Limpar todos os dados</translation> <translation id="4338831206024587507">Todos os sites em <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Impedir que sites saibam quando você está usando este dispositivo</translation> <translation id="4412992751769744546">Permitir cookies de terceiros</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Compartilhando a tela</translation> <translation id="5922967540311291836">Bloquear cookies de terceiros:</translation> <translation id="5939518447894949180">Redefinir</translation> +<translation id="5964247741333118902">Conteúdo incorporado</translation> <translation id="5968921426641056619">Digite o endereço da Web</translation> <translation id="5975083100439434680">Diminuir zoom</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Atualizar</translation> <translation id="7188508872042490670">Dados do site no dispositivo</translation> <translation id="7203150201908454328">Expandido</translation> +<translation id="7219254577985949841">Excluir dados do site?</translation> <translation id="723171743924126238">Selecionar imagens</translation> <translation id="7243308994586599757">Opções disponíveis perto da parte inferior da tela</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> itens selecionados</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 ae02f2ec..f6f88f33 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Toque para voltar a <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Anular</translation> <translation id="2091887806945687916">Som</translation> +<translation id="2096716221239095980">Eliminar todos os dados</translation> <translation id="2117655453726830283">Diapositivo seguinte</translation> <translation id="2148716181193084225">Hoje</translation> <translation id="216989819110952009">Mesmo com os olhos protegidos pelos óculos verdes, Dorothy e os seus amigos ficaram ofuscados pelo</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permitir que os sites guardem e leiam dados de cookies (recomendado)</translation> <translation id="2932883381142163287">Denunciar abuso</translation> <translation id="2968755619301702150">Visualizador de certificados</translation> -<translation id="300526633675317032">Esta ação elimina os <ph name="SIZE_IN_KB" /> de armazenamento do Website.</translation> <translation id="3008272652534848354">Repor autorizações</translation> <translation id="301521992641321250">Bloqueada automaticamente</translation> <translation id="3069226013421428034">Permita o início de sessão de terceiros num site específico.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Permitido</translation> <translation id="429312253194641664">Um site está a reproduzir multimédia.</translation> <translation id="42981349822642051">Expandir</translation> -<translation id="4336434711095810371">Limpar todos os dados</translation> <translation id="4338831206024587507">Todos os sites em <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Impeça os sites de saberem quando está ativamente a utilizar este dispositivo.</translation> <translation id="4412992751769744546">Permitir cookies de terceiros</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Partilhar o ecrã</translation> <translation id="5922967540311291836">Bloqueie cookies de terceiros:</translation> <translation id="5939518447894949180">Repor</translation> +<translation id="5964247741333118902">Conteúdo incorporado</translation> <translation id="5968921426641056619">Introduza o endereço Web</translation> <translation id="5975083100439434680">Reduzir</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Atualizar</translation> <translation id="7188508872042490670">Dados de sites no dispositivo</translation> <translation id="7203150201908454328">Expandido</translation> +<translation id="7219254577985949841">Eliminar dados do site?</translation> <translation id="723171743924126238">Selecionar imagens</translation> <translation id="7243308994586599757">Opções disponíveis junto à parte inferior do ecrã</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selecionado(s).</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 9b0388f..8e03be4c 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Atinge pentru a reveni la <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Anulează</translation> <translation id="2091887806945687916">Sunet</translation> +<translation id="2096716221239095980">Șterge toate datele</translation> <translation id="2117655453726830283">Următorul slide</translation> <translation id="2148716181193084225">Astăzi</translation> <translation id="216989819110952009">Chiar și cu ochii ocrotiți de ochelarii verzi, Dorothy și prietenii ei erau orbiți de strălucirea</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Permite site-urilor să salveze și să citească datele asociate cookie-urilor (recomandat)</translation> <translation id="2932883381142163287">Raportează un abuz</translation> <translation id="2968755619301702150">Vizualizator de certificate</translation> -<translation id="300526633675317032">Astfel, se vor șterge <ph name="SIZE_IN_KB" /> din stocarea site-urilor.</translation> <translation id="3008272652534848354">Resetează permisiunile</translation> <translation id="301521992641321250">Blocată automat</translation> <translation id="3069226013421428034">Permite conectarea terță parte pentru un anumit site.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Se permite</translation> <translation id="429312253194641664">Un site redă fișiere media</translation> <translation id="42981349822642051">Extinde</translation> -<translation id="4336434711095810371">Șterge toate datele</translation> <translation id="4338831206024587507">Toate site-urile din <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Împiedică site-urile să detecteze când folosești activ dispozitivul</translation> <translation id="4412992751769744546">Permite cookie-urile terță parte</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Se permite accesul la ecran</translation> <translation id="5922967540311291836">Blochează cookie-urile terță parte:</translation> <translation id="5939518447894949180">Resetează</translation> +<translation id="5964247741333118902">Conținut încorporat</translation> <translation id="5968921426641056619">Introdu adresa web</translation> <translation id="5975083100439434680">Micșorează</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Actualizați</translation> <translation id="7188508872042490670">Date privind site-urile pe dispozitiv</translation> <translation id="7203150201908454328">Extins</translation> +<translation id="7219254577985949841">Ștergi datele privind site-ul?</translation> <translation id="723171743924126238">Selectează imagini</translation> <translation id="7243308994586599757">Opțiuni disponibile în partea de jos a ecranului</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> selectate</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 66852bc..8428f50c 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Нажмите, чтобы вернуться на страницу <ph name="URL_OF_THE_CURRENT_TAB" />.</translation> <translation id="2079545284768500474">Отмена</translation> <translation id="2091887806945687916">Звук</translation> +<translation id="2096716221239095980">Удалить все данные</translation> <translation id="2117655453726830283">Следующий слайд</translation> <translation id="2148716181193084225">Сегодня</translation> <translation id="216989819110952009">Даже в защитных очках Дороти и ее друзья были ослеплены блеском</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Разрешить сайтам сохранять и читать файлы cookie (рекомендуется)</translation> <translation id="2932883381142163287">Сообщить о нарушении</translation> <translation id="2968755619301702150">Просмотр сертификатов</translation> -<translation id="300526633675317032">Будут удалены все данные сайтов (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Сбросить все разрешения</translation> <translation id="301521992641321250">Заблокировано автоматически</translation> <translation id="3069226013421428034">Разрешить вход через сторонние сервисы для определенного сайта.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Разрешено</translation> <translation id="429312253194641664">На сайте воспроизводятся медиафайлы</translation> <translation id="42981349822642051">Развернуть</translation> -<translation id="4336434711095810371">Удалить все данные</translation> <translation id="4338831206024587507">Все сайты с доменом <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Блокировать передачу на сайты информации об использовании устройства</translation> <translation id="4412992751769744546">Разрешить использование сторонних файлов cookie</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Предоставлен доступ к вашему экрану</translation> <translation id="5922967540311291836">Блокировать сторонние файлы cookie</translation> <translation id="5939518447894949180">Сбросить</translation> +<translation id="5964247741333118902">Встроенный контент</translation> <translation id="5968921426641056619">Введите веб-адрес</translation> <translation id="5975083100439434680">Уменьшить</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Обновить</translation> <translation id="7188508872042490670">Данные сайтов, сохраненные на устройстве</translation> <translation id="7203150201908454328">Развернуто</translation> +<translation id="7219254577985949841">Удалить данные сайта?</translation> <translation id="723171743924126238">Выберите изображения</translation> <translation id="7243308994586599757">Доступные параметры указаны в нижней части экрана</translation> <translation id="7250468141469952378">Выбрано: <ph name="ITEM_COUNT" /></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 3858ec2..2c7093f1 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> වෙත ආපසු යාමට තට්ටු කරන්න</translation> <translation id="2079545284768500474">පසුගමනය</translation> <translation id="2091887806945687916">හඬ</translation> +<translation id="2096716221239095980">සියලු දත්ත මකන්න</translation> <translation id="2117655453726830283">මීළඟ ස්ලයිඩය</translation> <translation id="2148716181193084225">අද</translation> <translation id="216989819110952009">හරිත උපැස් යුවලෙන් ආරක්ෂා වූ දෑස්වලින් පවා ඩොරති සහ ඇගේ යෙහෙළියන් මුල දී විස්මයට පත් විය</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">අඩවි වලට කුකී දත්ත සුරැකීමට සහ කුකී දත්ත කියවන්න (නිර්දේශිතයි)</translation> <translation id="2932883381142163287">අපහරණය වාර්තා කරන්න</translation> <translation id="2968755619301702150">සහතික දක්වනය</translation> -<translation id="300526633675317032">මෙය වෙබ් අඩවි ආචයනයේ සියලු <ph name="SIZE_IN_KB" /> හිස් කරනු ඇත.</translation> <translation id="3008272652534848354">අවසර යළි සකසන්න</translation> <translation id="301521992641321250">ස්වයංක්රියව අවහිර කර ඇත</translation> <translation id="3069226013421428034">නිශ්චිත අඩවියක් සඳහා තෙවන පාර්ශ්ව පිරීම ඉඩ දෙන්න.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">ඉඩ දුන්</translation> <translation id="429312253194641664">වෙබ් අඩවියක් මාධ්ය ධාවන කරයි</translation> <translation id="42981349822642051">දිගහරින්න</translation> -<translation id="4336434711095810371">සියලු දත්ත හිස් කරන්න</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> යටතේ සියලු අඩවි</translation> <translation id="4402755511846832236">ඔබ මෙම උපාංගය සක්රියව භාවිත කරන විට දැන ගැනීමෙන් අඩවි අවහිර කරන්න</translation> <translation id="4412992751769744546">තෙවන පාර්ශව කුකී වලට ඉඩ දෙන්න</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">ඔබේ තිරය බෙදා ගැනීම</translation> <translation id="5922967540311291836">තෙවන පාර්ශ්ව කුකී අවහිර කරන්න:</translation> <translation id="5939518447894949180">නැවත සකසන්න</translation> +<translation id="5964247741333118902">කාවද්දන ලද අන්තර්ගතය</translation> <translation id="5968921426641056619">වෙබ් ලිපිනය ඇතුළු කරන්න</translation> <translation id="5975083100439434680">විශාලනය අඩු කරන්න</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">නැවුම් කරන්න</translation> <translation id="7188508872042490670">උපාංගය-මත අඩවි දත්ත</translation> <translation id="7203150201908454328">දිග හරින ලද</translation> +<translation id="7219254577985949841">අඩවි දත්ත මකන්නද?</translation> <translation id="723171743924126238">රූප තෝරන්න</translation> <translation id="7243308994586599757">තිරයේ පහළට ආසන්නව විකල්ප ලබා ගත හැකිය</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ක් තෝරන ලදී</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 be3f4a9f..bc46b3d0 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Klepnutím sa vrátite na kartu <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Späť</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="2096716221239095980">Odstrániť všetky údaje</translation> <translation id="2117655453726830283">Nasledujúca snímka</translation> <translation id="2148716181193084225">Dnes</translation> <translation id="216989819110952009">Lesk tohto nádherného mesta Dorotku a jej priateľov najskôr oslepoval, hoci mali na očiach zelené okuliare</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Povoliť webom ukladať a čítať súbory cookie (odporučané)</translation> <translation id="2932883381142163287">Nahlásiť zneužitie</translation> <translation id="2968755619301702150">Zobrazovač certifikátov</translation> -<translation id="300526633675317032">Vymažete celé úložisko webu (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Obnoviť povolenia</translation> <translation id="301521992641321250">Automaticky blokované</translation> <translation id="3069226013421428034">Na konkrétnom webe môžete povoliť prihlasovanie tretích strán.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Povolené</translation> <translation id="429312253194641664">Web prehráva médiá</translation> <translation id="42981349822642051">Rozbaliť</translation> -<translation id="4336434711095810371">Vymazať všetky dáta</translation> <translation id="4338831206024587507">Všetky weby v doméne <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Neumožniť webom zistiť, či aktívne používate toto zariadenie</translation> <translation id="4412992751769744546">Povoliť súbory cookie tretích strán</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Zdieľate obrazovku</translation> <translation id="5922967540311291836">Blokovať súbory cookie tretích strán:</translation> <translation id="5939518447894949180">Resetovať</translation> +<translation id="5964247741333118902">Vložený obsah</translation> <translation id="5968921426641056619">Zadajte webovú adresu</translation> <translation id="5975083100439434680">Oddialiť</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Obnoviť</translation> <translation id="7188508872042490670">Dáta webov v zariadení</translation> <translation id="7203150201908454328">Rozbalené</translation> +<translation id="7219254577985949841">Chcete odstrániť dáta webu?</translation> <translation id="723171743924126238">Výber obrázkov</translation> <translation id="7243308994586599757">Možnosti sú k dispozícii v dolnej časti obrazovky</translation> <translation id="7250468141469952378">Vybrané: <ph name="ITEM_COUNT" /></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 17d9d7b..ac860768 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Dotaknite se, če se želite vrniti na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Razveljavi</translation> <translation id="2091887806945687916">Zvok</translation> +<translation id="2096716221239095980">Izbriši vse podatke</translation> <translation id="2117655453726830283">Naslednji diapozitiv</translation> <translation id="2148716181193084225">Danes</translation> <translation id="216989819110952009">Kljub zelenim očalom za zaščito oči je Dorothy in njene prijatelje sprva zaslepilo</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Spletnim mestom dovoli shranjevanje in branje podatkov piškotkov (priporočljivo)</translation> <translation id="2932883381142163287">Prijavite zlorabo</translation> <translation id="2968755619301702150">Pregledovalnik potrdil</translation> -<translation id="300526633675317032">S tem bo izbrisanih vseh <ph name="SIZE_IN_KB" /> shranjenih podatkov spletnega mesta.</translation> <translation id="3008272652534848354">Ponastavi dovoljenja</translation> <translation id="301521992641321250">Samodejno blokirano</translation> <translation id="3069226013421428034">Omogočanje prijave prek zunanjih ponudnikov za določeno spletno mesto.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Dovoljeno</translation> <translation id="429312253194641664">Spletno mesto predvaja predstavnost</translation> <translation id="42981349822642051">Razširi</translation> -<translation id="4336434711095810371">Izbriši vse podatke</translation> <translation id="4338831206024587507">Vsa spletna mesta v domeni <ph name="DOMAIN" />.</translation> <translation id="4402755511846832236">Preprečevanje, da bi spletna mesta vedela, kdaj aktivno uporabljate to napravo.</translation> <translation id="4412992751769744546">Omogočanje piškotkov drugih spletnih mest</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Deljenje zaslona</translation> <translation id="5922967540311291836">Blokiranje piškotkov tretjih oseb:</translation> <translation id="5939518447894949180">Ponastavi</translation> +<translation id="5964247741333118902">Vdelana vsebina</translation> <translation id="5968921426641056619">Vnesite spletni naslov</translation> <translation id="5975083100439434680">Pomanjšaj</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Osveži</translation> <translation id="7188508872042490670">Podatki spletnih mest v napravi</translation> <translation id="7203150201908454328">Razširjeno</translation> +<translation id="7219254577985949841">Želite izbrisati podatke spletnega mesta?</translation> <translation id="723171743924126238">Izberite slike</translation> <translation id="7243308994586599757">Možnosti so na voljo pri dnu zaslona</translation> <translation id="7250468141469952378">Št. izbranih: <ph name="ITEM_COUNT" /></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 86f7063..8c06d21 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Trokit për t'u kthyer te <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Zhbëj</translation> <translation id="2091887806945687916">Tingulli</translation> +<translation id="2096716221239095980">Fshi të gjitha të dhënat</translation> <translation id="2117655453726830283">Diapozitivi tjetër</translation> <translation id="2148716181193084225">Sot</translation> <translation id="216989819110952009">Edhe pse mbanin syzet e gjelbra mbi sy, në fillim Dorotia dhe miqtë e saj u verbuan nga</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Lejo faqet të ruajnë dhe lexojnë të dhënat e kukive (rekomandohet)</translation> <translation id="2932883381142163287">Raporto abuzim</translation> <translation id="2968755619301702150">Shikuesi i certifikatave</translation> -<translation id="300526633675317032">Kjo do të pastrojë të gjitha <ph name="SIZE_IN_KB" /> të hapësirës ruajtëse të uebsajtit.</translation> <translation id="3008272652534848354">Rivendos autorizimet</translation> <translation id="301521992641321250">Bllokuar automatikisht</translation> <translation id="3069226013421428034">Lejo identifikimin e palëve të treta për një sajt specifik.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Të lejuara</translation> <translation id="429312253194641664">Një sajt po luan media</translation> <translation id="42981349822642051">Zgjero</translation> -<translation id="4336434711095810371">Pastro të gjitha të dhënat</translation> <translation id="4338831206024587507">Të gjitha sajtet nën domenin <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Blloko sajtet që të mos e dinë kur ti e përdor këtë pajisje në mënyrë aktive</translation> <translation id="4412992751769744546">Lejo kukit e palëve të treta</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Po ndan ekranin tënd</translation> <translation id="5922967540311291836">Blloko kukit e palëve të treta</translation> <translation id="5939518447894949180">Rivendos</translation> +<translation id="5964247741333118902">Përmbajtjet e integruara</translation> <translation id="5968921426641056619">Fut adresën e uebit</translation> <translation id="5975083100439434680">Zvogëlo</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Rifresko</translation> <translation id="7188508872042490670">Të dhënat e sajteve në pajisje</translation> <translation id="7203150201908454328">I zgjeruar</translation> +<translation id="7219254577985949841">Të fshihen të dhënat e sajtit?</translation> <translation id="723171743924126238">Zgjidh imazhet</translation> <translation id="7243308994586599757">Opsionet janë të disponueshme pranë fundit të ekranit</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> të zgjedhura</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 3da20f9..804abbf 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Dodirnite da biste se vratili na <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Opozovi</translation> <translation id="2091887806945687916">Zvuk</translation> +<translation id="2096716221239095980">Izbriši sve podatke</translation> <translation id="2117655453726830283">Sledeći slajd</translation> <translation id="2148716181193084225">Danas</translation> <translation id="216989819110952009">Iako su im oči bile zaštićene zelenim naočarima, Doroti i njene prijatelje u početku su zadivili</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Dozvoli sajtovima da čuvaju i čitaju podatke kolačića (preporučuje se)</translation> <translation id="2932883381142163287">Prijavi zloupotrebu</translation> <translation id="2968755619301702150">Prikazivač sertifikata</translation> -<translation id="300526633675317032">Ovim ćete obrisati ceo memorijski prostor veb-sajta od <ph name="SIZE_IN_KB" />.</translation> <translation id="3008272652534848354">Resetuj dozvole</translation> <translation id="301521992641321250">Automatski je blokirano</translation> <translation id="3069226013421428034">Dozvolite prijavljivanje trećih strana za određeni sajt.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Dozvoljeno</translation> <translation id="429312253194641664">Sajt pušta medijski sadržaj</translation> <translation id="42981349822642051">Proširite</translation> -<translation id="4336434711095810371">Obriši sve podatke</translation> <translation id="4338831206024587507">Svi sajtovi u okviru domena <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Ne dozvolite sajtovima da znaju kada aktivno koristite ovaj uređaj</translation> <translation id="4412992751769744546">Dozvoli kolačiće treće strane</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Deli se ekran</translation> <translation id="5922967540311291836">Blokirajte kolačiće trećih strana:</translation> <translation id="5939518447894949180">Resetuj</translation> +<translation id="5964247741333118902">Ugrađen sadržaj</translation> <translation id="5968921426641056619">Unesite veb-adresu</translation> <translation id="5975083100439434680">Umanjivanje</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Osveži</translation> <translation id="7188508872042490670">Podaci o sajtovima na uređaju</translation> <translation id="7203150201908454328">Prošireno</translation> +<translation id="7219254577985949841">Želite da izbrišete podatke sajta?</translation> <translation id="723171743924126238">Izaberite slike</translation> <translation id="7243308994586599757">Opcije su dostupne u dnu ekrana</translation> <translation id="7250468141469952378">Izabrali ste <ph name="ITEM_COUNT" /></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 69242ae..f408ca6 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Додирните да бисте се вратили на <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Опозови</translation> <translation id="2091887806945687916">Звук</translation> +<translation id="2096716221239095980">Избриши све податке</translation> <translation id="2117655453726830283">Следећи слајд</translation> <translation id="2148716181193084225">Данас</translation> <translation id="216989819110952009">Иако су им очи биле заштићене зеленим наочарима, Дороти и њене пријатеље у почетку су задивили</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Дозволи сајтовима да чувају и читају податке колачића (препоручује се)</translation> <translation id="2932883381142163287">Пријави злоупотребу</translation> <translation id="2968755619301702150">Приказивач сертификата</translation> -<translation id="300526633675317032">Овим ћете обрисати цео меморијски простор веб-сајта од <ph name="SIZE_IN_KB" />.</translation> <translation id="3008272652534848354">Ресетуј дозволе</translation> <translation id="301521992641321250">Аутоматски је блокирано</translation> <translation id="3069226013421428034">Дозволите пријављивање трећих страна за одређени сајт.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Дозвољено</translation> <translation id="429312253194641664">Сајт пушта медијски садржај</translation> <translation id="42981349822642051">Проширите</translation> -<translation id="4336434711095810371">Обриши све податке</translation> <translation id="4338831206024587507">Сви сајтови у оквиру домена <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Не дозволите сајтовима да знају када активно користите овај уређај</translation> <translation id="4412992751769744546">Дозволи колачиће треће стране</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Дели се екран</translation> <translation id="5922967540311291836">Блокирајте колачиће трећих страна:</translation> <translation id="5939518447894949180">Ресетуј</translation> +<translation id="5964247741333118902">Уграђен садржај</translation> <translation id="5968921426641056619">Унесите веб-адресу</translation> <translation id="5975083100439434680">Умањивање</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Освежи</translation> <translation id="7188508872042490670">Подаци о сајтовима на уређају</translation> <translation id="7203150201908454328">Проширено</translation> +<translation id="7219254577985949841">Желите да избришете податке сајта?</translation> <translation id="723171743924126238">Изаберите слике</translation> <translation id="7243308994586599757">Опције су доступне у дну екрана</translation> <translation id="7250468141469952378">Изабрали сте <ph name="ITEM_COUNT" /></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 0b7f2b7d..71a8171e 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Återgå till <ph name="URL_OF_THE_CURRENT_TAB" /> genom att trycka här</translation> <translation id="2079545284768500474">Ångra</translation> <translation id="2091887806945687916">Ljud</translation> +<translation id="2096716221239095980">Radera all data</translation> <translation id="2117655453726830283">Nästa bild</translation> <translation id="2148716181193084225">Idag</translation> <translation id="216989819110952009">Trots de skyddande gröna glasögonen blev Dorothy och hennes vänner först bländade av</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Tillåt att webbplatser sparar och läser cookiedata (rekommenderas)</translation> <translation id="2932883381142163287">Anmäl otillåten användning</translation> <translation id="2968755619301702150">Certifikatvisare</translation> -<translation id="300526633675317032">Det här alternativet tar bort alla <ph name="SIZE_IN_KB" /> webbplatslagring.</translation> <translation id="3008272652534848354">Återställ behörigheter</translation> <translation id="301521992641321250">Blockerades automatiskt</translation> <translation id="3069226013421428034">Tillåt inloggning hos tredje part på en viss webbplats.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Tillåts</translation> <translation id="429312253194641664">Media spelas upp på en webbplats</translation> <translation id="42981349822642051">Expandera</translation> -<translation id="4336434711095810371">Rensa all data</translation> <translation id="4338831206024587507">Alla webbplatser under <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Blockera webbplatser från att veta när du använder enheten aktivt</translation> <translation id="4412992751769744546">Tillåt cookies från tredje part</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Delar skärmen</translation> <translation id="5922967540311291836">Blockera cookies från tredje part</translation> <translation id="5939518447894949180">Återställ</translation> +<translation id="5964247741333118902">Inbäddat innehåll</translation> <translation id="5968921426641056619">Ange webbadress</translation> <translation id="5975083100439434680">Zooma ut</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Uppdatera</translation> <translation id="7188508872042490670">Webbplatsdata på enheten</translation> <translation id="7203150201908454328">Utökat</translation> +<translation id="7219254577985949841">Vill du radera webbplatsdata?</translation> <translation id="723171743924126238">Välj bilder</translation> <translation id="7243308994586599757">Alternativ visas nära skärmens nedre kant</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> har valts</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 4164ef80..c0b90af 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Gusa ili urudi kwenye <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Tendua</translation> <translation id="2091887806945687916">Sauti</translation> +<translation id="2096716221239095980">Futa data yote</translation> <translation id="2117655453726830283">Slaidi inayofuata</translation> <translation id="2148716181193084225">Leo</translation> <translation id="216989819110952009">Licha ya kuwa walivaa miwani ya kijani machoni Dorothy pamoja na marafiki zake kwanza kabisa walishangazwa na uzuri wa jiji la ajabu.</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Ruhusu tovuti zihifadhi na kusoma data ya vidakuzi (imependekezwa)</translation> <translation id="2932883381142163287">Ripoti matumizi mabaya</translation> <translation id="2968755619301702150">Kitazamaji vyeti</translation> -<translation id="300526633675317032">Hatua hii itafuta <ph name="SIZE_IN_KB" /> yote ya hifadhi ya tovuti.</translation> <translation id="3008272652534848354">Badilisha ruhusa</translation> <translation id="301521992641321250">Imezuiwa kiotomatiki</translation> <translation id="3069226013421428034">Ruhusu uingiaji wa wahusika wengine katika akaunti kwenye tovuti mahususi.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Imeruhusiwa</translation> <translation id="429312253194641664">Tovuti inacheza maudhui</translation> <translation id="42981349822642051">Panua</translation> -<translation id="4336434711095810371">Futa data yote</translation> <translation id="4338831206024587507">Tovuti zote zenye kikoa cha <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Zuia tovuti zisijue wakati unatumia kifaa hiki</translation> <translation id="4412992751769744546">Ruhusu vidakuzi vingine</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Inashiriki skrini yako</translation> <translation id="5922967540311291836">Kuzuia vidakuzi vya washirika wengine:</translation> <translation id="5939518447894949180">Weka upya</translation> +<translation id="5964247741333118902">Maudhui yaliyopachikwa</translation> <translation id="5968921426641056619">Weka anwani ya wavuti</translation> <translation id="5975083100439434680">Fifiza</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Onyesha upya</translation> <translation id="7188508872042490670">Data ya tovuti kwenye kifaa</translation> <translation id="7203150201908454328">Imepanuliwa</translation> +<translation id="7219254577985949841">Je, ungependa kufuta data ya tovuti?</translation> <translation id="723171743924126238">Chagua picha</translation> <translation id="7243308994586599757">Chaguo zinapatikana karibu na sehemu ya chini ya skrini</translation> <translation id="7250468141469952378">Umechagua <ph name="ITEM_COUNT" /></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 c07724a..db2f47e5 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" />க்குச் செல்ல, தட்டவும்</translation> <translation id="2079545284768500474">செயல்தவிர்</translation> <translation id="2091887806945687916">ஒலி</translation> +<translation id="2096716221239095980">அனைத்து தரவையும் நீக்கு</translation> <translation id="2117655453726830283">அடுத்த ஸ்லைடிற்குச் செல்லும்</translation> <translation id="2148716181193084225">இன்று</translation> <translation id="216989819110952009">டோரத்தியும்அவளது நண்பர்களும் பாதுகாப்பான பச்சை நிறக் கண்ணாடிகளை அணிந்திருந்தபோதும், முதல் பார்வையிலேயே எழில்கொஞ்சும் நகரத்தின் அழகில் மயங்கினர்</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">குக்கீத் தரவை, தளங்கள் சேமிக்கவும் படிக்கவும் அனுமதி (பரிந்துரைக்கப்பட்டது)</translation> <translation id="2932883381142163287">முறைகேடெனப் புகாரளி</translation> <translation id="2968755619301702150">சான்றிதழ் வியூவர்</translation> -<translation id="300526633675317032">இணையதளச் சேமிப்பகத்தில் உள்ள <ph name="SIZE_IN_KB" /> தரவையும் இது அழிக்கும்.</translation> <translation id="3008272652534848354">அனுமதிகளை மீட்டமை</translation> <translation id="301521992641321250">தானாகத் தடுக்கப்பட்டது</translation> <translation id="3069226013421428034">குறிப்பிட்ட தளத்திற்கு மூன்றாம் தரப்பு உள்நுழைவை அனுமதிக்கும்.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">அனுமதிக்கப்பட்டது</translation> <translation id="429312253194641664">ஒரு தளம் மீடியாவை இயக்குகிறது</translation> <translation id="42981349822642051">விரி</translation> -<translation id="4336434711095810371">அனைத்துத் தரவையும் அழி</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> டொமைனின் கீழே உள்ள அனைத்துத் தளங்கள்</translation> <translation id="4402755511846832236">இந்தச் சாதனத்தில் நீங்கள் செயலில் இருப்பது குறித்துத் தளங்கள் அறிந்துகொள்வதைத் தடுக்கும்</translation> <translation id="4412992751769744546">மூன்றாம் தரப்பு குக்கீகளை அனுமதி</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">உங்கள் திரையைப் பகிர்கிறது</translation> <translation id="5922967540311291836">மூன்றாம் தரப்புக் குக்கீகளைத் தடு:</translation> <translation id="5939518447894949180">மீட்டமை</translation> +<translation id="5964247741333118902">உட்பொதிக்கப்பட்ட உள்ளடக்கம்</translation> <translation id="5968921426641056619">வலை முகவரியை டைப் செய்யவும்</translation> <translation id="5975083100439434680">சிறிதாக்கு</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">புதுப்பி</translation> <translation id="7188508872042490670">சாதனத்தில் சேமிக்கப்பட்டுள்ள தளத் தரவு</translation> <translation id="7203150201908454328">விரிவாக்கப்பட்டது</translation> +<translation id="7219254577985949841">தளத் தரவை நீக்கவா?</translation> <translation id="723171743924126238">படங்களைத் தேர்ந்தெடுக்கவும்</translation> <translation id="7243308994586599757">திரையின் கீழ்ப்பகுதிக்கு அருகில் கிடைக்கும் விருப்பங்கள்</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> தேர்ந்தெடுக்கப்பட்டன</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb index 1929259..73d1548d 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_te.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" />కు తిరిగి వెళ్లడానికి ట్యాప్ చేయండి</translation> <translation id="2079545284768500474">చర్య రద్దు</translation> <translation id="2091887806945687916">ధ్వని</translation> +<translation id="2096716221239095980">మొత్తం డేటాను తొలగించండి</translation> <translation id="2117655453726830283">తర్వాతి స్లయిడ్</translation> <translation id="2148716181193084225">ఈ రోజు</translation> <translation id="216989819110952009">డోర్తీ, ఆమె స్నేహితులు తమ కళ్ళ రక్షణ కోసం ఆకు పచ్చ కళ్ళజోళ్ళు పెట్టుకున్నారు అయినా కూడా, కళ్లు మిరిమిట్లు గొలిపే ఆ అద్భుతం వారి కళ్లను కట్టిపడేసింది</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">కుక్కీ డేటాను సేవ్ చేయడానికి, చదవడానికి సైట్లను అనుమతిస్తుంది (సిఫార్సు చేయబడింది)</translation> <translation id="2932883381142163287">దుర్వినియోగాన్ని రిపోర్ట్ చేయి</translation> <translation id="2968755619301702150">ప్రమాణపత్రం వ్యూయర్</translation> -<translation id="300526633675317032">ఇది వెబ్సైట్ నిల్వలోని మొత్తం <ph name="SIZE_IN_KB" />ను తీసివేస్తుంది.</translation> <translation id="3008272652534848354">అనుమతులను రీసెట్ చేయండి</translation> <translation id="301521992641321250">ఆటోమేటిక్గా బ్లాక్ చేయబడింది</translation> <translation id="3069226013421428034">నిర్దిష్ట సైట్ కోసం థర్డ్-పార్టీ సైన్-ఇన్ను అనుమతిస్తుంది.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">అనుమతించబడింది</translation> <translation id="429312253194641664">ఒక సైట్లో మీడియా ప్లే చేయబడుతోంది</translation> <translation id="42981349822642051">విస్తరించు</translation> -<translation id="4336434711095810371">మొత్తం డేటాను క్లియర్ చేయండి</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> కింద ఉన్న అన్ని సైట్లు</translation> <translation id="4402755511846832236">మీరు ఈ పరికరాన్ని యాక్టివ్గా ఉపయోగిస్తున్నప్పుడు ఆ విషయాన్ని ఇతర సైట్లు తెలుసుకోకుండా బ్లాక్ చేయండి</translation> <translation id="4412992751769744546">థర్డ్ పార్టీ కుక్కీలను అనుమతించండి</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">మీ స్క్రీన్ను షేర్ చేయడం</translation> <translation id="5922967540311291836">థర్డ్-పార్టీ కుక్కీలను బ్లాక్ చేయండి:</translation> <translation id="5939518447894949180">రీసెట్ చేయండి</translation> +<translation id="5964247741333118902">పొందుపరచబడిన కంటెంట్</translation> <translation id="5968921426641056619">వెబ్ అడ్రస్ను ఎంటర్ చేయండి</translation> <translation id="5975083100439434680">దూరంగా జూమ్ చేయి</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">రిఫ్రెష్ చేయండి</translation> <translation id="7188508872042490670">పరికరంలో సైట్ డేటా</translation> <translation id="7203150201908454328">విస్తరించబడింది</translation> +<translation id="7219254577985949841">సైట్ డేటాను తొలగించాలా?</translation> <translation id="723171743924126238">చిత్రాలను ఎంచుకోండి</translation> <translation id="7243308994586599757">స్క్రీన్ దిగువభాగం సమీపంలో ఎంపికలు అందుబాటులో ఉంటాయి</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ఎంచుకోబడ్డాయి</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 1958158..e11e349 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">แตะเพื่อกลับไปที่ <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">เลิกทำ</translation> <translation id="2091887806945687916">เสียง</translation> +<translation id="2096716221239095980">ลบข้อมูลทั้งหมด</translation> <translation id="2117655453726830283">สไลด์ถัดไป</translation> <translation id="2148716181193084225">วันนี้</translation> <translation id="216989819110952009">แม้ว่าสีเขียวจะช่วยถนอมสายตาเวลามอง แต่ตอนแรก Dorothy และเพื่อนๆ ก็ยังรู้สึกตาลายโดย</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">อนุญาตให้เว็บไซต์บันทึกและอ่านข้อมูลคุกกี้ (แนะนำ)</translation> <translation id="2932883381142163287">รายงานการละเมิด</translation> <translation id="2968755619301702150">เครื่องมือดูใบรับรอง</translation> -<translation id="300526633675317032">การดำเนินการนี้จะล้างพื้นที่เก็บข้อมูลเว็บไซต์ทั้ง <ph name="SIZE_IN_KB" /></translation> <translation id="3008272652534848354">รีเซ็ตสิทธิ์</translation> <translation id="301521992641321250">ถูกบล็อกโดยอัตโนมัติ</translation> <translation id="3069226013421428034">อนุญาตการลงชื่อเข้าใช้ของบุคคลที่สามสำหรับบางเว็บไซต์</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">อนุญาตแล้ว</translation> <translation id="429312253194641664">เว็บไซต์กำลังเล่นสื่อ</translation> <translation id="42981349822642051">ขยาย</translation> -<translation id="4336434711095810371">ล้างข้อมูลทั้งหมด</translation> <translation id="4338831206024587507">ทุกเว็บไซต์ในโดเมน <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">บล็อกเว็บไซต์ไม่ให้ทราบเวลาที่คุณใช้งานอุปกรณ์นี้อยู่</translation> <translation id="4412992751769744546">อนุญาตคุกกี้ของบุคคลที่สาม</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">กำลังแชร์หน้าจอ</translation> <translation id="5922967540311291836">บล็อกคุกกี้ของบุคคลที่สาม:</translation> <translation id="5939518447894949180">รีเซ็ต</translation> +<translation id="5964247741333118902">เนื้อหาที่ฝัง</translation> <translation id="5968921426641056619">ป้อนที่อยู่เว็บ</translation> <translation id="5975083100439434680">ย่อ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">รีเฟรช</translation> <translation id="7188508872042490670">ข้อมูลเว็บไซต์ในอุปกรณ์</translation> <translation id="7203150201908454328">ขยาย</translation> +<translation id="7219254577985949841">ลบข้อมูลเว็บไซต์ใช่ไหม</translation> <translation id="723171743924126238">เลือกภาพ</translation> <translation id="7243308994586599757">มีตัวเลือกอยู่ทางด้านล่างของหน้าจอ</translation> <translation id="7250468141469952378">เลือกไว้ <ph name="ITEM_COUNT" /> รายการ</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb index ba199a2..c40a608 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_tr.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> sekmesine dönmek için dokunun</translation> <translation id="2079545284768500474">Geri al</translation> <translation id="2091887806945687916">Ses</translation> +<translation id="2096716221239095980">Tüm verileri sil</translation> <translation id="2117655453726830283">Sonraki slayt</translation> <translation id="2148716181193084225">Bugün</translation> <translation id="216989819110952009">Gözlüklerin korumasına rağmen Dorothy ve arkadaşlarının, bu harika şehrin güzelliği karşısında gözleri kamaştı</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Sitelerin, çerez verilerini kaydetmelerine ve okumalarına izin ver (önerilir)</translation> <translation id="2932883381142163287">Kötüye kullanım bildir</translation> <translation id="2968755619301702150">Sertifika görüntüleyici</translation> -<translation id="300526633675317032">Bu işlem <ph name="SIZE_IN_KB" /> olan web sitesi depolama alanının tamamını temizleyecek.</translation> <translation id="3008272652534848354">İzinleri sıfırla</translation> <translation id="301521992641321250">Otomatik olarak engellendi</translation> <translation id="3069226013421428034">Belirli bir sitede üçüncü taraf oturum açmaya izin verin.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">İzin veriliyor</translation> <translation id="429312253194641664">Bir site medya oynatıyor</translation> <translation id="42981349822642051">Genişlet</translation> -<translation id="4336434711095810371">Tüm verileri temizle</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> altındaki tüm siteler</translation> <translation id="4402755511846832236">Bu cihazı etkin olarak kullandığınızda sitelerin bunu bilmesi engellenir</translation> <translation id="4412992751769744546">Üçüncü taraf çerezlerine izin ver</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Ekranınız paylaşılıyor</translation> <translation id="5922967540311291836">Üçüncü taraf çerezlerini engelle:</translation> <translation id="5939518447894949180">Sıfırla</translation> +<translation id="5964247741333118902">Yerleştirilmiş içerik</translation> <translation id="5968921426641056619">Web adresini girin</translation> <translation id="5975083100439434680">Uzaklaştır</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Yenile</translation> <translation id="7188508872042490670">Cihaz üzerindeki site verileri</translation> <translation id="7203150201908454328">Genişletilmiş</translation> +<translation id="7219254577985949841">Site verileri silinsin mi?</translation> <translation id="723171743924126238">Resim seç</translation> <translation id="7243308994586599757">Sayfanın altına yakın bir yerde kullanılabilen seçenekler</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> öğe seçildi</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 9f09896..2827930 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
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Натисніть, щоб повернутися на сторінку <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Відмінити</translation> <translation id="2091887806945687916">Звук</translation> +<translation id="2096716221239095980">Видалити всі дані</translation> <translation id="2117655453726830283">Наступний слайд</translation> <translation id="2148716181193084225">Сьогодні</translation> <translation id="216989819110952009">Навіть попри захист зелених окулярів Дороті та її друзі були приголомшені сяйвом</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Дозволити сайтам зберігати та розпізнавати дані файлів cookie (рекомендується)</translation> <translation id="2932883381142163287">Повідомити про порушення</translation> <translation id="2968755619301702150">Перегляд сертифікатів</translation> -<translation id="300526633675317032">Буде видалено всі дані сайтів (<ph name="SIZE_IN_KB" />).</translation> <translation id="3008272652534848354">Скинути дозволи</translation> <translation id="301521992641321250">Блокується автоматично</translation> <translation id="3069226013421428034">Дозволити вхід через сторонні сервіси для певного сайту.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Дозволено</translation> <translation id="429312253194641664">Сайт відтворює медіа-вміст</translation> <translation id="42981349822642051">Розгорнути</translation> -<translation id="4336434711095810371">Видалити всі дані</translation> <translation id="4338831206024587507">Усі сайти домену <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Блокувати сайтам інформацію про те, чи ви активно використовуєте цей пристрій</translation> <translation id="4412992751769744546">Дозволити сторонні файли cookie</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Доступ до вашого екрана</translation> <translation id="5922967540311291836">Блокувати сторонні файли cookie:</translation> <translation id="5939518447894949180">Скинути</translation> +<translation id="5964247741333118902">Вбудований контент</translation> <translation id="5968921426641056619">Введіть веб-адресу</translation> <translation id="5975083100439434680">Зменшити масштаб</translation> <translation id="5976059395673079613">"<ph name="PERMISSION" />" – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Оновити</translation> <translation id="7188508872042490670">Дані сайтів на пристрої</translation> <translation id="7203150201908454328">Розгорнуто</translation> +<translation id="7219254577985949841">Видалити дані сайту?</translation> <translation id="723171743924126238">Вибрати зображення</translation> <translation id="7243308994586599757">Опції можна знайти внизу екрана</translation> <translation id="7250468141469952378">Вибрано <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb index 067f635..d5e5827 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_ur.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> پر واپس جانے کے لیے تھپتھپائیں</translation> <translation id="2079545284768500474">کالعدم کریں</translation> <translation id="2091887806945687916">آواز</translation> +<translation id="2096716221239095980">سبھی ڈیٹا حذف کریں</translation> <translation id="2117655453726830283">اگلی سلائیڈ</translation> <translation id="2148716181193084225">آج</translation> <translation id="216989819110952009">یہاں تک کہ سبز چشموں سے محفوظ آنکھوں کے ساتھ ڈوروتھی اور اس کے دوست شروعات میں اسے دیکھ کر حیران رہ گئے</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">سائٹس کو کوکی ڈیٹا کو محفوظ کرنے اور پڑھنے کی اجازت دیں (تجویز کردہ)</translation> <translation id="2932883381142163287">بیجا استعمال کی اطلاع دیں</translation> <translation id="2968755619301702150">سرٹیفیکیٹ ناظر</translation> -<translation id="300526633675317032">اس سے ویب سائٹ اسٹوریج کا کُل <ph name="SIZE_IN_KB" /> صاف ہو جائے گا۔</translation> <translation id="3008272652534848354">اجازتیں دوبارہ ترتیب دیں</translation> <translation id="301521992641321250">خود کار طور پر مسدود ہو گيا</translation> <translation id="3069226013421428034">کسی مخصوص سائٹ کیلئے فریق ثالث سائن ان کی اجازت دیں۔</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">اجازت یافتہ</translation> <translation id="429312253194641664">سائٹ پر میڈیا چل رہا ہے</translation> <translation id="42981349822642051">پھیلائیں</translation> -<translation id="4336434711095810371">سبھی ڈیٹا صاف کریں</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> کے ماتحت سبھی سائٹس</translation> <translation id="4402755511846832236">کب آپ فعال طور پر اس آلہ کا استعمال کر رہے ہیں اس کا پتہ لگانے سے سائٹس کو مسدود کریں</translation> <translation id="4412992751769744546">فریق ثالث کی کوکیز کی اجازت دیں</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">آپ کی اسکرین کا اشتراک کیا جا رہا ہے</translation> <translation id="5922967540311291836">فریق ثالث کوکیز کو مسدود کریں:</translation> <translation id="5939518447894949180">دوبارہ ترتیب دیں</translation> +<translation id="5964247741333118902">سرایت کردہ مواد</translation> <translation id="5968921426641056619">ویب پتہ درج کریں</translation> <translation id="5975083100439434680">زوم آؤٹ کریں</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">ریفریش کریں</translation> <translation id="7188508872042490670">آلہ پر موجود سائٹ کا ڈیٹا</translation> <translation id="7203150201908454328">توسیع کردہ</translation> +<translation id="7219254577985949841">سائٹ ڈیٹا کو حذف کریں؟</translation> <translation id="723171743924126238">تصاویر منتخب کریں</translation> <translation id="7243308994586599757">اسکرین کے نچلے حصہ کے قریب اختیارات دستیاب ہیں</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> منتخب ہو گئے</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb index 61519065..51e19df 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_uz.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672"><ph name="URL_OF_THE_CURRENT_TAB" /> sahifasiga qaytish uchun bosing</translation> <translation id="2079545284768500474">Bekor qilish</translation> <translation id="2091887806945687916">Tovush</translation> +<translation id="2096716221239095980">Hammasini oʻchirish</translation> <translation id="2117655453726830283">Keyingi slayd</translation> <translation id="2148716181193084225">Bugun</translation> <translation id="216989819110952009">Doroti va uning doʻstlari boshida hatto himoya koʻzoynagi bilan ham koʻra olmas edi</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Saytlarga cookie-fayllarini saqlash va o’qishga ruxsat berish (tavsiya etiladi)</translation> <translation id="2932883381142163287">Shikoyat xabari yuborish</translation> <translation id="2968755619301702150">Sertifikatlarni ko‘rish vositasi</translation> -<translation id="300526633675317032">Veb-sayt xotirasidan <ph name="SIZE_IN_KB" /> tozalanadi.</translation> <translation id="3008272652534848354">Ruxsatlarni qasliga qaytarish</translation> <translation id="301521992641321250">Avtomatik bloklangan</translation> <translation id="3069226013421428034">Muayyan sayt uchun tashqi xizmatga kirishga ruxsat bering.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Berilgan ruxsatnomalar</translation> <translation id="429312253194641664">Saytda media-fayl ijro etilmoqda</translation> <translation id="42981349822642051">Kengaytirish</translation> -<translation id="4336434711095810371">Barcha maʼlumotlarni tozalash</translation> <translation id="4338831206024587507">Barcha saytlar <ph name="DOMAIN" /> ostida</translation> <translation id="4402755511846832236">Bu qurilmadan foydalanish axborotlarini saytlar bilishini taqiqlash</translation> <translation id="4412992751769744546">Tashqi saytlarga cookie fayllarni saqlashga ruxsat berish</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Ekran namoyish qilinmoqda</translation> <translation id="5922967540311291836">Tashqi cookie fayllarni bloklash:</translation> <translation id="5939518447894949180">Asliga qaytarish</translation> +<translation id="5964247741333118902">Joylashtirilgan kontent</translation> <translation id="5968921426641056619">Veb-manzilni kiriting</translation> <translation id="5975083100439434680">Kichiklashtirish</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Yangilash</translation> <translation id="7188508872042490670">Qurilmada saqlangan sayt maʼlumotlari</translation> <translation id="7203150201908454328">Yoyilgan</translation> +<translation id="7219254577985949841">Sayt maʼlumotlari oʻchirilsinmi?</translation> <translation id="723171743924126238">Tasvirni tanlang</translation> <translation id="7243308994586599757">Parametrlar ekranning quyi qismiga yaqinroq joyda</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> ta element tanlandi</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb index 0f5702c..595a9ded 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_vi.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Nhấn để quay lại <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Hoàn tác</translation> <translation id="2091887806945687916">Âm thanh</translation> +<translation id="2096716221239095980">Xoá mọi dữ liệu</translation> <translation id="2117655453726830283">Trang trình bày tiếp theo</translation> <translation id="2148716181193084225">Hôm nay</translation> <translation id="216989819110952009">Ngay cả khi đôi mắt được bảo vệ bởi cặp kính xanh lục, thoạt tiên Dorothy và bạn bè vẫn cảm thấy loá mắt bởi</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Cho phép các trang web lưu và đọc dữ liệu cookie (nên chọn)</translation> <translation id="2932883381142163287">Báo cáo lạm dụng</translation> <translation id="2968755619301702150">Trình xem chứng chỉ</translation> -<translation id="300526633675317032">Thao tác này sẽ xóa tất cả <ph name="SIZE_IN_KB" /> bộ nhớ trang web.</translation> <translation id="3008272652534848354">Đặt lại quyền</translation> <translation id="301521992641321250">Tự động bị chặn</translation> <translation id="3069226013421428034">Cho phép bên thứ ba đăng nhập đối với một trang web cụ thể.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Được cho phép</translation> <translation id="429312253194641664">Một trang web đang phát nội dung đa phương tiện</translation> <translation id="42981349822642051">Mở rộng</translation> -<translation id="4336434711095810371">Xóa tất cả dữ liệu</translation> <translation id="4338831206024587507">Tất cả trang web thuộc <ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Không cho các trang web biết khi bạn đang dùng thiết bị này</translation> <translation id="4412992751769744546">Cho phép cookie của bên thứ ba</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Đang chia sẻ màn hình của bạn</translation> <translation id="5922967540311291836">Chặn cookie của bên thứ ba:</translation> <translation id="5939518447894949180">Đặt lại</translation> +<translation id="5964247741333118902">Nội dung được nhúng</translation> <translation id="5968921426641056619">Nhập địa chỉ web</translation> <translation id="5975083100439434680">Thu nhỏ</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> – <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Làm mới</translation> <translation id="7188508872042490670">Dữ liệu trang web</translation> <translation id="7203150201908454328">Được mở rộng</translation> +<translation id="7219254577985949841">Xoá dữ liệu trang web?</translation> <translation id="723171743924126238">Chọn hình ảnh</translation> <translation id="7243308994586599757">Có các tùy chọn ở gần cuối màn hình</translation> <translation id="7250468141469952378">Đã chọn <ph name="ITEM_COUNT" /></translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb index 65572f81..de9e4ff1 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-CN.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">点按即可返回到 <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">撤消</translation> <translation id="2091887806945687916">声音</translation> +<translation id="2096716221239095980">删除所有数据</translation> <translation id="2117655453726830283">下一张幻灯片</translation> <translation id="2148716181193084225">今天</translation> <translation id="216989819110952009">尽管有绿色眼镜保护着眼睛,桃乐丝和她的朋友们在刚看到这座奇妙的城市时,还是被它耀眼的光芒照得眼花缭乱</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">允许网站保存和读取 Cookie 数据(推荐)</translation> <translation id="2932883381142163287">举报滥用行为</translation> <translation id="2968755619301702150">证书查看器</translation> -<translation id="300526633675317032">这会清除全部的网站存储数据 (<ph name="SIZE_IN_KB" />)。</translation> <translation id="3008272652534848354">重置权限</translation> <translation id="301521992641321250">已被自动禁止</translation> <translation id="3069226013421428034">允许使用第三方账号登录特定网站。</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">允许</translation> <translation id="429312253194641664">某个网站正在播放媒体内容</translation> <translation id="42981349822642051">展开</translation> -<translation id="4336434711095810371">清除所有数据</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> 下的所有网站</translation> <translation id="4402755511846832236">禁止网站了解您何时在主动使用此设备</translation> <translation id="4412992751769744546">允许第三方 Cookie</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">正在共享您的屏幕</translation> <translation id="5922967540311291836">阻止第三方 Cookie:</translation> <translation id="5939518447894949180">重置</translation> +<translation id="5964247741333118902">嵌入式内容</translation> <translation id="5968921426641056619">输入网址</translation> <translation id="5975083100439434680">缩小</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">刷新</translation> <translation id="7188508872042490670">设备端网站数据</translation> <translation id="7203150201908454328">已展开</translation> +<translation id="7219254577985949841">删除网站数据?</translation> <translation id="723171743924126238">选择图片</translation> <translation id="7243308994586599757">选项在靠近屏幕底部的位置</translation> <translation id="7250468141469952378">已选择 <ph name="ITEM_COUNT" /> 项</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb index d4c1d515..f9cacca4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-HK.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">輕按即可返回 <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">復原</translation> <translation id="2091887806945687916">音效</translation> +<translation id="2096716221239095980">刪除所有資料</translation> <translation id="2117655453726830283">下一張投影片</translation> <translation id="2148716181193084225">今天</translation> <translation id="216989819110952009">即使有綠色眼鏡保護眼睛,這座奇妙之城的璀璨光輝一開始還是讓桃樂絲和朋友看得眼都花了</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">允許網站儲存及讀取 Cookie 資料 (建議)</translation> <translation id="2932883381142163287">舉報濫用</translation> <translation id="2968755619301702150">憑證檢視者</translation> -<translation id="300526633675317032">這會將網站儲存空間的 <ph name="SIZE_IN_KB" /> 資料全部清除。</translation> <translation id="3008272652534848354">重設權限</translation> <translation id="301521992641321250">已自動封鎖</translation> <translation id="3069226013421428034">允許特定網站使用第三方登入功能。</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">已允許</translation> <translation id="429312253194641664">網站正在播放媒體</translation> <translation id="42981349822642051">展開</translation> -<translation id="4336434711095810371">清除所有資料</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> 下的所有網站</translation> <translation id="4402755511846832236">禁止網站取得此裝置的使用狀態</translation> <translation id="4412992751769744546">允許第三方 Cookie</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">正在分享螢幕畫面</translation> <translation id="5922967540311291836">封鎖第三方 Cookie:</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5964247741333118902">已嵌入的內容</translation> <translation id="5968921426641056619">輸入網址</translation> <translation id="5975083100439434680">縮小</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">重新整理</translation> <translation id="7188508872042490670">裝置上的網站資料</translation> <translation id="7203150201908454328">已展開</translation> +<translation id="7219254577985949841">要刪除網站資料嗎?</translation> <translation id="723171743924126238">選取圖片</translation> <translation id="7243308994586599757">您可在畫面底部附近找到選項</translation> <translation id="7250468141469952378">揀咗 <ph name="ITEM_COUNT" /> 個</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb index 190fa1a..9d0c0dc4 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zh-TW.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">輕觸即可返回 <ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">復原</translation> <translation id="2091887806945687916">音訊</translation> +<translation id="2096716221239095980">刪除所有資料</translation> <translation id="2117655453726830283">下一張投影片</translation> <translation id="2148716181193084225">今天</translation> <translation id="216989819110952009">即使配戴著綠色眼鏡保護雙眼,這座美麗城市閃耀的光芒還是令桃樂絲和她的朋友們目眩神迷</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">允許網站儲存及讀取 Cookie 資料 (建議)</translation> <translation id="2932883381142163287">檢舉濫用情形</translation> <translation id="2968755619301702150">憑證檢視器</translation> -<translation id="300526633675317032">這會將網站儲存的資料全部清除 (共 <ph name="SIZE_IN_KB" />)。</translation> <translation id="3008272652534848354">重設權限</translation> <translation id="301521992641321250">已自動封鎖</translation> <translation id="3069226013421428034">允許特定網站使用第三方登入功能。</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">允許</translation> <translation id="429312253194641664">一個網站正在播放媒體內容</translation> <translation id="42981349822642051">展開</translation> -<translation id="4336434711095810371">清除所有資料</translation> <translation id="4338831206024587507"><ph name="DOMAIN" /> 底下的所有網站</translation> <translation id="4402755511846832236">禁止網站取得這部裝置的使用狀態</translation> <translation id="4412992751769744546">允許第三方 Cookie</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">正在分享你的螢幕畫面</translation> <translation id="5922967540311291836">封鎖第三方 Cookie:</translation> <translation id="5939518447894949180">重設</translation> +<translation id="5964247741333118902">嵌入的內容</translation> <translation id="5968921426641056619">輸入網址</translation> <translation id="5975083100439434680">縮小</translation> <translation id="5976059395673079613"><ph name="PERMISSION" /> - <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">重新整理</translation> <translation id="7188508872042490670">網站在裝置端的資料</translation> <translation id="7203150201908454328">已展開</translation> +<translation id="7219254577985949841">要刪除網站資料嗎?</translation> <translation id="723171743924126238">選取圖片</translation> <translation id="7243308994586599757">選項在接近畫面底部的位置</translation> <translation id="7250468141469952378">已選取 <ph name="ITEM_COUNT" /> 個項目</translation>
diff --git a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb index 02bbe64..84e89fd 100644 --- a/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb +++ b/components/browser_ui/strings/android/translations/browser_ui_strings_zu.xtb
@@ -55,6 +55,7 @@ <translation id="2030769033451695672">Thepha ukubuyela ku-<ph name="URL_OF_THE_CURRENT_TAB" /></translation> <translation id="2079545284768500474">Hlehlisa</translation> <translation id="2091887806945687916">Umsindo</translation> +<translation id="2096716221239095980">Sula yonke idatha</translation> <translation id="2117655453726830283">Islayidi esilandelayo</translation> <translation id="2148716181193084225">Namhlanje</translation> <translation id="216989819110952009">Ngisho nangamehlo avikelwe yizibuko eziluhlaza u-Dorothy nabangane bakhe baqale bamangazwa yi-</translation> @@ -115,7 +116,6 @@ <translation id="2913331724188855103">Vumela amasayithi ukulondoloza nokufunda idatha yamakhukhi (kunconyiwe)</translation> <translation id="2932883381142163287">Bika ukuhlukumeza</translation> <translation id="2968755619301702150">Isibukeli sesitifiketi</translation> -<translation id="300526633675317032">Lokhu kuzosula yonke i-<ph name="SIZE_IN_KB" /> yesitoreji sewebhusayithi.</translation> <translation id="3008272652534848354">Setha kabusha izimvume</translation> <translation id="301521992641321250">Kuvinjelwe ngokuzenzakalelayo</translation> <translation id="3069226013421428034">Vumela ukungena ngemvume kwenkampani yangaphandle kusayithi elithile.</translation> @@ -192,7 +192,6 @@ <translation id="4278390842282768270">Kuvunyelwe</translation> <translation id="429312253194641664">Isayithi lidlala imidiya</translation> <translation id="42981349822642051">Nweba</translation> -<translation id="4336434711095810371">Sula yonke idatha</translation> <translation id="4338831206024587507">Wonke amasayithi angaphansi kwe-<ph name="DOMAIN" /></translation> <translation id="4402755511846832236">Vimbela amasayithi ukuthi azi lapho usebenzisa le divayisi</translation> <translation id="4412992751769744546">Vumela amakhukhi wezinkampani zangaphandle</translation> @@ -283,6 +282,7 @@ <translation id="5922853908706496913">Yabelana ngesikrini sakho</translation> <translation id="5922967540311291836">Vimba amakhukhi angahlangene ngqo:</translation> <translation id="5939518447894949180">Setha kabusha</translation> +<translation id="5964247741333118902">Okuqukethwe okushumekiwe</translation> <translation id="5968921426641056619">Faka ikheli lewebhu</translation> <translation id="5975083100439434680">Hlehlisa isithombe</translation> <translation id="5976059395673079613"><ph name="PERMISSION" />, <ph name="WARNING_MESSAGE" /></translation> @@ -351,6 +351,7 @@ <translation id="7180611975245234373">Qala kabusha</translation> <translation id="7188508872042490670">Idatha yesayithi ekudivayisi</translation> <translation id="7203150201908454328">Inwetshiwe</translation> +<translation id="7219254577985949841">Sula idatha yesayithi?</translation> <translation id="723171743924126238">Khetha izithombe</translation> <translation id="7243308994586599757">Izinketho ziyatholakala eduze kwangaphansi kwesikrini</translation> <translation id="7250468141469952378"><ph name="ITEM_COUNT" /> kukhethiwe</translation>
diff --git a/components/browsing_data_strings.grdp b/components/browsing_data_strings.grdp index 794842e..02b883563 100644 --- a/components/browsing_data_strings.grdp +++ b/components/browsing_data_strings.grdp
@@ -31,6 +31,15 @@ <message name="IDS_DEL_CACHE_COUNTER_ALMOST_EMPTY_BASIC" desc="A counter showing that the user's cache is almost empty and explaining that the cache is used to speed up the loading of websites."> Frees up less than 1 MB. Some sites may load more slowly on your next visit. </message> + <message name="IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED" desc="A counter showing the size of the users's cache on the Advanced Clear browsing data dialog. The value (e.g. '328 MB') will be substituted. It also explains that the cache is used to speed up the loading of websites."> + <ph name="SIZE">$1<ex>328 MB</ex></ph>. Some sites may load more slowly on your next visit. + </message> + <message name="IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_UPPER_ESTIMATE" desc="A counter showing that the user has less than X megabytes of cache on the Advanced Clear browsing data dialog. The value X will be substituted. It also explains that the cache is used to speed up the loading of websites."> + Less than <ph name="UPPER_ESTIMATE">$1<ex>328 MB</ex></ph>. Some sites may load more slowly on your next visit. + </message> + <message name="IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_ALMOST_EMPTY" desc="A counter showing that the user's cache is almost empty, having less than 1 MB of data, on the Advanced Clear browsing data dialog. It also explains that the cache is used to speed up the loading of websites."> + Less than 1 MB. Some sites may load more slowly on your next visit. + </message> <message name="IDS_DEL_PASSWORDS_COUNTER" desc="A counter showing how many passwords the user has. The list of example domains associated with the user's passwords is denoted by the placeholder DOMAIN_LIST."> {COUNT, plural, =0 {None} @@ -149,6 +158,12 @@ =1 {From 1 site (you won't be signed out of your Google Account)} other {From # sites (you won't be signed out of your Google Account)}} </message> + <message name="IDS_ANDROID_DEL_COOKIES_COUNTER_ADVANCED" desc="A counter showing the number of sites that use cookies on the advanced Clear browsing data screen on Android. It also explains that deleting these cookies will sign you out of most sites."> + {COUNT, plural, + =0 {None} + =1 {From 1 site. Signs you out of most sites. } + other {From # sites. Signs you out of most sites. }} + </message> <message name="IDS_DEL_DOWNLOADS_COUNTER" desc="A counter showing how many items of downloads history the user has."> {COUNT, plural, =0 {None}
diff --git a/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED.png.sha1 b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED.png.sha1 new file mode 100644 index 0000000..e147fc3 --- /dev/null +++ b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED.png.sha1
@@ -0,0 +1 @@ +32be234164f338952e01adef6ff3457bf0cd1026 \ No newline at end of file
diff --git a/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_ALMOST_EMPTY.png.sha1 b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_ALMOST_EMPTY.png.sha1 new file mode 100644 index 0000000..1a4ea6b3 --- /dev/null +++ b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_ALMOST_EMPTY.png.sha1
@@ -0,0 +1 @@ +a70bf843ca779f092a5294671cc95b058d68a8b0 \ No newline at end of file
diff --git a/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_UPPER_ESTIMATE.png.sha1 b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_UPPER_ESTIMATE.png.sha1 new file mode 100644 index 0000000..dd54507 --- /dev/null +++ b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_CACHE_COUNTER_ADVANCED_UPPER_ESTIMATE.png.sha1
@@ -0,0 +1 @@ +908085f7d5a8124e2c39842afe3e9d4cee67d7ed \ No newline at end of file
diff --git a/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_COOKIES_COUNTER_ADVANCED.png.sha1 b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_COOKIES_COUNTER_ADVANCED.png.sha1 new file mode 100644 index 0000000..e147fc3 --- /dev/null +++ b/components/browsing_data_strings_grdp/IDS_ANDROID_DEL_COOKIES_COUNTER_ADVANCED.png.sha1
@@ -0,0 +1 @@ +32be234164f338952e01adef6ff3457bf0cd1026 \ No newline at end of file
diff --git a/components/certificate_transparency/data/log_list.json b/components/certificate_transparency/data/log_list.json index 8344927c..9fcbb3a5 100644 --- a/components/certificate_transparency/data/log_list.json +++ b/components/certificate_transparency/data/log_list.json
@@ -1,6 +1,6 @@ { - "version": "25.13", - "log_list_timestamp": "2023-10-01T12:57:43Z", + "version": "25.14", + "log_list_timestamp": "2023-10-02T12:53:53Z", "operators": [ { "name": "Google",
diff --git a/components/commerce/core/parcel/parcels_manager.cc b/components/commerce/core/parcel/parcels_manager.cc index da426caf..2556bb4 100644 --- a/components/commerce/core/parcel/parcels_manager.cc +++ b/components/commerce/core/parcel/parcels_manager.cc
@@ -4,6 +4,8 @@ #include "components/commerce/core/parcel/parcels_manager.h" +#include <set> + #include "base/functional/bind.h" #include "base/time/clock.h" #include "base/time/default_clock.h" @@ -32,13 +34,33 @@ return result; } -bool HasParcelsToRefresh( +bool IsParcelDone(const parcel_tracking_db::ParcelTrackingContent& tracking) { + ParcelStatus::ParcelState parcel_state = + tracking.parcel_status().parcel_state(); + switch (parcel_state) { + case ParcelStatus::PICKED_UP: + case ParcelStatus::FINISHED: + case ParcelStatus::CANCELLED: + case ParcelStatus::RETURN_COMPLETED: + return true; + default: + return false; + } +} + +std::vector<ParcelIdentifier> GetParcelIdentifiersToRefresh( base::Clock* clock, const std::vector<parcel_tracking_db::ParcelTrackingContent>& parcel_trackings) { base::Time now = clock->Now(); + std::vector<ParcelIdentifier> identifiers; + bool has_parcel_to_update = false; for (const auto& tracking : parcel_trackings) { + if (IsParcelDone(tracking)) { + continue; + } + identifiers.emplace_back(tracking.parcel_status().parcel_identifier()); base::TimeDelta since_last_update = now - base::Time::FromDeltaSinceWindowsEpoch( base::Microseconds(tracking.last_update_time_usec())); @@ -47,13 +69,17 @@ tracking.parcel_status().estimated_delivery_time_usec())); if (time_to_deliver < kAboutToDeliverThreshold) { if (since_last_update >= kRefreshIntervalForAboutToDeliver) { - return true; + has_parcel_to_update = true; } } else if (since_last_update >= kDefaultRefreshInterval) { - return true; + has_parcel_to_update = true; } } - return false; + // Return all parcels that are not yet finished. + if (has_parcel_to_update) { + return identifiers; + } + return std::vector<ParcelIdentifier>(); } std::unique_ptr<std::vector<ParcelStatus>> @@ -67,14 +93,33 @@ return ret; } +std::unique_ptr<std::vector<ParcelTrackingStatus>> UpdateStoredParcelStatus( + const std::vector<ParcelStatus>& stored_parcel_status, + const std::vector<ParcelStatus>& parcel_status_to_update) { + auto result = std::make_unique<std::vector<ParcelTrackingStatus>>(); + std::set<std::pair<ParcelIdentifier::Carrier, std::string>> identifiers; + for (const auto& status : parcel_status_to_update) { + result->emplace_back(status); + identifiers.emplace(status.parcel_identifier().carrier(), + status.parcel_identifier().tracking_id()); + } + for (const auto& status : stored_parcel_status) { + if (!identifiers.contains( + std::make_pair(status.parcel_identifier().carrier(), + status.parcel_identifier().tracking_id()))) { + result->emplace_back(status); + } + } + return result; +} + } // namespace ParcelsManager::ParcelsManager( signin::IdentityManager* identity_manager, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>* - parcel_tracking_proto_db, - AccountChecker* account_checker) + parcel_tracking_proto_db) : clock_(base::DefaultClock::GetInstance()), parcels_server_proxy_( std::make_unique<ParcelsServerProxy>(identity_manager, @@ -179,7 +224,9 @@ } // Refresh all parcel status if one of them needs update. - if (!HasParcelsToRefresh(clock_, *parcel_trackings)) { + std::vector<ParcelIdentifier> identifiers_to_refresh = + GetParcelIdentifiersToRefresh(clock_, *parcel_trackings); + if (identifiers_to_refresh.empty()) { auto tracking_statuses = std::make_unique<std::vector<ParcelTrackingStatus>>(); for (const auto& tracking : *parcel_trackings) { @@ -193,12 +240,8 @@ auto parcel_status = ConvertParcelTrackingContentsToParcelStatuses(*parcel_trackings); - std::vector<ParcelIdentifier> identifiers; - for (auto& status : *parcel_status) { - identifiers.emplace_back(status.parcel_identifier()); - } parcels_server_proxy_->GetParcelStatus( - std::move(identifiers), + std::move(identifiers_to_refresh), base::BindOnce(&ParcelsManager::OnGetParcelStatusDone, weak_ptr_factory_.GetWeakPtr(), std::move(parcel_status), storage_status_ == StorageInitializationStatus::kSuccess, @@ -229,24 +272,14 @@ std::unique_ptr<std::vector<ParcelStatus>> new_parcel_status) { DCHECK(is_processing_pending_operations_); - // If network request fails, fallback to stored parcel status. - std::vector<ParcelStatus>* status_to_return; - if (success) { - status_to_return = new_parcel_status.get(); - } else { - status_to_return = stored_parcel_status.get(); - } - - auto result = std::make_unique<std::vector<ParcelTrackingStatus>>(); - for (auto& status : *status_to_return) { - result->emplace_back(status); - } + // Merge stored parcel status with the server status. + auto result = + UpdateStoredParcelStatus(*stored_parcel_status, *new_parcel_status); // Update the database. if (success) { - auto& status_to_update = *new_parcel_status; // TODO(qinmin): Check if we need to handle storage update failure. - parcels_storage_->UpdateParcelStatus(status_to_update, + parcels_storage_->UpdateParcelStatus(*new_parcel_status, base::DoNothingAs<void(bool)>()); }
diff --git a/components/commerce/core/parcel/parcels_manager.h b/components/commerce/core/parcel/parcels_manager.h index 7d51fae..3ddbf58 100644 --- a/components/commerce/core/parcel/parcels_manager.h +++ b/components/commerce/core/parcel/parcels_manager.h
@@ -30,7 +30,6 @@ } // namespace signin namespace commerce { -class AccountChecker; class ParcelsServerProxy; class ParcelsStorage; @@ -41,8 +40,7 @@ signin::IdentityManager* identity_manager, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>* - parcel_tracking_proto_db, - AccountChecker* account_checker); + parcel_tracking_proto_db); // Ctor used for testing purposes. ParcelsManager(std::unique_ptr<ParcelsServerProxy> parcels_server_proxy, std::unique_ptr<ParcelsStorage> parcels_storage,
diff --git a/components/commerce/core/parcel/parcels_manager_unittest.cc b/components/commerce/core/parcel/parcels_manager_unittest.cc index c5cb95c..ecd399c 100644 --- a/components/commerce/core/parcel/parcels_manager_unittest.cc +++ b/components/commerce/core/parcel/parcels_manager_unittest.cc
@@ -337,12 +337,45 @@ run_loop.Run(); } +TEST_F(ParcelsManagerTest, TestGetAllParcelStatuses_LocalStorageHasDoneStatus) { + EXPECT_CALL(*mock_storage_, Init(_)).Times(1); + mock_storage_->MockGetAllParcelTrackingContents(kTestTrackingId, + ParcelStatus::PICKED_UP); + mock_server_proxy_->MockParcelStatusResponses(true, kTestTrackingId, + ParcelStatus::PICKED_UP); + mock_storage_->MockInitCallback(true); + + // Advance clock by 1 day. + clock_.Advance(base::Days(1)); + EXPECT_CALL(*mock_server_proxy_, GetParcelStatus(_, _)).Times(0); + EXPECT_CALL(*mock_storage_, GetAllParcelTrackingContents()).Times(1); + EXPECT_CALL(*mock_storage_, UpdateParcelStatus(_, _)).Times(0); + base::RunLoop run_loop; + parcels_manager_->GetAllParcelStatuses(base::BindOnce( + [](base::RunLoop* run_loop, bool success, + std::unique_ptr<std::vector<ParcelTrackingStatus>> parcel_status) { + ASSERT_TRUE(success); + ASSERT_EQ(1, static_cast<int>(parcel_status->size())); + auto status = (*parcel_status)[0]; + ASSERT_EQ(kTestTrackingId, status.tracking_id); + ASSERT_EQ(commerce::ParcelIdentifier::UPS, status.carrier); + ASSERT_EQ(ParcelStatus::PICKED_UP, status.state); + run_loop->Quit(); + }, + &run_loop)); + run_loop.Run(); +} + TEST_F(ParcelsManagerTest, TestGetAllParcelStatuses_ServerError) { EXPECT_CALL(*mock_storage_, Init(_)).Times(1); mock_storage_->MockGetAllParcelTrackingContents(kTestTrackingId, ParcelStatus::NEW); - mock_server_proxy_->MockParcelStatusResponses(false, kTestTrackingId, - ParcelStatus::PICKED_UP); + ON_CALL(*mock_server_proxy_, GetParcelStatus) + .WillByDefault([](const std::vector<ParcelIdentifier>& parcel_identifiers, + ParcelsServerProxy::GetParcelStatusCallback callback) { + std::move(callback).Run( + false, std::make_unique<std::vector<commerce::ParcelStatus>>()); + }); mock_storage_->MockInitCallback(true); clock_.Advance(base::Days(1));
diff --git a/components/commerce/core/parcel/parcels_server_proxy.cc b/components/commerce/core/parcel/parcels_server_proxy.cc index 0d94311b..a9ce118 100644 --- a/components/commerce/core/parcel/parcels_server_proxy.cc +++ b/components/commerce/core/parcel/parcels_server_proxy.cc
@@ -47,7 +47,7 @@ const char kParcelIdentifierKey[] = "parcelIdentifier"; const char kParcelStateKey[] = "parcelState"; const char kTrackingUrlKey[] = "trackingUrl"; -const char kEstimatedDeliveryTimeUsecKey[] = "estimatedDeliveryTimeUsec"; +const char kEstimatedDeliveryDateKey[] = "estimatedDeliveryDate"; const char kSourcePageDomainKey[] = "sourcePageDomain"; constexpr net::NetworkTrafficAnnotationTag @@ -244,8 +244,8 @@ } auto* tracking_url = value_dict.FindString(kTrackingUrlKey); - auto estimated_delivery_time_usec = - base::ValueToInt64(value_dict.Find(kEstimatedDeliveryTimeUsecKey)); + auto* estimated_delivery_date = + value_dict.FindString(kEstimatedDeliveryDateKey); ParcelStatus status; auto* identifier = status.mutable_parcel_identifier(); identifier->set_tracking_id(*tracking_id); @@ -256,9 +256,15 @@ if (tracking_url) { status.set_tracking_url(*tracking_url); } - if (estimated_delivery_time_usec) { - status.set_estimated_delivery_time_usec( - estimated_delivery_time_usec.value()); + if (estimated_delivery_date) { + // Serialize the string to base::Time so that it is easier for UI to format + // localized string. + base::Time time_to_deliver; + if (base::Time::FromString(estimated_delivery_date->c_str(), + &time_to_deliver)) { + status.set_estimated_delivery_time_usec( + time_to_deliver.ToDeltaSinceWindowsEpoch().InMicroseconds()); + } } return absl::make_optional<ParcelStatus>(status); }
diff --git a/components/commerce/core/parcel/parcels_server_proxy_unittest.cc b/components/commerce/core/parcel/parcels_server_proxy_unittest.cc index f69adb6..5e374ec 100644 --- a/components/commerce/core/parcel/parcels_server_proxy_unittest.cc +++ b/components/commerce/core/parcel/parcels_server_proxy_unittest.cc
@@ -10,6 +10,7 @@ #include "base/run_loop.h" #include "base/test/gtest_util.h" #include "base/test/task_environment.h" +#include "base/time/time.h" #include "components/commerce/core/commerce_constants.h" #include "components/commerce/core/parcel/parcels_server_proxy.h" #include "components/commerce/core/proto/parcel.pb.h" @@ -39,7 +40,7 @@ const std::string kResponseSucceeded = "{ \"parcelStatus\": [{\"parcelIdentifier\": {\"trackingId\": \"xyz\"," "\"carrier\": 1}, \"parcelState\": 2, \"trackingUrl\": \"www.foo.com\"," - "\"estimatedDeliveryTimeUsec\": \"1000\"}]}"; + "\"estimatedDeliveryDate\": \"2023-10-11\"}]}"; const std::string kExpectedStartTrackingPostData = "{\"parcelIds\":[{\"carrier\":2,\"trackingId\":\"xyz\"}]," "\"sourcePageDomain\":\"www.abc.com\"}"; @@ -47,7 +48,6 @@ const std::string kTestTrackingId = "xyz"; const std::string kTestSourcePageDomain = "www.abc.com"; const std::string kDeleteHttpMethod = "DELETE"; -} // namespace std::vector<commerce::ParcelIdentifier> GetTestParcelIdentifiers() { commerce::ParcelIdentifier identifier; @@ -56,6 +56,14 @@ return std::vector<commerce::ParcelIdentifier>{identifier}; } +int64_t GetExpectedDeliveryTimeUsec() { + base::Time delivery; + CHECK(base::Time::FromString("11-OCT-2023 00:00:00", &delivery)); + return delivery.ToDeltaSinceWindowsEpoch().InMicroseconds(); +} + +} // namespace + namespace commerce { class MockParcelsServerProxy : public ParcelsServerProxy { @@ -121,7 +129,8 @@ auto status = (*parcel_status)[0]; ASSERT_EQ(ParcelStatus::PICKED_UP, status.parcel_state()); ASSERT_EQ(kTestTrackingUrl, status.tracking_url()); - ASSERT_EQ(1000, status.estimated_delivery_time_usec()); + ASSERT_EQ(GetExpectedDeliveryTimeUsec(), + status.estimated_delivery_time_usec()); ASSERT_EQ(kTestTrackingId, status.parcel_identifier().tracking_id()); ASSERT_EQ(commerce::ParcelIdentifier::FEDEX, @@ -224,7 +233,8 @@ auto status = (*parcel_status)[0]; ASSERT_EQ(ParcelStatus::PICKED_UP, status.parcel_state()); ASSERT_EQ(kTestTrackingUrl, status.tracking_url()); - ASSERT_EQ(1000, status.estimated_delivery_time_usec()); + ASSERT_EQ(GetExpectedDeliveryTimeUsec(), + status.estimated_delivery_time_usec()); ASSERT_EQ(kTestTrackingId, status.parcel_identifier().tracking_id()); ASSERT_EQ(commerce::ParcelIdentifier::FEDEX,
diff --git a/components/commerce/core/proto/parcel.proto b/components/commerce/core/proto/parcel.proto index 53ef4fd..bd7d8bb 100644 --- a/components/commerce/core/proto/parcel.proto +++ b/components/commerce/core/proto/parcel.proto
@@ -106,6 +106,7 @@ // The tracking URL, if available. string tracking_url = 3; - // Estimated delivery time of the parcel in epoch microseconds. + // Estimated delivery time of the parcel in epoch microseconds, in local time + // zone. int64 estimated_delivery_time_usec = 4; }
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc index bdaef68..6920a4d 100644 --- a/components/commerce/core/shopping_service.cc +++ b/components/commerce/core/shopping_service.cc
@@ -203,8 +203,7 @@ if (parcel_tracking_proto_db) { parcels_manager_ = std::make_unique<ParcelsManager>( - identity_manager, url_loader_factory, parcel_tracking_proto_db, - account_checker_.get()); + identity_manager, url_loader_factory, parcel_tracking_proto_db); } } @@ -799,8 +798,7 @@ country_on_startup_, locale_on_startup_)) { return false; } - return account_checker_ && account_checker_->IsSignedIn() && - account_checker_->IsAnonymizedUrlDataCollectionEnabled(); + return account_checker_ && account_checker_->IsSignedIn(); } bool ShoppingService::IsShoppingPageTypesApiEnabled() {
diff --git a/components/compose/COMMON_METADATA b/components/compose/COMMON_METADATA new file mode 100644 index 0000000..2c700c8 --- /dev/null +++ b/components/compose/COMMON_METADATA
@@ -0,0 +1 @@ +team_email: "chrome-compose-frontend@google.com"
diff --git a/components/compose/DIR_METADATA b/components/compose/DIR_METADATA index 826c7948..71922be 100644 --- a/components/compose/DIR_METADATA +++ b/components/compose/DIR_METADATA
@@ -1 +1 @@ -team_email: "chrome-compose-frontend@google.com" \ No newline at end of file +mixins: "//components/compose/COMMON_METADATA"
diff --git a/components/content_settings/core/browser/BUILD.gn b/components/content_settings/core/browser/BUILD.gn index 570c894e..5c1dd4b 100644 --- a/components/content_settings/core/browser/BUILD.gn +++ b/components/content_settings/core/browser/BUILD.gn
@@ -57,6 +57,7 @@ "//components/pref_registry:pref_registry", "//components/prefs", "//components/privacy_sandbox:tracking_protection_prefs", + "//components/privacy_sandbox:tracking_protection_settings", "//components/url_formatter", "//extensions/buildflags", "//net", @@ -115,6 +116,7 @@ "//components/prefs:test_support", "//components/privacy_sandbox:features", "//components/privacy_sandbox:privacy_sandbox_prefs", + "//components/privacy_sandbox:tracking_protection_prefs", "//components/sync_preferences:test_support", "//extensions/buildflags", "//net",
diff --git a/components/content_settings/core/browser/cookie_settings.cc b/components/content_settings/core/browser/cookie_settings.cc index 6dcf101f..2fc3839 100644 --- a/components/content_settings/core/browser/cookie_settings.cc +++ b/components/content_settings/core/browser/cookie_settings.cc
@@ -51,10 +51,6 @@ prefs::kCookieControlsMode, base::BindRepeating(&CookieSettings::OnCookiePreferencesChanged, base::Unretained(this))); - pref_change_registrar_.Add( - prefs::kTrackingProtection3pcdEnabled, - base::BindRepeating(&CookieSettings::OnCookiePreferencesChanged, - base::Unretained(this))); OnCookiePreferencesChanged(); } @@ -330,6 +326,20 @@ } } +void CookieSettings::OnTrackingProtection3pcdChanged() { + // If the user opted to block all 3PC while in the experiment, preserve that + // preference if they are offboarded. + if (!pref_change_registrar_.prefs()->GetBoolean( + prefs::kTrackingProtection3pcdEnabled) && + pref_change_registrar_.prefs()->GetBoolean( + prefs::kBlockAll3pcToggleEnabled)) { + pref_change_registrar_.prefs()->SetInteger( + prefs::kCookieControlsMode, + static_cast<int>(CookieControlsMode::kBlockThirdParty)); + } + OnCookiePreferencesChanged(); +} + void CookieSettings::OnCookiePreferencesChanged() { DCHECK(thread_checker_.CalledOnValidThread());
diff --git a/components/content_settings/core/browser/cookie_settings.h b/components/content_settings/core/browser/cookie_settings.h index d41731e3..46b1f2b 100644 --- a/components/content_settings/core/browser/cookie_settings.h +++ b/components/content_settings/core/browser/cookie_settings.h
@@ -17,6 +17,7 @@ #include "components/content_settings/core/common/cookie_settings_base.h" #include "components/keyed_service/core/refcounted_keyed_service.h" #include "components/prefs/pref_change_registrar.h" +#include "components/privacy_sandbox/tracking_protection_settings_observer.h" class GURL; class PrefService; @@ -45,9 +46,11 @@ // A frontend to the cookie settings of |HostContentSettingsMap|. Handles // cookie-specific logic such as blocking third-party cookies. Written on the UI // thread and read on any thread. -class CookieSettings : public CookieSettingsBase, - public content_settings::Observer, - public RefcountedKeyedService { +class CookieSettings + : public CookieSettingsBase, + public content_settings::Observer, + public privacy_sandbox::TrackingProtectionSettingsObserver, + public RefcountedKeyedService { public: class Observer : public base::CheckedObserver { public: @@ -183,6 +186,9 @@ // called. void ShutdownOnUIThread() override; + // TrackingProtectionSettingsObserver: + void OnTrackingProtection3pcdChanged() override; + static void RegisterProfilePrefs(user_prefs::PrefRegistrySyncable* registry); void AddObserver(Observer* obs) { observers_.AddObserver(obs); }
diff --git a/components/content_settings/core/browser/cookie_settings_unittest.cc b/components/content_settings/core/browser/cookie_settings_unittest.cc index 65200f1..6927631f 100644 --- a/components/content_settings/core/browser/cookie_settings_unittest.cc +++ b/components/content_settings/core/browser/cookie_settings_unittest.cc
@@ -24,6 +24,7 @@ #include "components/content_settings/core/test/content_settings_mock_provider.h" #include "components/content_settings/core/test/content_settings_test_utils.h" #include "components/privacy_sandbox/privacy_sandbox_prefs.h" +#include "components/privacy_sandbox/tracking_protection_prefs.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "extensions/buildflags/buildflags.h" #include "net/base/features.h" @@ -1657,6 +1658,29 @@ EXPECT_TRUE(observer.last_value()); } +TEST_P(CookieSettingsTest, PreservesBlockingStateFrom3pcdOnOffboarding) { + // CookieControlsMode starts in the default state when we onboard. + prefs_.SetBoolean(prefs::kTrackingProtection3pcdEnabled, true); + cookie_settings_->OnTrackingProtection3pcdChanged(); + EXPECT_EQ(prefs_.GetInteger(prefs::kCookieControlsMode), + static_cast<int>(CookieControlsMode::kIncognitoOnly)); + + // If the block all toggle is off when we offboard, the CookieControlsMode + // pref stays the same. + prefs_.SetBoolean(prefs::kBlockAll3pcToggleEnabled, false); + prefs_.SetBoolean(prefs::kTrackingProtection3pcdEnabled, false); + cookie_settings_->OnTrackingProtection3pcdChanged(); + EXPECT_EQ(prefs_.GetInteger(prefs::kCookieControlsMode), + static_cast<int>(CookieControlsMode::kIncognitoOnly)); + + // If the block all toggle is on when we offboard, the CookieControlsMode + // pref is changed to BlockThirdParty. + prefs_.SetBoolean(prefs::kBlockAll3pcToggleEnabled, true); + cookie_settings_->OnTrackingProtection3pcdChanged(); + EXPECT_EQ(prefs_.GetInteger(prefs::kCookieControlsMode), + static_cast<int>(CookieControlsMode::kBlockThirdParty)); +} + TEST_P(CookieSettingsTest, LegacyCookieAccessAllowAll) { settings_map_->SetDefaultContentSetting( ContentSettingsType::LEGACY_COOKIE_ACCESS, CONTENT_SETTING_ALLOW);
diff --git a/components/cronet/android/cronet_context_adapter.cc b/components/cronet/android/cronet_context_adapter.cc index 81386c87..83f296e 100644 --- a/components/cronet/android/cronet_context_adapter.cc +++ b/components/cronet/android/cronet_context_adapter.cc
@@ -318,14 +318,6 @@ return reinterpret_cast<jlong>(context_adapter); } -static jint JNI_CronetUrlRequestContext_SetMinLogLevel(JNIEnv* env, - jint jlog_level) { - jint old_log_level = static_cast<jint>(logging::GetMinLogLevel()); - // MinLogLevel is global, shared by all URLRequestContexts. - logging::SetMinLogLevel(static_cast<int>(jlog_level)); - return old_log_level; -} - static ScopedJavaLocalRef<jbyteArray> JNI_CronetUrlRequestContext_GetHistogramDeltas(JNIEnv* env) { std::vector<uint8_t> data;
diff --git a/components/cronet/android/cronet_library_loader.cc b/components/cronet/android/cronet_library_loader.cc index 7a07e6d..6b4a702 100644 --- a/components/cronet/android/cronet_library_loader.cc +++ b/components/cronet/android/cronet_library_loader.cc
@@ -157,6 +157,10 @@ return base::android::ConvertUTF8ToJavaString(env, CRONET_VERSION); } +void JNI_CronetLibraryLoader_SetMinLogLevel(JNIEnv* env, jint jlog_level) { + logging::SetMinLogLevel(jlog_level); +} + void PostTaskToInitThread(const base::Location& posted_from, base::OnceClosure task) { g_init_thread_init_done.Wait();
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java index 0e61804..b4efc5e 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetLibraryLoader.java
@@ -86,12 +86,33 @@ } Log.i(TAG, "Cronet version: %s, arch: %s", implVersion, System.getProperty("os.arch")); + setNativeLoggingLevel(); sLibraryLoaded = true; sWaitForLibLoad.open(); } } } + private static void setNativeLoggingLevel() { + // The constants used here should be kept in sync with logging::LogMessage::~LogMessage(). + final String nativeLogTag = "chromium"; + int loggingLevel; + // TODO: this way of enabling VLOG is a hack - it doesn't make a ton of sense because + // logging::LogMessage() will still log VLOG() at the Android INFO log level, not DEBUG or + // VERBOSE; also this doesn't make it possible to use advanced filters like --vmodule. See + // https://crbug.com/1488393 for a proposed alternative. + if (Log.isLoggable(nativeLogTag, Log.VERBOSE)) { + loggingLevel = -2; // VLOG(2) + } else if (Log.isLoggable(nativeLogTag, Log.DEBUG)) { + loggingLevel = -1; // VLOG(1) + } else { + // Use the default log level, which logs everything except VLOG(). Skip the + // setMinLogLevel() call to avoid paying for an unnecessary JNI transition. + return; + } + CronetLibraryLoaderJni.get().setMinLogLevel(loggingLevel); + } + /** * Returns {@code true} if running on the initialization thread. */ @@ -228,5 +249,7 @@ void cronetInitOnInitThread(); String getCronetVersion(); + + void setMinLogLevel(int loggingLevel); } }
diff --git a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java index 9a6b7a61..e34bc0a 100644 --- a/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java +++ b/components/cronet/android/java/src/org/chromium/net/impl/CronetUrlRequestContext.java
@@ -56,9 +56,6 @@ @UsedByReflection("CronetEngine.java") @VisibleForTesting public class CronetUrlRequestContext extends CronetEngineBase { - private static final int LOG_NONE = 3; // LOG(FATAL), no VLOG. - private static final int LOG_DEBUG = -1; // LOG(FATAL...INFO), VLOG(1) - private static final int LOG_VERBOSE = -2; // LOG(FATAL...INFO), VLOG(2) static final String LOG_TAG = CronetUrlRequestContext.class.getSimpleName(); /** @@ -205,7 +202,6 @@ mThroughputListenerList.disableThreadAsserts(); mNetworkQualityEstimatorEnabled = builder.networkQualityEstimatorEnabled(); CronetLibraryLoader.ensureInitialized(builder.getContext(), builder); - CronetUrlRequestContextJni.get().setMinLogLevel(getLoggingLevel()); if (builder.httpCacheMode() == HttpCacheType.DISK) { mInUseStoragePath = builder.storagePath(); synchronized (sInUseStoragePaths) { @@ -715,21 +711,6 @@ return mUrlRequestContextAdapter != 0; } - /** - * @return loggingLevel see {@link #LOG_NONE}, {@link #LOG_DEBUG} and {@link #LOG_VERBOSE}. - */ - private int getLoggingLevel() { - int loggingLevel; - if (Log.isLoggable(LOG_TAG, Log.VERBOSE)) { - loggingLevel = LOG_VERBOSE; - } else if (Log.isLoggable(LOG_TAG, Log.DEBUG)) { - loggingLevel = LOG_DEBUG; - } else { - loggingLevel = LOG_NONE; - } - return loggingLevel; - } - private static int convertConnectionTypeToApiValue(@EffectiveConnectionType int type) { switch (type) { case EffectiveConnectionType.TYPE_OFFLINE: @@ -870,7 +851,6 @@ void addPkp(long urlRequestContextConfig, String host, byte[][] hashes, boolean includeSubdomains, long expirationTime); long createRequestContextAdapter(long urlRequestContextConfig); - int setMinLogLevel(int loggingLevel); byte[] getHistogramDeltas(); @NativeClassQualifiedName("CronetContextAdapter") void destroy(long nativePtr, CronetUrlRequestContext caller);
diff --git a/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java b/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java index bd70d59..afa0d447 100644 --- a/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java +++ b/components/cronet/android/test/javatests/src/org/chromium/net/NetworkChangesTest.java
@@ -8,7 +8,10 @@ import static android.system.OsConstants.SOCK_STREAM; import static com.google.common.truth.Truth.assertThat; +import static com.google.common.truth.TruthJUnit.assume; +import android.net.ConnectivityManager; +import android.net.Network; import android.os.ConditionVariable; import android.system.Os; @@ -40,6 +43,86 @@ private FileDescriptor mSocket; + private static class Networks { + private Network mDefaultNetwork; + private Network mCellular; + private Network mWifi; + + public Networks(ConnectivityManager connectivityManager) { + postToInitThreadSync(() -> { + NetworkChangeNotifierAutoDetect autoDetector = + NetworkChangeNotifier.getAutoDetectorForTest(); + assertThat(autoDetector).isNotNull(); + + mDefaultNetwork = autoDetector.getDefaultNetwork(); + + for (Network network : autoDetector.getNetworksForTesting()) { + switch (connectivityManager.getNetworkInfo(network).getType()) { + case ConnectivityManager.TYPE_MOBILE: + mCellular = network; + break; + case ConnectivityManager.TYPE_WIFI: + mWifi = network; + break; + default: + // Ignore + } + } + }); + + // TODO(crbug.com/1486376): Drop assumes once CQ bots have multiple networks. + assume().that(mCellular).isNotNull(); + assume().that(mWifi).isNotNull(); + assume().that(mDefaultNetwork).isNotNull(); + assume().that(mDefaultNetwork).isAnyOf(mWifi, mCellular); + // Protect us against unexpected Network#equals implementation. + assertThat(mCellular).isNotEqualTo(mWifi); + } + + public void swapDefaultNetwork() { + if (isWifiDefault()) { + makeCellularDefault(); + } else { + makeWifiDefault(); + } + } + + public void disconnectNonDefaultNetwork() { + fakeNetworkDisconnected(getNonDefaultNetwork()); + } + + private void fakeDefaultNetworkChange(Network network) { + postToInitThreadSync(() -> { + NetworkChangeNotifier.fakeDefaultNetwork( + network.getNetworkHandle(), ConnectionType.CONNECTION_4G); + }); + } + + private void fakeNetworkDisconnected(Network network) { + postToInitThreadSync(() -> { + NetworkChangeNotifier.fakeNetworkDisconnected(network.getNetworkHandle()); + }); + } + + private boolean isWifiDefault() { + return mDefaultNetwork.equals(mWifi); + } + + private Network getNonDefaultNetwork() { + return isWifiDefault() ? mCellular : mWifi; + } + + private void makeWifiDefault() { + fakeDefaultNetworkChange(mWifi); + mDefaultNetwork = mWifi; + } + + private void makeCellularDefault() { + fakeDefaultNetworkChange(mCellular); + mDefaultNetwork = mCellular; + } + } + @Before public void setUp() throws Exception { // Bind a listening socket to a local port. The socket won't be used to accept any @@ -72,13 +155,10 @@ waitForConnectingStatus(request); // Simulate network change which should abort connect jobs - CronetLibraryLoader.postToInitThread(new Runnable() { - @Override - public void run() { - NetworkChangeNotifier.fakeDefaultNetwork( - NetworkChangeNotifier.getInstance().getCurrentDefaultNetId(), - ConnectionType.CONNECTION_4G); - } + postToInitThreadSync(() -> { + NetworkChangeNotifier.fakeDefaultNetwork( + NetworkChangeNotifier.getInstance().getCurrentDefaultNetId(), + ConnectionType.CONNECTION_4G); }); // Wait for ERR_NETWORK_CHANGED @@ -91,6 +171,14 @@ .isEqualTo(NetError.ERR_NETWORK_CHANGED); } + @Test + @SmallTest + public void testNetworksEmtpyTest() throws Exception { + // This is to prevent UnusedNestedClass warning from yelling. This will be dropped by a + // child CL. + Networks networks; + } + private static void waitForConnectingStatus(UrlRequest request) { final ConditionVariable cv = new ConditionVariable(false /* closed */); request.getStatus(new UrlRequest.StatusListener() { @@ -103,4 +191,13 @@ }); cv.block(); } + + private static void postToInitThreadSync(Runnable r) { + final ConditionVariable cv = new ConditionVariable(/*open=*/false); + CronetLibraryLoader.postToInitThread(() -> { + r.run(); + cv.open(); + }); + cv.block(); + } }
diff --git a/components/cronet/android/test/quic_test_server.cc b/components/cronet/android/test/quic_test_server.cc index e448bec..6e6a0daa 100644 --- a/components/cronet/android/test/quic_test_server.cc +++ b/components/cronet/android/test/quic_test_server.cc
@@ -12,6 +12,7 @@ #include "base/functional/callback_forward.h" #include "base/logging.h" #include "base/message_loop/message_pump_type.h" +#include "base/strings/stringprintf.h" #include "base/synchronization/waitable_event.h" #include "base/test/test_support_android.h" #include "base/threading/thread.h" @@ -46,10 +47,20 @@ .Then(base::BindOnce([] { wait_for_callback.Signal(); })); } +template <typename T> +void ExecuteSynchronouslyOnServerThread(base::OnceCallback<T> callback, + base::Location from_here = FROM_HERE) { + CHECK(g_quic_server_thread); + g_quic_server_thread->task_runner()->PostTask( + from_here, WrapCallbackWithSignal(std::move(callback))); + wait_for_callback.Wait(); +} + void StartOnServerThread(const base::FilePath& test_files_root, const base::FilePath& test_data_dir) { CHECK(g_quic_server_thread->task_runner()->BelongsToCurrentThread()); CHECK(!g_quic_server); + CHECK(!g_quic_memory_cache_backend); // Set up in-memory cache. base::FilePath file_dir = test_files_root.Append("quic_data"); @@ -77,8 +88,21 @@ CHECK_GE(rv, 0) << "Quic server fails to start"; } +void SetResponseDelayOnServerThread(const std::string& path, + base::TimeDelta delay) { + CHECK(g_quic_server_thread->task_runner()->BelongsToCurrentThread()); + CHECK(g_quic_memory_cache_backend); + + // TODO(crbug.com/1487185): Stop hardcoding server hostname. + CHECK(g_quic_memory_cache_backend->SetResponseDelay( + base::StringPrintf("%s:%d", "test.example.com", kServerPort), path, + quic::QuicTime::Delta::FromMicroseconds(delay.InMicroseconds()))); +} + void ShutdownOnServerThread() { CHECK(g_quic_server_thread->task_runner()->BelongsToCurrentThread()); + CHECK(g_quic_server); + CHECK(g_quic_memory_cache_backend); g_quic_server->Shutdown(); g_quic_server.reset(); g_quic_memory_cache_backend.reset(); @@ -104,19 +128,13 @@ CHECK(started); base::FilePath test_files_root( base::android::ConvertJavaStringToUTF8(env, jtest_files_root)); - g_quic_server_thread->task_runner()->PostTask( - FROM_HERE, WrapCallbackWithSignal(base::BindOnce( - &StartOnServerThread, test_files_root, test_data_dir))); - wait_for_callback.Wait(); + ExecuteSynchronouslyOnServerThread( + base::BindOnce(&StartOnServerThread, test_files_root, test_data_dir)); } void JNI_QuicTestServer_ShutdownQuicTestServer(JNIEnv* env) { CHECK(!g_quic_server_thread->task_runner()->BelongsToCurrentThread()); - CHECK(g_quic_server_thread); - g_quic_server_thread->task_runner()->PostTask( - FROM_HERE, - WrapCallbackWithSignal(base::BindOnce(&ShutdownOnServerThread))); - wait_for_callback.Wait(); + ExecuteSynchronouslyOnServerThread(base::BindOnce(&ShutdownOnServerThread)); g_quic_server_thread.reset(); } @@ -124,4 +142,14 @@ return kServerPort; } +void JNI_QuicTestServer_DelayResponse(JNIEnv* env, + const JavaParamRef<jstring>& jpath, + int delayInSeconds) { + CHECK(!g_quic_server_thread->task_runner()->BelongsToCurrentThread()); + std::string path = base::android::ConvertJavaStringToUTF8(env, jpath); + base::TimeDelta delay = base::Seconds(delayInSeconds); + ExecuteSynchronouslyOnServerThread( + base::BindOnce(&SetResponseDelayOnServerThread, path, delay)); +} + } // namespace cronet
diff --git a/components/cronet/android/test/src/org/chromium/net/QuicTestServer.java b/components/cronet/android/test/src/org/chromium/net/QuicTestServer.java index 76dfd3c..4566e9a1 100644 --- a/components/cronet/android/test/src/org/chromium/net/QuicTestServer.java +++ b/components/cronet/android/test/src/org/chromium/net/QuicTestServer.java
@@ -60,6 +60,10 @@ return QuicTestServerJni.get().getServerPort(); } + public static void delayResponse(String path, int delayInSeconds) { + QuicTestServerJni.get().delayResponse(path, delayInSeconds); + } + public static final String getServerCert() { return CERT_USED; } @@ -79,6 +83,7 @@ * Runs a quic test server synchronously. */ void startQuicTestServer(String filePath, String testDataDir); + /* * Shutdowns the quic test-server synchronously. * @@ -87,5 +92,14 @@ */ void shutdownQuicTestServer(); int getServerPort(); + + /* + * Responses for path will be delayed by delayInSeconds. + * + * Ideally this wouldn't take a delay. Instead, it should provide a synchronization + * mechanism that allows the caller to unblock the request. This would require changes all + * the way down to QUICHE though. + */ + void delayResponse(String path, int delayInSeconds); } }
diff --git a/components/cronet/android/test_instructions.md b/components/cronet/android/test_instructions.md index 74f4323..896eddf61 100644 --- a/components/cronet/android/test_instructions.md +++ b/components/cronet/android/test_instructions.md
@@ -77,19 +77,19 @@ #### See VLOG(1) and VLOG(2) logging: ```shell -$ adb shell setprop log.tag.CronetUrlRequestContext VERBOSE +$ adb shell setprop log.tag.chromium VERBOSE ``` #### See VLOG(1) logging: ```shell -$ adb shell setprop log.tag.CronetUrlRequestContext DEBUG +$ adb shell setprop log.tag.chromium DEBUG ``` #### See NO (only FATAL) logging: ```shell -$ adb shell setprop log.tag.CronetUrlRequestContext NONE +$ adb shell setprop log.tag.chromium NONE ``` ### Network Log
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 4cbd9262..76e4c645 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -522,6 +522,15 @@ BASE_FEATURE(kIPHiOSChoiceScreenFeature, "IPH_iOSChoiceScreenFeature", base::FEATURE_ENABLED_BY_DEFAULT); + +// Non-FET feature. +BASE_FEATURE(kDefaultBrowserEligibilitySlidingWindow, + "DefaultBrowserEligibilitySlidingWindow", + base::FEATURE_DISABLED_BY_DEFAULT); + +constexpr base::FeatureParam<int> kDefaultBrowserEligibilitySlidingWindowParam{ + &kDefaultBrowserEligibilitySlidingWindow, /*name=*/"sliding-window-days", + /*default_value=*/365}; #endif // BUILDFLAG(IS_IOS) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index fda21c44..be1ac67 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -6,6 +6,7 @@ #define COMPONENTS_FEATURE_ENGAGEMENT_PUBLIC_FEATURE_CONSTANTS_H_ #include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" #include "build/branding_buildflags.h" #include "build/build_config.h" @@ -210,6 +211,17 @@ BASE_DECLARE_FEATURE(kIPHiOSPromoPostRestoreDefaultBrowserFeature); BASE_DECLARE_FEATURE(kIPHiOSPromoPasswordManagerWidgetFeature); BASE_DECLARE_FEATURE(kIPHiOSChoiceScreenFeature); + +// A feature flag to enable and parametrize the sliding window of time for a +// user's eligibility to be shown a default browser promo. This is not an FET +// feature, but there is a related FET feature that needs to adjust its config +// rules based on this feature, so it needs to be declared here. +BASE_DECLARE_FEATURE(kDefaultBrowserEligibilitySlidingWindow); + +// The param for the default browser eligibility sliding window, measured in +// days. +extern const base::FeatureParam<int> + kDefaultBrowserEligibilitySlidingWindowParam; #endif // BUILDFLAG(IS_IOS) #if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_APPLE) || BUILDFLAG(IS_LINUX) || \
diff --git a/components/feature_engagement/public/ios_promo_feature_configuration.cc b/components/feature_engagement/public/ios_promo_feature_configuration.cc index f53f62d..7bbfc38 100644 --- a/components/feature_engagement/public/ios_promo_feature_configuration.cc +++ b/components/feature_engagement/public/ios_promo_feature_configuration.cc
@@ -62,10 +62,22 @@ if (base::FeatureList::IsEnabled(kIPHGroups)) { config->groups.push_back(kiOSFullscreenPromosGroup.name); } - config->used = EventConfig("default_browser_promo_used", - Comparator(LESS_THAN, 4), 365, 365); - config->trigger = EventConfig("default_browser_promo_trigger", - Comparator(LESS_THAN, 4), 365, 365); + + config->used = + EventConfig("default_browser_promo_used", Comparator(ANY, 0), 365, 365); + if (base::FeatureList::IsEnabled(kDefaultBrowserEligibilitySlidingWindow)) { + // Impression limits are currently being enforced on the registration side + // of the promo manager on iOS, therefore this promo will not be showing + // biweekly as this config may suggest. + // TODO(b/302111496): Fix this config to have impression limits be + // enforced solely by the FET. + config->trigger = EventConfig("default_browser_promo_trigger", + Comparator(EQUAL, 0), 14, 365); + } else { + config->trigger = EventConfig("default_browser_promo_trigger", + Comparator(LESS_THAN, 4), 365, 365); + } + config->event_configs.insert(EventConfig( "chrome_opened", Comparator(GREATER_THAN_OR_EQUAL, 7), 365, 365)); // Default Browser promo shouldn't be shown if the Post Restore Default @@ -139,9 +151,17 @@ config->availability = Comparator(ANY, 0); config->session_rate = Comparator(ANY, 0); config->session_rate_impact.type = SessionRateImpact::Type::NONE; - config->trigger = - EventConfig("default_browser_video_promo_conditions_met_trigger", - Comparator(ANY, 0), 360, 360); + + if (base::FeatureList::IsEnabled(kDefaultBrowserEligibilitySlidingWindow)) { + config->trigger = EventConfig( + "default_browser_video_promo_conditions_met_trigger", + Comparator(EQUAL, 0), feature_engagement::kMaxStoragePeriod, + feature_engagement::kMaxStoragePeriod); + } else { + config->trigger = + EventConfig("default_browser_video_promo_conditions_met_trigger", + Comparator(ANY, 0), 360, 360); + } config->used = EventConfig("default_browser_video_promo_shown", Comparator(EQUAL, 0), 360, 360); config->event_configs.insert(
diff --git a/components/lookalikes/core/lookalike_url_util_fuzzer.cc b/components/lookalikes/core/lookalike_url_util_fuzzer.cc index ea231bde..8903d409 100644 --- a/components/lookalikes/core/lookalike_url_util_fuzzer.cc +++ b/components/lookalikes/core/lookalike_url_util_fuzzer.cc
@@ -6,13 +6,24 @@ #include "base/i18n/icu_util.h" #include "components/lookalikes/core/lookalike_url_util.h" +class ICUInitializer { + public: + ICUInitializer() { base::i18n::InitializeICU(); } +}; + +static ICUInitializer g_icu_initializer; + extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - base::i18n::InitializeICU(); FuzzedDataProvider data_provider(data, size); lookalikes::LookalikeUrlMatchType match_type = data_provider.ConsumeEnum<lookalikes::LookalikeUrlMatchType>(); GURL navigated_url = GURL(data_provider.ConsumeRandomLengthString()); std::string matched_hostname = data_provider.ConsumeRemainingBytesAsString(); + // Ignore inputs matching the following, to avoid a false positive + std::string suggested_domain = lookalikes::GetETLDPlusOne(matched_hostname); + if (suggested_domain.empty()) { + return 0; + } lookalikes::GetSuggestedURL(match_type, navigated_url, matched_hostname); return 0; }
diff --git a/components/manta/BUILD.gn b/components/manta/BUILD.gn new file mode 100644 index 0000000..98088b7 --- /dev/null +++ b/components/manta/BUILD.gn
@@ -0,0 +1,16 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +assert(!is_android) + +component("manta") { + sources = [ + "features.cc", + "features.h", + ] + + defines = [ "IS_MANTA_IMPL" ] + + public_deps = [ "//base" ] +}
diff --git a/components/manta/OWNERS b/components/manta/OWNERS new file mode 100644 index 0000000..e58458c --- /dev/null +++ b/components/manta/OWNERS
@@ -0,0 +1,5 @@ +alanlxl@chromium.org +amoylan@chromium.org +mcrouse@chromium.org +# sanjeetnd@google.com - not a committer yet +sophiechang@chromium.org
diff --git a/components/manta/README.md b/components/manta/README.md new file mode 100644 index 0000000..b4e06868b --- /dev/null +++ b/components/manta/README.md
@@ -0,0 +1,4 @@ +# Manta + +Manta connects Chrome browser, and several ChromeOS applications, to Google +APIs.
diff --git a/components/manta/features.cc b/components/manta/features.cc new file mode 100644 index 0000000..12ec776 --- /dev/null +++ b/components/manta/features.cc
@@ -0,0 +1,17 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/manta/features.h" + +#include "base/feature_list.h" + +namespace manta::features { + +BASE_FEATURE(kMantaService, "MantaService", base::FEATURE_DISABLED_BY_DEFAULT); + +bool IsMantaServiceEnabled() { + return base::FeatureList::IsEnabled(kMantaService); +} + +} // namespace manta::features
diff --git a/components/manta/features.h b/components/manta/features.h new file mode 100644 index 0000000..0b8d9d2 --- /dev/null +++ b/components/manta/features.h
@@ -0,0 +1,21 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_MANTA_FEATURES_H_ +#define COMPONENTS_MANTA_FEATURES_H_ + +#include "base/component_export.h" +#include "base/feature_list.h" + +namespace manta::features { + +// This flag is used for enabling the Manta Service, a profile keyed service for +// the google chrome Manta project. +COMPONENT_EXPORT(MANTA) BASE_DECLARE_FEATURE(kMantaService); + +COMPONENT_EXPORT(MANTA) bool IsMantaServiceEnabled(); + +} // namespace manta::features + +#endif // COMPONENTS_MANTA_FEATURES_H_
diff --git a/components/media_router/test/android/media_router_test_support/BUILD.gn b/components/media_router/test/android/media_router_test_support/BUILD.gn index 2de0b530..d41b74c 100644 --- a/components/media_router/test/android/media_router_test_support/BUILD.gn +++ b/components/media_router/test/android/media_router_test_support/BUILD.gn
@@ -9,10 +9,6 @@ # Used as an additional_apk in test scripts. never_incremental = true - # Multidex requires a custom Application class to initialize it. Simpler to - # just disable it. - enable_multidex = false - deps = [ "//components/media_router/test/android/cast_emulator:cast_emulator_java", ]
diff --git a/components/metrics/structured/OWNERS b/components/metrics/structured/OWNERS index a39f88d..c7862e8 100644 --- a/components/metrics/structured/OWNERS +++ b/components/metrics/structured/OWNERS
@@ -1,3 +1,4 @@ file://base/metrics/OWNERS jongahn@chromium.org tby@chromium.org +andrewbregger@google.com
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index a1edec0..dc96069 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -96,28 +96,22 @@ // Appends available autocompletion of the given type, subtype, and number to // the existing available autocompletions string, encoding according to the // spec. -void AppendAvailableAutocompletion( +std::string ConstructAvailableAutocompletion( omnibox::SuggestType type, const base::flat_set<omnibox::SuggestSubtype>& subtypes, - int count, - std::string* autocompletions) { - if (!autocompletions->empty()) - autocompletions->append("j"); - base::StringAppendF(autocompletions, "%d", type); + int count) { + std::ostringstream result; + result << int(type); - std::ostringstream subtype_str; for (auto subtype : subtypes) { - if (subtype_str.tellp() > 0) - subtype_str << 'i'; - subtype_str << subtype; + result << 'i' << subtype; } - // Subtype is optional. Append only if we have subtypes to report. - if (subtype_str.tellp() > 0) - base::StringAppendF(autocompletions, "i%s", subtype_str.str().c_str()); + if (count > 1) { + result << 'l' << count; + } - if (count > 1) - base::StringAppendF(autocompletions, "l%d", count); + return result.str(); } // Whether this autocomplete match type supports custom descriptions. @@ -1276,7 +1270,6 @@ searchbox_stats.set_client_name("chrome"); // Build the impressions string (the AQS part after "."). - std::string autocompletions; int count = 0; int num_zero_prefix_suggestions_shown = 0; absl::optional<omnibox::SuggestType> last_type; @@ -1285,6 +1278,12 @@ std::vector<size_t> match_index_to_position(result->size()); size_t match_position = 0; + std::vector<bool> match_index_belongs_to_horizontal_render_group( + result->size()); + std::vector<size_t> match_index_to_aqs_slot(result->size()); + std::vector<std::string> aqs; + aqs.reserve(result->size()); + for (size_t index = 0; index < result->size(); ++index) { AutocompleteMatch* match = result->match_at(index); @@ -1296,10 +1295,16 @@ match->suggestion_group_id.value_or(omnibox::GROUP_INVALID); omnibox::GroupConfig_RenderType render_type = result->GetRenderTypeForSuggestionGroup(group_id); + bool match_belongs_to_horizontal_render_group = + render_type == omnibox::GroupConfig_RenderType_HORIZONTAL; + match_index_belongs_to_horizontal_render_group[index] = + match_belongs_to_horizontal_render_group; if (group_id == previous_group_id && - render_type == omnibox::GroupConfig_RenderType_HORIZONTAL) { - // All elements in a Horizontal Render Group share the same index. + match_belongs_to_horizontal_render_group) { + // All elements in a Horizontal Render Group share the same index + // and AQS slot. match_index_to_position[index] = match_position - 1; + match_index_to_aqs_slot[index] = aqs.size(); continue; } previous_group_id = group_id; @@ -1320,25 +1325,27 @@ auto* available_suggestion = searchbox_stats.add_available_suggestions(); available_suggestion->set_index(match_position); available_suggestion->set_type(type); - match_index_to_position[index] = match_position++; + match_index_to_position[index] = match_position; for (const auto subtype : subtypes) { available_suggestion->add_subtypes(subtype); } if (last_type.has_value() && (type != last_type || subtypes != last_subtypes)) { - AppendAvailableAutocompletion(*last_type, last_subtypes, count, - &autocompletions); + aqs.push_back( + ConstructAvailableAutocompletion(*last_type, last_subtypes, count)); count = 1; } else { count++; } + match_index_to_aqs_slot[index] = aqs.size(); last_type = type; last_subtypes = subtypes; + match_position++; } if (last_type.has_value()) { - AppendAvailableAutocompletion(*last_type, last_subtypes, count, - &autocompletions); + aqs.push_back( + ConstructAvailableAutocompletion(*last_type, last_subtypes, count)); } // TODO(crbug.com/1307142): These two fields should take into account all the @@ -1375,9 +1382,17 @@ ->MergeFrom(*selected_suggestion); selected_position = base::StringPrintf("%" PRIuS, match_position); + + // Reconstruct AQS for items sharing the slot (e.g. elements in the + // carousel). + if (match_index_belongs_to_horizontal_render_group[index]) { + aqs[match_index_to_aqs_slot[index]] = ConstructAvailableAutocompletion( + match->suggest_type, match->subtypes, 1); + } } - match->search_terms_args->assisted_query_stats = base::StringPrintf( - "chrome.%s.%s", selected_position.c_str(), autocompletions.c_str()); + match->search_terms_args->assisted_query_stats = + base::StringPrintf("chrome.%s.%s", selected_position.c_str(), + base::JoinString(aqs, "j").c_str()); // Duplicate AQS/SBS for eligible ActionsInSuggest. // TODO(1418077): rather than computing the `action_uri`, keep the
diff --git a/components/omnibox/browser/autocomplete_match_type_unittest.cc b/components/omnibox/browser/autocomplete_match_type_unittest.cc index 161d696e..47016d0 100644 --- a/components/omnibox/browser/autocomplete_match_type_unittest.cc +++ b/components/omnibox/browser/autocomplete_match_type_unittest.cc
@@ -5,11 +5,28 @@ #include "components/omnibox/browser/autocomplete_match_type.h" #include "base/json/json_reader.h" +#include "base/memory/scoped_refptr.h" #include "base/strings/utf_string_conversions.h" #include "base/values.h" +#include "components/omnibox/browser/actions/omnibox_action.h" +#include "components/omnibox/browser/actions/omnibox_pedal.h" #include "components/omnibox/browser/autocomplete_match.h" #include "components/omnibox/browser/suggestion_answer.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +namespace { + +class FakeOmniboxPedal : public OmniboxPedal { + public: + FakeOmniboxPedal(OmniboxPedalId id, LabelStrings strings, GURL url) + : OmniboxPedal(id, strings, url) {} + + private: + ~FakeOmniboxPedal() override = default; +}; + +} // namespace TEST(AutocompleteMatchTypeTest, AccessibilityLabelHistory) { const std::u16string& kTestUrl = u"https://www.chromium.org"; @@ -44,6 +61,25 @@ AutocompleteMatchType::ToAccessibilityLabel(match, kSearch, 5, 0)); } +TEST(AutocompleteMatchTypeTest, AccessibilityLabelPedal) { + const std::u16string& kPedal = u"clear browsing data"; + const std::u16string& kAccessibilityHint = + u"Clear your chrome browsing history, cookies, and cache"; + + AutocompleteMatch match; + match.type = AutocompleteMatchType::PEDAL; + const OmniboxAction::LabelStrings label_strings( + /*hint=*/u"", /*suggestion_contents=*/u"", /*accessibility_suffix=*/u"", + /*accessibility_hint=*/kAccessibilityHint); + match.takeover_action = base::MakeRefCounted<FakeOmniboxPedal>( + OmniboxPedalId::CLEAR_BROWSING_DATA, label_strings, GURL()); + + // Ensure that the accessibility hint is present in the a11y label for pedal + // suggestions. + EXPECT_EQ(kAccessibilityHint + u", 2 of 5", + AutocompleteMatchType::ToAccessibilityLabel(match, kPedal, 1, 5)); +} + namespace { bool ParseAnswer(const std::string& answer_json, SuggestionAnswer* answer) {
diff --git a/components/omnibox/browser/autocomplete_provider_unittest.cc b/components/omnibox/browser/autocomplete_provider_unittest.cc index 3f02ef96..40dd781c 100644 --- a/components/omnibox/browser/autocomplete_provider_unittest.cc +++ b/components/omnibox/browser/autocomplete_provider_unittest.cc
@@ -1178,20 +1178,20 @@ {omnibox::SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_QUERIES}}, {AutocompleteMatchType::SEARCH_SUGGEST, {omnibox::GROUP_MOBILE_MOST_VISITED}, - "chrome.1.46i362j0i724j46i362", + "chrome.1.46i362j0i451j46i362", stats_1, omnibox::TYPE_QUERY, - {omnibox::SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_QUERIES}}, + {omnibox::SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_URLS}}, {AutocompleteMatchType::SEARCH_SUGGEST, {omnibox::GROUP_MOBILE_MOST_VISITED}, - "chrome.1.46i362j0i724j46i362", + "chrome.1.46i362j0i450j46i362", stats_1, omnibox::TYPE_QUERY, - {omnibox::SUBTYPE_ZERO_PREFIX_LOCAL_FREQUENT_QUERIES}}, + {omnibox::SUBTYPE_ZERO_PREFIX_LOCAL_HISTORY}}, // Entity suggestion. {AutocompleteMatchType::SEARCH_SUGGEST_ENTITY, {/* GroupID */}, - "chrome.2.46i362j0i724j46i362", + "chrome.2.46i362j0i450j46i362", stats_2, omnibox::TYPE_ENTITY, {omnibox::SUBTYPE_ZERO_PREFIX}},
diff --git a/components/omnibox/browser/omnibox_view.cc b/components/omnibox/browser/omnibox_view.cc index 6461c8d..fa7d35c 100644 --- a/components/omnibox/browser/omnibox_view.cc +++ b/components/omnibox/browser/omnibox_view.cc
@@ -56,6 +56,13 @@ kRichAutocompletionAutocompleteNonPrefixShortcutProvider.Get(); } +// Return true if the given match uses a vector icon with a background. +bool HasVectorIconBackground(const AutocompleteMatch& match) { + return OmniboxFieldTrial::IsActionsUISimplificationEnabled() && + (match.type == AutocompleteMatchType::HISTORY_CLUSTER || + match.type == AutocompleteMatchType::PEDAL); +} + } // namespace OmniboxView::State::State() = default; @@ -182,6 +189,7 @@ SkColor color_current_page_icon, SkColor color_vectors, SkColor color_bright_vectors, + SkColor color_vectors_with_background, IconFetchedCallback on_icon_fetched, bool dark_mode) const { #if BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) @@ -256,7 +264,10 @@ match.type == AutocompleteMatchType::STARTER_PACK) ? color_bright_vectors : color_vectors; - return ui::ImageModel::FromVectorIcon(vector_icon, color, dip_size); + return ui::ImageModel::FromVectorIcon( + vector_icon, + HasVectorIconBackground(match) ? color_vectors_with_background : color, + dip_size); #endif // BUILDFLAG(IS_ANDROID) || BUILDFLAG(IS_IOS) }
diff --git a/components/omnibox/browser/omnibox_view.h b/components/omnibox/browser/omnibox_view.h index 924205cd..adc5694 100644 --- a/components/omnibox/browser/omnibox_view.h +++ b/components/omnibox/browser/omnibox_view.h
@@ -81,15 +81,18 @@ // closed, there is no input in progress, and there's a URL displayed) (e.g. // the secure page lock). `color_vectors` is used for vector icons e.g. the // history clock or bookmark star. `color_bright_vectors` is used for special - // vector icons e.g. the history cluster squiggle. Favicons aren't - // custom-colored. `dark_mode` returns the dark_mode version of an icon. This - // should usually be handled by `color_current_page_icon` but in cases where - // the icon has hardcoded colors this can be used to return a different icon. - // E.g., the SuperGIcon will return different icons in dark and light modes. + // vector icons e.g. the history cluster squiggle. + // `color_vectors_with_background` is used for vector icons that are drawn + // atop a background e.g. action suggestions. Favicons aren't custom-colored. + // `dark_mode` returns the dark_mode version of an icon. This should usually + // be handled by `color_current_page_icon` but in cases where the icon has + // hardcoded colors this can be used to return a different icon. E.g., the + // SuperGIcon will return different icons in dark and light modes. ui::ImageModel GetIcon(int dip_size, SkColor color_current_page_icon, SkColor color_vectors, SkColor color_bright_vectors, + SkColor color_vectors_with_background, IconFetchedCallback on_icon_fetched, bool dark_mode) const;
diff --git a/components/omnibox/browser/omnibox_view_unittest.cc b/components/omnibox/browser/omnibox_view_unittest.cc index 13f5fb8a..2259d92 100644 --- a/components/omnibox/browser/omnibox_view_unittest.cc +++ b/components/omnibox/browser/omnibox_view_unittest.cc
@@ -183,7 +183,7 @@ ui::ImageModel icon = view()->GetIcon( gfx::kFaviconSize, gfx::kPlaceholderColor, gfx::kPlaceholderColor, - gfx::kPlaceholderColor, base::DoNothing(), false); + gfx::kPlaceholderColor, gfx::kPlaceholderColor, base::DoNothing(), false); EXPECT_EQ(expected_icon, icon); } @@ -204,7 +204,7 @@ ui::ImageModel icon = view()->GetIcon( gfx::kFaviconSize, gfx::kPlaceholderColor, gfx::kPlaceholderColor, - gfx::kPlaceholderColor, base::DoNothing(), false); + gfx::kPlaceholderColor, gfx::kPlaceholderColor, base::DoNothing(), false); EXPECT_EQ(expected_icon, icon); } @@ -224,7 +224,7 @@ view()->GetIcon(gfx::kFaviconSize, gfx::kPlaceholderColor, gfx::kPlaceholderColor, gfx::kPlaceholderColor, - base::DoNothing(), false); + gfx::kPlaceholderColor, base::DoNothing(), false); EXPECT_EQ(page_url, kUrl); }
diff --git a/components/omnibox/common/omnibox_features.cc b/components/omnibox/common/omnibox_features.cc index 949325cf..8274c21 100644 --- a/components/omnibox/common/omnibox_features.cc +++ b/components/omnibox/common/omnibox_features.cc
@@ -284,6 +284,11 @@ "SuppressClipboardSuggestionAfterFirstUsed", base::FEATURE_DISABLED_BY_DEFAULT); +// If enabled, company entity icons may be replaced by a search loupe. +BASE_FEATURE(kCompanyEntityIconAdjustment, + "CompanyEntityIconAdjustment", + base::FEATURE_DISABLED_BY_DEFAULT); + // If enabled, uses the Chrome Refresh 2023 design's shape for action chips in // the omnibox suggestion popup. BASE_FEATURE(kCr2023ActionChips,
diff --git a/components/omnibox/common/omnibox_features.h b/components/omnibox/common/omnibox_features.h index 344178b..dd869be 100644 --- a/components/omnibox/common/omnibox_features.h +++ b/components/omnibox/common/omnibox_features.h
@@ -80,6 +80,7 @@ BASE_DECLARE_FEATURE(kAdaptiveSuggestionsCount); BASE_DECLARE_FEATURE(kClipboardSuggestionContentHidden); BASE_DECLARE_FEATURE(kSuppressClipboardSuggestionAfterFirstUsed); +BASE_DECLARE_FEATURE(kCompanyEntityIconAdjustment); BASE_DECLARE_FEATURE(kCr2023ActionChips); BASE_DECLARE_FEATURE(kCr2023ActionChipsIcons); BASE_DECLARE_FEATURE(kSuggestionAnswersColorReverse);
diff --git a/components/page_info_strings.grdp b/components/page_info_strings.grdp index 73a288f7..50016e07 100644 --- a/components/page_info_strings.grdp +++ b/components/page_info_strings.grdp
@@ -859,9 +859,24 @@ =1 {Chrome will block cookies again tomorrow} other {# days until Chrome blocks cookies again}} </message> + <message name="IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_LIMITING_RESTART_TITLE" desc="Subtitle shown on the page info bubble indicating how long until cookies are limited again."> + {COUNT, plural, + =0 {Chrome will limit cookies again today} + =1 {Chrome will limit cookies again tomorrow} + other {# days until Chrome limits cookies again}} + </message> + <message name="IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_3PC_BLOCKED_RESTART_TITLE" desc="Subtitle shown on the page info bubble indicating how long until cookies are blocked again."> + {COUNT, plural, + =0 {Cookies will be blocked again today} + =1 {Cookies will be blocked again tomorrow} + other {# days until cookies are blocked again}} + </message> <message name="IDS_PAGE_INFO_COOKIES_BLOCKING_RESTART_DESCRIPTION_TODAY" desc="Descriptive text in the page info bubble after the user has allowed third-party cookies on a site explaining the trade-off of their decision."> You allowed this site to use third-party cookies. This means that most site features should work, but you have less protection. </message> + <message name="IDS_PAGE_INFO_COOKIES_TRACKING_PROTECTION_COOKIES_RESTART_DESCRIPTION" desc="Descriptive text in the page info bubble after the user has temporarily allowed third-party cookies on a site explaining the browsing protection trade-off of their decision."> + You temporarily allowed this site to use third-party cookies, which means less browsing protection but site features are more likely to work as expected. + </message> <message name="IDS_PAGE_INFO_COOKIES_PERMANENT_ALLOWED_TITLE" desc="A subtitle in the page info bubble if cookies were allowed by the user and they won't be automatically blocked again the future."> You allowed third-party cookies for this site </message>
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_COOKIES_TRACKING_PROTECTION_COOKIES_RESTART_DESCRIPTION.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_COOKIES_TRACKING_PROTECTION_COOKIES_RESTART_DESCRIPTION.png.sha1 new file mode 100644 index 0000000..b29996f --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_COOKIES_TRACKING_PROTECTION_COOKIES_RESTART_DESCRIPTION.png.sha1
@@ -0,0 +1 @@ +2af631ce1aaefa787ed93374959184c97a1a3f26 \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_3PC_BLOCKED_RESTART_TITLE.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_3PC_BLOCKED_RESTART_TITLE.png.sha1 new file mode 100644 index 0000000..8f3992a3 --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_3PC_BLOCKED_RESTART_TITLE.png.sha1
@@ -0,0 +1 @@ +eecaceed8d93a8f93ac50db66cc73608c3ff2107 \ No newline at end of file
diff --git a/components/page_info_strings_grdp/IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_LIMITING_RESTART_TITLE.png.sha1 b/components/page_info_strings_grdp/IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_LIMITING_RESTART_TITLE.png.sha1 new file mode 100644 index 0000000..25aa39ad --- /dev/null +++ b/components/page_info_strings_grdp/IDS_PAGE_INFO_TRACKING_PROTECTION_COOKIES_LIMITING_RESTART_TITLE.png.sha1
@@ -0,0 +1 @@ +e29cfa6e6888216bd22120ae79f9cb67645a5f7c \ No newline at end of file
diff --git a/components/password_manager/content/browser/BUILD.gn b/components/password_manager/content/browser/BUILD.gn index 61042d3..7a7015d 100644 --- a/components/password_manager/content/browser/BUILD.gn +++ b/components/password_manager/content/browser/BUILD.gn
@@ -49,6 +49,8 @@ "//mojo/public/cpp/system", "//net", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("test_support") {
diff --git a/components/password_manager/content/common/BUILD.gn b/components/password_manager/content/common/BUILD.gn index a083906d..6d1832c 100644 --- a/components/password_manager/content/common/BUILD.gn +++ b/components/password_manager/content/common/BUILD.gn
@@ -7,4 +7,5 @@ "web_ui_constants.cc", "web_ui_constants.h", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] }
diff --git a/components/password_manager/core/browser/BUILD.gn b/components/password_manager/core/browser/BUILD.gn index c6c840e..526198b 100644 --- a/components/password_manager/core/browser/BUILD.gn +++ b/components/password_manager/core/browser/BUILD.gn
@@ -27,6 +27,7 @@ "//base", "//sql", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } static_library("browser") { @@ -226,10 +227,11 @@ ] all_dependent_configs = [ ":password_reuse_detection_config" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] public_deps = [ - ":password_store_interface", ":password_form", + ":password_store_interface", ":sql_builder", "//base", "//components/password_manager/core/browser/affiliation", @@ -384,28 +386,30 @@ "//components/signin/public/base", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("password_store_interface") { sources = [ - "password_store_backend_error.h", + "interactions_stats.cc", + "interactions_stats.h", "password_store_backend_error.cc", - "password_store_interface.h", + "password_store_backend_error.h", "password_store_change.cc", "password_store_change.h", "password_store_consumer.cc", "password_store_consumer.h", - "interactions_stats.h", - "interactions_stats.cc", - "password_store_util.h", + "password_store_interface.h", "password_store_util.cc", + "password_store_util.h", ] deps = [ ":password_form", - "//url", "//base", "//components/keyed_service/core", + "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } if (is_android) { @@ -442,6 +446,7 @@ "//crypto", "//google_apis", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } static_library("hash_password_manager") { @@ -456,6 +461,7 @@ "//components/password_manager/core/common", "//components/prefs", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } static_library("test_support") { @@ -569,7 +575,6 @@ "password_access_authenticator_unittest.cc", "password_account_storage_settings_watcher_unittest.cc", "password_autofill_manager_unittest.cc", - "password_bubble_experiment_unittest.cc", "password_change_success_tracker_impl_unittest.cc", "password_counter_unittest.cc", "password_feature_manager_impl_unittest.cc",
diff --git a/components/password_manager/core/browser/affiliation/BUILD.gn b/components/password_manager/core/browser/affiliation/BUILD.gn index 0f7fd22..71ed753 100644 --- a/components/password_manager/core/browser/affiliation/BUILD.gn +++ b/components/password_manager/core/browser/affiliation/BUILD.gn
@@ -53,6 +53,7 @@ "//sql", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("affiliation_fetching") { @@ -69,6 +70,7 @@ "//net", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("test_support") {
diff --git a/components/password_manager/core/browser/browser_save_password_progress_logger_unittest.cc b/components/password_manager/core/browser/browser_save_password_progress_logger_unittest.cc index 2d839fb..005a672 100644 --- a/components/password_manager/core/browser/browser_save_password_progress_logger_unittest.cc +++ b/components/password_manager/core/browser/browser_save_password_progress_logger_unittest.cc
@@ -61,7 +61,7 @@ // Add a password field. autofill::FormFieldData field; field.name = u"password"; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.is_focusable = true; field.autocomplete_attribute = "new-password"; field.unique_renderer_id = autofill::FieldRendererId(10); @@ -69,7 +69,7 @@ // Add a text field. field.name = u"email"; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.is_focusable = false; field.unique_renderer_id = autofill::FieldRendererId(42); field.value = u"a@example.com";
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc index 709c73648..f387e939 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator.cc
@@ -271,7 +271,7 @@ // Migrate non-syncable data that is associated with a previously // synced account from the android backend to the built-in backend. android_backend_->GetAllLoginsForAccountAsync( - prefs_->GetString(::prefs::kGoogleServicesLastUsername), + prefs_->GetString(::prefs::kGoogleServicesLastSyncingUsername), base::BindOnce( &BuiltInBackendToAndroidBackendMigrator::MigrateNonSyncableData, weak_ptr_factory_.GetWeakPtr(), built_in_backend_));
diff --git a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc index 425dbac5..357a2d1 100644 --- a/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc +++ b/components/password_manager/core/browser/built_in_backend_to_android_backend_migrator_unittest.cc
@@ -74,8 +74,8 @@ 0.0); prefs_.registry()->RegisterBooleanPref( prefs::kRequiresMigrationAfterSyncStatusChange, false); - prefs_.registry()->RegisterStringPref(::prefs::kGoogleServicesLastUsername, - "testaccount@gmail.com"); + prefs_.registry()->RegisterStringPref( + ::prefs::kGoogleServicesLastSyncingUsername, "testaccount@gmail.com"); prefs_.registry()->RegisterBooleanPref( prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); prefs_.registry()->RegisterIntegerPref( @@ -647,7 +647,7 @@ prefs()->registry()->RegisterBooleanPref( prefs::kRequiresMigrationAfterSyncStatusChange, false); prefs()->registry()->RegisterStringPref( - ::prefs::kGoogleServicesLastUsername, "testaccount@gmail.com"); + ::prefs::kGoogleServicesLastSyncingUsername, "testaccount@gmail.com"); prefs()->registry()->RegisterBooleanPref( prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); prefs()->registry()->RegisterIntegerPref(
diff --git a/components/password_manager/core/browser/export/BUILD.gn b/components/password_manager/core/browser/export/BUILD.gn index 508aa0a..0cbc1140 100644 --- a/components/password_manager/core/browser/export/BUILD.gn +++ b/components/password_manager/core/browser/export/BUILD.gn
@@ -21,6 +21,7 @@ # TODO(crbug.com/1479425): Remove dependency on core/browser. Instead depend on subdirectories of browser. "//components/password_manager/core/browser", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("unit_tests") {
diff --git a/components/password_manager/core/browser/features/BUILD.gn b/components/password_manager/core/browser/features/BUILD.gn index 1f0bc8f..67db75c2 100644 --- a/components/password_manager/core/browser/features/BUILD.gn +++ b/components/password_manager/core/browser/features/BUILD.gn
@@ -8,6 +8,7 @@ "password_features.h", ] deps = [ "//base" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("utils") { @@ -24,6 +25,8 @@ "//components/sync/service", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + if (!is_android && !is_ios) { sources += [ "password_manager_features_util_desktop.cc" ] } else {
diff --git a/components/password_manager/core/browser/features/password_features.cc b/components/password_manager/core/browser/features/password_features.cc index 913bb069..58c8347 100644 --- a/components/password_manager/core/browser/features/password_features.cc +++ b/components/password_manager/core/browser/features/password_features.cc
@@ -6,6 +6,12 @@ namespace password_manager::features { +// When enabled, updates to shared existing passwords from the same sender are +// auto-approved. +BASE_FEATURE(kAutoApproveSharedPasswordUpdatesFromSameSender, + "AutoApproveSharedPasswordUpdatesFromSameSender", + base::FEATURE_DISABLED_BY_DEFAULT); + // Enables Biometrics for the Touch To Fill feature. This only effects Android. BASE_FEATURE(kBiometricTouchToFill, "BiometricTouchToFill",
diff --git a/components/password_manager/core/browser/features/password_features.h b/components/password_manager/core/browser/features/password_features.h index f59ba1a..c68ab0d 100644 --- a/components/password_manager/core/browser/features/password_features.h +++ b/components/password_manager/core/browser/features/password_features.h
@@ -14,6 +14,8 @@ // All features in alphabetical order. The features should be documented // alongside the definition of their values in the .cc file. +BASE_DECLARE_FEATURE(kAutoApproveSharedPasswordUpdatesFromSameSender); + BASE_DECLARE_FEATURE(kBiometricTouchToFill); BASE_DECLARE_FEATURE(kDisablePasswordsDropdownForCvcFields);
diff --git a/components/password_manager/core/browser/form_parsing/BUILD.gn b/components/password_manager/core/browser/form_parsing/BUILD.gn index 159411d..b7bb3286 100644 --- a/components/password_manager/core/browser/form_parsing/BUILD.gn +++ b/components/password_manager/core/browser/form_parsing/BUILD.gn
@@ -24,6 +24,8 @@ "//components/password_manager/core/common", "//components/password_manager/core/common:features", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("unit_tests") {
diff --git a/components/password_manager/core/browser/form_parsing/form_data_parser.cc b/components/password_manager/core/browser/form_parsing/form_data_parser.cc index c29d025..f30d352a 100644 --- a/components/password_manager/core/browser/form_parsing/form_data_parser.cc +++ b/components/password_manager/core/browser/form_parsing/form_data_parser.cc
@@ -950,8 +950,8 @@ continue; } - const bool is_password = field.form_control_type == - autofill::StringToFormControlType("password"); + const bool is_password = + field.form_control_type == autofill::FormControlType::kInputPassword; if (!field_value.empty()) { std::set<base::StringPiece16>& seen_values = @@ -1049,8 +1049,7 @@ significant_fields.accepts_webauthn_credentials; for (const FormFieldData& field : form_data.fields) { - if (field.form_control_type == - autofill::StringToFormControlType("password") && + if (field.form_control_type == autofill::FormControlType::kInputPassword && (field.properties_mask & FieldPropertiesFlags::kAutofilled)) { result->form_has_autofilled_value = true; }
diff --git a/components/password_manager/core/browser/form_parsing/form_data_parser.h b/components/password_manager/core/browser/form_parsing/form_data_parser.h index 5ebdf3c..aa0134c0 100644 --- a/components/password_manager/core/browser/form_parsing/form_data_parser.h +++ b/components/password_manager/core/browser/form_parsing/form_data_parser.h
@@ -55,7 +55,7 @@ AutocompleteFlag autocomplete_flag = AutocompleteFlag::kNone; // True if field->form_control_type == - // autofill::StringToFormControlType("password"). + // autofill::FormControlType::kInputPassword. bool is_password = false; // True if field is predicted to be a password.
diff --git a/components/password_manager/core/browser/form_saver_impl_unittest.cc b/components/password_manager/core/browser/form_saver_impl_unittest.cc index 6a3801d..4d748db 100644 --- a/components/password_manager/core/browser/form_saver_impl_unittest.cc +++ b/components/password_manager/core/browser/form_saver_impl_unittest.cc
@@ -284,7 +284,7 @@ PasswordForm pending = CreatePending(u"nameofuser", u"wordToP4a55"); FormFieldData field; field.name = u"name"; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.value = u"value"; field.label = u"label"; field.placeholder = u"placeholder"; @@ -312,7 +312,7 @@ ASSERT_EQ(1u, saved.form_data.fields.size()); const FormFieldData& saved_field = saved.form_data.fields[0]; EXPECT_EQ(u"name", saved_field.name); - EXPECT_EQ(autofill::StringToFormControlType("password"), + EXPECT_EQ(autofill::FormControlType::kInputPassword, saved_field.form_control_type); EXPECT_TRUE(saved_field.value.empty()); EXPECT_TRUE(saved_field.label.empty());
diff --git a/components/password_manager/core/browser/generation/BUILD.gn b/components/password_manager/core/browser/generation/BUILD.gn index 5a8b307..41a91b3 100644 --- a/components/password_manager/core/browser/generation/BUILD.gn +++ b/components/password_manager/core/browser/generation/BUILD.gn
@@ -17,6 +17,7 @@ "//base", "//components/password_manager/core/common:features", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("generation") { @@ -33,6 +34,7 @@ "//services/network/public/cpp", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("unit_tests") {
diff --git a/components/password_manager/core/browser/import/BUILD.gn b/components/password_manager/core/browser/import/BUILD.gn index a51e919..b8bd964 100644 --- a/components/password_manager/core/browser/import/BUILD.gn +++ b/components/password_manager/core/browser/import/BUILD.gn
@@ -29,6 +29,7 @@ "//components/password_manager/services/csv_password:service", "//components/sync/base:base", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("importer_unit_tests") { @@ -67,6 +68,7 @@ "//components/password_manager/core/browser/form_parsing", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("csv_unit_tests") {
diff --git a/components/password_manager/core/browser/leak_detection/BUILD.gn b/components/password_manager/core/browser/leak_detection/BUILD.gn index 11171fb..059686c 100644 --- a/components/password_manager/core/browser/leak_detection/BUILD.gn +++ b/components/password_manager/core/browser/leak_detection/BUILD.gn
@@ -18,6 +18,7 @@ "//base", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("leak_detection") { @@ -57,6 +58,8 @@ "//third_party/private-join-and-compute/src:ec_commutative_cipher", "//url", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("test_support") {
diff --git a/components/password_manager/core/browser/password_bubble_experiment.cc b/components/password_manager/core/browser/password_bubble_experiment.cc index cf1b3d7..0b5e0d9 100644 --- a/components/password_manager/core/browser/password_bubble_experiment.cc +++ b/components/password_manager/core/browser/password_bubble_experiment.cc
@@ -6,22 +6,9 @@ #include <string> -#include "base/feature_list.h" -#include "base/metrics/field_trial.h" -#include "base/strings/string_number_conversions.h" -#include "build/build_config.h" -#include "build/chromeos_buildflags.h" #include "components/password_manager/core/browser/password_manager_util.h" -#include "components/password_manager/core/common/password_manager_features.h" #include "components/password_manager/core/common/password_manager_pref_names.h" -#include "components/pref_registry/pref_registry_syncable.h" -#include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" -#include "components/signin/public/base/signin_buildflags.h" -#include "components/signin/public/base/signin_pref_names.h" -#include "components/sync/base/user_selectable_type.h" -#include "components/sync/service/sync_service.h" -#include "components/sync/service/sync_user_settings.h" namespace password_bubble_experiment { @@ -29,12 +16,6 @@ return 3; } -bool HasChosenToSyncPasswords(const syncer::SyncService* sync_service) { - return sync_service && sync_service->IsSyncFeatureEnabled() && - sync_service->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kPasswords); -} - bool ShouldShowAutoSignInPromptFirstRunExperience(PrefService* prefs) { return !prefs->GetBoolean( password_manager::prefs::kWasAutoSignInFirstRunExperienceShown);
diff --git a/components/password_manager/core/browser/password_bubble_experiment.h b/components/password_manager/core/browser/password_bubble_experiment.h index 98b44f8d..7297439 100644 --- a/components/password_manager/core/browser/password_bubble_experiment.h +++ b/components/password_manager/core/browser/password_bubble_experiment.h
@@ -7,19 +7,12 @@ class PrefService; -namespace syncer { -class SyncService; -} - namespace password_bubble_experiment { // Returns the number of times the "Save password" bubble can be dismissed by // user before it's not shown automatically. int GetSmartBubbleDismissalThreshold(); -// Returns true if the user has chosen to sync passwords to Google Account. -bool HasChosenToSyncPasswords(const syncer::SyncService* sync_service); - // Returns true if first run experience for auto sign-in prompt should be shown. bool ShouldShowAutoSignInPromptFirstRunExperience(PrefService* prefs);
diff --git a/components/password_manager/core/browser/password_bubble_experiment_unittest.cc b/components/password_manager/core/browser/password_bubble_experiment_unittest.cc deleted file mode 100644 index 6ac1ca24..0000000 --- a/components/password_manager/core/browser/password_bubble_experiment_unittest.cc +++ /dev/null
@@ -1,89 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/password_manager/core/browser/password_bubble_experiment.h" - -#include <ostream> - -#include "base/feature_list.h" -#include "base/strings/string_number_conversions.h" -#include "base/test/scoped_feature_list.h" -#include "build/chromeos_buildflags.h" -#include "components/password_manager/core/common/password_manager_features.h" -#include "components/password_manager/core/common/password_manager_pref_names.h" -#include "components/prefs/pref_registry_simple.h" -#include "components/prefs/pref_service.h" -#include "components/prefs/testing_pref_service.h" -#include "components/signin/public/base/signin_pref_names.h" -#include "components/signin/public/identity_manager/identity_manager.h" -#include "components/sync/base/model_type.h" -#include "components/sync/base/user_selectable_type.h" -#include "components/sync/test/test_sync_service.h" -#include "testing/gmock/include/gmock/gmock.h" -#include "testing/gtest/include/gtest/gtest.h" - -namespace password_bubble_experiment { - -namespace { - -enum class CustomPassphraseState { NONE, SET }; - -} // namespace - -class PasswordManagerPasswordBubbleExperimentTest : public testing::Test { - public: - PasswordManagerPasswordBubbleExperimentTest() { - signin::IdentityManager::RegisterProfilePrefs(pref_service_.registry()); - } - - syncer::TestSyncService* sync_service() { return &fake_sync_service_; } - - protected: - void SetupFakeSyncServiceForTestCase(syncer::UserSelectableType type, - CustomPassphraseState passphrase_state) { - sync_service()->GetUserSettings()->SetSelectedTypes(false, {type}); - sync_service()->SetIsUsingExplicitPassphrase(passphrase_state == - CustomPassphraseState::SET); - } - - private: - syncer::TestSyncService fake_sync_service_; - TestingPrefServiceSimple pref_service_; -}; - -TEST_F(PasswordManagerPasswordBubbleExperimentTest, HasChosenToSyncPasswords) { - constexpr struct { - syncer::UserSelectableType type; - CustomPassphraseState passphrase_state; - bool expected_sync_user; - } kTestData[] = { - {syncer::UserSelectableType::kBookmarks, CustomPassphraseState::NONE, - false}, - {syncer::UserSelectableType::kBookmarks, CustomPassphraseState::SET, - false}, - {syncer::UserSelectableType::kPasswords, CustomPassphraseState::NONE, - true}, - {syncer::UserSelectableType::kPasswords, CustomPassphraseState::SET, - true}, - }; - for (const auto& test_case : kTestData) { - SCOPED_TRACE(testing::Message("#test_case = ") << (&test_case - kTestData)); - SetupFakeSyncServiceForTestCase(test_case.type, test_case.passphrase_state); - - EXPECT_EQ(test_case.expected_sync_user, - HasChosenToSyncPasswords(sync_service())); - } -} - -TEST_F(PasswordManagerPasswordBubbleExperimentTest, - HasChosenToSyncPasswordsSyncFeatureDisabled) { - SetupFakeSyncServiceForTestCase(syncer::UserSelectableType::kPasswords, - CustomPassphraseState::NONE); - sync_service()->SetDisableReasons( - {syncer::SyncService::DISABLE_REASON_ENTERPRISE_POLICY}); - - EXPECT_FALSE(HasChosenToSyncPasswords(sync_service())); -} - -} // namespace password_bubble_experiment
diff --git a/components/password_manager/core/browser/password_credential_filler_impl.cc b/components/password_manager/core/browser/password_credential_filler_impl.cc index 2e4bfc48..39b00b8 100644 --- a/components/password_manager/core/browser/password_credential_filler_impl.cc +++ b/components/password_manager/core/browser/password_credential_filler_impl.cc
@@ -73,8 +73,7 @@ // block a form submission. Note: Don't use |check_status != // kNotCheckable|, a radio button is considered a "checkable" element too, // but it should block a submission. - return field.form_control_type == - autofill::StringToFormControlType("checkbox"); + return field.form_control_type == autofill::FormControlType::kInputCheckbox; }; for (size_t i = username_index + 1; i < password_index; ++i) {
diff --git a/components/password_manager/core/browser/password_credential_filler_impl_unittest.cc b/components/password_manager/core/browser/password_credential_filler_impl_unittest.cc index 2ff6236..adde97cc 100644 --- a/components/password_manager/core/browser/password_credential_filler_impl_unittest.cc +++ b/components/password_manager/core/browser/password_credential_filler_impl_unittest.cc
@@ -59,8 +59,8 @@ type == FormFieldFocusabilityType::kFocusableCheckbox); field.form_control_type = (type == FormFieldFocusabilityType::kFocusableCheckbox) - ? autofill::StringToFormControlType("checkbox") - : autofill::StringToFormControlType("input"); + ? autofill::FormControlType::kInputCheckbox + : autofill::FormControlType::kEmpty; return field; }); return form;
diff --git a/components/password_manager/core/browser/password_form_manager_unittest.cc b/components/password_manager/core/browser/password_form_manager_unittest.cc index df1bba4..0f9ff1f 100644 --- a/components/password_manager/core/browser/password_form_manager_unittest.cc +++ b/components/password_manager/core/browser/password_form_manager_unittest.cc
@@ -368,14 +368,14 @@ field.name = u"firstname"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = autofill::FieldRendererId(2); observed_form_.fields.push_back(field); field.name = u"username"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = autofill::FieldRendererId(3); observed_form_.fields.push_back(field); @@ -384,7 +384,7 @@ field.name = u"password"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = autofill::FieldRendererId(4); observed_form_.fields.push_back(field); observed_form_only_password_fields_.fields.push_back(field); @@ -392,7 +392,7 @@ field.name = u"password2"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = autofill::FieldRendererId(5); observed_form_only_password_fields_.fields.push_back(field); @@ -703,7 +703,7 @@ const autofill::FieldRendererId confirm_password_render_id( new_password_render_id.value() + 1); field.unique_renderer_id = confirm_password_render_id; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.autocomplete_attribute = "new-password"; observed_form_.fields.push_back(field); @@ -1250,13 +1250,12 @@ saved_match_.all_alternative_usernames) { FormFieldData text_field; text_field.name = alternative.name; - text_field.form_control_type = autofill::StringToFormControlType("text"); + text_field.form_control_type = autofill::FormControlType::kInputText; saved_match_.form_data.fields.push_back(text_field); } FormFieldData password_field; password_field.name = saved_match_.password_element; - password_field.form_control_type = - autofill::StringToFormControlType("password"); + password_field.form_control_type = autofill::FormControlType::kInputPassword; saved_match_.form_data.fields.push_back(password_field); SetNonFederatedAndNotifyFetchCompleted({&saved_match_}); @@ -1325,13 +1324,12 @@ saved_match_.all_alternative_usernames) { FormFieldData field; field.name = alternative.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; saved_match_.form_data.fields.push_back(field); } FormFieldData password_field; password_field.name = saved_match_.password_element; - password_field.form_control_type = - autofill::StringToFormControlType("password"); + password_field.form_control_type = autofill::FormControlType::kInputPassword; saved_match_.form_data.fields.push_back(password_field); SetNonFederatedAndNotifyFetchCompleted({&saved_match_}); @@ -2020,7 +2018,7 @@ FormData form = observed_form_; form.fields[kUsernameFieldIndex].form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; EXPECT_TRUE(HasObservedFormChanged(form, *form_manager_)); form_manager_.reset(); @@ -3104,7 +3102,7 @@ FormData submitted_form = observed_form_only_password_fields_; FormFieldData username_field; username_field.name = u"username"; - username_field.form_control_type = autofill::StringToFormControlType("text"); + username_field.form_control_type = autofill::FormControlType::kInputText; username_field.value = u"oldusername"; username_field.unique_renderer_id = autofill::FieldRendererId(2); submitted_form.fields.insert(std::begin(submitted_form.fields),
diff --git a/components/password_manager/core/browser/password_form_metrics_recorder.cc b/components/password_manager/core/browser/password_form_metrics_recorder.cc index 18ddc07b..c771894d 100644 --- a/components/password_manager/core/browser/password_form_metrics_recorder.cc +++ b/components/password_manager/core/browser/password_form_metrics_recorder.cc
@@ -146,8 +146,7 @@ is_possibly_saved_password_in_account_store; bool field_has_password_type = - field.form_control_type == - autofill::StringToFormControlType("password"); + field.form_control_type == autofill::FormControlType::kInputPassword; if (is_possibly_saved_username && (!is_possibly_saved_password || !field_has_password_type)) {
diff --git a/components/password_manager/core/browser/password_form_metrics_recorder_unittest.cc b/components/password_manager/core/browser/password_form_metrics_recorder_unittest.cc index 8c847b98..717c7073 100644 --- a/components/password_manager/core/browser/password_form_metrics_recorder_unittest.cc +++ b/components/password_manager/core/browser/password_form_metrics_recorder_unittest.cc
@@ -638,8 +638,8 @@ form_field.properties_mask |= FieldPropertiesFlags::kAutofilledOnPageLoad; form_field.form_control_type = - field.is_password ? autofill::StringToFormControlType("password") - : autofill::StringToFormControlType("text"); + field.is_password ? autofill::FormControlType::kInputPassword + : autofill::FormControlType::kInputText; form.fields.push_back(form_field); }
diff --git a/components/password_manager/core/browser/password_manager_unittest.cc b/components/password_manager/core/browser/password_manager_unittest.cc index 7eabcf8..345d90cb 100644 --- a/components/password_manager/core/browser/password_manager_unittest.cc +++ b/components/password_manager/core/browser/password_manager_unittest.cc
@@ -498,7 +498,7 @@ field.id_attribute = field.name; field.name_attribute = field.name; field.value = u"googleuser"; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = FieldRendererId(2); form_data.fields.push_back(field); @@ -506,7 +506,7 @@ field.id_attribute = field.name; field.name_attribute = field.name; field.value = u"p4ssword"; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = FieldRendererId(3); form_data.fields.push_back(field); @@ -580,7 +580,7 @@ field.name = u"Email"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = FieldRendererId(31); form_data.fields.push_back(field); return form_data; @@ -618,7 +618,7 @@ password_field.id_attribute = form.password_element; password_field.value = form.password_value; password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; password_field.unique_renderer_id = FieldRendererId(2); form.form_data.fields.push_back(password_field); @@ -626,7 +626,7 @@ captcha_field.name = u"captcha_element"; captcha_field.id_attribute = captcha_field.name; captcha_field.value = u"captcha_value"; - captcha_field.form_control_type = autofill::StringToFormControlType("text"); + captcha_field.form_control_type = autofill::FormControlType::kInputText; captcha_field.unique_renderer_id = FieldRendererId(3); form.form_data.fields.push_back(captcha_field); @@ -646,7 +646,7 @@ otp_field.name = form.username_element; otp_field.name_attribute = form.username_element; otp_field.id_attribute = form.username_element; - otp_field.form_control_type = autofill::StringToFormControlType("text"); + otp_field.form_control_type = autofill::FormControlType::kInputText; otp_field.unique_renderer_id = FieldRendererId(61); form.form_data.fields.push_back(otp_field); @@ -667,7 +667,7 @@ name_field.name = u"name"; name_field.id_attribute = name_field.name; name_field.value = u"Name"; - name_field.form_control_type = autofill::StringToFormControlType("text"); + name_field.form_control_type = autofill::FormControlType::kInputText; name_field.unique_renderer_id = FieldRendererId(2); form.form_data.fields.push_back(name_field); @@ -675,7 +675,7 @@ surname_field.name = form.username_element; surname_field.id_attribute = surname_field.name; surname_field.value = form.username_value; - surname_field.form_control_type = autofill::StringToFormControlType("text"); + surname_field.form_control_type = autofill::FormControlType::kInputText; surname_field.unique_renderer_id = FieldRendererId(3); form.form_data.fields.push_back(surname_field); @@ -684,7 +684,7 @@ password_field.id_attribute = form.password_element; password_field.value = form.password_value; password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; password_field.unique_renderer_id = FieldRendererId(4); form.form_data.fields.push_back(password_field); @@ -705,7 +705,7 @@ field.name = form.username_element; field.id_attribute = field.name; field.value = form.username_value; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = FieldRendererId(2); field.autocomplete_attribute = "cc-name"; form.form_data.fields.push_back(field); @@ -713,7 +713,7 @@ field.name = form.password_element; field.id_attribute = field.name; field.value = form.password_value; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = FieldRendererId(3); field.autocomplete_attribute = "cc-number"; form.form_data.fields.push_back(field); @@ -1758,7 +1758,7 @@ field.name = u"new_password_element"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = FieldRendererId(4); form_data.fields.push_back(field); @@ -1850,11 +1850,11 @@ form_data1.fields[0].name = u"Email"; form_data1.fields[0].unique_renderer_id = FieldRendererId(1); form_data1.fields[0].form_control_type = - autofill::StringToFormControlType("text"); + autofill::FormControlType::kInputText; form_data1.fields[1].name = u"Passwd"; form_data1.fields[1].unique_renderer_id = FieldRendererId(2); form_data1.fields[1].form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; FormData form_data2 = form_data1; form_data2.url = second_form.url; @@ -3614,7 +3614,7 @@ FormFieldData field; field.name_attribute = one_time_code_form.password_element; field.value = one_time_code_form.password_value; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; one_time_code_form.form_data.fields.push_back(field); PasswordFormFillData form_data; @@ -3830,13 +3830,13 @@ form_data.url = GURL("http://example.com"); FormFieldData username_field; - username_field.form_control_type = autofill::StringToFormControlType("text"); + username_field.form_control_type = autofill::FormControlType::kInputText; constexpr FieldRendererId username_field_id(10); username_field.unique_renderer_id = username_field_id; form_data.fields.push_back(username_field); FormFieldData password_field; - password_field.form_control_type = autofill::StringToFormControlType("text"); + password_field.form_control_type = autofill::FormControlType::kInputText; constexpr FieldRendererId password_field_id(11); password_field.unique_renderer_id = password_field_id; form_data.fields.push_back(password_field); @@ -4420,7 +4420,7 @@ FormFieldData old_password_field; old_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; old_password_field.unique_renderer_id = FieldRendererId(0); old_password_field.name = u"oldpass"; form_data.fields.push_back(old_password_field); @@ -4432,14 +4432,14 @@ // website's scripts. FormFieldData new_password_field; new_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; new_password_field.unique_renderer_id = FieldRendererId(1); new_password_field.name = u"newpass"; form_data.fields.push_back(new_password_field); FormFieldData confirm_password_field; confirm_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; confirm_password_field.unique_renderer_id = FieldRendererId(2); confirm_password_field.name = u"confpass"; form_data.fields.push_back(confirm_password_field); @@ -4474,7 +4474,7 @@ FormFieldData old_password_field; old_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; old_password_field.unique_renderer_id = FieldRendererId(1); old_password_field.name = u"oldpass"; old_password_field.value = u"oldpass"; @@ -4482,7 +4482,7 @@ FormFieldData new_password_field; new_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; new_password_field.unique_renderer_id = FieldRendererId(2); new_password_field.name = u"newpass"; new_password_field.autocomplete_attribute = "new-password"; @@ -4490,7 +4490,7 @@ FormFieldData confirm_password_field; confirm_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; confirm_password_field.unique_renderer_id = FieldRendererId(3); confirm_password_field.name = u"confpass"; form_data.fields.push_back(confirm_password_field); @@ -4529,8 +4529,7 @@ form_data.url = test_form_url_; FormFieldData password_field; - password_field.form_control_type = - autofill::StringToFormControlType("password"); + password_field.form_control_type = autofill::FormControlType::kInputPassword; password_field.unique_renderer_id = FieldRendererId(1); password_field.name = u"one-time-code"; password_field.value = u"123456"; @@ -4562,7 +4561,7 @@ FormFieldData old_password_field; old_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; old_password_field.unique_renderer_id = FieldRendererId(1); old_password_field.name = kEmptyName; old_password_field.value = u"oldpass"; @@ -4570,7 +4569,7 @@ FormFieldData new_password_field; new_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; new_password_field.unique_renderer_id = FieldRendererId(2); new_password_field.name = kEmptyName; new_password_field.autocomplete_attribute = "new-password"; @@ -4608,7 +4607,7 @@ FormFieldData old_password_field; old_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; old_password_field.unique_renderer_id = FieldRendererId(1); old_password_field.name = u"oldpass"; old_password_field.value = u"oldpass"; @@ -4616,7 +4615,7 @@ FormFieldData new_password_field; new_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; new_password_field.unique_renderer_id = FieldRendererId(2); new_password_field.name = u"newpass"; new_password_field.autocomplete_attribute = "new-password"; @@ -4624,7 +4623,7 @@ FormFieldData confirm_password_field; confirm_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; confirm_password_field.unique_renderer_id = FieldRendererId(3); confirm_password_field.name = u"confpass"; form_data.fields.push_back(confirm_password_field); @@ -4675,7 +4674,7 @@ FormFieldData old_password_field; old_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; old_password_field.unique_renderer_id = FieldRendererId(1); old_password_field.name = kEmptyName; old_password_field.value = u"oldpass"; @@ -4683,7 +4682,7 @@ FormFieldData new_password_field; new_password_field.form_control_type = - autofill::StringToFormControlType("password"); + autofill::FormControlType::kInputPassword; new_password_field.unique_renderer_id = FieldRendererId(2); new_password_field.name = kEmptyName; new_password_field.autocomplete_attribute = "new-password"; @@ -5132,15 +5131,14 @@ FormFieldData username_field; username_field.name = test_form_username_element_; username_field.value = one_time_code_form_username_value; - username_field.form_control_type = - autofill::StringToFormControlType("text"); + username_field.form_control_type = autofill::FormControlType::kInputText; username_field.unique_renderer_id = FieldRendererId(1); one_time_code_form.form_data.fields.push_back(username_field); } FormFieldData otp_field; otp_field.value = test_form_otp_value_; - otp_field.form_control_type = autofill::StringToFormControlType("password"); + otp_field.form_control_type = autofill::FormControlType::kInputPassword; otp_field.unique_renderer_id = FieldRendererId(2); one_time_code_form.form_data.fields.push_back(otp_field); switch (prediction_type) {
diff --git a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc index a53ba1b..45cacf86 100644 --- a/components/password_manager/core/browser/password_save_manager_impl_unittest.cc +++ b/components/password_manager/core/browser/password_save_manager_impl_unittest.cc
@@ -217,21 +217,21 @@ field.name = u"firstname"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = autofill::FieldRendererId(1); observed_form_.fields.push_back(field); field.name = u"username"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = autofill::FieldRendererId(2); observed_form_.fields.push_back(field); field.name = u"password"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = autofill::FieldRendererId(3); observed_form_.fields.push_back(field); observed_form_only_password_fields_.fields.push_back(field); @@ -239,7 +239,7 @@ field.name = u"password2"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = autofill::FieldRendererId(5); observed_form_only_password_fields_.fields.push_back(field); @@ -1299,20 +1299,20 @@ field.name = matched_form_username_field_name; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; saved_match_.form_data.fields.push_back(field); field.name = u"firstname"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; saved_match_.form_data.fields.push_back(field); saved_match_.username_element = field.name; field.name = u"password"; field.id_attribute = field.name; field.name_attribute = field.name; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; saved_match_.form_data.fields.push_back(field); saved_match_.password_element = field.name;
diff --git a/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc b/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc index 9e63afa1..da0866de3 100644 --- a/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc +++ b/components/password_manager/core/browser/password_store_backend_migration_decorator_unittest.cc
@@ -39,8 +39,8 @@ kLastMigrationAttemptTime); prefs_.registry()->RegisterBooleanPref( prefs::kRequiresMigrationAfterSyncStatusChange, false); - prefs_.registry()->RegisterStringPref(::prefs::kGoogleServicesLastUsername, - "testaccount@gmail.com"); + prefs_.registry()->RegisterStringPref( + ::prefs::kGoogleServicesLastSyncingUsername, "testaccount@gmail.com"); prefs_.registry()->RegisterBooleanPref( prefs::kUnenrolledFromGoogleMobileServicesDueToErrors, false); prefs_.registry()->RegisterIntegerPref(
diff --git a/components/password_manager/core/browser/password_store_signin_notifier_impl.cc b/components/password_manager/core/browser/password_store_signin_notifier_impl.cc index 0476dd2..d9f424b 100644 --- a/components/password_manager/core/browser/password_store_signin_notifier_impl.cc +++ b/components/password_manager/core/browser/password_store_signin_notifier_impl.cc
@@ -30,11 +30,11 @@ void PasswordStoreSigninNotifierImpl::NotifySignedOut( const std::string& username, - bool primary_account) { + bool syncing_account) { if (!reuse_manager_) return; - if (primary_account) { + if (syncing_account) { metrics_util::LogGaiaPasswordHashChange( metrics_util::GaiaPasswordHashChange::CLEARED_ON_CHROME_SIGNOUT, /*is_sync_password=*/true); @@ -50,20 +50,28 @@ // IdentityManager::Observer implementation. void PasswordStoreSigninNotifierImpl::OnPrimaryAccountChanged( const signin::PrimaryAccountChangeEvent& event) { + // TODO(crbug.com/1462978): Remove this code when ConsentLevel::kSync is + // deleted (since kSignin users are handled by + // OnExtendedAccountInfoRemoved()). See ConsentLevel::kSync documentation for + // details. if (event.GetEventTypeFor(signin::ConsentLevel::kSync) == signin::PrimaryAccountChangeEvent::Type::kCleared) { NotifySignedOut(event.GetPreviousState().primary_account.email, - /* primary_account= */ true); + /*syncing_account=*/true); } } // IdentityManager::Observer implementation. void PasswordStoreSigninNotifierImpl::OnExtendedAccountInfoRemoved( const AccountInfo& info) { - // Only reacts to content area (non-primary) Gaia account sign-out event. + // Only react to non-syncing Gaia account sign-out event - the syncing + // account is handled separately in OnPrimaryAccountChanged(). + // TODO(crbug.com/1462978): Remove the not-kSync check when + // ConsentLevel::kSync is deleted. See ConsentLevel::kSync documentation for + // details. if (info.account_id != identity_manager_->GetPrimaryAccountId(signin::ConsentLevel::kSync)) { - NotifySignedOut(info.email, /* primary_account= */ false); + NotifySignedOut(info.email, /*syncing_account=*/false); } }
diff --git a/components/password_manager/core/browser/password_store_signin_notifier_impl.h b/components/password_manager/core/browser/password_store_signin_notifier_impl.h index f05b4d4..e76c592 100644 --- a/components/password_manager/core/browser/password_store_signin_notifier_impl.h +++ b/components/password_manager/core/browser/password_store_signin_notifier_impl.h
@@ -38,8 +38,8 @@ void OnExtendedAccountInfoRemoved(const AccountInfo& info) override; private: - // Passes signed-out to |store_|. - void NotifySignedOut(const std::string& username, bool primary_account); + // Passes the sign-out notification to `reuse_manager_`. + void NotifySignedOut(const std::string& username, bool syncing_account); raw_ptr<signin::IdentityManager> identity_manager_ = nullptr;
diff --git a/components/password_manager/core/browser/possible_username_data.h b/components/password_manager/core/browser/possible_username_data.h index 5219c2c..acc08bf 100644 --- a/components/password_manager/core/browser/possible_username_data.h +++ b/components/password_manager/core/browser/possible_username_data.h
@@ -46,7 +46,9 @@ } friend bool operator==(const PossibleUsernameFieldIdentifier& lhs, - const PossibleUsernameFieldIdentifier& rhs) = default; + const PossibleUsernameFieldIdentifier& rhs) { + return lhs.driver_id == rhs.driver_id && lhs.renderer_id == rhs.renderer_id; + } }; // Contains information that the user typed in a text field. It might be the
diff --git a/components/password_manager/core/browser/sharing/BUILD.gn b/components/password_manager/core/browser/sharing/BUILD.gn index 5cb2089e..73b94149 100644 --- a/components/password_manager/core/browser/sharing/BUILD.gn +++ b/components/password_manager/core/browser/sharing/BUILD.gn
@@ -31,6 +31,7 @@ "//base", "//components/password_manager/core/browser", "//components/password_manager/core/browser:password_form", + "//components/password_manager/core/browser/features:password_features", "//components/prefs", "//components/signin/public/identity_manager", "//components/sync/base", @@ -43,6 +44,7 @@ "//services/network/public/cpp", "//services/network/public/mojom", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } static_library("test_support") {
diff --git a/components/password_manager/core/browser/sharing/password_receiver_service_impl.cc b/components/password_manager/core/browser/sharing/password_receiver_service_impl.cc index a97c3b2..d4c2fff 100644 --- a/components/password_manager/core/browser/sharing/password_receiver_service_impl.cc +++ b/components/password_manager/core/browser/sharing/password_receiver_service_impl.cc
@@ -7,6 +7,7 @@ #include "base/containers/cxx20_erase.h" #include "base/functional/bind.h" #include "base/functional/callback_forward.h" +#include "components/password_manager/core/browser/features/password_features.h" #include "components/password_manager/core/browser/features/password_manager_features_util.h" #include "components/password_manager/core/browser/password_form.h" #include "components/password_manager/core/browser/password_form_digest.h" @@ -99,12 +100,22 @@ return; } - // Credentials exist already, and hence the invitation cannot be - // auto-approved. For now, emit metrics to assess how frequent this use - // case is. - metrics_util::LogProcessIncomingPasswordSharingInvitationResult( + ProcessIncomingPasswordSharingInvitationResult processing_result = GetProcessSharingInvitationResultForIgnoredInvitations( - **credential_with_same_username_it, invitation_)); + **credential_with_same_username_it, invitation_); + metrics_util::LogProcessIncomingPasswordSharingInvitationResult( + processing_result); + + if (processing_result == + ProcessIncomingPasswordSharingInvitationResult:: + kSharedCredentialsExistWithSameSenderAndDifferentPassword && + base::FeatureList::IsEnabled( + features::kAutoApproveSharedPasswordUpdatesFromSameSender)) { + password_store_->UpdateLogin( + IncomingSharingInvitationToPasswordForm(invitation_), + base::BindOnce(std::move(done_processing_invitation_callback_), this)); + return; + } // Run the callback anyway to cleanup the processing task. std::move(done_processing_invitation_callback_).Run(this); }
diff --git a/components/password_manager/core/browser/sharing/password_receiver_service_impl_unittest.cc b/components/password_manager/core/browser/sharing/password_receiver_service_impl_unittest.cc index 70791a3..d7e6533 100644 --- a/components/password_manager/core/browser/sharing/password_receiver_service_impl_unittest.cc +++ b/components/password_manager/core/browser/sharing/password_receiver_service_impl_unittest.cc
@@ -8,6 +8,7 @@ #include "base/functional/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "components/password_manager/core/browser/features/password_features.h" #include "components/password_manager/core/browser/features/password_manager_features_util.h" @@ -427,4 +428,70 @@ 1); } +TEST_F(PasswordReceiverServiceImplTest, + ShouldIgnorePasswordUpdatesFromSameSenderWhenAutoApproveDisabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndDisableFeature( + features::kAutoApproveSharedPasswordUpdatesFromSameSender); + + base::HistogramTester histogram_tester; + const std::u16string kNewPassword = u"new_password"; + PasswordForm existing_password = CreatePasswordForm(); + existing_password.type = PasswordForm::Type::kReceivedViaSharing; + existing_password.sender_email = u"user@example.com"; + AddLoginAndWait(existing_password, profile_password_store()); + + // Simulate an incoming invitation for the same stored credentials with a + // different password from the same sender. + IncomingSharingInvitation invitation = + PasswordFormToIncomingSharingInvitation(existing_password); + invitation.sender_email = existing_password.sender_email; + invitation.password_value = kNewPassword; + + password_receiver_service()->ProcessIncomingSharingInvitation(invitation); + + RunUntilIdle(); + + // The password value should remain kPassword. + EXPECT_THAT( + profile_password_store().stored_passwords().at(invitation.url.spec()), + ElementsAre(AllOf(Field(&PasswordForm::username_value, kUsername), + Field(&PasswordForm::password_value, kPassword), + Field(&PasswordForm::type, + PasswordForm::Type::kReceivedViaSharing)))); +} + +TEST_F(PasswordReceiverServiceImplTest, + ShouldAcceptPasswordUpdatesFromSameSenderWhenAutoApproveEnabled) { + base::test::ScopedFeatureList feature_list; + feature_list.InitAndEnableFeature( + features::kAutoApproveSharedPasswordUpdatesFromSameSender); + + base::HistogramTester histogram_tester; + const std::u16string kNewPassword = u"new_password"; + PasswordForm existing_password = CreatePasswordForm(); + existing_password.type = PasswordForm::Type::kReceivedViaSharing; + existing_password.sender_email = u"user@example.com"; + AddLoginAndWait(existing_password, profile_password_store()); + + // Simulate an incoming invitation for the same stored credentials with a + // different password from the same sender. + IncomingSharingInvitation invitation = + PasswordFormToIncomingSharingInvitation(existing_password); + invitation.sender_email = existing_password.sender_email; + invitation.password_value = kNewPassword; + + password_receiver_service()->ProcessIncomingSharingInvitation(invitation); + + RunUntilIdle(); + + // The password value should have been updated to kNewPassword. + EXPECT_THAT( + profile_password_store().stored_passwords().at(invitation.url.spec()), + ElementsAre(AllOf(Field(&PasswordForm::username_value, kUsername), + Field(&PasswordForm::password_value, kNewPassword), + Field(&PasswordForm::type, + PasswordForm::Type::kReceivedViaSharing)))); +} + } // namespace password_manager
diff --git a/components/password_manager/core/browser/sync_username_test_base.cc b/components/password_manager/core/browser/sync_username_test_base.cc index c6c2460..7346cc0b 100644 --- a/components/password_manager/core/browser/sync_username_test_base.cc +++ b/components/password_manager/core/browser/sync_username_test_base.cc
@@ -21,12 +21,12 @@ form.url = url; FormFieldData field; field.name = u"username_element"; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.value = ASCIIToUTF16(username); form.fields.push_back(field); field.name = u"password_element"; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.value = u"strong_pw"; form.fields.push_back(field); return form;
diff --git a/components/password_manager/core/browser/well_known_change_password/BUILD.gn b/components/password_manager/core/browser/well_known_change_password/BUILD.gn index 2db56b8..f40fbda 100644 --- a/components/password_manager/core/browser/well_known_change_password/BUILD.gn +++ b/components/password_manager/core/browser/well_known_change_password/BUILD.gn
@@ -18,6 +18,7 @@ "//third_party/abseil-cpp:absl", "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("unit_tests") {
diff --git a/components/password_manager/core/common/BUILD.gn b/components/password_manager/core/common/BUILD.gn index 7bafe6b..2949032 100644 --- a/components/password_manager/core/common/BUILD.gn +++ b/components/password_manager/core/common/BUILD.gn
@@ -35,10 +35,13 @@ ":constants", ":features", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("constants") { sources = [ "password_manager_constants.h" ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("features") { @@ -55,6 +58,8 @@ "//base", "//build:blink_buildflags", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("unit_tests") {
diff --git a/components/password_manager/ios/BUILD.gn b/components/password_manager/ios/BUILD.gn index 0fdb9c2..fc3f3c51 100644 --- a/components/password_manager/ios/BUILD.gn +++ b/components/password_manager/ios/BUILD.gn
@@ -33,6 +33,8 @@ "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + sources = [ "ios_password_manager_driver.h", "ios_password_manager_driver.mm", @@ -67,6 +69,8 @@ "//ios/web/public/js_messaging", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + sources = [ "password_manager_java_script_feature.h" ] } @@ -78,6 +82,8 @@ "//url", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + sources = [ "account_select_fill_data.cc", "account_select_fill_data.h",
diff --git a/components/password_manager/ios/shared_password_controller_unittest.mm b/components/password_manager/ios/shared_password_controller_unittest.mm index b88a501..659461bf 100644 --- a/components/password_manager/ios/shared_password_controller_unittest.mm +++ b/components/password_manager/ios/shared_password_controller_unittest.mm
@@ -603,7 +603,7 @@ field.id_attribute = field.name; field.name_attribute = field.name; field.value = u"googleuser"; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = autofill::test::MakeFieldRendererId(); form_data.fields.push_back(field); @@ -611,7 +611,7 @@ field.id_attribute = field.name; field.name_attribute = field.name; field.value = u"p4ssword"; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = autofill::test::MakeFieldRendererId(); field.max_length = max_length; form_data.fields.push_back(field);
diff --git a/components/password_manager/ios/test_helpers.cc b/components/password_manager/ios/test_helpers.cc index df5a0ac9a..25be1c8 100644 --- a/components/password_manager/ios/test_helpers.cc +++ b/components/password_manager/ios/test_helpers.cc
@@ -78,12 +78,12 @@ FormFieldData field; field.value = base::UTF8ToUTF16(username_value); - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; field.unique_renderer_id = FieldRendererId(username_field_id); form_data->fields.push_back(field); field.value = base::UTF8ToUTF16(password_value); - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; field.unique_renderer_id = FieldRendererId(password_field_id); form_data->fields.push_back(field); } @@ -99,14 +99,14 @@ field.id_attribute = field.name; field.name_attribute = field.name; field.value = u"googleuser"; - field.form_control_type = autofill::StringToFormControlType("text"); + field.form_control_type = autofill::FormControlType::kInputText; form_data.fields.push_back(field); field.name = u"Passwd"; field.id_attribute = field.name; field.name_attribute = field.name; field.value = u"p4ssword"; - field.form_control_type = autofill::StringToFormControlType("password"); + field.form_control_type = autofill::FormControlType::kInputPassword; form_data.fields.push_back(field); return form_data;
diff --git a/components/password_manager/services/csv_password/BUILD.gn b/components/password_manager/services/csv_password/BUILD.gn index 0d1cff7d..415a1171 100644 --- a/components/password_manager/services/csv_password/BUILD.gn +++ b/components/password_manager/services/csv_password/BUILD.gn
@@ -18,6 +18,8 @@ public_deps = [ "//components/password_manager/services/csv_password/public/mojom" ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } if (use_blink) { @@ -36,6 +38,8 @@ "//components/password_manager/services/csv_password/public/mojom", "//mojo/public/cpp/bindings", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } }
diff --git a/components/payments/content/secure_payment_confirmation_app.cc b/components/payments/content/secure_payment_confirmation_app.cc index 5e1a84e7..0a7967e 100644 --- a/components/payments/content/secure_payment_confirmation_app.cc +++ b/components/payments/content/secure_payment_confirmation_app.cc
@@ -27,6 +27,7 @@ #include "device/fido/fido_transport_protocol.h" #include "device/fido/fido_types.h" #include "device/fido/public_key_credential_descriptor.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/mojom/webauthn/authenticator.mojom.h" #include "url/url_constants.h" @@ -215,6 +216,15 @@ mojom::PaymentResponsePtr SecurePaymentConfirmationApp::SetAppSpecificResponseFields( mojom::PaymentResponsePtr response) const { + if (base::FeatureList::IsEnabled( + blink::features::kSecurePaymentConfirmationExtensions)) { + response->get_assertion_authenticator_response = + blink::mojom::GetAssertionAuthenticatorResponse::New( + response_->info.Clone(), response_->authenticator_attachment, + response_->signature, response_->user_handle, + response_->extensions.Clone()); + return response; + } response->secure_payment_confirmation = mojom::SecurePaymentConfirmationResponse::New( response_->info.Clone(), response_->signature,
diff --git a/components/payments/core/features.cc b/components/payments/core/features.cc index c0788f5..e1e751e 100644 --- a/components/payments/core/features.cc +++ b/components/payments/core/features.cc
@@ -57,10 +57,6 @@ #endif ); -BASE_FEATURE(kSecurePaymentConfirmationExtensions, - "SecurePaymentConfirmationExtensions", - base::FEATURE_DISABLED_BY_DEFAULT); - #if !BUILDFLAG(IS_ANDROID) // The blink-side feature of the same name is disabled by default, and can be // enabled directly or via origin trial.
diff --git a/components/payments/core/features.h b/components/payments/core/features.h index 2cb4b7e..586a25f 100644 --- a/components/payments/core/features.h +++ b/components/payments/core/features.h
@@ -44,10 +44,6 @@ // credential store APIs, or if it can only rely on the user-profile database. BASE_DECLARE_FEATURE(kSecurePaymentConfirmationUseCredentialStoreAPIs); -// Enables using webauthn extensions through the secure payment confirmation -// API. -BASE_DECLARE_FEATURE(kSecurePaymentConfirmationExtensions); - #if !BUILDFLAG(IS_ANDROID) // Desktop only, if enabled PaymentHandler will use the new minimal header UX. // See https://crbug.com/1385136.
diff --git a/components/performance_manager/features.cc b/components/performance_manager/features.cc index 1de06608..e9d0920 100644 --- a/components/performance_manager/features.cc +++ b/components/performance_manager/features.cc
@@ -179,4 +179,15 @@ const base::FeatureParam<bool> kUseResourceAttributionCPUMonitor{ &kPageTimelineMonitor, "use_resource_attribution_cpu_monitor", false}; +BASE_FEATURE(kCPUInterventionEvaluationLogging, + "CPUInterventionEvaluationLogging", + base::FEATURE_DISABLED_BY_DEFAULT); + +const base::FeatureParam<base::TimeDelta> kDelayBeforeLogging{ + &kCPUInterventionEvaluationLogging, "delay_before_logging", + base::Seconds(60)}; + +const base::FeatureParam<int> kThresholdChromeCPUPercent{ + &kCPUInterventionEvaluationLogging, "threshold_chrome_cpu_percent", 25}; + } // namespace performance_manager::features
diff --git a/components/performance_manager/public/features.h b/components/performance_manager/public/features.h index ff240482..6ee6301 100644 --- a/components/performance_manager/public/features.h +++ b/components/performance_manager/public/features.h
@@ -240,6 +240,16 @@ // UKM. extern const base::FeatureParam<bool> kUseResourceAttributionCPUMonitor; +// This enables logging to evaluate the efficacy of potential CPU interventions. +BASE_DECLARE_FEATURE(kCPUInterventionEvaluationLogging); + +// This represents the duration that CPU must be over the threshold before +// logging the delayed metrics. +extern const base::FeatureParam<base::TimeDelta> kDelayBeforeLogging; + +// If Chrome CPU utilization is over the specified percent then we will log it. +extern const base::FeatureParam<int> kThresholdChromeCPUPercent; + } // namespace performance_manager::features #endif // COMPONENTS_PERFORMANCE_MANAGER_PUBLIC_FEATURES_H_
diff --git a/components/permissions/features.cc b/components/permissions/features.cc index b2c5946..6a27ca5 100644 --- a/components/permissions/features.cc +++ b/components/permissions/features.cc
@@ -3,6 +3,7 @@ // found in the LICENSE file. #include "components/permissions/features.h" +#include "base/feature_list.h" #include "base/time/time.h" namespace permissions { @@ -107,6 +108,10 @@ "PermissionDedicatedCpssSettings", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kPermissionPredictionsV2, + "PermissionPredictionsV2", + base::FEATURE_DISABLED_BY_DEFAULT); + #if BUILDFLAG(IS_ANDROID) // When enabled, blocks notifications permission prompt when Chrome doesn't @@ -196,6 +201,11 @@ "holdback_chance", 0.2); +const base::FeatureParam<double> kPermissionPredictionsV2HoldbackChance( + &features::kPermissionPredictionsV2, + "holdback_chance", + 0.3); + #if !BUILDFLAG(IS_ANDROID) // Specifies the `trigger_id` of the HaTS survey to trigger immediately after // the user has interacted with a permission prompt. Multiple values can be
diff --git a/components/permissions/features.h b/components/permissions/features.h index 1f89d82..ed3a0a3 100644 --- a/components/permissions/features.h +++ b/components/permissions/features.h
@@ -61,6 +61,9 @@ COMPONENT_EXPORT(PERMISSIONS_COMMON) BASE_DECLARE_FEATURE(kPermissionDedicatedCpssSetting); +COMPONENT_EXPORT(PERMISSIONS_COMMON) +BASE_DECLARE_FEATURE(kPermissionPredictionsV2); + #if BUILDFLAG(IS_ANDROID) COMPONENT_EXPORT(PERMISSIONS_COMMON) @@ -112,6 +115,9 @@ extern const base::FeatureParam<double> kPermissionOnDeviceNotificationPredictionsHoldbackChance; +COMPONENT_EXPORT(PERMISSIONS_COMMON) +extern const base::FeatureParam<double> kPermissionPredictionsV2HoldbackChance; + #if !BUILDFLAG(IS_ANDROID) COMPONENT_EXPORT(PERMISSIONS_COMMON) extern const base::FeatureParam<std::string> kPermissionsPromptSurveyTriggerId;
diff --git a/components/permissions/prediction_service/prediction_common.cc b/components/permissions/prediction_service/prediction_common.cc index 068044b..ff05e16 100644 --- a/components/permissions/prediction_service/prediction_common.cc +++ b/components/permissions/prediction_service/prediction_common.cc
@@ -127,6 +127,10 @@ NOTREACHED() << "CPSS only supports notifications and geolocation at the moment."; } + if (!entity.url.is_empty()) { + SiteFeatures* site_features = proto_request->mutable_site_features(); + site_features->set_origin(entity.url.spec()); + } return proto_request; }
diff --git a/components/permissions/prediction_service/prediction_request_features.h b/components/permissions/prediction_service/prediction_request_features.h index 6e18c2d..8d633b65 100644 --- a/components/permissions/prediction_service/prediction_request_features.h +++ b/components/permissions/prediction_service/prediction_request_features.h
@@ -7,6 +7,7 @@ #include "components/permissions/permission_request_enums.h" #include "components/permissions/request_type.h" +#include "url/gurl.h" namespace permissions { @@ -30,6 +31,9 @@ // The permission action counts for all permissions type. ActionCounts all_permission_counts; + + // The origin of the website requesting the permission. + GURL url; }; } // namespace permissions
diff --git a/components/permissions/prediction_service/prediction_service_messages.proto b/components/permissions/prediction_service/prediction_service_messages.proto index 6e606a39..3e6531d9 100644 --- a/components/permissions/prediction_service/prediction_service_messages.proto +++ b/components/permissions/prediction_service/prediction_service_messages.proto
@@ -10,7 +10,11 @@ // Features that depend on the site that triggered the permission request. // Currently empty but added proactively for future versions. -message SiteFeatures {} +message SiteFeatures { + // This field must be an origin-only URL with a `http` or `https` scheme + // Example of valid value: `https://example.org`. + optional string origin = 1; +} // Statistical features about client's interactions with permission prompts. // These features are computed on all permission actions that happened before
diff --git a/components/permissions/prediction_service/prediction_service_unittest.cc b/components/permissions/prediction_service/prediction_service_unittest.cc index 49c0070a3..3079ce5 100644 --- a/components/permissions/prediction_service/prediction_service_unittest.cc +++ b/components/permissions/prediction_service/prediction_service_unittest.cc
@@ -35,7 +35,7 @@ // type. // A request that has all counts 0. With user gesture. -const permissions::PredictionRequestFeatures kFeaturesAllCountsZero = { +permissions::PredictionRequestFeatures kFeaturesAllCountsZero = { permissions::PermissionRequestGestureType::GESTURE, permissions::RequestType::kNotifications, {0, 0, 0, 0}, @@ -315,6 +315,8 @@ const GURL kUrl_Unlikely{"http://predictionsevice.com/unlikely"}; const GURL kUrl_Likely{"http://predictionsevice.com/likely"}; const GURL kUrl_Invalid{"http://predictionsevice.com/invalid"}; + const GURL test_requesting_url{ + "https://www.test.example/path/to/page.html:8080"}; private: std::string GetResponseForUrl(const GURL& url) { @@ -337,6 +339,14 @@ }; TEST_F(PredictionServiceTest, BuiltProtoRequestIsCorrect) { + // Test origin being added correctly in the request. + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitAndEnableFeature( + permissions::features::kPermissionPredictionsV2); + kFeaturesAllCountsZero.url = test_requesting_url.GetWithEmptyPath(); + kRequestAllCountsZero.mutable_site_features()->set_origin( + "https://www.test.example/"); + struct { PredictionRequestFeatures entity; GeneratePredictionsRequest expected_request;
diff --git a/components/policy/core/DEPS b/components/policy/core/DEPS index ab42c800..86d9a95 100644 --- a/components/policy/core/DEPS +++ b/components/policy/core/DEPS
@@ -3,6 +3,7 @@ "+components/json_schema", "+components/prefs", "+components/version_info", + "+components/invalidation", "+crypto", "+google_apis", "+net/base",
diff --git a/components/policy/core/browser/BUILD.gn b/components/policy/core/browser/BUILD.gn index 388b0c0..d78485bd 100644 --- a/components/policy/core/browser/BUILD.gn +++ b/components/policy/core/browser/BUILD.gn
@@ -36,6 +36,8 @@ "policy_conversions_client.h", "policy_error_map.cc", "policy_error_map.h", + "remote_commands/user_remote_commands_service_base.cc", + "remote_commands/user_remote_commands_service_base.h", "signin/profile_separation_policies.cc", "signin/profile_separation_policies.h", "signin/user_cloud_signin_restriction_policy_fetcher.cc", @@ -79,6 +81,7 @@ "//build:branding_buildflags", "//build:chromeos_buildflags", "//components/google/core/common", + "//components/invalidation/impl", "//components/keyed_service/core", "//components/pref_registry", "//components/prefs",
diff --git a/components/policy/core/browser/remote_commands/user_remote_commands_service_base.cc b/components/policy/core/browser/remote_commands/user_remote_commands_service_base.cc new file mode 100644 index 0000000..a7df48ec --- /dev/null +++ b/components/policy/core/browser/remote_commands/user_remote_commands_service_base.cc
@@ -0,0 +1,61 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/policy/core/browser/remote_commands/user_remote_commands_service_base.h" + +#include "base/time/default_clock.h" +#include "components/invalidation/impl/profile_invalidation_provider.h" +#include "components/policy/core/common/cloud/cloud_policy_core.h" +#include "components/policy/core/common/cloud/cloud_policy_service.h" +#include "components/policy/core/common/cloud/policy_invalidation_scope.h" +#include "components/policy/core/common/remote_commands/remote_commands_factory.h" +#include "components/policy/core/common/remote_commands/remote_commands_invalidator_impl.h" + +namespace policy { + +UserRemoteCommandsServiceBase::UserRemoteCommandsServiceBase( + CloudPolicyCore* core) + : core_(core) {} +UserRemoteCommandsServiceBase::~UserRemoteCommandsServiceBase() = default; + +void UserRemoteCommandsServiceBase::Init() { + CHECK(core_); + if (!core_->service()->IsInitializationComplete()) { + cloud_policy_service_observer_.Observe(core_->service()); + return; + } + + OnCloudPolicyServiceInitializationCompleted(); +} + +void UserRemoteCommandsServiceBase:: + OnCloudPolicyServiceInitializationCompleted() { + cloud_policy_service_observer_.Reset(); + CHECK(core_); + auto* invalidation_provider = GetInvalidationProvider(); + if (!invalidation_provider) { + return; + } + core_->StartRemoteCommandsService(GetFactory(), + PolicyInvalidationScope::kUser); + invalidator_ = std::make_unique<RemoteCommandsInvalidatorImpl>( + core_, base::DefaultClock::GetInstance(), PolicyInvalidationScope::kUser); + invalidator_->Initialize( + invalidation_provider->GetInvalidationServiceForCustomSender( + kPolicyFCMInvalidationSenderID)); +} + +void UserRemoteCommandsServiceBase::OnPolicyRefreshed(bool success) {} + +void UserRemoteCommandsServiceBase::Shutdown() { + cloud_policy_service_observer_.Reset(); + if (invalidator_) { + invalidator_->Shutdown(); + // Reset `invalidator_` ahead of time to avoid dangling pointer from + // `RemoteCommandsInvalidator` to `ProfileInvalidationProvider`. + invalidator_.reset(); + } +} + +} // namespace policy
diff --git a/components/policy/core/browser/remote_commands/user_remote_commands_service_base.h b/components/policy/core/browser/remote_commands/user_remote_commands_service_base.h new file mode 100644 index 0000000..cac22b49 --- /dev/null +++ b/components/policy/core/browser/remote_commands/user_remote_commands_service_base.h
@@ -0,0 +1,65 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_POLICY_CORE_BROWSER_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_BASE_H_ +#define COMPONENTS_POLICY_CORE_BROWSER_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_BASE_H_ + +#include <memory> + +#include "base/memory/raw_ptr.h" +#include "base/scoped_observation.h" +#include "components/keyed_service/core/keyed_service.h" +#include "components/policy/core/common/cloud/cloud_policy_service.h" +#include "components/policy/policy_export.h" + +namespace invalidation { +class ProfileInvalidationProvider; +} + +namespace policy { + +class CloudPolicyCore; +class RemoteCommandsFactory; +class RemoteCommandsInvalidator; + +// A `KeyedService` of UserRemoteCommandService which is responsible for +// initialize and maintain the ownership of a remote command service at the +// profile scope. More details can be found at b/276764782 +// The base class contains all logic that can be shared with iOS in the future. +class POLICY_EXPORT UserRemoteCommandsServiceBase + : public KeyedService, + public CloudPolicyService::Observer { + public: + explicit UserRemoteCommandsServiceBase(CloudPolicyCore* core); + UserRemoteCommandsServiceBase(const UserRemoteCommandsServiceBase&) = delete; + UserRemoteCommandsServiceBase& operator=( + const UserRemoteCommandsServiceBase&) = delete; + ~UserRemoteCommandsServiceBase() override; + + void Init(); + + // CloudPolicyService::Observer implementation: + void OnCloudPolicyServiceInitializationCompleted() override; + void OnPolicyRefreshed(bool success) override; + + // KeyedService + void Shutdown() override; + + protected: + virtual invalidation::ProfileInvalidationProvider* + GetInvalidationProvider() = 0; + + virtual std::unique_ptr<RemoteCommandsFactory> GetFactory() = 0; + + private: + raw_ptr<CloudPolicyCore> core_; + base::ScopedObservation<CloudPolicyService, CloudPolicyService::Observer> + cloud_policy_service_observer_{this}; + + std::unique_ptr<RemoteCommandsInvalidator> invalidator_; +}; + +} // namespace policy + +#endif // COMPONENTS_POLICY_CORE_BROWSER_REMOTE_COMMANDS_USER_REMOTE_COMMANDS_SERVICE_BASE_H_
diff --git a/components/policy/core/common/DEPS b/components/policy/core/common/DEPS index 78412fb..1d4395b 100644 --- a/components/policy/core/common/DEPS +++ b/components/policy/core/common/DEPS
@@ -8,7 +8,6 @@ "+components/reporting", "-components/policy/core/browser", "+components/signin/public", - "+components/invalidation", "+components/strings", "+extensions/buildflags", "+net/http",
diff --git a/components/policy/core/common/remote_commands/remote_commands_invalidator.cc b/components/policy/core/common/remote_commands/remote_commands_invalidator.cc index 11e71c1..d620d7d 100644 --- a/components/policy/core/common/remote_commands/remote_commands_invalidator.cc +++ b/components/policy/core/common/remote_commands/remote_commands_invalidator.cc
@@ -36,6 +36,8 @@ invalidation_service_ = invalidation_service; state_ = STOPPED; + // TODO(crbug.com/1486860): Reset `invalidation_service_` to avoid dangling + // pointer. OnInitialize(); }
diff --git a/components/policy/proto/chrome_device_policy.proto b/components/policy/proto/chrome_device_policy.proto index c1ab78d..a1857a2 100644 --- a/components/policy/proto/chrome_device_policy.proto +++ b/components/policy/proto/chrome_device_policy.proto
@@ -1823,6 +1823,18 @@ optional bool enabled = 1; } +// Mirrors ExtendedFkeysModifier from the extended_fkeys_modifier.mojom +message ExtendedFkeysModifierProto { + enum ExtendedFkeysModifier { + DISABLED = 0; // Default value for the F11/F12 settings. + ALT = 1; + SHIFT = 2; + CTRL_SHIFT = 3; + } + + optional ExtendedFkeysModifier modifier = 1 [default = DISABLED]; +} + message ChromeDeviceSettingsProto { reserved 61, 71, 90; optional DevicePolicyRefreshRateProto device_policy_refresh_rate = 1; @@ -2031,4 +2043,5 @@ device_switch_function_keys_behavior_enabled = 153; optional StringListPolicyProto device_dlc_predownload_list = 154; optional BooleanPolicyProto device_ephemeral_network_policies_enabled = 155; + optional ExtendedFkeysModifierProto extended_fkeys_modifier = 156; }
diff --git a/components/policy/proto/device_management_backend.proto b/components/policy/proto/device_management_backend.proto index 43519c94..3b611dbb 100644 --- a/components/policy/proto/device_management_backend.proto +++ b/components/policy/proto/device_management_backend.proto
@@ -1376,7 +1376,7 @@ // Resolution height optional uint32 resolution_height = 2; // Refresh rate (Hz) - optional float refresh_rate = 3; + optional uint32 refresh_rate = 3; // Set to true if display is internal, otherwise set to false. optional bool is_internal = 4; }
diff --git a/components/policy/resources/policy_templates_de.xtb b/components/policy/resources/policy_templates_de.xtb index da64e2f..32c4e9d3 100644 --- a/components/policy/resources/policy_templates_de.xtb +++ b/components/policy/resources/policy_templates_de.xtb
@@ -389,6 +389,9 @@ <translation id="1372618949173323717">JavaScript deaktivieren</translation> <translation id="1376119291123231789">Intelligenten Akkulademodus aktivieren</translation> <translation id="1376765488559847650">Cloud Upload</translation> +<translation id="1379689277107868399">Ist die Richtlinie auf „DoNotPrompt“ gesetzt oder nicht konfiguriert, fordert <ph name="PRODUCT_NAME" /> den Nutzer nicht automatisch auf, sich noch einmal im Browser zu authentifizieren. + +Wenn „PromptInTab“ festgelegt ist und die Authentifizierung des Nutzers abläuft, wird sofort ein neuer Tab mit der Google-Anmeldeseite geöffnet. Dies geschieht nur bei Verwendung von <ph name="CHROME_SYNC_NAME" />.</translation> <translation id="1384459581748403878">Referenz: <ph name="REFERENCE_URL" /></translation> <translation id="1384594066274112751">Mit dieser Richtlinie wird jede URL, die mit einem oder mehreren der angegebenen Muster (im <ph name="URL_BLOCKLIST_POLICY_NAME" />-Filterformat) übereinstimmt, nie vom Browser verworfen. Dies gilt für das Verwerfen bei hoher Speicherauslastung und bei der Verwendung des Modus für hohe Effizienz. @@ -740,6 +743,9 @@ Wenn die Richtlinie konfiguriert ist, schlägt die Installation von <ph name="PLUGIN_VM_NAME" /> fehl, wenn der freie Speicherplatz auf dem Gerät nicht dem in der Richtlinie angegebenen Mindestwert entspricht.</translation> <translation id="1686952487081322272">Schnellinfo deaktivieren</translation> <translation id="1690383938831887552">Verhindern, dass Signed HTTP Exchanges geladen werden</translation> +<translation id="1692325295652827195">Wenn diese Richtlinie auf „True“ gesetzt ist, werden Informationen über wichtige richtlinienbasierte Android-App-Installationsereignisse an Google gesendet. + +Ist die Richtlinie auf „False“ gesetzt oder nicht konfiguriert, werden keine Ereignisse erfasst.</translation> <translation id="1692990221685273468">Mit dieser Richtlinie kann festgelegt werden, ob die integrierte Zertifikatsprüfung die Einschränkungen der Trust-Anchors, die aus dem Trust-Shop geladen wurden, erzwingt.</translation> <translation id="169467210981344373">Globales HTTP-Authentication-Cache deaktivieren</translation> <translation id="1696501581280568361">Dadurch wird die Profiltrennung vorgeschlagen</translation> @@ -1435,6 +1441,9 @@ Ist diese Richtlinie nicht konfiguriert, werden alle Plug-ins, die mit den Mustern in DisabledPlugins übereinstimmen, deaktiviert. Sie können dann nicht vom Nutzer aktiviert werden.</translation> <translation id="2236488539271255289">Speichern von lokalen Daten für keine Website zulassen</translation> <translation id="2236593201136596376">Erfassen von WebRTC-Textprotokollen aus Google-Diensten zulassen</translation> +<translation id="2237258181338466053">Ist die Richtlinie aktiviert, versucht <ph name="PRODUCT_NAME" />, einige URLs in einem alternativen Browser, 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> <translation id="2237705286848619561">Wenn diese Richtlinie aktiviert ist, ist in von Administratoren initiierten Remote-Unternehmenssupportsitzungen die Übertragung von Dateien zwischen dem Client und dem Host möglich. Diese Richtlinie wirkt sich nicht auf den Remotezugriff aus. @@ -1463,6 +1472,9 @@ <translation id="2261648512244797294">Veraltetes Drucken über Privet deaktivieren</translation> <translation id="2266422599396179941">Zulassen, dass Nutzer Feedback geben</translation> <translation id="2269319728625047531">Einwilligung zur Synchronisierung beim Anmelden anzeigen</translation> +<translation id="2270113153862588648">Ist diese Richtlinie aktiviert, ist Remote Attestation für das Gerät erlaubt. Ein Zertifikat wird automatisch erstellt und auf den Geräteverwaltungsserver hochgeladen. + +Wenn die Richtlinie deaktiviert oder nicht konfiguriert ist, wird kein Zertifikat erstellt und Aufrufe der <ph name="ENTERPRISE_PLATFORM_KEYS_API" /> schlagen fehl.</translation> <translation id="2270747976331889601">Mit dieser Richtlinie kann eine Sicherheitsfunktion von TLS 1.3 für lokale Vertrauensanker aktiviert werden.</translation> <translation id="22754818344448444">Nutzern dürfen eine Vorlage für Desktoplayouts zum Laden auswählen</translation> <translation id="2277117728011250860">Verwendung des Barrierefreiheitsfilters zur Leistungsverbesserung nicht zulassen.</translation> @@ -1843,6 +1855,9 @@ <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="2626302212133950795">Wenn diese Richtlinie aktiviert oder nicht konfiguriert ist, können <ph name="PRODUCT_OS_NAME" />-Geräte mit Remote Attestation (bestätigter Zugriff) von der <ph name="PRODUCT_OS_NAME" />-Zertifizierungsstelle ein Zertifikat erhalten, das die Berechtigung des Geräts für die Wiedergabe geschützter Inhalte nachweist. Bei diesem Vorgang werden Informationen zur Bestätigung der Hardware an die <ph name="PRODUCT_OS_NAME" />-Zertifizierungsstelle gesendet, anhand derer das Gerät eindeutig identifiziert werden kann. + +Wenn die Richtlinie deaktiviert ist, verwendet das Gerät kein Remote Attestation für geschützte Inhalte, sodass darauf möglicherweise keine geschützten Inhalte wiedergegeben werden können.</translation> <translation id="262740370354162807">Senden von Dokumenten an <ph name="CLOUD_PRINT_NAME" /> aktivieren</translation> <translation id="2633084400146331575">Gesprochenes Feedback aktivieren</translation> <translation id="2633907568797306353">Aktivieren von Phone Hub-Benachrichtigungen zulassen</translation> @@ -2128,6 +2143,11 @@ <translation id="2908277604670530363">Maximale Anzahl gleichzeitiger Verbindungen zum Proxyserver</translation> <translation id="2912366658685903301">Farbe des Browserdesigns ändern</translation> <translation id="2914283793640833265">Aktivieren der Aufgabenfortsetzung für den Phone Hub nicht zulassen</translation> +<translation id="2915787312243722351">Mit dieser Richtlinie wird die Einstellung „Mit der Launcher-Taste/Suchtaste kannst du das Verhalten der Funktionstasten ändern“ gesteuert. Die Einstellung ermöglicht Nutzern, zwischen Funktionstasten und Tasten der obersten Reihe zu wechseln, indem sie die Launcher-Taste gedrückt halten. + +Wenn diese Richtlinie nicht konfiguriert ist, können Nutzer den Wert der Einstellung „Mit der Launcher-Taste/Suchtaste kannst du das Verhalten der Funktionstasten ändern“ frei wählen. +Ist diese Richtlinie deaktiviert, kann das Verhalten von Funktionstasten nicht mit der Launcher- bzw. Suchtaste geändert werden und Nutzer können diese Einstellung nicht ändern. +Wenn diese Richtlinie aktiviert ist, kann das Verhalten von Funktionstasten mit der Launcher- bzw. Suchtaste geändert werden und Nutzer können diese Einstellung nicht ändern.</translation> <translation id="291853569864365550">Keine Inhaltsvorschläge auf der Seite „Neuer Tab“ anzeigen</translation> <translation id="2920795918401557243">Mit dieser Einstellung können Nutzer über den Dienst für die Ablaufverfolgung eine systemweite Leistungs-Trace erfassen. @@ -2399,6 +2419,11 @@ <translation id="3118552207903834734">Nutzer erlauben, seinen Gerätehostnamen zu konfigurieren</translation> <translation id="3122082892722698079">Ausnahmen bei unsicheren Inhalten verwalten</translation> <translation id="3125472566440502628">„Vorlesen“ deaktivieren</translation> +<translation id="3126229421659523563">Im Kioskmodus legt diese Einstellung fest, ob das unverankerte Menü für Bedienungshilfen angezeigt wird. + +Ist diese Richtlinie aktiviert, wird das unverankerte Menü für Bedienungshilfen immer angezeigt. + +Ist diese Richtlinie deaktiviert oder nicht konfiguriert, wird das unverankerte Menü für Bedienungshilfen nie angezeigt.</translation> <translation id="3126748868885248792">Rechte Taste als primäre Maustaste festlegen</translation> <translation id="3128072319047570212">Keygen-Einstellungen</translation> <translation id="3131703464330936425">Mobilfunk-Roaming nicht zulassen</translation> @@ -2675,6 +2700,9 @@ Ist diese Richtlinie nicht konfiguriert, ist der System-Proxy-Dienst nicht verfügbar.</translation> <translation id="334231891933432876">Nutzer wird abgemeldet, sobald sein Konto nicht mehr authentifiziert ist</translation> <translation id="3345323903592385588">Die Reihenfolge, in der die VM-Konfigurationen im Installationsprogramm angezeigt werden. Wenn du mehrere VM-Konfigurationen angegeben hast, wird oben in der Liste die mit dem niedrigsten „display_order“-Wert angezeigt. Der Standardwert ist null.</translation> +<translation id="3351661569026056296">Wenn du die Richtlinie auf „True“ setzt, führt die oberste Reihe der Tastatur Funktionstastenbefehle aus. Bei gedrückter Suchtaste führt die Tastatur stattdessen wieder Medientastenbefehle aus. + +Wenn du die Richtlinie auf „False“ setzt oder nicht konfigurierst, führt die Tastatur standardmäßig Medientastenbefehle aus. Bei gedrückter Suchtaste führt die Tastatur Funktionstastenbefehle aus.</translation> <translation id="3351835664671920945">Standardmäßig Standardtastatur für Passworteingabe anzeigen</translation> <translation id="3359186795130278362">Eingeschränkte verwaltete Gastsitzung aktivieren.</translation> <translation id="33592541385181121">Port nicht in generierten Kerberos-SPN einschließen</translation> @@ -3407,6 +3435,7 @@ <translation id="3977304360459208438">Standardeinstellung für Cipher Suites von 3DES in TLS verwenden</translation> <translation id="3979738908158213640">URLs, die während der SAML-Authentifizierung Zugriff zur Durchführung der Geräteattestierung erhalten</translation> <translation id="3982322576186033243">Nicht sichere Hashes in TLS-Handshakes nicht zulassen</translation> +<translation id="3982465141749620677">Zur erneuten Authentifizierung in einem Tab auffordern</translation> <translation id="3983162212222338509">Die DNS-Auflösung des Systems kann je nach Systemkonfiguration und Funktions-Flags innerhalb, außerhalb oder teils innerhalb, teils außerhalb des Netzwerkprozesses ausgeführt werden.</translation> <translation id="3986700049001404598">Nutzern erlauben, Prozesse mit dem Task-Manager von Chrome zu beenden</translation> <translation id="398884292557092447">Wenn die Richtlinie auf „True“ gesetzt oder nicht konfiguriert ist, können Nutzer die Vorschläge zum automatischen Ausfüllen von Kreditkartendaten in der UI steuern. @@ -4136,6 +4165,11 @@ Diese Richtlinie wurde eingestellt. Bitte verwende stattdessen <ph name="EXTERNAL_PRINT_SERVERS_ALLOWLIST" />.</translation> <translation id="4668325077104657568">Standardeinstellung für Bilder</translation> <translation id="4669083178278833688">Die Kamera, Browser- und Betriebssystemeinstellungen sowie Scan-, Web Store-, Canvas-, Entdecken-, Crosh-, Galerie- und Terminal-Funktionen deaktivieren</translation> +<translation id="4669292863736266737">Wenn die Einstellung „<ph name="GLS_ENABLED" />“ gewählt und die Richtlinie „<ph name="DEFAULT_GEOLOCATION_SETTING_POLICY_NAME" />“ nicht auf „<ph name="BLOCK_GEOLOCATION_SETTING" />“ gesetzt ist, sind die Standortdienste von Google während der Ersteinrichtung aktiviert. Wenn die Richtlinie auf „<ph name="GLS_DISABLED" />“ gesetzt ist oder keine Einstellung gewählt wird, sind die Standortdienste während der Einrichtung deaktiviert. + +Ist die Richtlinie auf „<ph name="BR_UNDER_USER_CONTROL" />“ festgelegt, werden Nutzer dazu aufgefordert anzugeben, ob sie die Standortdienste von Google verwenden möchten. Wenn sie die Standortdienste aktivieren, ermitteln Android-Apps den Standort des Geräts und senden Google anonyme Standortdaten. + +Nach der Ersteinrichtung können Nutzer die Standortdienste von Google flexibel aktivieren oder deaktivieren.</translation> <translation id="4670865688564083639">Minimum:</translation> <translation id="467236746355332046">Unterstützte Funktionen:</translation> <translation id="4674167212832291997">Passt die Liste mit URL-Mustern an, die immer von <ph name="PRODUCT_FRAME_NAME" /> gerendert werden müssen. @@ -4175,6 +4209,9 @@ </translation> <translation id="4703402283970867140">Intelligentem Dimmmodell erlauben, den Zeitraum bis zum Dimmen des Bildschirms zu verlängern</translation> <translation id="4704958130749494760">Websites automatisch die Berechtigung erteilen, eine Verbindung zu seriellen USB-Geräten herzustellen.</translation> +<translation id="4705329890928008808">Wenn die Richtlinie auf „CopyCaCerts“ gesetzt ist, werden alle über ONC installierten CA-Zertifikate mit <ph name="WEB_TRUSTED_BIT" /> für ARC-Apps verfügbar. + +Ist sie auf „None“ gesetzt oder wird keine Einstellung gewählt, sind <ph name="PRODUCT_OS_NAME" />-Zertifikate für ARC-Apps nicht verfügbar.</translation> <translation id="4707142899480362007">Wenn diese Richtlinie konfiguriert ist, kannst du eine Liste mit URL-Mustern erstellen, die die Websites angeben, denen automatisch die Berechtigung für den Zugriff auf ein USB-Gerät mit den angegebenen Anbieter- und Produkt-IDs auf dem Anmeldebildschirm gewährt wird. Damit die Richtlinie gültig ist, müssen für jeden Eintrag auf der Liste die Felder „<ph name="DEVICES_FIELD_NAME" />“ und „<ph name="URLS_FIELD_NAME" />“ angegeben sein. Jeder Eintrag im Feld „<ph name="DEVICES_FIELD_NAME" />“ kann das Feld „<ph name="VENDOR_ID_FIELD_NAME" />“ und das Feld „<ph name="PRODUCT_ID_FIELD_NAME" />“ haben. Bei Weglassen des Felds „<ph name="VENDOR_ID_FIELD_NAME" />“ wird eine Richtlinie erstellt, die für jedes Gerät gilt. Bei Weglassen des Felds „<ph name="PRODUCT_ID_FIELD_NAME" />“ wird eine Richtlinie erstellt, die für jedes Gerät mit der angegebenen Anbieter-ID gilt. Eine Richtlinie, die das Feld „<ph name="PRODUCT_ID_FIELD_NAME" />“ ohne das Feld „<ph name="VENDOR_ID_FIELD_NAME" />“ hat, ist ungültig. Das USB-Berechtigungsmodell erteilt der angegebenen URL die Berechtigung für den Zugriff auf das USB-Gerät als eine Quelle der obersten Ebene. Wenn eingebettete Frames auf USB-Geräte zugreifen müssen, sollte der <ph name="FEATURE_POLICY_HEADER_NAME" />-Header für USB verwendet werden, um Zugriff zu gewähren. Die URL muss gültig sein, da die Richtlinie andernfalls ignoriert wird. @@ -5020,6 +5057,17 @@ <translation id="5542235730745104308">Wenn die Richtlinie auf „True“ gesetzt ist, verwendet <ph name="PRODUCT_NAME" /> alternative Fehlerseiten (z. B. „Seite nicht gefunden“). Ist sie auf „False“ gesetzt, verwendet <ph name="PRODUCT_NAME" /> niemals alternative Fehlerseiten. Wenn die Richtlinie konfiguriert ist, kann sie von Nutzern nicht geändert werden. Wird die Richtlinie nicht konfiguriert, ist sie aktiviert, aber Nutzer können die Einstellung ändern.</translation> +<translation id="5544059132156503357">Wenn die Richtlinie konfiguriert ist, wird angegeben, welche Verschlüsselungstypen bei der Anforderung von Kerberos-Tickets von einem <ph name="MS_AD_NAME" />-Server zulässig sind. + +Richtlinienkonfiguration: + +* „Alle“ gestattet die AES-Verschlüsselungstypen aes256-cts-hmac-sha1-96 und aes128-cts-hmac-sha1-96 sowie den RC4-Verschlüsselungstyp rc4-hmac. AES hat Vorrang, wenn der Server die Verschlüsselungstypen AES und RC4 unterstützt. + +* Bei „Stark“ oder keiner Konfiguration sind nur AES-Typen zulässig. + +* Bei „Veraltet“ ist nur der Typ RC4 zulässig. RC4 ist nicht sicher. Es sollte nur in speziellen Fällen erforderlich sein. Wenn möglich, konfiguriere den Server neu, damit dieser die AES-Verschlüsselung unterstützt. + +Weitere Informationen findest du auch unter https://wiki.samba.org/index.php/Samba_4.6_Features_added/changed#Kerberos_client_encryption_types.</translation> <translation id="554903022911579950">Kerberos</translation> <translation id="555022085242359084">Hohen Kontrast auf dem Anmeldebildschirm aktivieren</translation> <translation id="555077880566103058">Automatische Ausführung des Plug-ins "<ph name="FLASH_PLUGIN_NAME" />" für alle Websites zulassen</translation> @@ -5654,6 +5702,11 @@ <translation id="6157537876488211233">Kommagetrennte Liste der Proxy-Umgehungsregeln</translation> <translation id="6158324314836466367">Unternehmens-Web-Store-Name (veraltet)</translation> <translation id="6164441518097008843">Anmeldung auf eine Liste von Nutzern beschränken</translation> +<translation id="6169504363239921686">Wenn diese Richtlinie auf „<ph name="BR_ENABLED" />“ festgelegt ist, ist die Android-Funktion „Sichern und wiederherstellen“ anfangs aktiviert. Wenn die Richtlinie auf „<ph name="BR_DISABLED" />“ festgelegt ist oder keine Einstellung gewählt wird, ist „Sichern und wiederherstellen“ während der Einrichtung deaktiviert. + +Wenn die Richtlinie auf „<ph name="BR_UNDER_USER_CONTROL" />“ festgelegt ist, erhalten Nutzer eine Aufforderung, in der sie wählen können, ob sie die Android-Funktion „Sichern und wiederherstellen“ nutzen möchten. Aktivieren sie die Funktion, werden App-Daten von Android auf die Android-Back-up-Server hochgeladen und bei der Neuinstallation von kompatiblen Apps wiederhergestellt. + +Nach der Ersteinrichtung können Nutzer selbst entscheiden, ob sie „Sichern und wiederherstellen“ nutzen möchten.</translation> <translation id="6169768162756928771">GAIA-Einstellungen zur Verwaltung der Nutzeridentität</translation> <translation id="6172110090237528457">Mit dieser Richtlinie wird der Bildschirmschoner auf Geräteebene für den Anmeldebildschirm konfiguriert. @@ -6143,6 +6196,13 @@ <translation id="6527674993612811419">In unsicheren Formularen Warnungen anzeigen und Autofill deaktivieren</translation> <translation id="6532769014584932288">Wakelocks zulassen</translation> <translation id="6533881418188970751">Nutzer vor dem Download nach dem Speicherort für die Datei fragen</translation> +<translation id="6534181153831265700">Wenn die Richtlinie konfiguriert ist, wird in Tagen angegeben, wie häufig ein Client das Computerpasswort ändert. Das Passwort wird vom Client zufällig generiert und ist für den Nutzer nicht sichtbar. Eine Deaktivierung dieser Richtlinie oder die Auswahl einer hohen Anzahl von Tagen kann sich negativ auf die Sicherheit auswirken, da potenzielle Angreifer so mehr Zeit haben, das Computerpasswort herauszufinden und missbräuchlich zu verwenden. + +Wenn die Richtlinie nicht konfiguriert ist, wird das Computerpasswort alle 30 Tage geändert. + +Wenn die Richtlinie auf „0“ festgelegt wird, ist die Änderung des Computerpassworts deaktiviert. + +Hinweis: Wenn der Client über einen längeren Zeitraum offline war, werden Passwörter nicht innerhalb der angegebenen Frist geändert.</translation> <translation id="653616551212414363">Wenn diese Einstellung aktiviert ist, wird dem Nutzer eine Benachrichtigung angezeigt, wenn ein USB-Gerät an <ph name="PRODUCT_OS_NAME" /> angeschlossen wird. Ist diese Einstellung deaktiviert, werden dem Nutzer keine Benachrichtigungen zu angeschlossenen USB-Geräten angezeigt. @@ -6186,6 +6246,7 @@ Wird die Richtlinie nicht konfiguriert, können Nutzer die Proxyeinstellungen auswählen. Hinweis: Ausführliche Beispiele findest du in den Chromium-Projekten unter https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett.</translation> +<translation id="6559643481486165125">Nicht zur erneuten Authentifizierung auffordern</translation> <translation id="656130159911161669">Die Version, die im Manifest der Kiosk-App definiert ist, wird für ChromeOS-Updates ignoriert</translation> <translation id="6561396069801924653">Optionen für Bedienungshilfen im Taskleistenmenü anzeigen</translation> <translation id="6562889469672829421">Zeitraum ohne Nutzereingabe, nach dem der Bildschirm gedimmt wird, angegeben in Millisekunden.</translation> @@ -6212,6 +6273,13 @@ Wenn die Richtlinie nicht konfiguriert ist, kann der Nutzer beliebige auf dem System installierte Plug-ins verwenden, ausgenommen inkompatible, veraltete oder gefährliche Plug-ins, die hartcodiert sind.</translation> <translation id="6571055160227165318">Aktivieren von WebSQL per Chrome-Flag zulassen.</translation> <translation id="6574903167639386816">Profildaten auf dem Laufwerk löschen, wenn die Nutzersitzung endet</translation> +<translation id="6575403002861093126">Wenn die Richtlinie konfiguriert ist, wird die Cache-Lebensdauer von Gruppenrichtlinienobjekten (Group Policy Objects, GPOs) in Stunden festgelegt. Das ist die maximale Dauer, während der GPOs wiederverwendet werden können, bevor sie nochmals heruntergeladen werden. Anstatt sie bei jedem Richtlinienabruf herunterzuladen, kann das System die im Cache gespeicherten GPOs nochmals verwenden, solange die Version dieselbe ist. + +Ist die Richtlinie auf „0“ festgelegt, wird die GPO-Speicherung deaktiviert. Dies erhöht die Serverlast, da GPOs bei jedem Richtlinienabruf heruntergeladen werden, auch wenn sie unverändert sind. + +Wenn die Richtlinie nicht konfiguriert ist, können gespeicherte GPOs bis zu 25 Stunden lang wiederverwendet werden. + +Hinweis: Durch einen Neustart oder eine Abmeldung wird der Cache geleert.</translation> <translation id="6575944031719151455">Wenn die Richtlinie konfiguriert ist, wird die Liste der lokalen Gerätekonten angegeben, die auf der Anmeldeseite angezeigt werden sollen. Durch Kennungen werden die verschiedenen lokalen Gerätekonten auseinandergehalten. Wenn die Richtlinie nicht konfiguriert oder eine leere Liste festgelegt ist, gibt es keine lokalen Gerätekonten.</translation> @@ -6228,6 +6296,9 @@ <translation id="6584541828182430328">Anzeige von Vollbild-Warnung deaktivieren</translation> <translation id="6588634282328239769">Vollständige URL anzeigen</translation> <translation id="6589049539706330510">Unterstützung aktivieren</translation> +<translation id="6593025196187527239">Wird die Richtlinie auf „True“ festgelegt oder keine Einstellung gewählt, können Nutzer ARC verwenden, es sei denn, die Funktion wurde an anderer Stelle deaktiviert. Wenn die Richtlinie auf „False“ festgelegt ist, können nicht verbundene Nutzer ARC nicht verwenden. + +Änderungen an der Richtlinie werden nur dann wirksam, wenn ARC nicht läuft, z. B. beim Start von ChromeOS.</translation> <translation id="6593350713192882944">„Schnellinfo“ aktivieren</translation> <translation id="6594372503585248865">Benutzeroberflächen im Zusammenhang mit der Verbindung auf dem Remote-Host-Desktop während einer aktiven Verbindung aktivieren</translation> <translation id="65947892191748867">Einwilligung für Gerätesignale für verwaltete Nutzer auf nicht verwalteten Geräten deaktivieren</translation> @@ -6648,6 +6719,9 @@ <translation id="6929746927224321095">Autofill deaktivieren</translation> <translation id="6931242315485576290">Synchronisierung der Daten mit Google deaktivieren</translation> <translation id="6932282102911647185">Tastaturbeleuchtungsfarbe „Lila“</translation> +<translation id="6938424179790370595">Wenn du die Richtlinie auf „None“ setzt, ist die Lupe deaktiviert. + +Wenn du diese Richtlinie konfigurierst, kann sie von Nutzern nicht geändert werden. Wird sie nicht konfiguriert, ist die Lupe erst einmal deaktiviert, kann aber jederzeit von Nutzern aktiviert werden.</translation> <translation id="6940243892299228102">Nutzer dürfen keine Desktopvorlagen verwenden</translation> <translation id="6943577887654905793">Bevorzugter Mac-/Linux-Name:</translation> <translation id="6946652757373377924">Diese Richtlinie wurde in M77 entfernt. @@ -6788,6 +6862,7 @@ <translation id="7072208053150563108">Änderungsrate des Computerpassworts</translation> <translation id="7072567600438630966">Aktivieren von Phone Hub zulassen.</translation> <translation id="7074437930865599190">Hauptversion im User-Agent-String als „99“ festschreiben</translation> +<translation id="7077471517869658421">Nutzer können den Wert der Einstellung „Mit der Launcher-Taste/Suchtaste kannst du das Verhalten der Funktionstasten ändern“ frei wählen.</translation> <translation id="707988220162760379">PDF-Dateien immer mit einem externen PDF-Viewer öffnen</translation> <translation id="7081401546407362463">Liste von Dateitypen, die nach dem Download automatisch geöffnet werden sollen. Das vorangestellte Trennzeichen sollte beim Aufführen der Dateitypen nicht mit angegeben werden. Gib also beispielsweise „txt“ und nicht „.txt“ an. @@ -6831,6 +6906,17 @@ <translation id="7098400392308393199">Der Downloadschutz in Echtzeit wird durch die Richtlinie <ph name="SAFE_BROWSING_PROTECTION_LEVEL_POLICY_NAME" /> gesteuert</translation> <translation id="710003290625031750">Ausführliche Schemabeschreibung:</translation> <translation id="7101550508196914704">App-Verknüpfung nicht in der Lesezeichenleiste anzeigen</translation> +<translation id="7105084505972468353">Wenn diese Richtlinie konfiguriert ist, wird damit der Lupentyp bestimmt, der aktiviert ist. + +Wird sie auf „Vollbildlupe“ gesetzt, ist die Lupe auf dem Anmeldebildschirm immer im Modus „Vollbildlupe“ aktiviert. + +Wenn die Richtlinie auf „Angedockte Lupe“ festgelegt wird, ist die Lupe auf dem Anmeldebildschirm immer im Modus „Angedockte Lupe“ aktiviert. + +Wird sie auf „None“ festgelegt, ist die Lupe auf dem Anmeldebildschirm immer deaktiviert. + +Wenn sie konfiguriert ist, kann sie von Nutzern nicht geändert oder überschrieben werden. + +Ist die Richtlinie nicht konfiguriert, ist die Lupe auf dem Anmeldebildschirm anfangs deaktiviert, kann aber jederzeit vom Nutzer aktiviert werden.</translation> <translation id="7109384070286741861">CECPQ2 deaktivieren</translation> <translation id="7113439794629928551">Mediensteuerelemente für <ph name="PRODUCT_NAME" />-Sitzungen anzeigen, die von anderen Geräten gestartet werden</translation> <translation id="7114169791477667553">Standardsuchmaschine deaktivieren</translation> @@ -6991,6 +7077,13 @@ Wenn diese Richtlinie auf "true" gesetzt ist, werden Drucker deaktiviert, die andere Protokolle als IPPS, USB oder IPP über USB verwenden. Dies liegt daran, dass Nutzername und Dateiname nicht offen über das Netzwerk gesendet werden sollten.</translation> <translation id="7253446510183499868">Automatischen Neustart nach Updates nicht zulassen</translation> +<translation id="7253705688881857796">Wenn die Richtlinie konfiguriert ist, wird angegeben, ob und wie Nutzerrichtlinien vom Computer-Gruppenrichtlinienobjekt (Group Policy Object, GPO) verarbeitet werden. + +* Bei „Standardeinstellung“ oder keiner Konfiguration werden die Nutzerrichtlinien nur von Nutzer-GPOs verarbeitet. Computer-GPOs werden ignoriert. + +* Bei „Zusammenführen“ werden die Nutzerrichtlinien in den Nutzer-GPOs mit denen der Computer-GPOs zusammengeführt. Computer-GPOs haben dabei Vorrang. + +* Bei „Ersetzen“ werden die Nutzerrichtlinien in den Nutzer-GPOs mit denen der Computer-GPOs ersetzt. Nutzer-GPOs werden ignoriert.</translation> <translation id="7258250780552783197">Liste der Einstellungen für Chrome Enterprise Connectors-Dienste für den Enterprise Connector „<ph name="ON_FILE_TRANSFER_ENTERPRISE_CONNECTOR" />“. Dieser wird ausgelöst, wenn eine Datei über <ph name="PRODUCT_OS_NAME" /> übertragen wird. Mit den Feldern „<ph name="ENTERPRISE_CONNECTOR_SOURCE_DESTINATION_LIST_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_TAGS_FIELD" />“, „<ph name="ENTERPRISE_CONNECTOR_ENABLE_FIELD" />“ und „<ph name="ENTERPRISE_CONNECTOR_DISABLE_FIELD" />“ wird festgelegt, ob der Connector eine Datei zur Analyse senden soll, wenn sie zwischen einer Quelle und einem Ziel übertragen wird, und welche Tags in der Analyseanfrage für diese Datei enthalten sein sollen. Ein Tag, das einer „enable“-Regel entspricht, wird der Analyseanfrage hinzugefügt, wenn die Quelle und das Ziel mit der Regel für dieses Tag übereinstimmen – jedoch nur, wenn keine „disable“-Regel mit demselben Tag mit der Übertragung übereinstimmt. Die Analyse wird durchgeführt, wenn die Anfrage mindestens ein Tag enthält. Eine „<ph name="ENTERPRISE_CONNECTOR_SOURCE_DESTINATION_LIST_FIELD" />“-Regel wird durch eine Paarliste definiert, wobei jedes Paar eine Liste mit Quellen und eine Liste mit Zielen enthält. Mit dem Feld „<ph name="ENTERPRISE_CONNECTOR_FILE_SYSTEM_TYPE_FIELD" />“ wird definiert, auf welches Dateisystem eine Regel angewendet werden soll. @@ -7563,6 +7656,7 @@ Ist diese Richtlinie nicht konfiguriert, gilt der Standardwert von 3 Stunden. Hinweis: Richtlinienbenachrichtigungen erzwingen eine Aktualisierung, wenn sich die Richtlinie ändert. Häufige Aktualisierungen sind also nicht nötig. Wenn die Plattform Richtlinienbenachrichtigungen unterstützt, wird daher für die Verzögerung der Aktualisierung 24 Stunden festgelegt und alle Standardwerte der Richtlinie werden ignoriert.</translation> +<translation id="775822241671489040">Steuert die Einstellung „Mit der Launcher-Taste/Suchtaste kannst du das Verhalten der Funktionstasten ändern“</translation> <translation id="7758378441185523981">Aktiviert die passive Authentifizierung für Profiltypen.</translation> <translation id="776110834126722255">Eingestellt</translation> <translation id="7763614521440615342">Inhaltsvorschläge auf der "Neuer Tab"-Seite anzeigen</translation> @@ -7646,6 +7740,15 @@ Zulässige Werte für das Feld „<ph name="MINUTE_FIELD_NAME" />“ in „<ph name="START_TIME_FIELD_NAME" />“, „<ph name="END_TIME_FIELD_NAME" />“ und „<ph name="CHARGE_START_TIME_FIELD_NAME" />“ sind 0, 15, 30 und 45.</translation> <translation id="7840258755683573560">Automatisches Klicken aktivieren</translation> +<translation id="784165160128690202">Wenn du die Richtlinie auf „None“ setzt, wird die Lupe auf dem Anmeldebildschirm deaktiviert. + +Wenn du diese Richtlinie konfigurierst, können Nutzer vorübergehend die Lupe aktivieren oder deaktivieren. Wenn der Anmeldebildschirm aktualisiert wird oder eine Minute lang inaktiv bleibt, wird sie in den Originalzustand zurückversetzt. + +Wird sie nicht konfiguriert, ist die Lupe auf dem Anmeldebildschirm deaktiviert. Sie kann jederzeit von Nutzern aktiviert werden und der Status auf dem Anmeldebildschirm bleibt für alle Nutzer bestehen. + +Gültige Werte: • 0 = Aus • 1 = An • 2 = Bedienungshilfe „Angedockte Lupe“ an + +Hinweis: Sofern konfiguriert, überschreibt „<ph name="DEVICE_LOGIN_SCREEN_SCREEN_MAGNIFIER_TYPE_POLICY_NAME" />“ diese Richtlinie.</translation> <translation id="7841880500990419427">TLS-Mindestversion für Fallback</translation> <translation id="7841883965249733328">Automatisches Upgrade für gemischte Inhalte deaktivieren</translation> <translation id="7845130996290850593">Kerberos aktivieren</translation> @@ -8295,6 +8398,9 @@ <translation id="8395350646076131800">Zeitlimit für die Inaktivität für den Bildschirmschoner auf dem Sperrbildschirm des Nutzers.</translation> <translation id="8395749934754392549">Legt die Einstellungen für den Android-Container (ARC) und Android-Apps fest.</translation> <translation id="8398952282584132331">Datenschutzbildschirm aktivieren</translation> +<translation id="8399825694820904218">Wenn für die Richtlinie eine Zahl festgelegt ist, zeigt <ph name="PRODUCT_NAME" /> für genau diese Anzahl von Millisekunden eine Nachricht an und öffnet dann den alternativen Browser. + +Ist die Richtlinie nicht konfiguriert oder auf 0 gesetzt, wird eine bestimmte aufgerufene URL sofort in einem alternativen Browser geöffnet.</translation> <translation id="8402079500086185021">PDF-Dateien immer extern öffnen</translation> <translation id="8410477879938914253">Die Richtlinie wird nur auf verwaltete Gastsitzungen angewendet. Wenn die Richtlinie auf „True“ gesetzt oder nicht konfiguriert ist, wird ein Dialogfeld angezeigt, über das der Nutzer dazu aufgefordert wird, die Abmeldung zu bestätigen oder abzulehnen, wenn das letzte Fenster geschlossen wird. @@ -8308,6 +8414,7 @@ Wenn diese Richtlinie nicht konfiguriert ist, hat die Event.path API den Standardstatus: verfügbar vor M109 und nicht verfügbar von M109 bis 114. Die Richtlinie wird nach Chrome 115 entfernt.</translation> +<translation id="841395160262233331">Das Verhalten von Funktionstasten kann nicht mit der Launcher- bzw. Suchtaste geändert werden und Nutzer können diese Einstellung nicht ändern.</translation> <translation id="8415953438346821074">Wenn du diese Einstellung aktivierst, werden die in <ph name="PRODUCT_NAME" />-Profilen gespeicherten Einstellungen, etwa Lesezeichen, Autofill-Daten und Passwörter, zusätzlich in eine Datei geschrieben, die im Roaming-Nutzerprofilordner oder an einem vom Administrator über die Richtlinie <ph name="ROAMING_PROFILE_LOCATION_POLICY_NAME" /> festgelegten Ort gespeichert wird. Durch die Aktivierung dieser Richtlinie wird die Cloudsynchronisierung deaktiviert. Wenn diese Richtlinie deaktiviert oder nicht konfiguriert ist, werden nur die regulären lokalen Profile verwendet.</translation> @@ -8672,6 +8779,7 @@ <translation id="8744844164152340112">Dadurch wird festgelegt, welches Design zum Rendern der Benutzeroberfläche während der OOBE (Out-of-Box-Experience) und während einer Sitzung verwendet wird. Dieser automatische Modus wechselt bei Sonnenauf- und untergang zwischen dem hellen und dunklen Design. Diese Richtlinie sollte Nutzern empfohlen werden, damit sie das Design in den Systemeinstellungen ändern können.</translation> +<translation id="8744997936011793680">Nutzer auffordern, sich noch einmal für das Profil zu authentifizieren</translation> <translation id="8749536858950505376">Wenn du die Richtlinie auf "True" setzt, bleibt der große Cursor aktiviert. Wenn du die Richtlinie auf "False" setzt, bleibt der große Cursor deaktiviert. Wenn du diese Richtlinie konfigurierst, kann die Funktion von Nutzern nicht geändert werden. Wird sie nicht konfiguriert, ist der große Cursor erst einmal deaktiviert, kann aber jederzeit von Nutzern aktiviert werden.</translation> @@ -9041,6 +9149,13 @@ Inkorrekt formatierte Vorlagen werden ignoriert.</translation> <translation id="9068629430243705879">Port 6566 (Blockierung kann bis 15.10.2021 aufgehoben werden)</translation> +<translation id="9069503402414011061">Wenn die Richtlinie konfiguriert ist, wird die Cache-Lebensdauer für Authentifizierungsdaten in Stunden festgelegt. Im Cache befinden sich Daten zu Bereichen, die der Computer als vertrauenswürdig einstuft, d. h. verwandte Bereiche. Das Speichern von Authentifizierungsdaten im Cache beschleunigt die Anmeldung. Im Cache werden keine nutzerspezifischen Daten und auch keine Daten zu nicht verwandten Bereichen gespeichert. + +Wenn die Richtlinie auf „0“ gesetzt ist, wird die Speicherung der Authentifizierungsdaten im Cache deaktiviert. Bereichsspezifische Daten werden bei jeder Anmeldung abgerufen, daher kann ein Ausschalten der Speicherung von Authentifizierungsdaten im Cache die Nutzeranmeldung erheblich verlangsamen. + +Wenn die Richtlinie nicht konfiguriert ist, können im Cache gespeicherte Authentifizierungsdaten bis zu 73 Stunden lang wiederverwendet werden. + +Hinweis: Durch einen Neustart des Geräts wird der Cache geleert. Auch für Nutzer im flüchtigen Modus werden Bereichsdaten im Cache gespeichert. Schalten Sie den Cache aus, um zu verhindern, dass Bereichsdaten von Nutzern im flüchtigen Modus gespeichert werden.</translation> <translation id="9069588907259547232">Wenn die Richtlinie aktiviert wird oder nicht konfiguriert ist, melden angemeldete Geräte die Lautstärke des Geräts. Ist die Richtlinie deaktiviert, zeichnen angemeldete Geräte den Audiostatus nicht auf und melden diesen nicht. @@ -9244,6 +9359,7 @@ <translation id="983256325512298435">Eine Liste mit Protokollen festlegen, über die eine externe App aus aufgeführten Quellen gestartet werden kann, ohne beim Nutzer nachzufragen</translation> <translation id="984365509386992443">Wenn diese Richtlinie aktiviert ist oder nicht konfiguriert wird, erhält der Nutzer möglicherweise Umfragen zu Safe Browsing. Ist die Richtlinie deaktiviert, erhält der Nutzer keine Umfragen zu Safe Browsing.</translation> +<translation id="985148612300045106">Das Verhalten von Funktionstasten kann mit der Launcher- bzw. Suchtaste geändert werden und Nutzer können diese Einstellung nicht ändern.</translation> <translation id="987261962216071510">Nur Browseranmeldungen durch Gäste zulassen</translation> <translation id="987975731398348803">Wenn die Richtlinie aktiviert oder nicht konfiguriert ist, werden über registrierte Geräte alle Gerätenutzer gemeldet, die sich vor Kurzem angemeldet haben.
diff --git a/components/policy/resources/policy_templates_id.xtb b/components/policy/resources/policy_templates_id.xtb index 687c299..bfc9075 100644 --- a/components/policy/resources/policy_templates_id.xtb +++ b/components/policy/resources/policy_templates_id.xtb
@@ -3471,6 +3471,7 @@ <translation id="3870300103958000506">Jika <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> disetel ke 1 atau tidak disetel, iklan akan diizinkan di semua situs, kecuali <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> disetel ke Salah (False). Jika kebijakan disetel ke 2, iklan akan diblokir di situs yang menayangkan iklan mengganggu.</translation> +<translation id="3876564097829884243">Aktifkan fitur EphemeralNetworkPolicies.</translation> <translation id="3877517141460819966">Mode autentikasi faktor kedua yang terintegrasi</translation> <translation id="3877908683993837673">Kebijakan ini mengontrol stack software yang digunakan untuk berkomunikasi dengan server DNS: klien DNS Sistem Operasi, atau klien DNS bawaan dari <ph name="PRODUCT_NAME" />. Kebijakan ini tidak memengaruhi server DNS mana yang digunakan: misalnya, jika sistem operasi dikonfigurasi untuk menggunakan server DNS perusahaan, server yang sama tersebut akan digunakan oleh klien DNS bawaan. Kebijakan ini juga tidak akan mengontrol jika DNS-over-HTTPS digunakan; <ph name="PRODUCT_NAME" /> akan selalu menggunakan resolver bawaan untuk permintaan DNS-over-HTTPS. Lihat kebijakan <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" /> untuk mengetahui informasi mengenai pengontrolan DNS-over-HTTPS. @@ -4891,6 +4892,19 @@ Jika tidak ada kebijakan tertentu yang diprioritaskan, lihat <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> dan <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. Pola URL di antara 3 kebijakan ini tidak boleh bertentangan. Untuk informasi selengkapnya tentang pola <ph name="URL_LABEL" /> yang valid, lihat https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> bukanlah nilai yang diterima untuk kebijakan ini.</translation> +<translation id="5174547204575752627">Kebijakan ini mengontrol pemfaktoran ulang terbaru untuk VideoDecoder API dalam plugin PPAPI. + +Migrasi hanya memengaruhi detail implementasi internal dan seharusnya tidak +mengubah perilaku apa pun. Namun, kebijakan ini dapat digunakan jika aplikasi +PPAPI tidak berfungsi seperti yang diharapkan. + +Jika kebijakan tidak disetel atau disetel ke Aktif, browser akan menentukan +implementasi mana yang akan digunakan. +Jika kebijakan disetel ke Nonaktif, browser akan menggunakan implementasi lama +hingga kebijakan berakhir. + +CATATAN: Hanya proses perender yang baru dimulai yang akan menunjukkan perubahan pada +kebijakan ini saat browser berjalan.</translation> <translation id="5177260184597743704">Kebijakan konfigurasi untuk Chrome Enterprise Connector OnSecurityEvent</translation> <translation id="5178479074002209469">Tanda boolean menunjukkan apakah sesi pengguna yang tidak dikelola harus menerima notifikasi dan memaksa logout jika update diperlukan sesuai kebijakan ini.</translation> <translation id="5179853299156742425">URL tempat template desktop dapat didownload.</translation> @@ -4908,6 +4922,7 @@ <translation id="519247340330463721">Mengonfigurasi kebijakan terkait Safe Browsing.</translation> <translation id="5194683382395300627">Mengizinkan penggunaan <ph name="ASSISTANT_PRODUCT_NAME" /> di web, misalnya untuk mengaktifkan perubahan sandi secara otomatis</translation> <translation id="5196630732055960309">Mengizinkan File Handling API di aplikasi web ini</translation> +<translation id="5205352023880027050">Jangan aktifkan fitur EphemeralNetworkPolicies.</translation> <translation id="5206454085187851382">Jika <ph name="PRINTERS_ALLOWLIST" /> dipilih untuk <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />, menyetel <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> akan menentukan printer yang dapat digunakan oleh pengguna. Hanya printer dengan ID yang cocok dengan nilai dalam kebijakan ini yang akan tersedia bagi pengguna. ID harus sesuai dengan kolom <ph name="ID_FIELD" /> atau <ph name="GUID_FIELD" /> dalam file yang ditentukan di <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation> <translation id="5207543664699568887">Mengonfigurasi apakah <ph name="PRODUCT_NAME" /> di Linux akan menggunakan notifikasi sistem. @@ -5435,6 +5450,31 @@ <translation id="5622924058222112599">Aktifkan proses peluncuran CECPQ2 default</translation> <translation id="5623304306796942802">Permintaan saat ada beberapa sertifikat yang cocok</translation> <translation id="5625771176514429288">Aplikasi Chrome akan diizinkan berjalan di platform berikut.</translation> +<translation id="5627094573311711592">Mengonfigurasi daftar aturan Kontrol Data untuk mencegah kebocoran data. Kebocoran data dapat terjadi dengan menyalin dan menempel data, melampirkan file ke halaman web, mencetak, mendownload, ...dll. + + Setiap aturan terdiri dari hal-hal berikut: + - Properti sumber tindakan. Aturan hanya akan dipicu jika tindakan pengguna cocok dengan semua kolom yang diisi di kolom <ph name="DATA_CONTROLS_SOURCES" />. Untuk sub-kolom daftar, hanya satu entri yang harus dicocokkan, misalnya hanya satu pola URL yang harus cocok untuk memicu aturan. + - Properti tujuan tindakan. Aturan hanya akan dipicu jika tindakan pengguna cocok dengan semua kolom yang diisi di kolom <ph name="DATA_CONTROLS_DESTINATIONS" />. Untuk sub-kolom daftar, hanya satu entri yang harus dicocokkan, misalnya hanya satu pola URL yang harus cocok untuk memicu aturan. + - Daftar batasan yang akan diterapkan pada data sumber. + + Aturan dapat ditambahkan untuk: + - Mengontrol data papan klip yang dibagikan antara sumber dan tujuan. + - Mengontrol pencetakan dari sumber mana pun. + - Mengontrol file yang dilampirkan ke tujuan mana pun. + - Mengontrol file yang didownload dari sumber mana pun. + + Jika kebijakan <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> disetel ke Benar (True), aturan yang dipicu akan dilaporkan ke admin. + Level batasan dapat disetel ke ALLOW, BLOCK, WARN, atau REPORT. + - Jika level batasan disetel ke ALLOW, tindakan akan diizinkan. Hal ini juga akan menggantikan batasan yang diterapkan oleh aturan lain. + - Jika level batasan disetel ke BLOCK, tindakan tidak akan diizinkan. + - Jika level batasan disetel ke WARN, pengguna akan diberi peringatan dan dapat memilih untuk melanjutkan atau membatalkan tindakan. + - Jika level batasan disetel ke REPORT, tindakan pengguna tidak akan terganggu, tetapi laporan akan dikirim jika kebijakan <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> diaktifkan. + + Catatan: + - Format pola URL sesuai dengan format ini ( https://support.google.com/chrome/a?p=url_blocklist_filter_format ). + - Untuk aturan pencegahan kebocoran data khusus <ph name="PRODUCT_OS_NAME" />, lihat juga kebijakan <ph name="DATA_LEAK_PREVENTION_RULES_LIST" />. + + Jika kebijakan ini tidak disetel, tidak ada batasan yang akan diterapkan.</translation> <translation id="5630352020869108293">Mengembalikan sesi terakhir</translation> <translation id="5633871703004128675">Mengaktifkan fitur aksesibilitas sorotan tanda sisipan</translation> <translation id="5634032995857968056">Aktifkan sandbox Penampung Aplikasi Perender</translation> @@ -6157,6 +6197,7 @@ <translation id="6299554629216555326">Setelan Pengelolaan Jendela</translation> <translation id="6302021021024941085">Nonaktifkan alat pemecahan masalah Kios.</translation> <translation id="6303118494824248488">URL disk image untuk didownload.</translation> +<translation id="6303278429164386663">Mengontrol pengaktifan fitur EphemeralNetworkPolicies</translation> <translation id="6305373713165475629">Jika kebijakan disetel, mode warna persentase cetakan default akan ditimpa. Jika mode ini tidak tersedia, kebijakan ini akan diabaikan.</translation> <translation id="6308109234708949641">Kebijakan ini mengaktifkan fitur Screencast bagi pengguna Family Link dan memberi Screencast izin untuk membuat dan mentranskripsikan rekaman layar serta mengupload ke Drive. Kebijakan ini tidak memengaruhi jenis pengguna lain. @@ -7022,6 +7063,7 @@ Jika kebijakan ini disetel ke salah (false) atau tidak disetel, tata letak tidak akan tersedia. Perlu mulai ulang agar dapat diterapkan.</translation> <translation id="685769593149966548">Terapkan Mode Terbatas Ketat untuk YouTube</translation> <translation id="686079137349561371">Microsoft Windows 7 atau lebih baru</translation> +<translation id="6866755486434471318">Mengizinkan <ph name="PEPPER_NAME" /> menggunakan gambar yang dibagikan untuk decoding video.</translation> <translation id="6881447940489194100">Hash SHA-256 dengan enkode heksadesimal pada data.</translation> <translation id="68818134518270542">Menyetel kebijakan akan menentukan aplikasi yang dapat diaktifkan pengguna sebagai aplikasi pencatat di layar kunci <ph name="PRODUCT_OS_NAME" />. @@ -7381,6 +7423,10 @@ Jika kebijakan ini tidak ditetapkan, browser mungkin akan mengirim permintaan DNS-over-HTTPS kepada resolver yang terkait dengan resolver sistem terkonfigurasi milik pengguna.</translation> <translation id="7152640356717355643">Aktifkan pelaporan antarmuka jaringan perangkat</translation> +<translation id="7153786895642570081">Kebijakan ini mengontrol pengaktifan fitur EphemeralNetworkPolicies. +Jika kebijakan ini disetel ke benar (true), entri DeviceOpenNetworkConfiguration RecommendedValuesAreEphemeral dan UserCreatedNetworkConfigurationsAreEphemeral akan dipatuhi. +Jika kebijakan ini tidak disetel atau disetel ke salah (false), kebijakan jaringan yang disebutkan hanya akan diterapkan jika fitur EphemeralNetworkPolicies diaktifkan. +Kebijakan ini akan dihapus jika fitur EphemeralNetworkPolicies diaktifkan secara default.</translation> <translation id="7157329428182136164">Aktifkan dukungan untuk 3D graphics API</translation> <translation id="7158358621906236999">Setelan default sensor</translation> <translation id="7161568070244869726">Paksa pengaktifan AppCache</translation> @@ -9190,6 +9236,9 @@ Jika Anda menyetel kebijakan, pengguna tidak dapat mengubah fungsi ini. Jika Anda tidak menyetelnya, pengguna akan diizinkan mengubah setelan.</translation> <translation id="8707790573162457301">Jalankan pembersihan disk otomatis selama login</translation> <translation id="8713535263782304771">Nonaktifkan Safe Browsing</translation> +<translation id="8714556680280715750">URL yang dapat dikunjungi pengguna untuk mempelajari lebih lanjut. Jika tidak disetel, +tidak akan ada URL "pelajari lebih lanjut" di penginstal. Jika ada, URL harus menggunakan +skema HTTPS.</translation> <translation id="8715181294371649277">Mengizinkan Perlindungan Download Safe Browsing Real Time</translation> <translation id="8715885991031124968">Izinkan dialog JavaScript yang dipicu dari subframe asal yang berbeda.</translation> <translation id="8720547069538712402">Izinkan pengguna mengaktifkan atau menonaktifkan periksa ejaan</translation>
diff --git a/components/policy/resources/policy_templates_it.xtb b/components/policy/resources/policy_templates_it.xtb index 30e8b6f..fa579ed 100644 --- a/components/policy/resources/policy_templates_it.xtb +++ b/components/policy/resources/policy_templates_it.xtb
@@ -3395,6 +3395,7 @@ <translation id="3870300103958000506">A meno che <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> venga impostato su false, se <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> viene impostato su 1 o se non viene configurato, gli annunci sono consentiti su tutti i siti. Se il criterio viene impostato su 2, gli annunci sono bloccati sui siti con annunci invasivi.</translation> +<translation id="3876564097829884243">Attiva la funzionalità EphemeralNetworkPolicies.</translation> <translation id="3877517141460819966">Modalità di autenticazione a due fattori integrata</translation> <translation id="3877908683993837673">Questo criterio consente di controllare quale stack software viene utilizzato per comunicare con il server DNS: il client DNS del sistema operativo o quello integrato di <ph name="PRODUCT_NAME" />. Questo criterio non influisce sui server DNS utilizzati: se, ad esempio, il sistema operativo viene configurato in modo da usare un server DNS aziendale, lo stesso server viene usato dal client DNS integrato. Non consente nemmeno di controllare se viene utilizzato il protocollo DNS-over-HTTPS; <ph name="PRODUCT_NAME" /> userà sempre il resolver integrato per le richieste DNS-over-HTTPS. Per informazioni relative al controllo del protocollo DNS-over-HTTPS, consulta il criterio <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" />. @@ -4774,6 +4775,14 @@ Poiché nessun criterio specifico prevale, vedi <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> e <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. I pattern URL di questi tre criteri non devono essere in conflitto. Per informazioni dettagliate sui pattern <ph name="URL_LABEL" /> validi, visita la pagina https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> non è un valore accettato per questo criterio.</translation> +<translation id="5174547204575752627">Questo criterio consente di controllare il recente refactoring delle API VideoDecoder nel plug-in PPAPI. + +La migrazione interessa solo i dettagli di implementazione interni e non deve modificare alcun comportamento. Tuttavia, questo criterio può essere utilizzato nel caso in cui eventuali applicazioni PPAPI non funzionino come previsto. + +Se il criterio non viene configurato o se viene attivato, il browser deciderà quale implementazione usare. +Se il criterio viene disattivato, il browser utilizzerà la vecchia implementazione fino alla scadenza del criterio. + +NOTA: le modifiche apportate a questo criterio verranno applicate soltanto ai processi del renderer appena avviati mentre il browser è in esecuzione.</translation> <translation id="5177260184597743704">Criterio di configurazione per il connettore OnSecurityEvent di Chrome Enterprise</translation> <translation id="5178479074002209469">Un flag booleano che indica se le sessioni utente non gestite devono ricevere o meno notifiche e forzare o meno l'uscita dall'account in caso di aggiornamento obbligatorio, in base a questo criterio.</translation> <translation id="5179853299156742425">L'URL da cui è possibile scaricare il modello di scrivania.</translation> @@ -4791,6 +4800,7 @@ <translation id="519247340330463721">Configura le norme relative alla Navigazione sicura.</translation> <translation id="5194683382395300627">Consenti l'utilizzo di <ph name="ASSISTANT_PRODUCT_NAME" /> sul Web, ad esempio per attivare la modifica automatica delle password</translation> <translation id="5196630732055960309">Consenti l'API File Handling su queste app web</translation> +<translation id="5205352023880027050">Non attivare la funzionalità EphemeralNetworkPolicies.</translation> <translation id="5206454085187851382">Se per il criterio <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> viene selezionata l'opzione <ph name="PRINTERS_ALLOWLIST" />, la configurazione del criterio <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> consente di specificare le stampanti che possono essere utilizzate dagli utenti. Soltanto le stampanti con ID corrispondenti ai valori specificati in questo criterio saranno a disposizione degli utenti. Gli ID devono corrispondere ai campi <ph name="ID_FIELD" /> o <ph name="GUID_FIELD" /> del file specificato nel criterio <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation> <translation id="5207543664699568887">Consente di configurare se <ph name="PRODUCT_NAME" /> utilizzerà notifiche di sistema su Linux. @@ -5311,6 +5321,31 @@ <translation id="5622924058222112599">Viene attivata la procedura di lancio predefinita di CECPQ2</translation> <translation id="5623304306796942802">Mostra richiesta in caso di più certificati corrispondenti</translation> <translation id="5625771176514429288">Sarà consentita l'esecuzione delle app di Chrome su queste piattaforme</translation> +<translation id="5627094573311711592">Consente di configurare un elenco di regole di controllo dei dati per prevenire le fughe di dati. Le fughe di dati possono verificarsi tramite operazioni di copia e incolla dei dati, allegando file a pagine web, stampando, scaricando e così via. + + Ogni regola include quanto segue: + - Proprietà dell'origine di un'azione. Una regola viene attivata soltanto se un'azione dell'utente corrisponde a tutti i campi compilati nel relativo campo <ph name="DATA_CONTROLS_SOURCES" />. Per quanto riguarda i campi secondari dell'elenco, deve corrispondere soltanto una voce; ad esempio, deve corrispondere un solo pattern URL per attivare la regola. + - Proprietà della destinazione di un'azione. Una regola viene attivata soltanto se un'azione dell'utente corrisponde a tutti i campi compilati nel relativo campo <ph name="DATA_CONTROLS_DESTINATIONS" />. Per quanto riguarda i campi secondari dell'elenco, deve corrispondere soltanto una voce; ad esempio, deve corrispondere un solo pattern URL per attivare la regola. + - Un elenco di limitazioni da applicare ai dati delle origini. + + È possibile aggiungere regole per: + - Controllare i dati degli appunti condivisi tra le origini e le destinazioni. + - Controllare la stampa da tutte le origini. + - Controllare i file allegati a tutte le destinazioni. + - Controllare i file scaricati da tutte le origini. + + Se il criterio <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> viene impostato su True, le regole attivate vengono segnalate all'amministratore. + Il livello di limitazione può essere impostato su ALLOW, BLOCK, WARN, REPORT. + - Se il livello di limitazione è impostato su ALLOW, l'azione sarà consentita. Verranno sostituite anche le limitazioni applicate da altre regole. + - Se il livello di limitazione è impostato su BLOCK, l'azione non sarà consentita. + - Se il livello di limitazione è impostato su WARN, l'utente verrà avvisato e potrà scegliere se continuare o annullare l'azione. + - Se il livello di limitazione è impostato su REPORT, l'azione dell'utente non verrà interrotta, ma verrà inviata una segnalazione se il criterio <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> è attivo. + + Note: + - I pattern URL devono avere il formato indicato all'indirizzo https://support.google.com/chrome/a?p=url_blocklist_filter_format. + - Per conoscere le regole per la prevenzione delle fughe di dati specifiche di <ph name="PRODUCT_OS_NAME" />, vedi anche il criterio <ph name="DATA_LEAK_PREVENTION_RULES_LIST" />. + + Se il criterio non viene configurato, non verranno applicate limitazioni.</translation> <translation id="5630352020869108293">Ripristina l'ultima sessione</translation> <translation id="5633871703004128675">Attiva la funzione di accessibilità di evidenziazione del cursore di testo</translation> <translation id="5634032995857968056">Abilita la sandbox del container dell'app del renderer</translation> @@ -6002,6 +6037,7 @@ <translation id="6299554629216555326">Impostazioni di gestione delle finestre</translation> <translation id="6302021021024941085">Disattiva gli strumenti per la risoluzione dei problemi relativi a Kiosk.</translation> <translation id="6303118494824248488">URL dell'immagine disco da scaricare.</translation> +<translation id="6303278429164386663">Consente di controllare l'attivazione della funzionalità EphemeralNetworkPolicies</translation> <translation id="6305373713165475629">La configurazione di questo criterio consente di sostituire la modalità di stampa a colori predefinita. Se la modalità non è disponibile, questo criterio viene ignorato.</translation> <translation id="6308109234708949641">Questo criterio consente di attivare la funzionalità Registra schermo per gli utenti di Family Link e la autorizza a creare e trascrivere la registrazione dello schermo e a caricarla su Drive. Questo criterio non influisce su altri tipi di utenti. @@ -6824,6 +6860,7 @@ Se viene impostato su False o se non viene configurato, il layout non è disponibile. È necessario riavviare per applicare il criterio.</translation> <translation id="685769593149966548">Applica la modalità Restrizione massima per YouTube</translation> <translation id="686079137349561371">Microsoft Windows 7 o versioni successive</translation> +<translation id="6866755486434471318">Consenti a <ph name="PEPPER_NAME" /> di usare immagini condivise per la decodifica video.</translation> <translation id="6881447940489194100">Hash SHA-256 esadecimale codificato dei dati.</translation> <translation id="68818134518270542">La configurazione del criterio consente di specificare le app che gli utenti possono attivare come app per scrivere note nella schermata di blocco di <ph name="PRODUCT_OS_NAME" />. @@ -7179,6 +7216,10 @@ Se questo criterio non viene impostato, il browser potrebbe inviare richieste DNS over HTTPS a un resolver associato al resolver di sistema configurato dall'utente.</translation> <translation id="7152640356717355643">Attiva i report sull'interfaccia di rete del dispositivo</translation> +<translation id="7153786895642570081">Questo criterio consente di controllare l'attivazione della funzionalità EphemeralNetworkPolicies. +Se questo criterio viene impostato su true, le voci di DeviceOpenNetworkConfiguration RecommendedValuesAreEphemeral e UserCreatedNetworkConfigurationsAreEphemeral verranno rispettate. +Se questo criterio non viene configurato o se viene impostato su false, i criteri di rete menzionati verranno rispettati soltanto se è attiva la funzionalità EphemeralNetworkPolicies. +Questo criterio viene rimosso se la funzionalità EphemeralNetworkPolicies è attiva per impostazione predefinita.</translation> <translation id="7157329428182136164">Attiva il supporto per le API grafiche 3D</translation> <translation id="7158358621906236999">Impostazione dei sensori predefinita</translation> <translation id="7161568070244869726">Viene forzata l'attivazione di AppCache</translation> @@ -8947,6 +8988,9 @@ Se imposti il criterio, gli utenti non possono modificare questa funzione. Se non viene impostato, gli utenti possono cambiare l'impostazione.</translation> <translation id="8707790573162457301">Esegui la pulizia automatica del disco durante l'accesso</translation> <translation id="8713535263782304771">Disattiva Navigazione sicura</translation> +<translation id="8714556680280715750">Un URL che gli utenti possono visitare per saperne di più. Se lo schema non viene configurato, +nel programma di installazione non verrà visualizzato alcun URL "Scopri di più". Se presente, deve utilizzare +lo schema HTTPS.</translation> <translation id="8715181294371649277">Consenti la protezione dei download in tempo reale con Navigazione sicura</translation> <translation id="8715885991031124968">Consenti le finestre di dialogo JavaScript attivate da un diverso frame secondario di origine.</translation> <translation id="8720547069538712402">Consenti all'utente di attivare o disattivare il controllo ortografico</translation>
diff --git a/components/policy/resources/policy_templates_ja.xtb b/components/policy/resources/policy_templates_ja.xtb index 58a781ef..67b01ce 100644 --- a/components/policy/resources/policy_templates_ja.xtb +++ b/components/policy/resources/policy_templates_ja.xtb
@@ -3256,6 +3256,7 @@ <translation id="3870300103958000506"><ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> が False に設定されていない場合に、<ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> を 1 に設定するか未設定のままにすると、すべてのサイトで広告の表示を許可します。 このポリシーを 2 に設定した場合、煩わしい広告が掲載されるサイトで広告の表示をブロックします。</translation> +<translation id="3876564097829884243">EphemeralNetworkPolicies 機能を有効にする。</translation> <translation id="3877517141460819966">統合 2 段階認証モード</translation> <translation id="3877908683993837673">このポリシーでは、DNS サーバーとの通信にオペレーティング システムの DNS クライアントと <ph name="PRODUCT_NAME" /> の組み込みの DNS クライアントのどちらのソフトウェア スタックを使用するかを管理できます。このポリシーは、使用する DNS サーバーの選択には影響しません。たとえば、オペレーティング システムで企業の DNS サーバーを使用するよう設定されている場合、組み込みの DNS クライアントでも同じサーバーが使用されます。また、DNS-over-HTTPS が使用されている場合は、このポリシーの対象となりません。<ph name="PRODUCT_NAME" /> では DNS-over-HTTPS リクエストに対して、常に組み込みのリゾルバを使用します。DNS-over-HTTPS の管理については、<ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" /> ポリシーをご覧ください。 @@ -4549,6 +4550,14 @@ 特定のポリシーが優先されることはありませんが、<ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> と <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" /> を確認して、これらの 3 つのポリシー間で URL パターンに矛盾がないようにしてください。 有効な <ph name="URL_LABEL" /> パターンについて詳しくは、https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns をご覧ください。このポリシーの値に「<ph name="WILDCARD_VALUE" />」は使用できません。</translation> +<translation id="5174547204575752627">このポリシーでは、PPAPI プラグインでの VideoDecoder API の最新のリファクタリングを管理します。 + +この移行は内部実装の詳細にのみ影響し、動作は変更されません。このポリシーは、PPAPI アプリケーションが想定どおりに動作しない場合にも使用できます。 + +このポリシーを未設定のままにするか有効に設定した場合は、ブラウザによりどちらの実装を使用するかが決められます。 +このポリシーを無効に設定した場合、ポリシーの有効期限が切れるまでブラウザは古い実装を使用します。 + +注: ブラウザの実行中にこのポリシーを変更した場合は、新たに開始したレンダラ プロセスにのみ変更が反映されます。</translation> <translation id="5177260184597743704">OnSecurityEvent Chrome Enterprise コネクタの設定ポリシー</translation> <translation id="5178479074002209469">このポリシーによりアップデートが必須となっている場合に、管理対象外のユーザー セッションで通知を表示してログアウトするかどうかを示すブール値のフラグです。</translation> <translation id="5179853299156742425">デスク テンプレートをダウンロードすることのできる URL です。</translation> @@ -4566,6 +4575,7 @@ <translation id="519247340330463721">セーフ ブラウジングに関するポリシーを設定します。</translation> <translation id="5194683382395300627">ウェブでの <ph name="ASSISTANT_PRODUCT_NAME" /> の使用を許可する(パスワードの自動変更を有効にするためなど)</translation> <translation id="5196630732055960309">File Handling API の使用を許可するウェブアプリを指定する</translation> +<translation id="5205352023880027050">EphemeralNetworkPolicies 機能を有効にしない。</translation> <translation id="5206454085187851382"><ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> の値に <ph name="PRINTERS_ALLOWLIST" /> が選択されている場合、<ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> でユーザーが使用できるプリンタを指定できます。ユーザーは、このポリシーで指定されている値に ID が一致するプリンタのみを使用できます。この ID は、<ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> で指定されたファイル内の「<ph name="ID_FIELD" />」または「<ph name="GUID_FIELD" />」フィールドに対応している必要があります。</translation> <translation id="5207543664699568887">Linux で <ph name="PRODUCT_NAME" /> がシステム通知を使用するかどうかを設定します。True に設定するか未設定のままにすると、<ph name="PRODUCT_NAME" /> はシステム通知を使用できます。False に設定すると、<ph name="PRODUCT_NAME" /> はシステム通知を使用しません。代わりに <ph name="PRODUCT_NAME" /> のメッセージ センターが使用されます。</translation> <translation id="5207700504551161524">ログイン画面のスクリーンセーバーに表示する画像のリストを設定します。 @@ -5041,6 +5051,31 @@ <translation id="5622924058222112599">デフォルトの CECPQ2 導入プロセスを有効にする</translation> <translation id="5623304306796942802">複数の証明書が一致した場合にメッセージを表示する</translation> <translation id="5625771176514429288">指定プラットフォームで Chrome アプリを実行できる。</translation> +<translation id="5627094573311711592">データ漏洩を防止するためのデータ管理ルールのリストを設定します。データ漏洩は、データのコピー、ウェブページへのファイル添付、印刷、ダウンロードなどの際に起こる可能性があります。 + + 各ルールは以下で構成されます。 + - アクション実行元のプロパティ。ルールがトリガーされるのは、<ph name="DATA_CONTROLS_SOURCES" /> フィールドに入力された全フィールドにユーザー アクションが一致する場合のみです。リストのサブフィールドでは、一致するエントリが 1 つあれば(例: 1 つの URL パターンが一致すれば)、ルールがトリガーされる条件が満たされます。 + - アクション実行先のプロパティ。ルールがトリガーされるのは、<ph name="DATA_CONTROLS_DESTINATIONS" /> フィールドに入力されたすべてのフィールドにユーザー アクションが一致する場合のみです。リストのサブフィールドでは、一致するエントリが 1 つあれば(例: 1 つの URL パターンが一致すれば)、ルールがトリガーされる条件が満たされます。 + - アクション実行元のデータに適用する制限のリスト。 + + ルールを追加して、次の項目を管理できます。 + - アクション実行元とアクション実行先の間で共有するクリップボード データ。 + - アクション実行元からの印刷。 + - アクション実行先に添付されるファイル。 + - アクション実行元からダウンロードされるファイル。 + + <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> ポリシーが True に設定されている場合、トリガーされたルールは管理者に報告されます。 + 制限レベルは、「ALLOW」、「BLOCK」、「WARN」、「REPORT」に設定できます。 + - 制限レベルを「ALLOW」に設定した場合、アクションは許可されます。これは、他のルールによって適用される制限よりも優先されます。 + - 制限レベルを「BLOCK」に設定した場合、アクションは許可されません。 + - 制限レベルを「WARN」に設定した場合、ユーザーに警告が表示されます。ユーザーはアクションを実行するかキャンセルするかを選択できます。 + - 制限レベルを「REPORT」に設定した場合、ユーザー アクションは中断されませんが、<ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> ポリシーが有効であればレポートが送信されます。 + + 注: + - URL パターンは、https://support.google.com/chrome/a?p=url_blocklist_filter_format の形式で指定します。 + - <ph name="PRODUCT_OS_NAME" /> 固有のデータ漏洩防止ルールについては、<ph name="DATA_LEAK_PREVENTION_RULES_LIST" /> ポリシーもご覧ください。 + + このポリシーを未設定のままにした場合、制限は適用されません。</translation> <translation id="5630352020869108293">最後のセッションを復元する</translation> <translation id="5633871703004128675">「テキストカーソルによるハイライト表示」のユーザー補助機能を有効にする</translation> <translation id="5634032995857968056">レンダラアプリ コンテナのサンドボックスを有効にする</translation> @@ -5709,6 +5744,7 @@ <translation id="6299554629216555326">ウィンドウの管理設定</translation> <translation id="6302021021024941085">キオスクのトラブルシューティング ツールを無効にする。</translation> <translation id="6303118494824248488">ダウンロードするディスク イメージの URL。</translation> +<translation id="6303278429164386663">EphemeralNetworkPolicies 機能の有効化を制御する</translation> <translation id="6305373713165475629">このポリシーでは、デフォルトのカラー印刷モードをオーバーライドできます。このモードを使用できない場合、このポリシーは無視されます。</translation> <translation id="6308109234708949641">ファミリー リンクのユーザーの場合は、このポリシーがスクリーンキャストの機能を有効にし、画面録画の作成および文字起こしと Google ドライブへのアップロードの権限をスクリーンキャストに付与します。ファミリー リンク以外のユーザーには影響しません。企業ユーザーに対する <ph name="PROJECTOR_ENABLED_POLICY_NAME" /> ポリシーには影響しません。このポリシーを有効にすると、ファミリー リンクのユーザーに対してスクリーンキャスト dogfood が有効になります。このポリシーを無効にすると、ファミリー リンクのユーザーに対してスクリーンキャスト dogfood が無効になります。このポリシーを設定しないと、ファミリー リンクのユーザーに対してスクリーンキャスト dogfood がデフォルトで無効になります。</translation> <translation id="6310223829319187614">ユーザーのログイン中にドメイン名のオートコンプリートを有効にする</translation> @@ -6461,6 +6497,7 @@ false に設定するか未設定のままにした場合、このレイアウトは使用できません。有効にするには再起動が必要です。</translation> <translation id="685769593149966548">YouTube で制限付きモード「強」を強制する</translation> <translation id="686079137349561371">Microsoft Windows 7 以降</translation> +<translation id="6866755486434471318"><ph name="PEPPER_NAME" /> が共有画像を動画のデコードに使用することを許可する。</translation> <translation id="6881447940489194100">データの 16 進数でエンコードされた SHA-256 ハッシュ。</translation> <translation id="68818134518270542">このポリシーでは、<ph name="PRODUCT_OS_NAME" /> のロック画面でメモアプリとして有効にできるアプリを指定できます。任意のメモアプリをロック画面に設定すると、そのアプリを起動するための UI 要素が画面に表示されます。アプリを起動すると、ロック画面の上部にウィンドウが表示され、このコンテキストにメモを作成できます。アプリを使用して、作成したメモをメインのユーザー セッションに読み込むことができます(セッションがロックされていない場合)。ロック画面でサポートされているのは <ph name="PRODUCT_NAME" /> のメモアプリのみです。このポリシーを設定すると、アプリの拡張機能 ID がポリシーのリスト値に含まれている場合に、ユーザーはロック画面でアプリを有効にできます。このため、このポリシーを空のリストに設定すると、メモアプリはロック画面で無効になります。ポリシーでアプリ ID を指定しても、ユーザーがロック画面でそのアプリをメモアプリとして有効にできるとは限りません。たとえば、<ph name="PRODUCT_NAME" /> 61 では、使用できる一連のアプリに関して、さらにプラットフォームによる制限が適用されます。このポリシーを未設定のままにした場合、ユーザーがロック画面で有効にできる一連のアプリに関して、ポリシーを通じて適用される制限はありません。</translation> <translation id="6882028194958060206">Flash コンテンツ設定をすべてのコンテンツに拡張する(サポート終了)</translation> @@ -6777,6 +6814,10 @@ このポリシーを未設定にした場合、ブラウザは、ユーザーが設定したシステム リゾルバに関連付けられているリゾルバに DNS-over-HTTPS リクエストを送信する可能性があります。</translation> <translation id="7152640356717355643">デバイスのネットワーク インターフェースの報告を有効にする</translation> +<translation id="7153786895642570081">このポリシーでは、EphemeralNetworkPolicies 機能の有効化を管理します。 +このポリシーを true に設定した場合、DeviceOpenNetworkConfiguration エントリの RecommendedValuesAreEphemeral と UserCreatedNetworkConfigurationsAreEphemeral が適用されます。 +このポリシーを未設定のままにするか false に設定した場合、上記のネットワーク ポリシーは、EphemeralNetworkPolicies 機能が有効になっている場合にのみ適用されます。 +EphemeralNetworkPolicies 機能がデフォルトで有効になると、このポリシーは削除されます。</translation> <translation id="7157329428182136164">3D グラフィックス API のサポートを有効にする</translation> <translation id="7158358621906236999">デフォルトのセンサー設定</translation> <translation id="7161568070244869726">AppCache を強制的に有効にする</translation> @@ -8446,6 +8487,7 @@ このポリシーを設定した場合、ユーザーはこの機能を変更できません。このポリシーを未設定のままにした場合、ユーザーは設定を変更できます。</translation> <translation id="8707790573162457301">ログイン中に自動ディスク クリーンアップを実行する</translation> <translation id="8713535263782304771">セーフ ブラウジングを無効にする</translation> +<translation id="8714556680280715750">ユーザーがアクセスして詳細を確認するための URL。未設定のままにすると、インストーラに「詳細」URL は表示されません。URL を指定する場合は、https スキームを使用する必要があります。</translation> <translation id="8715181294371649277">リアルタイムのセーフ ブラウジング ダウンロード保護を有効にする</translation> <translation id="8715885991031124968">異なる生成元のサブフレームからトリガーされた JavaScript ダイアログを許可します</translation> <translation id="8720547069538712402">ユーザーにスペルチェックの有効と無効の切り替えを許可する</translation>
diff --git a/components/policy/resources/policy_templates_ko.xtb b/components/policy/resources/policy_templates_ko.xtb index 574ece3..afc9c27 100644 --- a/components/policy/resources/policy_templates_ko.xtb +++ b/components/policy/resources/policy_templates_ko.xtb
@@ -3382,6 +3382,7 @@ <translation id="3870300103958000506"><ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" />가 False로 설정되지 않은 경우 <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" />를 1로 설정하거나 설정하지 않으면 모든 사이트에서 광고가 허용됩니다. 정책을 2로 설정하면 사이트에서 방해가 되는 광고를 차단합니다.</translation> +<translation id="3876564097829884243">EphemeralNetworkPolicies 기능을 사용 설정합니다.</translation> <translation id="3877517141460819966">통합된 2단계 인증 모드</translation> <translation id="3877908683993837673">이 정책은 운영 체제 DNS 서버나 <ph name="PRODUCT_NAME" />의 내장 DNS 클라이언트와 같이 DNS 서버와의 통신에 사용되는 소프트웨어 스택을 제어합니다. 이 정책은 사용되는 DNS 서버에 영향을 미치지 않습니다. 예를 들어 엔터프라이즈 DNS 서버를 사용하도록 운영 체제가 구성된 경우 내장 DNS 클라이언트에도 동일한 서버가 사용됩니다. DNS-over-HTTPS가 사용되는 경우에도 영향을 미치지 않습니다. <ph name="PRODUCT_NAME" />에서는 항상 DNS-over-HTTPS 요청에 관한 내장 리졸버를 사용합니다. DNS-over-HTTPS 제어에 관한 자세한 내용은 <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" /> 정책을 참고하세요. @@ -4757,6 +4758,19 @@ 특정 정책이 우선 적용되지 않는 경우 <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" />와 <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />를 참고하세요. 3가지 정책 간의 URL 패턴은 충돌하지 않아야 합니다. 유효한 <ph name="URL_LABEL" /> 패턴에 관해 자세히 알아보려면 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns를 참고하세요. <ph name="WILDCARD_VALUE" />는 이 정책에 허용되는 값이 아닙니다.</translation> +<translation id="5174547204575752627">이 정책은 PPAPI 플러그인에서 VideoDecoder API의 최근 리팩터링을 제어합니다. + +이전은 내부 구현 세부정보에만 영향을 미치며 동작을 +변경하지는 않습니다. 하지만 이 정책은 PPAPI 애플리케이션이 예상대로 작동하지 않는 +경우에 사용할 수 있습니다. + +정책을 설정하지 않거나 사용으로 설정하면 사용할 구현을 +브라우저에서 결정합니다. +정책을 사용 안함으로 설정하면 정책이 만료될 때까지 브라우저에서 +이전 구현이 사용됩니다. + +참고: 새로 시작된 렌더기 프로세스만 브라우저가 실행되는 동안 이 정책의 +변경사항을 반영합니다.</translation> <translation id="5177260184597743704">OnSecurityEvent Chrome Enterprise 커넥터 설정 정책</translation> <translation id="5178479074002209469">이 정책에 따라 업데이트가 필요할 경우 비관리 사용자 세션이 알림을 받고 강제로 로그아웃될지 나타내는 부울 플래그입니다.</translation> <translation id="5179853299156742425">데스크 템플릿을 다운로드할 수 있는 URL입니다.</translation> @@ -4774,6 +4788,7 @@ <translation id="519247340330463721">세이프 브라우징 관련 정책을 설정합니다.</translation> <translation id="5194683382395300627">웹에서 자동 비밀번호 변경 등을 위해 <ph name="ASSISTANT_PRODUCT_NAME" /> 사용을 허용합니다.</translation> <translation id="5196630732055960309">웹 앱에서 File Handling API 허용</translation> +<translation id="5205352023880027050">EphemeralNetworkPolicies 기능을 사용 설정하지 않습니다.</translation> <translation id="5206454085187851382"><ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" />에 <ph name="PRINTERS_ALLOWLIST" />를 선택할 경우 <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" />를 설정하면 사용자가 사용할 수 있는 프린터가 지정됩니다. ID가 이 정책의 값과 일치하는 프린터만 사용자에게 제공됩니다. ID는 <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />에 지정된 파일의 <ph name="ID_FIELD" /> 또는 <ph name="GUID_FIELD" /> 필드와 일치해야 합니다.</translation> <translation id="5207543664699568887">Linux용 <ph name="PRODUCT_NAME" />에서 시스템 알림을 사용할지 선택합니다. @@ -5294,6 +5309,31 @@ <translation id="5622924058222112599">기본 CECPQ2 롤아웃 프로세스 사용 설정</translation> <translation id="5623304306796942802">여러 인증서가 일치하는 경우 메시지 표시</translation> <translation id="5625771176514429288">Chrome 앱이 이러한 플랫폼에서 실행됩니다.</translation> +<translation id="5627094573311711592">데이터 유출을 방지하기 위해 데이터 제어 규칙 목록을 구성합니다. 데이터 유출은 데이터를 복사하여 붙여넣기, 웹페이지에 파일 첨부, 인쇄, 다운로드 등의 작업으로 인해 발생할 수 있습니다. + + 각 규칙은 다음과 같이 구성됩니다. + - 작업 소스의 속성. 사용자 작업이 <ph name="DATA_CONTROLS_SOURCES" /> 필드에 채워진 모든 필드와 일치하는 경우에만 규칙이 트리거됩니다. 목록 하위 필드의 경우 하나의 항목만 일치하면 됩니다. 예를 들어 하나의 URL 패턴만 일치하면 규칙이 트리거됩니다. + - 작업 대상의 속성. 사용자 작업이 <ph name="DATA_CONTROLS_DESTINATIONS" /> 필드에 채워진 모든 필드와 일치하는 경우에만 규칙이 트리거됩니다. 목록 하위 필드의 경우 하나의 항목만 일치하면 됩니다. 예를 들어 하나의 URL 패턴만 일치하면 규칙이 트리거됩니다. + - 소스 데이터에 적용되는 제한사항 목록. + + 규칙은 다음을 위해 추가될 수 있습니다. + - 소스와 대상 사이에 공유되는 클립보드 데이터 제어. + - 소스의 인쇄 제어. + - 대상에 첨부되는 파일 제어. + - 소스에서 다운로드되는 파일 제어. + + <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> 정책을 True로 설정하면 트리거된 규칙이 관리자에게 보고됩니다. + 제한 수준은 ALLOW, BLOCK, WARN, REPORT로 설정될 수 있습니다. + - 제한 수준이 ALLOW로 설정되면 작업이 허용됩니다. 이렇게 하면 다른 규칙에 의해 적용된 제한사항보다 우선 적용됩니다. + - 제한 수준이 BLOCK으로 설정되면 작업이 허용되지 않습니다. + - 제한 수준이 WARN으로 설정되면 사용자에게 경고가 표시되며 사용자는 작업을 계속하거나 취소할 수 있습니다. + - 제한 수준이 REPORT로 설정되면 사용자 작업은 중단되지 않지만, <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> 정책이 사용 설정된 경우 보고서가 전송됩니다. + + 참고: + - URL 패턴 형식은 이 형식( https://support.google.com/chrome/a?p=url_blocklist_filter_format)에 따라 지정하세요. + - <ph name="PRODUCT_OS_NAME" />에 대한 데이터 유출 방지 규칙의 경우 <ph name="DATA_LEAK_PREVENTION_RULES_LIST" /> 정책도 참고하세요. + + 정책을 설정하지 않으면 제한사항이 적용되지 않습니다.</translation> <translation id="5630352020869108293">마지막 세션 복원</translation> <translation id="5633871703004128675">캐럿 강조표시 접근성 기능 사용</translation> <translation id="5634032995857968056">렌더러 앱 컨테이너 샌드박스 사용</translation> @@ -5994,6 +6034,7 @@ <translation id="6299554629216555326">창 관리 설정</translation> <translation id="6302021021024941085">키오스크 문제 해결 도구 사용 중지</translation> <translation id="6303118494824248488">다운로드할 디스크 이미지의 URL입니다.</translation> +<translation id="6303278429164386663">EphemeralNetworkPolicies 기능의 사용 설정을 제어합니다.</translation> <translation id="6305373713165475629">정책을 설정하면 기본 컬러 인쇄 모드가 재정의됩니다. 이 모드를 사용할 수 없는 경우 정책은 무시됩니다.</translation> <translation id="6308109234708949641">이 정책은 Family Link 사용자가 스크린캐스트 기능을 사용하도록 설정하고, 스크린캐스트에 화면 녹화 파일을 만들고, 스크립트를 작성하고, 이러한 항목을 Drive에 업로드하는 권한을 부여합니다. 이 정책은 다른 유형의 사용자에게 영향을 주지 않습니다. @@ -6797,6 +6838,7 @@ False로 설정하거나 설정하지 않으면 레이아웃을 사용할 수 없습니다. 설정을 적용하려면 재부팅해야 합니다.</translation> <translation id="685769593149966548">YouTube에 강력 제한 모드 사용</translation> <translation id="686079137349561371">Microsoft Windows 7 이상</translation> +<translation id="6866755486434471318"><ph name="PEPPER_NAME" />에서 동영상 디코딩에 공유 이미지를 사용하도록 허용합니다.</translation> <translation id="6881447940489194100">16진수로 인코딩된 데이터의 SHA-256 해시입니다.</translation> <translation id="68818134518270542">정책을 설정하면 사용자가 <ph name="PRODUCT_OS_NAME" /> 잠금 화면에서 메모 앱으로 사용 설정할 수 있는 앱이 지정됩니다. @@ -7152,6 +7194,10 @@ 정책이 설정되지 않으면 브라우저에서 사용자의 구성된 시스템 리졸버와 연결된 리졸버로 DNS-over-HTTPS 요청을 전송할 수 있습니다.</translation> <translation id="7152640356717355643">기기 네트워크 인터페이스 보고 사용 설정</translation> +<translation id="7153786895642570081">이 정책은 EphemeralNetworkPolicies 기능의 사용 설정을 제어합니다. +정책을 true로 설정하면 DeviceOpenNetworkConfiguration 항목인 RecommendedValuesAreEphemeral 및 UserCreatedNetworkConfigurationsAreEphemeral이 적용됩니다. +정책을 설정하지 않거나 False로 설정하면, EphemeralNetworkPolicies 기능이 사용 설정된 경우에만 위에 언급된 네트워크 정책이 적용됩니다. +EphemeralNetworkPolicies 기능이 기본적으로 사용 설정되면 이 정책은 삭제됩니다.</translation> <translation id="7157329428182136164">3D 그래픽 API 지원 사용함</translation> <translation id="7158358621906236999">기본 센서 설정</translation> <translation id="7161568070244869726">AppCache 강제 사용</translation> @@ -8940,6 +8986,9 @@ 정책을 설정하면 사용자가 이 기능을 변경할 수 없습니다. 설정하지 않으면 사용자가 설정을 변경할 수 있습니다.</translation> <translation id="8707790573162457301">로그인 중 자동 디스크 정리 실행</translation> <translation id="8713535263782304771">세이프 브라우징 사용 안함</translation> +<translation id="8714556680280715750">사용자가 방문하여 자세히 알아볼 수 있는 URL입니다. 설정하지 않으면 +설치 프로그램에 '자세히 알아보기' URL이 표시되지 않습니다. 설정된 경우 https 스키마를 +사용해야 합니다.</translation> <translation id="8715181294371649277">실시간 세이프 브라우징 다운로드 보호 허용</translation> <translation id="8715885991031124968">다른 출처 서브프레임에서 실행된 자바스크립트 대화상자 허용</translation> <translation id="8720547069538712402">사용자가 맞춤법 검사를 사용 또는 사용 중지하도록 허용</translation>
diff --git a/components/policy/resources/policy_templates_pt-BR.xtb b/components/policy/resources/policy_templates_pt-BR.xtb index fde7ea20..a3949af2 100644 --- a/components/policy/resources/policy_templates_pt-BR.xtb +++ b/components/policy/resources/policy_templates_pt-BR.xtb
@@ -5819,6 +5819,7 @@ <translation id="6042407236638640864">Permitir que as páginas com o cabeçalho <ph name="CACHE_CONTROL_NO_STORE_NAME" /> sejam inseridas no cache de avanço e retorno</translation> <translation id="604243460476563291">Desativar a transferência de arquivos em conexões de suporte remoto de administradores corporativos</translation> <translation id="6042629184389251062">A coleta de métricas inseridas no URL não é permitida</translation> +<translation id="6045733613334942660">Drivers de scanner</translation> <translation id="6046615715547751255">Não permitir controles de geração de relatórios granulares</translation> <translation id="6048199181629830227">Ativar o gerenciamento de energia no período de pico</translation> <translation id="6048690591359317353">Não permitir que o usuário desconecte ou modifique uma VPN de forma manual</translation> @@ -7766,6 +7767,7 @@ 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="751071954873065775">Selecione os Conteúdos transferidos por download que precisam ser pré-instalados</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: @@ -9316,6 +9318,9 @@ Se ela for desativada, o <ph name="SEARCH_SIDE_PANEL_FEATURE_NAME" /> não vai estar disponível em nenhuma página da Web.</translation> <translation id="8860894781631833477">Os usuários podem configurar o canal de lançamento do <ph name="PRODUCT_OS_NAME" /></translation> +<translation id="8862086508140571198">Esta política permite configurar uma lista de Conteúdos transferidos por download para download o mais rápido possível. Depois do download, o conteúdo fica disponível para todos os usuários no dispositivo. + +Isso é útil quando o administrador sabe que um recurso que exige a presença do Conteúdo transferido por download provavelmente será usado pelos usuários do dispositivo.</translation> <translation id="8864975621965365890">Remove a solicitação de recusa que aparece quando um site é processado pelo <ph name="PRODUCT_FRAME_NAME" />.</translation> <translation id="8865404058177794289">Aplicar a configuração padrão para a verificação de uso da Chave RSA</translation> <translation id="8866430022832109569">Relatórios de inventário do app</translation>
diff --git a/components/policy/resources/policy_templates_ru.xtb b/components/policy/resources/policy_templates_ru.xtb index 2e34442..db139d5 100644 --- a/components/policy/resources/policy_templates_ru.xtb +++ b/components/policy/resources/policy_templates_ru.xtb
@@ -3377,6 +3377,7 @@ <translation id="3870300103958000506">Если правило <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> не настроено или задано значение "1", показ рекламы разрешен на всех сайтах при условии, что для правила <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> не указано значение False. Если выбрано значение "2", навязчивая реклама на сайтах будет заблокирована.</translation> +<translation id="3876564097829884243">Включить функцию EphemeralNetworkPolicies</translation> <translation id="3877517141460819966">Встроенный режим двухэтапной аутентификации</translation> <translation id="3877908683993837673">Правило позволяет выбрать, какой программный стек использовать для взаимодействия с DNS-сервером: клиент DNS операционной системы или встроенный в <ph name="PRODUCT_NAME" /> клиент DNS. Это не влияет на выбор DNS-серверов. Например, если операционная система использует корпоративный DNS-сервер, то встроенный клиент DNS будет использовать этот же сервер. Это правило также не влияет на режим DNS-over-HTTPS. <ph name="PRODUCT_NAME" /> всегда отправляет запросы по этому протоколу через встроенный преобразователь. Подробные сведения об управлении режимом DNS-over-HTTPS можно найти в правиле <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" />. @@ -4738,6 +4739,14 @@ Поскольку приоритета нет ни у одного правила, изучите информацию для правил <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> и <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. Шаблоны URL, указанные в этих трех правилах, не должны конфликтовать. Подробнее о допустимых шаблонах <ph name="URL_LABEL" />: https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. Значение "<ph name="WILDCARD_VALUE" />" не поддерживается для этого правила.</translation> +<translation id="5174547204575752627">Это правило относится к недавнему рефакторингу API-интерфейсов VideoDecoder в плагине PPAPI. + +Изменения в плагине затрагивают только элементы внутренней реализации и не должны влиять на поведение. Однако если какие-то приложения PPAPI работают некорректно, вы можете использовать это правило. + +Если правило включено или не настроено, браузер автоматически определит, какую реализацию использовать. +Если правило отключено, то до истечения его срока действия браузер будет использовать старую реализацию. + +Обратите внимание, что, пока браузер открыт, изменения в настройках этого правила отражаются только в новых процессах обработки.</translation> <translation id="5177260184597743704">Настройки коннектора OnSecurityEvent для Chrome Enterprise</translation> <translation id="5178479074002209469">Логический флаг показывает, будут ли пользователи получать уведомления во время сеансов, которыми не управляет администратор, и будет ли выполнен принудительный выход из системы, если требуется обновление.</translation> <translation id="5179853299156742425">URL для скачивания шаблона рабочего стола.</translation> @@ -4753,6 +4762,7 @@ <translation id="519247340330463721">Настройка правил, связанных с Безопасным просмотром.</translation> <translation id="5194683382395300627">Разрешить использование сервиса "<ph name="ASSISTANT_PRODUCT_NAME" />" в интернете, например для автоматической смены паролей</translation> <translation id="5196630732055960309">Разрешить использование File Handling API для этих веб-приложений</translation> +<translation id="5205352023880027050">Не включать функцию EphemeralNetworkPolicies</translation> <translation id="5206454085187851382">Если в правиле <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> задан параметр <ph name="PRINTERS_ALLOWLIST" />, правило <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> определяет принтеры, с которыми может работать пользователь. Пользователь может работать только с теми принтерами, идентификаторы которых указаны в правиле. Эти идентификаторы должны соответствовать значениям полей <ph name="ID_FIELD" /> и <ph name="GUID_FIELD" /> в файле, указанном в правиле <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation> <translation id="5207543664699568887">Позволяет разрешить или запретить <ph name="PRODUCT_NAME" /> использовать нативные уведомления в Linux. @@ -5272,6 +5282,31 @@ <translation id="5622924058222112599">Включить выпуск CECPQ2 по умолчанию</translation> <translation id="5623304306796942802">Запрашивать, если подходит несколько сертификатов</translation> <translation id="5625771176514429288">Запуск приложений Chrome разрешен на этих платформах</translation> +<translation id="5627094573311711592">Позволяет настроить список правил для предотвращения утечек данных. Утечка может произойти, когда пользователь копирует и вставляет информацию, прикрепляет файлы к веб-страницам, печатает или скачивает что-нибудь и т. д. + +В каждом правиле содержатся следующие параметры: +– Свойства источника действия. Правило срабатывает, только если действие пользователя отвечает всем условиям, которые присутствуют в поле <ph name="DATA_CONTROLS_SOURCES" />. Также есть условия, указанные в подполях. Чтобы правило сработало, достаточно, чтобы действие пользователя соответствовало хотя бы одному условию, например определенному шаблону URL. + – Свойства места назначения действия. Правило срабатывает, только если действие пользователя отвечает всем условиям, которые присутствуют в поле <ph name="DATA_CONTROLS_DESTINATIONS" />. Также есть условия, указанные в подполях. Чтобы правило сработало, достаточно, чтобы действие пользователя соответствовало хотя бы одному условию, например определенному шаблону URL. + – Список ограничений, применяемых к данным из источников. + + Установив правила, вы также можете управлять: +– передачей данных из буфера обмена между источниками и местами назначения; + – печатью контента из каждого источника; + – прикреплением файлов к любым местам назначения; + – загрузкой файлов из каждого источника. + + Если для правила<ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> установлено значение True, администратор будет получать уведомления о случаях, когда срабатывают правила из списка DataControlsRules. + Для ограничений можно задавать один из следующих уровней: ALLOW, BLOCK, WARN и REPORT. + – Значение ALLOW разрешает действие и переопределяет ограничения, заданные другими правилами. + – Значение BLOCK запрещает действие. + – Если установлен уровень WARN, пользователь получает предупреждения и может разрешать или отменять действия. + – Если задан уровень REPORT, действия пользователя не прерываются. При включенном правиле <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> о них будут отправляться уведомления. + + Примечания: + – Формат шаблона URL должен соответствовать требованиям, указанным на странице https://support.google.com/chrome/a?p=url_blocklist_filter_format. + – Для предотвращения утечек данных в <ph name="PRODUCT_OS_NAME" /> вы можете настроить правило <ph name="DATA_LEAK_PREVENTION_RULES_LIST" />. + + Если правило DataControlsRules не настроено, ограничения применяться не будут.</translation> <translation id="5630352020869108293">Восстановить последний сеанс</translation> <translation id="5633871703004128675">Включить подсветку текстового курсора (специальная возможность)</translation> <translation id="5634032995857968056">Включить тестовую среду контейнера приложения для визуализации</translation> @@ -5972,6 +6007,7 @@ <translation id="6299554629216555326">Настройки управления окнами</translation> <translation id="6302021021024941085">Отключить инструменты устранения неполадок для режима киоска</translation> <translation id="6303118494824248488">URL для скачивания образа диска.</translation> +<translation id="6303278429164386663">Указать, доступна ли функция EphemeralNetworkPolicies</translation> <translation id="6305373713165475629">Переопределяет режим цветной печати по умолчанию. Если этот режим недоступен, правило не действует.</translation> <translation id="6308109234708949641">Правило активирует Screencast для пользователей Family Link и разрешает этой функции записывать видео с экрана, расшифровывать его и загружать на Диск. Правило не распространяется на других пользователей @@ -6787,6 +6823,7 @@ Если правило не настроено или для него задано значение False, раскладка недоступна. Чтобы изменения вступили в силу, необходимо перезагрузить устройство.</translation> <translation id="685769593149966548">Включить принудительное использование Строгого безопасного режима в YouTube</translation> <translation id="686079137349561371">Microsoft Windows 7 и более поздних версиях</translation> +<translation id="6866755486434471318">Разрешить плагину <ph name="PEPPER_NAME" /> использовать общие изображения для декодирования видео</translation> <translation id="6881447940489194100">Хеш SHA-256 в шестнадцатеричной кодировке для данных.</translation> <translation id="68818134518270542">Правило позволяет указать список приложений, которые можно использовать для создания заметок на заблокированном экране <ph name="PRODUCT_OS_NAME" />. @@ -7141,6 +7178,10 @@ Если правило не настроено, браузер может отправлять запросы по протоколу "DNS поверх HTTPS" преобразователю, который связан с преобразователем системы, настроенным пользователем.</translation> <translation id="7152640356717355643">Включить отправку данных о сетевых интерфейсах устройства</translation> +<translation id="7153786895642570081">Это правило определяет, доступна ли функция EphemeralNetworkPolicies. +Если указано значение True, будут учитываться параметры DeviceOpenNetworkConfiguration, RecommendedValuesAreEphemeral и UserCreatedNetworkConfigurationsAreEphemeral. +Если правило не настроено или для него задано значение False, упомянутые параметры будут учитываться, только если включена функция EphemeralNetworkPolicies. +Если она включена по умолчанию, это правило не используется.</translation> <translation id="7157329428182136164">Включить поддержку API для 3D-графики</translation> <translation id="7158358621906236999">Действующая по умолчанию настройка доступа к датчикам</translation> <translation id="7161568070244869726">Включить обязательное использование AppCache</translation> @@ -8937,6 +8978,7 @@ Настроив это правило, вы лишите пользователей возможности выбрать другой вариант. Если не устанавливать значение, пользователи смогут менять эту настройку.</translation> <translation id="8707790573162457301">Выполнять автоматическую очистку диска во время входа</translation> <translation id="8713535263782304771">Отключить Безопасный просмотр</translation> +<translation id="8714556680280715750">URL сайта с дополнительной информацией. Если свойство не задано, в установщике не будет такого URL. Решив использовать URL, убедитесь, что он начинается с префикса "https".</translation> <translation id="8715181294371649277">Разрешить Безопасному просмотру проверять скачиваемые файлы в режиме реального времени</translation> <translation id="8715885991031124968">Разрешить показывать диалоговые окна JavaScript, запущенные из других субфреймов</translation> <translation id="8720547069538712402">Разрешить пользователю включать и отключать проверку правописания</translation>
diff --git a/components/policy/resources/policy_templates_uk.xtb b/components/policy/resources/policy_templates_uk.xtb index a20a18c..5e6707f 100644 --- a/components/policy/resources/policy_templates_uk.xtb +++ b/components/policy/resources/policy_templates_uk.xtb
@@ -3396,6 +3396,7 @@ <translation id="3870300103958000506">Якщо для правила <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> не вибрано значення False, а для правила <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> вибрано значення 1 або його не налаштовано, то рекламу буде дозволено на всіх сайтах. Якщо для цього правила вибрано значення 2, рекламу буде заблоковано на сайтах із нав'язливими оголошеннями.</translation> +<translation id="3876564097829884243">Увімкнути функцію EphemeralNetworkPolicies.</translation> <translation id="3877517141460819966">Вбудовано режим двофакторної автентифікації</translation> <translation id="3877908683993837673">Це правило вказує, який набір програмного забезпечення використовується для обміну даними з DNS-сервером (клієнт DNS операційної системи чи вбудований клієнт DNS <ph name="PRODUCT_NAME" />). Це правило не впливає на те, які DNS-сервери використовуються. Наприклад, якщо операційну систему налаштовано на використання корпоративного DNS-сервера, його також застосовуватиме вбудований клієнт DNS. Воно також не контролює, чи використовується DNS-over-HTTPS. <ph name="PRODUCT_NAME" /> завжди використовуватиме вбудований резолвер для запитів DNS-over-HTTPS. Щоб дізнатися про керування протоколом DNS-over-HTTPS, перегляньте правило <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" />. @@ -4774,6 +4775,14 @@ Хоч жодне з правил не має пріоритету, перегляньте правила <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> і <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />. Шаблони URL-адрес, указані в цих трьох правилах, не можуть конфліктувати. Докладніше про дійсні шаблони <ph name="URL_LABEL" />-адрес можна дізнатися на сторінці https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns. <ph name="WILDCARD_VALUE" /> – недопустиме значення для цього правила.</translation> +<translation id="5174547204575752627">Це правило визначає останній рефакторинг для VideoDecoder API у плагіні PPAPI. + +Перенесення впливає лише на деталі внутрішньої реалізації й не має змінювати поведінку. Однак це правило можна використовувати, якщо додатки PPAPI не працюють належним чином. + +Якщо це правило не налаштувати або ввімкнути, веб-переглядач самостійно вирішуватиме, яку реалізацію застосовувати. +Якщо його вимкнути, веб-переглядач використовуватиме стару реалізацію, доки не мине строк дії цього правила. + +ПРИМІТКА: якщо веб-переглядач відкрито, внесені в правило зміни застосовуватимуться лише до нових процесів обробки.</translation> <translation id="5177260184597743704">Правило для налаштування конектора Chrome Enterprise OnSecurityEvent</translation> <translation id="5178479074002209469">Логічне значення експериментального параметра, яке вказує, чи користувачі в некерованих сеансах отримують сповіщення та примусово виходять з облікового запису, коли згідно з цим правилом потрібне оновлення.</translation> <translation id="5179853299156742425">URL-адреса, з якої можна завантажити макет робочого столу.</translation> @@ -4791,6 +4800,7 @@ <translation id="519247340330463721">Налаштовує правила, пов’язані з Безпечним переглядом.</translation> <translation id="5194683382395300627">Дозволити використовувати <ph name="ASSISTANT_PRODUCT_NAME" /> під час роботи в Інтернеті, наприклад, щоб автоматично змінювати паролі</translation> <translation id="5196630732055960309">Дозволити File Handling API у цих веб-додатках</translation> +<translation id="5205352023880027050">Не вмикати функцію EphemeralNetworkPolicies.</translation> <translation id="5206454085187851382">Якщо для правила <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> вибрано параметр <ph name="PRINTERS_ALLOWLIST" />, тоді налаштування <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> визначає, які принтери можна використовувати. Користувачам доступні лише принтери з переліченими в правилі ідентифікаторами. Ідентифікатори мають відповідати полю <ph name="ID_FIELD" /> або <ph name="GUID_FIELD" /> у файлі, указаному в правилі <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" />.</translation> <translation id="5207543664699568887">Визначає, чи <ph name="PRODUCT_NAME" /> у Linux надсилатиме системні сповіщення. @@ -5311,6 +5321,31 @@ <translation id="5622924058222112599">Увімкнути процес випуску CECPQ2 за умовчанням</translation> <translation id="5623304306796942802">Запитувати, коли є кілька відповідних сертифікатів</translation> <translation id="5625771176514429288">Додатки Chrome можна буде запускати на цих платформах.</translation> +<translation id="5627094573311711592">Налаштовує список правил керування даними, щоб запобігти витоку даних. Витік може статися, коли користувач копіює і вставляє дані, долучає файли до веб-сторінок, друкує чи завантажує інформацію тощо. + + Кожне правило має містити перелічені нижче складові. + – Властивості джерела дії. Правило активується, лише якщо дія користувача відповідає всім значенням, указаним у полі "<ph name="DATA_CONTROLS_SOURCES" />". У підполях списку достатньо, щоб збігався тільки один запис (наприклад, правило активується, коли збігається один шаблон URL-адреси). + – Властивості цільової сторінки дії. Правило активується, лише якщо дія користувача відповідає всім значенням, указаним у полі "<ph name="DATA_CONTROLS_DESTINATIONS" />". У підполях списку достатньо, щоб збігався тільки один запис (наприклад, правило активується, коли збігається один шаблон URL-адреси). + – Список обмежень, які застосовуються до даних із джерел. + + За допомогою правил можна контролювати: + – дані буфера, до яких мають доступ джерела й цільові розташування; + – друк даних із джерел; + – файли, які долучаються до цільових сторінок; + – файли, які завантажуються з будь-яких джерел. + + Якщо для правила <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> вибрати значення "правда", дані про активовані правила надсилатимуться адміністратору. + Для рівня обмежень можна вказати значення ALLOW, BLOCK, WARN, REPORT. + – Якщо вибрати значення ALLOW, дію буде дозволено. У результаті буде замінено обмеження, які застосовуються іншими правилами. + – Якщо вибрати значення BLOCK, дію буде заборонено. + – Якщо вибрати значення WARN, користувач отримає попередження й зможе або продовжити, або скасувати дію. + – Якщо вибрати значення REPORT, дія користувача не перериватиметься, але звіт буде надіслано, якщо ввімкнено правило <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" />. + + Примітки. + – Шаблон URL-адреси має відповідати вимогам до формату, наведеним на сторінці https://support.google.com/chrome/a?p=url_blocklist_filter_format. + - Щоб дізнатися більше про правила запобігання витоку даних на пристроях із <ph name="PRODUCT_OS_NAME" />, перегляньте також правило <ph name="DATA_LEAK_PREVENTION_RULES_LIST" />. + + Якщо це правило не налаштувати, обмеження не застосовуватимуться.</translation> <translation id="5630352020869108293">Відновити останній сеанс</translation> <translation id="5633871703004128675">Увімкнути спеціальну можливість "Виділення символу вставки"</translation> <translation id="5634032995857968056">Увімкнути ізольоване програмне середовище для засобу обробки в контейнері додатка</translation> @@ -6010,6 +6045,7 @@ <translation id="6299554629216555326">Налаштування керування вікнами</translation> <translation id="6302021021024941085">Вимкнути інструменти вирішення проблем у терміналі.</translation> <translation id="6303118494824248488">URL-адреса образу диска, який потрібно завантажити.</translation> +<translation id="6303278429164386663">Визначає, чи вмикати функцію EphemeralNetworkPolicies.</translation> <translation id="6305373713165475629">Якщо ввімкнути це правило, воно замінить стандартні параметри кольорового друку. Якщо такий режим недоступний, це правило ігнорується.</translation> <translation id="6308109234708949641">Це правило вмикає функцію запису екрана для користувачів Family Link і дає їй дозвіл на запис відео з екрана, його перетворення на текст, а також завантаження на Диск. Це правило не впливає на інших користувачів @@ -6845,6 +6881,7 @@ Якщо вибрати для правила значення false або не налаштувати його, розкладка буде недоступною. Щоб це правило почало діяти, потрібно перезапустити пристрій.</translation> <translation id="685769593149966548">Застосувати строгий безпечний режим на YouTube</translation> <translation id="686079137349561371">Microsoft Windows 7 і новіших версій</translation> +<translation id="6866755486434471318">Дозволити плагіну <ph name="PEPPER_NAME" /> використовувати спільні зображення для розкодування відео.</translation> <translation id="6881447940489194100">Шістнадцятковий закодований хеш SHA-256 даних.</translation> <translation id="68818134518270542">За допомогою цього правила можна створити список додатків, які користувачі можуть використовувати для нотаток на заблокованому екрані пристрою <ph name="PRODUCT_OS_NAME" />. @@ -7200,6 +7237,10 @@ Якщо це правило не налаштовано, веб-переглядач може надсилати запити DNS-over-HTTPS резолверу, пов'язаному з резолвером системи, налаштованим користувачем.</translation> <translation id="7152640356717355643">Увімкнути звіти про інтерфейс мережі на пристрої</translation> +<translation id="7153786895642570081">Це правило визначає, чи вмикати функцію EphemeralNetworkPolicies. +Якщо для цього правила вибрати значення "правда", враховуватимуться параметри DeviceOpenNetworkConfiguration, RecommendedValuesAreEphemeral і UserCreatedNetworkConfigurationsAreEphemeral. +Якщо це правило не налаштувати або вибрати для нього значення "неправда", наведені правила мережі застосовуватимуться, лише якщо ввімкнено функцію EphemeralNetworkPolicies. +Це правило буде вилучено, якщо ввімкнути функцію EphemeralNetworkPolicies за умовчанням.</translation> <translation id="7157329428182136164">Увімкнути підтримку API для 3D-графіки</translation> <translation id="7158358621906236999">Налаштування датчиків за умовчанням</translation> <translation id="7161568070244869726">Примусово ввімкнути AppCache</translation> @@ -8998,6 +9039,8 @@ Якщо його налаштовано, користувачі не зможуть змінювати цю функцію. Якщо правило не налаштовано, користувачі зможуть змінювати цей параметр.</translation> <translation id="8707790573162457301">Виконувати автоматичне очищення диска під час входу</translation> <translation id="8713535263782304771">Вимкнути Безпечний перегляд</translation> +<translation id="8714556680280715750">URL-адреса, за якою користувачі можуть отримати більше інформації. Якщо властивість schema не налаштувати, у програмі встановлення не буде +такої URL-адреси. У наявній адресі має використовуватися схема https.</translation> <translation id="8715181294371649277">Увімкнути захист завантажень для функції безпечного перегляду в реальному часі</translation> <translation id="8715885991031124968">Дозволити вікна JavaScript, активовані зі стороннього додаткового фрейму</translation> <translation id="8720547069538712402">Дозволити користувачам вмикати чи вимикати перевірку орфографії</translation>
diff --git a/components/policy/resources/policy_templates_zh-CN.xtb b/components/policy/resources/policy_templates_zh-CN.xtb index bf8fda6d..d97d119 100644 --- a/components/policy/resources/policy_templates_zh-CN.xtb +++ b/components/policy/resources/policy_templates_zh-CN.xtb
@@ -387,6 +387,9 @@ <translation id="1372618949173323717">停用 JavaScript</translation> <translation id="1376119291123231789">启用高级电池充电模式</translation> <translation id="1376765488559847650">云端上传</translation> +<translation id="1379689277107868399">如果此政策设为 DoNotPrompt 或未设置,<ph name="PRODUCT_NAME" /> 不会自动提示用户重新向浏览器验证身份。 + +如果此政策设为 PromptInTab,当用户的身份验证到期时,系统会立即在新标签页中打开 Google 登录页面。这种情况仅发生于使用 <ph name="CHROME_SYNC_NAME" />时。</translation> <translation id="1384459581748403878">参考页面:<ph name="REFERENCE_URL" /></translation> <translation id="1384594066274112751">此政策旨在确保与其指定(使用 <ph name="URL_BLOCKLIST_POLICY_NAME" /> 过滤器格式)的一个或多个格式匹配的任何网址都绝不会被浏览器舍弃。 这适用于内存压力和高效率模式舍弃。 @@ -3478,6 +3481,7 @@ <translation id="3977304360459208438">在传输层安全协议 (TLS) 中使用 3DES 加密套件的默认设置</translation> <translation id="3979738908158213640">有权在 SAML 身份验证过程中执行设备认证的网址</translation> <translation id="3982322576186033243">禁止在 TLS 握手时使用不安全哈希</translation> +<translation id="3982465141749620677">在标签页中提示重新验证身份</translation> <translation id="3983162212222338509">系统 DNS 解析可能在网络进程中运行,也可能在网络进程外运行,或部分在网络进程中、部分在网络进程外运行,具体取决于系统配置和功能标志。</translation> <translation id="3986700049001404598">允许用户通过 Chrome 任务管理器终止进程</translation> <translation id="398884292557092447">如果此政策设为 True 或未设置,则用户可以控制界面中的信用卡信息自动填充建议。 @@ -6341,6 +6345,7 @@ 如果您未设置此政策,用户便可自行选择代理设置。 注意:如需查看详细示例,请访问 Chromium 项目 ( https://www.chromium.org/developers/design-documents/network-settings#TOC-Command-line-options-for-proxy-sett )。</translation> +<translation id="6559643481486165125">不提示重新验证身份</translation> <translation id="656130159911161669">ChromeOS 更新会忽略自助服务终端应用清单中定义的版本</translation> <translation id="6561396069801924653">在系统任务栏菜单中显示无障碍选项</translation> <translation id="6562889469672829421">系统应在设备闲置多久(以毫秒为单位)后调暗屏幕</translation> @@ -8889,6 +8894,7 @@ <translation id="8744844164152340112">控制用于在 OOBE 期间和会话期间呈现界面的主题(深色/浅色/自动)。 自动模式会于日出和日落时自动在深色主题和浅色主题之间切换。 最好使用此政策,以便用户能在系统设置中更改主题。</translation> +<translation id="8744997936011793680">提示用户重新向个人资料验证身份</translation> <translation id="8749536858950505376">将此政策设为 True 会使大号光标保持开启状态。将此政策设为 False 会使大号光标会保持关闭状态。 如果您设置了此政策,用户便无法更改该功能的状态。如果您未设置此政策,大号光标最初会处于关闭状态,但用户可随时开启它。</translation>
diff --git a/components/policy/resources/policy_templates_zh-TW.xtb b/components/policy/resources/policy_templates_zh-TW.xtb index 721a02a2..f0198aa 100644 --- a/components/policy/resources/policy_templates_zh-TW.xtb +++ b/components/policy/resources/policy_templates_zh-TW.xtb
@@ -3286,6 +3286,7 @@ <translation id="3870300103958000506">除非 <ph name="SAFE_BROWSING_ENABLED_POLICY_NAME" /> 設為 False,否則將 <ph name="ADS_SETTINGS_FOR_INTRUSIVE_ADS_SITES_POLICY_NAME" /> 設為 1 或不設定將允許所有網站顯示廣告。 如果將這項政策設為 2,系統會禁止包含侵入式廣告的網站顯示廣告。</translation> +<translation id="3876564097829884243">啟用 EphemeralNetworkPolicies 功能。</translation> <translation id="3877517141460819966">整合式雙重驗證模式</translation> <translation id="3877908683993837673">這項政策可指定要使用哪一個軟體堆疊與 DNS 伺服器進行通訊,選項包括作業系統 DNS 用戶端,以及 <ph name="PRODUCT_NAME" /> 的內建 DNS 用戶端。這項政策不會影響所用的 DNS 伺服器。比方說,如果作業系統設定使用企業的 DNS 伺服器,內建 DNS 用戶端就會使用相同的伺服器。這項政策也不會限制是否使用 DNS-over-HTTPS。<ph name="PRODUCT_NAME" /> 一律會使用內建解析器處理 DNS-over-HTTPS 要求。想瞭解如何控管 DNS-over-HTTPS,請參閱 <ph name="DNS_OVER_HTTPS_MODE_POLICY_NAME" /> 政策。 @@ -4605,6 +4606,14 @@ 如果沒有優先執行的政策,請參閱 <ph name="COOKIES_BLOCKED_FOR_URLS_POLICY_NAME" /> 和 <ph name="COOKIES_ALLOWED_FOR_URLS_POLICY_NAME" />。這 3 個政策中的網址模式不可發生衝突。 如要進一步瞭解有效的<ph name="URL_LABEL" />模式,請參閱 https://cloud.google.com/docs/chrome-enterprise/policies/url-patterns。<ph name="WILDCARD_VALUE" /> 不是這項政策許可的值。</translation> +<translation id="5174547204575752627">這項政策會控制 PPAPI 外掛程式中 VideoDecoder API 的近期重構作業。 + +遷移作業只會影響內部實作詳細資料,且不應該變更任何行為。不過,如有任何 PPAPI 應用程式未正常運作,也可以使用這項政策。 + +如果這項政策未設定或設為啟用,瀏覽器就會判斷要使用的影片解碼器。 +如果將這項政策設為停用,瀏覽器會在這項政策失效前使用舊版影片解碼器。 + +注意:在瀏覽器執行期間,只有新啟動的轉譯器程序會套用這項政策的變更。</translation> <translation id="5177260184597743704">OnSecurityEvent Chrome Enterprise Connector 的配置政策</translation> <translation id="5178479074002209469">布林值標記,表示這項政策要求進行更新時,是否要讓非受管使用者工作階段接收通知並強制登出。</translation> <translation id="5179853299156742425">可下載桌面範本的網址。</translation> @@ -4622,6 +4631,7 @@ <translation id="519247340330463721">設定安全瀏覽相關政策。</translation> <translation id="5194683382395300627">允許在網站上使用 <ph name="ASSISTANT_PRODUCT_NAME" /> 執行操作,例如自動變更密碼</translation> <translation id="5196630732055960309">允許這些網頁應用程式上的 File Handling API</translation> +<translation id="5205352023880027050">不啟用 EphemeralNetworkPolicies 功能。</translation> <translation id="5206454085187851382">如果在 <ph name="PRINTERS_BULK_ACCESS_MODE_POLICY_NAME" /> 中選擇了 <ph name="PRINTERS_ALLOWLIST" />,系統會根據 <ph name="PRINTERS_BULK_ALLOWLIST_POLICY_NAME" /> 的設定指定使用者可操作的印表機。只有 ID 與這項政策值相符的印表機,才會提供給使用者。印表機 ID 必須與 <ph name="PRINTERS_BULK_CONFIGURATION_POLICY_NAME" /> 政策指定檔案的 <ph name="ID_FIELD" /> 或 <ph name="GUID_FIELD" /> 欄位值相符。</translation> <translation id="5207543664699568887">設定 Linux 上的 <ph name="PRODUCT_NAME" /> 是否要使用系統通知。 @@ -5133,6 +5143,31 @@ <translation id="5622924058222112599">啟用預設的 CECPQ2 推出程序</translation> <translation id="5623304306796942802">有多個憑證相符時,顯示提示訊息</translation> <translation id="5625771176514429288">系統會允許 Chrome 應用程式在這些平台上執行。</translation> +<translation id="5627094573311711592">設定資料控管規則清單,避免資料外洩。複製及貼上資料、附加檔案至網頁、列印、下載等操作都可能會導致資料外洩。 + + 每項規則都包含下列資訊: + - 動作來源的屬性。只有使用者動作與「<ph name="DATA_CONTROLS_SOURCES" />」欄位中填入的所有欄位相符時,才會觸發規則。如果是清單子欄位,只要一個項目相符即可。例如,只要一個網址模式相符就會觸發規則。 + - 動作目的地屬性。只有使用者動作與「<ph name="DATA_CONTROLS_DESTINATIONS" />」欄位中填入的所有欄位相符時,才會觸發規則。如果是清單子欄位,只要一個項目相符即可。例如,只要一個網址模式相符就會觸發規則。 + - 要套用到來源資料的限制清單。 + + 你可以透過新增規則控管下列項目: + - 來源與目的地共用的剪貼簿資料。 + - 任何來源的列印動作。 + - 附加至任何目的地的檔案。 + - 從任何來源下載的檔案。 + + 如果將 <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> 政策設為 True,系統會將觸發的規則回報給管理員。 + 限制等級可設為「ALLOW」、「BLOCK」、「WARN」和「REPORT」。 + - 如果將限制等級設為「ALLOW」,則可以執行該動作。這也會覆寫其他規則套用的限制。 + - 如果將限制等級設為「BLOCK」,將無法執行該動作。 + - 如果將限制等級設為「WARN」,系統會顯示警告訊息,使用者可能可以選擇繼續執行或取消動作。 + - 如果將限制等級設為「REPORT」,使用者動作不會遭到中斷,但只要啟用 <ph name="ON_SECURITY_EVENT_ENTERPRISE_CONNECTOR" /> 政策,系統就會傳送報告。 + + 注意: + - 網址模式的格式必須符合規定,詳情請參閱 https://support.google.com/chrome/a?p=url_blocklist_filter_format。 + - 有關 <ph name="PRODUCT_OS_NAME" /> 專屬的資料外洩防範規則,請參閱 <ph name="DATA_LEAK_PREVENTION_RULES_LIST" /> 政策。 + + 如果不設定這項政策,系統不會套用任何限制。</translation> <translation id="5630352020869108293">還原上次工作階段</translation> <translation id="5633871703004128675">啟用插入點醒目顯示無障礙功能</translation> <translation id="5634032995857968056">啟用轉譯器應用程式容器沙箱</translation> @@ -5802,6 +5837,7 @@ <translation id="6299554629216555326">視窗管理設定</translation> <translation id="6302021021024941085">停用資訊站疑難排解工具。</translation> <translation id="6303118494824248488">磁碟映像檔的下載網址。</translation> +<translation id="6303278429164386663">控管是否啟用 EphemeralNetworkPolicies 功能</translation> <translation id="6305373713165475629">如果設定這項政策,將覆寫預設的列印色彩模式。如果系統不支援設定的模式,將會忽略這項政策。</translation> <translation id="6308109234708949641">這項政策會為 Family Link 使用者啟用螢幕側錄功能,並授予這項功能權限,藉此建立及轉錄螢幕畫面錄製內容,並上傳至雲端硬碟。 這項政策不適用於其他類型的使用者。 @@ -6571,6 +6607,7 @@ 如果設為 False 或未設定,就無法使用該鍵盤配置。裝置必須重新啟動,政策設定才會生效。</translation> <translation id="685769593149966548">強制執行 YouTube 高度嚴格篩選模式</translation> <translation id="686079137349561371">Microsoft Windows 7 以上版本</translation> +<translation id="6866755486434471318">允許 <ph name="PEPPER_NAME" /> 使用分享的圖片解碼影片。</translation> <translation id="6881447940489194100">資料的十六進位編碼 SHA-256 雜湊。</translation> <translation id="68818134518270542">你可以透過這項政策指定應用程式,允許使用者在 <ph name="PRODUCT_OS_NAME" />螢幕鎖定畫面上以筆記應用程式的形式開啟。 @@ -6919,6 +6956,10 @@ 如果不設定這項政策,當解析器與使用者設定的系統解析器相關聯,瀏覽器可能會將 DNS-over-HTTPS 要求傳送給該解析器。</translation> <translation id="7152640356717355643">啟用裝置網路介面回報功能</translation> +<translation id="7153786895642570081">這項政策會控管 EphemeralNetworkPolicies 功能的啟用設定。 +如果將這項政策設為 True,系統會保留 DeviceOpenNetworkConfiguration 項目 RecommendedValuesAreEphemeral 和 UserCreatedNetworkConfigurationsAreEphemeral。 +如果這項政策未設定或設為 False,只在啟用 EphemeralNetworkPolicies 功能時,系統才會保留上述網路政策。 +如果預設啟用 EphemeralNetworkPolicies 功能,系統會移除這項政策。</translation> <translation id="7157329428182136164">允許支援 3D 圖形 API</translation> <translation id="7158358621906236999">預設感應器設定</translation> <translation id="7161568070244869726">強制啟用 AppCache</translation> @@ -8628,6 +8669,7 @@ 如果設定這項政策,使用者將無法變更此功能。如果不設定,使用者將可變更這項設定。</translation> <translation id="8707790573162457301">在登入期間執行自動清理磁碟作業</translation> <translation id="8713535263782304771">停用安全瀏覽功能</translation> +<translation id="8714556680280715750">此網址可讓使用者點選以瞭解詳情。如果未設定,安裝程式中就不會顯示「瞭解詳情」網址。如果有顯示網址,則必須使用 https 配置。</translation> <translation id="8715181294371649277">允許啟用即時安全瀏覽下載防護功能</translation> <translation id="8715885991031124968">允許從不同來源子頁框觸發的 JavaScript 對話方塊。</translation> <translation id="8720547069538712402">允許使用者啟用/停用拼字檢查功能</translation>
diff --git a/components/policy/resources/templates/device_policy_proto_map.yaml b/components/policy/resources/templates/device_policy_proto_map.yaml index d97ea8f..24b370d 100644 --- a/components/policy/resources/templates/device_policy_proto_map.yaml +++ b/components/policy/resources/templates/device_policy_proto_map.yaml
@@ -40,6 +40,7 @@ DeviceEncryptedReportingPipelineEnabled: device_reporting.encrypted_reporting_pipeline_enabled DeviceEphemeralUsersEnabled: ephemeral_users_enabled.ephemeral_users_enabled DeviceEphemeralNetworkPoliciesEnabled: device_ephemeral_network_policies_enabled.value +DeviceExtendedFkeysModifier: extended_fkeys_modifier.modifier DeviceExternalPrintServers: external_print_servers.external_policy DeviceExternalPrintServersAllowlist: external_print_servers_allowlist.allowlist DeviceFamilyLinkAccountsAllowed: family_link_accounts_allowed.family_link_accounts_allowed
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml index b627c97d..8c1fc17 100644 --- a/components/policy/resources/templates/policies.yaml +++ b/components/policy/resources/templates/policies.yaml
@@ -1164,6 +1164,7 @@ 1163: PPAPISharedImagesForVideoDecoderAllowed 1164: ProfileReauthPrompt 1165: RelatedWebsiteSetsEnabled + 1166: DeviceExtendedFkeysModifier atomic_groups: 1: Homepage 2: RemoteAccess
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceExtendedFkeysModifier.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceExtendedFkeysModifier.yaml new file mode 100644 index 0000000..95de202 --- /dev/null +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/DeviceExtendedFkeysModifier.yaml
@@ -0,0 +1,40 @@ +caption: Control the shortcut used to trigger F11/F12 +default: null +desc: |- + This policy controls the selected shortcut option for remapping events to + F11/F12 in the remap keys subpage. These settings are only applicable for + ChromeOS keyboards and are disabled by default if the policy is unset. +device_only: true +example_value: 0 +features: + dynamic_refresh: true + per_profile: false +future_on: +- chrome_os +items: +- caption: F11/F12 settings are disabled + name: Disabled + value: 0 +- caption: F11/F12 settings use the shortcut that contains the alt modifier + name: Alt + value: 1 +- caption: F11/F12 settings use the shortcut that contains the shift modifier + name: Shift + value: 2 +- caption: F11/F12 settings use the shortcut that contains the modifiers ctrl and shift + name: CtrlShift + value: 3 +owners: +- michaelcheco@google.com +- cros-peripherals@google.com +schema: + enum: + - 0 + - 1 + - 2 + - 3 + type: integer +supported_chrome_os_management: +- google_cloud +tags: [] +type: int-enum \ No newline at end of file
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnBulkDataEntryEnterpriseConnector.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnBulkDataEntryEnterpriseConnector.yaml index 77af358..c4d33a8 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnBulkDataEntryEnterpriseConnector.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnBulkDataEntryEnterpriseConnector.yaml
@@ -8,6 +8,8 @@ The <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD">block_until_verdict</ph> field being set to 1 means Chrome will wait to get a response from the analysis service before giving the page access to the data. Any other integer value means Chrome gives the page access to the data immediately. + The <ph name="ENTERPRISE_CONNECTOR_DEFAULT_ACTION_FIELD">default_action</ph> field being set to block means Chrome will not give the page access to the data if an error occurs while communicating with the analysis service. Any other value means Chrome gives the page access to the data. + The <ph name="ENTERPRISE_CONNECTOR_MINIMUM_DATA_SIZE">minimum_data_size</ph> field indicates the minimum size (in bytes) data entered in Chrome must equal or surpass to be scanned. The default value is 100 bytes if the field is unset. The <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD">require_justification_tags</ph> field is used to determine for which tags the connector should require the user to enter a justification to bypass a scan that results in a bypassable warning. If the field is not set, it's assumed that a justification is not required. @@ -17,6 +19,7 @@ This policy requires additional setup to take effect, please visit https://support.google.com/chrome/a?p=chrome_enterprise_connector_policies_setting for more information. example_value: - block_until_verdict: 0 + default_action: allow custom_messages: - language: default learn_more_url: moreinfo.example.com @@ -72,6 +75,11 @@ properties: block_until_verdict: type: integer + default_action: + enum: + - allow + - block + type: string custom_messages: items: properties:
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileAttachedEnterpriseConnector.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileAttachedEnterpriseConnector.yaml index 20da5a1..8a3e4c09 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileAttachedEnterpriseConnector.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileAttachedEnterpriseConnector.yaml
@@ -8,6 +8,8 @@ The <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD">block_until_verdict</ph> field being set to 1 means Chrome will wait to get a response from the analysis service before giving the page access to the file. Any other integer value means Chrome gives the page access to the file immediately. + The <ph name="ENTERPRISE_CONNECTOR_DEFAULT_ACTION_FIELD">default_action</ph> field being set to block means Chrome will not give the page access to the file if an error occurs while communicating with the analysis service. Any other value means Chrome gives the page access to the file. + The <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD">block_password_protected</ph> field controls whether Chrome blocks or allows files that are password protected. The <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD">block_large_files</ph> fields controls whether Chrome blocks or allows files that are too large to be analyzed. @@ -21,6 +23,7 @@ - block_large_files: false block_password_protected: true block_until_verdict: 0 + default_action: allow custom_messages: - language: default learn_more_url: moreinfo.example.com @@ -79,6 +82,11 @@ type: boolean block_until_verdict: type: integer + default_action: + enum: + - allow + - block + type: string custom_messages: items: properties:
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileDownloadedEnterpriseConnector.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileDownloadedEnterpriseConnector.yaml index 6a27ded..66bd753 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileDownloadedEnterpriseConnector.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnFileDownloadedEnterpriseConnector.yaml
@@ -8,6 +8,8 @@ The <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD">block_until_verdict</ph> field being set to 1 means Chrome will wait to get a response from the analysis service before giving the user access to the downloaded file. Any other integer value means Chrome gives the user access to the file immediately. + The <ph name="ENTERPRISE_CONNECTOR_DEFAULT_ACTION_FIELD">default_action</ph> field being set to block means Chrome will not give the user access to the downloaded file if an error occurs while communicating with the analysis service. Any other value means Chrome gives the user access to the downloaded file. + The <ph name="ENTERPRISE_CONNECTOR_BLOCK_PASSWORD_PROTECTED_FIELD">block_password_protected</ph> field controls whether Chrome blocks or allows files that are password protected. The <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD">block_large_files</ph> fields controls whether Chrome blocks or allows files that are too large to be analyzed. @@ -21,6 +23,7 @@ - block_large_files: true block_password_protected: false block_until_verdict: 1 + default_action: allow custom_messages: - language: default learn_more_url: moreinfo.example.com @@ -80,6 +83,11 @@ type: boolean block_until_verdict: type: integer + default_action: + enum: + - allow + - block + type: string custom_messages: items: properties:
diff --git a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnPrintEnterpriseConnector.yaml b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnPrintEnterpriseConnector.yaml index 9021635..29b6712 100644 --- a/components/policy/resources/templates/policy_definitions/Miscellaneous/OnPrintEnterpriseConnector.yaml +++ b/components/policy/resources/templates/policy_definitions/Miscellaneous/OnPrintEnterpriseConnector.yaml
@@ -9,6 +9,8 @@ The <ph name="ENTERPRISE_CONNECTOR_BLOCK_UNTIL_VERDICT_FIELD">block_until_verdict</ph> field being set to 1 means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will wait to get a response from the analysis service before allowing the print preview dialog to be shown for the printed page. Any other integer value means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> shows the print preview dialog immediately. + The <ph name="ENTERPRISE_CONNECTOR_DEFAULT_ACTION_FIELD">default_action</ph> field being set to block means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> will block the page from printing if an error occurs while communicating with the analysis service. Any other value means <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> allows the page to be printed. + The <ph name="ENTERPRISE_CONNECTOR_BLOCK_LARGE_FILES_FIELD">block_large_files</ph> fields controls whether <ph name="PRODUCT_NAME">$1<ex>Google Chrome</ex></ph> blocks or allows files/pages that are too large to be analyzed. The <ph name="ENTERPRISE_CONNECTOR_REQUIRE_JUSTIFICATION_TAGS_FIELD">require_justification_tags</ph> field is used to determine for which tags the connector should require the user to enter a justification to bypass a scan that results in a bypassable warning. If the field is not set, it's assumed that a justification is not required. @@ -19,6 +21,7 @@ example_value: - block_large_files: true block_until_verdict: 0 + default_action: allow custom_messages: - language: default learn_more_url: moreinfo.example.com @@ -68,6 +71,11 @@ - 0 - 1 type: integer + default_action: + enum: + - allow + - block + type: string custom_messages: items: properties:
diff --git a/components/policy/test/data/policy_test_cases.json b/components/policy/test/data/policy_test_cases.json index 4673da4..84df28f 100644 --- a/components/policy/test/data/policy_test_cases.json +++ b/components/policy/test/data/policy_test_cases.json
@@ -25118,5 +25118,32 @@ } } ] + }, + "DeviceExtendedFkeysModifier": { + "os": [ + "chromeos_ash" + ], + "policy_pref_mapping_tests": [ + { + "policies": {}, + "prefs": { + "ash.settings.extended_fkeys_modifier": { + "location": "user_profile", + "default_value": 0 + } + } + }, + { + "policies": { + "DeviceExtendedFkeysModifier": 1 + }, + "prefs": { + "ash.settings.extended_fkeys_modifier": { + "location": "user_profile", + "value": 1 + } + } + } + ] } -} +} \ No newline at end of file
diff --git a/components/privacy_sandbox/DEPS b/components/privacy_sandbox/DEPS index 9d2fcf9..e0b0859 100644 --- a/components/privacy_sandbox/DEPS +++ b/components/privacy_sandbox/DEPS
@@ -17,6 +17,7 @@ "+content/public/browser/interest_group_api_operation.h", "+content/public/browser/render_frame_host.h", "+ui/base", + "+ui/android", "+third_party/blink/public/common/features.h", "+third_party/blink/public/mojom/devtools/console_message.mojom.h" ]
diff --git a/components/privacy_sandbox/android/BUILD.gn b/components/privacy_sandbox/android/BUILD.gn index 6baa7a09..691bad34 100644 --- a/components/privacy_sandbox/android/BUILD.gn +++ b/components/privacy_sandbox/android/BUILD.gn
@@ -25,6 +25,7 @@ "//content/public/android:content_java", "//third_party/androidx:androidx_fragment_fragment_java", "//third_party/androidx:androidx_preference_preference_java", + "//ui/android:ui_no_recycler_view_java", "//url:gurl_java", ] } @@ -32,6 +33,7 @@ android_resources("java_resources") { sources = [ "java/res/xml/tracking_protection_preferences.xml" ] deps = [ + "//components/browser_ui/strings/android:browser_ui_strings_grd", "//components/browser_ui/styles/android:java_resources", "//components/strings:components_strings_grd", ]
diff --git a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java index 727e1d2..839eebe7 100644 --- a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java +++ b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/TrackingProtectionSettings.java
@@ -4,6 +4,8 @@ package org.chromium.components.privacy_sandbox; +import static org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge.SITE_WILDCARD; + import android.os.Bundle; import android.text.Spannable; import android.text.SpannableStringBuilder; @@ -19,10 +21,16 @@ import org.chromium.components.browser_ui.settings.ExpandablePreferenceGroup; import org.chromium.components.browser_ui.settings.SettingsUtils; import org.chromium.components.browser_ui.settings.TextMessagePreference; +import org.chromium.components.browser_ui.site_settings.AddExceptionPreference; +import org.chromium.components.browser_ui.site_settings.AddExceptionPreference.SiteAddedCallback; import org.chromium.components.browser_ui.site_settings.SiteSettingsCategory; import org.chromium.components.browser_ui.site_settings.Website; import org.chromium.components.browser_ui.site_settings.WebsitePermissionsFetcher; +import org.chromium.components.browser_ui.site_settings.WebsitePreferenceBridge; import org.chromium.components.browser_ui.styles.SemanticColorUtils; +import org.chromium.components.content_settings.ContentSettingValues; +import org.chromium.components.content_settings.ContentSettingsType; +import org.chromium.ui.widget.Toast; import java.util.ArrayList; import java.util.Collection; @@ -31,11 +39,12 @@ /** Fragment to manage settings for tracking protection. */ public class TrackingProtectionSettings extends PreferenceFragmentCompat - implements CustomDividerFragment, OnPreferenceClickListener { + implements CustomDividerFragment, OnPreferenceClickListener, SiteAddedCallback { // Must match keys in tracking_protection_preferences.xml. private static final String PREF_BLOCK_ALL_TOGGLE = "block_all_3pcd_toggle"; private static final String PREF_DNT_TOGGLE = "dnt_toggle"; private static final String ALLOWED_GROUP = "allowed_group"; + public static final String ADD_EXCEPTION_KEY = "add_exception"; // The number of sites that are on the Allowed list. private int mAllowedSiteCount; @@ -74,7 +83,16 @@ ExpandablePreferenceGroup allowedGroup = getPreferenceScreen().findPreference(ALLOWED_GROUP); allowedGroup.setOnPreferenceClickListener(this); - getBlockingExceptions(); + refreshBlockingExceptions(); + + // Add the exceptions button. + SiteSettingsCategory cookiesCategory = SiteSettingsCategory.createFromType( + mDelegate.getBrowserContext(), SiteSettingsCategory.Type.THIRD_PARTY_COOKIES); + getPreferenceScreen().addPreference(new AddExceptionPreference(getContext(), + ADD_EXCEPTION_KEY, + getString( + R.string.website_settings_third_party_cookies_page_add_allow_exception_description), + cookiesCategory, this)); } @Override @@ -89,15 +107,32 @@ if (ALLOWED_GROUP.equals(preference.getKey())) { mAllowListExpanded = !mAllowListExpanded; } - getBlockingExceptions(); + refreshBlockingExceptions(); return true; } + // AddExceptionPreference.SiteAddedCallback: + @Override + public void onAddSite(String primaryPattern, String secondaryPattern) { + WebsitePreferenceBridge.setContentSettingCustomScope(mDelegate.getBrowserContext(), + ContentSettingsType.COOKIES, primaryPattern, secondaryPattern, + ContentSettingValues.ALLOW); + + String hostname = primaryPattern.equals(SITE_WILDCARD) ? secondaryPattern : primaryPattern; + Toast.makeText(getContext(), + String.format(getContext().getString(R.string.website_settings_add_site_toast), + hostname), + Toast.LENGTH_SHORT) + .show(); + + refreshBlockingExceptions(); + } + public void setTrackingProtectionDelegate(TrackingProtectionDelegate delegate) { mDelegate = delegate; } - private void getBlockingExceptions() { + private void refreshBlockingExceptions() { SiteSettingsCategory cookiesCategory = SiteSettingsCategory.createFromType( mDelegate.getBrowserContext(), SiteSettingsCategory.Type.THIRD_PARTY_COOKIES); new WebsitePermissionsFetcher(mDelegate.getBrowserContext()) @@ -107,13 +142,14 @@ private void onExceptionsFetched(Collection<Website> sites) { List<WebsiteExceptionRowPreference> websites = new ArrayList<>(); for (Website site : sites) { - WebsiteExceptionRowPreference preference = - new WebsiteExceptionRowPreference(getContext(), site, mDelegate); + WebsiteExceptionRowPreference preference = new WebsiteExceptionRowPreference( + getContext(), site, mDelegate, this::refreshBlockingExceptions); websites.add(preference); } ExpandablePreferenceGroup allowedGroup = getPreferenceScreen().findPreference(ALLOWED_GROUP); + allowedGroup.removeAll(); // Add the description preference. var description = new TextMessagePreference(getContext(), null); description.setSummary(getString(R.string.tracking_protection_allowed_group_description));
diff --git a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java index 3db9d487..29094a0 100644 --- a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java +++ b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java
@@ -14,12 +14,18 @@ import org.chromium.components.browser_ui.settings.ChromeImageViewPreference; import org.chromium.components.browser_ui.settings.FaviconViewUtils; import org.chromium.components.browser_ui.site_settings.Website; +import org.chromium.components.content_settings.ContentSettingValues; import org.chromium.components.content_settings.ContentSettingsType; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.url.GURL; /** Represents a row element for the 3PCD exceptions site list. */ public class WebsiteExceptionRowPreference extends ChromeImageViewPreference { + /** Interface for the callback when the exception is deleted. */ + public interface WebsiteExceptionDeletedCallback { + void refreshBlockingExceptions(); + } + // Whether the favicon has been fetched already. private boolean mFaviconFetchInProgress; @@ -29,15 +35,18 @@ private Context mContext; + private WebsiteExceptionDeletedCallback mCallback; + private static final String ANY_SUBDOMAIN_PATTERN = "[*.]"; - WebsiteExceptionRowPreference( - Context context, Website site, TrackingProtectionDelegate delegate) { + WebsiteExceptionRowPreference(Context context, Website site, + TrackingProtectionDelegate delegate, WebsiteExceptionDeletedCallback callback) { super(context); mSite = site; mFaviconFetchInProgress = false; mDelegate = delegate; mContext = context; + mCallback = callback; setTitle(site.getTitle()); if (mDelegate.getSiteSettingsDelegate(mContext).isUserBypassUIEnabled()) { @@ -94,6 +103,8 @@ } private void deleteException() { - // TODO(b/295926938): Implement. + mSite.setContentSetting(mDelegate.getBrowserContext(), ContentSettingsType.COOKIES, + ContentSettingValues.DEFAULT); + mCallback.refreshBlockingExceptions(); } }
diff --git a/components/privacy_sandbox/privacy_sandbox_features.cc b/components/privacy_sandbox/privacy_sandbox_features.cc index d646393..4f49c1e 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.cc +++ b/components/privacy_sandbox/privacy_sandbox_features.cc
@@ -126,9 +126,4 @@ "TrackingProtectionOnboardingForceEligibility", base::FEATURE_DISABLED_BY_DEFAULT); -// Resets the tracking protection Onboarding eligibility. -BASE_FEATURE(kTrackingProtectionOnboardingResetEligibilityForTesting, - "TrackingProtectionOnboardingResetEligibilityForTesting", - base::FEATURE_DISABLED_BY_DEFAULT); - } // namespace privacy_sandbox
diff --git a/components/privacy_sandbox/privacy_sandbox_features.h b/components/privacy_sandbox/privacy_sandbox_features.h index 162489d..2e25f0d 100644 --- a/components/privacy_sandbox/privacy_sandbox_features.h +++ b/components/privacy_sandbox/privacy_sandbox_features.h
@@ -168,10 +168,6 @@ COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) BASE_DECLARE_FEATURE(kTrackingProtectionOnboardingForceEligibility); -// Resets eligibility for Tracking Protection Onboarding. -COMPONENT_EXPORT(PRIVACY_SANDBOX_FEATURES) -BASE_DECLARE_FEATURE(kTrackingProtectionOnboardingResetEligibilityForTesting); - } // namespace privacy_sandbox #endif // COMPONENTS_PRIVACY_SANDBOX_PRIVACY_SANDBOX_FEATURES_H_
diff --git a/components/privacy_sandbox/tracking_protection_onboarding.cc b/components/privacy_sandbox/tracking_protection_onboarding.cc index 8dea036..2a71b51 100644 --- a/components/privacy_sandbox/tracking_protection_onboarding.cc +++ b/components/privacy_sandbox/tracking_protection_onboarding.cc
@@ -51,13 +51,6 @@ } } -void ClearAllPrefs(PrefService* pref_service) { - pref_service->ClearPref(prefs::kTrackingProtectionOnboardingStatus); - pref_service->ClearPref(prefs::kTrackingProtectionEligibleSince); - pref_service->ClearPref(prefs::kTrackingProtectionOnboardedSince); - pref_service->ClearPref(prefs::kTrackingProtectionOnboardingAcked); -} - } // namespace TrackingProtectionOnboarding::TrackingProtectionOnboarding( @@ -77,13 +70,6 @@ &TrackingProtectionOnboarding::OnOnboardingAckedChanged, base::Unretained(this))); - // If we're resetting eligibility, let's clear all our prefs first. - if (base::FeatureList::IsEnabled( - privacy_sandbox:: - kTrackingProtectionOnboardingResetEligibilityForTesting)) { - ClearAllPrefs(pref_service_); - } - // If we're forcing eligibility, then let' set it now. if (base::FeatureList::IsEnabled( privacy_sandbox::kTrackingProtectionOnboardingForceEligibility) &&
diff --git a/components/privacy_sandbox/tracking_protection_onboarding_unittest.cc b/components/privacy_sandbox/tracking_protection_onboarding_unittest.cc index 70d799c..cafeb1f 100644 --- a/components/privacy_sandbox/tracking_protection_onboarding_unittest.cc +++ b/components/privacy_sandbox/tracking_protection_onboarding_unittest.cc
@@ -373,7 +373,7 @@ std::pair(TrackingProtectionOnboardingStatus::kOnboarded, TrackingProtectionOnboarding::OnboardingStatus::kOnboarded))); -class TrackingProtectionOnboardingWithForceEligibilityFeatureTest +class TrackingProtectionOnboardingWithFeatureOverrideTest : public TrackingProtectionOnboardingTest { public: void SetUp() override { @@ -387,54 +387,11 @@ base::test::ScopedFeatureList feature_list_; }; -TEST_F(TrackingProtectionOnboardingWithForceEligibilityFeatureTest, +TEST_F(TrackingProtectionOnboardingWithFeatureOverrideTest, StartsUpAsEligible) { EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(), TrackingProtectionOnboarding::OnboardingStatus::kEligible); } -class TrackingProtectionOnboardingWithResetEligibilityFeatureTest - : public TrackingProtectionOnboardingTest { - public: - void SetUp() override { - feature_list_.InitAndEnableFeature( - privacy_sandbox:: - kTrackingProtectionOnboardingResetEligibilityForTesting); - - prefs()->SetInteger( - prefs::kTrackingProtectionOnboardingStatus, - static_cast<int>(TrackingProtectionOnboardingStatus::kOnboarded)); - prefs()->SetBoolean(prefs::kTrackingProtectionOnboardingAcked, true); - prefs()->SetTime(prefs::kTrackingProtectionEligibleSince, - base::Time::Now()); - prefs()->SetTime(prefs::kTrackingProtectionOnboardedSince, - base::Time::Now()); - - tracking_protection_onboarding_service_ = - std::make_unique<TrackingProtectionOnboarding>(prefs()); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -TEST_F(TrackingProtectionOnboardingWithResetEligibilityFeatureTest, - RequiresNoticeOnStartup) { - EXPECT_EQ(tracking_protection_onboarding()->GetOnboardingStatus(), - TrackingProtectionOnboarding::OnboardingStatus::kIneligible); - EXPECT_FALSE(prefs() - ->FindPreference(prefs::kTrackingProtectionOnboardingStatus) - ->HasUserSetting()); - EXPECT_FALSE(prefs() - ->FindPreference(prefs::kTrackingProtectionOnboardingAcked) - ->HasUserSetting()); - EXPECT_FALSE(prefs() - ->FindPreference(prefs::kTrackingProtectionEligibleSince) - ->HasUserSetting()); - EXPECT_FALSE(prefs() - ->FindPreference(prefs::kTrackingProtectionOnboardedSince) - ->HasUserSetting()); -} - } // namespace } // namespace privacy_sandbox
diff --git a/components/privacy_sandbox/tracking_protection_settings.cc b/components/privacy_sandbox/tracking_protection_settings.cc index 3fcfa09..cfb6b5f 100644 --- a/components/privacy_sandbox/tracking_protection_settings.cc +++ b/components/privacy_sandbox/tracking_protection_settings.cc
@@ -103,8 +103,9 @@ } void TrackingProtectionSettings::OnTrackingProtection3pcdPrefChanged() { - // 3PC blocking may change as a result of entering/leaving the experiment. for (auto& observer : observers_) { + observer.OnTrackingProtection3pcdChanged(); + // 3PC blocking may change as a result of entering/leaving the experiment. observer.OnBlockAllThirdPartyCookiesChanged(); } }
diff --git a/components/privacy_sandbox/tracking_protection_settings_observer.h b/components/privacy_sandbox/tracking_protection_settings_observer.h index e25bb85..362bf3c 100644 --- a/components/privacy_sandbox/tracking_protection_settings_observer.h +++ b/components/privacy_sandbox/tracking_protection_settings_observer.h
@@ -24,6 +24,9 @@ // For observation of block all 3PC. virtual void OnBlockAllThirdPartyCookiesChanged() {} + + // For observation of tracking protection experiment status. + virtual void OnTrackingProtection3pcdChanged() {} }; } // namespace privacy_sandbox
diff --git a/components/privacy_sandbox/tracking_protection_settings_unittest.cc b/components/privacy_sandbox/tracking_protection_settings_unittest.cc index 881f7bb..b940b5d2 100644 --- a/components/privacy_sandbox/tracking_protection_settings_unittest.cc +++ b/components/privacy_sandbox/tracking_protection_settings_unittest.cc
@@ -22,6 +22,7 @@ public: MOCK_METHOD(void, OnDoNotTrackEnabledChanged, (), (override)); MOCK_METHOD(void, OnBlockAllThirdPartyCookiesChanged, (), (override)); + MOCK_METHOD(void, OnTrackingProtection3pcdChanged, (), (override)); }; class TrackingProtectionSettingsTest : public testing::Test { @@ -85,6 +86,7 @@ EXPECT_FALSE( tracking_protection_settings()->IsTrackingProtection3pcdEnabled()); EXPECT_CALL(observer, OnBlockAllThirdPartyCookiesChanged()); + EXPECT_CALL(observer, OnTrackingProtection3pcdChanged()); tracking_protection_settings()->OnTrackingProtectionOnboarded(); testing::Mock::VerifyAndClearExpectations(&observer);
diff --git a/components/search_engines/prepopulated_engines.json b/components/search_engines/prepopulated_engines.json index 42747603..a0266cf7 100644 --- a/components/search_engines/prepopulated_engines.json +++ b/components/search_engines/prepopulated_engines.json
@@ -23,13 +23,13 @@ // When adding new engines, increment this number and use it as the new // max ID. This is used by UMA stats and must be updated to include the full // range or else not all engines will be counted in stats. - "kMaxPrepopulatedEngineID": 110, + "kMaxPrepopulatedEngineID": 111, // Increment this if you change the data in ways that mean users with // existing data should get a new version. Otherwise, existing data may // continue to be used and updates made here will not always appear. // Also then run tools/search_engine_choice/generate_search_engine_icons.py. - "kCurrentDataVersion": 142 + "kCurrentDataVersion": 143 }, // The following engines are included in country lists and are added to the @@ -168,7 +168,7 @@ "favicon_url": "https://www.lilo.org/wp-content/themes/jarvis_wp/ajans/assets/favicon.ico", "search_url": "https://search.lilo.org/?q={searchTerms}", "suggest_url": "https://search.lilo.org/api/?service=suggestions&action=suggest&q={searchTerms}&f=chr", - "id": 106 + "id": 111 }, "mail_ru": {
diff --git a/components/search_engines/search_engine_choice_utils.cc b/components/search_engines/search_engine_choice_utils.cc index b0424c4..9c55ca4 100644 --- a/components/search_engines/search_engine_choice_utils.cc +++ b/components/search_engines/search_engine_choice_utils.cc
@@ -5,10 +5,10 @@ #include "components/search_engines/search_engine_choice_utils.h" #include "base/check_deref.h" +#include "base/check_is_test.h" #include "base/command_line.h" #include "base/feature_list.h" #include "base/metrics/histogram_functions.h" -#include "base/no_destructor.h" #include "base/values.h" #include "components/country_codes/country_codes.h" #include "components/policy/core/common/policy_service.h" @@ -16,6 +16,7 @@ #include "components/prefs/pref_service.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/search_engines_switches.h" +#include "components/search_engines/template_url_service.h" #include "components/signin/public/base/signin_switches.h" namespace search_engines { @@ -104,16 +105,23 @@ } // namespace +const char kSearchEngineChoiceScreenNavigationConditionsHistogram[] = + "Search.ChoiceScreenNavigationConditions"; + +const char kSearchEngineChoiceScreenProfileInitConditionsHistogram[] = + "Search.ChoiceScreenProfileInitConditions"; + const char kSearchEngineChoiceScreenEventsHistogram[] = "Search.ChoiceScreenEvents"; bool ShouldShowUpdatedSettings(PrefService& profile_prefs) { return base::FeatureList::IsEnabled(switches::kSearchEngineChoice) && - IsEeaChoiceCountry(GetSearchEngineChoiceCountryId(profile_prefs)); + IsEeaChoiceCountry(GetSearchEngineChoiceCountryId(&profile_prefs)); } bool ShouldShowChoiceScreen(const policy::PolicyService& policy_service, - const ProfileProperties& profile_properties) { + const ProfileProperties& profile_properties, + TemplateURLService* template_url_service) { if (!base::FeatureList::IsEnabled(switches::kSearchEngineChoice)) { return false; } @@ -134,23 +142,65 @@ return true; } + // TODO(b/302687046): Change `template_url_service` to a reference once the + // code is updated on iOS side. + if (template_url_service) { + // A custom search engine will have a `prepopulate_id` of 0. + const int kCustomSearchEnginePrepopulateId = 0; + const TemplateURL* default_search_engine = + template_url_service->GetDefaultSearchProvider(); + // Don't show the dialog if the user as a custom search engine set a + // default. + if (default_search_engine->prepopulate_id() == + kCustomSearchEnginePrepopulateId) { + RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions::kHasCustomSearchEngine); + return false; + } + } + PrefService& prefs = CHECK_DEREF(profile_properties.pref_service.get()); // The timestamp indicates that the user has already made a search engine // choice in the choice screen. if (prefs.GetInt64( prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp)) { + RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions::kAlreadyCompleted); return false; } - if (!IsEeaChoiceCountry(GetSearchEngineChoiceCountryId(prefs))) { + if (!IsEeaChoiceCountry(GetSearchEngineChoiceCountryId(&prefs))) { + RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions::kNotInRegionalScope); return false; } - return IsSearchEngineChoiceScreenAllowedByPolicy(policy_service); + // Initially exclude users with this type of override. Consult b/302675777 for + // next steps. + if (prefs.HasPrefPath(prefs::kSearchProviderOverrides)) { + RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions::kSearchProviderOverride); + return false; + } + + if (!IsSearchEngineChoiceScreenAllowedByPolicy(policy_service)) { + RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions::kControlledByPolicy); + return false; + } + + RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions::kEligible); + return true; } -int GetSearchEngineChoiceCountryId(PrefService& profile_prefs) { +int GetSearchEngineChoiceCountryId(PrefService* profile_prefs) { + // Prefs are sometimes null in unit tests. + if (!profile_prefs) { + CHECK_IS_TEST(); + } + int command_line_country = country_codes::CountryStringToCountryID( base::CommandLine::ForCurrentProcess()->GetSwitchValueASCII( switches::kSearchEngineChoiceCountry)); @@ -158,13 +208,20 @@ return command_line_country; } - return country_codes::GetCountryIDFromPrefs(&profile_prefs); + return country_codes::GetCountryIDFromPrefs(profile_prefs); } bool IsEeaChoiceCountry(int country_id) { return GetEeaChoiceCountries().contains(country_id); } +void RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions condition) { + base::UmaHistogramEnumeration( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + condition); +} + void RecordChoiceScreenEvent(SearchEngineChoiceScreenEvents event) { base::UmaHistogramEnumeration( search_engines::kSearchEngineChoiceScreenEventsHistogram, event);
diff --git a/components/search_engines/search_engine_choice_utils.h b/components/search_engines/search_engine_choice_utils.h index e1e08c9d..9a4ea4b 100644 --- a/components/search_engines/search_engine_choice_utils.h +++ b/components/search_engines/search_engine_choice_utils.h
@@ -12,13 +12,38 @@ } class PrefService; +class TemplateURLService; namespace search_engines { +extern const char kSearchEngineChoiceScreenProfileInitConditionsHistogram[]; +extern const char kSearchEngineChoiceScreenNavigationConditionsHistogram[]; extern const char kSearchEngineChoiceScreenEventsHistogram[]; // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. +enum class SearchEngineChoiceScreenConditions { + // The user has a custom search engine set. + kHasCustomSearchEngine = 0, + // The user has a search provider list override. + kSearchProviderOverride = 1, + // The user is not in the regional scope. + kNotInRegionalScope = 2, + // A policy sets the default search engine or disables search altogether. + kControlledByPolicy = 3, + // The profile is out of scope. + kProfileOutOfScope = 4, + // An extension controls the default search engine. + kExtensionContolled = 5, + // The user is eligible to see the screen at the next opportunity. + kEligible = 6, + // The choice has already been completed. + kAlreadyCompleted = 7, + kMaxValue = kAlreadyCompleted, +}; + +// These values are persisted to logs. Entries should not be renumbered and +// numeric values should never be reused. enum class SearchEngineChoiceScreenEvents { kUnknown = 0, // The non-FRE version of the choice screen was displayed. @@ -47,19 +72,26 @@ // Returns whether the search engine choice screen can be displayed or not based // on device policies and profile properties. +// TODO(b/302687046): Change `template_url_service` to a reference and remove +// default value. bool ShouldShowChoiceScreen(const policy::PolicyService& policy_service, - const ProfileProperties& profile_properties); + const ProfileProperties& profile_properties, + TemplateURLService* template_url_service = nullptr); // Returns the country ID to use in the context of any search engine choice // logic. Can be overridden using `switches::kSearchEngineChoiceCountry`. // See `//components/country_codes` for the Country ID format. -int GetSearchEngineChoiceCountryId(PrefService& profile_prefs); +int GetSearchEngineChoiceCountryId(PrefService* profile_prefs); // Returns whether the provided `country_id` is eligible for the EEA default // search engine choice prompt. // See `//components/country_codes` for the Country ID format. bool IsEeaChoiceCountry(int country_id); +// Records the specified choice screen condition at profile initialization. +void RecordChoiceScreenProfileInitCondition( + SearchEngineChoiceScreenConditions event); + // Records the specified choice screen event. void RecordChoiceScreenEvent(SearchEngineChoiceScreenEvents event); } // namespace search_engines
diff --git a/components/search_engines/search_engine_choice_utils_unittest.cc b/components/search_engines/search_engine_choice_utils_unittest.cc index 7378d7d..eb3d60c 100644 --- a/components/search_engines/search_engine_choice_utils_unittest.cc +++ b/components/search_engines/search_engine_choice_utils_unittest.cc
@@ -6,6 +6,7 @@ #include "base/check_deref.h" #include "base/command_line.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "components/country_codes/country_codes.h" #include "components/policy/core/common/mock_policy_service.h" @@ -16,6 +17,7 @@ #include "components/prefs/testing_pref_service.h" #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/search_engines_switches.h" +#include "components/search_engines/template_url_service.h" #include "components/signin/public/base/signin_switches.h" #include "testing/gtest/include/gtest/gtest.h" @@ -23,7 +25,8 @@ class SearchEngineChoiceUtilsTest : public ::testing::Test { public: - SearchEngineChoiceUtilsTest() = default; + SearchEngineChoiceUtilsTest() + : template_url_service_(/*initializers=*/nullptr, /*count=*/0) {} ~SearchEngineChoiceUtilsTest() override = default; void SetUp() override { @@ -31,6 +34,7 @@ country_codes::RegisterProfilePrefs(pref_service_.registry()); pref_service_.registry()->RegisterInt64Pref( prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp, 0); + pref_service_.registry()->RegisterListPref(prefs::kSearchProviderOverrides); // Override the country checks to simulate being in Belgium. base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( @@ -42,35 +46,40 @@ void VerifyWillShowChoiceScreen( const policy::PolicyService& policy_service, - const search_engines::ProfileProperties& profile_properties) { + const search_engines::ProfileProperties& profile_properties, + TemplateURLService& template_url_service) { PrefService& prefs = CHECK_DEREF(profile_properties.pref_service.get()); EXPECT_TRUE(search_engines::ShouldShowUpdatedSettings(prefs)); - EXPECT_TRUE(search_engines::ShouldShowChoiceScreen(policy_service, - profile_properties)); + EXPECT_TRUE(search_engines::ShouldShowChoiceScreen( + policy_service, profile_properties, &template_url_service)); } void VerifyEligibleButWillNotShowChoiceScreen( const policy::PolicyService& policy_service, - const search_engines::ProfileProperties& profile_properties) { + const search_engines::ProfileProperties& profile_properties, + TemplateURLService& template_url_service) { PrefService& prefs = CHECK_DEREF(profile_properties.pref_service.get()); EXPECT_TRUE(search_engines::ShouldShowUpdatedSettings(prefs)); - EXPECT_FALSE(search_engines::ShouldShowChoiceScreen(policy_service, - profile_properties)); + EXPECT_FALSE(search_engines::ShouldShowChoiceScreen( + policy_service, profile_properties, &template_url_service)); } void VerifyNotEligibleAndWillNotShowChoiceScreen( const policy::PolicyService& policy_service, - const search_engines::ProfileProperties& profile_properties) { + const search_engines::ProfileProperties& profile_properties, + TemplateURLService& template_url_service) { PrefService& prefs = CHECK_DEREF(profile_properties.pref_service.get()); EXPECT_FALSE(search_engines::ShouldShowUpdatedSettings(prefs)); - EXPECT_FALSE(search_engines::ShouldShowChoiceScreen(policy_service, - profile_properties)); + EXPECT_FALSE(search_engines::ShouldShowChoiceScreen( + policy_service, profile_properties, &template_url_service)); } policy::MockPolicyService& policy_service() { return policy_service_; } policy::PolicyMap& policy_map() { return policy_map_; } TestingPrefServiceSimple* pref_service() { return &pref_service_; } base::test::ScopedFeatureList* feature_list() { return &feature_list_; } + TemplateURLService& template_url_service() { return template_url_service_; } + base::HistogramTester histogram_tester_; private: void InitMockPolicyService() { @@ -99,6 +108,7 @@ policy::PolicyMap policy_map_; TestingPrefServiceSimple pref_service_; base::test::ScopedFeatureList feature_list_; + TemplateURLService template_url_service_; }; // Test that the choice screen doesn't get displayed if the profile is not @@ -106,16 +116,41 @@ TEST_F(SearchEngineChoiceUtilsTest, DoNotShowChoiceScreenWithNotRegularProfile) { VerifyEligibleButWillNotShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = false, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = false, .pref_service = pref_service()}, + template_url_service()); } // Test that the choice screen gets displayed if the // `DefaultSearchProviderEnabled` policy is not set. TEST_F(SearchEngineChoiceUtilsTest, ShowChoiceScreenIfPoliciesAreNotSet) { VerifyWillShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kEligible, 1); +} + +// Test that the choice screen does not get displayed if the provider list is +// overridden in the intial_preferences file. +TEST_F(SearchEngineChoiceUtilsTest, + DoNotShowChoiceScreenWithProviderListOverride) { + base::Value::List override_list; + pref_service()->SetList(prefs::kSearchProviderOverrides, + override_list.Clone()); + + VerifyEligibleButWillNotShowChoiceScreen( + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions:: + kSearchProviderOverride, + 1); } // Test that the choice screen doesn't get displayed if the @@ -125,8 +160,13 @@ policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, base::Value(false), nullptr); VerifyEligibleButWillNotShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kControlledByPolicy, + 1); } // Test that the choice screen gets displayed if the @@ -138,8 +178,12 @@ policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, base::Value(true), nullptr); VerifyWillShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kEligible, 1); } // Test that the choice screen doesn't get displayed if the @@ -154,11 +198,16 @@ policy::POLICY_LEVEL_MANDATORY, policy::POLICY_SCOPE_USER, policy::POLICY_SOURCE_CLOUD, base::Value("test"), nullptr); VerifyEligibleButWillNotShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kControlledByPolicy, + 1); } -// Test that the choice screen gets displayed if the +// Test that the choice screen gets displayed if and only if the // `kDefaultSearchProviderChoiceScreenTimestamp` pref is not set. Setting this // pref means that the user has made a search engine choice in the choice // screen. @@ -166,16 +215,39 @@ ShowChoiceScreenIfTheTimestampPrefIsNotSet) { VerifyWillShowChoiceScreen( policy_service(), - /*profile_properties=*/{.is_regular_profile = true, - .pref_service = pref_service()}); + /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kEligible, 1); pref_service()->SetInt64( prefs::kDefaultSearchProviderChoiceScreenCompletionTimestamp, base::Time::Now().ToDeltaSinceWindowsEpoch().InSeconds()); VerifyEligibleButWillNotShowChoiceScreen( policy_service(), - /*profile_properties=*/{.is_regular_profile = true, - .pref_service = pref_service()}); + /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kAlreadyCompleted, 1); +} + +// Test that there is a regional condition controlling eligibility. +TEST_F(SearchEngineChoiceUtilsTest, DoNotShowChoiceScreenIfCountryOutOfScope) { + base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( + switches::kSearchEngineChoiceCountry, "US"); + VerifyNotEligibleAndWillNotShowChoiceScreen( + policy_service(), + /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions::kNotInRegionalScope, + 1); } // Test that the choice screen does get displayed even if completed if the @@ -188,8 +260,9 @@ base::Time::Now().ToDeltaSinceWindowsEpoch().InSeconds()); VerifyWillShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); } // Ensure that the choice screen doesn't get displayed if the flag is disabled. @@ -197,8 +270,9 @@ feature_list()->Reset(); feature_list()->InitAndDisableFeature(switches::kSearchEngineChoice); VerifyNotEligibleAndWillNotShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); } // Test that the choice screen does not get displayed if the command line @@ -208,8 +282,9 @@ base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisableSearchEngineChoiceScreen); VerifyEligibleButWillNotShowChoiceScreen( - policy_service(), /*profile_properties=*/{ - .is_regular_profile = true, .pref_service = pref_service()}); + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); } TEST_F(SearchEngineChoiceUtilsTest, GetSearchEngineChoiceCountryId) { @@ -218,27 +293,27 @@ // The test is set up to use the command line to simulate the country as being // Belgium. - EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(*pref_service()), + EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(pref_service()), kBelgiumCountryId); // When removing the command line flag, the default value is based on the // device locale. base::CommandLine::ForCurrentProcess()->RemoveSwitch( switches::kSearchEngineChoiceCountry); - EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(*pref_service()), + EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(pref_service()), country_codes::GetCurrentCountryID()); // When the command line value is invalid, it is ignored. base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( switches::kSearchEngineChoiceCountry, "USA"); - EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(*pref_service()), + EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(pref_service()), country_codes::GetCurrentCountryID()); // Note that if the format matches (2-character strings), we might get a // country ID that is not valid/supported. base::CommandLine::ForCurrentProcess()->AppendSwitchASCII( switches::kSearchEngineChoiceCountry, "??"); - EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(*pref_service()), + EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(pref_service()), country_codes::CountryCharsToCountryID('?', '?')); // The value set from the pref is reflected otherwise. @@ -246,7 +321,7 @@ kBelgiumCountryId); base::CommandLine::ForCurrentProcess()->RemoveSwitch( switches::kSearchEngineChoiceCountry); - EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(*pref_service()), + EXPECT_EQ(search_engines::GetSearchEngineChoiceCountryId(pref_service()), kBelgiumCountryId); } @@ -264,3 +339,24 @@ EXPECT_FALSE(IsEeaChoiceCountry(CountryCharsToCountryID('U', 'S'))); } + +TEST_F(SearchEngineChoiceUtilsTest, + DoNotShowChoiceScreenIfUserHasCustomSearchEngineSetAsDefault) { + // A custom search engine will have a `prepopulate_id` of 0. + const int kCustomSearchEnginePrepopulateId = 0; + TemplateURLData template_url_data; + template_url_data.prepopulate_id = kCustomSearchEnginePrepopulateId; + template_url_data.SetURL("https://www.example.com/?q={searchTerms}"); + template_url_service().SetUserSelectedDefaultSearchProvider( + template_url_service().Add( + std::make_unique<TemplateURL>(template_url_data))); + VerifyEligibleButWillNotShowChoiceScreen( + policy_service(), /*profile_properties=*/ + {.is_regular_profile = true, .pref_service = pref_service()}, + template_url_service()); + histogram_tester_.ExpectBucketCount( + search_engines::kSearchEngineChoiceScreenProfileInitConditionsHistogram, + search_engines::SearchEngineChoiceScreenConditions:: + kHasCustomSearchEngine, + 1); +}
diff --git a/components/search_engines/template_url_prepopulate_data.cc b/components/search_engines/template_url_prepopulate_data.cc index a454921..6f0deae7 100644 --- a/components/search_engines/template_url_prepopulate_data.cc +++ b/components/search_engines/template_url_prepopulate_data.cc
@@ -4,6 +4,9 @@ #include "components/search_engines/template_url_prepopulate_data.h" +#include "base/check_deref.h" +#include "base/containers/contains.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/rand_util.h" #include "base/ranges/algorithm.h" @@ -16,6 +19,8 @@ #include "components/search_engines/search_engines_pref_names.h" #include "components/search_engines/template_url_data.h" #include "components/search_engines/template_url_data_util.h" +#include "components/search_engines/template_url_service.h" +#include "components/signin/public/base/signin_switches.h" namespace TemplateURLPrepopulateData { @@ -1633,11 +1638,84 @@ return t_url; } +std::vector<std::unique_ptr<TemplateURLData>> +GetPrepopulatedEnginesForEeaRegionCountries(int country_id) { + std::vector<std::unique_ptr<TemplateURLData>> t_urls; + std::vector<const PrepopulatedEngine*> top_engines; + std::vector<const PrepopulatedEngine*> tying_engines; + std::vector<const PrepopulatedEngine*> remaining_engines; + const bool kIsEeaCountry = search_engines::IsEeaChoiceCountry(country_id); + const bool kSearchEngineChoiceEnabled = + base::FeatureList::IsEnabled(switches::kSearchEngineChoice) || + base::FeatureList::IsEnabled(switches::kSearchEngineChoiceFre); + + CHECK(kIsEeaCountry && kSearchEngineChoiceEnabled); + const size_t kMaxNumberOfEngines = 12; + + const std::vector<EngineAndTier> country_engines = + GetPrepopulationSetFromCountryID(country_id); + + for (const EngineAndTier& country_engine : country_engines) { + switch (country_engine.tier) { + case SearchEngineTier::kTopEngines: + top_engines.push_back(country_engine.search_engine); + break; + case SearchEngineTier::kTyingEngines: + tying_engines.push_back(country_engine.search_engine); + break; + case SearchEngineTier::kRemainingEngines: + remaining_engines.push_back(country_engine.search_engine); + break; + } + } + + // Randomize all vectors. + // TODO(b/282656014): Change this to be randomized based on a seed that is + // constant for the profile. + base::RandomShuffle(top_engines.begin(), top_engines.end()); + base::RandomShuffle(tying_engines.begin(), tying_engines.end()); + base::RandomShuffle(remaining_engines.begin(), remaining_engines.end()); + + size_t current_number_of_engines = 0; + for (const PrepopulatedEngine* engine : top_engines) { + if (current_number_of_engines == kMaxNumberOfEngines) { + break; + } + t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(*engine)); + current_number_of_engines++; + } + for (const PrepopulatedEngine* engine : tying_engines) { + if (current_number_of_engines == kMaxNumberOfEngines) { + break; + } + t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(*engine)); + current_number_of_engines++; + } + for (const PrepopulatedEngine* engine : remaining_engines) { + if (current_number_of_engines == kMaxNumberOfEngines) { + break; + } + t_urls.push_back(TemplateURLDataFromPrepopulatedEngine(*engine)); + current_number_of_engines++; + } + + return t_urls; +} + std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedTemplateURLData( int country_id) { + const bool kIsEeaCountry = search_engines::IsEeaChoiceCountry(country_id); + const bool kSearchEngineChoiceEnabled = + base::FeatureList::IsEnabled(switches::kSearchEngineChoice) || + base::FeatureList::IsEnabled(switches::kSearchEngineChoiceFre); + std::vector<std::unique_ptr<TemplateURLData>> t_urls; + + if (kIsEeaCountry && kSearchEngineChoiceEnabled) { + return GetPrepopulatedEnginesForEeaRegionCountries(country_id); + } + std::vector<EngineAndTier> engines = GetPrepopulationSetFromCountryID(country_id); - std::vector<std::unique_ptr<TemplateURLData>> t_urls; for (const EngineAndTier& engine : engines) { if (engine.tier == SearchEngineTier::kTopEngines) { t_urls.push_back( @@ -1686,14 +1764,32 @@ std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines( PrefService* prefs, - size_t* default_search_provider_index) { + size_t* default_search_provider_index, + bool include_current_default, + TemplateURLService* template_url_service) { // If there is a set of search engines in the preferences file, it overrides // the built-in set. std::vector<std::unique_ptr<TemplateURLData>> t_urls = GetOverriddenTemplateURLData(prefs); if (t_urls.empty()) { t_urls = GetPrepopulatedTemplateURLData( - country_codes::GetCountryIDFromPrefs(prefs)); + search_engines::GetSearchEngineChoiceCountryId(prefs)); + + if (include_current_default && template_url_service) { + CHECK(base::FeatureList::IsEnabled(switches::kSearchEngineChoice) || + base::FeatureList::IsEnabled(switches::kSearchEngineChoiceFre)); + // This would add the current default search engine to the top of the + // returned list if it's not already there. + const TemplateURL* default_search_engine = + template_url_service->GetDefaultSearchProvider(); + if (!base::Contains(t_urls, default_search_engine->prepopulate_id(), + [](const std::unique_ptr<TemplateURLData>& engine) { + return engine->prepopulate_id; + })) { + t_urls.insert(t_urls.begin(), std::make_unique<TemplateURLData>( + default_search_engine->data())); + } + } } if (default_search_provider_index) { const auto itr = @@ -1704,73 +1800,6 @@ return t_urls; } -std::vector<std::unique_ptr<TemplateURLData>> -GetPrepopulatedEnginesForChoiceScreen(PrefService* prefs) { - // TODO (b/282656014): Update the returned list of search engines to comply - // with choice screen requirements - add current default if not present. - // Also merge GetPrepopulatedEnginesForChoiceScreen and GetPrepopulatedEngines - // and use that one everywhere with an IsEeaChoiceCountry to determine max. - - std::vector<std::unique_ptr<TemplateURLData>> engines_for_choice_screen; - std::vector<const PrepopulatedEngine*> top_engines; - std::vector<const PrepopulatedEngine*> tying_engines; - std::vector<const PrepopulatedEngine*> remaining_engines; - const size_t kMaxChoiceScreenEngines = 12; - - const std::vector<EngineAndTier> country_engines = - GetPrepopulationSetFromCountryID( - search_engines::GetSearchEngineChoiceCountryId(*prefs)); - - for (const EngineAndTier& country_engine : country_engines) { - switch (country_engine.tier) { - case SearchEngineTier::kTopEngines: - top_engines.push_back(country_engine.search_engine); - break; - case SearchEngineTier::kTyingEngines: - tying_engines.push_back(country_engine.search_engine); - break; - case SearchEngineTier::kRemainingEngines: - remaining_engines.push_back(country_engine.search_engine); - break; - } - } - - // Randomize all vectors. - // TODO(b/282656014): Change this to be randomized based on a seed that is - // constant for the profile. - base::RandomShuffle(top_engines.begin(), top_engines.end()); - base::RandomShuffle(tying_engines.begin(), tying_engines.end()); - base::RandomShuffle(remaining_engines.begin(), remaining_engines.end()); - - size_t current_number_of_engines = 0; - for (const PrepopulatedEngine* engine : top_engines) { - if (current_number_of_engines == kMaxChoiceScreenEngines) { - break; - } - engines_for_choice_screen.push_back( - TemplateURLDataFromPrepopulatedEngine(*engine)); - current_number_of_engines++; - } - for (const PrepopulatedEngine* engine : tying_engines) { - if (current_number_of_engines == kMaxChoiceScreenEngines) { - break; - } - engines_for_choice_screen.push_back( - TemplateURLDataFromPrepopulatedEngine(*engine)); - current_number_of_engines++; - } - for (const PrepopulatedEngine* engine : remaining_engines) { - if (current_number_of_engines == kMaxChoiceScreenEngines) { - break; - } - engines_for_choice_screen.push_back( - TemplateURLDataFromPrepopulatedEngine(*engine)); - current_number_of_engines++; - } - - return engines_for_choice_screen; -} - std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(PrefService* prefs, int prepopulated_id) { auto engines =
diff --git a/components/search_engines/template_url_prepopulate_data.h b/components/search_engines/template_url_prepopulate_data.h index c649fc6..40cecd2 100644 --- a/components/search_engines/template_url_prepopulate_data.h +++ b/components/search_engines/template_url_prepopulate_data.h
@@ -14,6 +14,7 @@ #include "build/build_config.h" class PrefService; +class TemplateURLService; struct TemplateURLData; namespace user_prefs { @@ -36,14 +37,14 @@ // Returns the prepopulated URLs for the current country. // If |default_search_provider_index| is non-null, it is set to the index of the // default search provider within the returned vector. +// `include_current_default` should be true and `template_url_service` should be +// non-null if we want the current default search engine to be present at the +// top of the returned list if it's not already there. std::vector<std::unique_ptr<TemplateURLData>> GetPrepopulatedEngines( PrefService* prefs, - size_t* default_search_provider_index); - -// Returns the prepopulated URLs for the current country, shuffled for display -// in a search engine choice screen. -std::vector<std::unique_ptr<TemplateURLData>> -GetPrepopulatedEnginesForChoiceScreen(PrefService* prefs); + size_t* default_search_provider_index, + bool include_current_default = false, + TemplateURLService* template_url_service = nullptr); // Returns the prepopulated search engine with the given |prepopulated_id|. std::unique_ptr<TemplateURLData> GetPrepopulatedEngine(PrefService* prefs,
diff --git a/components/search_engines/template_url_prepopulate_data_unittest.cc b/components/search_engines/template_url_prepopulate_data_unittest.cc index 3dcf0be..a4dfff5a 100644 --- a/components/search_engines/template_url_prepopulate_data_unittest.cc +++ b/components/search_engines/template_url_prepopulate_data_unittest.cc
@@ -13,6 +13,7 @@ #include "base/containers/contains.h" #include "base/files/scoped_temp_dir.h" #include "base/strings/utf_string_conversions.h" +#include "base/test/scoped_feature_list.h" #include "base/values.h" #include "components/country_codes/country_codes.h" #include "components/google/core/common/google_switches.h" @@ -24,6 +25,7 @@ #include "components/search_engines/template_url_data_util.h" #include "components/search_engines/template_url_service.h" #include "components/search_engines/testing_search_terms_data.h" +#include "components/signin/public/base/signin_switches.h" #include "components/sync_preferences/testing_pref_service_syncable.h" #include "testing/gtest/include/gtest/gtest.h" @@ -134,6 +136,7 @@ protected: sync_preferences::TestingPrefServiceSyncable prefs_; + base::test::ScopedFeatureList feature_list_; }; // Verifies the set of prepopulate data doesn't contain entries with duplicate @@ -155,6 +158,8 @@ // consistent with the set of countries in EeaChoiceCountry. For example, when // in EEA they should have more than 5, and outside of EEA not more than 5. TEST_F(TemplateURLPrepopulateDataTest, NumberOfEntriesPerCountryConsistency) { + feature_list_.Reset(); + feature_list_.InitAndEnableFeature(switches::kSearchEngineChoice); const size_t kMinEea = 6; const size_t kMaxEea = 12; const size_t kMinRow = 3; @@ -162,33 +167,24 @@ for (int country_id : kAllCountryIds) { prefs_.SetInteger(country_codes::kCountryIDAtInstall, country_id); - const bool kIsEeaCountry = search_engines::IsEeaChoiceCountry(country_id); - // TODO(b/282656014): As-is this is not too useful as GetPrepopulatedEngines - // never returns more than 5. But once GetPrepopulatedEngines and - // GetPrepopulatedEnginesForChoiceScreen get merged, can then cover - // that the counts are in the expected range. - const size_t kActualSize = - kIsEeaCountry - ? TemplateURLPrepopulateData::GetPrepopulatedEnginesForChoiceScreen( - &prefs_) - .size() - : TemplateURLPrepopulateData::GetPrepopulatedEngines(&prefs_, - nullptr) - .size(); + const size_t kNumberOfSearchEngines = + TemplateURLPrepopulateData::GetPrepopulatedEngines( + &prefs_, /*default_search_provider_index=*/nullptr) + .size(); - if (kIsEeaCountry) { - EXPECT_GE(kActualSize, kMinEea) + if (search_engines::IsEeaChoiceCountry(country_id)) { + EXPECT_GE(kNumberOfSearchEngines, kMinEea) << " for country " << country_codes::CountryIDToCountryString(country_id); - EXPECT_LE(kActualSize, kMaxEea) + EXPECT_LE(kNumberOfSearchEngines, kMaxEea) << " for country " << country_codes::CountryIDToCountryString(country_id); } else { - EXPECT_GE(kActualSize, kMinRow) + EXPECT_GE(kNumberOfSearchEngines, kMinRow) << " for country " << country_codes::CountryIDToCountryString(country_id); - EXPECT_LE(kActualSize, kMaxRow) + EXPECT_LE(kNumberOfSearchEngines, kMaxRow) << " for country " << country_codes::CountryIDToCountryString(country_id); } @@ -535,22 +531,3 @@ EXPECT_LT(index, urls.size()); EXPECT_EQ(urls[index]->prepopulate_id, kGoogleId); } - -TEST_F(TemplateURLPrepopulateDataTest, GetPrepopulatedEnginesForChoiceScreen) { - std::vector<std::unique_ptr<TemplateURLData>> ordered_urls; - std::vector<std::unique_ptr<TemplateURLData>> shuffled_urls; - prefs_.SetInteger(country_codes::kCountryIDAtInstall, 'U' << 8 | 'S'); - ordered_urls = - TemplateURLPrepopulateData::GetPrepopulatedEngines(&prefs_, nullptr); - - shuffled_urls = - TemplateURLPrepopulateData::GetPrepopulatedEnginesForChoiceScreen( - &prefs_); - - EXPECT_EQ(ordered_urls.size(), shuffled_urls.size()); - for (const auto& url_data : ordered_urls) { - EXPECT_TRUE(base::ranges::find(shuffled_urls, url_data->prepopulate_id, - &TemplateURLData::prepopulate_id) != - shuffled_urls.end()); - } -}
diff --git a/components/search_engines/template_url_service.cc b/components/search_engines/template_url_service.cc index 28cb553..086c767 100644 --- a/components/search_engines/template_url_service.cc +++ b/components/search_engines/template_url_service.cc
@@ -593,11 +593,11 @@ TemplateURLService::OwnedTemplateURLVector TemplateURLService::GetTemplateURLsForChoiceScreen() { - // TODO (b/282656014): Update the returned list of search engines to comply - // with choice screen requirements. OwnedTemplateURLVector result; std::vector<std::unique_ptr<TemplateURLData>> engines = - TemplateURLPrepopulateData::GetPrepopulatedEnginesForChoiceScreen(prefs_); + TemplateURLPrepopulateData::GetPrepopulatedEngines( + prefs_, /*default_search_provider_index=*/nullptr, + /*include_current_default=*/true, /*template_url_service=*/this); for (const auto& engine : engines) { result.push_back(std::make_unique<TemplateURL>(*engine)); }
diff --git a/components/security_interstitials/content/BUILD.gn b/components/security_interstitials/content/BUILD.gn index 100eb02..f0c501d 100644 --- a/components/security_interstitials/content/BUILD.gn +++ b/components/security_interstitials/content/BUILD.gn
@@ -103,6 +103,8 @@ "//third_party/re2", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] + if (enable_captive_portal_detection) { sources += [ "captive_portal_metrics_recorder.cc",
diff --git a/components/security_interstitials/content/renderer/BUILD.gn b/components/security_interstitials/content/renderer/BUILD.gn index 3cf7c6b..32bb1deb 100644 --- a/components/security_interstitials/content/renderer/BUILD.gn +++ b/components/security_interstitials/content/renderer/BUILD.gn
@@ -11,4 +11,5 @@ "//third_party/blink/public:blink", "//third_party/blink/public/common", ] + configs += [ "//build/config/compiler:wexit_time_destructors" ] }
diff --git a/components/security_interstitials/core/BUILD.gn b/components/security_interstitials/core/BUILD.gn index 489ad50..cbff4c00 100644 --- a/components/security_interstitials/core/BUILD.gn +++ b/components/security_interstitials/core/BUILD.gn
@@ -70,6 +70,8 @@ ] public_deps = [ "//components/security_interstitials/core/common/mojom" ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } static_library("unsafe_resource") { @@ -87,6 +89,8 @@ "//net", "//services/network/public/mojom", ] + + configs += [ "//build/config/compiler:wexit_time_destructors" ] } source_set("unit_tests") {
diff --git a/components/segmentation_platform/internal/selection/segment_result_provider.cc b/components/segmentation_platform/internal/selection/segment_result_provider.cc index 8b440c9..633137a 100644 --- a/components/segmentation_platform/internal/selection/segment_result_provider.cc +++ b/components/segmentation_platform/internal/selection/segment_result_provider.cc
@@ -93,11 +93,11 @@ void PostResultCallback(std::unique_ptr<RequestState> request_state, std::unique_ptr<SegmentResult> result); - void RunCallback(SegmentId segment_id, - std::unique_ptr<RequestState> request_state, - std::unique_ptr<SegmentResult> segment_result, - ResultCallbackWithState callback, - bool success); + void OnSavedSegmentResult(SegmentId segment_id, + std::unique_ptr<RequestState> request_state, + std::unique_ptr<SegmentResult> segment_result, + ResultCallbackWithState callback, + bool success); const raw_ptr<SegmentInfoDatabase, DanglingUntriaged> segment_database_; const raw_ptr<SignalStorageConfig> signal_storage_config_; @@ -332,8 +332,8 @@ const auto* segment_info = segment_database_->GetCachedSegmentInfo(segment_id, model_source); if (!segment_info) { - RunCallback(segment_id, std::move(request_state), std::move(segment_result), - std::move(callback), /*success=*/false); + std::move(callback).Run(std::move(request_state), + std::move(segment_result)); return; } @@ -370,14 +370,13 @@ segment_database_->SaveSegmentResult( segment_id, model_source, success ? absl::make_optional(prediction_result) : absl::nullopt, - base::BindOnce(&SegmentResultProviderImpl::RunCallback, - weak_ptr_factory_.GetWeakPtr(), segment_id, - std::move(request_state), std::move(segment_result), - std::move(callback))); + base::BindOnce(&SegmentResultProviderImpl::OnSavedSegmentResult, + weak_ptr_factory_.GetWeakPtr(), + segment_info->segment_id(), std::move(request_state), + std::move(segment_result), std::move(callback))); return; } - RunCallback(segment_id, std::move(request_state), std::move(segment_result), - std::move(callback), success); + std::move(callback).Run(std::move(request_state), std::move(segment_result)); } void SegmentResultProviderImpl::PostResultCallback( @@ -388,7 +387,7 @@ std::move(result))); } -void SegmentResultProviderImpl::RunCallback( +void SegmentResultProviderImpl::OnSavedSegmentResult( SegmentId segment_id, std::unique_ptr<RequestState> request_state, std::unique_ptr<SegmentResult> segment_result,
diff --git a/components/services/storage/BUILD.gn b/components/services/storage/BUILD.gn index 9bb4f258..6bdb2c6 100644 --- a/components/services/storage/BUILD.gn +++ b/components/services/storage/BUILD.gn
@@ -173,6 +173,7 @@ "//components/test/data/storage/shared_storage.v3.iterator.sql", "//components/test/data/storage/shared_storage.v3.single_origin.sql", "//components/test/data/storage/shared_storage.v3.sql", + "//components/test/data/storage/shared_storage.v4.sql", ] outputs = [ "{{bundle_resources_dir}}/" + "{{source_root_relative_dir}}/{{source_file_part}}" ]
diff --git a/components/services/storage/shared_storage/async_shared_storage_database.h b/components/services/storage/shared_storage/async_shared_storage_database.h index 76a4dd9..b8c00de2 100644 --- a/components/services/storage/shared_storage/async_shared_storage_database.h +++ b/components/services/storage/shared_storage/async_shared_storage_database.h
@@ -22,6 +22,10 @@ class Time; } // namespace base +namespace net { +class SchemefulSite; +} // namespace net + namespace url { class Origin; } // namespace url @@ -202,19 +206,19 @@ callback) = 0; // Makes a withdrawal of `bits_debit` stamped with the current time from the - // privacy budget of `context_origin`. + // privacy budget of `context_site`. virtual void MakeBudgetWithdrawal( - url::Origin context_origin, + net::SchemefulSite context_site, double bits_debit, base::OnceCallback<void(OperationResult)> callback) = 0; // Determines the number of bits remaining in the privacy budget of - // `context_origin`, where only withdrawals within the most recent + // `context_site`, where only withdrawals within the most recent // `budget_interval_` are counted as still valid, and calls `callback` with // this information bundled with an `OperationResult` value to indicate // whether the database retrieval was successful. virtual void GetRemainingBudget( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(BudgetResult)> callback) = 0; // Calls `callback` with the most recent creation time (currently in the @@ -228,7 +232,10 @@ // `SharedStorageDatabase::GetRemainingBudget()`, and // `SharedStorageDatabase::GetCreationTime()`, then bundles this info along // with the accompanying `OperationResult`s into a struct to send to the - // DevTools `StorageHandler` via `callback`. + // DevTools `StorageHandler` via `callback`. Because DevTools displays + // shared storage data by origin, we continue to pass a `url::Origin` in as + // parameter `context_origin` and compute the site on the fly to use as + // parameter for `GetRemainingBudget()`. virtual void GetMetadata( url::Origin context_origin, base::OnceCallback<void(MetadataResult)> callback) = 0; @@ -239,9 +246,11 @@ url::Origin context_origin, base::OnceCallback<void(EntriesResult)> callback) = 0; - // Removes all budget withdrawals for `context_origin`. Calls `callback` to - // indicate whether the transaction succeeded. Intended as a convenience for - // the DevTools UX. + // Removes all budget withdrawals for `context_origin`'s site. Calls + // `callback` to indicate whether the transaction succeeded. Intended as a + // convenience for the DevTools UX. Because DevTools displays shared storage + // data by origin, we continue to pass a `url::Origin` in as parameter + // `context_origin` and compute the site on the fly. virtual void ResetBudgetForDevTools( url::Origin context_origin, base::OnceCallback<void(OperationResult)> callback) = 0;
diff --git a/components/services/storage/shared_storage/async_shared_storage_database_impl.cc b/components/services/storage/shared_storage/async_shared_storage_database_impl.cc index ca6ecc1..66090f5 100644 --- a/components/services/storage/shared_storage/async_shared_storage_database_impl.cc +++ b/components/services/storage/shared_storage/async_shared_storage_database_impl.cc
@@ -17,6 +17,7 @@ #include "base/time/time.h" #include "components/services/storage/public/mojom/storage_usage_info.mojom.h" #include "components/services/storage/shared_storage/shared_storage_options.h" +#include "net/base/schemeful_site.h" #include "storage/browser/quota/special_storage_policy.h" #include "url/origin.h" @@ -186,23 +187,23 @@ } void AsyncSharedStorageDatabaseImpl::MakeBudgetWithdrawal( - url::Origin context_origin, + net::SchemefulSite context_site, double bits_debit, base::OnceCallback<void(OperationResult)> callback) { DCHECK(callback); DCHECK(database_); database_.AsyncCall(&SharedStorageDatabase::MakeBudgetWithdrawal) - .WithArgs(std::move(context_origin), bits_debit) + .WithArgs(std::move(context_site), bits_debit) .Then(std::move(callback)); } void AsyncSharedStorageDatabaseImpl::GetRemainingBudget( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(BudgetResult)> callback) { DCHECK(callback); DCHECK(database_); database_.AsyncCall(&SharedStorageDatabase::GetRemainingBudget) - .WithArgs(std::move(context_origin)) + .WithArgs(std::move(context_site)) .Then(std::move(callback)); } @@ -309,12 +310,12 @@ } void AsyncSharedStorageDatabaseImpl::GetNumBudgetEntriesForTesting( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(int)> callback) { DCHECK(callback); DCHECK(database_); database_.AsyncCall(&SharedStorageDatabase::GetNumBudgetEntriesForTesting) - .WithArgs(std::move(context_origin)) + .WithArgs(std::move(context_site)) .Then(std::move(callback)); }
diff --git a/components/services/storage/shared_storage/async_shared_storage_database_impl.h b/components/services/storage/shared_storage/async_shared_storage_database_impl.h index 645ecbb..6e7e264 100644 --- a/components/services/storage/shared_storage/async_shared_storage_database_impl.h +++ b/components/services/storage/shared_storage/async_shared_storage_database_impl.h
@@ -116,11 +116,11 @@ base::OnceCallback<void(std::vector<mojom::StorageUsageInfoPtr>)> callback) override; void MakeBudgetWithdrawal( - url::Origin context_origin, + net::SchemefulSite context_site, double bits_debit, base::OnceCallback<void(OperationResult)> callback) override; void GetRemainingBudget( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(BudgetResult)> callback) override; void GetCreationTime(url::Origin context_origin, base::OnceCallback<void(TimeResult)> callback) override; @@ -163,9 +163,9 @@ void OverrideClockForTesting(base::Clock* clock, base::OnceClosure callback); // Calls `callback` with the number of entries (including stale entries) in - // the table `budget_mapping` for `context_origin`, or with -1 in case of + // the table `budget_mapping` for `context_site`, or with -1 in case of // database initialization failure or SQL error. - void GetNumBudgetEntriesForTesting(url::Origin context_origin, + void GetNumBudgetEntriesForTesting(net::SchemefulSite context_site, base::OnceCallback<void(int)> callback); // Calls `callback` with the total number of entries in the table for all
diff --git a/components/services/storage/shared_storage/async_shared_storage_database_impl_unittest.cc b/components/services/storage/shared_storage/async_shared_storage_database_impl_unittest.cc index e6f1e55..8768453 100644 --- a/components/services/storage/shared_storage/async_shared_storage_database_impl_unittest.cc +++ b/components/services/storage/shared_storage/async_shared_storage_database_impl_unittest.cc
@@ -292,23 +292,23 @@ RunTask(std::move(task)); } - void GetNumBudgetEntries(url::Origin context_origin, int* out_result) { + void GetNumBudgetEntries(net::SchemefulSite context_site, int* out_result) { DCHECK(out_result); DCHECK(async_database_); DCHECK(receiver_); *out_result = -1; auto callback = receiver_->MakeIntCallback( - DBOperation(Type::DB_GET_NUM_BUDGET, context_origin), out_result); - GetImpl()->GetNumBudgetEntriesForTesting(std::move(context_origin), + DBOperation(Type::DB_GET_NUM_BUDGET, context_site), out_result); + GetImpl()->GetNumBudgetEntriesForTesting(std::move(context_site), std::move(callback)); } - int GetNumBudgetEntriesSync(url::Origin context_origin) { + int GetNumBudgetEntriesSync(net::SchemefulSite context_site) { DCHECK(async_database_); base::test::TestFuture<int> future; - GetImpl()->GetNumBudgetEntriesForTesting(std::move(context_origin), + GetImpl()->GetNumBudgetEntriesForTesting(std::move(context_site), future.GetCallback()); return future.Get(); } @@ -605,7 +605,7 @@ return future.Get(); } - void MakeBudgetWithdrawal(url::Origin context_origin, + void MakeBudgetWithdrawal(net::SchemefulSite context_site, double bits_debit, OperationResult* out_result) { DCHECK(out_result); @@ -613,40 +613,41 @@ DCHECK(receiver_); auto callback = receiver_->MakeOperationResultCallback( - DBOperation(Type::DB_MAKE_BUDGET_WITHDRAWAL, context_origin, + DBOperation(Type::DB_MAKE_BUDGET_WITHDRAWAL, context_site, {base::NumberToString16(bits_debit)}), out_result); - async_database_->MakeBudgetWithdrawal(std::move(context_origin), bits_debit, + async_database_->MakeBudgetWithdrawal(std::move(context_site), bits_debit, std::move(callback)); } - OperationResult MakeBudgetWithdrawalSync(const url::Origin& context_origin, - double bits_debit) { + OperationResult MakeBudgetWithdrawalSync( + const net::SchemefulSite& context_site, + double bits_debit) { DCHECK(async_database_); base::test::TestFuture<OperationResult> future; - async_database_->MakeBudgetWithdrawal(std::move(context_origin), bits_debit, + async_database_->MakeBudgetWithdrawal(std::move(context_site), bits_debit, future.GetCallback()); return future.Get(); } - void GetRemainingBudget(url::Origin context_origin, + void GetRemainingBudget(net::SchemefulSite context_site, BudgetResult* out_result) { DCHECK(out_result); DCHECK(async_database_); DCHECK(receiver_); auto callback = receiver_->MakeBudgetResultCallback( - DBOperation(Type::DB_GET_REMAINING_BUDGET, context_origin), out_result); - async_database_->GetRemainingBudget(std::move(context_origin), + DBOperation(Type::DB_GET_REMAINING_BUDGET, context_site), out_result); + async_database_->GetRemainingBudget(std::move(context_site), std::move(callback)); } - BudgetResult GetRemainingBudgetSync(const url::Origin& context_origin) { + BudgetResult GetRemainingBudgetSync(const net::SchemefulSite& context_site) { DCHECK(async_database_); base::test::TestFuture<BudgetResult> future; - async_database_->GetRemainingBudget(std::move(context_origin), + async_database_->GetRemainingBudget(std::move(context_site), future.GetCallback()); return future.Take(); } @@ -718,8 +719,10 @@ url::Origin::Create(GURL("http://withgoogle.com")), url::Origin::Create(GURL("http://youtube.com")))); - EXPECT_DOUBLE_EQ(kBitBudget - 5.3, GetRemainingBudgetSync(abc_xyz).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(google_com).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 5.3, + GetRemainingBudgetSync(net::SchemefulSite(abc_xyz)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + GetRemainingBudgetSync(net::SchemefulSite(google_com)).bits); } class AsyncSharedStorageDatabaseImplFromFileV1NoBudgetTableTest @@ -758,8 +761,10 @@ url::Origin::Create(GURL("http://withgoogle.com")), url::Origin::Create(GURL("http://youtube.com")))); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(abc_xyz).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(google_com).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + GetRemainingBudgetSync(net::SchemefulSite(abc_xyz)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + GetRemainingBudgetSync(net::SchemefulSite(google_com)).bits); } struct InitFailureTestCase { @@ -918,37 +923,34 @@ // SQL database hasn't yet been lazy-initialized. Nevertheless, remaining // budgets should be returned as the max possible. - const url::Origin kOrigin1 = - url::Origin::Create(GURL("http://www.example1.test")); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin1).bits); - const url::Origin kOrigin2 = - url::Origin::Create(GURL("http://www.example2.test")); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); + const net::SchemefulSite kSite1(GURL("http://www.example1.test")); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite1).bits); + const net::SchemefulSite kSite2(GURL("http://www.example2.test")); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); - // A withdrawal for `kOrigin1` doesn't affect `kOrigin2`. - EXPECT_EQ(OperationResult::kSuccess, - MakeBudgetWithdrawalSync(kOrigin1, 1.75)); - EXPECT_DOUBLE_EQ(kBitBudget - 1.75, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin1)); + // A withdrawal for `kSite1` doesn't affect `kSite2`. + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 1.75)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.75, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(1, GetTotalNumBudgetEntriesSync()); - // An additional withdrawal for `kOrigin1` at or near the same time as the + // An additional withdrawal for `kSite1` at or near the same time as the // previous one is debited appropriately. - EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kOrigin1, 2.5)); + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 2.5)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(2, GetNumBudgetEntriesSync(kOrigin1)); + GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(2, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(2, GetTotalNumBudgetEntriesSync()); - // A withdrawal for `kOrigin2` doesn't affect `kOrigin1`. - EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kOrigin2, 3.4)); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kOrigin2).bits); + // A withdrawal for `kSite2` doesn't affect `kSite1`. + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite2, 3.4)); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kSite2).bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_EQ(2, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin2)); + GetRemainingBudgetSync(kSite1).bits); + EXPECT_EQ(2, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(3, GetTotalNumBudgetEntriesSync()); // Advance halfway through the lookback window. @@ -956,18 +958,18 @@ // Remaining budgets continue to take into account the withdrawals above, as // they are still within the lookback window. - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kOrigin2).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kSite2).bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - GetRemainingBudgetSync(kOrigin1).bits); + GetRemainingBudgetSync(kSite1).bits); - // An additional withdrawal for `kOrigin1` at a later time from previous ones + // An additional withdrawal for `kSite1` at a later time from previous ones // is debited appropriately. - EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kOrigin1, 1.0)); + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 1.0)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5 - 1.0, - GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(3, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin2)); + GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(3, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(4, GetTotalNumBudgetEntriesSync()); // Advance to the end of the initial lookback window, plus an additional @@ -977,19 +979,19 @@ // Now only the single debit made within the current lookback window is // counted, although the entries are still in the table because we haven't // called `PurgeStaleSync()`. - EXPECT_DOUBLE_EQ(kBitBudget - 1.0, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(3, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin2)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.0, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(3, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(4, GetTotalNumBudgetEntriesSync()); // After `PurgeStaleSync()` runs, there will only be the most // recent debit left in the budget table EXPECT_EQ(OperationResult::kSuccess, PurgeStaleSync()); - EXPECT_DOUBLE_EQ(kBitBudget - 1.0, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(0, GetNumBudgetEntriesSync(kOrigin2)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.0, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(0, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(1, GetTotalNumBudgetEntriesSync()); // Advance to where the last debit should no longer be in the lookback window. @@ -997,15 +999,15 @@ // Remaining budgets should be back at the max, although there is still an // entry in the table. - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin1)); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(1, GetTotalNumBudgetEntriesSync()); // After `PurgeStaleSync()` runs, the budget table will be empty. EXPECT_EQ(OperationResult::kSuccess, PurgeStaleSync()); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); EXPECT_EQ(0, GetTotalNumBudgetEntriesSync()); } @@ -1142,72 +1144,74 @@ OverrideClockSync(&clock_); clock_.SetNow(base::Time::Now()); - const url::Origin kOrigin1 = - url::Origin::Create(GURL("http://www.example1.test")); - const url::Origin kOrigin2 = - url::Origin::Create(GURL("http://www.example2.test")); + const net::SchemefulSite kSite1(GURL("http://www.example1.test")); + const net::SchemefulSite kSite2(GURL("http://www.example2.test")); // need to fix operations std::queue<DBOperation> operation_list; - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); - operation_list.push(DBOperation(Type::DB_MAKE_BUDGET_WITHDRAWAL, kOrigin1, - {base::NumberToString16(1.75)})); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace( + Type::DB_MAKE_BUDGET_WITHDRAWAL, kSite1, + std::vector<std::u16string>({base::NumberToString16(1.75)})); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_MAKE_BUDGET_WITHDRAWAL, kOrigin1, - {base::NumberToString16(2.5)})); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace( + Type::DB_MAKE_BUDGET_WITHDRAWAL, kSite1, + std::vector<std::u16string>({base::NumberToString16(2.5)})); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_MAKE_BUDGET_WITHDRAWAL, kOrigin2, - {base::NumberToString16(3.4)})); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace( + Type::DB_MAKE_BUDGET_WITHDRAWAL, kSite2, + std::vector<std::u16string>({base::NumberToString16(3.4)})); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); - operation_list.push(DBOperation(Type::DB_MAKE_BUDGET_WITHDRAWAL, kOrigin1, - {base::NumberToString16(1.0)})); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace( + Type::DB_MAKE_BUDGET_WITHDRAWAL, kSite1, + std::vector<std::u16string>({base::NumberToString16(1.0)})); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_PURGE_STALE)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace(Type::DB_PURGE_STALE); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_NUM_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_NUM_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); - operation_list.push(DBOperation(Type::DB_PURGE_STALE)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin1)); - operation_list.push(DBOperation(Type::DB_GET_REMAINING_BUDGET, kOrigin2)); - operation_list.push(DBOperation(Type::DB_GET_TOTAL_NUM_BUDGET)); + operation_list.emplace(Type::DB_PURGE_STALE); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite1); + operation_list.emplace(Type::DB_GET_REMAINING_BUDGET, kSite2); + operation_list.emplace(Type::DB_GET_TOTAL_NUM_BUDGET); SetExpectedOperationList(std::move(operation_list)); @@ -1218,46 +1222,46 @@ // SQL database hasn't yet been lazy-initialized. Nevertheless, remaining // budgets should be returned as the max possible. BudgetResult budget_result1 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result1); + GetRemainingBudget(kSite1, &budget_result1); BudgetResult budget_result2 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result2); + GetRemainingBudget(kSite2, &budget_result2); - // A withdrawal for `kOrigin1` doesn't affect `kOrigin2`. + // A withdrawal for `kSite1` doesn't affect `kSite2`. OperationResult operation_result1 = OperationResult::kSqlError; - MakeBudgetWithdrawal(kOrigin1, 1.75, &operation_result1); + MakeBudgetWithdrawal(kSite1, 1.75, &operation_result1); BudgetResult budget_result3 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result3); + GetRemainingBudget(kSite1, &budget_result3); BudgetResult budget_result4 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result4); + GetRemainingBudget(kSite2, &budget_result4); int num_entries1 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries1); + GetNumBudgetEntries(kSite1, &num_entries1); int total_entries2 = -1; GetTotalNumBudgetEntries(&total_entries2); - // An additional withdrawal for `kOrigin1` at or near the same time as the + // An additional withdrawal for `kSite1` at or near the same time as the // previous one is debited appropriately. OperationResult operation_result2 = OperationResult::kSqlError; - MakeBudgetWithdrawal(kOrigin1, 2.5, &operation_result2); + MakeBudgetWithdrawal(kSite1, 2.5, &operation_result2); BudgetResult budget_result5 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result5); + GetRemainingBudget(kSite1, &budget_result5); BudgetResult budget_result6 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result6); + GetRemainingBudget(kSite2, &budget_result6); int num_entries2 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries2); + GetNumBudgetEntries(kSite1, &num_entries2); int total_entries3 = -1; GetTotalNumBudgetEntries(&total_entries3); - // A withdrawal for `kOrigin2` doesn't affect `kOrigin1`. + // A withdrawal for `kSite2` doesn't affect `kSite1`. OperationResult operation_result3 = OperationResult::kSqlError; - MakeBudgetWithdrawal(kOrigin2, 3.4, &operation_result3); + MakeBudgetWithdrawal(kSite2, 3.4, &operation_result3); BudgetResult budget_result7 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result7); + GetRemainingBudget(kSite2, &budget_result7); BudgetResult budget_result8 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result8); + GetRemainingBudget(kSite1, &budget_result8); int num_entries3 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries3); + GetNumBudgetEntries(kSite1, &num_entries3); int num_entries4 = -1; - GetNumBudgetEntries(kOrigin2, &num_entries4); + GetNumBudgetEntries(kSite2, &num_entries4); int total_entries4 = -1; GetTotalNumBudgetEntries(&total_entries4); @@ -1267,22 +1271,22 @@ // Remaining budgets continue to take into account the withdrawals above, as // they are still within the lookback window. BudgetResult budget_result9 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result9); + GetRemainingBudget(kSite2, &budget_result9); BudgetResult budget_result10 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result10); + GetRemainingBudget(kSite1, &budget_result10); - // An additional withdrawal for `kOrigin1` at a later time from previous ones + // An additional withdrawal for `kSite1` at a later time from previous ones // is debited appropriately. OperationResult operation_result4 = OperationResult::kSqlError; - MakeBudgetWithdrawal(kOrigin1, 1.0, &operation_result4); + MakeBudgetWithdrawal(kSite1, 1.0, &operation_result4); BudgetResult budget_result11 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result11); + GetRemainingBudget(kSite1, &budget_result11); BudgetResult budget_result12 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result12); + GetRemainingBudget(kSite2, &budget_result12); int num_entries5 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries5); + GetNumBudgetEntries(kSite1, &num_entries5); int num_entries6 = -1; - GetNumBudgetEntries(kOrigin2, &num_entries6); + GetNumBudgetEntries(kSite2, &num_entries6); int total_entries5 = -1; GetTotalNumBudgetEntries(&total_entries5); @@ -1295,13 +1299,13 @@ // counted, although the entries are still in the table because we haven't // called `PurgeStale()`. BudgetResult budget_result13 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result13); + GetRemainingBudget(kSite1, &budget_result13); BudgetResult budget_result14 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result14); + GetRemainingBudget(kSite2, &budget_result14); int num_entries7 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries7); + GetNumBudgetEntries(kSite1, &num_entries7); int num_entries8 = -1; - GetNumBudgetEntries(kOrigin2, &num_entries8); + GetNumBudgetEntries(kSite2, &num_entries8); int total_entries6 = -1; GetTotalNumBudgetEntries(&total_entries6); @@ -1310,13 +1314,13 @@ OperationResult operation_result5 = OperationResult::kSqlError; PurgeStale(&operation_result5); BudgetResult budget_result15 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result15); + GetRemainingBudget(kSite1, &budget_result15); BudgetResult budget_result16 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result16); + GetRemainingBudget(kSite2, &budget_result16); int num_entries9 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries9); + GetNumBudgetEntries(kSite1, &num_entries9); int num_entries10 = -1; - GetNumBudgetEntries(kOrigin2, &num_entries10); + GetNumBudgetEntries(kSite2, &num_entries10); int total_entries7 = -1; GetTotalNumBudgetEntries(&total_entries7); @@ -1326,11 +1330,11 @@ // Remaining budgets should be back at the max, although there is still an // entry in the table. BudgetResult budget_result17 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result17); + GetRemainingBudget(kSite1, &budget_result17); BudgetResult budget_result18 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result18); + GetRemainingBudget(kSite2, &budget_result18); int num_entries11 = -1; - GetNumBudgetEntries(kOrigin1, &num_entries11); + GetNumBudgetEntries(kSite1, &num_entries11); int total_entries8 = -1; GetTotalNumBudgetEntries(&total_entries8); @@ -1338,9 +1342,9 @@ OperationResult operation_result6 = OperationResult::kSqlError; PurgeStale(&operation_result6); BudgetResult budget_result19 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin1, &budget_result19); + GetRemainingBudget(kSite1, &budget_result19); BudgetResult budget_result20 = MakeBudgetResultForSqlError(); - GetRemainingBudget(kOrigin2, &budget_result20); + GetRemainingBudget(kSite2, &budget_result20); int total_entries9 = -1; GetTotalNumBudgetEntries(&total_entries9); @@ -1355,14 +1359,14 @@ EXPECT_DOUBLE_EQ(kBitBudget, budget_result1.bits); EXPECT_DOUBLE_EQ(kBitBudget, budget_result2.bits); - // A withdrawal for `kOrigin1` doesn't affect `kOrigin2`. + // A withdrawal for `kSite1` doesn't affect `kSite2`. EXPECT_EQ(OperationResult::kSuccess, operation_result1); EXPECT_DOUBLE_EQ(kBitBudget - 1.75, budget_result3.bits); EXPECT_DOUBLE_EQ(kBitBudget, budget_result4.bits); EXPECT_EQ(1, num_entries1); EXPECT_EQ(1, total_entries2); - // An additional withdrawal for `kOrigin1` at or near the same time as the + // An additional withdrawal for `kSite1` at or near the same time as the // previous one is debited appropriately. EXPECT_EQ(OperationResult::kSuccess, operation_result2); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, budget_result5.bits); @@ -1370,7 +1374,7 @@ EXPECT_EQ(2, num_entries2); EXPECT_EQ(2, total_entries3); - // A withdrawal for `kOrigin2` doesn't affect `kOrigin1`. + // A withdrawal for `kSite2` doesn't affect `kSite1`. EXPECT_EQ(OperationResult::kSuccess, operation_result3); EXPECT_DOUBLE_EQ(kBitBudget - 3.4, budget_result7.bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, budget_result8.bits); @@ -1383,7 +1387,7 @@ EXPECT_DOUBLE_EQ(kBitBudget - 3.4, budget_result9.bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, budget_result10.bits); - // An additional withdrawal for `kOrigin1` at a later time from previous ones + // An additional withdrawal for `kSite1` at a later time from previous ones // is debited appropriately. EXPECT_EQ(OperationResult::kSuccess, operation_result4); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5 - 1.0, budget_result11.bits); @@ -1429,20 +1433,23 @@ url::Origin kOrigin1 = url::Origin::Create(GURL("http://www.example1.test")); std::queue<DBOperation> operation_list; - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_GET, kOrigin1, {u"key1"})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin1, - {u"key1", u"value1", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_GET, kOrigin1, {u"key1"})); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin1)); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_GET, kOrigin1, + std::vector<std::u16string>({u"key1"})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace( + Type::DB_SET, kOrigin1, + std::vector<std::u16string>( + {u"key1", u"value1", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_GET, kOrigin1, + std::vector<std::u16string>({u"key1"})); + operation_list.emplace(Type::DB_LENGTH, kOrigin1); SetExpectedOperationList(std::move(operation_list)); @@ -1498,16 +1505,18 @@ url::Origin kOrigin1 = url::Origin::Create(GURL("http://www.example1.test")); std::queue<DBOperation> operation_list; - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_DELETE, kOrigin1, {u"key1"})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push( - DBOperation(Type::DB_APPEND, kOrigin1, {u"key1", u"value1"})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_DELETE, kOrigin1, {u"key2"})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_DELETE, kOrigin1, + std::vector<std::u16string>({u"key1"})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_APPEND, kOrigin1, + std::vector<std::u16string>({u"key1", u"value1"})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_DELETE, kOrigin1, + std::vector<std::u16string>({u"key2"})); SetExpectedOperationList(std::move(operation_list)); @@ -1561,16 +1570,16 @@ url::Origin kOrigin2 = url::Origin::Create(GURL("http://www.example2.test")); std::queue<DBOperation> operation_list; - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_CLEAR, kOrigin1)); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push( - DBOperation(Type::DB_APPEND, kOrigin1, {u"key1", u"value1"})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_CLEAR, kOrigin2)); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_CLEAR, kOrigin1); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_APPEND, kOrigin1, + std::vector<std::u16string>({u"key1", u"value1"})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_CLEAR, kOrigin2); SetExpectedOperationList(std::move(operation_list)); @@ -1624,19 +1633,20 @@ url::Origin kOrigin2 = url::Origin::Create(GURL("http://www.example2.test")); std::queue<DBOperation> operation_list; - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_GET_CREATION_TIME, kOrigin1)); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin1, - {u"key1", u"value1", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); - operation_list.push(DBOperation(Type::DB_GET_CREATION_TIME, kOrigin2)); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_GET_CREATION_TIME, kOrigin1); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace( + Type::DB_SET, kOrigin1, + std::vector<std::u16string>( + {u"key1", u"value1", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); + operation_list.emplace(Type::DB_GET_CREATION_TIME, kOrigin2); SetExpectedOperationList(std::move(operation_list)); @@ -1691,123 +1701,146 @@ url::Origin kOrigin4 = url::Origin::Create(GURL("http://www.example4.test")); std::queue<DBOperation> operation_list; - operation_list.push(DBOperation(Type::DB_FETCH_ORIGINS)); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); + operation_list.emplace(Type::DB_FETCH_ORIGINS); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); - operation_list.push(DBOperation(Type::DB_PURGE_STALE)); + operation_list.emplace(Type::DB_PURGE_STALE); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin1, - {u"key1", u"value1", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_IS_OPEN)); - operation_list.push(DBOperation(Type::DB_STATUS)); + operation_list.emplace( + Type::DB_SET, kOrigin1, + std::vector<std::u16string>( + {u"key1", u"value1", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_IS_OPEN); + operation_list.emplace(Type::DB_STATUS); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin1, - {u"key2", u"value2", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin1)); + operation_list.emplace( + Type::DB_SET, kOrigin1, + std::vector<std::u16string>( + {u"key2", u"value2", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_LENGTH, kOrigin1); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin2, - {u"key1", u"value1", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin2)); + operation_list.emplace( + Type::DB_SET, kOrigin2, + std::vector<std::u16string>( + {u"key1", u"value1", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_LENGTH, kOrigin2); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin3, - {u"key1", u"value1", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin3, - {u"key2", u"value2", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin3, - {u"key3", u"value3", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin3)); + operation_list.emplace( + Type::DB_SET, kOrigin3, + std::vector<std::u16string>( + {u"key1", u"value1", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace( + Type::DB_SET, kOrigin3, + std::vector<std::u16string>( + {u"key2", u"value2", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace( + Type::DB_SET, kOrigin3, + std::vector<std::u16string>( + {u"key3", u"value3", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_LENGTH, kOrigin3); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin4, - {u"key1", u"value1", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin4, - {u"key2", u"value2", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin4, - {u"key3", u"value3", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push( - DBOperation(Type::DB_SET, kOrigin4, - {u"key4", u"value4", - TestDatabaseOperationReceiver::SerializeSetBehavior( - SetBehavior::kDefault)})); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin4)); + operation_list.emplace( + Type::DB_SET, kOrigin4, + std::vector<std::u16string>( + {u"key1", u"value1", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace( + Type::DB_SET, kOrigin4, + std::vector<std::u16string>( + {u"key2", u"value2", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace( + Type::DB_SET, kOrigin4, + std::vector<std::u16string>( + {u"key3", u"value3", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace( + Type::DB_SET, kOrigin4, + std::vector<std::u16string>( + {u"key4", u"value4", + TestDatabaseOperationReceiver::SerializeSetBehavior( + SetBehavior::kDefault)})); + operation_list.emplace(Type::DB_LENGTH, kOrigin4); - operation_list.push(DBOperation(Type::DB_FETCH_ORIGINS)); + operation_list.emplace(Type::DB_FETCH_ORIGINS); base::Time override_time = base::Time::Now() - base::Days(kStalenessThresholdDays + 1); - operation_list.push(DBOperation( + operation_list.emplace( Type::DB_OVERRIDE_TIME_ENTRY, kOrigin1, - {u"key1", TestDatabaseOperationReceiver::SerializeTime(override_time)})); + std::vector<std::u16string>( + {u"key1", + TestDatabaseOperationReceiver::SerializeTime(override_time)})); - operation_list.push(DBOperation(Type::DB_PURGE_STALE)); + operation_list.emplace(Type::DB_PURGE_STALE); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin1)); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin2)); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin3)); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin4)); - operation_list.push(DBOperation(Type::DB_FETCH_ORIGINS)); + operation_list.emplace(Type::DB_LENGTH, kOrigin1); + operation_list.emplace(Type::DB_LENGTH, kOrigin2); + operation_list.emplace(Type::DB_LENGTH, kOrigin3); + operation_list.emplace(Type::DB_LENGTH, kOrigin4); + operation_list.emplace(Type::DB_FETCH_ORIGINS); - operation_list.push(DBOperation( + operation_list.emplace( Type::DB_OVERRIDE_TIME_ORIGIN, kOrigin3, - {TestDatabaseOperationReceiver::SerializeTime(override_time)})); - operation_list.push(DBOperation(Type::DB_GET_CREATION_TIME, kOrigin3)); - operation_list.push(DBOperation( + std::vector<std::u16string>( + {TestDatabaseOperationReceiver::SerializeTime(override_time)})); + operation_list.emplace(Type::DB_GET_CREATION_TIME, kOrigin3); + operation_list.emplace( Type::DB_OVERRIDE_TIME_ENTRY, kOrigin3, - {u"key1", TestDatabaseOperationReceiver::SerializeTime(override_time)})); - operation_list.push(DBOperation( + std::vector<std::u16string>( + {u"key1", + TestDatabaseOperationReceiver::SerializeTime(override_time)})); + operation_list.emplace( Type::DB_OVERRIDE_TIME_ENTRY, kOrigin3, - {u"key2", TestDatabaseOperationReceiver::SerializeTime(override_time)})); - operation_list.push(DBOperation( + std::vector<std::u16string>( + {u"key2", + TestDatabaseOperationReceiver::SerializeTime(override_time)})); + operation_list.emplace( Type::DB_OVERRIDE_TIME_ENTRY, kOrigin3, - {u"key3", TestDatabaseOperationReceiver::SerializeTime(override_time)})); - operation_list.push(DBOperation( + std::vector<std::u16string>( + {u"key3", + TestDatabaseOperationReceiver::SerializeTime(override_time)})); + operation_list.emplace( Type::DB_OVERRIDE_TIME_ENTRY, kOrigin1, - {u"key2", TestDatabaseOperationReceiver::SerializeTime(override_time)})); - operation_list.push(DBOperation(Type::DB_PURGE_STALE)); + std::vector<std::u16string>( + {u"key2", + TestDatabaseOperationReceiver::SerializeTime(override_time)})); + operation_list.emplace(Type::DB_PURGE_STALE); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin1)); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin2)); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin3)); - operation_list.push(DBOperation(Type::DB_LENGTH, kOrigin4)); + operation_list.emplace(Type::DB_LENGTH, kOrigin1); + operation_list.emplace(Type::DB_LENGTH, kOrigin2); + operation_list.emplace(Type::DB_LENGTH, kOrigin3); + operation_list.emplace(Type::DB_LENGTH, kOrigin4); - operation_list.push(DBOperation(Type::DB_TRIM_MEMORY)); - operation_list.push(DBOperation(Type::DB_FETCH_ORIGINS)); + operation_list.emplace(Type::DB_TRIM_MEMORY); + operation_list.emplace(Type::DB_FETCH_ORIGINS); TestSharedStorageEntriesListenerUtility listener_utility( task_environment_.GetMainThreadTaskRunner()); size_t id1 = listener_utility.RegisterListener(); - operation_list.push( - DBOperation(Type::DB_ENTRIES, kOrigin2, {base::NumberToString16(id1)})); + operation_list.emplace( + Type::DB_ENTRIES, kOrigin2, + std::vector<std::u16string>({base::NumberToString16(id1)})); size_t id2 = listener_utility.RegisterListener(); - operation_list.push( - DBOperation(Type::DB_ENTRIES, kOrigin4, {base::NumberToString16(id2)})); + operation_list.emplace( + Type::DB_ENTRIES, kOrigin4, + std::vector<std::u16string>({base::NumberToString16(id2)})); SetExpectedOperationList(std::move(operation_list));
diff --git a/components/services/storage/shared_storage/shared_storage_database.cc b/components/services/storage/shared_storage/shared_storage_database.cc index 9181efa..5b5584f1 100644 --- a/components/services/storage/shared_storage/shared_storage_database.cc +++ b/components/services/storage/shared_storage/shared_storage_database.cc
@@ -22,6 +22,7 @@ #include "components/services/storage/shared_storage/shared_storage_database_migrations.h" #include "components/services/storage/shared_storage/shared_storage_options.h" #include "mojo/public/cpp/bindings/remote.h" +#include "net/base/schemeful_site.h" #include "sql/database.h" #include "sql/error_delegate_util.h" #include "sql/statement.h" @@ -54,11 +55,16 @@ // prevent roundtrip conversion to UTF-8 and back, which is // lossy if the original UTF-16 string contains unpaired // surrogates -const int SharedStorageDatabase::kCurrentVersionNumber = 3; +// Version 4 - https://crrev.com/c/4879582 +// * rename `context_origin` column in `budget_mapping` to +// `context_site`, converting existing data in this column from +// origins to sites + +const int SharedStorageDatabase::kCurrentVersionNumber = 4; // Earliest version which can use a `kCurrentVersionNumber` database // without failing. -const int SharedStorageDatabase::kCompatibleVersionNumber = 3; +const int SharedStorageDatabase::kCompatibleVersionNumber = 4; // Latest version of the database that cannot be upgraded to // `kCurrentVersionNumber` without razing the database. @@ -66,12 +72,18 @@ namespace { -[[nodiscard]] std::string SerializeOrigin(const url::Origin& origin) { +std::string SerializeOrigin(const url::Origin& origin) { DCHECK(!origin.opaque()); DCHECK_NE(url::kFileScheme, origin.scheme()); return origin.Serialize(); } +std::string SerializeSite(const net::SchemefulSite& site) { + DCHECK(!site.opaque()); + DCHECK_NE(url::kFileScheme, site.GetURL().scheme()); + return site.Serialize(); +} + [[nodiscard]] bool InitSchema(sql::Database& db, sql::MetaTable& meta_table) { static constexpr char kValuesMappingSql[] = "CREATE TABLE IF NOT EXISTS values_mapping(" @@ -97,17 +109,20 @@ static constexpr char kBudgetMappingSql[] = "CREATE TABLE IF NOT EXISTS budget_mapping(" "id INTEGER NOT NULL PRIMARY KEY," - "context_origin TEXT NOT NULL," + "context_site TEXT NOT NULL," "time_stamp INTEGER NOT NULL," "bits_debit REAL NOT NULL)"; if (!db.Execute(kBudgetMappingSql)) return false; - static constexpr char kOriginTimeIndexSql[] = - "CREATE INDEX IF NOT EXISTS budget_mapping_origin_time_stamp_idx " - "ON budget_mapping(context_origin,time_stamp)"; - if (!db.Execute(kOriginTimeIndexSql)) - return false; + if (meta_table.GetVersionNumber() >= 4) { + static constexpr char kSiteTimeIndexSql[] = + "CREATE INDEX IF NOT EXISTS budget_mapping_site_time_stamp_idx " + "ON budget_mapping(context_site,time_stamp)"; + if (!db.Execute(kSiteTimeIndexSql)) { + return false; + } + } if (meta_table.GetVersionNumber() >= 2) { static constexpr char kValuesLastUsedTimeIndexSql[] = @@ -428,8 +443,9 @@ return OperationResult::kInitFailure; } - if (!Purge(SerializeOrigin(context_origin))) + if (!Purge(SerializeOrigin(context_origin))) { return OperationResult::kSqlError; + } return OperationResult::kSuccess; } @@ -848,7 +864,7 @@ } SharedStorageDatabase::OperationResult -SharedStorageDatabase::MakeBudgetWithdrawal(url::Origin context_origin, +SharedStorageDatabase::MakeBudgetWithdrawal(net::SchemefulSite context_site, double bits_debit) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK_GT(bits_debit, 0.0); @@ -857,11 +873,11 @@ return OperationResult::kInitFailure; static constexpr char kInsertSql[] = - "INSERT INTO budget_mapping(context_origin,time_stamp,bits_debit)" + "INSERT INTO budget_mapping(context_site,time_stamp,bits_debit)" "VALUES(?,?,?)"; sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, kInsertSql)); - statement.BindString(0, SerializeOrigin(context_origin)); + statement.BindString(0, SerializeSite(context_site)); statement.BindTime(1, clock_->Now()); statement.BindDouble(2, bits_debit); @@ -871,7 +887,7 @@ } SharedStorageDatabase::BudgetResult SharedStorageDatabase::GetRemainingBudget( - url::Origin context_origin) { + net::SchemefulSite context_site) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (LazyInit(DBCreationPolicy::kIgnoreIfAbsent) != InitStatus::kSuccess) { @@ -885,10 +901,10 @@ static constexpr char kSelectSql[] = "SELECT SUM(bits_debit) FROM budget_mapping " - "WHERE context_origin=? AND time_stamp>=?"; + "WHERE context_site=? AND time_stamp>=?"; sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, kSelectSql)); - statement.BindString(0, SerializeOrigin(context_origin)); + statement.BindString(0, SerializeSite(context_site)); statement.BindTime(1, clock_->Now() - budget_interval_); double total_debits = 0.0; @@ -934,7 +950,8 @@ if (time_result.result == OperationResult::kSuccess) metadata.creation_time = time_result.time; - BudgetResult budget_result = GetRemainingBudget(context_origin); + BudgetResult budget_result = + GetRemainingBudget(net::SchemefulSite(context_origin)); metadata.budget_result = budget_result.result; if (budget_result.result == OperationResult::kSuccess) metadata.remaining_budget = budget_result.bits; @@ -1005,10 +1022,10 @@ } static constexpr char kDeleteSql[] = - "DELETE FROM budget_mapping WHERE context_origin=?"; + "DELETE FROM budget_mapping WHERE context_site=?"; sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, kDeleteSql)); - statement.BindString(0, SerializeOrigin(context_origin)); + statement.BindString(0, SerializeSite(net::SchemefulSite(context_origin))); if (!statement.Run()) { return OperationResult::kSqlError; @@ -1094,7 +1111,7 @@ } int64_t SharedStorageDatabase::GetNumBudgetEntriesForTesting( - url::Origin context_origin) { + net::SchemefulSite context_site) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (LazyInit(DBCreationPolicy::kIgnoreIfAbsent) != InitStatus::kSuccess) { @@ -1108,10 +1125,10 @@ static constexpr char kSelectSql[] = "SELECT COUNT(*) FROM budget_mapping " - "WHERE context_origin=?"; + "WHERE context_site=?"; sql::Statement statement(db_.GetCachedStatement(SQL_FROM_HERE, kSelectSql)); - statement.BindString(0, SerializeOrigin(context_origin)); + statement.BindString(0, SerializeSite(context_site)); if (statement.Step()) return statement.ColumnInt64(0);
diff --git a/components/services/storage/shared_storage/shared_storage_database.h b/components/services/storage/shared_storage/shared_storage_database.h index f0c2c947..69e9c50c 100644 --- a/components/services/storage/shared_storage/shared_storage_database.h +++ b/components/services/storage/shared_storage/shared_storage_database.h
@@ -34,6 +34,10 @@ class TimeDelta; } // namespace base +namespace net { +class SchemefulSite; +} // namespace net + namespace sql { class Statement; } // namespace sql @@ -341,31 +345,38 @@ [[nodiscard]] std::vector<mojom::StorageUsageInfoPtr> FetchOrigins(); // Makes a withdrawal of `bits_debit` stamped with the current time from the - // privacy budget of `context_origin`. - [[nodiscard]] OperationResult MakeBudgetWithdrawal(url::Origin context_origin, - double bits_debit); + // privacy budget of `context_site`. + [[nodiscard]] OperationResult MakeBudgetWithdrawal( + net::SchemefulSite context_site, + double bits_debit); // Determines the number of bits remaining in the privacy budget of - // `context_origin`, where only withdrawals within the most recent + // `context_site`, where only withdrawals within the most recent // `budget_interval_` are counted as still valid, and returns this information // bundled with an `OperationResult` value to indicate whether the database // retrieval was successful. - [[nodiscard]] BudgetResult GetRemainingBudget(url::Origin context_origin); + [[nodiscard]] BudgetResult GetRemainingBudget( + net::SchemefulSite context_site); // Retrieves the most recent `creation_time` for `context_origin`. [[nodiscard]] TimeResult GetCreationTime(url::Origin context_origin); // Calls `Length()`, `GetRemainingBudget()`, and `GetCreationTime()`, then // bundles this info along with the accompanying `OperationResult`s into a - // struct to send to the DevTools `StorageHandler`. + // struct to send to the DevTools `StorageHandler`. Because DevTools displays + // shared storage data by origin, we continue to pass a `url::Origin` in as + // parameter `context_origin` and compute the site on the fly to use as + // parameter for `GetRemainingBudget()`. [[nodiscard]] MetadataResult GetMetadata(url::Origin context_origin); // Returns an origin's entries in a vector bundled with an `OperationResult`. // To only be used by DevTools. [[nodiscard]] EntriesResult GetEntriesForDevTools(url::Origin context_origin); - // Removes all budget withdrawals for `context_origin`. Intended as a - // convenience for the DevTools UX. + // Removes all budget withdrawals for `context_origin`'s site. Intended as a + // convenience for the DevTools UX. Because DevTools displays shared storage + // data by origin, we continue to pass a `url::Origin` in as parameter + // `context_origin` and compute the site on the fly. [[nodiscard]] OperationResult ResetBudgetForDevTools( url::Origin context_origin); @@ -395,10 +406,10 @@ scoped_refptr<storage::SpecialStoragePolicy> special_storage_policy); // Gets the number of entries (including stale entries) in the table - // `budget_mapping` for `context_origin`. Returns -1 in case of database + // `budget_mapping` for `context_site`. Returns -1 in case of database // initialization failure or SQL error. [[nodiscard]] int64_t GetNumBudgetEntriesForTesting( - url::Origin context_origin); + net::SchemefulSite context_site); // Returns the total number of entries in the table for all origins, or -1 in // case of database initialization failure or SQL error.
diff --git a/components/services/storage/shared_storage/shared_storage_database_migrations.cc b/components/services/storage/shared_storage/shared_storage_database_migrations.cc index 90cdf43..c8aee23 100644 --- a/components/services/storage/shared_storage/shared_storage_database_migrations.cc +++ b/components/services/storage/shared_storage/shared_storage_database_migrations.cc
@@ -4,15 +4,115 @@ #include "components/services/storage/shared_storage/shared_storage_database_migrations.h" +#include "net/base/schemeful_site.h" #include "sql/database.h" #include "sql/meta_table.h" #include "sql/statement.h" #include "sql/transaction.h" +#include "url/gurl.h" namespace storage { namespace { +bool MigrateToVersion4(sql::Database& db, sql::MetaTable& meta_table) { + static constexpr char kCreateNewIndexSql[] = + "CREATE INDEX IF NOT EXISTS budget_mapping_site_time_stamp_idx " + "ON budget_mapping(context_site,time_stamp)"; + + if (db.DoesColumnExist("budget_mapping", "context_site")) { + // This situation can occur if we migrate a Version 1 database without the + // `budget_mapping` table (since we added this table without doing a + // database migration). + CHECK(!db.DoesColumnExist("budget_mapping", "context_origin")); + CHECK(!db.DoesIndexExist("budget_mapping_origin_time_stamp_idx")); + + sql::Transaction transaction(&db); + if (!transaction.Begin()) { + return false; + } + + if (!db.Execute(kCreateNewIndexSql)) { + return false; + } + + return meta_table.SetVersionNumber(4) && transaction.Commit(); + } + + CHECK(db.DoesColumnExist("budget_mapping", "context_origin")); + + sql::Transaction transaction(&db); + if (!transaction.Begin()) { + return false; + } + + static constexpr char kNewBudgetMappingSql[] = + "CREATE TABLE new_budget_mapping(" + "id INTEGER NOT NULL PRIMARY KEY," + "context_site TEXT NOT NULL," + "time_stamp INTEGER NOT NULL," + "bits_debit REAL NOT NULL)"; + if (!db.Execute(kNewBudgetMappingSql)) { + return false; + } + + static constexpr char kSelectPreviousBudgetSql[] = + "SELECT id,context_origin,time_stamp,bits_debit FROM budget_mapping"; + static constexpr char kInsertIntoNewBudgetSql[] = + "INSERT INTO new_budget_mapping(id, context_site, time_stamp, " + "bits_debit) VALUES(?,?,?,?)"; + + sql::Statement select_statement( + db.GetCachedStatement(SQL_FROM_HERE, kSelectPreviousBudgetSql)); + + while (select_statement.Step()) { + net::SchemefulSite context_site = + net::SchemefulSite::Deserialize(select_statement.ColumnString(1)); + if (context_site.opaque() || + context_site.GetURL().scheme() == url::kFileScheme) { + continue; + } + + sql::Statement insert_statement( + db.GetCachedStatement(SQL_FROM_HERE, kInsertIntoNewBudgetSql)); + insert_statement.BindInt64(0, select_statement.ColumnInt64(0)); + insert_statement.BindString(1, context_site.Serialize()); + insert_statement.BindTime(2, select_statement.ColumnTime(2)); + insert_statement.BindDouble(3, select_statement.ColumnDouble(3)); + + if (!insert_statement.Run()) { + return false; + } + } + + if (!select_statement.Succeeded()) { + return false; + } + + static constexpr char kDropOldIndexSql[] = + "DROP INDEX IF EXISTS budget_mapping_origin_time_stamp_idx"; + if (!db.Execute(kDropOldIndexSql)) { + return false; + } + + static constexpr char kDropOldBudgetSql[] = "DROP TABLE budget_mapping"; + if (!db.Execute(kDropOldBudgetSql)) { + return false; + } + + static constexpr char kRenameBudgetMapSql[] = + "ALTER TABLE new_budget_mapping RENAME TO budget_mapping"; + if (!db.Execute(kRenameBudgetMapSql)) { + return false; + } + + if (!db.Execute(kCreateNewIndexSql)) { + return false; + } + + return meta_table.SetVersionNumber(4) && transaction.Commit(); +} + bool MigrateToVersion3(sql::Database& db, sql::MetaTable& meta_table) { sql::Transaction transaction(&db); if (!transaction.Begin()) { @@ -159,6 +259,10 @@ !MigrateToVersion3(db, meta_table)) { return false; } + if (meta_table.GetVersionNumber() == 3 && + !MigrateToVersion4(db, meta_table)) { + return false; + } return true; }
diff --git a/components/services/storage/shared_storage/shared_storage_database_migrations_unittest.cc b/components/services/storage/shared_storage/shared_storage_database_migrations_unittest.cc index b66996d1..0de6ecdf 100644 --- a/components/services/storage/shared_storage/shared_storage_database_migrations_unittest.cc +++ b/components/services/storage/shared_storage/shared_storage_database_migrations_unittest.cc
@@ -5,6 +5,7 @@ #include "components/services/storage/shared_storage/shared_storage_database_migrations.h" #include <memory> +#include <tuple> #include <vector> #include "base/files/file_path.h" @@ -230,6 +231,80 @@ } } +TEST_F(SharedStorageDatabaseMigrationsTest, MigrateVersion3ToCurrent) { + ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, GetTestFileNameForVersion(3))); + std::map<int64_t, std::tuple<url::Origin, base::Time, double>> + premigration_values; + + // Verify pre-conditions. + { + sql::Database db; + ASSERT_TRUE(db.Open(file_name_)); + + // `id`, `context_origin`, `time_stamp`, and `bits_debit`. + EXPECT_EQ(4u, sql::test::CountTableColumns(&db, "budget_mapping")); + + // Implicit index on `meta`, `per_origin_mapping_last_used_time_idx`, + // `budget_mapping_origin_time_stamp_idx`, and + // `values_mapping_last_used_time_idx`. + EXPECT_EQ(4u, sql::test::CountSQLIndices(&db)); + + ASSERT_TRUE(db.DoesColumnExist("budget_mapping", "context_origin")); + ASSERT_FALSE(db.DoesColumnExist("budget_mapping", "context_site")); + + sql::Statement select_statement( + db.GetUniqueStatement("SELECT * FROM budget_mapping")); + + while (select_statement.Step()) { + premigration_values[select_statement.ColumnInt64(0)] = std::make_tuple( + url::Origin::Create(GURL(select_statement.ColumnString(1))), + select_statement.ColumnTime(2), select_statement.ColumnDouble(3)); + } + } + + MigrateDatabase(); + + // Verify schema is current. + { + sql::Database db; + ASSERT_TRUE(db.Open(file_name_)); + + // Check version. + EXPECT_EQ(SharedStorageDatabase::kCurrentVersionNumber, + VersionFromDatabase(db)); + + // Compare without quotes as sometimes migrations cause table names to be + // string literals. + EXPECT_EQ(RemoveQuotes(GetCurrentSchema()), RemoveQuotes(db.GetSchema())); + + ASSERT_TRUE(db.DoesColumnExist("budget_mapping", "context_site")); + ASSERT_FALSE(db.DoesColumnExist("budget_mapping", "context_origin")); + + // Verify that data is preserved across the migration. + sql::Statement count_statement( + db.GetUniqueStatement("SELECT COUNT(*) FROM budget_mapping")); + + ASSERT_TRUE(count_statement.Step()); + ASSERT_LT(0, count_statement.ColumnInt(0)); + + // Verify that each `context_site` in `budget_mapping` is the site for the + // previously stored `context_origin`. + sql::Statement select_statement( + db.GetUniqueStatement("SELECT * FROM budget_mapping")); + + while (select_statement.Step()) { + auto id_it = premigration_values.find(select_statement.ColumnInt64(0)); + ASSERT_TRUE(id_it != premigration_values.end()); + + EXPECT_EQ( + net::SchemefulSite::Deserialize(select_statement.ColumnString(1)), + net::SchemefulSite(std::get<0>(id_it->second))); + EXPECT_EQ(std::get<1>(id_it->second), select_statement.ColumnTime(2)); + EXPECT_EQ(std::get<2>(id_it->second), select_statement.ColumnDouble(3)); + } + } +} + TEST_F(SharedStorageDatabaseMigrationsTest, MigrateVersion2ToCurrent) { ASSERT_TRUE(CreateDatabaseFromSQL(file_name_, GetTestFileNameForVersion(2))); std::map<std::string,
diff --git a/components/services/storage/shared_storage/shared_storage_database_unittest.cc b/components/services/storage/shared_storage/shared_storage_database_unittest.cc index 548f49b6..43586a0c 100644 --- a/components/services/storage/shared_storage/shared_storage_database_unittest.cc +++ b/components/services/storage/shared_storage/shared_storage_database_unittest.cc
@@ -240,17 +240,29 @@ google_org, grow_with_google_com, gv_com, waymo_com, withgoogle_com, youtube_com)); - EXPECT_DOUBLE_EQ(kBitBudget - 5.3, db_->GetRemainingBudget(abc_xyz).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(chromium_org).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(google_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 4.0, db_->GetRemainingBudget(google_org).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 1.2, - db_->GetRemainingBudget(grow_with_google_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(gv_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 4.2, db_->GetRemainingBudget(waymo_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 1.0, - db_->GetRemainingBudget(withgoogle_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(youtube_com).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 5.3, + db_->GetRemainingBudget(net::SchemefulSite(abc_xyz)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(chromium_org)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, db_->GetRemainingBudget(net::SchemefulSite(google_com)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget - 4.0, + db_->GetRemainingBudget(net::SchemefulSite(google_org)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget - 1.2, + db_->GetRemainingBudget(net::SchemefulSite(grow_with_google_com)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(gv_com)).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 4.2, + db_->GetRemainingBudget(net::SchemefulSite(waymo_com)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget - 1.0, + db_->GetRemainingBudget(net::SchemefulSite(withgoogle_com)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(youtube_com)).bits); EXPECT_EQ(13266954476192362, db_->GetCreationTime(google_com) .time.ToDeltaSinceWindowsEpoch() @@ -366,16 +378,28 @@ google_org, grow_with_google_com, gv_com, waymo_com, withgoogle_com, youtube_com)); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(abc_xyz).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(chromium_org).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(google_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(google_org).bits); EXPECT_DOUBLE_EQ(kBitBudget, - db_->GetRemainingBudget(grow_with_google_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(gv_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(waymo_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(withgoogle_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(youtube_com).bits); + db_->GetRemainingBudget(net::SchemefulSite(abc_xyz)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(chromium_org)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, db_->GetRemainingBudget(net::SchemefulSite(google_com)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, db_->GetRemainingBudget(net::SchemefulSite(google_org)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(grow_with_google_com)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(gv_com)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(waymo_com)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(withgoogle_com)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + db_->GetRemainingBudget(net::SchemefulSite(youtube_com)).bits); histogram_tester_.ExpectUniqueSample(kIsFileBackedHistogram, true, 1); histogram_tester_.ExpectTotalCount(kFileSizeKBHistogram, 1); @@ -1052,39 +1076,34 @@ // SQL database hasn't yet been lazy-initialized. Nevertheless, remaining // budgets should be returned as the max possible. - const url::Origin kOrigin1 = - url::Origin::Create(GURL("http://www.example1.test")); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin1).bits); - const url::Origin kOrigin2 = - url::Origin::Create(GURL("http://www.example2.test")); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); + const net::SchemefulSite kSite1(GURL("http://www.example1.test")); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite1).bits); + const net::SchemefulSite kSite2(GURL("http://www.example2.test")); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); - // A withdrawal for `kOrigin1` doesn't affect `kOrigin2`. - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin1, 1.75)); - EXPECT_DOUBLE_EQ(kBitBudget - 1.75, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); + // A withdrawal for `kSite1` doesn't affect `kSite2`. + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite1, 1.75)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.75, db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite1)); EXPECT_EQ(1L, db_->GetTotalNumBudgetEntriesForTesting()); - // An additional withdrawal for `kOrigin1` at or near the same time as the + // An additional withdrawal for `kSite1` at or near the same time as the // previous one is debited appropriately. - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin1, 2.5)); + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite1, 2.5)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(2L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); + db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(2L, db_->GetNumBudgetEntriesForTesting(kSite1)); EXPECT_EQ(2L, db_->GetTotalNumBudgetEntriesForTesting()); - // A withdrawal for `kOrigin2` doesn't affect `kOrigin1`. - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin2, 3.4)); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kOrigin2).bits); + // A withdrawal for `kSite2` doesn't affect `kSite1`. + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite2, 3.4)); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kSite2).bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_EQ(2L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin2)); + db_->GetRemainingBudget(kSite1).bits); + EXPECT_EQ(2L, db_->GetNumBudgetEntriesForTesting(kSite1)); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite2)); EXPECT_EQ(3L, db_->GetTotalNumBudgetEntriesForTesting()); // Advance halfway through the lookback window. @@ -1092,19 +1111,18 @@ // Remaining budgets continue to take into account the withdrawals above, as // they are still within the lookback window. - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kOrigin2).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kSite2).bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - db_->GetRemainingBudget(kOrigin1).bits); + db_->GetRemainingBudget(kSite1).bits); - // An additional withdrawal for `kOrigin1` at a later time from previous ones + // An additional withdrawal for `kSite1` at a later time from previous ones // is debited appropriately. - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin1, 1.0)); + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite1, 1.0)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5 - 1.0, - db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(3L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin2)); + db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(3L, db_->GetNumBudgetEntriesForTesting(kSite1)); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite2)); EXPECT_EQ(4L, db_->GetTotalNumBudgetEntriesForTesting()); // Advance to the end of the initial lookback window, plus an additional @@ -1114,19 +1132,19 @@ // Now only the single debit made within the current lookback window is // counted, although the entries are still in the table because we haven't // called `PurgeStale()`. - EXPECT_DOUBLE_EQ(kBitBudget - 1.0, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(3L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin2)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.0, db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(3L, db_->GetNumBudgetEntriesForTesting(kSite1)); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite2)); EXPECT_EQ(4L, db_->GetTotalNumBudgetEntriesForTesting()); // After `PurgeStale()` runs, there will only be the most recent // debit left in the budget table. EXPECT_EQ(OperationResult::kSuccess, db_->PurgeStale()); - EXPECT_DOUBLE_EQ(kBitBudget - 1.0, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); - EXPECT_EQ(0L, db_->GetNumBudgetEntriesForTesting(kOrigin2)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.0, db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite1)); + EXPECT_EQ(0L, db_->GetNumBudgetEntriesForTesting(kSite2)); EXPECT_EQ(1L, db_->GetTotalNumBudgetEntriesForTesting()); // Advance to where the last debit should no longer be in the lookback window. @@ -1134,15 +1152,15 @@ // Remaining budgets should be back at the max, although there is still an // entry in the table. - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite1)); EXPECT_EQ(1L, db_->GetTotalNumBudgetEntriesForTesting()); // After `PurgeStale()` runs, the budget table will be empty. EXPECT_EQ(OperationResult::kSuccess, db_->PurgeStale()); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); EXPECT_EQ(0L, db_->GetTotalNumBudgetEntriesForTesting()); } @@ -1154,47 +1172,49 @@ // budgets should be returned as the max possible. const url::Origin kOrigin1 = url::Origin::Create(GURL("http://www.example1.test")); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin1).bits); + const net::SchemefulSite kSite1(kOrigin1); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite1).bits); const url::Origin kOrigin2 = url::Origin::Create(GURL("http://www.example2.test")); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin2).bits); + const net::SchemefulSite kSite2(kOrigin2); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite2).bits); + + // `kSite1` and `kSite2` are distinct. + ASSERT_NE(kSite1, kSite2); // Resetting a budget in an empty uninitialized database causes no error. EXPECT_EQ(OperationResult::kSuccess, db_->ResetBudgetForDevTools(kOrigin1)); // Making withdrawals will initialize the database. - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin1, 1.75)); - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin1, 2.5)); + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite1, 1.75)); + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite1, 2.5)); // Advance halfway through the lookback window to separate withdrawal times. clock_.Advance(base::Hours(kBudgetIntervalHours) / 2); - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin1, 1.0)); - EXPECT_EQ(OperationResult::kSuccess, - db_->MakeBudgetWithdrawal(kOrigin2, 3.4)); + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite1, 1.0)); + EXPECT_EQ(OperationResult::kSuccess, db_->MakeBudgetWithdrawal(kSite2, 3.4)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5 - 1.0, - db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(3L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin2)); + db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(3L, db_->GetNumBudgetEntriesForTesting(kSite1)); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite2)); EXPECT_EQ(4L, db_->GetTotalNumBudgetEntriesForTesting()); - // Resetting `kOrigin1`'s budget doesn't affect `kOrigin2`'s budget. + // Resetting `kOrigin1`'s budget doesn't affect `kOrigin2`'s budget because + // they correspond to distinct sites `kSite1` and `kSite2`, respetively. EXPECT_EQ(OperationResult::kSuccess, db_->ResetBudgetForDevTools(kOrigin1)); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kOrigin2).bits); - EXPECT_EQ(0L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); - EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kOrigin2)); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, db_->GetRemainingBudget(kSite2).bits); + EXPECT_EQ(0L, db_->GetNumBudgetEntriesForTesting(kSite1)); + EXPECT_EQ(1L, db_->GetNumBudgetEntriesForTesting(kSite2)); EXPECT_EQ(1L, db_->GetTotalNumBudgetEntriesForTesting()); // Resetting an already reset budget causes no error. EXPECT_EQ(OperationResult::kSuccess, db_->ResetBudgetForDevTools(kOrigin1)); - EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kOrigin1).bits); - EXPECT_EQ(0L, db_->GetNumBudgetEntriesForTesting(kOrigin1)); + EXPECT_DOUBLE_EQ(kBitBudget, db_->GetRemainingBudget(kSite1).bits); + EXPECT_EQ(0L, db_->GetNumBudgetEntriesForTesting(kSite1)); // Resetting budget for a nonexistent origin causes no error. EXPECT_EQ(OperationResult::kSuccess,
diff --git a/components/services/storage/shared_storage/shared_storage_manager.cc b/components/services/storage/shared_storage/shared_storage_manager.cc index d025ae6..4eeba099 100644 --- a/components/services/storage/shared_storage/shared_storage_manager.cc +++ b/components/services/storage/shared_storage/shared_storage_manager.cc
@@ -13,6 +13,7 @@ #include "components/services/storage/public/mojom/storage_usage_info.mojom.h" #include "components/services/storage/shared_storage/async_shared_storage_database_impl.h" #include "components/services/storage/shared_storage/shared_storage_options.h" +#include "net/base/schemeful_site.h" #include "storage/browser/quota/special_storage_policy.h" #include "url/gurl.h" @@ -214,18 +215,18 @@ } void SharedStorageManager::MakeBudgetWithdrawal( - url::Origin context_origin, + net::SchemefulSite context_site, double bits_debit, base::OnceCallback<void(OperationResult)> callback) { DCHECK(callback); DCHECK(database_); database_->MakeBudgetWithdrawal( - std::move(context_origin), bits_debit, + std::move(context_site), bits_debit, GetOperationResultCallback(std::move(callback))); } void SharedStorageManager::GetRemainingBudget( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(BudgetResult)> callback) { DCHECK(callback); DCHECK(database_); @@ -238,7 +239,7 @@ }, weak_ptr_factory_.GetWeakPtr(), std::move(callback)); - database_->GetRemainingBudget(std::move(context_origin), + database_->GetRemainingBudget(std::move(context_site), std::move(new_callback)); } @@ -362,7 +363,7 @@ } void SharedStorageManager::GetNumBudgetEntriesForTesting( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(int)> callback) { DCHECK(callback); DCHECK(database_); @@ -380,7 +381,7 @@ static_cast<AsyncSharedStorageDatabaseImpl*>(database_.get()) ->GetNumBudgetEntriesForTesting( // IN-TEST - std::move(context_origin), std::move(new_callback)); + std::move(context_site), std::move(new_callback)); } void SharedStorageManager::GetTotalNumBudgetEntriesForTesting(
diff --git a/components/services/storage/shared_storage/shared_storage_manager.h b/components/services/storage/shared_storage/shared_storage_manager.h index e1b0354..fbd7c0c 100644 --- a/components/services/storage/shared_storage/shared_storage_manager.h +++ b/components/services/storage/shared_storage/shared_storage_manager.h
@@ -26,6 +26,10 @@ class Time; } // namespace base +namespace net { +class SchemefulSite; +} // namespace net + namespace storage { class AsyncSharedStorageDatabase; struct SharedStorageOptions; @@ -218,17 +222,17 @@ callback); // Makes a withdrawal of `bits_debit` stamped with the current time from the - // privacy budget of `context_origin`. - void MakeBudgetWithdrawal(url::Origin context_origin, + // privacy budget of `context_site`. + void MakeBudgetWithdrawal(net::SchemefulSite context_site, double bits_debit, base::OnceCallback<void(OperationResult)> callback); // Determines the number of bits remaining in the privacy budget of - // `context_origin`, where only withdrawals within the most recent + // `context_site`, where only withdrawals within the most recent // `budget_interval_` are counted as still valid, and calls `callback` with // this information bundled with an `OperationResult` value to indicate // whether the database retrieval was successful. - void GetRemainingBudget(url::Origin context_origin, + void GetRemainingBudget(net::SchemefulSite context_site, base::OnceCallback<void(BudgetResult)> callback); // Calls `callback` with the most recent creation time (currently in the @@ -241,7 +245,10 @@ // `SharedStorageDatabase::GetRemainingBudget()`, and // `SharedStorageDatabase::GetCreationTime()`, then bundles this info along // with the accompanying `OperationResult`s into a struct to send to the - // DevTools `StorageHandler` via `callback`. + // DevTools `StorageHandler` via `callback`. Because DevTools displays + // shared storage data by origin, we continue to pass a `url::Origin` in as + // parameter `context_origin` and compute the site on the fly to use as + // parameter for `GetRemainingBudget()`. void GetMetadata(url::Origin context_origin, base::OnceCallback<void(MetadataResult)> callback); @@ -250,9 +257,11 @@ void GetEntriesForDevTools(url::Origin context_origin, base::OnceCallback<void(EntriesResult)> callback); - // Removes all budget withdrawals for `context_origin`. Calls `callback` to - // indicate whether the transaction succeeded. Intended as a convenience for - // the DevTools UX. + // Removes all budget withdrawals for `context_origin`'s site. Calls + // `callback` to indicate whether the transaction succeeded. Intended as a + // convenience for the DevTools UX. Because DevTools displays shared storage + // data by origin, we continue to pass a `url::Origin` in as parameter + // `context_origin` and compute the site on the fly. void ResetBudgetForDevTools( url::Origin context_origin, base::OnceCallback<void(OperationResult)> callback); @@ -273,9 +282,9 @@ std::unique_ptr<AsyncSharedStorageDatabase> override_async_database); // Calls `callback` with the number of entries (including stale entries) in - // the table `budget_mapping` for `context_origin`, or with -1 in case of + // the table `budget_mapping` for `context_site`, or with -1 in case of // database initialization failure or SQL error. - void GetNumBudgetEntriesForTesting(url::Origin context_origin, + void GetNumBudgetEntriesForTesting(net::SchemefulSite context_site, base::OnceCallback<void(int)> callback); // Calls `callback` with the total number of entries in the table for all
diff --git a/components/services/storage/shared_storage/shared_storage_manager_unittest.cc b/components/services/storage/shared_storage/shared_storage_manager_unittest.cc index 3f11ed6..43573b9 100644 --- a/components/services/storage/shared_storage/shared_storage_manager_unittest.cc +++ b/components/services/storage/shared_storage/shared_storage_manager_unittest.cc
@@ -231,13 +231,13 @@ Run(std::move(callback)); } void MakeBudgetWithdrawal( - url::Origin context_origin, + net::SchemefulSite context_site, double bits_debit, base::OnceCallback<void(OperationResult)> callback) override { Run(std::move(callback)); } void GetRemainingBudget( - url::Origin context_origin, + net::SchemefulSite context_site, base::OnceCallback<void(BudgetResult)> callback) override { Run(std::move(callback)); } @@ -739,21 +739,22 @@ return future.Get(); } - OperationResult MakeBudgetWithdrawalSync(const url::Origin& context_origin, - double bits_debit) { + OperationResult MakeBudgetWithdrawalSync( + const net::SchemefulSite& context_site, + double bits_debit) { DCHECK(GetManager()); base::test::TestFuture<OperationResult> future; - GetManager()->MakeBudgetWithdrawal(std::move(context_origin), bits_debit, + GetManager()->MakeBudgetWithdrawal(std::move(context_site), bits_debit, future.GetCallback()); return future.Get(); } - BudgetResult GetRemainingBudgetSync(const url::Origin& context_origin) { + BudgetResult GetRemainingBudgetSync(const net::SchemefulSite& context_site) { DCHECK(GetManager()); base::test::TestFuture<BudgetResult> future; - GetManager()->GetRemainingBudget(std::move(context_origin), + GetManager()->GetRemainingBudget(std::move(context_site), future.GetCallback()); return future.Take(); } @@ -774,11 +775,11 @@ std::move(context_origin), new_creation_time, std::move(callback)); } - int GetNumBudgetEntriesSync(url::Origin context_origin) { + int GetNumBudgetEntriesSync(net::SchemefulSite context_site) { DCHECK(GetManager()); base::test::TestFuture<int> future; - GetManager()->GetNumBudgetEntriesForTesting(std::move(context_origin), + GetManager()->GetNumBudgetEntriesForTesting(std::move(context_site), future.GetCallback()); return future.Get(); } @@ -1079,10 +1080,15 @@ url::Origin::Create(GURL("http://waymo.com")), url::Origin::Create(GURL("http://withgoogle.com")), youtube_com)); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(chromium_org).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(google_com).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(google_org).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(youtube_com).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, + GetRemainingBudgetSync(net::SchemefulSite(chromium_org)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + GetRemainingBudgetSync(net::SchemefulSite(google_com)).bits); + EXPECT_DOUBLE_EQ(kBitBudget, + GetRemainingBudgetSync(net::SchemefulSite(google_org)).bits); + EXPECT_DOUBLE_EQ( + kBitBudget, GetRemainingBudgetSync(net::SchemefulSite(youtube_com)).bits); } class SharedStorageManagerParamTest @@ -1442,37 +1448,34 @@ // SQL database hasn't yet been lazy-initialized. Nevertheless, remaining // budgets should be returned as the max possible. - const url::Origin kOrigin1 = - url::Origin::Create(GURL("http://www.example1.test")); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin1).bits); - const url::Origin kOrigin2 = - url::Origin::Create(GURL("http://www.example2.test")); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); + const net::SchemefulSite kSite1(GURL("http://www.example1.test")); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite1).bits); + const net::SchemefulSite kSite2(GURL("http://www.example2.test")); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); - // A withdrawal for `kOrigin1` doesn't affect `kOrigin2`. - EXPECT_EQ(OperationResult::kSuccess, - MakeBudgetWithdrawalSync(kOrigin1, 1.75)); - EXPECT_DOUBLE_EQ(kBitBudget - 1.75, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin1)); + // A withdrawal for `kSite1` doesn't affect `kSite2`. + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 1.75)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.75, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(1, GetTotalNumBudgetEntriesSync()); - // An additional withdrawal for `kOrigin1` at or near the same time as the + // An additional withdrawal for `kSite1` at or near the same time as the // previous one is debited appropriately. - EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kOrigin1, 2.5)); + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 2.5)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(2, GetNumBudgetEntriesSync(kOrigin1)); + GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(2, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(2, GetTotalNumBudgetEntriesSync()); - // A withdrawal for `kOrigin2` doesn't affect `kOrigin1`. - EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kOrigin2, 3.4)); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kOrigin2).bits); + // A withdrawal for `kSite2` doesn't affect `kSite1`. + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite2, 3.4)); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kSite2).bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_EQ(2, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin2)); + GetRemainingBudgetSync(kSite1).bits); + EXPECT_EQ(2, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(3, GetTotalNumBudgetEntriesSync()); // Advance partway through the lookback window, to the point where the first @@ -1481,18 +1484,18 @@ // Remaining budgets continue to take into account the withdrawals above, as // they are still within the lookback window. - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kOrigin2).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kSite2).bits); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5, - GetRemainingBudgetSync(kOrigin1).bits); + GetRemainingBudgetSync(kSite1).bits); - // An additional withdrawal for `kOrigin1` at a later time from previous ones + // An additional withdrawal for `kSite1` at a later time from previous ones // is debited appropriately. - EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kOrigin1, 1.0)); + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 1.0)); EXPECT_DOUBLE_EQ(kBitBudget - 1.75 - 2.5 - 1.0, - GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(3, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin2)); + GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget - 3.4, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(3, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(4, GetTotalNumBudgetEntriesSync()); // Advance further through the lookback window, to the point where the second @@ -1507,10 +1510,10 @@ // After `PurgeStale()` runs via the timer, there will only be the most // recent debit left in the budget table. - EXPECT_DOUBLE_EQ(kBitBudget - 1.0, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin2).bits); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin1)); - EXPECT_EQ(0, GetNumBudgetEntriesSync(kOrigin2)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.0, GetRemainingBudgetSync(kSite1).bits); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite2).bits); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite1)); + EXPECT_EQ(0, GetNumBudgetEntriesSync(kSite2)); EXPECT_EQ(1, GetTotalNumBudgetEntriesSync()); } @@ -1522,19 +1525,19 @@ // budgets should be returned as the max possible. const url::Origin kOrigin1 = url::Origin::Create(GURL("http://www.example1.test")); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin1).bits); + const net::SchemefulSite kSite1(kOrigin1); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite1).bits); // Make withdrawal. - EXPECT_EQ(OperationResult::kSuccess, - MakeBudgetWithdrawalSync(kOrigin1, 1.75)); - EXPECT_DOUBLE_EQ(kBitBudget - 1.75, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_EQ(1, GetNumBudgetEntriesSync(kOrigin1)); + EXPECT_EQ(OperationResult::kSuccess, MakeBudgetWithdrawalSync(kSite1, 1.75)); + EXPECT_DOUBLE_EQ(kBitBudget - 1.75, GetRemainingBudgetSync(kSite1).bits); + EXPECT_EQ(1, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(1, GetTotalNumBudgetEntriesSync()); // Reset budget. EXPECT_EQ(OperationResult::kSuccess, ResetBudgetForDevToolsSync(kOrigin1)); - EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kOrigin1).bits); - EXPECT_EQ(0, GetNumBudgetEntriesSync(kOrigin1)); + EXPECT_DOUBLE_EQ(kBitBudget, GetRemainingBudgetSync(kSite1).bits); + EXPECT_EQ(0, GetNumBudgetEntriesSync(kSite1)); EXPECT_EQ(0, GetTotalNumBudgetEntriesSync()); }
diff --git a/components/services/storage/shared_storage/shared_storage_test_utils.cc b/components/services/storage/shared_storage/shared_storage_test_utils.cc index 0a68bea3..9799a21 100644 --- a/components/services/storage/shared_storage/shared_storage_test_utils.cc +++ b/components/services/storage/shared_storage/shared_storage_test_utils.cc
@@ -39,8 +39,14 @@ url::Origin origin) : type(type), origin(std::move(origin)) { DCHECK(type == Type::DB_LENGTH || type == Type::DB_CLEAR || - type == Type::DB_GET_REMAINING_BUDGET || - type == Type::DB_GET_NUM_BUDGET || type == Type::DB_GET_CREATION_TIME); + type == Type::DB_GET_CREATION_TIME); +} + +TestDatabaseOperationReceiver::DBOperation::DBOperation(Type type, + net::SchemefulSite site) + : type(type), origin(site.GetInternalOriginForTesting()) { // IN-TEST + DCHECK(type == Type::DB_GET_REMAINING_BUDGET || + type == Type::DB_GET_NUM_BUDGET); } TestDatabaseOperationReceiver::DBOperation::DBOperation( @@ -51,13 +57,22 @@ DCHECK(type == Type::DB_GET || type == Type::DB_SET || type == Type::DB_APPEND || type == Type::DB_DELETE || type == Type::DB_KEYS || type == Type::DB_ENTRIES || - type == Type::DB_MAKE_BUDGET_WITHDRAWAL || type == Type::DB_OVERRIDE_TIME_ORIGIN || type == Type::DB_OVERRIDE_TIME_ENTRY); } TestDatabaseOperationReceiver::DBOperation::DBOperation( Type type, + net::SchemefulSite site, + std::vector<std::u16string> params) + : type(type), + origin(site.GetInternalOriginForTesting()), // IN-TEST + params(std::move(params)) { + DCHECK_EQ(type, Type::DB_MAKE_BUDGET_WITHDRAWAL); +} + +TestDatabaseOperationReceiver::DBOperation::DBOperation( + Type type, std::vector<std::u16string> params) : type(type), params(std::move(params)) { DCHECK(type == Type::DB_ON_MEMORY_PRESSURE || @@ -535,7 +550,7 @@ // Implicit index on `meta`, `values_mapping_last_used_time_idx`, // `per_origin_mapping_creation_time_idx`, and - // budget_mapping_origin_time_stamp_idx. + // budget_mapping_site_time_stamp_idx. EXPECT_EQ(4u, sql::test::CountSQLIndices(&db)); // `key` and `value`. @@ -547,7 +562,7 @@ // `context_origin`, `creation_time`, and `length`. EXPECT_EQ(3u, sql::test::CountTableColumns(&db, "per_origin_mapping")); - // `id`, `context_origin`, `time_stamp`, and `bits_debit`. + // `id`, `context_site`, `time_stamp`, and `bits_debit`. EXPECT_EQ(4u, sql::test::CountTableColumns(&db, "budget_mapping")); }
diff --git a/components/services/storage/shared_storage/shared_storage_test_utils.h b/components/services/storage/shared_storage/shared_storage_test_utils.h index 003542ff..63b4b9f 100644 --- a/components/services/storage/shared_storage/shared_storage_test_utils.h +++ b/components/services/storage/shared_storage/shared_storage_test_utils.h
@@ -18,6 +18,7 @@ #include "components/services/storage/shared_storage/shared_storage_database.h" #include "mojo/public/cpp/bindings/pending_remote.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "net/base/schemeful_site.h" #include "url/origin.h" namespace base { @@ -81,9 +82,13 @@ std::vector<std::u16string> params; explicit DBOperation(Type type); DBOperation(Type type, url::Origin origin); + DBOperation(Type type, net::SchemefulSite site); DBOperation(Type type, url::Origin origin, std::vector<std::u16string> params); + DBOperation(Type type, + net::SchemefulSite site, + std::vector<std::u16string> params); DBOperation(Type type, std::vector<std::u16string> params); DBOperation(const DBOperation&); ~DBOperation();
diff --git a/components/signin/internal/identity_manager/account_fetcher_service.cc b/components/signin/internal/identity_manager/account_fetcher_service.cc index 0f9e37c..aab785c 100644 --- a/components/signin/internal/identity_manager/account_fetcher_service.cc +++ b/components/signin/internal/identity_manager/account_fetcher_service.cc
@@ -12,6 +12,7 @@ #include "base/functional/bind.h" #include "base/metrics/field_trial.h" #include "base/metrics/histogram_functions.h" +#include "base/notreached.h" #include "base/trace_event/trace_event.h" #include "base/values.h" #include "build/build_config.h" @@ -283,7 +284,16 @@ void AccountFetcherService::RefreshAccountInfo(const CoreAccountId& account_id, bool only_fetch_if_invalid) { DCHECK(network_fetches_enabled_); + + // TODO(crbug.com/1488399): It seems quite suspect account tracker needs to start + // tracking the account when refreshing the account info. Understand why this + // is needed and ideally remove this call (it may have been added just for + // tests). + base::UmaHistogramBoolean( + "Signin.AccountTracker.RefreshAccountInfo.IsAlreadyTrackingAccount", + account_tracker_service_->IsTrackingAccount(account_id)); account_tracker_service_->StartTrackingAccount(account_id); + const AccountInfo& info = account_tracker_service_->GetAccountInfo(account_id);
diff --git a/components/signin/internal/identity_manager/account_tracker_service.cc b/components/signin/internal/identity_manager/account_tracker_service.cc index 8ec4985a..11afe47 100644 --- a/components/signin/internal/identity_manager/account_tracker_service.cc +++ b/components/signin/internal/identity_manager/account_tracker_service.cc
@@ -8,6 +8,7 @@ #include <sstream> #include <string> +#include "base/check.h" #include "base/command_line.h" #include "base/containers/contains.h" #include "base/feature_list.h" @@ -39,7 +40,9 @@ #include "components/signin/public/base/signin_pref_names.h" #include "components/signin/public/base/signin_switches.h" #include "components/signin/public/identity_manager/account_capabilities.h" +#include "components/signin/public/identity_manager/account_info.h" #include "components/signin/public/identity_manager/tribool.h" +#include "google_apis/gaia/core_account_id.h" #include "ui/gfx/image/image.h" #if BUILDFLAG(IS_ANDROID) @@ -295,16 +298,21 @@ void AccountTrackerService::StartTrackingAccount( const CoreAccountId& account_id) { + // TODO(crbug.com/1488401): Change into a CHECK once there are no crash reports for + // tracking empty account ids. + DUMP_WILL_BE_CHECK(!account_id.empty()); if (!base::Contains(accounts_, account_id)) { DVLOG(1) << "StartTracking " << account_id; - base::UmaHistogramBoolean("Signin.AccountTracker.IsAccountIdEmpty", - account_id.empty()); AccountInfo account_info; account_info.account_id = account_id; accounts_.insert(std::make_pair(account_id, account_info)); } } +bool AccountTrackerService::IsTrackingAccount(const CoreAccountId& account_id) { + return base::Contains(accounts_, account_id); +} + void AccountTrackerService::StopTrackingAccount( const CoreAccountId& account_id) { DVLOG(1) << "StopTracking " << account_id; @@ -627,6 +635,11 @@ const base::Value::Dict* dict = list[i].GetIfDict(); if (dict) { if (const std::string* account_key = dict->FindString(kAccountKeyKey)) { + // Ignore empty account ids. + if (account_key->empty()) { + to_remove.insert(CoreAccountId()); + continue; + } // Ignore incorrectly persisted non-canonical account ids. if (account_key->find('@') != std::string::npos && *account_key != gaia::CanonicalizeEmail(*account_key)) { @@ -837,6 +850,15 @@ CoreAccountId AccountTrackerService::SeedAccountInfo(AccountInfo info) { info.account_id = PickAccountIdForAccount(info.gaia, info.email); + base::UmaHistogramBoolean( + "Signin.AccountTracker.SeedAccountInfo.IsAccountIdEmpty", + info.account_id.empty()); + + if (info.account_id.empty()) { + DLOG(ERROR) << "Cannot seed an account with an empty account id: [" << info + << "]"; + return CoreAccountId(); + } const bool already_exists = base::Contains(accounts_, info.account_id); StartTrackingAccount(info.account_id);
diff --git a/components/signin/internal/identity_manager/account_tracker_service.h b/components/signin/internal/identity_manager/account_tracker_service.h index 67ea003..28c8488 100644 --- a/components/signin/internal/identity_manager/account_tracker_service.h +++ b/components/signin/internal/identity_manager/account_tracker_service.h
@@ -172,6 +172,7 @@ private: friend class AccountFetcherService; + friend class AccountTrackerServiceTest; friend void signin::SimulateSuccessfulFetchOfAccountInfo( signin::IdentityManager*, const CoreAccountId&, @@ -190,7 +191,9 @@ void NotifyAccountUpdated(const AccountInfo& account_info); void NotifyAccountRemoved(const AccountInfo& account_info); + // Start tracking `account_id` (`account_id` must not be empty). void StartTrackingAccount(const CoreAccountId& account_id); + bool IsTrackingAccount(const CoreAccountId& account_id); void StopTrackingAccount(const CoreAccountId& account_id); // Load the current state of the account info from the preferences file.
diff --git a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc index f0f1e6e..0a11550 100644 --- a/components/signin/internal/identity_manager/account_tracker_service_unittest.cc +++ b/components/signin/internal/identity_manager/account_tracker_service_unittest.cc
@@ -298,13 +298,13 @@ void ClearAccountTrackerEvents() { account_tracker_events_.clear(); } void OnAccountUpdated(const AccountInfo& ids) { - account_tracker_events_.push_back( - TrackingEvent(UPDATED, ids.account_id, ids.gaia, ids.email)); + account_tracker_events_.emplace_back(UPDATED, ids.account_id, ids.gaia, + ids.email); } void OnAccountRemoved(const AccountInfo& ids) { - account_tracker_events_.push_back( - TrackingEvent(REMOVED, ids.account_id, ids.gaia, ids.email)); + account_tracker_events_.emplace_back(REMOVED, ids.account_id, ids.gaia, + ids.email); } // Helpers to fake access token and user info fetching @@ -369,6 +369,10 @@ return signin_client_.GetTestURLLoaderFactory(); } + void SaveToPrefs(const AccountInfo& account) { + account_tracker()->SaveToPrefs(account); + } + protected: void ReturnFetchResults(const GURL& url, net::HttpStatusCode response_code, @@ -1139,6 +1143,38 @@ EXPECT_EQ(static_cast<int>(signin::Tribool::kTrue), new_key.value()); } +TEST_F(AccountTrackerServiceTest, Persistence_DeleteEmpty) { + // Define a user data directory for the account image storage. + base::ScopedTempDir scoped_user_data_dir; + ASSERT_TRUE(scoped_user_data_dir.CreateUniqueTempDir()); + + // Create a tracker and save to prefs a valid account and an empty one. + ResetAccountTrackerWithPersistence(scoped_user_data_dir.GetPath()); + AccountInfo a; + a.account_id = AccountKeyToAccountId(kAccountKeyAlpha); + a.gaia = AccountKeyToGaiaId(kAccountKeyAlpha); + a.email = AccountKeyToEmail(kAccountKeyAlpha); + SaveToPrefs(a); + + AccountInfo empty_account; + SaveToPrefs(empty_account); + + // Create a new tracker and make sure it loads the accounts. + ClearAccountTrackerEvents(); + ResetAccountTrackerWithPersistence(scoped_user_data_dir.GetPath()); + + // Verify that the account with an empty account id was removed when loading + // the accounts from prefs. + std::vector<AccountInfo> infos = account_tracker()->GetAccounts(); + ASSERT_EQ(1u, infos.size()); + EXPECT_EQ(a.account_id, infos[0].account_id); + + // Delete the account tracker before cleaning up |scoped_user_data_dir| so + // that all in-use files are closed. + ResetAccountTracker(); + ASSERT_TRUE(scoped_user_data_dir.Delete()); +} + TEST_F(AccountTrackerServiceTest, SeedAccountInfo) { EXPECT_TRUE(account_tracker()->GetAccounts().empty());
diff --git a/components/signin/internal/identity_manager/primary_account_manager.cc b/components/signin/internal/identity_manager/primary_account_manager.cc index efe138a..ce2bb875 100644 --- a/components/signin/internal/identity_manager/primary_account_manager.cc +++ b/components/signin/internal/identity_manager/primary_account_manager.cc
@@ -139,10 +139,11 @@ // static void PrimaryAccountManager::RegisterProfilePrefs(PrefRegistrySimple* registry) { - registry->RegisterStringPref(prefs::kGoogleServicesLastAccountIdDeprecated, + registry->RegisterStringPref( + prefs::kGoogleServicesLastSyncingAccountIdDeprecated, std::string()); + registry->RegisterStringPref(prefs::kGoogleServicesLastSyncingGaiaId, std::string()); - registry->RegisterStringPref(prefs::kGoogleServicesLastGaiaId, std::string()); - registry->RegisterStringPref(prefs::kGoogleServicesLastUsername, + registry->RegisterStringPref(prefs::kGoogleServicesLastSyncingUsername, std::string()); registry->RegisterStringPref(prefs::kGoogleServicesAccountId, std::string()); registry->RegisterBooleanPref(prefs::kGoogleServicesConsentedToSync, false); @@ -207,7 +208,7 @@ CoreAccountInfo account_info = account_tracker_service_->GetAccountInfo(account_id); if (consented) { - DUMP_WILL_BE_CHECK(!account_info.account_id.empty()); + DCHECK(!account_info.account_id.empty()); // First reset the state, because SetSyncPrimaryAccountInternal() can // only be called if there is no primary account. SetPrimaryAccountInternal(CoreAccountInfo(), /*consented_to_sync=*/false, @@ -281,7 +282,7 @@ void PrimaryAccountManager::SetSyncPrimaryAccountInternal( const CoreAccountInfo& account_info) { - DUMP_WILL_BE_CHECK(!account_info.account_id.empty()); + DCHECK(!account_info.account_id.empty()); DCHECK(!HasPrimaryAccount(signin::ConsentLevel::kSync)); #if DCHECK_IS_ON() @@ -308,9 +309,9 @@ // Go ahead and update the last signed in account info here as well. Once a // user is signed in the corresponding preferences should match. Doing it here // as opposed to on signin allows us to catch the upgrade scenario. - scoped_pref_commit.SetString(prefs::kGoogleServicesLastGaiaId, + scoped_pref_commit.SetString(prefs::kGoogleServicesLastSyncingGaiaId, account_info.gaia); - scoped_pref_commit.SetString(prefs::kGoogleServicesLastUsername, + scoped_pref_commit.SetString(prefs::kGoogleServicesLastSyncingUsername, account_info.email); } @@ -339,7 +340,7 @@ } const std::string& last_gaia_id_with_sync_enabled = - client_->GetPrefs()->GetString(prefs::kGoogleServicesLastGaiaId); + client_->GetPrefs()->GetString(prefs::kGoogleServicesLastSyncingGaiaId); const bool existed_primary_account_with_sync = !last_gaia_id_with_sync_enabled.empty();
diff --git a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc index 6927e1f8..a18e960a 100644 --- a/components/signin/internal/identity_manager/primary_account_manager_unittest.cc +++ b/components/signin/internal/identity_manager/primary_account_manager_unittest.cc
@@ -637,7 +637,8 @@ TEST_F(PrimaryAccountManagerTest, RecordExistingPreviousSyncAccountIfCurrentlySignedOut) { - user_prefs_.SetString(prefs::kGoogleServicesLastGaiaId, "previous_gaia_id"); + user_prefs_.SetString(prefs::kGoogleServicesLastSyncingGaiaId, + "previous_gaia_id"); CreatePrimaryAccountManager(); ASSERT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSignin)); @@ -651,7 +652,8 @@ TEST_F(PrimaryAccountManagerTest, RecordExistingPreviousSyncAccountIfCurrentlyUnconsented) { - user_prefs_.SetString(prefs::kGoogleServicesLastGaiaId, "previous_gaia_id"); + user_prefs_.SetString(prefs::kGoogleServicesLastSyncingGaiaId, + "previous_gaia_id"); CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com"); user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString()); user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, false); @@ -672,7 +674,8 @@ // TODO(crbug.com/1484870): The test was failing on android-12-x64-rel. TEST_F(PrimaryAccountManagerTest, DISABLED_DoNotRecordExistingPreviousSyncAccountIfCurrentlyConsented) { - user_prefs_.SetString(prefs::kGoogleServicesLastGaiaId, "previous_gaia_id"); + user_prefs_.SetString(prefs::kGoogleServicesLastSyncingGaiaId, + "previous_gaia_id"); CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com"); user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString()); user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, true); @@ -690,8 +693,8 @@ TEST_F(PrimaryAccountManagerTest, RecordAbsenceOfPreviousSyncAccountIfCurrentlySignedOut) { - // Leave `prefs::kGoogleServicesLastGaiaId` unset so there is no previous sync - // account. + // Leave `prefs::kGoogleServicesLastSyncingGaiaId` unset so there is no + // previous sync account. CreatePrimaryAccountManager(); ASSERT_FALSE(manager_->HasPrimaryAccount(ConsentLevel::kSignin)); @@ -705,8 +708,8 @@ TEST_F(PrimaryAccountManagerTest, RecordAbsenceOfPreviousSyncAccountIfCurrentlyUnconsented) { - // Leave `prefs::kGoogleServicesLastGaiaId` unset so there is no previous sync - // account. + // Leave `prefs::kGoogleServicesLastSyncingGaiaId` unset so there is no + // previous sync account. CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com"); user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString()); user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, false); @@ -726,8 +729,8 @@ TEST_F(PrimaryAccountManagerTest, DoNotRecordAbsenceOfPreviousSyncAccountIfCurrentlyConsented) { - // Leave `prefs::kGoogleServicesLastGaiaId` unset so there is no previous sync - // account. + // Leave `prefs::kGoogleServicesLastSyncingGaiaId` unset so there is no + // previous sync account. CoreAccountId account_id = AddToAccountTracker("gaia_id", "user@gmail.com"); user_prefs_.SetString(prefs::kGoogleServicesAccountId, account_id.ToString()); user_prefs_.SetBoolean(prefs::kGoogleServicesConsentedToSync, true);
diff --git a/components/signin/public/base/session_binding_utils.cc b/components/signin/public/base/session_binding_utils.cc index e8d491981..a727632d 100644 --- a/components/signin/public/base/session_binding_utils.cc +++ b/components/signin/public/base/session_binding_utils.cc
@@ -23,12 +23,6 @@ namespace { -constexpr base::StringPiece kSessionBindingRegistrationAud = - "https://accounts.google.com/RegisterSession"; -constexpr base::StringPiece kSessionBindingNamespace = "CookieBinding"; -constexpr base::StringPiece kSessionBindingAssertionAud = - "https://accounts.google.com/RotateBoundCookies"; - // Source: JSON Web Signature and Encryption Algorithms // https://www.iana.org/assignments/jose/jose.xhtml std::string SignatureAlgorithmToString( @@ -150,11 +144,9 @@ crypto::SignatureVerifier::SignatureAlgorithm algorithm, base::span<const uint8_t> pubkey, base::Time timestamp) { - // TODO(b/302137371): use `registration_url.spec()` instead of a hardcoded - // value in "aud" field. auto payload = base::Value::Dict() - .Set("aud", kSessionBindingRegistrationAud) + .Set("aud", registration_url.spec()) .Set("jti", challenge) // Write out int64_t variable as a double. // Note: this may discard some precision, but for `base::Value` @@ -173,14 +165,9 @@ base::StringPiece challenge, const GURL& destination_url, base::StringPiece name_space) { - // TODO(b/302137371): remove a special "aud" value for - // `kSessionBindingNamespace` - base::StringPiece aud = name_space == kSessionBindingNamespace - ? kSessionBindingAssertionAud - : destination_url.spec(); auto payload = base::Value::Dict() .Set("sub", client_id) - .Set("aud", aud) + .Set("aud", destination_url.spec()) .Set("jti", challenge) .Set("iss", Base64UrlEncode(crypto::SHA256Hash(pubkey))) .Set("namespace", name_space);
diff --git a/components/signin/public/base/session_binding_utils_unittest.cc b/components/signin/public/base/session_binding_utils_unittest.cc index 11002c1..d3defc6a 100644 --- a/components/signin/public/base/session_binding_utils_unittest.cc +++ b/components/signin/public/base/session_binding_utils_unittest.cc
@@ -93,7 +93,7 @@ base::Value::Dict().Set("alg", "RS256").Set("typ", "jwt"); base::Value::Dict expected_payload = base::Value::Dict() - .Set("aud", "https://accounts.google.com/RegisterSession") + .Set("aud", "https://accounts.google.com/RegisterKey") .Set("jti", "test_challenge") .Set("iat", 17280000) .Set("key", base::Value::Dict() @@ -139,27 +139,6 @@ EXPECT_EQ(actual_payload, expected_payload); } -// Tests the "aud" workaround for the "CookieBinding" namespace. -// TODO(b/302137371): remove when no longer needed. -TEST(SessionBindingUtilsTest, - CreateKeyAssertionHeaderAndPayloadForSessionBinding) { - absl::optional<std::string> result = CreateKeyAssertionHeaderAndPayload( - crypto::SignatureVerifier::SignatureAlgorithm::ECDSA_SHA256, - std::vector<uint8_t>({1, 2, 3}), "test_client_id", "test_challenge", - GURL("https://accounts.google.com/VerifyKey"), "CookieBinding"); - ASSERT_TRUE(result.has_value()); - - std::vector<base::StringPiece> header_and_payload = base::SplitStringPiece( - *result, ".", base::KEEP_WHITESPACE, base::SPLIT_WANT_ALL); - ASSERT_EQ(header_and_payload.size(), 2U); - base::Value actual_payload = - Base64UrlEncodedJsonToValue(header_and_payload[1]); - - std::string* aud = actual_payload.GetDict().FindString("aud"); - ASSERT_TRUE(aud); - EXPECT_EQ(*aud, "https://accounts.google.com/RotateBoundCookies"); -} - TEST(SessionBindingUtilsTest, AppendSignatureToHeaderAndPayload) { absl::optional<std::string> result = AppendSignatureToHeaderAndPayload( "abc.efg", @@ -169,6 +148,25 @@ } TEST(SessionBindingUtilsTest, + AppendSignatureToHeaderAndPayloadValidECDSASignature) { + const std::vector<uint8_t> kDerSignature = { + 0x30, 0x45, 0x02, 0x20, 0x74, 0xa0, 0x6f, 0x6b, 0x2b, 0x0e, 0x82, 0x0e, + 0x03, 0x3b, 0x6e, 0x98, 0xfc, 0x89, 0x9c, 0xf3, 0x30, 0xb5, 0x56, 0xd3, + 0x29, 0x89, 0xb5, 0x82, 0x33, 0x5f, 0x9d, 0x97, 0xfb, 0x65, 0x64, 0x90, + 0x02, 0x21, 0x00, 0xbc, 0xb5, 0xee, 0x42, 0xe2, 0x5a, 0x87, 0xae, 0x21, + 0x18, 0xda, 0x7e, 0x68, 0x65, 0x30, 0xbe, 0xe5, 0x69, 0x3d, 0xc5, 0x5f, + 0xd5, 0x62, 0x45, 0x3e, 0x8d, 0x0b, 0x05, 0x1a, 0x33, 0x79, 0x8d}; + constexpr base::StringPiece kRawSignatureBase64UrlEncoded = + "dKBvaysOgg4DO26Y_Imc8zC1VtMpibWCM1-dl_tlZJC8te5C4lqHriEY2n5oZTC-5Wk9xV_" + "VYkU-jQsFGjN5jQ"; + + absl::optional<std::string> result = AppendSignatureToHeaderAndPayload( + "abc.efg", crypto::SignatureVerifier::SignatureAlgorithm::ECDSA_SHA256, + kDerSignature); + EXPECT_EQ(result, base::StrCat({"abc.efg.", kRawSignatureBase64UrlEncoded})); +} + +TEST(SessionBindingUtilsTest, AppendSignatureToHeaderAndPayloadInvalidECDSASignature) { absl::optional<std::string> result = AppendSignatureToHeaderAndPayload( "abc.efg", crypto::SignatureVerifier::SignatureAlgorithm::ECDSA_SHA256,
diff --git a/components/signin/public/base/signin_pref_names.cc b/components/signin/public/base/signin_pref_names.cc index b3f4ef3..98a939e 100644 --- a/components/signin/public/base/signin_pref_names.cc +++ b/components/signin/public/base/signin_pref_names.cc
@@ -49,24 +49,25 @@ const char kGoogleServicesConsentedToSync[] = "google.services.consented_to_sync"; -// Similar to kGoogleServicesLastUsername, this is the corresponding version of -// kGoogleServicesAccountId that is not cleared on signout. +// Similar to kGoogleServicesLastSyncingUsername, this is the corresponding +// version of kGoogleServicesAccountId that is not cleared on signout. // DEPRECATED: this preference is deprecated and is always empty. It will be -// removed once all users are migrated to `kGoogleServicesLastGaiaId`. -const char kGoogleServicesLastAccountIdDeprecated[] = +// removed once all users are migrated to `kGoogleServicesLastSyncingGaiaId`. +const char kGoogleServicesLastSyncingAccountIdDeprecated[] = "google.services.last_account_id"; -// Similar to `kGoogleServicesLastUsername` that is not cleared on signout. Note -// this is always a Gaia ID, as opposed to `kGoogleServicesAccountId` which may -// be an email. -const char kGoogleServicesLastGaiaId[] = "google.services.last_gaia_id"; +// Similar to `kGoogleServicesLastSyncingUsername` that is not cleared on +// signout. Note this is always a Gaia ID, as opposed to +// `kGoogleServicesAccountId` which may be an email. +const char kGoogleServicesLastSyncingGaiaId[] = "google.services.last_gaia_id"; // String the identifies the last user that logged into sync and other // google services. This value is not cleared on signout. // This pref remains in order to pre-fill the sign in page when reconnecting a // profile, but programmatic checks to see if a given account is the same as the -// last account should use `kGoogleServicesLastGaiaId` instead. -const char kGoogleServicesLastUsername[] = "google.services.last_username"; +// last account should use `kGoogleServicesLastSyncingGaiaId` instead. +const char kGoogleServicesLastSyncingUsername[] = + "google.services.last_username"; // Device id scoped to single signin. This device id will be regenerated if user // signs out and signs back in. When refresh token is requested for this user it
diff --git a/components/signin/public/base/signin_pref_names.h b/components/signin/public/base/signin_pref_names.h index b3e061a..26a25a5 100644 --- a/components/signin/public/base/signin_pref_names.h +++ b/components/signin/public/base/signin_pref_names.h
@@ -22,9 +22,9 @@ extern const char kGaiaCookiePeriodicReportTime[]; extern const char kGoogleServicesAccountId[]; extern const char kGoogleServicesConsentedToSync[]; -extern const char kGoogleServicesLastAccountIdDeprecated[]; -extern const char kGoogleServicesLastGaiaId[]; -extern const char kGoogleServicesLastUsername[]; +extern const char kGoogleServicesLastSyncingAccountIdDeprecated[]; +extern const char kGoogleServicesLastSyncingGaiaId[]; +extern const char kGoogleServicesLastSyncingUsername[]; extern const char kGoogleServicesSigninScopedDeviceId[]; extern const char kGoogleServicesUsernamePattern[]; extern const char kRestrictAccountsToPatterns[];
diff --git a/components/supervised_user/core/browser/proto_fetcher.cc b/components/supervised_user/core/browser/proto_fetcher.cc index df90ec5..deb2bc59 100644 --- a/components/supervised_user/core/browser/proto_fetcher.cc +++ b/components/supervised_user/core/browser/proto_fetcher.cc
@@ -127,6 +127,27 @@ return simple_url_loader; } +// A stopwatch with two functions: +// * measure total elapsed time, +// * measure lap time (with automatic resetting after each lap). +// The stopwatch is created started. +class Stopwatch { + public: + // Time since start of last lap. Resets the lap timer. + TimeDelta Lap() { + TimeDelta lap = lap_timer_.Elapsed(); + lap_timer_ = ElapsedTimer(); + return lap; + } + + // Time since start of last lap. + TimeDelta Elapsed() const { return elapsed_timer_.Elapsed(); } + + private: + ElapsedTimer elapsed_timer_; + ElapsedTimer lap_timer_; +}; + // Encapsulates metric functionalities. class Metrics { public: @@ -135,6 +156,8 @@ kLatency, kHttpStatusOrNetError, kRetryCount, + kAccessTokenLatency, + kApiLatency, }; Metrics() = delete; @@ -150,6 +173,20 @@ stopwatch_.Elapsed()); } + void RecordAccessTokenLatency( + GoogleServiceAuthError::State auth_error_state) { + base::UmaHistogramTimes( + GetFullHistogramName(MetricType::kAccessTokenLatency, auth_error_state), + stopwatch_.Lap()); + } + + void RecordApiLatency( + ProtoFetcherStatus::HttpStatusOrNetErrorType http_status_or_net_error) { + base::UmaHistogramTimes( + GetFullHistogramName(MetricType::kApiLatency, http_status_or_net_error), + stopwatch_.Lap()); + } + virtual void RecordStatusLatency(ProtoFetcherStatus status) const { base::UmaHistogramTimes(GetFullHistogramName(MetricType::kLatency, status), stopwatch_.Elapsed()); @@ -174,6 +211,11 @@ return "Latency"; case MetricType::kHttpStatusOrNetError: return "HttpStatusOrNetError"; + case MetricType::kAccessTokenLatency: + return "AccessTokenLatency"; + case MetricType::kApiLatency: + return "ApiLatency"; + case MetricType::kRetryCount: NOTREACHED_NORETURN(); default: @@ -194,6 +236,27 @@ {basename_, ToMetricEnumLabel(status), GetMetricKey(metric_type)}, "."); } + // Returns fully-qualified name of histogram for specified metric_type with + // per-authentication status values. + std::string GetFullHistogramName( + MetricType metric_type, + GoogleServiceAuthError::State auth_error_state) const { + CHECK(auth_error_state == GoogleServiceAuthError::State::NONE) + << "Only authenticated case is supported."; + return JoinString({basename_, "NONE", GetMetricKey(metric_type)}, "."); + } + + // Returns fully-qualified name of histogram for specified metric_type with + // per-net-or-http error values. + std::string GetFullHistogramName(MetricType metric_type, + ProtoFetcherStatus::HttpStatusOrNetErrorType + http_status_or_net_error) const { + CHECK(http_status_or_net_error == + ProtoFetcherStatus::HttpStatusOrNetErrorType(net::HTTP_OK)) + << "Only successful api call case is supported."; + return JoinString({basename_, "HTTP_OK", GetMetricKey(metric_type)}, "."); + } + private: // The returned value must match one of the labels in // chromium/src/tools/metrics/histograms/enums.xml://enum[@name='ProtoFetcherStatus'], @@ -218,7 +281,7 @@ } StringPiece basename_; - const ElapsedTimer stopwatch_; + Stopwatch stopwatch_; }; // Metrics for retrying fetchers, which are aggregating individual @@ -285,12 +348,16 @@ StringPiece payload, const FetcherConfig& fetcher_config, Callback callback) - : fetcher_(LaunchFetcher(identity_manager, - url_loader_factory, - fetcher_config, - std::move(callback))), - payload_(payload), - config_(fetcher_config) {} + : payload_(payload), + config_(fetcher_config), + metrics_(fetcher_config.histogram_basename), + fetcher_(identity_manager, + fetcher_config.access_token_config, + BindOnce(&FetcherImpl::OnAccessTokenFetchComplete, + Unretained(this), // Unretained(.) is safe because + // `this` owns `fetcher_`. + url_loader_factory, + std::move(callback))) {} // Not copyable. FetcherImpl(const FetcherImpl&) = delete; @@ -318,21 +385,6 @@ } } - // Launch of the fetch process. - std::unique_ptr<ApiAccessTokenFetcher> LaunchFetcher( - IdentityManager& identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - const FetcherConfig& fetcher_config, - Callback callback) { - CHECK(callback) << "Use base::DoNothing() instead of empty callback."; - return std::make_unique<ApiAccessTokenFetcher>( - identity_manager, fetcher_config.access_token_config, - BindOnce(&FetcherImpl::OnAccessTokenFetchComplete, Unretained(this), - url_loader_factory, - std::move(callback))); // Unretained(.) is safe because `this` - // owns `access_token_fetcher_`. - } - // First phase of fetching done: the access token response is ready. void OnAccessTokenFetchComplete( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, @@ -345,6 +397,8 @@ return; } + metrics_.RecordAccessTokenLatency(GoogleServiceAuthError::State::NONE); + simple_url_loader_ = InitializeSimpleUrlLoader( access_token.value(), config_, GetRequestPayload()); simple_url_loader_->DownloadToStringOfUnboundedSizeUntilCrashAndDie( @@ -365,6 +419,9 @@ return; } + metrics_.RecordApiLatency( + ProtoFetcherStatus::HttpStatusOrNetErrorType(net::HTTP_OK)); + std::unique_ptr<Response> response = std::make_unique<Response>(); if (!response->ParseFromString(*response_body)) { OnError(std::move(callback), ProtoFetcherStatus::InvalidResponse()); @@ -394,14 +451,16 @@ std::move(callback).Run(ProtoFetcherStatus::Ok(), std::move(response)); } - // Entrypoint of the fetch process, which starts with ApiAccessToken access - // followed by a request made with SimpleURLLoader. - std::unique_ptr<ApiAccessTokenFetcher> fetcher_; std::unique_ptr<network::SimpleURLLoader> simple_url_loader_; const std::string payload_; const FetcherConfig config_; - const Metrics metrics_{config_.histogram_basename}; + Metrics metrics_; + + // Entrypoint of the fetch process, which starts with ApiAccessToken access + // followed by a request made with SimpleURLLoader. Purposely made last field + // should it depend on other members of this class. + ApiAccessTokenFetcher fetcher_; }; // Wraps FetcherImpl deferring its startup until explicitly invoked. This is the
diff --git a/components/supervised_user/core/browser/proto_fetcher_unittest.cc b/components/supervised_user/core/browser/proto_fetcher_unittest.cc index 9bc78ad..feb0377e 100644 --- a/components/supervised_user/core/browser/proto_fetcher_unittest.cc +++ b/components/supervised_user/core/browser/proto_fetcher_unittest.cc
@@ -408,6 +408,13 @@ base::StrCat({GetConfig().histogram_basename, ".Latency"}), /*expected_count(grew by)*/ 1); histogram_tester.ExpectTotalCount( + base::StrCat( + {GetConfig().histogram_basename, ".NONE.AccessTokenLatency"}), + /*expected_count(grew by)*/ 1); + histogram_tester.ExpectTotalCount( + base::StrCat({GetConfig().histogram_basename, ".HTTP_OK.ApiLatency"}), + /*expected_count(grew by)*/ 1); + histogram_tester.ExpectTotalCount( base::StrCat({GetConfig().histogram_basename, ".NoError.Latency"}), /*expected_count(grew by)*/ 1); @@ -484,6 +491,17 @@ histogram_tester.ExpectTotalCount( base::StrCat({GetConfig().histogram_basename, ".NoError.Latency"}), /*expected_count(grew by)*/ 1); + + // System made it through access token phase three times. + histogram_tester.ExpectTotalCount( + base::StrCat( + {GetConfig().histogram_basename, ".NONE.AccessTokenLatency"}), + /*expected_count(grew by)*/ 3); + // Only one successful api call. + histogram_tester.ExpectTotalCount( + base::StrCat({GetConfig().histogram_basename, ".HTTP_OK.ApiLatency"}), + /*expected_count(grew by)*/ 1); + histogram_tester.ExpectTotalCount( base::StrCat( {GetConfig().histogram_basename, ".HttpStatusOrNetError.Latency"}), @@ -559,6 +577,17 @@ histogram_tester.ExpectTotalCount( base::StrCat({GetConfig().histogram_basename, ".ParseError.Latency"}), /*expected_count(grew by)*/ 1); + + // System made it through access token phase two times. + histogram_tester.ExpectTotalCount( + base::StrCat( + {GetConfig().histogram_basename, ".NONE.AccessTokenLatency"}), + /*expected_count(grew by)*/ 2); + // Only one successful api call (parse error is a successful api call). + histogram_tester.ExpectTotalCount( + base::StrCat({GetConfig().histogram_basename, ".HTTP_OK.ApiLatency"}), + /*expected_count(grew by)*/ 1); + histogram_tester.ExpectTotalCount( base::StrCat( {GetConfig().histogram_basename, ".HttpStatusOrNetError.Latency"}), @@ -624,6 +653,16 @@ {GetConfig().histogram_basename, ".HttpStatusOrNetError.Latency"}), /*expected_count(grew by)*/ 2); + // System made it through access token phase two times. + histogram_tester.ExpectTotalCount( + base::StrCat( + {GetConfig().histogram_basename, ".NONE.AccessTokenLatency"}), + /*expected_count(grew by)*/ 3); + // Server only responds with error. + histogram_tester.ExpectTotalCount( + base::StrCat({GetConfig().histogram_basename, ".HTTP_OK.ApiLatency"}), + /*expected_count(grew by)*/ 0); + EXPECT_THAT( histogram_tester.GetAllSamples( base::StrCat({GetConfig().histogram_basename, ".Status"})),
diff --git a/components/test/data/storage/shared_storage.init_too_new.sql b/components/test/data/storage/shared_storage.init_too_new.sql index b52f0cf..1c3ff82 100644 --- a/components/test/data/storage/shared_storage.init_too_new.sql +++ b/components/test/data/storage/shared_storage.init_too_new.sql
@@ -5,7 +5,7 @@ BEGIN TRANSACTION; CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); INSERT INTO "meta" VALUES('version','1'); -INSERT INTO "meta" VALUES('last_compatible_version','4'); +INSERT INTO "meta" VALUES('last_compatible_version','5'); CREATE TABLE values_mapping(context_origin TEXT NOT NULL,key TEXT NOT NULL,value TEXT,PRIMARY KEY(context_origin,key)) WITHOUT ROWID; INSERT INTO "values_mapping" VALUES ('http://google.com','key1','value1'); INSERT INTO "values_mapping" VALUES ('http://google.com','key2','value2');
diff --git a/components/test/data/storage/shared_storage.v4.sql b/components/test/data/storage/shared_storage.v4.sql new file mode 100644 index 0000000..ef6d65a --- /dev/null +++ b/components/test/data/storage/shared_storage.v4.sql
@@ -0,0 +1,54 @@ +PRAGMA foreign_keys=OFF; +BEGIN TRANSACTION; +CREATE TABLE meta(key LONGVARCHAR NOT NULL UNIQUE PRIMARY KEY, value LONGVARCHAR); +INSERT INTO meta VALUES('mmap_status','-1'); +INSERT INTO meta VALUES('version','4'); +INSERT INTO meta VALUES('last_compatible_version','4'); +CREATE TABLE values_mapping(context_origin TEXT NOT NULL,key BLOB NOT NULL,value BLOB NOT NULL,last_used_time INTEGER NOT NULL,PRIMARY KEY(context_origin,key)) WITHOUT ROWID; +INSERT INTO "values_mapping" VALUES ('http://google.com',X'6b00650079003100',X'760061006c00750065003100',13312097333991364); +INSERT INTO "values_mapping" VALUES ('http://google.com',X'6b00650079003200',X'760061006c00750065003200',13313037427966159); +INSERT INTO "values_mapping" VALUES ('http://youtube.com',X'7600690073006900740065006400',X'3100310031003100310031003100',13313037435619704); +INSERT INTO "values_mapping" VALUES ('http://chromium.org',X'6100',X'',13313037416916308); +INSERT INTO "values_mapping" VALUES ('http://chromium.org',X'6200',X'680065006c006c006f00',13312097333991364); +INSERT INTO "values_mapping" VALUES ('http://chromium.org',X'6300',X'67006f006f006400620079006500',13312353831182651); +INSERT INTO "values_mapping" VALUES ('http://gv.com',X'63006f006f006b0069006500',X'31003300320036003800390034003100370039003300380035003600370033003300',13313037487092131); +INSERT INTO "values_mapping" VALUES ('http://abc.xyz',X'7300650065006400',X'330038003700350036003200300039003400',13269481776356965); +INSERT INTO "values_mapping" VALUES ('http://abc.xyz',X'6200750063006b0065007400',X'3100320037003600',13269481776356965); +INSERT INTO "values_mapping" VALUES ('http://withgoogle.com',X'63006f0075006e007400',X'330038003900',13269545986263676); +INSERT INTO "values_mapping" VALUES ('http://waymo.com',X'6b0065007900',X'760061006c0075006500',13269546064355176); +INSERT INTO "values_mapping" VALUES ('http://google.org',X'3100',X'6600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600',13269546476192362); +INSERT INTO "values_mapping" VALUES ('http://google.org',X'3200',X'3b00',13269546476192362); +INSERT INTO "values_mapping" VALUES ('http://google.org',X'2300',X'5b005d00',13269546476192362); +INSERT INTO "values_mapping" VALUES ('http://google.org',X'6600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600660066006600',X'6b00',13269546476192362); +INSERT INTO "values_mapping" VALUES ('http://growwithgoogle.com',X'5f00',X'64006f0077006e00',13269546593856733); +INSERT INTO "values_mapping" VALUES ('http://growwithgoogle.com',X'3c00',X'6c00650066007400',13269546593856733); +INSERT INTO "values_mapping" VALUES ('http://growwithgoogle.com',X'3e00',X'72006900670068007400',13269546593856733); +CREATE TABLE per_origin_mapping(context_origin TEXT NOT NULL PRIMARY KEY,creation_time INTEGER NOT NULL,length INTEGER NOT NULL) WITHOUT ROWID; +INSERT INTO "per_origin_mapping" VALUES ('http://google.com',13266954476192362,2); +INSERT INTO "per_origin_mapping" VALUES ('http://youtube.com',13266954593856733,1); +INSERT INTO "per_origin_mapping" VALUES ('http://chromium.org',13268941676192362,3); +INSERT INTO "per_origin_mapping" VALUES ('http://gv.com',13268941793856733,1); +INSERT INTO "per_origin_mapping" VALUES ('http://abc.xyz',13269481776356965,2); +INSERT INTO "per_origin_mapping" VALUES ('http://withgoogle.com',13269545986263676,1); +INSERT INTO "per_origin_mapping" VALUES ('http://waymo.com',13269546064355176,1); +INSERT INTO "per_origin_mapping" VALUES ('http://google.org',13269546476192362,4); +INSERT INTO "per_origin_mapping" VALUES ('http://growwithgoogle.com',13269546593856733,3); +CREATE TABLE budget_mapping(id INTEGER NOT NULL PRIMARY KEY,context_site TEXT NOT NULL,time_stamp INTEGER NOT NULL,bits_debit REAL NOT NULL); +INSERT INTO "budget_mapping" VALUES (1,'http://google.com',13266954476192332,1.0); +INSERT INTO "budget_mapping" VALUES (2,'http://google.com',13266954476192344,2.0); +INSERT INTO "budget_mapping" VALUES (3,'http://google.com',13266954476192362,1.1); +INSERT INTO "budget_mapping" VALUES (4,'http://youtube.com',13266954593856693,1.3); +INSERT INTO "budget_mapping" VALUES (5,'http://chromium.org',13268941676192362,1.5); +INSERT INTO "budget_mapping" VALUES (6,'http://youtube.com',13266954593856733,2.3); +INSERT INTO "budget_mapping" VALUES (7,'http://gv.com',13268941793856733,3.7); +INSERT INTO "budget_mapping" VALUES (8,'http://abc.xyz',13269481776356845,2.2); +INSERT INTO "budget_mapping" VALUES (9,'http://withgoogle.com',13269545986263676,1); +INSERT INTO "budget_mapping" VALUES (10,'http://abc.xyz',13269481776356905,1.1); +INSERT INTO "budget_mapping" VALUES (11,'http://waymo.com',13269546064355176,4.2); +INSERT INTO "budget_mapping" VALUES (12,'http://abc.xyz',13269481776356965,2.0); +INSERT INTO "budget_mapping" VALUES (13,'http://google.org',13269546476192362,4); +INSERT INTO "budget_mapping" VALUES (14,'http://growwithgoogle.com',13269546593856733,1.2); +CREATE INDEX budget_mapping_site_time_stamp_idx ON budget_mapping(context_site,time_stamp); +CREATE INDEX values_mapping_last_used_time_idx ON values_mapping(last_used_time); +CREATE INDEX per_origin_mapping_creation_time_idx ON per_origin_mapping(creation_time); +COMMIT;
diff --git a/components/test/data/viz/rotated_drop_shadow_filter_skia_gl.png b/components/test/data/viz/rotated_drop_shadow_filter_skia_gl.png index d3831e8..9635f84 100644 --- a/components/test/data/viz/rotated_drop_shadow_filter_skia_gl.png +++ b/components/test/data/viz/rotated_drop_shadow_filter_skia_gl.png Binary files differ
diff --git a/components/test/data/viz/rotated_drop_shadow_filter_skia_vk.png b/components/test/data/viz/rotated_drop_shadow_filter_skia_vk.png index a96ed10..ff1dc4e 100644 --- a/components/test/data/viz/rotated_drop_shadow_filter_skia_vk.png +++ b/components/test/data/viz/rotated_drop_shadow_filter_skia_vk.png Binary files differ
diff --git a/components/user_education/common/feature_promo_controller.cc b/components/user_education/common/feature_promo_controller.cc index 8b2efbd..ffcae654 100644 --- a/components/user_education/common/feature_promo_controller.cc +++ b/components/user_education/common/feature_promo_controller.cc
@@ -12,6 +12,7 @@ #include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback_forward.h" +#include "base/functional/callback_helpers.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/strings/grit/components_strings.h" #include "components/user_education/common/feature_promo_lifecycle.h" @@ -53,7 +54,9 @@ FeaturePromoControllerCommon::~FeaturePromoControllerCommon() { // Inform any pending startup promos that they were not shown. for (auto& [feature, callback] : startup_promos_) { - std::move(callback).Run(*feature, FeaturePromoResult::kCanceled); + if (callback) { + std::move(callback).Run(*feature, FeaturePromoResult::kCanceled); + } } } @@ -67,37 +70,29 @@ } FeaturePromoResult FeaturePromoControllerCommon::MaybeShowPromo( - const base::Feature& iph_feature, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params) { - return MaybeShowPromoCommon(iph_feature, - /* for_demo =*/false, std::move(close_callback), - std::move(body_params), std::move(title_params)); + FeaturePromoParams params) { + return MaybeShowPromoCommon(std::move(params), /* for_demo =*/false); } bool FeaturePromoControllerCommon::MaybeShowStartupPromo( - const base::Feature& iph_feature, - StartupPromoCallback promo_callback, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params) { + FeaturePromoParams params) { + const base::Feature* const iph_feature = ¶ms.feature.get(); + // If the promo is currently running, fail. - if (GetCurrentPromoFeature() == &iph_feature) { + if (GetCurrentPromoFeature() == iph_feature) { return false; } // If the promo is already queued, fail. - if (base::Contains(startup_promos_, &iph_feature)) + if (base::Contains(startup_promos_, iph_feature)) { return false; + } // Queue the promo. - startup_promos_.emplace(&iph_feature, std::move(promo_callback)); + startup_promos_.emplace(iph_feature, std::move(params.startup_callback)); feature_engagement_tracker_->AddOnInitializedCallback(base::BindOnce( &FeaturePromoControllerCommon::OnFeatureEngagementTrackerInitialized, - weak_ptr_factory_.GetWeakPtr(), base::Unretained(&iph_feature), - std::move(close_callback), std::move(body_params), - std::move(title_params))); + weak_ptr_factory_.GetWeakPtr(), std::move(params))); // The promo has been successfully queued. Once the FE backend is initialized, // MaybeShowPromo() will be called to see if the promo should actually be @@ -106,27 +101,19 @@ } FeaturePromoResult FeaturePromoControllerCommon::MaybeShowPromoForDemoPage( - const base::Feature& iph_feature, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params) { - return MaybeShowPromoCommon(iph_feature, /* for_demo =*/true, - std::move(close_callback), std::move(body_params), - std::move(title_params)); + FeaturePromoParams params) { + return MaybeShowPromoCommon(std::move(params), /* for_demo =*/true); } FeaturePromoResult FeaturePromoControllerCommon::MaybeShowPromoCommon( - const base::Feature& iph_feature, - bool for_demo, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params) { + FeaturePromoParams params, + bool for_demo) { // Perform common checks. const FeaturePromoSpecification* spec = nullptr; std::unique_ptr<FeaturePromoLifecycle> lifecycle = nullptr; ui::TrackedElement* anchor_element = nullptr; - auto result = CanShowPromoCommon(iph_feature, for_demo, &spec, &lifecycle, - &anchor_element); + auto result = CanShowPromoCommon(params.feature.get(), for_demo, &spec, + &lifecycle, &anchor_element); if (!result) { return result; } @@ -158,7 +145,7 @@ CheckScreenReaderPromptAvailable(for_demo || in_iph_demo_mode_); if (!for_demo && - !feature_engagement_tracker_->ShouldTriggerHelpUI(iph_feature)) { + !feature_engagement_tracker_->ShouldTriggerHelpUI(params.feature.get())) { return FeaturePromoResult::kBlockedByConfig; } @@ -169,17 +156,18 @@ // Try to show the bubble and bail out if we cannot. auto bubble = ShowPromoBubbleImpl( - *spec, anchor_element, std::move(body_params), std::move(title_params), - screen_reader_available, /* is_critical_promo =*/false); + *spec, anchor_element, std::move(params.body_params), + std::move(params.title_params), screen_reader_available, + /* is_critical_promo =*/false); if (!bubble) { current_promo_.reset(); if (!for_demo) { - feature_engagement_tracker_->Dismissed(iph_feature); + feature_engagement_tracker_->Dismissed(params.feature.get()); } return FeaturePromoResult::kError; } - bubble_closed_callback_ = std::move(close_callback); + bubble_closed_callback_ = std::move(params.close_callback); if (for_demo) { current_promo_->OnPromoShownForDemo(std::move(bubble)); @@ -274,7 +262,9 @@ CloseReason close_reason) { const auto it = startup_promos_.find(&iph_feature); if (it != startup_promos_.end()) { - std::move(it->second).Run(iph_feature, FeaturePromoResult::kCanceled); + if (it->second) { + std::move(it->second).Run(iph_feature, FeaturePromoResult::kCanceled); + } startup_promos_.erase(it); return true; } @@ -353,11 +343,10 @@ } void FeaturePromoControllerCommon::OnFeatureEngagementTrackerInitialized( - const base::Feature* iph_feature, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params, + FeaturePromoParams params, bool tracker_initialized_successfully) { + const base::Feature* const iph_feature = ¶ms.feature.get(); + // If the promo has been canceled, do not proceed. const auto it = startup_promos_.find(iph_feature); if (it == startup_promos_.end()) { @@ -371,12 +360,13 @@ // Try to start the promo, assuming the tracker was successfully initialized. FeaturePromoResult result; if (tracker_initialized_successfully) { - result = MaybeShowPromo(*iph_feature, std::move(close_callback), - std::move(body_params), std::move(title_params)); + result = MaybeShowPromo(std::move(params)); } else { result = FeaturePromoResult::kError; } - std::move(callback).Run(*iph_feature, result); + if (callback) { + std::move(callback).Run(*iph_feature, result); + } } FeaturePromoResult FeaturePromoControllerCommon::CanShowPromoCommon( @@ -812,4 +802,9 @@ true); } +FeaturePromoParams::FeaturePromoParams(const base::Feature& iph_feature) + : feature(iph_feature) {} +FeaturePromoParams::FeaturePromoParams(FeaturePromoParams&& other) = default; +FeaturePromoParams::~FeaturePromoParams() = default; + } // namespace user_education
diff --git a/components/user_education/common/feature_promo_controller.h b/components/user_education/common/feature_promo_controller.h index 2e1ff9a..5fa25ec 100644 --- a/components/user_education/common/feature_promo_controller.h +++ b/components/user_education/common/feature_promo_controller.h
@@ -15,8 +15,8 @@ #include "base/containers/contains.h" #include "base/feature_list.h" #include "base/functional/callback.h" -#include "base/functional/callback_helpers.h" #include "base/memory/raw_ptr.h" +#include "base/memory/raw_ref.h" #include "base/memory/weak_ptr.h" #include "components/feature_engagement/public/tracker.h" #include "components/user_education/common/feature_promo_handle.h" @@ -68,6 +68,8 @@ kFeatureEngaged, }; +struct FeaturePromoParams; + // Mostly virtual base class for feature promos; used to mock the interface in // tests. class FeaturePromoController { @@ -94,61 +96,30 @@ const base::Feature& iph_feature) const = 0; // Starts the promo if possible. Returns whether it started. - // |iph_feature| must be an IPH feature defined in - // components/feature_engagement/public/feature_list.cc and registered - // with |FeaturePromoRegistry|. Note that this is different than the - // feature that the IPH is showing for. - // // If the Feature Engagement backend is not initialized, returns false. - // - // If the body or title text is parameterized, pass text replacements in - // |body_params| and |title_params|. - // - // If a bubble was shown and |close_callback| was provided, it will be - // called when the bubble closes. |close_callback| must be valid as - // long as the bubble shows. - // - // For users that can't register their parameters with - // FeaturePromoRegistry, see - // |FeaturePromoControllerViews::MaybeShowPromoWithParams()|. Prefer - // statically registering params with FeaturePromoRegistry and using - // this method when possible. - virtual FeaturePromoResult MaybeShowPromo( - const base::Feature& iph_feature, - BubbleCloseCallback close_callback = base::DoNothing(), - FeaturePromoSpecification::FormatParameters body_params = - FeaturePromoSpecification::NoSubstitution(), - FeaturePromoSpecification::FormatParameters title_params = - FeaturePromoSpecification::NoSubstitution()) = 0; + virtual FeaturePromoResult MaybeShowPromo(FeaturePromoParams params) = 0; // Tries to start the promo at a time when the Feature Engagement backend may // not yet be initialized. Once it is initialized (which could be - // immediately), attempts to show the promo and calls `promo_callback` with - // the result. If EndPromo() is called before the promo is shown, the promo - // is canceled immediately. + // immediately), attempts to show the promo and calls + // `params.startup_callback` with the result. If EndPromo() is called before + // the promo is shown, the promo is canceled immediately. // // Returns whether the promo was queued, not whether it was actually shown. // A promo may be queued and then not show due to its Feature Engagement // conditions not being satisfied. For example, if multiple promos with a // session limit of 1 are queued, both may queue successfully, but only one // will actually show. If you care about whether the promo is actually shown, - // pass an appropriate `promo_callback`. + // set an appropriate `startup_callback`. // - // Note: Since `promo_callback` is asynchronous and can theoretically still + // Note: Since `startup_callback` is asynchronous and can theoretically still // be pending after the caller's scope disappears, care must be taken to avoid // a UAF on callback; the caller should prefer to either not bind transient // objects (e.g. only use the callback for things like UMA logging) or use a // weak pointer to avoid this situation. // // Otherwise, this is identical to MaybeShowPromo(). - virtual bool MaybeShowStartupPromo( - const base::Feature& iph_feature, - StartupPromoCallback promo_callback = base::DoNothing(), - BubbleCloseCallback close_callback = base::DoNothing(), - FeaturePromoSpecification::FormatParameters body_params = - FeaturePromoSpecification::NoSubstitution(), - FeaturePromoSpecification::FormatParameters title_params = - FeaturePromoSpecification::NoSubstitution()) = 0; + virtual bool MaybeShowStartupPromo(FeaturePromoParams params) = 0; // Gets the current status of the promo associated with `iph_feature`. virtual FeaturePromoStatus GetPromoStatus( @@ -178,12 +149,7 @@ // Starts a promo with the settings for skipping any logging or filtering // provided by the implementation for MaybeShowPromo. virtual FeaturePromoResult MaybeShowPromoForDemoPage( - const base::Feature& iph_feature, - BubbleCloseCallback close_callback = base::DoNothing(), - FeaturePromoSpecification::FormatParameters body_params = - FeaturePromoSpecification::NoSubstitution(), - FeaturePromoSpecification::FormatParameters title_params = - FeaturePromoSpecification::NoSubstitution()) = 0; + FeaturePromoParams params) = 0; // Ends or cancels the current promo if it is queued. Returns true if a promo // was successfully canceled or a bubble closed. @@ -254,33 +220,15 @@ // FeaturePromoController: FeaturePromoResult CanShowPromo( const base::Feature& iph_feature) const override; - FeaturePromoResult MaybeShowPromo( - const base::Feature& iph_feature, - BubbleCloseCallback close_callback = base::DoNothing(), - FeaturePromoSpecification::FormatParameters body_params = - FeaturePromoSpecification::NoSubstitution(), - FeaturePromoSpecification::FormatParameters title_params = - FeaturePromoSpecification::NoSubstitution()) override; - bool MaybeShowStartupPromo( - const base::Feature& iph_feature, - StartupPromoCallback promo_callback = base::DoNothing(), - BubbleCloseCallback close_callback = base::DoNothing(), - FeaturePromoSpecification::FormatParameters body_params = - FeaturePromoSpecification::NoSubstitution(), - FeaturePromoSpecification::FormatParameters title_params = - FeaturePromoSpecification::NoSubstitution()) override; + FeaturePromoResult MaybeShowPromo(FeaturePromoParams params) override; + bool MaybeShowStartupPromo(FeaturePromoParams params) override; FeaturePromoStatus GetPromoStatus( const base::Feature& iph_feature) const override; bool HasPromoBeenDismissed(const base::Feature& iph_feature, FeaturePromoStorageService::CloseReason* close_reason = nullptr) const override; FeaturePromoResult MaybeShowPromoForDemoPage( - const base::Feature& iph_feature, - BubbleCloseCallback close_callback = base::DoNothing(), - FeaturePromoSpecification::FormatParameters body_params = - FeaturePromoSpecification::NoSubstitution(), - FeaturePromoSpecification::FormatParameters title_params = - FeaturePromoSpecification::NoSubstitution()) override; + FeaturePromoParams params) override; bool EndPromo(const base::Feature& iph_feature, FeaturePromoCloseReason close_reason) override; FeaturePromoHandle CloseBubbleAndContinuePromo( @@ -309,12 +257,8 @@ friend FeaturePromoLifecycleUiTest; // Common logic for showing feature promos. - FeaturePromoResult MaybeShowPromoCommon( - const base::Feature& iph_feature, - bool for_demo, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params); + FeaturePromoResult MaybeShowPromoCommon(FeaturePromoParams params, + bool for_demo); const FeaturePromoStorageService* storage_service() const { return storage_service_; @@ -405,10 +349,7 @@ // Handles firing async promos. void OnFeatureEngagementTrackerInitialized( - const base::Feature* iph_feature, - BubbleCloseCallback close_callback, - FeaturePromoSpecification::FormatParameters body_params, - FeaturePromoSpecification::FormatParameters title_params, + FeaturePromoParams params, bool tracker_initialized_successfully); // Performs common logic for determining if a feature promo for `iph_feature` @@ -531,6 +472,40 @@ static bool active_window_check_blocked_; }; +// Params for showing a promo; you can pass a single feature or add additional +// params as necessary. Replaces the old parameter list as it was (a) long and +// unwieldy, and (b) violated the prohibition on optional parameters in virtual +// methods. +struct FeaturePromoParams { + // NOLINTNEXTLINE(google-explicit-constructor) + FeaturePromoParams(const base::Feature& iph_feature); + FeaturePromoParams(FeaturePromoParams&& other); + ~FeaturePromoParams(); + + // The feature for the IPH to show. Must be an IPH feature defined in + // components/feature_engagement/public/feature_list.cc and registered with + // |FeaturePromoRegistry|. + // + // Note that this is different than the feature that the IPH is showing for. + raw_ref<const base::Feature> feature; + + // Used for startup promos; will be called when the promo actually shows. + FeaturePromoController::StartupPromoCallback startup_callback; + + // If a bubble was shown and `close_callback` is provided, it will be called + // when the bubble closes. The callback must remain valid as long as the + // bubble shows. + FeaturePromoController::BubbleCloseCallback close_callback; + + // If the body text is parameterized, pass parameters here. + FeaturePromoSpecification::FormatParameters body_params = + FeaturePromoSpecification::NoSubstitution(); + + // If the title text is parameterized, pass parameters here. + FeaturePromoSpecification::FormatParameters title_params = + FeaturePromoSpecification::NoSubstitution(); +}; + } // namespace user_education #endif // COMPONENTS_USER_EDUCATION_COMMON_FEATURE_PROMO_CONTROLLER_H_
diff --git a/components/user_education/test/mock_feature_promo_controller.cc b/components/user_education/test/mock_feature_promo_controller.cc index 548afa9..ba08f2b 100644 --- a/components/user_education/test/mock_feature_promo_controller.cc +++ b/components/user_education/test/mock_feature_promo_controller.cc
@@ -14,4 +14,27 @@ return weak_ptr_factory_.GetWeakPtr(); } +FeaturePromoParamsMatcher::FeaturePromoParamsMatcher( + const base::Feature& feature) + : feature_(feature) {} +FeaturePromoParamsMatcher::FeaturePromoParamsMatcher( + const FeaturePromoParamsMatcher&) = default; +FeaturePromoParamsMatcher::~FeaturePromoParamsMatcher() = default; +FeaturePromoParamsMatcher& FeaturePromoParamsMatcher::operator=( + const FeaturePromoParamsMatcher&) = default; + +bool FeaturePromoParamsMatcher::MatchAndExplain( + const FeaturePromoParams& params, + std::ostream*) const { + return ¶ms.feature.get() == &feature_.get(); +} + +void FeaturePromoParamsMatcher::DescribeTo(std::ostream* os) const { + *os << "FeaturePromoParams has feature " << feature_->name; +} + +void FeaturePromoParamsMatcher::DescribeNegationTo(std::ostream* os) const { + *os << "FeaturePromoParams does not have feature " << feature_->name; +} + } // namespace user_education::test
diff --git a/components/user_education/test/mock_feature_promo_controller.h b/components/user_education/test/mock_feature_promo_controller.h index caab178b..625179f3 100644 --- a/components/user_education/test/mock_feature_promo_controller.h +++ b/components/user_education/test/mock_feature_promo_controller.h
@@ -26,25 +26,12 @@ (const, override)); MOCK_METHOD(FeaturePromoResult, MaybeShowPromo, - (const base::Feature&, - BubbleCloseCallback, - FeaturePromoSpecification::FormatParameters, - FeaturePromoSpecification::FormatParameters), + (FeaturePromoParams), (override)); - MOCK_METHOD(bool, - MaybeShowStartupPromo, - (const base::Feature&, - StartupPromoCallback, - BubbleCloseCallback, - FeaturePromoSpecification::FormatParameters, - FeaturePromoSpecification::FormatParameters), - (override)); + MOCK_METHOD(bool, MaybeShowStartupPromo, (FeaturePromoParams), (override)); MOCK_METHOD(FeaturePromoResult, MaybeShowPromoForDemoPage, - (const base::Feature&, - BubbleCloseCallback, - FeaturePromoSpecification::FormatParameters, - FeaturePromoSpecification::FormatParameters), + (FeaturePromoParams), (override)); MOCK_METHOD(FeaturePromoStatus, GetPromoStatus, @@ -74,6 +61,29 @@ base::WeakPtrFactory<MockFeaturePromoController> weak_ptr_factory_{this}; }; +class FeaturePromoParamsMatcher { + public: + explicit FeaturePromoParamsMatcher(const base::Feature& feature); + FeaturePromoParamsMatcher(const FeaturePromoParamsMatcher&); + ~FeaturePromoParamsMatcher(); + FeaturePromoParamsMatcher& operator=(const FeaturePromoParamsMatcher&); + + using is_gtest_matcher = void; + + bool MatchAndExplain(const FeaturePromoParams&, std::ostream*) const; + void DescribeTo(std::ostream*) const; + void DescribeNegationTo(std::ostream*) const; + + private: + base::raw_ref<const base::Feature> feature_; +}; + +template <typename... Args> +testing::Matcher<FeaturePromoParams> MatchFeaturePromoParams(Args&&... args) { + return testing::Matcher<FeaturePromoParams>( + FeaturePromoParamsMatcher(std::forward<Args>(args)...)); +} + } // namespace user_education::test #endif // COMPONENTS_USER_EDUCATION_TEST_MOCK_FEATURE_PROMO_CONTROLLER_H_
diff --git a/components/vector_icons/BUILD.gn b/components/vector_icons/BUILD.gn index cc8766b5..e6749d7 100644 --- a/components/vector_icons/BUILD.gn +++ b/components/vector_icons/BUILD.gn
@@ -240,7 +240,6 @@ if (is_chrome_branded) { sources += [ - "google_chrome/assistant.icon", "google_chrome/google_calendar.icon", "google_chrome/google_chrome_webstore.icon", "google_chrome/google_docs.icon",
diff --git a/components/viz/service/display/display_damage_tracker.cc b/components/viz/service/display/display_damage_tracker.cc index e3d307f2..fe0c2a2 100644 --- a/components/viz/service/display/display_damage_tracker.cc +++ b/components/viz/service/display/display_damage_tracker.cc
@@ -99,7 +99,8 @@ const BeginFrameAck& ack, bool display_damaged, HandleInteraction handle_interaction) { - TRACE_EVENT1("viz", "DisplayDamageTracker::SurfaceDamaged", "surface_id", + TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("viz.surface_lifetime"), + "DisplayDamageTracker::SurfaceDamaged", "surface_id", surface_id.ToString()); has_surface_damage_due_to_interaction_ |= @@ -227,8 +228,9 @@ void DisplayDamageTracker::OnSurfaceDamageExpected(const SurfaceId& surface_id, const BeginFrameArgs& args) { - TRACE_EVENT1("viz", "DisplayDamageTracker::SurfaceDamageExpected", - "surface_id", surface_id.ToString()); + TRACE_EVENT1(TRACE_DISABLED_BY_DEFAULT("viz.surface_lifetime"), + "DisplayDamageTracker::SurfaceDamageExpected", "surface_id", + surface_id.ToString()); // Insert a new state for the surface if we don't know of it yet. We don't // use OnSurfaceCreated() for this, because it may not be called if a
diff --git a/components/viz/test/test_raster_interface.h b/components/viz/test/test_raster_interface.h index ece7fd5..49afcbc 100644 --- a/components/viz/test/test_raster_interface.h +++ b/components/viz/test/test_raster_interface.h
@@ -94,6 +94,10 @@ const SkYUVAPixmaps& src_yuv_pixmap) override {} void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, SkYUVColorSpace planes_yuv_color_space, const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config,
diff --git a/components/webapps/browser/android/BUILD.gn b/components/webapps/browser/android/BUILD.gn index 9b94f43..003a554 100644 --- a/components/webapps/browser/android/BUILD.gn +++ b/components/webapps/browser/android/BUILD.gn
@@ -105,8 +105,7 @@ "java/res/drawable-xxxhdpi/google_play.png", "java/res/drawable-xxxhdpi/star_gray.png", "java/res/drawable-xxxhdpi/star_green.png", - "java/res/drawable/pwa_restore_icon_dark.xml", - "java/res/drawable/pwa_restore_icon_light.xml", + "java/res/drawable/pwa_restore_icon.xml", "java/res/drawable/rating_bar.xml", "java/res/layout/add_to_homescreen_dialog.xml", "java/res/layout/image_zoom_view.xml", @@ -118,6 +117,8 @@ "java/res/mipmap-xhdpi/shortcut_icon_shadow.png", "java/res/mipmap-xxhdpi/shortcut_icon_shadow.png", "java/res/mipmap-xxxhdpi/shortcut_icon_shadow.png", + "java/res/values-night/colors.xml", + "java/res/values/colors.xml", "java/res/values/dimens.xml", "java/res/values/styles.xml", ]
diff --git a/components/webapps/browser/android/java/res/drawable/pwa_restore_icon.xml b/components/webapps/browser/android/java/res/drawable/pwa_restore_icon.xml new file mode 100644 index 0000000..69018c4 --- /dev/null +++ b/components/webapps/browser/android/java/res/drawable/pwa_restore_icon.xml
@@ -0,0 +1,89 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<vector xmlns:android="http://schemas.android.com/apk/res/android" + android:width="160dp" + android:height="62dp" + android:viewportWidth="160" + android:viewportHeight="62"> + <path + android:pathData="M61.01,50.69C54.93,44.61 54.93,34.76 61.01,28.68L66,23.68V45C66,46.1 66.9,47 68,47H76V51C76,52.1 76.9,53 78,53H80.08C74.09,56.63 66.18,55.86 61.01,50.69Z" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M94,39.71L99.69,34.02C105.77,27.94 105.77,18.09 99.69,12.01C94.88,7.19 87.7,6.19 81.9,9H82C83.1,9 84,9.9 84,11V15H92C93.1,15 94,15.9 94,17V39.71Z" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M75,35m-2,-0a2,2 0,1 0,4 -0a2,2 0,1 0,-4 -0" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M75,29m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" + android:fillColor="@color/pwa_restore_illustration_primary"/> + <path + android:pathData="M70,43L75,43A1,1 0,0 1,76 44L76,44A1,1 0,0 1,75 45L70,45A1,1 0,0 1,69 44L69,44A1,1 0,0 1,70 43z" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M68,11m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + <path + android:strokeWidth="1" + android:pathData="M70,23m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" + android:fillColor="@android:color/transparent" + android:strokeColor="@color/pwa_restore_illustration_secondary"/> + <path + android:strokeWidth="1" + android:pathData="M70,35m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" + android:fillColor="@android:color/transparent" + android:strokeColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M70,29m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" + android:fillColor="@color/pwa_restore_illustration_primary"/> + <path + android:pathData="M90,41m-2,-0a2,2 0,1 0,4 -0a2,2 0,1 0,-4 -0" + android:fillColor="@color/pwa_restore_illustration_primary"/> + <path + android:strokeWidth="1" + android:pathData="M90,35m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" + android:fillColor="@android:color/transparent" + android:strokeColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M80,49L90,49A1,1 0,0 1,91 50L91,50A1,1 0,0 1,90 51L80,51A1,1 0,0 1,79 50L79,50A1,1 0,0 1,80 49z" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + <group> + <clip-path + android:pathData="M68,8C66.34,8 65,9.34 65,11V45C65,46.66 66.34,48 68,48H76V17C76,15.9 76.9,15 78,15H85V11C85,9.34 83.66,8 82,8H68Z" + android:fillType="evenOdd"/> + <path + android:pathData="M76,48V49H77V48H76ZM85,15V16H86V15H85ZM66,11C66,9.9 66.9,9 68,9V7C65.79,7 64,8.79 64,11H66ZM66,45V11H64V45H66ZM68,47C66.9,47 66,46.1 66,45H64C64,47.21 65.79,49 68,49V47ZM76,47H68V49H76V47ZM77,48V17H75V48H77ZM77,17C77,16.45 77.45,16 78,16V14C76.34,14 75,15.34 75,17H77ZM78,16H85V14H78V16ZM84,11V15H86V11H84ZM82,9C83.1,9 84,9.9 84,11H86C86,8.79 84.21,7 82,7V9ZM68,9H82V7H68V9Z" + android:fillColor="@color/pwa_restore_illustration_secondary"/> + </group> + <path + android:strokeWidth="1" + android:pathData="M78,14.5L92,14.5A2.5,2.5 0,0 1,94.5 17L94.5,51A2.5,2.5 0,0 1,92 53.5L78,53.5A2.5,2.5 0,0 1,75.5 51L75.5,17A2.5,2.5 0,0 1,78 14.5z" + android:fillColor="@android:color/transparent" + android:strokeColor="@color/pwa_restore_illustration_primary"/> + <path + android:strokeWidth="1" + android:pathData="M80,41m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" + android:fillColor="@android:color/transparent" + android:strokeColor="@color/pwa_restore_illustration_secondary"/> + <path + android:pathData="M78,15C76.9,15 76,15.9 76,17V47H82C83.1,47 84,46.1 84,45V15H78ZM80,31C81.1,31 82,30.1 82,29C82,27.9 81.1,27 80,27C78.9,27 78,27.9 78,29C78,30.1 78.9,31 80,31Z" + android:fillColor="@color/pwa_restore_illustration_secondary" + android:fillType="evenOdd"/> + <path + android:pathData="M85,41m-2,-0a2,2 0,1 0,4 -0a2,2 0,1 0,-4 -0" + android:fillColor="@color/pwa_restore_illustration_primary"/> + <path + android:pathData="M80,35m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" + android:fillColor="@color/pwa_restore_illustration_primary"/> + <path + android:pathData="M85,35m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" + android:fillColor="@color/pwa_restore_illustration_primary"/> + <path + android:pathData="M78,17m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" + android:fillColor="@color/pwa_restore_illustration_primary"/> +</vector>
diff --git a/components/webapps/browser/android/java/res/drawable/pwa_restore_icon_dark.xml b/components/webapps/browser/android/java/res/drawable/pwa_restore_icon_dark.xml deleted file mode 100644 index 7100762..0000000 --- a/components/webapps/browser/android/java/res/drawable/pwa_restore_icon_dark.xml +++ /dev/null
@@ -1,98 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="160dp" - android:height="62dp" - android:viewportWidth="160" - android:viewportHeight="62"> - <path - android:strokeWidth="1" - android:pathData="M68.5,8.5L81.5,8.5A2.5,2.5 0,0 1,84 11L84,44A2.5,2.5 0,0 1,81.5 46.5L68.5,46.5A2.5,2.5 0,0 1,66 44L66,11A2.5,2.5 0,0 1,68.5 8.5z" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:strokeWidth="1" - android:pathData="M70,23.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M70,30m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#7CACF8"/> - <path - android:strokeWidth="1" - android:pathData="M80,30m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#ffffff"/> - <path - android:pathData="M80,36.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#ffffff"/> - <path - android:strokeWidth="1" - android:pathData="M70,36.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M75.5,50.5V46H81.5C82.6,46 83.5,45.1 83.5,44V14.5H91.5C93.16,14.5 94.5,15.84 94.5,17.5V50.5C94.5,52.16 93.16,53.5 91.5,53.5H78.5C76.84,53.5 75.5,52.16 75.5,50.5ZM91,48.5C91.55,48.5 92,48.95 92,49.5C92,50.05 91.55,50.5 91,50.5H79C78.45,50.5 78,50.05 78,49.5C78,48.95 78.45,48.5 79,48.5H91Z" - android:fillType="evenOdd"> - <aapt:attr name="android:fillColor"> - <gradient - android:startX="95.5" - android:startY="23" - android:endX="77.19" - android:endY="48.35" - android:type="linear"> - <item android:offset="0" android:color="#000B57D0"/> - <item android:offset="0.95" android:color="#FF0B57D0"/> - </gradient> - </aapt:attr> - </path> - <path - android:strokeWidth="1" - android:pathData="M78.5,15L91.5,15A2.5,2.5 0,0 1,94 17.5L94,50.5A2.5,2.5 0,0 1,91.5 53L78.5,53A2.5,2.5 0,0 1,76 50.5L76,17.5A2.5,2.5 0,0 1,78.5 15z" - android:fillColor="#00000000" - android:strokeColor="#4C8DF6"/> - <path - android:pathData="M78.5,17.5m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" - android:fillColor="#4C8DF6"/> - <path - android:pathData="M68.5,11m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" - android:fillColor="#0B57D0"/> - <path - android:strokeWidth="1" - android:pathData="M80,30m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M85,43m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#7CACF8"/> - <path - android:strokeWidth="1" - android:pathData="M90,36.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M90,43m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#7CACF8"/> - <path - android:pathData="M85,36.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#7CACF8"/> - <path - android:pathData="M80,36.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#7CACF8"/> - <path - android:strokeWidth="1" - android:pathData="M80,43m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#0B57D0"/> - <path - android:pathData="M63.42,23.58L65.5,21.5V44C65.5,45.66 66.84,47 68.5,47H75.5V50.5C75.5,50.94 75.6,51.36 75.77,51.74C71.32,51.92 66.81,50.32 63.42,46.92C56.97,40.48 56.97,30.03 63.42,23.58ZM94.5,39.17L96.68,36.99C103.12,30.55 103.12,20.1 96.68,13.66C93.1,10.08 88.3,8.49 83.63,8.88C84.17,9.43 84.5,10.17 84.5,11V14.5H91.5C93.16,14.5 94.5,15.84 94.5,17.5V39.17Z" - android:fillColor="#0B57D0" - android:fillType="evenOdd"/> - <path - android:pathData="M75.5,28.06C75.34,28.02 75.17,28 75,28C73.9,28 73,28.9 73,30C73,31.1 73.9,32 75,32C75.17,32 75.34,31.98 75.5,31.94V28.06Z" - android:fillColor="#7CACF8" - android:fillType="evenOdd"/> - <path - android:pathData="M75.5,34.56C75.34,34.52 75.17,34.5 75,34.5C73.9,34.5 73,35.4 73,36.5C73,37.6 73.9,38.5 75,38.5C75.17,38.5 75.34,38.48 75.5,38.44V34.56Z" - android:fillColor="#A8C7FA" - android:fillType="evenOdd"/> -</vector>
diff --git a/components/webapps/browser/android/java/res/drawable/pwa_restore_icon_light.xml b/components/webapps/browser/android/java/res/drawable/pwa_restore_icon_light.xml deleted file mode 100644 index fe28196..0000000 --- a/components/webapps/browser/android/java/res/drawable/pwa_restore_icon_light.xml +++ /dev/null
@@ -1,98 +0,0 @@ -<vector xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:aapt="http://schemas.android.com/aapt" - android:width="160dp" - android:height="62dp" - android:viewportWidth="160" - android:viewportHeight="62"> - <path - android:strokeWidth="1" - android:pathData="M68.5,8.5L81.5,8.5A2.5,2.5 0,0 1,84 11L84,44A2.5,2.5 0,0 1,81.5 46.5L68.5,46.5A2.5,2.5 0,0 1,66 44L66,11A2.5,2.5 0,0 1,68.5 8.5z" - android:fillColor="#00000000" - android:strokeColor="#A8C7FA"/> - <path - android:strokeWidth="1" - android:pathData="M70,23.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#A8C7FA"/> - <path - android:pathData="M70,30m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#1B6EF3"/> - <path - android:strokeWidth="1" - android:pathData="M80,30m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#ffffff"/> - <path - android:pathData="M80,36.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#ffffff"/> - <path - android:strokeWidth="1" - android:pathData="M70,36.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#A8C7FA"/> - <path - android:pathData="M75.5,50.5V46H81.5C82.6,46 83.5,45.1 83.5,44V14.5H91.5C93.16,14.5 94.5,15.84 94.5,17.5V50.5C94.5,52.16 93.16,53.5 91.5,53.5H78.5C76.84,53.5 75.5,52.16 75.5,50.5ZM91,48.5C91.55,48.5 92,48.95 92,49.5C92,50.05 91.55,50.5 91,50.5H79C78.45,50.5 78,50.05 78,49.5C78,48.95 78.45,48.5 79,48.5H91Z" - android:fillType="evenOdd"> - <aapt:attr name="android:fillColor"> - <gradient - android:startX="95.5" - android:startY="23" - android:endX="77.19" - android:endY="48.35" - android:type="linear"> - <item android:offset="0" android:color="#00A8C7FA"/> - <item android:offset="0.95" android:color="#FFA8C7FA"/> - </gradient> - </aapt:attr> - </path> - <path - android:strokeWidth="1" - android:pathData="M78.5,15L91.5,15A2.5,2.5 0,0 1,94 17.5L94,50.5A2.5,2.5 0,0 1,91.5 53L78.5,53A2.5,2.5 0,0 1,76 50.5L76,17.5A2.5,2.5 0,0 1,78.5 15z" - android:fillColor="#00000000" - android:strokeColor="#4C8DF6"/> - <path - android:pathData="M78.5,17.5m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" - android:fillColor="#4C8DF6"/> - <path - android:pathData="M68.5,11m-1,0a1,1 0,1 1,2 0a1,1 0,1 1,-2 0" - android:fillColor="#A8C7FA"/> - <path - android:strokeWidth="1" - android:pathData="M80,30m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#A8C7FA"/> - <path - android:pathData="M85,43m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#1B6EF3"/> - <path - android:strokeWidth="1" - android:pathData="M90,36.5m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#A8C7FA"/> - <path - android:pathData="M90,43m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#1B6EF3"/> - <path - android:pathData="M85,36.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#1B6EF3"/> - <path - android:pathData="M80,36.5m-2,0a2,2 0,1 1,4 0a2,2 0,1 1,-4 0" - android:fillColor="#1B6EF3"/> - <path - android:strokeWidth="1" - android:pathData="M80,43m-1.5,0a1.5,1.5 0,1 1,3 0a1.5,1.5 0,1 1,-3 0" - android:fillColor="#00000000" - android:strokeColor="#A8C7FA"/> - <path - android:pathData="M63.42,23.58L65.5,21.5V44C65.5,45.66 66.84,47 68.5,47H75.5V50.5C75.5,50.94 75.6,51.36 75.77,51.74C71.32,51.92 66.81,50.32 63.42,46.92C56.97,40.48 56.97,30.03 63.42,23.58ZM94.5,39.17L96.68,36.99C103.12,30.55 103.12,20.1 96.68,13.66C93.1,10.08 88.3,8.49 83.63,8.88C84.17,9.43 84.5,10.17 84.5,11V14.5H91.5C93.16,14.5 94.5,15.84 94.5,17.5V39.17Z" - android:fillColor="#A8C7FA" - android:fillType="evenOdd"/> - <path - android:pathData="M75.5,28.06C75.34,28.02 75.17,28 75,28C73.9,28 73,28.9 73,30C73,31.1 73.9,32 75,32C75.17,32 75.34,31.98 75.5,31.94V28.06Z" - android:fillColor="#1B6EF3" - android:fillType="evenOdd"/> - <path - android:pathData="M75.5,34.56C75.34,34.52 75.17,34.5 75,34.5C73.9,34.5 73,35.4 73,36.5C73,37.6 73.9,38.5 75,38.5C75.17,38.5 75.34,38.48 75.5,38.44V34.56Z" - android:fillColor="#A8C7FA" - android:fillType="evenOdd"/> -</vector>
diff --git a/components/webapps/browser/android/java/res/values-night/colors.xml b/components/webapps/browser/android/java/res/values-night/colors.xml new file mode 100644 index 0000000..487302e4 --- /dev/null +++ b/components/webapps/browser/android/java/res/values-night/colors.xml
@@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<resources> + <!-- PWA Restore illustration colors --> + <color name="pwa_restore_illustration_primary">@color/material_primary_80</color> + <color name="pwa_restore_illustration_secondary">@color/material_primary_40</color> +</resources>
diff --git a/components/webapps/browser/android/java/res/values/colors.xml b/components/webapps/browser/android/java/res/values/colors.xml new file mode 100644 index 0000000..57b8994 --- /dev/null +++ b/components/webapps/browser/android/java/res/values/colors.xml
@@ -0,0 +1,12 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +Copyright 2023 The Chromium Authors +Use of this source code is governed by a BSD-style license that can be +found in the LICENSE file. +--> + +<resources> + <!-- PWA Restore illustration colors --> + <color name="pwa_restore_illustration_primary">@color/material_primary_40</color> + <color name="pwa_restore_illustration_secondary">@color/material_primary_80</color> +</resources>
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetCoordinatorTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetCoordinatorTest.java index d166445..fc0df9f 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetCoordinatorTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetCoordinatorTest.java
@@ -13,7 +13,6 @@ import android.view.View; import android.widget.TextView; -import androidx.core.content.ContextCompat; import androidx.test.filters.MediumTest; import org.junit.After; @@ -61,21 +60,9 @@ public void testViewInitialization() { PwaRestoreBottomSheetCoordinator coordinator = new PwaRestoreBottomSheetCoordinator( mActivity, mBottomSheetControllerMock, /* backArrowId= */ 0); - PwaRestoreBottomSheetCoordinator coordinatorDarkMode = new PwaRestoreBottomSheetCoordinator( - mActivity, mBottomSheetControllerMock, /* backArrowId= */ 0); - - ContextCompat.getDrawable(mActivity, R.drawable.pwa_restore_icon_dark); View bottomSheetView = coordinator.getBottomSheetToolbarViewForTesting(); - View bottomSheetViewDarkMode = coordinatorDarkMode.getBottomSheetToolbarViewForTesting(); { - Assert.assertFalse(bottomSheetView.findViewById(R.id.icon) - .getBackground() - .getConstantState() - .equals(bottomSheetViewDarkMode.findViewById(R.id.icon) - .getBackground() - .getConstantState())); - TextView title = bottomSheetView.findViewById(R.id.title); String expected = "Restore your web apps"; Assert.assertEquals(expected, title.getText()); @@ -107,25 +94,6 @@ @Test @MediumTest - public void testDarkModeIcon() { - PwaRestoreBottomSheetCoordinator coordinatorLightMode = - new PwaRestoreBottomSheetCoordinator( - mActivity, mBottomSheetControllerMock, /* backArrowId= */ 0); - ShadowColorUtils.sInNightMode = true; - PwaRestoreBottomSheetCoordinator coordinatorDarkMode = new PwaRestoreBottomSheetCoordinator( - mActivity, mBottomSheetControllerMock, /* backArrowId= */ 0); - - View sheetLightMode = coordinatorLightMode.getBottomSheetToolbarViewForTesting(); - View sheetDarkMode = coordinatorDarkMode.getBottomSheetToolbarViewForTesting(); - - Assert.assertEquals( - R.drawable.pwa_restore_icon_light, sheetLightMode.findViewById(R.id.icon).getTag()); - Assert.assertEquals( - R.drawable.pwa_restore_icon_dark, sheetDarkMode.findViewById(R.id.icon).getTag()); - } - - @Test - @MediumTest public void testShowAndExpand() { PwaRestoreBottomSheetCoordinator coordinator = new PwaRestoreBottomSheetCoordinator( mActivity, mBottomSheetControllerMock, /* backArrowId= */ 0);
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetView.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetView.java index 83a5d088..7f3b00dd 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetView.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetView.java
@@ -18,7 +18,6 @@ import org.chromium.components.webapps.R; import org.chromium.components.webapps.pwa_restore_ui.PwaRestoreProperties.ViewState; -import org.chromium.ui.util.ColorUtils; /** * The view portion of the PWA Install bottom sheet. @@ -54,10 +53,9 @@ mContentView = LayoutInflater.from(mContext).inflate( R.layout.pwa_restore_bottom_sheet_content, /* root= */ null); - int id = ColorUtils.inNightMode(mContext) ? R.drawable.pwa_restore_icon_dark - : R.drawable.pwa_restore_icon_light; - mPreviewView.findViewById(R.id.icon).setBackgroundResource(id); - mPreviewView.findViewById(R.id.icon).setTag(id); + int backgroundId = R.drawable.pwa_restore_icon; + mPreviewView.findViewById(R.id.icon).setBackgroundResource(backgroundId); + mPreviewView.findViewById(R.id.icon).setTag(backgroundId); mBackArrow = backArrowId != 0 ? ResourcesCompat.getDrawable( mContext.getResources(), backArrowId, mContext.getTheme()) : null;
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index fa73ef3..8e64c60 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -2556,8 +2556,15 @@ RunHtmlTest(FILE_PATH_LITERAL("id.html")); } +// Flaky on Android - crbug.com/1488592 +#if BUILDFLAG(IS_ANDROID) +#define MAYBE_AccessibilityImgFormFormControls \ + DISABLED_AccessibilityImgFormFormControls +#else +#define MAYBE_AccessibilityImgFormFormControls AccessibilityImgFormFormControls +#endif IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, - AccessibilityImgFormFormControls) { + MAYBE_AccessibilityImgFormFormControls) { RunFormControlsTest(FILE_PATH_LITERAL("img-form.html")); }
diff --git a/content/browser/attribution_reporting/attribution_config.cc b/content/browser/attribution_reporting/attribution_config.cc index feb45fb..af9584b 100644 --- a/content/browser/attribution_reporting/attribution_config.cc +++ b/content/browser/attribution_reporting/attribution_config.cc
@@ -20,26 +20,6 @@ AttributionConfig::RateLimitConfig:: kDefaultMaxReportingOriginsPerSourceReportingSite}; -const base::FeatureParam<base::TimeDelta> kFirstNavigationReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "first_report_window_deadline", - AttributionConfig::EventLevelLimit::kDefaultFirstReportWindowDeadline}; - -const base::FeatureParam<base::TimeDelta> kSecondNavigationReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "second_report_window_deadline", - AttributionConfig::EventLevelLimit::kDefaultSecondReportWindowDeadline}; - -const base::FeatureParam<base::TimeDelta> kFirstEventReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "first_event_report_window_deadline", - AttributionConfig::EventLevelLimit::kDefaultFirstReportWindowDeadline}; - -const base::FeatureParam<base::TimeDelta> kSecondEventReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "second_event_report_window_deadline", - AttributionConfig::EventLevelLimit::kDefaultSecondReportWindowDeadline}; - const base::FeatureParam<base::TimeDelta> kAggregateReportMinDelay{ &attribution_reporting::features::kConversionMeasurement, "aggregate_report_min_delay", @@ -60,13 +40,6 @@ "event_max_info_gain", AttributionConfig::EventLevelLimit::kDefaultMaxEventInfoGain}; -bool AreReportWindowDeadlinesValid( - base::TimeDelta first_report_window_deadline, - base::TimeDelta second_report_window_deadline) { - return !first_report_window_deadline.is_negative() && - first_report_window_deadline < second_report_window_deadline; -} - } // namespace bool AttributionConfig::Validate() const { @@ -154,17 +127,6 @@ return false; } - if (!AreReportWindowDeadlinesValid( - first_navigation_report_window_deadline, - second_navigation_report_window_deadline)) { - return false; - } - - if (!AreReportWindowDeadlinesValid(first_event_report_window_deadline, - second_event_report_window_deadline)) { - return false; - } - return true; } @@ -212,29 +174,8 @@ AttributionConfig& AttributionConfig::operator=(AttributionConfig&&) = default; AttributionConfig::EventLevelLimit::EventLevelLimit() - : first_navigation_report_window_deadline( - kFirstNavigationReportWindowDeadline.Get()), - second_navigation_report_window_deadline( - kSecondNavigationReportWindowDeadline.Get()), - first_event_report_window_deadline(kFirstEventReportWindowDeadline.Get()), - second_event_report_window_deadline( - kSecondEventReportWindowDeadline.Get()), - max_navigation_info_gain(kNavigationMaxInfoGain.Get()), - max_event_info_gain(kEventMaxInfoGain.Get()) { - if (!AreReportWindowDeadlinesValid( - first_navigation_report_window_deadline, - second_navigation_report_window_deadline)) { - first_navigation_report_window_deadline = kDefaultFirstReportWindowDeadline; - second_navigation_report_window_deadline = - kDefaultSecondReportWindowDeadline; - } - - if (!AreReportWindowDeadlinesValid(first_event_report_window_deadline, - second_event_report_window_deadline)) { - first_event_report_window_deadline = kDefaultFirstReportWindowDeadline; - second_event_report_window_deadline = kDefaultSecondReportWindowDeadline; - } -} + : max_navigation_info_gain(kNavigationMaxInfoGain.Get()), + max_event_info_gain(kEventMaxInfoGain.Get()) {} AttributionConfig::EventLevelLimit::EventLevelLimit(const EventLevelLimit&) = default;
diff --git a/content/browser/attribution_reporting/attribution_config.h b/content/browser/attribution_reporting/attribution_config.h index f8444dfa..12b7586 100644 --- a/content/browser/attribution_reporting/attribution_config.h +++ b/content/browser/attribution_reporting/attribution_config.h
@@ -82,25 +82,6 @@ // destination. int max_reports_per_destination = 1024; - // Default constants for report window deadlines. - static constexpr base::TimeDelta kDefaultFirstReportWindowDeadline = - base::Days(2); - static constexpr base::TimeDelta kDefaultSecondReportWindowDeadline = - base::Days(7); - - // Controls the report window deadlines for scheduling navigation report - // times. - base::TimeDelta first_navigation_report_window_deadline = - kDefaultFirstReportWindowDeadline; - base::TimeDelta second_navigation_report_window_deadline = - kDefaultSecondReportWindowDeadline; - - // Controls the report window deadlines for scheduling event report times. - base::TimeDelta first_event_report_window_deadline = - kDefaultFirstReportWindowDeadline; - base::TimeDelta second_event_report_window_deadline = - kDefaultSecondReportWindowDeadline; - // Default constants for max info gain in bits per source type. // Rounded up to nearest e-5 digit. static constexpr double kDefaultMaxNavigationInfoGain = 11.46173;
diff --git a/content/browser/attribution_reporting/attribution_constants.h b/content/browser/attribution_reporting/attribution_constants.h index 6d4ca61..d55e7b0 100644 --- a/content/browser/attribution_reporting/attribution_constants.h +++ b/content/browser/attribution_reporting/attribution_constants.h
@@ -5,6 +5,8 @@ #ifndef CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONSTANTS_H_ #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONSTANTS_H_ +#include "base/time/time.h" + namespace content { constexpr char kAttributionReportingRegisterSourceHeader[] = @@ -13,6 +15,11 @@ constexpr char kAttributionReportingRegisterOsSourceHeader[] = "Attribution-Reporting-Register-OS-Source"; +// TODO(crbug.com/1479944): Relocate these constants to +// //components/attribution_reporting/event_report_windows.cc. +constexpr base::TimeDelta kDefaultNavigationReportWindow1 = base::Days(2); +constexpr base::TimeDelta kDefaultNavigationReportWindow2 = base::Days(7); + } // namespace content #endif // CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_CONSTANTS_H_
diff --git a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc index f0350b2..26d4f61 100644 --- a/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_data_host_manager_impl_unittest.cc
@@ -484,6 +484,7 @@ SourceRegistration source_data(*DestinationSet::Create({destination_site})); // Non-whole-day expiry is invalid for `SourceType::kEvent`. source_data.expiry = base::Days(1) + base::Microseconds(1); + source_data.aggregatable_report_window = source_data.expiry; { mojo::test::BadMessageObserver bad_message_observer;
diff --git a/content/browser/attribution_reporting/attribution_features.cc b/content/browser/attribution_reporting/attribution_features.cc index bd86ed6b..6972f387 100644 --- a/content/browser/attribution_reporting/attribution_features.cc +++ b/content/browser/attribution_reporting/attribution_features.cc
@@ -5,8 +5,6 @@ #include "content/browser/attribution_reporting/attribution_features.h" #include "base/feature_list.h" -#include "base/metrics/field_trial_params.h" -#include "components/attribution_reporting/features.h" namespace content { @@ -21,9 +19,4 @@ "AttributionVerboseDebugReporting", base::FEATURE_ENABLED_BY_DEFAULT); -const base::FeatureParam<bool> kVTCEarlyReportingWindows( - &attribution_reporting::features::kConversionMeasurement, - "vtc_early_reporting_windows", - false); - } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_features.h b/content/browser/attribution_reporting/attribution_features.h index 4535a3a..efa9915 100644 --- a/content/browser/attribution_reporting/attribution_features.h +++ b/content/browser/attribution_reporting/attribution_features.h
@@ -6,16 +6,14 @@ #define CONTENT_BROWSER_ATTRIBUTION_REPORTING_ATTRIBUTION_FEATURES_H_ #include "base/feature_list.h" -#include "base/metrics/field_trial_params.h" #include "content/common/content_export.h" namespace content { CONTENT_EXPORT BASE_DECLARE_FEATURE( kAttributionStorageUseBuiltInRecoveryIfSupported); -CONTENT_EXPORT BASE_DECLARE_FEATURE(kAttributionVerboseDebugReporting); -CONTENT_EXPORT extern const base::FeatureParam<bool> kVTCEarlyReportingWindows; +CONTENT_EXPORT BASE_DECLARE_FEATURE(kAttributionVerboseDebugReporting); } // namespace content
diff --git a/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc b/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc index 5ebb8db..da6c1b0 100644 --- a/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc +++ b/content/browser/attribution_reporting/attribution_interop_parser_unittest.cc
@@ -45,10 +45,6 @@ config.navigation_source_trigger_data_cardinality, config.event_source_trigger_data_cardinality, config.randomized_response_epsilon, config.max_reports_per_destination, - config.first_navigation_report_window_deadline, - config.second_navigation_report_window_deadline, - config.first_event_report_window_deadline, - config.second_event_report_window_deadline, config.max_navigation_info_gain, config.max_event_info_gain); }; return tie(a) == tie(b);
diff --git a/content/browser/attribution_reporting/attribution_interop_unittest.cc b/content/browser/attribution_reporting/attribution_interop_unittest.cc index 8597974..b63e879 100644 --- a/content/browser/attribution_reporting/attribution_interop_unittest.cc +++ b/content/browser/attribution_reporting/attribution_interop_unittest.cc
@@ -75,6 +75,25 @@ return; } base::ranges::sort(*list); + + // Ensure that integral values for this field are replaced with the equivalent + // double, since they are equivalent at the JSON level. + if (key == kEventLevelResultsKey || key == kDebugEventLevelResultsKey) { + for (base::Value& v : *list) { + if (!v.is_dict()) { + continue; + } + + base::Value* rate = + v.GetDict().FindByDottedPath("payload.randomized_trigger_rate"); + if (!rate || !rate->is_int()) { + continue; + } + + // This coerces the integer to a double. + *rate = base::Value(rate->GetDouble()); + } + } } class AttributionInteropTest : public ::testing::TestWithParam<base::FilePath> {
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc index c8891700..b0e1e3a7 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl.cc
@@ -27,6 +27,7 @@ #include "components/attribution_reporting/trigger_registration.h" #include "content/browser/attribution_reporting/aggregatable_attribution_utils.h" #include "content/browser/attribution_reporting/attribution_config.h" +#include "content/browser/attribution_reporting/attribution_constants.h" #include "content/browser/attribution_reporting/attribution_features.h" #include "content/browser/attribution_reporting/attribution_report.h" #include "content/browser/attribution_reporting/attribution_trigger.h" @@ -347,7 +348,8 @@ return absl::nullopt; } - return source_time + std::clamp(*declared_window, base::Hours(1), + return source_time + std::clamp(*declared_window, + attribution_reporting::kMinReportWindow, attribution_reporting::kMaxSourceExpiry); } @@ -422,16 +424,10 @@ std::vector<base::TimeDelta> end_times; switch (source_type) { case SourceType::kNavigation: - end_times = { - config_.event_level_limit.first_navigation_report_window_deadline, - config_.event_level_limit.second_navigation_report_window_deadline}; + end_times = {kDefaultNavigationReportWindow1, + kDefaultNavigationReportWindow2}; break; case SourceType::kEvent: - if (kVTCEarlyReportingWindows.Get()) { - end_times = { - config_.event_level_limit.first_event_report_window_deadline, - config_.event_level_limit.second_event_report_window_deadline}; - } break; }
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc index 2a694805..d7d5574 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
@@ -610,86 +610,6 @@ } } -class AttributionStorageDelegateImplTestEventFlagEnabled - : public testing::Test { - public: - AttributionStorageDelegateImplTestEventFlagEnabled() { - feature_list_.InitWithFeaturesAndParameters( - {{attribution_reporting::features::kConversionMeasurement, - {{"vtc_early_reporting_windows", "true"}}}}, - /*disabled_features=*/{}); - } - - private: - base::test::ScopedFeatureList feature_list_; -}; - -TEST_F(AttributionStorageDelegateImplTestEventFlagEnabled, - GetFeatureReportWindows_AsExpected) { - const struct { - SourceType source_type; - base::TimeDelta last_report_window; - attribution_reporting::EventReportWindows expected; - } kTestCases[] = { - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(30), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(7), base::Days(30)}), - }, - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(5), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(5)}), - }, - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(1), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(30), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(7), base::Days(30)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(5), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(5)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(1), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1)}), - }, - }; - for (const auto& test_case : kTestCases) { - EXPECT_EQ(test_case.expected, - AttributionStorageDelegateImpl().GetDefaultEventReportWindows( - test_case.source_type, test_case.last_report_window)); - } -} - -TEST_F(AttributionStorageDelegateImplTestEventFlagEnabled, - GetRandomFakeReports_Event_MatchesExpectedDistribution) { - // The probability that not all of the 3 states are seen after `num_samples` - // trials is at most ~1e-14476, which is 0 for all practical purposes, so the - // `expected_num_combinations` check should always pass. - // - // For the distribution check, the probability of failure with `tolerance` is - // at most 1e-9. - RunRandomFakeReportsTest(SourceType::kEvent, - /*num_stars=*/1, - /*num_bars=*/6, - /*num_samples=*/100'000, - /*tolerance=*/0.03); -} - // Change test to verify that expected value is returned (test // GetDefaultReportWindows()) class AttributionStorageDelegateImplTestFeatureConfigured @@ -698,12 +618,7 @@ AttributionStorageDelegateImplTestFeatureConfigured() { feature_list_.InitWithFeaturesAndParameters( {{attribution_reporting::features::kConversionMeasurement, - {{"vtc_early_reporting_windows", "true"}, - {"first_report_window_deadline", "1d"}, - {"second_report_window_deadline", "5d"}, - {"first_event_report_window_deadline", "1d"}, - {"second_event_report_window_deadline", "5d"}, - {"aggregate_report_min_delay", "1m"}, + {{"aggregate_report_min_delay", "1m"}, {"aggregate_report_delay_span", "29m"}}}}, /*disabled_features=*/{}); } @@ -713,57 +628,6 @@ }; TEST_F(AttributionStorageDelegateImplTestFeatureConfigured, - GetFeatureReportWindows_AsExpected) { - const struct { - SourceType source_type; - base::TimeDelta last_report_window; - attribution_reporting::EventReportWindows expected; - } kTestCases[] = { - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(30), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1), base::Days(5), base::Days(30)}), - }, - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(5), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1), base::Days(5)}), - }, - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(1), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(30), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1), base::Days(5), base::Days(30)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(5), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1), base::Days(5)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(1), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1)}), - }, - }; - for (const auto& test_case : kTestCases) { - EXPECT_EQ(test_case.expected, - AttributionStorageDelegateImpl().GetDefaultEventReportWindows( - test_case.source_type, test_case.last_report_window)); - } -} - -TEST_F(AttributionStorageDelegateImplTestFeatureConfigured, GetFeatureAggregatableReportTime) { base::Time trigger_time = base::Time::Now(); EXPECT_THAT( @@ -779,12 +643,7 @@ AttributionStorageDelegateImplTestInvalidFeatureConfigured() { feature_list_.InitWithFeaturesAndParameters( {{attribution_reporting::features::kConversionMeasurement, - {{"vtc_early_reporting_windows", "true"}, - {"first_report_window_deadline", "-1d"}, - {"second_report_window_deadline", "-5d"}, - {"first_event_report_window_deadline", "-1d"}, - {"second_event_report_window_deadline", "-5d"}, - {"aggregate_report_min_delay", "-1m"}, + {{"aggregate_report_min_delay", "-1m"}, {"aggregate_report_delay_span", "-29m"}}}}, /*disabled_features=*/{}); } @@ -794,57 +653,6 @@ }; TEST_F(AttributionStorageDelegateImplTestInvalidFeatureConfigured, - GetFeatureReportWindows_DefaultsUsed) { - const struct { - SourceType source_type; - base::TimeDelta last_report_window; - attribution_reporting::EventReportWindows expected; - } kTestCases[] = { - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(30), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(7), base::Days(30)}), - }, - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(5), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(5)}), - }, - { - .source_type = SourceType::kNavigation, - .last_report_window = base::Days(1), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(30), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(7), base::Days(30)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(5), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(2), base::Days(5)}), - }, - { - .source_type = SourceType::kEvent, - .last_report_window = base::Days(1), - .expected = *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(1)}), - }, - }; - for (const auto& test_case : kTestCases) { - EXPECT_EQ(test_case.expected, - AttributionStorageDelegateImpl().GetDefaultEventReportWindows( - test_case.source_type, test_case.last_report_window)); - } -} - -TEST_F(AttributionStorageDelegateImplTestInvalidFeatureConfigured, NegativeAggregateParams_DefaultsUsed) { base::Time trigger_time = base::Time::Now(); EXPECT_THAT(
diff --git a/content/browser/attribution_reporting/attribution_storage_sql.cc b/content/browser/attribution_reporting/attribution_storage_sql.cc index e87270797..99e94ed 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql.cc
@@ -872,9 +872,7 @@ } const base::Time aggregatable_report_window_time = - ComputeReportWindowTime(delegate_->GetReportWindowTime( - reg.aggregatable_report_window, source_time), - expiry_time); + source_time + reg.aggregatable_report_window; ASSIGN_OR_RETURN(const auto randomized_response_data, delegate_->GetRandomizedResponse(
diff --git a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc index bc77bfd..40b6c61 100644 --- a/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc +++ b/content/browser/attribution_reporting/attribution_storage_sql_migrations.cc
@@ -7,13 +7,11 @@ #include <vector> #include "base/functional/function_ref.h" -#include "base/metrics/field_trial_params.h" #include "base/metrics/histogram_functions.h" #include "base/time/time.h" #include "components/attribution_reporting/event_report_windows.h" -#include "components/attribution_reporting/features.h" #include "components/attribution_reporting/source_type.mojom.h" -#include "content/browser/attribution_reporting/attribution_features.h" +#include "content/browser/attribution_reporting/attribution_constants.h" #include "content/browser/attribution_reporting/attribution_storage_sql.h" #include "content/browser/attribution_reporting/sql_utils.h" #include "net/base/schemeful_site.h" @@ -27,22 +25,6 @@ namespace { -const base::FeatureParam<base::TimeDelta> kFirstNavigationReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "first_report_window_deadline", base::Days(2)}; - -const base::FeatureParam<base::TimeDelta> kSecondNavigationReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "second_report_window_deadline", base::Days(7)}; - -const base::FeatureParam<base::TimeDelta> kFirstEventReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "first_event_report_window_deadline", base::Days(2)}; - -const base::FeatureParam<base::TimeDelta> kSecondEventReportWindowDeadline{ - &attribution_reporting::features::kConversionMeasurement, - "second_event_report_window_deadline", base::Days(7)}; - // Ensure that both version numbers are updated together to prevent crashes on // downgrades as in crbug.com/1413728. [[nodiscard]] bool SetVersionNumbers(sql::MetaTable& meta_table, int version) { @@ -329,18 +311,10 @@ switch (source_type.value()) { case attribution_reporting::mojom::SourceType::kNavigation: max_event_level_reports = 3; - end_times = {kFirstNavigationReportWindowDeadline.Get(), - kSecondNavigationReportWindowDeadline.Get()}; + end_times = {kDefaultNavigationReportWindow1, + kDefaultNavigationReportWindow2}; break; case attribution_reporting::mojom::SourceType::kEvent: - if (kVTCEarlyReportingWindows.Get()) { - base::TimeDelta first_window = kFirstEventReportWindowDeadline.Get(); - base::TimeDelta second_window = - kSecondEventReportWindowDeadline.Get(); - if (!first_window.is_negative() && first_window < second_window) { - end_times = {first_window, second_window}; - } - } max_event_level_reports = 1; break; }
diff --git a/content/browser/attribution_reporting/attribution_storage_unittest.cc b/content/browser/attribution_reporting/attribution_storage_unittest.cc index 37ae732a..da99e96 100644 --- a/content/browser/attribution_reporting/attribution_storage_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_unittest.cc
@@ -698,17 +698,6 @@ kSourceTime + base::Days(4), }, { - .desc = "clamp-aggregatable-report-window", - .expiry = base::Days(4), - .aggregatable_report_window = base::Days(30), - .expected_expiry_time = kSourceTime + base::Days(4), - .expected_event_report_windows = - *attribution_reporting::EventReportWindows::CreateWindows( - base::Days(0), {base::Days(4)}), - .expected_aggregatable_report_window_time = - kSourceTime + base::Days(4), - }, - { .desc = "all", .expiry = base::Days(9), .event_report_window = base::Days(7), @@ -728,7 +717,8 @@ reg.event_report_windows = attribution_reporting::EventReportWindows::CreateSingularWindow( test_case.event_report_window.value_or(reg.expiry)); - reg.aggregatable_report_window = test_case.aggregatable_report_window; + reg.aggregatable_report_window = + test_case.aggregatable_report_window.value_or(reg.expiry); storage()->StoreSource( StorableSource(reporting_origin, std::move(reg),
diff --git a/content/browser/attribution_reporting/attribution_test_utils.cc b/content/browser/attribution_reporting/attribution_test_utils.cc index efe7ed18..5dfd362 100644 --- a/content/browser/attribution_reporting/attribution_test_utils.cc +++ b/content/browser/attribution_reporting/attribution_test_utils.cc
@@ -33,7 +33,6 @@ #include "content/browser/attribution_reporting/attribution_observer.h" #include "content/browser/attribution_reporting/attribution_reporting.mojom.h" #include "content/browser/attribution_reporting/attribution_trigger.h" -#include "content/browser/attribution_reporting/attribution_utils.h" #include "content/browser/attribution_reporting/os_registration.h" #include "content/browser/attribution_reporting/rate_limit_result.h" #include "content/public/browser/attribution_data_model.h" @@ -242,10 +241,7 @@ registration_.event_report_windows.value_or( *attribution_reporting::EventReportWindows::CreateWindows( base::Milliseconds(0), {registration_.expiry})), - ComputeReportWindowTime( - GetReportWindowTimeForTesting( - registration_.aggregatable_report_window, source_time_), - expiry_time), + source_time_ + registration_.aggregatable_report_window, registration_.max_event_level_reports, registration_.priority, registration_.filter_data, registration_.debug_key, registration_.aggregation_keys, attribution_logic_, active_state_,
diff --git a/content/browser/attribution_reporting/attribution_utils.h b/content/browser/attribution_reporting/attribution_utils.h index 7b1f771a..7df5245 100644 --- a/content/browser/attribution_reporting/attribution_utils.h +++ b/content/browser/attribution_reporting/attribution_utils.h
@@ -23,7 +23,7 @@ CONTENT_EXPORT std::string SerializeAttributionJson(base::ValueView body, bool pretty_print = false); -CONTENT_EXPORT base::Time ComputeReportWindowTime( +base::Time ComputeReportWindowTime( absl::optional<base::Time> report_window_time, base::Time expiry_time);
diff --git a/content/browser/closewatcher/close_listener_host.cc b/content/browser/closewatcher/close_listener_host.cc index 1076322..d14fa5c 100644 --- a/content/browser/closewatcher/close_listener_host.cc +++ b/content/browser/closewatcher/close_listener_host.cc
@@ -35,14 +35,14 @@ // waiting for a Signal(). close_listener_.set_disconnect_handler( base::BindOnce(&CloseListenerHost::OnDisconnect, base::Unretained(this))); - GetOrCreateManager()->UpdateInterceptStatus(); + GetOrCreateManager()->MaybeUpdateInterceptStatus(this); } void CloseListenerHost::OnDisconnect() { if (close_listener_.is_bound()) { close_listener_.reset(); } - GetOrCreateManager()->UpdateInterceptStatus(); + GetOrCreateManager()->MaybeUpdateInterceptStatus(this); } bool CloseListenerHost::IsActive() {
diff --git a/content/browser/closewatcher/close_listener_manager.cc b/content/browser/closewatcher/close_listener_manager.cc index 5207249..af3433c 100644 --- a/content/browser/closewatcher/close_listener_manager.cc +++ b/content/browser/closewatcher/close_listener_manager.cc
@@ -18,19 +18,26 @@ // static void CloseListenerManager::DidChangeFocusedFrame(WebContents* web_contents) { if (auto* manager = CloseListenerManager::FromWebContents(web_contents)) { - manager->UpdateInterceptStatus(); + RenderFrameHost* focused_frame = web_contents->GetFocusedFrame(); + CloseListenerHost* current_host = + focused_frame ? CloseListenerHost::GetForCurrentDocument(focused_frame) + : nullptr; + if (current_host) { + manager->MaybeUpdateInterceptStatus(current_host); + } } } -void CloseListenerManager::UpdateInterceptStatus() { +void CloseListenerManager::MaybeUpdateInterceptStatus( + CloseListenerHost* host_being_updated) { if (GetWebContents().IsBeingDestroyed()) { return; } - RenderFrameHost* focused_frame = GetWebContents().GetFocusedFrame(); - CloseListenerHost* current_host = - focused_frame ? CloseListenerHost::GetForCurrentDocument(focused_frame) - : nullptr; - bool should_intercept = current_host && current_host->IsActive(); + if (&host_being_updated->render_frame_host() != + GetWebContents().GetFocusedFrame()) { + return; + } + bool should_intercept = host_being_updated->IsActive(); if (should_intercept == should_intercept_) { return; }
diff --git a/content/browser/closewatcher/close_listener_manager.h b/content/browser/closewatcher/close_listener_manager.h index d1f69e3..c0ce5c0d 100644 --- a/content/browser/closewatcher/close_listener_manager.h +++ b/content/browser/closewatcher/close_listener_manager.h
@@ -9,6 +9,7 @@ #include "content/public/browser/web_contents_user_data.h" namespace content { +class CloseListenerHost; // CloseListenerManager tracks whether its WebContents' focused frame has an // active CloseWatcher. Updates when a CloseWatcher is added/remove and when @@ -25,7 +26,9 @@ static void DidChangeFocusedFrame(WebContents* web_contents); - void UpdateInterceptStatus(); + // `host_being_updated` may not be associated with the currently focused + // frame, in which case nothing will be updated. + void MaybeUpdateInterceptStatus(CloseListenerHost* host_being_updated); private: explicit CloseListenerManager(WebContents* web_contents);
diff --git a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc index f816733..3f1b468 100644 --- a/content/browser/devtools/protocol/devtools_protocol_browsertest.cc +++ b/content/browser/devtools/protocol/devtools_protocol_browsertest.cc
@@ -3974,7 +3974,7 @@ ASSERT_TRUE(manager); base::test::TestFuture<storage::SharedStorageManager::OperationResult> future; - manager->MakeBudgetWithdrawal(url::Origin::Create(url), bits, + manager->MakeBudgetWithdrawal(net::SchemefulSite(url), bits, future.GetCallback()); EXPECT_EQ(storage::SharedStorageManager::OperationResult::kSuccess, future.Get());
diff --git a/content/browser/devtools/protocol/fedcm_handler.cc b/content/browser/devtools/protocol/fedcm_handler.cc index 3b507c3..6884e854 100644 --- a/content/browser/devtools/protocol/fedcm_handler.cc +++ b/content/browser/devtools/protocol/fedcm_handler.cc
@@ -25,8 +25,8 @@ return FedCm::DialogTypeEnum::AccountChooser; case content::FederatedAuthRequestImpl::kAutoReauth: return FedCm::DialogTypeEnum::AutoReauthn; - case content::FederatedAuthRequestImpl::kConfirmIdpSignin: - return FedCm::DialogTypeEnum::ConfirmIdpSignin; + case content::FederatedAuthRequestImpl::kConfirmIdpLogin: + return FedCm::DialogTypeEnum::ConfirmIdpLogin; } } } // namespace @@ -128,7 +128,7 @@ .SetGivenName(account.given_name) .SetPictureUrl(account.picture.spec()) .SetIdpConfigUrl(data.idp_metadata.config_url.spec()) - .SetIdpSigninUrl(data.idp_metadata.idp_signin_url.spec()) + .SetIdpLoginUrl(data.idp_metadata.idp_login_url.spec()) .SetLoginState(login_state) .Build(); if (pp_url) { @@ -182,7 +182,7 @@ return DispatchResponse::InvalidParams("Invalid account index"); } -DispatchResponse FedCmHandler::ConfirmIdpSignin(const String& in_dialogId) { +DispatchResponse FedCmHandler::ConfirmIdpLogin(const String& in_dialogId) { if (in_dialogId != dialog_id_) { return DispatchResponse::InvalidParams( "Dialog ID does not match current dialog"); @@ -195,11 +195,11 @@ } FederatedAuthRequestImpl::DialogType type = auth_request->GetDialogType(); - if (type != FederatedAuthRequestImpl::kConfirmIdpSignin) { + if (type != FederatedAuthRequestImpl::kConfirmIdpLogin) { return DispatchResponse::ServerError( - "dismissDialog called while no confirm IDP signin dialog is shown"); + "dismissDialog called while no confirm IDP login dialog is shown"); } - auth_request->AcceptConfirmIdpSigninDialogForDevtools(); + auth_request->AcceptConfirmIdpLoginDialogForDevtools(); return DispatchResponse::Success(); } @@ -217,8 +217,8 @@ } FederatedAuthRequestImpl::DialogType type = auth_request->GetDialogType(); - if (type == FederatedAuthRequestImpl::kConfirmIdpSignin) { - auth_request->DismissConfirmIdpSigninDialogForDevtools(); + if (type == FederatedAuthRequestImpl::kConfirmIdpLogin) { + auth_request->DismissConfirmIdpLoginDialogForDevtools(); return DispatchResponse::Success(); } const auto* idp_data = GetIdentityProviderData(auth_request);
diff --git a/content/browser/devtools/protocol/fedcm_handler.h b/content/browser/devtools/protocol/fedcm_handler.h index c476a5ee..09b0436 100644 --- a/content/browser/devtools/protocol/fedcm_handler.h +++ b/content/browser/devtools/protocol/fedcm_handler.h
@@ -55,7 +55,7 @@ DispatchResponse Disable() override; DispatchResponse SelectAccount(const String& in_dialogId, int in_accountIndex) override; - DispatchResponse ConfirmIdpSignin(const String& in_dialogId) override; + DispatchResponse ConfirmIdpLogin(const String& in_dialogId) override; DispatchResponse DismissDialog(const String& in_dialogId, Maybe<bool> in_triggerCooldown) override; DispatchResponse ResetCooldown() override;
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc index d352975..483d144 100644 --- a/content/browser/devtools/protocol/storage_handler.cc +++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -1039,6 +1039,9 @@ case AccessType::kAdditionalBidWin: type_enum = Storage::InterestGroupAccessTypeEnum::AdditionalBidWin; break; + case AccessType::kClear: + type_enum = Storage::InterestGroupAccessTypeEnum::Clear; + break; }; frontend_->InterestGroupAccessed(access_time.ToDoubleT(), type_enum, owner_origin.Serialize(), name);
diff --git a/content/browser/fenced_frame/fenced_frame_browsertest.cc b/content/browser/fenced_frame/fenced_frame_browsertest.cc index 9f0b80aa..96ba9d4 100644 --- a/content/browser/fenced_frame/fenced_frame_browsertest.cc +++ b/content/browser/fenced_frame/fenced_frame_browsertest.cc
@@ -2356,7 +2356,8 @@ https_server()->GetURL("b.test", "/fenced_frames/title1.html"); SimulateSharedStorageURNMappingComplete( url_mapping1, urn_uuid1, mapped_url1, - /*shared_storage_origin=*/url::Origin::Create(GURL("https://foo.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://foo.com"), /*budget_to_charge=*/2.0); EXPECT_TRUE(ExecJs(root, @@ -2383,7 +2384,8 @@ https_server()->GetURL("c.test", "/fenced_frames/title1.html"); SimulateSharedStorageURNMappingComplete( url_mapping2, urn_uuid2, mapped_url2, - /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://bar.com"), /*budget_to_charge=*/3.0); EXPECT_TRUE(ExecJs(fenced_frame_root_node1, @@ -2405,10 +2407,12 @@ EXPECT_EQ(metadata.size(), 2u); - EXPECT_EQ(metadata[0]->origin, url::Origin::Create(GURL("https://bar.com"))); + EXPECT_EQ(metadata[0]->site, + net::SchemefulSite::Deserialize("https://bar.com")); EXPECT_DOUBLE_EQ(metadata[0]->budget_to_charge, 3.0); - EXPECT_EQ(metadata[1]->origin, url::Origin::Create(GURL("https://foo.com"))); + EXPECT_EQ(metadata[1]->site, + net::SchemefulSite::Deserialize("https://foo.com")); EXPECT_DOUBLE_EQ(metadata[1]->budget_to_charge, 2.0); } @@ -2446,7 +2450,8 @@ https_server()->GetURL("a.test", "/fenced_frames/title1.html"); SimulateSharedStorageURNMappingComplete( url_mapping, urn_uuid, mapped_url, - /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://bar.com"), /*budget_to_charge=*/2.0); { @@ -2535,7 +2540,8 @@ // Trigger the mapping to resume the deferred navigation. SimulateSharedStorageURNMappingComplete( url_mapping, urn_uuid, mapped_url, - /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://bar.com"), /*budget_to_charge=*/2.0); EXPECT_FALSE(url_mapping_test_peer.HasObserver(urn_uuid, request)); @@ -2548,8 +2554,8 @@ budget_metadata = fenced_frame_root_node->FindSharedStorageBudgetMetadata(); EXPECT_EQ(budget_metadata.size(), 1u); - EXPECT_EQ(budget_metadata[0]->origin, - url::Origin::Create(GURL("https://bar.com"))); + EXPECT_EQ(budget_metadata[0]->site, + net::SchemefulSite::Deserialize("https://bar.com")); EXPECT_DOUBLE_EQ(budget_metadata[0]->budget_to_charge, 2.0); } @@ -2610,7 +2616,8 @@ // Trigger the mapping to resume the deferred navigation. SimulateSharedStorageURNMappingComplete( url_mapping, urn_uuid, mapped_url, - /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://bar.com"), /*budget_to_charge=*/2.0); EXPECT_FALSE(url_mapping_test_peer.HasObserver(urn_uuid, request));
diff --git a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc index b2dd940..02bc4088 100644 --- a/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc +++ b/content/browser/fenced_frame/fenced_frame_url_mapping_unittest.cc
@@ -12,6 +12,7 @@ #include "content/browser/fenced_frame/fenced_frame_reporter.h" #include "content/public/test/test_renderer_host.h" #include "content/test/fenced_frame_test_utils.h" +#include "net/base/schemeful_site.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -189,20 +190,19 @@ fenced_frame_url_mapping.ConvertFencedFrameURNToURL(urn_uuid2, &observer2); EXPECT_FALSE(observer2.mapping_complete_observed()); - url::Origin shared_storage_origin = - url::Origin::Create(GURL("https://bar.com")); + net::SchemefulSite shared_storage_site(GURL("https://bar.com")); GURL mapped_url = GURL("https://foo.com"); - // Two SharedStorageBudgetMetadata for the same origin can happen if the same + // Two SharedStorageBudgetMetadata for the same site can happen if the same // blink::Document invokes window.sharedStorage.runURLSelectionOperation() // twice. Each call will generate a distinct URN. And if the input urls have // different size, the budget_to_charge (i.e. log(n)) will be also different. SimulateSharedStorageURNMappingComplete(fenced_frame_url_mapping, urn_uuid1, - mapped_url, shared_storage_origin, + mapped_url, shared_storage_site, /*budget_to_charge=*/2.0); SimulateSharedStorageURNMappingComplete(fenced_frame_url_mapping, urn_uuid2, - mapped_url, shared_storage_origin, + mapped_url, shared_storage_site, /*budget_to_charge=*/3.0); EXPECT_TRUE(observer1.mapping_complete_observed()); @@ -218,7 +218,7 @@ urn_uuid1); EXPECT_TRUE(metadata1); - EXPECT_EQ(metadata1->origin, shared_storage_origin); + EXPECT_EQ(metadata1->site, shared_storage_site); EXPECT_DOUBLE_EQ(metadata1->budget_to_charge, 2.0); SharedStorageBudgetMetadata* metadata2 = @@ -226,7 +226,7 @@ urn_uuid2); EXPECT_TRUE(metadata2); - EXPECT_EQ(metadata2->origin, shared_storage_origin); + EXPECT_EQ(metadata2->site, shared_storage_site); EXPECT_DOUBLE_EQ(metadata2->budget_to_charge, 3.0); } @@ -244,7 +244,8 @@ SimulateSharedStorageURNMappingComplete( fenced_frame_url_mapping, urn_uuid, /*mapped_url=*/GURL("https://foo.com"), - /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://bar.com"), /*budget_to_charge=*/2.0); EXPECT_FALSE(observer.mapping_complete_observed()); @@ -266,7 +267,8 @@ SimulateSharedStorageURNMappingComplete( fenced_frame_url_mapping, urn_uuid, /*mapped_url=*/GURL("https://foo.com"), - /*shared_storage_origin=*/url::Origin::Create(GURL("https://bar.com")), + /*shared_storage_site=*/ + net::SchemefulSite::Deserialize("https://bar.com"), /*budget_to_charge=*/2.0); EXPECT_TRUE(observer1.mapping_complete_observed());
diff --git a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc index c284d272..2f5b626a 100644 --- a/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc +++ b/content/browser/fenced_frame/redacted_fenced_frame_config_mojom_traits_unittest.cc
@@ -13,6 +13,7 @@ #include "content/browser/fenced_frame/fenced_frame_reporter.h" #include "content/public/test/test_renderer_host.h" #include "mojo/public/cpp/test_support/test_utils.h" +#include "net/base/schemeful_site.h" #include "services/network/public/cpp/weak_wrapper_shared_url_loader_factory.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -451,11 +452,11 @@ // Test `shared_storage_budget_metadata`. { SharedStorageBudgetMetadata test_shared_storage_budget_metadata = { - url::Origin::Create(test_url), 0.5, /*top_navigated=*/true}; + net::SchemefulSite(test_url), 0.5, /*top_navigated=*/true}; const auto eq = [](const SharedStorageBudgetMetadata& a, const SharedStorageBudgetMetadata& b) { - return std::tie(a.origin, a.budget_to_charge, a.top_navigated) == - std::tie(b.origin, b.budget_to_charge, b.top_navigated); + return std::tie(a.site, a.budget_to_charge, a.top_navigated) == + std::tie(b.site, b.budget_to_charge, b.top_navigated); }; TestProperty(&FencedFrameConfig::shared_storage_budget_metadata_, &RedactedFencedFrameConfig::shared_storage_budget_metadata,
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc index 06828fe..112dab81 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.cc +++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -107,9 +107,9 @@ base::FEATURE_ENABLED_BY_DEFAULT); // For now default bid and score to full resolution. const base::FeatureParam<int> kFledgeBidReportingBits{ - &kFledgeRounding, "fledge_bid_reporting_bits", 53}; + &kFledgeRounding, "fledge_bid_reporting_bits", 16}; const base::FeatureParam<int> kFledgeScoreReportingBits{ - &kFledgeRounding, "fledge_score_reporting_bits", 53}; + &kFledgeRounding, "fledge_score_reporting_bits", 16}; const base::FeatureParam<int> kFledgeAdCostReportingBits{ &kFledgeRounding, "fledge_ad_cost_reporting_bits", 8};
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 3743e9db..280c3ee 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -2329,6 +2329,50 @@ test_origin_a, /*groups_to_keep=*/{{}})); } +// Make sure that ClearOriginJoinedInterestGroups() sends leave notifications +// for the right set of interest groups. This is separate from the above tests +// because the *AndVerify() series of methods results in extra notifications. +IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, + SameOriginClearOriginJoinedInterestGroupsNotifications) { + const char kName1[] = "name1"; + const char kName2[] = "name2"; + const char kName3[] = "name3"; + const char kName4[] = "name4"; + + AttachInterestGroupObserver(); + + GURL test_url_a = https_server_->GetURL("a.test", "/echo"); + url::Origin test_origin_a = url::Origin::Create(test_url_a); + ASSERT_TRUE(test_url_a.SchemeIs(url::kHttpsScheme)); + ASSERT_TRUE(NavigateToURL(shell(), test_url_a)); + + // These joins should all succeed. + EXPECT_EQ(kSuccess, JoinInterestGroup(test_origin_a, kName1)); + EXPECT_EQ(kSuccess, JoinInterestGroup(test_origin_a, kName2)); + EXPECT_EQ(kSuccess, JoinInterestGroup(test_origin_a, kName3)); + + // Directly join an interest group from a different main frame origin. This + // should not be left by the clear call. + manager_->JoinInterestGroup( + blink::TestInterestGroupBuilder(test_origin_a, kName4).Build(), + /*joining_url=*/https_server_->GetURL("b.test", "/echo")); + + WaitForAccessObserved( + {{TestInterestGroupObserver::kJoin, test_origin_a, kName1}, + {TestInterestGroupObserver::kJoin, test_origin_a, kName2}, + {TestInterestGroupObserver::kJoin, test_origin_a, kName3}, + {TestInterestGroupObserver::kJoin, test_origin_a, kName4}}); + + EXPECT_EQ(kSuccess, ClearOriginJoinedInterestGroups( + test_origin_a, /*groups_to_keep=*/{{kName2}})); + + // kName2 and kName4 should not be cleared. Don't check exact order, as + // there's no guarantee about the order groups will be listed in. + WaitForAccessObserved( + {{TestInterestGroupObserver::kClear, test_origin_a, kName1}, + {TestInterestGroupObserver::kClear, test_origin_a, kName3}}); +} + // Can't join or leave interest groups from http://localhost, even though it's // a "secure context" (since it's potentially trustworthy). IN_PROC_BROWSER_TEST_F(InterestGroupBrowserTest, CantJoinLeaveHttpLocalhost) { @@ -18652,13 +18696,24 @@ EXPECT_EQ(kSuccess, EvalJs(shell(), R"( (async function() { try { - // Join a same-origin interest group with no bidding script. + // Join a pair of same-origin interest groups with no bidding script. // Unlike other tests, don't wait for the join to complete // before making more FLEDGE calls. The calls should still be // executed in order, since they're all same-origin. navigator.joinAdInterestGroup( {name: 'cars', owner: document.location.origin}, /*joinDurationSec=*/300); + navigator.joinAdInterestGroup( + {name: 'golf carts', owner: document.location.origin}, + /*joinDurationSec=*/300); + + // This should clear the interest group joined second only. + // If this left multiple groups, there'd be no guarantee about + // the relative order of those two groups, so it deliberately + // leaves only one group. + navigator.clearOriginJoinedAdInterestGroups( + document.location.origin, ['cars'], + /*joinDurationSec=*/300); // Run an auction. Don't bother using a real decision logic URL. // Since the only interest group has no bidding script, it won't @@ -18680,6 +18735,8 @@ // Expect events to be in order. WaitForAccessObservedInOrder( {{TestInterestGroupObserver::kJoin, test_origin, "cars"}, + {TestInterestGroupObserver::kJoin, test_origin, "golf carts"}, + {TestInterestGroupObserver::kClear, test_origin, "golf carts"}, {TestInterestGroupObserver::kLoaded, test_origin, "cars"}, {TestInterestGroupObserver::kLeave, test_origin, "cars"}}); }
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc index 47a6a71..684246e 100644 --- a/content/browser/interest_group/interest_group_manager_impl.cc +++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -251,15 +251,26 @@ } void InterestGroupManagerImpl::ClearOriginJoinedInterestGroups( - url::Origin owner, + const url::Origin& owner, std::set<std::string> interest_groups_to_keep, url::Origin main_frame_origin) { // TODO(https://crbug.com/1486606): Add NotifyInterestGroupAccessed() calls // for this after retrieving list of IGs that were left from the databases. // See bug for more details. impl_.AsyncCall(&InterestGroupStorage::ClearOriginJoinedInterestGroups) - .WithArgs(std::move(owner), std::move(interest_groups_to_keep), - std::move(main_frame_origin)); + .WithArgs(owner, std::move(interest_groups_to_keep), + std::move(main_frame_origin)) + .Then(base::BindOnce( + &InterestGroupManagerImpl::OnClearOriginJoinedInterestGroupsComplete, + weak_factory_.GetWeakPtr(), owner)); +} + +void InterestGroupManagerImpl::OnClearOriginJoinedInterestGroupsComplete( + const url::Origin& owner, + std::vector<std::string> left_interest_group_names) { + for (const auto& name : left_interest_group_names) { + NotifyInterestGroupAccessed(InterestGroupObserver::kClear, owner, name); + } } void InterestGroupManagerImpl::UpdateInterestGroupsOfOwner(
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h index bd7f1943..971ade7 100644 --- a/content/browser/interest_group/interest_group_manager_impl.h +++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -98,7 +98,8 @@ kBid, kAdditionalBid, kWin, - kAdditionalBidWin + kAdditionalBidWin, + kClear, }; virtual void OnInterestGroupAccessed(const base::Time& access_time, AccessType type, @@ -183,7 +184,7 @@ // Removes all interest groups owned by `owner` joined from // `main_frame_origin` except `interest_groups_to_keep`, if they exist. void ClearOriginJoinedInterestGroups( - url::Origin owner, + const url::Origin& owner, std::set<std::string> interest_groups_to_keep, url::Origin main_frame_origin); // Loads all interest groups owned by `owner`, then updates their @@ -444,6 +445,9 @@ bool report_result_only, blink::mojom::AdAuctionService::LeaveInterestGroupCallback callback, bool can_leave); + void OnClearOriginJoinedInterestGroupsComplete( + const url::Origin& owner, + std::vector<std::string> left_interest_group_names); // For a given owner, gets interest group keys along with their update urls. // `groups_limit` sets a limit on the maximum number of interest group keys
diff --git a/content/browser/interest_group/interest_group_storage.cc b/content/browser/interest_group/interest_group_storage.cc index 2332bf17c..9988166 100644 --- a/content/browser/interest_group/interest_group_storage.cc +++ b/content/browser/interest_group/interest_group_storage.cc
@@ -1805,15 +1805,16 @@ } // Leaves all the interest groups joined on `joining_origin` except -// `interest_groups_to_keep`. -bool DoClearOriginJoinedInterestGroups( +// `interest_groups_to_keep`. Returns absl::nullopt on error, and a (possibly +// empty) list of left interest groups on success. +absl::optional<std::vector<std::string>> DoClearOriginJoinedInterestGroups( sql::Database& db, const url::Origin owner, const std::set<std::string>& interest_groups_to_keep, const url::Origin joining_origin) { sql::Transaction transaction(&db); if (!transaction.Begin()) { - return false; + return absl::nullopt; } // Have to select interest groups and then use DoRemoveInterestGroup() in @@ -1829,24 +1830,29 @@ // clang-format on if (!same_cluster_groups.is_valid()) { - return false; + return absl::nullopt; } same_cluster_groups.Reset(true); same_cluster_groups.BindString(0, Serialize(owner)); same_cluster_groups.BindString(1, Serialize(joining_origin)); + std::vector<std::string> cleared_interest_groups; + while (same_cluster_groups.Step()) { std::string name = same_cluster_groups.ColumnString(0); if (interest_groups_to_keep.find(name) != interest_groups_to_keep.end()) { continue; } - if (!DoRemoveInterestGroup( - db, blink::InterestGroupKey(owner, std::move(name)))) { - return false; + if (!DoRemoveInterestGroup(db, blink::InterestGroupKey(owner, name))) { + return absl::nullopt; } + cleared_interest_groups.emplace_back(std::move(name)); } - return transaction.Commit(); + if (!transaction.Commit()) { + return absl::nullopt; + } + return cleared_interest_groups; } bool DoLoadInterestGroup(sql::Database& db, @@ -3681,19 +3687,23 @@ } } -void InterestGroupStorage::ClearOriginJoinedInterestGroups( +std::vector<std::string> InterestGroupStorage::ClearOriginJoinedInterestGroups( const url::Origin& owner, const std::set<std::string>& interest_groups_to_keep, const url::Origin& main_frame_origin) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!EnsureDBInitialized()) { - return; + return std::vector<std::string>(); } - if (!DoClearOriginJoinedInterestGroups(*db_, owner, interest_groups_to_keep, - main_frame_origin)) { + absl::optional<std::vector<std::string>> left_interest_groups = + DoClearOriginJoinedInterestGroups(*db_, owner, interest_groups_to_keep, + main_frame_origin); + if (!left_interest_groups) { DLOG(ERROR) << "Could not leave interest group: " << db_->GetErrorMessage(); + return std::vector<std::string>(); } + return std::move(left_interest_groups.value()); } bool InterestGroupStorage::UpdateInterestGroup(
diff --git a/content/browser/interest_group/interest_group_storage.h b/content/browser/interest_group/interest_group_storage.h index a7ade0f..099604c20 100644 --- a/content/browser/interest_group/interest_group_storage.h +++ b/content/browser/interest_group/interest_group_storage.h
@@ -71,7 +71,8 @@ // Removes all interest groups owned by `owner` joined from // `main_frame_origin` except `interest_groups_to_keep`, if they exist. - void ClearOriginJoinedInterestGroups( + // Returns a (possibly empty) list of all interest groups that were cleared. + std::vector<std::string> ClearOriginJoinedInterestGroups( const url::Origin& owner, const std::set<std::string>& interest_groups_to_keep, const url::Origin& main_frame_origin);
diff --git a/content/browser/interest_group/interest_group_storage_unittest.cc b/content/browser/interest_group/interest_group_storage_unittest.cc index be02172..4e0a7cc 100644 --- a/content/browser/interest_group/interest_group_storage_unittest.cc +++ b/content/browser/interest_group/interest_group_storage_unittest.cc
@@ -500,9 +500,10 @@ // Leave all of origin's B's interest groups joined from origin A, except for // a list that contains all of the groups actually joined that way (plus an // extra group). No groups should be left. - storage->ClearOriginJoinedInterestGroups( - kOriginB, {kName1, kName2, kName3, "not-present-group"}, - /*main_frame_origin=*/kOriginA); + EXPECT_THAT(storage->ClearOriginJoinedInterestGroups( + kOriginB, {kName1, kName2, kName3, "not-present-group"}, + /*main_frame_origin=*/kOriginA), + testing::UnorderedElementsAre()); EXPECT_THAT(GetInterestGroupSummary(*storage), testing::UnorderedElementsAre( // Origin B's groups that were joined on origin A. @@ -515,8 +516,10 @@ // kName1 and kName3. Only the kName2 group should be left. Despite kName2 and // kName3 groups both having "group-by-origin" execution mode, group kName3 // should not have been left. - storage->ClearOriginJoinedInterestGroups(kOriginB, {kName1, kName3}, - /*main_frame_origin=*/kOriginA); + EXPECT_THAT( + storage->ClearOriginJoinedInterestGroups(kOriginB, {kName1, kName3}, + /*main_frame_origin=*/kOriginA), + testing::UnorderedElementsAre(kName2)); EXPECT_THAT(GetInterestGroupSummary(*storage), testing::UnorderedElementsAre( // Origin B's groups that were joined on origin A. @@ -525,8 +528,10 @@ "https://c.test;name1", "https://b.test;name4")); // Leave all of origin's B's interest groups joined from origin A. - storage->ClearOriginJoinedInterestGroups(kOriginB, {}, - /*main_frame_origin=*/kOriginA); + EXPECT_THAT( + storage->ClearOriginJoinedInterestGroups(kOriginB, {}, + /*main_frame_origin=*/kOriginA), + testing::UnorderedElementsAre(kName1, kName3)); EXPECT_THAT(GetInterestGroupSummary(*storage), testing::UnorderedElementsAre("https://c.test;name1", "https://b.test;name4"));
diff --git a/content/browser/media/cdm_storage_database.cc b/content/browser/media/cdm_storage_database.cc index afdd3305..ad3b73d 100644 --- a/content/browser/media/cdm_storage_database.cc +++ b/content/browser/media/cdm_storage_database.cc
@@ -180,6 +180,8 @@ bool CdmStorageDatabase::ClearDatabase() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + last_operation_ = "ClearDatabase"; + db_.Close(); if (path_.empty()) {
diff --git a/content/browser/media/flinging_renderer_unittest.cc b/content/browser/media/flinging_renderer_unittest.cc index 1e18090..6722971 100644 --- a/content/browser/media/flinging_renderer_unittest.cc +++ b/content/browser/media/flinging_renderer_unittest.cc
@@ -66,9 +66,8 @@ protected: NiceMock<media::MockRendererClient> renderer_client_; std::unique_ptr<MockMediaController> media_controller_; - raw_ptr<StrictMock<MockFlingingController>, DanglingUntriaged> - flinging_controller_; std::unique_ptr<FlingingRenderer> renderer_; + raw_ptr<StrictMock<MockFlingingController>> flinging_controller_; }; TEST_F(FlingingRendererTest, StartPlayingFromTime) {
diff --git a/content/browser/media/session/media_session_impl.cc b/content/browser/media/session/media_session_impl.cc index fb69e18..d6d2443 100644 --- a/content/browser/media/session/media_session_impl.cc +++ b/content/browser/media/session/media_session_impl.cc
@@ -1200,10 +1200,7 @@ ShouldRouteAction( media_session::mojom::MediaSessionAction::kEnterPictureInPicture)) { DidReceiveAction( - media_session::mojom::MediaSessionAction::kEnterPictureInPicture, - blink::mojom::MediaSessionActionDetails::NewPictureInPicture( - blink::mojom::MediaSessionPictureInPictureActionDetails::New( - /*automatic=*/false))); + media_session::mojom::MediaSessionAction::kEnterPictureInPicture); return; } @@ -1228,10 +1225,7 @@ } DidReceiveAction( - media_session::mojom::MediaSessionAction::kEnterPictureInPicture, - blink::mojom::MediaSessionActionDetails::NewPictureInPicture( - blink::mojom::MediaSessionPictureInPictureActionDetails::New( - /*automatic=*/true))); + media_session::mojom::MediaSessionAction::kEnterPictureInPicture); } void MediaSessionImpl::SetAudioSinkId(const absl::optional<std::string>& id) {
diff --git a/content/browser/preloading/prefetch/prefetch_container_unittest.cc b/content/browser/preloading/prefetch/prefetch_container_unittest.cc index 326ef09..45a94cd 100644 --- a/content/browser/preloading/prefetch/prefetch_container_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_container_unittest.cc
@@ -77,7 +77,7 @@ run_loop.Run(); // This will run until the cookie listener is updated. - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); return result; } @@ -897,7 +897,7 @@ // asynchronously. EXPECT_TRUE( prefetch_container->IsStreamingURLLoaderDeletionScheduledForTesting()); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_FALSE(prefetch_container->GetStreamingURLLoader()); PrefetchContainer::Reader reader = prefetch_container->CreateReader(); @@ -941,7 +941,7 @@ prefetch_container.reset(); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(first_serving_url_loader_client->received_redirects().size(), 1u); @@ -954,7 +954,7 @@ first_serving_url_loader_client->DisconnectMojoPipes(); second_serving_url_loader_client->DisconnectMojoPipes(); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_FALSE(weak_first_response_reader); EXPECT_FALSE(weak_second_response_reader); @@ -986,7 +986,7 @@ pending_request.client->OnReceiveResponse( network::mojom::URLResponseHead::New(), std::move(consumer_handle), absl::nullopt); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Prefetching is ongoing. ASSERT_TRUE(prefetch_container.GetStreamingURLLoader()); @@ -1003,7 +1003,7 @@ EXPECT_EQ(prefetch_container.GetServableState(base::TimeDelta::Max()), PrefetchContainer::ServableState::kServable); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // `streaming_loader` is deleted asynchronously and its prefetching URL loader // is canceled. This itself doesn't make PrefetchContainer non-servable. @@ -1127,7 +1127,7 @@ pending_request.client->OnReceiveResponse( network::mojom::URLResponseHead::New(), std::move(consumer_handle), absl::nullopt); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(prefetch_container->GetServableState(base::TimeDelta::Max()), PrefetchContainer::ServableState::kServable); @@ -1200,11 +1200,8 @@ // Wait until the URLLoaderClient completion. // `base::RunLoop().RunUntilIdle()` is not sufficient here, because // `mojo::DataPipeProducer` uses thread pool. - base::RunLoop loop; - serving_url_loader_client->SetOnDataCompleteCallback( - loop.QuitClosure()); serving_url_loader_client->StartDraining(); - loop.Run(); + task_environment()->RunUntilIdle(); EXPECT_TRUE(producer_completed); break; } @@ -1216,7 +1213,7 @@ } done.insert(event); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // `PrefetchResponseReader` should be kept alive as long as // `PrefetchContainer` is alive or serving URLLoaderClients are not
diff --git a/content/browser/preloading/prefetch/prefetch_service_unittest.cc b/content/browser/preloading/prefetch/prefetch_service_unittest.cc index 4564148..cc3b668 100644 --- a/content/browser/preloading/prefetch/prefetch_service_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_service_unittest.cc
@@ -930,7 +930,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -1026,7 +1026,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1087,7 +1087,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1156,7 +1156,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -1241,7 +1241,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -1315,7 +1315,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1375,7 +1375,7 @@ PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = false}); @@ -1439,7 +1439,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1503,7 +1503,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1556,7 +1556,7 @@ GURL("http://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1619,7 +1619,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1681,7 +1681,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, @@ -1748,7 +1748,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1801,7 +1801,7 @@ GURL("https://localhost"), PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://localhost")); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, @@ -1867,7 +1867,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1930,7 +1930,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -1983,7 +1983,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2049,7 +2049,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2110,7 +2110,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2179,7 +2179,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 1); @@ -2233,7 +2233,7 @@ GURL("https://example.com/non_sw/index.html"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com/non_sw/index.html"), {.use_prefetch_proxy = true}); @@ -2297,7 +2297,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -2353,7 +2353,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2419,7 +2419,7 @@ PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, @@ -2487,7 +2487,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2498,7 +2498,7 @@ // Adding a cookie after the prefetch has started will cause it to fail when // being served. ASSERT_TRUE(SetCookie(GURL("https://example.com"), "testing")); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); Navigate(GURL("https://example.com"), main_rfh()->GetFrameToken()); @@ -2566,7 +2566,7 @@ PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, @@ -2643,7 +2643,7 @@ PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -2707,7 +2707,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -2772,7 +2772,7 @@ PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, @@ -2836,7 +2836,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2894,7 +2894,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -2958,7 +2958,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3020,7 +3020,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3083,7 +3083,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3151,7 +3151,7 @@ GURL("https://example1.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example1.com"), {.use_prefetch_proxy = true}); @@ -3163,7 +3163,7 @@ GURL("https://example2.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example2.com"), {.use_prefetch_proxy = true}); @@ -3175,7 +3175,7 @@ GURL("https://example3.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -3327,7 +3327,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3401,7 +3401,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3468,7 +3468,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -3534,7 +3534,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3619,7 +3619,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -3680,7 +3680,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -3737,7 +3737,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); @@ -3813,7 +3813,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -3948,7 +3948,7 @@ blink::mojom::SpeculationEagerness::kEager), /*referrer=*/blink::mojom::Referrer(), /*enable_no_vary_search_header=*/true); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com/?a=1"), {.use_prefetch_proxy = true}); @@ -4033,7 +4033,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -4130,7 +4130,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -4226,7 +4226,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -4314,7 +4314,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -4402,7 +4402,7 @@ blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); VerifyFollowRedirectParams(0); @@ -4505,7 +4505,7 @@ blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // The request to the same-origin prefetch URL should ignore the proxy // requirement, since it only applies to cross-origin prefetches. @@ -4600,7 +4600,7 @@ PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); VerifyFollowRedirectParams(0); @@ -4615,7 +4615,7 @@ CreateURLResponseHeadForPrefetch( net::HTTP_PERMANENT_REDIRECT, kHTMLMimeType, /*use_prefetch_proxy=*/true, {}, GURL("https://redirect.com"))); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Since the redirect is cross-site compared to the referrer. A new request // will be started in an isolated network context, and the redirect will not @@ -4707,7 +4707,7 @@ PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // The same-origin request should not use the proxy. VerifyCommonRequestState(GURL("https://example.com"), @@ -4724,7 +4724,7 @@ CreateURLResponseHeadForPrefetch( net::HTTP_PERMANENT_REDIRECT, kHTMLMimeType, /*use_prefetch_proxy=*/true, {}, GURL("https://redirect.com"))); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Since the redirect is cross-site compared to the referrer. A new request // will be started in an isolated network context, and the redirect will not @@ -4817,7 +4817,7 @@ PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://other.com"), {.use_prefetch_proxy = false}); @@ -4833,7 +4833,7 @@ net::HTTP_PERMANENT_REDIRECT, kHTMLMimeType, /*use_prefetch_proxy=*/true, {}, GURL("https://example.com/redirect"))); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Since the redirect is same-site compared to the referrer. A new request // will be started in the default network context, and the redirect will not @@ -4942,7 +4942,7 @@ PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com")); VerifyFollowRedirectParams(0); @@ -4966,7 +4966,7 @@ CreateURLResponseHeadForPrefetch( net::HTTP_PERMANENT_REDIRECT, kHTMLMimeType, /*use_prefetch_proxy=*/true, {}, GURL("https://redirect.com"))); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Since the redirect is cross-site compared to the referrer. A new request // will be started in an isolated network context, and the redirect will not @@ -5058,7 +5058,7 @@ PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager), /*referrer=*/referrer); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -5154,7 +5154,7 @@ GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(GURL("https://example.com"), {.use_prefetch_proxy = true}); @@ -5237,7 +5237,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -5355,7 +5355,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com/index.html?a=5"), @@ -5475,7 +5475,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com/index.html?a=5"), @@ -5587,7 +5587,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com/index.html?a=5"), @@ -5688,7 +5688,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -5710,7 +5710,7 @@ // Adding a cookie after while blocking until the head is received will cause // it to fail. ASSERT_TRUE(SetCookie(GURL("https://example.com"), "testing")); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Sends the head of the prefetch response. This should trigger the above // callback. @@ -5786,7 +5786,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -5878,7 +5878,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/false, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -6004,7 +6004,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/false, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -6121,7 +6121,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -6213,7 +6213,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -6306,7 +6306,7 @@ MakePrefetchOnMainFrame( GURL("https://example.com"), PrefetchType(/*use_prefetch_proxy=*/true, GetParam())); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL("https://example.com"), @@ -6415,7 +6415,7 @@ blink::mojom::SpeculationEagerness eagerness) { MakePrefetchOnMainFrame( url, PrefetchType(/*use_prefetch_proxy=*/false, eagerness)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); return CompleteExistingPrefetch( url, {.expected_priority = ExpectedPriorityForEagerness(eagerness)}); } @@ -6457,7 +6457,7 @@ MakePrefetchOnMainFrame( url_3, PrefetchType(/*use_prefetch_proxy=*/false, blink::mojom::SpeculationEagerness::kEager)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); EXPECT_EQ(RequestCount(), 0); Navigate(url_3, main_rfh()->GetFrameToken()); ASSERT_FALSE(GetPrefetchToServe(url_3)); @@ -6623,7 +6623,7 @@ candidates.push_back(candidate_3.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState(url_1); // Remove |url_2| from the list of candidates while a prefetch for |url_1| is @@ -6683,7 +6683,7 @@ candidates.push_back(candidate_2.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Prefetch for |url_1| should have started. VerifyCommonRequestState(url_1); @@ -6693,7 +6693,7 @@ candidates.push_back(candidate_2.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // The prefetch for |url_1| should be cancelled, and prefetch for |url_2| // should have started. @@ -6747,7 +6747,7 @@ candidates.push_back(candidate_2.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Complete prefetches for |url_1| and |url_2|. auto prefetch_1 = CompleteExistingPrefetch(url_1); @@ -6760,7 +6760,7 @@ candidates.push_back(candidate_2.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // |prefetch_1| should have been removed. EXPECT_FALSE(prefetch_1); EXPECT_TRUE(prefetch_2); @@ -6857,7 +6857,7 @@ candidates.push_back(candidate_2.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Complete |prefetch| of |url_1|. auto prefetch_1 = CompleteExistingPrefetch(url_1); @@ -6913,7 +6913,7 @@ candidates.push_back(candidate_2.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); auto prefetch_1 = CompleteExistingPrefetch(url_1); ASSERT_TRUE(prefetch_1); @@ -6930,7 +6930,7 @@ candidates.push_back(candidate_3.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Prefetch for |url_3| should succeed, and |prefetch_1| should be evicted. auto prefetch_3 = CompleteExistingPrefetch(url_3); @@ -6947,7 +6947,7 @@ candidates.push_back(candidate_3.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // |url_1| should not be reprefetched because we are at the limit. EXPECT_EQ(RequestCount(), 0); @@ -6958,7 +6958,7 @@ candidates.push_back(candidate_3.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Prefetch for |url_1| should succeed, |prefetch_2| will be evicted // (because |candidate_2| was removed). @@ -7062,7 +7062,7 @@ candidates.push_back(candidate.Clone()); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Prefetch for |url| should have started. VerifyCommonRequestState(url); @@ -7075,7 +7075,7 @@ candidates.clear(); prefetch_document_manager->ProcessCandidates(candidates, /*devtools_observer=*/nullptr); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); ExpectCorrectUkmLogs({.outcome = PreloadingTriggeringOutcome::kFailure, .failure = ToPreloadingFailureReason( @@ -7143,7 +7143,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL(kTestUrl + "?a=5"), @@ -7162,7 +7162,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestStateByUrl( GURL(kTestUrl + "?b=3"), @@ -7281,7 +7281,7 @@ VerifyCommonRequestState( GURL(kTestUrl), {.expected_priority = ExpectedPriorityForEagerness(GetParam())}); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); MakeResponseAndWait(net::HTTP_OK, net::OK, kHTMLMimeType, /*use_prefetch_proxy=*/false, {{"X-Testing", "Hello World"}}, kHTMLBody); @@ -7298,7 +7298,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestStateByUrl( GURL(kTestUrl + "?a=1"), {.expected_priority = ExpectedPriorityForEagerness(GetParam())}); @@ -7307,7 +7307,7 @@ // Adding a cookie after the prefetch has started will cause it to fail when // being served. ASSERT_TRUE(SetCookie(GURL("https://example.com"), "testing")); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); Navigate(GURL(kTestUrl), main_rfh()->GetFrameToken()); @@ -7375,7 +7375,7 @@ VerifyCommonRequestState( GURL(kTestUrl), {.expected_priority = ExpectedPriorityForEagerness(GetParam())}); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); { network::mojom::NoVarySearchPtr no_vary_search_hint = network::mojom::NoVarySearch::New(); @@ -7389,7 +7389,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestStateByUrl( GURL(kTestUrl + "?a=1"), {.expected_priority = ExpectedPriorityForEagerness(GetParam())}); @@ -7398,7 +7398,7 @@ // Adding a cookie after the prefetch has started will cause it to fail when // being served. ASSERT_TRUE(SetCookie(GURL("https://example.com"), "testing")); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); Navigate(GURL(kTestUrl), main_rfh()->GetFrameToken()); @@ -7425,7 +7425,7 @@ PrefetchContainer::Key(main_rfh()->GetGlobalId(), GURL(kTestUrl)), *prefetch_match_resolver); EXPECT_FALSE(is_fallback_navigation); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Sends the head of the prefetch response. This should not trigger the above // callback. @@ -7508,7 +7508,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestState( GURL(kTestUrl + "?a=5"), @@ -7527,7 +7527,7 @@ /* referrer */ blink::mojom::Referrer(), /* no_vary_search_support */ true, /* no_vary_search_hint */ std::move(no_vary_search_hint)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); VerifyCommonRequestStateByUrl( GURL(kTestUrl + "?b=3"), @@ -7556,7 +7556,7 @@ PrefetchContainer::Key(main_rfh()->GetGlobalId(), GURL(kTestUrl)), *prefetch_match_resolver); EXPECT_FALSE(is_nav_unblocked); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); // Sends the head of the prefetch response. This should not trigger the above // callback. SendHeadOfResponseAndWait(
diff --git a/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc b/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc index 60d3ffdf..6566c4b 100644 --- a/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_streaming_url_loader_unittest.cc
@@ -167,13 +167,12 @@ public ::testing::WithParamInterface<bool> { public: void SetUp() override { - task_environment_ = - std::make_unique<base::test::SingleThreadTaskEnvironment>( - base::test::TaskEnvironment::TimeSource::MOCK_TIME); + task_environment_ = std::make_unique<base::test::TaskEnvironment>( + base::test::TaskEnvironment::TimeSource::MOCK_TIME); test_url_loader_factory_ = std::make_unique<TestURLLoaderFactory>(); } - base::test::SingleThreadTaskEnvironment* task_environment() { + base::test::TaskEnvironment* task_environment() { return task_environment_.get(); } @@ -182,7 +181,7 @@ } private: - std::unique_ptr<base::test::SingleThreadTaskEnvironment> task_environment_; + std::unique_ptr<base::test::TaskEnvironment> task_environment_; std::unique_ptr<TestURLLoaderFactory> test_url_loader_factory_; };
diff --git a/content/browser/preloading/prefetch/prefetch_test_utils.cc b/content/browser/preloading/prefetch/prefetch_test_utils.cc index f01103a..5161e65d 100644 --- a/content/browser/preloading/prefetch/prefetch_test_utils.cc +++ b/content/browser/preloading/prefetch/prefetch_test_utils.cc
@@ -408,16 +408,8 @@ total_bytes_read_ += num_bytes; } -void PrefetchTestURLLoaderClient::SetOnDataCompleteCallback( - base::OnceClosure on_data_complete_callback) { - on_data_complete_callback_ = std::move(on_data_complete_callback); -} - void PrefetchTestURLLoaderClient::OnDataComplete() { body_finished_ = true; - if (on_data_complete_callback_) { - std::move(on_data_complete_callback_).Run(); - } } } // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_test_utils.h b/content/browser/preloading/prefetch/prefetch_test_utils.h index fc53720..3d04833d 100644 --- a/content/browser/preloading/prefetch/prefetch_test_utils.h +++ b/content/browser/preloading/prefetch/prefetch_test_utils.h
@@ -85,8 +85,6 @@ return received_redirects_; } - void SetOnDataCompleteCallback(base::OnceClosure on_data_complete_callback); - private: // network::mojom::URLLoaderClient void OnReceiveEarlyHints(network::mojom::EarlyHintsPtr early_hints) override; @@ -123,8 +121,6 @@ std::vector<std::pair<net::RedirectInfo, network::mojom::URLResponseHeadPtr>> received_redirects_; - - base::OnceClosure on_data_complete_callback_; }; } // namespace content
diff --git a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc index 3f1415b2..6eff0e3 100644 --- a/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc +++ b/content/browser/preloading/prefetch/prefetch_url_loader_interceptor_unittest.cc
@@ -348,7 +348,7 @@ run_loop.Run(); // This will run until the cookie listener gets the cookie change. - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); return result; } @@ -1113,7 +1113,7 @@ producer_handle.reset(); pending_request.client->OnComplete( network::URLLoaderCompletionStatus(net::OK)); - base::RunLoop().RunUntilIdle(); + task_environment()->RunUntilIdle(); break; }
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 3fd2f30..68b5026 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -5498,7 +5498,8 @@ common_params_->initiator_base_url = absl::nullopt; if (request_navigation_client_.is_bound()) { - if (GetRenderFrameHost() == frame_tree_node()->current_frame_host()) { + if (GetRenderFrameHost() == + RenderFrameHostImpl::FromID(previous_render_frame_host_id_)) { // Reuse the request NavigationClient for commit. commit_navigation_client_ = std::move(request_navigation_client_); } else { @@ -5648,7 +5649,8 @@ frame_tree_node_->render_manager()->speculative_frame_host()); if (request_navigation_client_.is_bound()) { - if (GetRenderFrameHost() == frame_tree_node()->current_frame_host()) { + if (GetRenderFrameHost() == + RenderFrameHostImpl::FromID(previous_render_frame_host_id_)) { // Reuse the request NavigationClient for commit. commit_navigation_client_ = std::move(request_navigation_client_); } else {
diff --git a/content/browser/renderer_host/page_impl.cc b/content/browser/renderer_host/page_impl.cc index 0e599ce..7750c37 100644 --- a/content/browser/renderer_host/page_impl.cc +++ b/content/browser/renderer_host/page_impl.cc
@@ -33,8 +33,8 @@ blink::features::kSharedStorageSelectURLLimit)) { select_url_overall_budget_ = static_cast<double>( blink::features::kSharedStorageSelectURLBitBudgetPerPageLoad.Get()); - select_url_max_bits_per_origin_ = static_cast<double>( - blink::features::kSharedStorageSelectURLBitBudgetPerOriginPerPageLoad + select_url_max_bits_per_site_ = static_cast<double>( + blink::features::kSharedStorageSelectURLBitBudgetPerSitePerPageLoad .Get()); } } @@ -328,8 +328,9 @@ return GetMainDocument().GetRenderWidgetHost()->GetKeyboardLayoutMap(); } -bool PageImpl::CheckAndMaybeDebitSelectURLBudgets(const url::Origin& origin, - double bits_to_charge) { +bool PageImpl::CheckAndMaybeDebitSelectURLBudgets( + const net::SchemefulSite& site, + double bits_to_charge) { if (!select_url_overall_budget_) { // The limits are not enabled. return true; @@ -340,21 +341,21 @@ return false; } - DCHECK(select_url_max_bits_per_origin_); + DCHECK(select_url_max_bits_per_site_); - // Return false if the max bits per origin is set to a value smaller than the + // Return false if the max bits per site is set to a value smaller than the // current bits to charge. - if (bits_to_charge > select_url_max_bits_per_origin_.value()) { + if (bits_to_charge > select_url_max_bits_per_site_.value()) { return false; } - // Charge the per-origin budget or return false if there is not enough. - auto it = select_url_per_origin_budget_.find(origin); - if (it == select_url_per_origin_budget_.end()) { - select_url_per_origin_budget_[origin] = - select_url_max_bits_per_origin_.value() - bits_to_charge; + // Charge the per-site budget or return false if there is not enough. + auto it = select_url_per_site_budget_.find(site); + if (it == select_url_per_site_budget_.end()) { + select_url_per_site_budget_[site] = + select_url_max_bits_per_site_.value() - bits_to_charge; } else if (bits_to_charge > it->second) { - // There is insufficient per-origin budget remaining. + // There is insufficient per-site budget remaining. return false; } else { it->second -= bits_to_charge;
diff --git a/content/browser/renderer_host/page_impl.h b/content/browser/renderer_host/page_impl.h index 5d4bfdb5..1c89da8d 100644 --- a/content/browser/renderer_host/page_impl.h +++ b/content/browser/renderer_host/page_impl.h
@@ -17,6 +17,7 @@ #include "content/browser/renderer_host/stored_page.h" #include "content/common/content_export.h" #include "content/public/browser/page.h" +#include "net/base/schemeful_site.h" #include "services/metrics/public/cpp/ukm_source.h" #include "services/metrics/public/cpp/ukm_source_id.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -183,7 +184,7 @@ // `blink::features::kSharedStorageSelectURLLimit` is enabled. If // `blink::features::kSharedStorageSelectURLLimit` is disabled, always returns // true. - bool CheckAndMaybeDebitSelectURLBudgets(const url::Origin& origin, + bool CheckAndMaybeDebitSelectURLBudgets(const net::SchemefulSite& site, double bits_to_charge); private: @@ -251,23 +252,23 @@ // If `blink::features::kSharedStorageSelectURLLimit` is enabled, the number // of bits of entropy remaining in this pageload's overall budget for calls to - // `sharedStorage.selectURL()`. Calls from all origins on this page are + // `sharedStorage.selectURL()`. Calls from all sites on this page are // charged to this budget. `select_url_overall_budget_` is not renewed until // `this` is destroyed, and it does not rely on any assumptions about when // specifically `this` is destroyed (e.g. during navigation or not). absl::optional<double> select_url_overall_budget_; // If `blink::features::kSharedStorageSelectURLLimit` is enabled, the maximum - // number of bits of entropy in a single origin's budget. - absl::optional<double> select_url_max_bits_per_origin_; + // number of bits of entropy in a single site's budget. + absl::optional<double> select_url_max_bits_per_site_; - // A map of origins to the number bits of entropy remaining in this origin's + // A map of sites to the number bits of entropy remaining in the site's // budget for calls to `sharedStorage.selectURL()` during this pageload. - // `select_url_per_origin_budget_` is not cleared until `this` is destroyed, + // `select_url_per_site_budget_` is not cleared until `this` is destroyed, // and it does not rely on any assumptions about when specifically `this` is // destroyed (e.g. during navigation or not). Used only if // `blink::features::kSharedStorageSelectURLLimit` is enabled. - base::flat_map<url::Origin, double> select_url_per_origin_budget_; + base::flat_map<net::SchemefulSite, double> select_url_per_site_budget_; // This class is owned by the main RenderFrameHostImpl and it's safe to keep a // reference to it.
diff --git a/content/browser/shared_storage/shared_storage_browsertest.cc b/content/browser/shared_storage/shared_storage_browsertest.cc index ddca78c..a5fbccf 100644 --- a/content/browser/shared_storage/shared_storage_browsertest.cc +++ b/content/browser/shared_storage/shared_storage_browsertest.cc
@@ -122,7 +122,7 @@ const int kSelectURLOverallBitBudget = 12; -const int kSelectURLOriginBitBudget = 6; +const int kSelectURLSiteBitBudget = 6; const char kGenerateURLsListScript[] = R"( function generateUrls(size) { @@ -860,7 +860,7 @@ base::test::TestFuture<SharedStorageWorkletHost::BudgetResult> future; static_cast<StoragePartitionImpl*>(GetStoragePartition()) ->GetSharedStorageManager() - ->GetRemainingBudget(origin, future.GetCallback()); + ->GetRemainingBudget(net::SchemefulSite(origin), future.GetCallback()); return future.Take().bits; } @@ -2687,7 +2687,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 0.0); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -2796,7 +2797,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 0.0); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -2909,7 +2911,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("b.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("b.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3)); SharedStorageReportingMap reporting_map = @@ -4015,7 +4018,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 0.0); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -4926,7 +4930,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3)); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -5098,7 +5103,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3)); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -5292,7 +5298,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, 0.0); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -5397,7 +5404,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3)); EXPECT_TRUE(GetSharedStorageReportingMap(observed_urn_uuid.value()).empty()); @@ -5506,7 +5514,8 @@ SharedStorageBudgetMetadata* metadata = GetSharedStorageBudgetMetadata(observed_urn_uuid.value()); EXPECT_TRUE(metadata); - EXPECT_EQ(metadata->origin, https_server()->GetOrigin("a.test")); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin("a.test"))); EXPECT_DOUBLE_EQ(metadata->budget_to_charge, std::log2(3)); EXPECT_THAT(GetSharedStorageReportingMap(observed_urn_uuid.value()), @@ -7211,8 +7220,8 @@ {{blink::features::kSharedStorageSelectURLLimit, {{"SharedStorageSelectURLBitBudgetPerPageLoad", base::NumberToString(kSelectURLOverallBitBudget)}, - {"SharedStorageSelectURLBitBudgetPerOriginPerPageLoad", - base::NumberToString(kSelectURLOriginBitBudget)}}}}, + {"SharedStorageSelectURLBitBudgetPerSitePerPageLoad", + base::NumberToString(kSelectURLSiteBitBudget)}}}}, /*disabled_features=*/{}); } else { select_url_limit_feature_list_.InitAndDisableFeature( @@ -7320,7 +7329,8 @@ if (!metadata) { return absl::nullopt; } - EXPECT_EQ(metadata->origin, https_server()->GetOrigin(host_str)); + EXPECT_EQ(metadata->site, + net::SchemefulSite(https_server()->GetOrigin(host_str))); return std::make_pair(config->mapped_url_->GetValueIgnoringVisibility(), metadata->budget_to_charge); @@ -7379,7 +7389,7 @@ }); IN_PROC_BROWSER_TEST_P(SharedStorageSelectURLLimitBrowserTest, - SelectURL_MainFrame_SameEntropy_OriginLimitReached) { + SelectURL_MainFrame_SameEntropy_SiteLimitReached) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -7390,12 +7400,12 @@ )")); // This test relies on the assumption that `kSelectURLOverallBitBudget` is set - // to be greater than or equal to `kSelectURLOriginBitBudget`. - EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget); + // to be greater than or equal to `kSelectURLSiteBitBudget`. + EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLSiteBitBudget); // Here each call to `selectURL()` will have 8 input URLs, and hence // 3 = log2(8) bits of entropy. - int call_limit = kSelectURLOriginBitBudget / 3; + int call_limit = kSelectURLSiteBitBudget / 3; for (int i = 0; i < call_limit; i++) { RunSuccessfulSelectURLInMainFrame("a.test", /*num_urls=*/8, @@ -7404,7 +7414,7 @@ if (LimitSelectURLCalls()) { // The limit for `selectURL()` has now been reached for "a.test". Make one - // more call, which will return the default URL due to insufficient origin + // more call, which will return the default URL due to insufficient site // pageload budget. absl::optional<std::pair<GURL, double>> result_pair = RunSelectURLExtractingMappedURLAndBudgetToCharge(shell(), "a.test", @@ -7430,9 +7440,8 @@ call_limit + 1); } -IN_PROC_BROWSER_TEST_P( - SharedStorageSelectURLLimitBrowserTest, - SelectURL_MainFrame_DifferentEntropy_OriginLimitReached) { +IN_PROC_BROWSER_TEST_P(SharedStorageSelectURLLimitBrowserTest, + SelectURL_MainFrame_DifferentEntropy_SiteLimitReached) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -7443,15 +7452,15 @@ )")); // This test relies on the assumptions that `kSelectURLOverallBitBudget` is - // set to be greater than or equal to `kSelectURLOriginBitBudget` and that the + // set to be greater than or equal to `kSelectURLSiteBitBudget` and that the // latter is at least 3. - EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget); - EXPECT_GE(kSelectURLOriginBitBudget, 3); + EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLSiteBitBudget); + EXPECT_GE(kSelectURLSiteBitBudget, 3); // Here the first call to `selectURL()` will have 8 input URLs, and hence // 3 = log2(8) bits of entropy, and the subsequent calls will each have 4 // input URLs, and hence 2 = log2(4) bits of entropy. - int input4_call_limit = (kSelectURLOriginBitBudget - 3) / 2; + int input4_call_limit = (kSelectURLSiteBitBudget - 3) / 2; RunSuccessfulSelectURLInMainFrame("a.test", /*num_urls=*/8, &console_observer); @@ -7463,7 +7472,7 @@ if (LimitSelectURLCalls()) { // The limit for `selectURL()` has now been reached for "a.test". Make one - // more call, which will return the default URL due to insufficient origin + // more call, which will return the default URL due to insufficient site // pageload budget. absl::optional<std::pair<GURL, double>> result_pair = RunSelectURLExtractingMappedURLAndBudgetToCharge(shell(), "a.test", @@ -7491,19 +7500,19 @@ IN_PROC_BROWSER_TEST_P( SharedStorageSelectURLLimitBrowserTest, - SelectURL_IframesSharingCommonOrigin_SameEntropy_OriginLimitReached) { + SelectURL_IframesSharingCommonSite_SameEntropy_SiteLimitReached) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); WebContentsConsoleObserver console_observer(shell()->web_contents()); // This test relies on the assumption that `kSelectURLOverallBitBudget` is set - // to be greater than or equal to `kSelectURLOriginBitBudget`. - EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget); + // to be greater than or equal to `kSelectURLSiteBitBudget`. + EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLSiteBitBudget); // Here each call to `selectURL()` will have 8 input URLs, and hence // 3 = log2(8) bits of entropy. - int call_limit = kSelectURLOriginBitBudget / 3; + int call_limit = kSelectURLSiteBitBudget / 3; GURL iframe_url = https_server()->GetURL("b.test", kSimplePagePath); @@ -7526,7 +7535,7 @@ )")); // The limit for `selectURL()` has now been reached for "b.test". Make one - // more call, which will return the default URL due to insufficient origin + // more call, which will return the default URL due to insufficient site // pageload budget. absl::optional<std::pair<GURL, double>> result_pair = RunSelectURLExtractingMappedURLAndBudgetToCharge(iframe_node, "b.test", @@ -7553,7 +7562,7 @@ IN_PROC_BROWSER_TEST_P( SharedStorageSelectURLLimitBrowserTest, - SelectURL_IframesSharingCommonOrigin_DifferentEntropy_OriginLimitReached) { + SelectURL_IframesSharingCommonSite_DifferentEntropy_SiteLimitReached) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); @@ -7569,15 +7578,15 @@ &console_observer); // This test relies on the assumptions that `kSelectURLOverallBitBudget` is - // set to be greater than or equal to `kSelectURLOriginBitBudget` and that the + // set to be greater than or equal to `kSelectURLSiteBitBudget` and that the // latter is at least 3. - EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget); - EXPECT_GE(kSelectURLOriginBitBudget, 3); + EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLSiteBitBudget); + EXPECT_GE(kSelectURLSiteBitBudget, 3); // Here the first call to `selectURL()` will have 8 input URLs, and hence // 3 = log2(8) bits of entropy, and the subsequent calls will each have 4 // input URLs, and hence 2 = log2(4) bits of entropy. - int input4_call_limit = (kSelectURLOriginBitBudget - 3) / 2; + int input4_call_limit = (kSelectURLSiteBitBudget - 3) / 2; for (int i = 0; i < input4_call_limit; i++) { // Create a new iframe. @@ -7598,7 +7607,7 @@ )")); // The limit for `selectURL()` has now been reached for "b.test". Make one - // more call, which will return the default URL due to insufficient origin + // more call, which will return the default URL due to insufficient site // pageload budget. absl::optional<std::pair<GURL, double>> result_pair = RunSelectURLExtractingMappedURLAndBudgetToCharge(last_iframe_node, @@ -7626,24 +7635,24 @@ IN_PROC_BROWSER_TEST_P( SharedStorageSelectURLLimitBrowserTest, - SelectURL_IframesDifferentOrigin_SameEntropy_OverallLimitNotReached) { + SelectURL_IframesDifferentSite_SameEntropy_OverallLimitNotReached) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); WebContentsConsoleObserver console_observer(shell()->web_contents()); // This test relies on the assumption that `kSelectURLOverallBitBudget` is set - // to be strictly greater than `kSelectURLOriginBitBudget`, enough for at - // least one 8-URL call to `selectURL()` beyond the per-origin limit. - EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget + 3); + // to be strictly greater than `kSelectURLSiteBitBudget`, enough for at + // least one 8-URL call to `selectURL()` beyond the per-site limit. + EXPECT_GE(kSelectURLOverallBitBudget, kSelectURLSiteBitBudget + 3); // Here each call to `selectURL()` will have 8 input URLs, and hence // 3 = log2(8) bits of entropy. - int per_origin_call_limit = kSelectURLOriginBitBudget / 3; + int per_site_call_limit = kSelectURLSiteBitBudget / 3; GURL iframe_url1 = https_server()->GetURL("b.test", kSimplePagePath); - for (int i = 0; i < per_origin_call_limit; i++) { + for (int i = 0; i < per_site_call_limit; i++) { // Create a new iframe. FrameTreeNode* iframe_node = CreateIFrame(PrimaryFrameTreeNodeRoot(), iframe_url1); @@ -7662,7 +7671,7 @@ )")); // The limit for `selectURL()` has now been reached for "b.test". Make one - // more call, which will return the default URL due to insufficient origin + // more call, which will return the default URL due to insufficient site // pageload budget. absl::optional<std::pair<GURL, double>> result_pair = RunSelectURLExtractingMappedURLAndBudgetToCharge( @@ -7683,7 +7692,7 @@ /*num_urls=*/4, &console_observer); } - // Create a new iframe with a different origin. + // Create a new iframe with a different site. GURL iframe_url2 = https_server()->GetURL("c.test", kSimplePagePath); FrameTreeNode* last_iframe_node = CreateIFrame(PrimaryFrameTreeNodeRoot(), iframe_url2); @@ -7696,34 +7705,34 @@ WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram}); histogram_tester_.ExpectTotalCount(kTimingSelectUrlExecutedInWorkletHistogram, - per_origin_call_limit + 2); + per_site_call_limit + 2); } IN_PROC_BROWSER_TEST_P( SharedStorageSelectURLLimitBrowserTest, - SelectURL_IframesDifferentOrigin_DifferentEntropy_OverallLimitReached) { + SelectURL_IframesDifferentSite_DifferentEntropy_OverallLimitReached) { GURL main_url = https_server()->GetURL("a.test", kSimplePagePath); EXPECT_TRUE(NavigateToURL(shell(), main_url)); WebContentsConsoleObserver console_observer(shell()->web_contents()); // This test relies on the assumptions that `kSelectURLOverallBitBudget` is - // set to be strictly greater than `kSelectURLOriginBitBudget` and that the + // set to be strictly greater than `kSelectURLSiteBitBudget` and that the // latter is at least 3. - EXPECT_GT(kSelectURLOverallBitBudget, kSelectURLOriginBitBudget); - EXPECT_GE(kSelectURLOriginBitBudget, 3); + EXPECT_GT(kSelectURLOverallBitBudget, kSelectURLSiteBitBudget); + EXPECT_GE(kSelectURLSiteBitBudget, 3); - int num_origin_limit = kSelectURLOverallBitBudget / kSelectURLOriginBitBudget; + int num_site_limit = kSelectURLOverallBitBudget / kSelectURLSiteBitBudget; - // We will run out of chars if we have too many origins. - EXPECT_LT(num_origin_limit, 25); + // We will run out of chars if we have too many sites. + EXPECT_LT(num_site_limit, 25); - // For each origin, the first call to `selectURL()` will have 8 input URLs, + // For each site, the first call to `selectURL()` will have 8 input URLs, // and hence 3 = log2(8) bits of entropy, whereas the subsequent calls for - // that origin will have 2 input URLs, and hence 1 = log2(2) bit of entropy. - int per_origin_input2_call_limit = kSelectURLOriginBitBudget - 3; + // that site will have 2 input URLs, and hence 1 = log2(2) bit of entropy. + int per_site_input2_call_limit = kSelectURLSiteBitBudget - 3; - for (int i = 0; i < num_origin_limit; i++) { + for (int i = 0; i < num_site_limit; i++) { std::string iframe_host = base::StrCat({std::string(1, 'b' + i), ".test"}); GURL iframe_url = https_server()->GetURL(iframe_host, kSimplePagePath); @@ -7734,7 +7743,7 @@ RunSuccessfulSelectURLInIframe(first_loop_iframe_node, /*num_urls=*/8, &console_observer); - for (int j = 0; j < per_origin_input2_call_limit; j++) { + for (int j = 0; j < per_site_input2_call_limit; j++) { // Create a new iframe. FrameTreeNode* loop_iframe_node = CreateIFrame(PrimaryFrameTreeNodeRoot(), iframe_url); @@ -7754,7 +7763,7 @@ // The limit for `selectURL()` has now been reached for `iframe_host`. // Make one more call, which will return the default URL due to - // insufficient origin pageload budget. + // insufficient site pageload budget. absl::optional<std::pair<GURL, double>> result_pair = RunSelectURLExtractingMappedURLAndBudgetToCharge( last_loop_iframe_node, iframe_host, @@ -7777,11 +7786,11 @@ } std::string iframe_host = - base::StrCat({std::string(1, 'b' + num_origin_limit), ".test"}); + base::StrCat({std::string(1, 'b' + num_site_limit), ".test"}); GURL iframe_url = https_server()->GetURL(iframe_host, kSimplePagePath); int overall_budget_remaining = - kSelectURLOverallBitBudget % kSelectURLOriginBitBudget; + kSelectURLOverallBitBudget % kSelectURLSiteBitBudget; for (int j = 0; j < overall_budget_remaining; j++) { // Create a new iframe. @@ -7827,7 +7836,7 @@ WaitForHistograms({kTimingSelectUrlExecutedInWorkletHistogram}); histogram_tester_.ExpectTotalCount( kTimingSelectUrlExecutedInWorkletHistogram, - num_origin_limit * (2 + per_origin_input2_call_limit) + + num_site_limit * (2 + per_site_input2_call_limit) + overall_budget_remaining + 1); }
diff --git a/content/browser/shared_storage/shared_storage_budget_charger.cc b/content/browser/shared_storage/shared_storage_budget_charger.cc index 06425d8..90f63e42 100644 --- a/content/browser/shared_storage/shared_storage_budget_charger.cc +++ b/content/browser/shared_storage/shared_storage_budget_charger.cc
@@ -76,7 +76,7 @@ } shared_storage_manager->MakeBudgetWithdrawal( - metadata->origin, metadata->budget_to_charge, base::DoNothing()); + metadata->site, metadata->budget_to_charge, base::DoNothing()); } }
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.cc b/content/browser/shared_storage/shared_storage_worklet_host.cc index 3729fe6..f2af046 100644 --- a/content/browser/shared_storage/shared_storage_worklet_host.cc +++ b/content/browser/shared_storage/shared_storage_worklet_host.cc
@@ -58,7 +58,7 @@ StoragePartition* storage_partition, BrowserContext* browser_context, PageImpl* page, - const url::Origin& shared_storage_origin, + const net::SchemefulSite& shared_storage_site, std::vector<blink::mojom::SharedStorageUrlWithMetadataPtr> urls_with_metadata, uint32_t index, @@ -73,10 +73,9 @@ // If we are running out of budget, consider this mapping to be failed. Use // the default URL, and there's no need to further charge the budget. - if (budget_to_charge > 0.0 && - (budget_to_charge > budget_remaining || - !page->CheckAndMaybeDebitSelectURLBudgets(shared_storage_origin, - budget_to_charge))) { + if (budget_to_charge > 0.0 && (budget_to_charge > budget_remaining || + !page->CheckAndMaybeDebitSelectURLBudgets( + shared_storage_site, budget_to_charge))) { failed_due_to_no_budget = true; index = 0; budget_to_charge = 0.0; @@ -92,7 +91,7 @@ } return SharedStorageURNMappingResult( mapped_url, - SharedStorageBudgetMetadata{.origin = shared_storage_origin, + SharedStorageBudgetMetadata{.site = shared_storage_site, .budget_to_charge = budget_to_charge}, std::move(fenced_frame_reporter)); } @@ -160,6 +159,7 @@ document_service.render_frame_host().GetBrowserContext()), shared_storage_origin_( document_service.render_frame_host().GetLastCommittedOrigin()), + shared_storage_site_(net::SchemefulSite(shared_storage_origin_)), main_frame_origin_(document_service.main_frame_origin()), creation_time_(base::TimeTicks::Now()) { GetContentClient()->browser()->OnSharedStorageWorkletHostCreated( @@ -199,7 +199,7 @@ .OnSharedStorageURNMappingResultDetermined( urn_uuid, CreateSharedStorageURNMappingResult( storage_partition_, browser_context_, page_.get(), - shared_storage_origin_, std::move(it->second), + shared_storage_site_, std::move(it->second), /*index=*/0, /*budget_remaining=*/0.0, failed_due_to_no_budget)); @@ -723,7 +723,7 @@ std::move(callback)); shared_storage_manager_->GetRemainingBudget( - shared_storage_origin_, std::move(operation_completed_callback)); + shared_storage_site_, std::move(operation_completed_callback)); } void SharedStorageWorkletHost::ConsoleLog(const std::string& message) { @@ -812,7 +812,7 @@ } shared_storage_manager_->GetRemainingBudget( - shared_storage_origin_, + shared_storage_site_, base::BindOnce(&SharedStorageWorkletHost:: OnRunURLSelectionOperationOnWorkletFinished, weak_ptr_factory_.GetWeakPtr(), urn_uuid, start_time, @@ -838,7 +838,7 @@ SharedStorageURNMappingResult mapping_result = CreateSharedStorageURNMappingResult( storage_partition_, browser_context_, page_.get(), - shared_storage_origin_, std::move(urls_with_metadata), index, + shared_storage_site_, std::move(urls_with_metadata), index, budget_result.bits, failed_due_to_no_budget); if (document_service_) {
diff --git a/content/browser/shared_storage/shared_storage_worklet_host.h b/content/browser/shared_storage/shared_storage_worklet_host.h index e51954d..17f858b 100644 --- a/content/browser/shared_storage/shared_storage_worklet_host.h +++ b/content/browser/shared_storage/shared_storage_worklet_host.h
@@ -16,6 +16,7 @@ #include "content/common/content_export.h" #include "mojo/public/cpp/bindings/associated_receiver.h" #include "mojo/public/cpp/bindings/remote.h" +#include "net/base/schemeful_site.h" #include "services/network/public/mojom/url_loader_factory.mojom.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/shared_storage/shared_storage_utils.h" @@ -249,8 +250,9 @@ // `IsSharedStorageAllowed()`, and to get the global URLLoaderFactory. raw_ptr<BrowserContext> browser_context_; - // The shared storage owner document's origin. + // The shared storage owner document's origin and site. url::Origin shared_storage_origin_; + net::SchemefulSite shared_storage_site_; // To avoid race conditions associated with top frame navigations and to be // able to call `IsSharedStorageAllowed()` during keep-alive, we need to save
diff --git a/content/browser/webid/fake_identity_request_dialog_controller.cc b/content/browser/webid/fake_identity_request_dialog_controller.cc index 90a14882..8aee013 100644 --- a/content/browser/webid/fake_identity_request_dialog_controller.cc +++ b/content/browser/webid/fake_identity_request_dialog_controller.cc
@@ -77,7 +77,7 @@ const IdentityProviderMetadata& idp_metadata, DismissCallback dismiss_callback, SigninToIdPCallback signin_callback) { - title_ = "Confirm IDP Signin"; + title_ = "Confirm IDP Login"; } void FakeIdentityRequestDialogController::ShowErrorDialog(
diff --git a/content/browser/webid/federated_auth_request_impl.cc b/content/browser/webid/federated_auth_request_impl.cc index c9d311c..0780c4d 100644 --- a/content/browser/webid/federated_auth_request_impl.cc +++ b/content/browser/webid/federated_auth_request_impl.cc
@@ -416,8 +416,9 @@ FederatedAuthRequestImpl::IdentityProviderGetInfo::IdentityProviderGetInfo( blink::mojom::IdentityProviderConfigPtr provider, - blink::mojom::RpContext rp_context) - : provider(std::move(provider)), rp_context(rp_context) {} + blink::mojom::RpContext rp_context, + blink::mojom::RpMode rp_mode) + : provider(std::move(provider)), rp_context(rp_context), rp_mode(rp_mode) {} FederatedAuthRequestImpl::IdentityProviderGetInfo::~IdentityProviderGetInfo() = default; @@ -431,6 +432,7 @@ const IdentityProviderGetInfo& other) { provider = other.provider->Clone(); rp_context = other.rp_context; + rp_mode = other.rp_mode; return *this; } @@ -438,11 +440,13 @@ const blink::mojom::IdentityProviderConfigPtr& provider, IdpNetworkRequestManager::Endpoints endpoints, IdentityProviderMetadata metadata, - blink::mojom::RpContext rp_context) + blink::mojom::RpContext rp_context, + blink::mojom::RpMode rp_mode) : provider(provider->Clone()), endpoints(std::move(endpoints)), metadata(std::move(metadata)), - rp_context(rp_context) {} + rp_context(rp_context), + rp_mode(rp_mode) {} FederatedAuthRequestImpl::IdentityProviderInfo::~IdentityProviderInfo() = default; @@ -453,6 +457,7 @@ metadata = other.metadata; has_failing_idp_signin_status = other.has_failing_idp_signin_status; rp_context = other.rp_context; + rp_mode = other.rp_mode; data = other.data; } @@ -844,10 +849,12 @@ for (auto& idp_ptr : idp_get_params_ptr->providers) { idp_order_.push_back(idp_ptr->get_federated()->config_url); blink::mojom::RpContext rp_context = idp_get_params_ptr->context; + blink::mojom::RpMode rp_mode = idp_get_params_ptr->mode; const GURL& idp_config_url = idp_ptr->get_federated()->config_url; token_request_get_infos_.emplace( - idp_config_url, IdentityProviderGetInfo( - std::move(idp_ptr->get_federated()), rp_context)); + idp_config_url, + IdentityProviderGetInfo(std::move(idp_ptr->get_federated()), + rp_context, rp_mode)); } } @@ -1095,7 +1102,7 @@ get_info_it->second.provider, std::move(fetch_result.endpoints), fetch_result.metadata ? std::move(*fetch_result.metadata) : IdentityProviderMetadata(), - get_info_it->second.rp_context); + get_info_it->second.rp_context, get_info_it->second.rp_mode); if (fetch_result.error) { const FederatedProviderFetcher::FetchError& fetch_error = @@ -1483,11 +1490,11 @@ base::BindOnce(&FederatedAuthRequestImpl::CompleteRequestWithError, weak_ptr_factory_.GetWeakPtr())); - // If IdP sign-in status mismatch dialog is already visible, calling - // ShowFailureDialog() a 2nd time should notify the user that sign-in + // If IdP login status mismatch dialog is already visible, calling + // ShowFailureDialog() a 2nd time should notify the user that login // failed. - dialog_type_ = kConfirmIdpSignin; - signin_url_ = idp_info->metadata.idp_signin_url; + dialog_type_ = kConfirmIdpLogin; + login_url_ = idp_info->metadata.idp_login_url; request_dialog_controller_->ShowFailureDialog( GetTopFrameOriginForDisplay(GetEmbeddingOrigin()), iframe_for_display, FormatOriginForDisplay(idp_origin), idp_info->rp_context, @@ -1495,7 +1502,7 @@ base::BindOnce(&FederatedAuthRequestImpl::OnDismissFailureDialog, weak_ptr_factory_.GetWeakPtr()), base::BindOnce(&FederatedAuthRequestImpl::ShowModalDialog, - weak_ptr_factory_.GetWeakPtr(), signin_url_)); + weak_ptr_factory_.GetWeakPtr(), login_url_)); fedcm_metrics_->RecordMismatchDialogShown(); mismatch_dialog_shown_time_ = base::TimeTicks::Now(); devtools_instrumentation::OnFedCmDialogShown(&render_frame_host()); @@ -2199,7 +2206,7 @@ idp_order_.clear(); metrics_endpoints_.clear(); token_request_get_infos_.clear(); - signin_url_ = GURL(); + login_url_ = GURL(); dialog_type_ = kNone; } @@ -2411,12 +2418,12 @@ OnDialogDismissed(reason); } -void FederatedAuthRequestImpl::AcceptConfirmIdpSigninDialogForDevtools() { - DCHECK(signin_url_.is_valid()); - ShowModalDialog(signin_url_); +void FederatedAuthRequestImpl::AcceptConfirmIdpLoginDialogForDevtools() { + DCHECK(login_url_.is_valid()); + ShowModalDialog(login_url_); } -void FederatedAuthRequestImpl::DismissConfirmIdpSigninDialogForDevtools() { +void FederatedAuthRequestImpl::DismissConfirmIdpLoginDialogForDevtools() { // These values match what HandleAccountsFetchFailure passes. OnDismissFailureDialog( IdentityRequestDialogController::DismissReason::kOther);
diff --git a/content/browser/webid/federated_auth_request_impl.h b/content/browser/webid/federated_auth_request_impl.h index 045f32e..3553b12 100644 --- a/content/browser/webid/federated_auth_request_impl.h +++ b/content/browser/webid/federated_auth_request_impl.h
@@ -116,20 +116,23 @@ struct IdentityProviderGetInfo { IdentityProviderGetInfo(blink::mojom::IdentityProviderConfigPtr, - blink::mojom::RpContext rp_context); + blink::mojom::RpContext rp_context, + blink::mojom::RpMode rp_mode); ~IdentityProviderGetInfo(); IdentityProviderGetInfo(const IdentityProviderGetInfo&); IdentityProviderGetInfo& operator=(const IdentityProviderGetInfo& other); blink::mojom::IdentityProviderConfigPtr provider; blink::mojom::RpContext rp_context{blink::mojom::RpContext::kSignIn}; + blink::mojom::RpMode rp_mode{blink::mojom::RpMode::kWidget}; }; struct IdentityProviderInfo { IdentityProviderInfo(const blink::mojom::IdentityProviderConfigPtr&, IdpNetworkRequestManager::Endpoints, IdentityProviderMetadata, - blink::mojom::RpContext rp_context); + blink::mojom::RpContext rp_context, + blink::mojom::RpMode rp_mode); ~IdentityProviderInfo(); IdentityProviderInfo(const IdentityProviderInfo&); @@ -138,6 +141,7 @@ IdentityProviderMetadata metadata; bool has_failing_idp_signin_status{false}; blink::mojom::RpContext rp_context{blink::mojom::RpContext::kSignIn}; + blink::mojom::RpMode rp_mode{blink::mojom::RpMode::kWidget}; absl::optional<IdentityProviderData> data; }; @@ -150,14 +154,14 @@ return idp_data_for_display_; } - enum DialogType { kNone, kSelectAccount, kAutoReauth, kConfirmIdpSignin }; + enum DialogType { kNone, kSelectAccount, kAutoReauth, kConfirmIdpLogin }; DialogType GetDialogType() const { return dialog_type_; } void AcceptAccountsDialogForDevtools(const GURL& config_url, const IdentityRequestAccount& account); void DismissAccountsDialogForDevtools(bool should_embargo); - void AcceptConfirmIdpSigninDialogForDevtools(); - void DismissConfirmIdpSigninDialogForDevtools(); + void AcceptConfirmIdpLoginDialogForDevtools(); + void DismissConfirmIdpLoginDialogForDevtools(); // Check if the scope of the request allows the browser to mediate // or delegate (to the IdP) the authorization. @@ -413,8 +417,8 @@ // the navigator.credentials.get call. std::vector<GURL> idp_order_; - // If dialog_type_ is kConfirmIdpSignin, this is the signin URL for the IDP. - GURL signin_url_; + // If dialog_type_ is kConfirmIdpLogin, this is the login URL for the IDP. + GURL login_url_; DialogType dialog_type_ = kNone; MediationRequirement mediation_requirement_;
diff --git a/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc b/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc index 34a94db6..a1e8dce 100644 --- a/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_multiple_frames_unittest.cc
@@ -274,7 +274,8 @@ idp_ptrs.push_back(std::move(idp_ptr)); auto get_params = blink::mojom::IdentityProviderGetParameters::New( std::move(idp_ptrs), - /*rp_context=*/blink::mojom::RpContext::kSignIn); + /*rp_context=*/blink::mojom::RpContext::kSignIn, + /*rp_mode=*/blink::mojom::RpMode::kWidget); std::vector<blink::mojom::IdentityProviderGetParametersPtr> idp_get_params; idp_get_params.push_back(std::move(get_params));
diff --git a/content/browser/webid/federated_auth_request_impl_unittest.cc b/content/browser/webid/federated_auth_request_impl_unittest.cc index a753b862..f4fa6e8 100644 --- a/content/browser/webid/federated_auth_request_impl_unittest.cc +++ b/content/browser/webid/federated_auth_request_impl_unittest.cc
@@ -91,7 +91,7 @@ constexpr char kClientMetadataEndpoint[] = "https://idp.example/client_metadata"; constexpr char kMetricsEndpoint[] = "https://idp.example/metrics"; -constexpr char kIdpSigninUrl[] = "https://idp.example/signin_url"; +constexpr char kIdpLoginUrl[] = "https://idp.example/login_url"; constexpr char kPrivacyPolicyUrl[] = "https://rp.example/pp"; constexpr char kTermsOfServiceUrl[] = "https://rp.example/tos"; constexpr char kClientId[] = "client_id_123"; @@ -225,6 +225,7 @@ struct RequestParameters { std::vector<IdentityProviderParameters> identity_providers; blink::mojom::RpContext rp_context; + blink::mojom::RpMode rp_mode; }; // Expected return values from a call to RequestToken. @@ -262,7 +263,7 @@ std::string token_endpoint; std::string client_metadata_endpoint; std::string metrics_endpoint; - std::string idp_signin_url; + std::string idp_login_url; }; struct MockIdpInfo { @@ -311,7 +312,7 @@ static const RequestParameters kDefaultRequestParameters{ std::vector<IdentityProviderParameters>{kDefaultIdentityProviderConfig}, - blink::mojom::RpContext::kSignIn}; + blink::mojom::RpContext::kSignIn, blink::mojom::RpMode::kWidget}; static const MockIdpInfo kDefaultIdentityProviderInfo{ {kWellKnown, {ParseStatus::kSuccess, net::HTTP_OK}}, @@ -321,7 +322,7 @@ kTokenEndpoint, kClientMetadataEndpoint, kMetricsEndpoint, - kIdpSigninUrl, + kIdpLoginUrl, }, kDefaultClientMetadata, {ParseStatus::kSuccess, net::HTTP_OK}, @@ -340,7 +341,7 @@ "https://idp2.example/token", "https://idp2.example/client_metadata", "https://idp2.example/metrics", - "https://idp2.example/signin_url", + "https://idp2.example/login_url", }, kDefaultClientMetadata, {ParseStatus::kSuccess, net::HTTP_OK}, @@ -364,7 +365,8 @@ /*hosted_domain=*/""}, {kProviderTwoUrlFull, kClientId, kNonce, /*login_hint=*/"", /*hosted_domain=*/""}}, - /*rp_context=*/blink::mojom::RpContext::kSignIn}; + /*rp_context=*/blink::mojom::RpContext::kSignIn, + /*rp_mode=*/blink::mojom::RpMode::kWidget}; MockConfiguration kConfigurationMultiIdpValid{ kToken, @@ -434,8 +436,8 @@ IdentityProviderMetadata idp_metadata; idp_metadata.config_url = provider; - idp_metadata.idp_signin_url = - GURL(config_.idp_info[provider_key].config.idp_signin_url); + idp_metadata.idp_login_url = + GURL(config_.idp_info[provider_key].config.idp_login_url); base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), @@ -889,7 +891,8 @@ idp_ptrs.push_back(std::move(idp_ptr)); blink::mojom::IdentityProviderGetParametersPtr get_params = blink::mojom::IdentityProviderGetParameters::New( - std::move(idp_ptrs), request_parameters.rp_context); + std::move(idp_ptrs), request_parameters.rp_context, + request_parameters.rp_mode); idp_get_params.push_back(std::move(get_params)); } @@ -1429,10 +1432,10 @@ EXPECT_EQ("Provider's FedCM config file is invalid.", messages[1]); } -// Test that request does not fail if config is missing an IDP signin URL. -TEST_F(FederatedAuthRequestImplTest, MissingSigninURL) { +// Test that request does not fail if config is missing an IDP login URL. +TEST_F(FederatedAuthRequestImplTest, MissingLoginURL) { MockConfiguration configuration = kConfigurationValid; - configuration.idp_info[kProviderUrlFull].config.idp_signin_url = ""; + configuration.idp_info[kProviderUrlFull].config.idp_login_url = ""; RunAuthTest(kDefaultRequestParameters, kExpectationSuccess, configuration); EXPECT_TRUE(DidFetchWellKnownAndConfig()); } @@ -1461,16 +1464,16 @@ EXPECT_FALSE(DidFetch(FetchedEndpoint::ACCOUNTS)); } -// Test that request fails if IDP signin URL is different origin from IDP config +// Test that request fails if IDP login URL is different origin from IDP config // URL. -TEST_F(FederatedAuthRequestImplTest, SigninUrlDifferentOriginIdp) { - // We only validate the signin_url if IdpSigninStatus is enabled. +TEST_F(FederatedAuthRequestImplTest, LoginUrlDifferentOriginIdp) { + // We only validate the login_url if IdpSigninStatus is enabled. base::test::ScopedFeatureList list; list.InitAndEnableFeature(features::kFedCmIdpSigninStatusEnabled); MockConfiguration configuration = kConfigurationValid; - configuration.idp_info[kProviderUrlFull].config.idp_signin_url = - "https://idp2.example/signin_url"; + configuration.idp_info[kProviderUrlFull].config.idp_login_url = + "https://idp2.example/login_url"; RequestExpectations expectations = { RequestTokenStatus::kError, FederatedAuthRequestResult::kErrorFetchingConfigInvalidResponse, @@ -1484,7 +1487,7 @@ ASSERT_EQ(2U, messages.size()); EXPECT_EQ( "Config file is missing or has an invalid URL for the following:\n" - "\"signin_url\"\n", + "\"login_url\"\n", messages[0]); EXPECT_EQ("Provider's FedCM config file is invalid.", messages[1]); }
diff --git a/content/browser/webid/federated_provider_fetcher.cc b/content/browser/webid/federated_provider_fetcher.cc index 5b66086..120c118 100644 --- a/content/browser/webid/federated_provider_fetcher.cc +++ b/content/browser/webid/federated_provider_fetcher.cc
@@ -236,13 +236,13 @@ fetch_result.endpoints.accounts); url::Origin idp_origin = url::Origin::Create(fetch_result.identity_provider_config_url); - // We only need a signin URL if the IDP signin status API is enabled. - bool is_signin_url_valid = + // We only need a login URL if the IDP signin status API is enabled. + bool is_login_url_valid = webid::GetIdpSigninStatusMode(render_frame_host_.get(), idp_origin) != FedCmIdpSigninStatusMode::ENABLED || webid::IsEndpointSameOrigin(fetch_result.identity_provider_config_url, - idp_metadata.idp_signin_url); - if (!is_token_valid || !is_accounts_valid || !is_signin_url_valid) { + idp_metadata.idp_login_url); + if (!is_token_valid || !is_accounts_valid || !is_login_url_valid) { std::string console_message = "Config file is missing or has an invalid URL for the following:\n"; if (!is_token_valid) { @@ -251,8 +251,8 @@ if (!is_accounts_valid) { console_message += "\"accounts_endpoint\"\n"; } - if (!is_signin_url_valid) { - console_message += "\"signin_url\"\n"; + if (!is_login_url_valid) { + console_message += "\"login_url\"\n"; } OnError(fetch_result,
diff --git a/content/browser/webid/idp_network_request_manager.cc b/content/browser/webid/idp_network_request_manager.cc index 09797aa..bfd7c09 100644 --- a/content/browser/webid/idp_network_request_manager.cc +++ b/content/browser/webid/idp_network_request_manager.cc
@@ -65,7 +65,8 @@ constexpr char kAccountsEndpointKey[] = "accounts_endpoint"; constexpr char kClientMetadataEndpointKey[] = "client_metadata_endpoint"; constexpr char kMetricsEndpoint[] = "metrics_endpoint"; -constexpr char kSigninUrlKey[] = "signin_url"; +constexpr char kLoginUrlKeyDeprecated[] = "login_url"; +constexpr char kLoginUrlKey[] = "login_url"; // Keys in fedcm.json 'branding' dictionary. constexpr char kIdpBrandingBackgroundColor[] = "background_color"; @@ -496,7 +497,11 @@ idp_brand_icon_ideal_size, idp_brand_icon_minimum_size, idp_metadata); } - idp_metadata.idp_signin_url = ExtractEndpoint(kSigninUrlKey); + idp_metadata.idp_login_url = ExtractEndpoint(kLoginUrlKey); + // TODO(cbiesinger): remove this fallback before 120 + if (idp_metadata.idp_login_url.is_empty()) { + idp_metadata.idp_login_url = ExtractEndpoint(kLoginUrlKeyDeprecated); + } std::move(callback).Run({ParseStatus::kSuccess, fetch_status.response_code}, endpoints, std::move(idp_metadata));
diff --git a/content/browser/webid/idp_network_request_manager.h b/content/browser/webid/idp_network_request_manager.h index 585b0ea42..64daeb0 100644 --- a/content/browser/webid/idp_network_request_manager.h +++ b/content/browser/webid/idp_network_request_manager.h
@@ -52,14 +52,14 @@ // | POST /idp_url with OIDC request | // |-------------------------------->| // | | -// | token or signin_url | +// | token or login_url | // |<--------------------------------| // .-------. .---. // |Browser| |IDP| // '-------' '---' // // If the IDP returns an token, the sequence finishes. If it returns a -// signin_url, that URL is loaded as a rendered Document into a new window for +// login_url, that URL is loaded as a rendered Document into a new window for // the user to interact with the IDP. class CONTENT_EXPORT IdpNetworkRequestManager { public:
diff --git a/content/browser/webrtc/resources/webrtc_internals.js b/content/browser/webrtc/resources/webrtc_internals.js index 8109198..3b37990 100644 --- a/content/browser/webrtc/resources/webrtc_internals.js +++ b/content/browser/webrtc/resources/webrtc_internals.js
@@ -364,23 +364,6 @@ if (data.rtcConfiguration) { deprecationNotices.className = 'peerconnection-deprecations'; } - if (data.constraints) { - if (data.constraints.indexOf('enableDtlsSrtp:') !== -1) { - if (data.constraints.indexOf('enableDtlsSrtp: {exact: false}') !== -1) { - appendChildWithText(deprecationNotices, 'li', - 'The constraint "DtlsSrtpKeyAgreement" will be removed. You have ' + - 'specified a "false" value for this constraint, which is ' + - 'interpreted as an attempt to use the deprecated "SDES" key ' + - 'negotiation method. This functionality will be removed; use a ' + - 'service that supports DTLS key negotiation instead.'); - } else { - appendChildWithText(deprecationNotices, 'li', - 'The constraint "DtlsSrtpKeyAgreement" will be removed. You have ' + - 'specified a "true" value for this constraint, which has no ' + - 'effect, but you can remove this constraint for tidiness.'); - } - } - } peerConnectionElement.appendChild(deprecationNotices); const iceConnectionStates = document.createElement('div');
diff --git a/content/public/browser/identity_request_dialog_controller.h b/content/public/browser/identity_request_dialog_controller.h index 731a7bc..9fc9b5bc8 100644 --- a/content/public/browser/identity_request_dialog_controller.h +++ b/content/public/browser/identity_request_dialog_controller.h
@@ -42,7 +42,7 @@ absl::optional<SkColor> brand_text_color; absl::optional<SkColor> brand_background_color; GURL brand_icon_url; - GURL idp_signin_url; + GURL idp_login_url; // The URL of the configuration endpoint. This is stored in // IdentityProviderMetadata so that the UI code can pass it along when an // Account is selected by the user.
diff --git a/content/public/common/content_features.cc b/content/public/common/content_features.cc index bbeff94..e6edfef 100644 --- a/content/public/common/content_features.cc +++ b/content/public/common/content_features.cc
@@ -153,10 +153,20 @@ "CacheControlNoStoreEnterBackForwardCache", base::FEATURE_DISABLED_BY_DEFAULT); +// This serves as an overall kill switch to kill CdmStorageDatabase. If +// disabled, which it is by default, no operations will be routed through the +// CdmStorage* path, even in the migration code that lives in MediaLicense* code +// path. BASE_FEATURE(kCdmStorageDatabase, "CdmStorageDatabase", base::FEATURE_DISABLED_BY_DEFAULT); +// This guards between using the MediaLicense* code path and the CdmStorage* +// code path for storing Cdm data. This will be disabled by default. +BASE_FEATURE(kCdmStorageDatabaseMigration, + "CdmStorageDatabaseMigration", + base::FEATURE_DISABLED_BY_DEFAULT); + // Clear the window.name property for the top-level cross-site navigations that // swap BrowsingContextGroups(BrowsingInstances). BASE_FEATURE(kClearCrossSiteCrossBrowsingContextGroupWindowName, @@ -181,7 +191,9 @@ // The experiment label for the cookie deprecation (Mode A/B) study. const base::FeatureParam<std::string> kCookieDeprecationLabel{ - &kCookieDeprecationFacilitatedTesting, "label", ""}; + &kCookieDeprecationFacilitatedTesting, kCookieDeprecationLabelName, ""}; + +const char kCookieDeprecationLabelName[] = "label"; // Enables Blink cooperative scheduling. BASE_FEATURE(kCooperativeScheduling,
diff --git a/content/public/common/content_features.h b/content/public/common/content_features.h index b9c7765..e0b3ec4 100644 --- a/content/public/common/content_features.h +++ b/content/public/common/content_features.h
@@ -48,6 +48,7 @@ CONTENT_EXPORT BASE_DECLARE_FEATURE(kBrowserVerifiedUserActivationMouse); CONTENT_EXPORT BASE_DECLARE_FEATURE(kCacheControlNoStoreEnterBackForwardCache); CONTENT_EXPORT BASE_DECLARE_FEATURE(kCdmStorageDatabase); +CONTENT_EXPORT BASE_DECLARE_FEATURE(kCdmStorageDatabaseMigration); CONTENT_EXPORT BASE_DECLARE_FEATURE( kClearCrossSiteCrossBrowsingContextGroupWindowName); CONTENT_EXPORT BASE_DECLARE_FEATURE(kCompositeBGColorAnimation); @@ -56,6 +57,7 @@ kCookieDeprecationFacilitatedTestingEnableOTRProfiles; CONTENT_EXPORT extern const base::FeatureParam<std::string> kCookieDeprecationLabel; +CONTENT_EXPORT extern const char kCookieDeprecationLabelName[]; CONTENT_EXPORT BASE_DECLARE_FEATURE(kCooperativeScheduling); CONTENT_EXPORT BASE_DECLARE_FEATURE(kCrashReporting); CONTENT_EXPORT BASE_DECLARE_FEATURE(kDevicePosture);
diff --git a/content/renderer/pepper/pepper_video_decoder_host.cc b/content/renderer/pepper/pepper_video_decoder_host.cc index 236f499c..97983c9 100644 --- a/content/renderer/pepper/pepper_video_decoder_host.cc +++ b/content/renderer/pepper/pepper_video_decoder_host.cc
@@ -22,8 +22,12 @@ #include "content/public/renderer/renderer_ppapi_host.h" #include "content/renderer/pepper/ppb_graphics_3d_impl.h" #include "content/renderer/pepper/video_decoder_shim.h" +#include "content/renderer/render_thread_impl.h" +#include "gpu/command_buffer/client/raster_interface.h" +#include "gpu/command_buffer/common/shared_image_usage.h" #include "gpu/ipc/client/command_buffer_proxy_impl.h" #include "media/base/limits.h" +#include "media/base/media_switches.h" #include "media/base/media_util.h" #include "media/video/video_decode_accelerator.h" #include "ppapi/c/pp_completion_callback.h" @@ -43,6 +47,21 @@ namespace { +bool UseSharedImagesForPepperVideo() { + CHECK(base::CommandLine::ForCurrentProcess()); + if (base::CommandLine::ForCurrentProcess()->HasSwitch( + switches::kDisableUseSharedImagesForPepperVideo)) { + LOG(WARNING) << "UseSharedImagesForPepperVideo: Disabled by policy"; + return false; + } + + const bool enabled = + base::FeatureList::IsEnabled(media::kUseSharedImagesForPepperVideo); + LOG(WARNING) << "UseSharedImagesForPepperVideo: feature controlled: " + << enabled; + return enabled; +} + // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused. enum class HardwareAccelerationBehavior : int { @@ -136,9 +155,37 @@ PP_Instance instance, PP_Resource resource) : ResourceHost(host->GetPpapiHost(), instance, resource), - renderer_ppapi_host_(host) {} + renderer_ppapi_host_(host), + use_shared_images_(UseSharedImagesForPepperVideo()) {} PepperVideoDecoderHost::~PepperVideoDecoderHost() { + if (use_shared_images_ && decoder_) { + scoped_refptr<viz::RasterContextProvider> context_provider = + decoder_->context_provider(); + // Destroy `decoder_`, so it will destroy all available shared images. + decoder_->Destroy(); + + // If video decoder was destroyed before plugin returned all shared images, + // this is our last chance to destroy them. + if (!shared_images_.empty()) { + CHECK(context_provider); + // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized + // by issued `ShallowFlushCHROMIUM` after each work. To synchronize with + // SharedImageInterface we generate sync token here. + gpu::SyncToken sync_token; + context_provider->RasterInterface()->GenUnverifiedSyncTokenCHROMIUM( + sync_token.GetData()); + + auto* sii = context_provider->SharedImageInterface(); + + for (const auto& shared_image : shared_images_) { + // All assigned textures should have been destroyed by `decoder_` + CHECK_NE(shared_image.second.state, PictureBufferState::ASSIGNED); + sii->DestroySharedImage(sync_token, shared_image.first); + } + } + } + auto hw_behavior = HardwareAccelerationBehavior::kOther; if (software_fallback_used_) { if (mojo_video_decoder_path_initialized_) { @@ -170,6 +217,9 @@ OnHostMsgAssignTextures) PPAPI_DISPATCH_HOST_RESOURCE_CALL(PpapiHostMsg_VideoDecoder_RecyclePicture, OnHostMsgRecyclePicture) + PPAPI_DISPATCH_HOST_RESOURCE_CALL( + PpapiHostMsg_VideoDecoder_RecycleSharedImage, + OnHostMsgRecycleSharedImage) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoDecoder_Flush, OnHostMsgFlush) PPAPI_DISPATCH_HOST_RESOURCE_CALL_0(PpapiHostMsg_VideoDecoder_Reset, @@ -210,12 +260,16 @@ uint32_t shim_texture_pool_size = media::limits::kMaxVideoFrames + 1; shim_texture_pool_size = std::max(shim_texture_pool_size, min_picture_count_); - auto new_decoder = VideoDecoderShim::Create(this, shim_texture_pool_size, - /*use_hw_decoder=*/true); + auto new_decoder = + VideoDecoderShim::Create(this, shim_texture_pool_size, + /*use_hw_decoder=*/true, + /*use_shared_images=*/use_shared_images_); if (new_decoder && new_decoder->Initialize(profile_)) { - decoder_.reset(new_decoder.release()); + decoder_ = std::move(new_decoder); initialized_ = true; mojo_video_decoder_path_initialized_ = true; + context->reply_msg = + PpapiPluginMsg_VideoDecoder_InitializeReply(use_shared_images_); return PP_OK; } @@ -231,6 +285,8 @@ return PP_ERROR_FAILED; initialized_ = true; + context->reply_msg = + PpapiPluginMsg_VideoDecoder_InitializeReply(use_shared_images_); return PP_OK; #endif } @@ -318,10 +374,18 @@ const PP_Size& size, const std::vector<uint32_t>& texture_ids, const std::vector<gpu::Mailbox>& mailboxes) { - if (!initialized_) + if (!initialized_) { return PP_ERROR_FAILED; - if (texture_ids.size() != mailboxes.size()) + } + + if (texture_ids.size() != mailboxes.size()) { return PP_ERROR_FAILED; + } + + if (use_shared_images_) { + return PP_ERROR_FAILED; + } + DCHECK(decoder_); pending_texture_requests_--; @@ -375,13 +439,20 @@ int32_t PepperVideoDecoderHost::OnHostMsgRecyclePicture( ppapi::host::HostMessageContext* context, uint32_t texture_id) { - if (!initialized_) + if (!initialized_) { return PP_ERROR_FAILED; + } + + if (use_shared_images_) { + return PP_ERROR_FAILED; + } + DCHECK(decoder_); auto it = picture_buffer_map_.find(texture_id); - if (it == picture_buffer_map_.end()) + if (it == picture_buffer_map_.end()) { return PP_ERROR_BADARGUMENT; + } switch (it->second) { case PictureBufferState::ASSIGNED: @@ -404,6 +475,41 @@ return PP_OK; } +int32_t PepperVideoDecoderHost::OnHostMsgRecycleSharedImage( + ppapi::host::HostMessageContext* context, + const gpu::Mailbox& mailbox) { + if (!initialized_) { + return PP_ERROR_FAILED; + } + + if (!use_shared_images_) { + return PP_ERROR_FAILED; + } + + DCHECK(decoder_); + + auto it = shared_images_.find(mailbox); + if (it == shared_images_.end()) { + return PP_ERROR_BADARGUMENT; + } + + switch (it->second.state) { + case PictureBufferState::ASSIGNED: + return PP_ERROR_BADARGUMENT; + + case PictureBufferState::IN_USE: + it->second.state = PictureBufferState::ASSIGNED; + decoder_->ReuseSharedImage(mailbox, it->second.size); + break; + + case PictureBufferState::DISMISSED: + DestroySharedImageInternal(it); + break; + } + + return PP_OK; +} + int32_t PepperVideoDecoderHost::OnHostMsgFlush( ppapi::host::HostMessageContext* context) { if (!initialized_) @@ -432,12 +538,67 @@ return PP_OK_COMPLETIONPENDING; } +gpu::Mailbox PepperVideoDecoderHost::CreateSharedImage(gfx::Size size) { + CHECK(use_shared_images_); + CHECK(decoder_); + const auto& context_provider = decoder_->context_provider(); + CHECK(context_provider); + + auto* sii = context_provider->SharedImageInterface(); + auto* rii = context_provider->RasterInterface(); + + auto mailbox = sii->CreateSharedImage( + viz::SinglePlaneFormat::kRGBA_8888, size, gfx::ColorSpace(), + kTopLeft_GrSurfaceOrigin, kOpaque_SkAlphaType, + gpu::SHARED_IMAGE_USAGE_GLES2 | gpu::SHARED_IMAGE_USAGE_RASTER, + "PepperVideoDecoder", gpu::SurfaceHandle()); + + // This SI will be used on raster interface later, to avoid plumbing + // SyncTokens just for creation wait on it here. + rii->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData()); + + shared_images_.emplace( + mailbox, + SharedImage{.size = size, .state = PictureBufferState::ASSIGNED}); + return mailbox; +} + +void PepperVideoDecoderHost::DestroySharedImage(const gpu::Mailbox& mailbox) { + CHECK(use_shared_images_); + auto it = shared_images_.find(mailbox); + CHECK(it != shared_images_.end()); + + // VideoDecoderShim tracks only assigned images. + CHECK_EQ(it->second.state, PictureBufferState::ASSIGNED); + DestroySharedImageInternal(it); +} + +void PepperVideoDecoderHost::DestroySharedImageInternal( + std::map<gpu::Mailbox, SharedImage>::iterator it) { + CHECK(decoder_); + const auto& context_provider = decoder_->context_provider(); + CHECK(context_provider); + + // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized by + // issued `ShallowFlushCHROMIUM` after each work. To synchronize with + // SharedImageInterface we generate sync token here. + gpu::SyncToken sync_token; + context_provider->RasterInterface()->GenUnverifiedSyncTokenCHROMIUM( + sync_token.GetData()); + + auto* sii = context_provider->SharedImageInterface(); + sii->DestroySharedImage(sync_token, it->first); + shared_images_.erase(it); +} + void PepperVideoDecoderHost::ProvidePictureBuffers( uint32_t requested_num_of_buffers, media::VideoPixelFormat format, uint32_t textures_per_buffer, const gfx::Size& dimensions, uint32_t texture_target) { + CHECK(!use_shared_images_); + DCHECK_EQ(1u, textures_per_buffer); coded_size_ = dimensions; pending_texture_requests_++; @@ -449,6 +610,7 @@ } void PepperVideoDecoderHost::PictureReady(const media::Picture& picture) { + CHECK(!use_shared_images_); auto it = picture_buffer_map_.find(picture.picture_buffer_id()); DCHECK(it != picture_buffer_map_.end()); // VDA might send the same picture multiple times in VP9 video. However the @@ -466,7 +628,25 @@ picture.picture_buffer_id(), visible_rect)); } +void PepperVideoDecoderHost::SharedImageReady(int32_t bitstream_id, + const gpu::Mailbox& mailbox, + gfx::Size size, + const gfx::Rect& visible_rect) { + CHECK(use_shared_images_); + auto it = shared_images_.find(mailbox); + CHECK(it != shared_images_.end()); + CHECK_EQ(it->second.state, PictureBufferState::ASSIGNED); + it->second.state = PictureBufferState::IN_USE; + + host()->SendUnsolicitedReply(pp_resource(), + PpapiPluginMsg_VideoDecoder_SharedImageReady( + bitstream_id, mailbox, PP_FromGfxSize(size), + PP_FromGfxRect(visible_rect))); +} + void PepperVideoDecoderHost::DismissPictureBuffer(int32_t picture_buffer_id) { + CHECK(!use_shared_images_); + auto it = picture_buffer_map_.find(picture_buffer_id); DCHECK(it != picture_buffer_map_.end()); @@ -555,27 +735,46 @@ shim_texture_pool_size = std::max(shim_texture_pool_size, min_picture_count_); std::unique_ptr<VideoDecoderShim> new_decoder(VideoDecoderShim::Create( - this, shim_texture_pool_size, /*use_hw_decoder=*/false)); + this, shim_texture_pool_size, /*use_hw_decoder=*/false, + /*use_shared_images=*/use_shared_images_)); if (!new_decoder->Initialize(profile_)) { return false; } software_fallback_used_ = true; - decoder_.reset(new_decoder.release()); - // Dismiss all assigned pictures and mark all pictures in use as DISMISSED. - PictureBufferMap pictures_pending_dismission; - for (auto& picture : picture_buffer_map_) { - if (picture.second == PictureBufferState::ASSIGNED) { - host()->SendUnsolicitedReply( - pp_resource(), - PpapiPluginMsg_VideoDecoder_DismissPicture(picture.first)); - } else { - pictures_pending_dismission.insert( - std::make_pair(picture.first, PictureBufferState::DISMISSED)); - } + if (decoder_) { + decoder_->Destroy(); + decoder_.reset(); } - picture_buffer_map_.swap(pictures_pending_dismission); + decoder_ = std::move(new_decoder); + + if (use_shared_images_) { + CHECK(picture_buffer_map_.empty()); + for (auto& shared_image : shared_images_) { + // All ASSIGNED images were deleted by decoder. And there shouldn't be any + // DISMISSED images yet, because it's set only in this function and this + // point can only be reached once. + + CHECK_EQ(shared_image.second.state, PictureBufferState::IN_USE); + // Mark as dismissed and delete once plug-in returns them. + shared_image.second.state = PictureBufferState::DISMISSED; + } + } else { + // Dismiss all assigned pictures and mark all pictures in use as DISMISSED. + PictureBufferMap pictures_pending_dismission; + for (auto& picture : picture_buffer_map_) { + if (picture.second == PictureBufferState::ASSIGNED) { + host()->SendUnsolicitedReply( + pp_resource(), + PpapiPluginMsg_VideoDecoder_DismissPicture(picture.first)); + } else { + pictures_pending_dismission.insert( + std::make_pair(picture.first, PictureBufferState::DISMISSED)); + } + } + picture_buffer_map_.swap(pictures_pending_dismission); + } // Dismiss all outstanding texture requests. DCHECK_EQ(assign_textures_messages_to_dismiss_, 0);
diff --git a/content/renderer/pepper/pepper_video_decoder_host.h b/content/renderer/pepper/pepper_video_decoder_host.h index 2a39586..8f13516 100644 --- a/content/renderer/pepper/pepper_video_decoder_host.h +++ b/content/renderer/pepper/pepper_video_decoder_host.h
@@ -70,6 +70,11 @@ bool busy = false; }; + struct SharedImage { + gfx::Size size; + PictureBufferState state; + }; + friend class VideoDecoderShim; // ResourceHost implementation. @@ -77,6 +82,11 @@ const IPC::Message& msg, ppapi::host::HostMessageContext* context) override; + gpu::Mailbox CreateSharedImage(gfx::Size size); + void DestroySharedImage(const gpu::Mailbox& mailbox); + void DestroySharedImageInternal( + std::map<gpu::Mailbox, SharedImage>::iterator it); + void ProvidePictureBuffers(uint32_t requested_num_of_buffers, media::VideoPixelFormat format, uint32_t textures_per_buffer, @@ -84,6 +94,11 @@ uint32_t texture_target); void DismissPictureBuffer(int32_t picture_buffer_id); void PictureReady(const media::Picture& picture); + void SharedImageReady(int32_t decode_id, + const gpu::Mailbox& mailbox, + gfx::Size size, + const gfx::Rect& visible_rect); + void NotifyEndOfBitstreamBuffer(int32_t bitstream_buffer_id); void NotifyFlushDone(); void NotifyResetDone(); @@ -107,6 +122,8 @@ const std::vector<gpu::Mailbox>& mailboxes); int32_t OnHostMsgRecyclePicture(ppapi::host::HostMessageContext* context, uint32_t picture_id); + int32_t OnHostMsgRecycleSharedImage(ppapi::host::HostMessageContext* context, + const gpu::Mailbox& mailbox); int32_t OnHostMsgFlush(ppapi::host::HostMessageContext* context); int32_t OnHostMsgReset(ppapi::host::HostMessageContext* context); @@ -125,6 +142,10 @@ media::VideoCodecProfile profile_; + // |decoder_| will call DestroySharedImage in its dtor, which accesses these + // fields. + std::map<gpu::Mailbox, SharedImage> shared_images_; + std::unique_ptr<VideoDecoderShim> decoder_; bool software_fallback_allowed_ = false; @@ -169,6 +190,8 @@ ppapi::host::ReplyMessageContext reset_reply_context_; bool initialized_ = false; + + const bool use_shared_images_; }; } // namespace content
diff --git a/content/renderer/pepper/video_decoder_shim.cc b/content/renderer/pepper/video_decoder_shim.cc index cab54cf0..85c008c 100644 --- a/content/renderer/pepper/video_decoder_shim.cc +++ b/content/renderer/pepper/video_decoder_shim.cc
@@ -404,7 +404,8 @@ std::unique_ptr<VideoDecoderShim> VideoDecoderShim::Create( PepperVideoDecoderHost* host, uint32_t texture_pool_size, - bool use_hw_decoder) { + bool use_hw_decoder, + bool use_shared_images) { scoped_refptr<viz::ContextProviderCommandBuffer> shared_main_thread_context_provider = RenderThreadImpl::current()->SharedMainThreadContextProvider(); @@ -421,16 +422,17 @@ return nullptr; } - return base::WrapUnique( - new VideoDecoderShim(host, texture_pool_size, use_hw_decoder, - std::move(shared_main_thread_context_provider), - std::move(pepper_video_decode_context_provider))); + return base::WrapUnique(new VideoDecoderShim( + host, texture_pool_size, use_hw_decoder, use_shared_images, + std::move(shared_main_thread_context_provider), + std::move(pepper_video_decode_context_provider))); } VideoDecoderShim::VideoDecoderShim( PepperVideoDecoderHost* host, uint32_t texture_pool_size, bool use_hw_decoder, + bool use_shared_images, scoped_refptr<viz::ContextProviderCommandBuffer> shared_main_thread_context_provider, scoped_refptr<viz::ContextProviderCommandBuffer> @@ -445,7 +447,8 @@ std::move(pepper_video_decode_context_provider)), texture_pool_size_(texture_pool_size), num_pending_decodes_(0), - use_hw_decoder_(use_hw_decoder) { + use_hw_decoder_(use_hw_decoder), + use_shared_images_(use_shared_images) { DCHECK(host_); DCHECK(media_task_runner_.get()); DCHECK(shared_main_thread_context_provider_.get()); @@ -458,6 +461,9 @@ DCHECK(RenderThreadImpl::current()); texture_mailbox_map_.clear(); + CHECK(available_shared_images_.empty()) + << "VideoDecoderShim::Destroy() must be called before destructor"; + FlushCommandBuffer(); weak_ptr_factory_.InvalidateWeakPtrs(); @@ -548,6 +554,8 @@ void VideoDecoderShim::AssignPictureBuffers( const std::vector<media::PictureBuffer>& buffers) { + CHECK(!use_shared_images_); + DCHECK(RenderThreadImpl::current()); DCHECK_NE(state_, UNINITIALIZED); if (buffers.empty()) { @@ -568,6 +576,9 @@ } void VideoDecoderShim::ReusePictureBuffer(int32_t picture_buffer_id) { + CHECK(!use_shared_images_); + CHECK(available_shared_images_.empty()); + DCHECK(RenderThreadImpl::current()); uint32_t texture_id = static_cast<uint32_t>(picture_buffer_id); if (base::Contains(textures_to_dismiss_, texture_id)) { @@ -582,6 +593,23 @@ NOTREACHED(); } +void VideoDecoderShim::ReuseSharedImage(const gpu::Mailbox& mailbox, + gfx::Size size) { + CHECK(use_shared_images_); + CHECK(available_textures_.empty()); + DCHECK(RenderThreadImpl::current()); + + // Video resolution could have changed from the time the image was sent to + // plugin and so this image is not reusable anymore. Delete it in this case. + if (size != texture_size_) { + host_->DestroySharedImage(mailbox); + return; + } + + available_shared_images_.push_back(mailbox); + SendPictures(); +} + void VideoDecoderShim::Flush() { DCHECK(RenderThreadImpl::current()); DCHECK_EQ(state_, DECODING); @@ -603,7 +631,12 @@ } void VideoDecoderShim::Destroy() { - delete this; + for (auto mailbox : available_shared_images_) { + host_->DestroySharedImage(mailbox); + } + available_shared_images_.clear(); + + FlushCommandBuffer(); } void VideoDecoderShim::OnInitializeFailed() { @@ -656,23 +689,38 @@ DCHECK(frame->video_frame); if (texture_size_ != frame->video_frame->coded_size()) { - // If the size has changed, all current textures must be dismissed. Add - // all textures to |textures_to_dismiss_| and dismiss any that aren't in - // use by the plugin. We will dismiss the rest as they are recycled. - for (IdToMailboxMap::const_iterator it = texture_mailbox_map_.begin(); - it != texture_mailbox_map_.end(); ++it) { - textures_to_dismiss_.insert(it->first); - } - for (auto it = available_textures_.begin(); it != available_textures_.end(); - ++it) { - DismissTexture(*it); - } - available_textures_.clear(); - FlushCommandBuffer(); + if (use_shared_images_) { + // If the size has changed, all current SharedImages must be destroyed. + // Destroy images that aren't in use by the plugin. We will destroy the + // rest as they are recycled. + for (const auto& mailbox : available_shared_images_) { + host_->DestroySharedImage(mailbox); + } - host_->ProvidePictureBuffers(texture_pool_size_, media::PIXEL_FORMAT_ARGB, - 1, frame->video_frame->coded_size(), - GL_TEXTURE_2D); + available_shared_images_.clear(); + + for (uint32_t i = 0; i < texture_pool_size_; i++) { + available_shared_images_.push_back( + host_->CreateSharedImage(frame->video_frame->coded_size())); + } + } else { + // If the size has changed, all current textures must be dismissed. Add + // all textures to |textures_to_dismiss_| and dismiss any that aren't in + // use by the plugin. We will dismiss the rest as they are recycled. + for (IdToMailboxMap::const_iterator it = texture_mailbox_map_.begin(); + it != texture_mailbox_map_.end(); ++it) { + textures_to_dismiss_.insert(it->first); + } + for (auto texture : available_textures_) { + DismissTexture(texture); + } + available_textures_.clear(); + FlushCommandBuffer(); + host_->ProvidePictureBuffers(texture_pool_size_, media::PIXEL_FORMAT_ARGB, + 1, frame->video_frame->coded_size(), + GL_TEXTURE_2D); + } + texture_size_ = frame->video_frame->coded_size(); } @@ -684,6 +732,10 @@ DCHECK(RenderThreadImpl::current()); DCHECK(host_); + if (use_shared_images_) { + return SendSharedImages(); + } + gpu::gles2::GLES2Interface* gl = nullptr; if (use_hw_decoder_) { gl = pepper_video_decode_context_provider_->ContextGL(); @@ -750,12 +802,16 @@ // TODO(b/230007619): ideally, we shouldn't assume that these components // use the same stream. We should wire SyncTokens to make this more // general. + // NOTE: We cannot use SharedImage for the direct upload optimization here + // as that requires that the caller keep the destination texture alive, + // which this caller does not. if (!video_renderer_->CopyVideoFrameTexturesToGLTexture( shared_main_thread_context_provider_.get(), gl, frame->video_frame, destination_holder.texture_target, base::strict_cast<unsigned int>(destination_texture_id), GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 0, - /*premultiply_alpha=*/false, /*flip_y=*/false)) { + /*premultiply_alpha=*/false, /*flip_y=*/false, + /*allow_shared_image_for_direct_upload=*/false)) { gl->DeleteTextures(1, &destination_texture_id); gl->Flush(); available_textures_.insert(texture_id); @@ -785,6 +841,63 @@ } } +void VideoDecoderShim::SendSharedImages() { + CHECK(use_shared_images_); + DCHECK(RenderThreadImpl::current()); + DCHECK(host_); + + while (!pending_frames_.empty() && !available_shared_images_.empty()) { + const std::unique_ptr<PendingFrame>& frame = pending_frames_.front(); + + if (!frame->decode_id.has_value()) { + // This signals the completion of a flush: all frames should have been + // output by the underlying decoder (as required by the + // media::VideoDecoder API) and the plugin should not have sent any other + // decode requests while the flush was pending (this is validated by the + // PepperVideoDecoderHost). + pending_frames_.pop(); + DCHECK(pending_frames_.empty()); + DCHECK(!num_pending_decodes_); + DCHECK_EQ(state_, FLUSHING); + break; + } + + auto it = available_shared_images_.begin(); + // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized + // by issued `ShallowFlushCHROMIUM` after each work. Synchronization with + // SharedImageInterface happens during Creation/Destruction, so we don't + // need SyncToken here and ignore one returned from + // CopyVideoFrameToSharedImage. + auto destination = gpu::MailboxHolder(*it, gpu::SyncToken(), GL_TEXTURE_2D); + std::ignore = video_renderer_->CopyVideoFrameToSharedImage( + shared_main_thread_context_provider_.get(), frame->video_frame, + destination, /*use_visible_rect=*/false); + available_shared_images_.erase(it); + + DCHECK(frame->decode_id.has_value()); + host_->SharedImageReady( + base::checked_cast<int32_t>(frame->decode_id.value()), + destination.mailbox, frame->video_frame->coded_size(), + frame->video_frame->visible_rect()); + pending_frames_.pop(); + } + + // Flush our commands so they are executed before plugins command that use + // this frame. This requires us to be on the same sequence. + FlushCommandBuffer(); + + if (pending_frames_.empty()) { + // If frames aren't backing up, notify the host of any completed decodes so + // it can send more buffers. + NotifyCompletedDecodes(); + + if (state_ == FLUSHING && !num_pending_decodes_) { + state_ = DECODING; + host_->NotifyFlushDone(); + } + } +} + void VideoDecoderShim::OnResetComplete() { DCHECK(RenderThreadImpl::current()); DCHECK(host_); @@ -794,8 +907,17 @@ NotifyCompletedDecodes(); // Dismiss any old textures now. - while (!textures_to_dismiss_.empty()) - DismissTexture(*textures_to_dismiss_.begin()); + if (use_shared_images_) { + // With SharedImages we don't have any textures. `textures_to_dismiss_` are + // textures that were in use by plugin when we handled resolution change and + // they are wrong size. With shared images we destroy wrong sized images + // right when plugin returns them to us. + CHECK(textures_to_dismiss_.empty()); + } else { + while (!textures_to_dismiss_.empty()) { + DismissTexture(*textures_to_dismiss_.begin()); + } + } state_ = DECODING; host_->NotifyResetDone(); @@ -809,6 +931,8 @@ } void VideoDecoderShim::DismissTexture(uint32_t texture_id) { + CHECK(!use_shared_images_); + DCHECK(host_); textures_to_dismiss_.erase(texture_id); DCHECK(base::Contains(texture_mailbox_map_, texture_id));
diff --git a/content/renderer/pepper/video_decoder_shim.h b/content/renderer/pepper/video_decoder_shim.h index 4b07fe4..178418e 100644 --- a/content/renderer/pepper/video_decoder_shim.h +++ b/content/renderer/pepper/video_decoder_shim.h
@@ -20,10 +20,7 @@ #include "media/renderers/paint_canvas_video_renderer.h" #include "media/video/video_decode_accelerator.h" #include "ppapi/c/pp_codecs.h" - -namespace viz { -class ContextProviderCommandBuffer; -} +#include "services/viz/public/cpp/gpu/context_provider_command_buffer.h" namespace content { @@ -36,7 +33,8 @@ public: static std::unique_ptr<VideoDecoderShim> Create(PepperVideoDecoderHost* host, uint32_t texture_pool_size, - bool use_hw_decoder); + bool use_hw_decoder, + bool use_shared_images); VideoDecoderShim(const VideoDecoderShim&) = delete; VideoDecoderShim& operator=(const VideoDecoderShim&) = delete; @@ -47,10 +45,16 @@ void Decode(media::BitstreamBuffer bitstream_buffer); void AssignPictureBuffers(const std::vector<media::PictureBuffer>& buffers); void ReusePictureBuffer(int32_t picture_buffer_id); + void ReuseSharedImage(const gpu::Mailbox& mailbox, gfx::Size size); void Flush(); void Reset(); void Destroy(); + const scoped_refptr<viz::ContextProviderCommandBuffer>& context_provider() + const { + return shared_main_thread_context_provider_; + } + private: enum State { UNINITIALIZED, @@ -66,6 +70,7 @@ VideoDecoderShim(PepperVideoDecoderHost* host, uint32_t texture_pool_size, bool use_hw_decoder, + bool use_shared_images, scoped_refptr<viz::ContextProviderCommandBuffer> shared_main_thread_context_provider, scoped_refptr<viz::ContextProviderCommandBuffer> @@ -75,6 +80,7 @@ void OnDecodeComplete(int32_t result, absl::optional<uint32_t> decode_id); void OnOutputComplete(std::unique_ptr<PendingFrame> frame); void SendPictures(); + void SendSharedImages(); void OnResetComplete(); void NotifyCompletedDecodes(); void DismissTexture(uint32_t texture_id); @@ -101,6 +107,8 @@ // Available textures (these are plugin ids.) using TextureIdSet = std::unordered_set<uint32_t>; TextureIdSet available_textures_; + std::vector<gpu::Mailbox> available_shared_images_; + // Track textures that are no longer needed (these are plugin ids.) TextureIdSet textures_to_dismiss_; @@ -121,6 +129,8 @@ std::unique_ptr<media::PaintCanvasVideoRenderer> video_renderer_; + const bool use_shared_images_; + base::WeakPtrFactory<VideoDecoderShim> weak_ptr_factory_{this}; };
diff --git a/content/test/data/accessibility/form-controls/img-form-expected-android.txt b/content/test/data/accessibility/form-controls/img-form-expected-android.txt index e63f3b6..23b655dc 100644 --- a/content/test/data/accessibility/form-controls/img-form-expected-android.txt +++ b/content/test/data/accessibility/form-controls/img-form-expected-android.txt
@@ -2,6 +2,8 @@ ++android.widget.TextView name='Welcome to my example page!' ++android.widget.TextView name='Lengthy instructions on filling out the form.' ++android.widget.TextView name='Imagine hundreds of nodes that are simple content...' +++android.widget.TextView name='Enter your name: ' ++android.widget.EditText clickable editable_text focusable hint='Enter your name:' input_type=1 +++android.widget.TextView name='Enter your email: ' ++android.widget.EditText clickable editable_text focusable hint='Enter your email:' input_type=209 -++android.widget.Button role_description='button' clickable focusable name='Subscribe!' \ No newline at end of file +++android.widget.Button role_description='button' clickable focusable name='Subscribe!'
diff --git a/content/test/data/attribution_reporting/interop/channel_capacity.json b/content/test/data/attribution_reporting/interop/channel_capacity.json index b0ce5a6..b1d94bf 100644 --- a/content/test/data/attribution_reporting/interop/channel_capacity.json +++ b/content/test/data/attribution_reporting/interop/channel_capacity.json
@@ -242,7 +242,7 @@ { "payload": { "attribution_destination": "https://destination2.test", - "randomized_trigger_rate": 1.0, + "randomized_trigger_rate": 1, "scheduled_report_time": "3606", "source_event_id": "456", "source_type": "navigation",
diff --git a/content/test/fenced_frame_test_utils.cc b/content/test/fenced_frame_test_utils.cc index bbc9556..132e86a 100644 --- a/content/test/fenced_frame_test_utils.cc +++ b/content/test/fenced_frame_test_utils.cc
@@ -31,11 +31,11 @@ FencedFrameURLMapping& fenced_frame_url_mapping, const GURL& urn_uuid, const GURL& mapped_url, - const url::Origin& shared_storage_origin, + const net::SchemefulSite& shared_storage_site, double budget_to_charge, scoped_refptr<FencedFrameReporter> fenced_frame_reporter) { SharedStorageBudgetMetadata budget_metadata = { - .origin = shared_storage_origin, .budget_to_charge = budget_to_charge}; + .site = shared_storage_site, .budget_to_charge = budget_to_charge}; fenced_frame_url_mapping.OnSharedStorageURNMappingResultDetermined( urn_uuid,
diff --git a/content/test/fenced_frame_test_utils.h b/content/test/fenced_frame_test_utils.h index 6b7691a7..c092cf6e 100644 --- a/content/test/fenced_frame_test_utils.h +++ b/content/test/fenced_frame_test_utils.h
@@ -10,6 +10,7 @@ #include "content/browser/fenced_frame/fenced_frame_reporter.h" #include "content/browser/fenced_frame/fenced_frame_url_mapping.h" #include "net/base/net_errors.h" +#include "net/base/schemeful_site.h" namespace content { @@ -26,7 +27,7 @@ FencedFrameURLMapping& fenced_frame_url_mapping, const GURL& urn_uuid, const GURL& mapped_url, - const url::Origin& shared_storage_origin, + const net::SchemefulSite& shared_storage_site, double budget_to_charge, scoped_refptr<FencedFrameReporter> fenced_frame_reporter = nullptr);
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index ba911c8c3..c68164c 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -131,6 +131,7 @@ [ android qualcomm ] WebglExtension_EXT_texture_compression_bptc [ Skip ] [ android qualcomm ] WebglExtension_EXT_texture_compression_rgtc [ Skip ] [ desktop no-passthrough ] WebglExtension_EXT_color_buffer_half_float [ Skip ] +crbug.com/776222 [ android ] WebglExtension_WEBGL_video_texture [ Skip ] crbug.com/1058744 [ no-passthrough ] WebglExtension_OES_draw_buffers_indexed [ Skip ] # Extensions unavailable on Android. @@ -872,6 +873,7 @@ crbug.com/1464417 [ chromeos lacros-chrome chromeos-board-jacuzzi passthrough ] conformance2/extensions/webgl-shader-pixel-local-storage.html [ Failure ] crbug.com/1473838 [ chromeos lacros-chrome chromeos-board-jacuzzi passthrough ] conformance2/extensions/oes-sample-variables.html [ Failure ] +crbug.com/1488581 [ chromeos lacros-chrome chromeos-board-octopus passthrough ] conformance/rendering/out-of-bounds-array-buffers.html [ RetryOnFailure ] ############################## # Lacros-like Linux Failures #
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt index 6bd7819..f8c1b83 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl_conformance_expectations.txt
@@ -138,6 +138,7 @@ crbug.com/angleproject/3031 [ android angle-opengles passthrough ] WebglExtension_KHR_parallel_shader_compile [ Skip ] crbug.com/angleproject/3031 [ mac angle-opengl passthrough ] WebglExtension_KHR_parallel_shader_compile [ Skip ] crbug.com/angleproject/3031 [ win angle-opengl passthrough ] WebglExtension_KHR_parallel_shader_compile [ Skip ] +crbug.com/776222 [ android ] WebglExtension_WEBGL_video_texture [ Skip ] # Extensions not available with SwiftShader [ passthrough angle-swiftshader ] WebglExtension_EXT_blend_func_extended [ Skip ]
diff --git a/content/test/gpu/gpu_tests/webgl1_conformance_integration_test.py b/content/test/gpu/gpu_tests/webgl1_conformance_integration_test.py index 11a408a..c15e8f4 100644 --- a/content/test/gpu/gpu_tests/webgl1_conformance_integration_test.py +++ b/content/test/gpu/gpu_tests/webgl1_conformance_integration_test.py
@@ -73,6 +73,7 @@ 'WEBGL_lose_context', 'WEBGL_multi_draw', 'WEBGL_polygon_mode', + 'WEBGL_video_texture', ] @classmethod
diff --git a/content/test/gpu/gpu_tests/webgl2_conformance_integration_test.py b/content/test/gpu/gpu_tests/webgl2_conformance_integration_test.py index 8050b1d..2fb452d 100644 --- a/content/test/gpu/gpu_tests/webgl2_conformance_integration_test.py +++ b/content/test/gpu/gpu_tests/webgl2_conformance_integration_test.py
@@ -74,6 +74,7 @@ 'WEBGL_render_shared_exponent', 'WEBGL_shader_pixel_local_storage', 'WEBGL_stencil_texturing', + 'WEBGL_video_texture', ] @classmethod
diff --git a/content/web_test/browser/web_test_fedcm_manager.cc b/content/web_test/browser/web_test_fedcm_manager.cc index a0def992..4f95a87 100644 --- a/content/web_test/browser/web_test_fedcm_manager.cc +++ b/content/web_test/browser/web_test_fedcm_manager.cc
@@ -49,8 +49,8 @@ case FederatedAuthRequestImpl::kAutoReauth: type_string = "AutoReauthn"; break; - case FederatedAuthRequestImpl::kConfirmIdpSignin: - type_string = "ConfirmIdpSignin"; + case FederatedAuthRequestImpl::kConfirmIdpLogin: + type_string = "ConfirmIdpLogin"; break; }; std::move(callback).Run(type_string); @@ -154,8 +154,8 @@ auth_request->DismissAccountsDialogForDevtools(false); std::move(callback).Run(true); return; - case FederatedAuthRequestImpl::kConfirmIdpSignin: - auth_request->DismissConfirmIdpSigninDialogForDevtools(); + case FederatedAuthRequestImpl::kConfirmIdpLogin: + auth_request->DismissConfirmIdpLoginDialogForDevtools(); std::move(callback).Run(true); return; }
diff --git a/device/bluetooth/floss/floss_dbus_client.h b/device/bluetooth/floss/floss_dbus_client.h index 080397b..181ad3a 100644 --- a/device/bluetooth/floss/floss_dbus_client.h +++ b/device/bluetooth/floss/floss_dbus_client.h
@@ -5,13 +5,20 @@ #ifndef DEVICE_BLUETOOTH_FLOSS_FLOSS_DBUS_CLIENT_H_ #define DEVICE_BLUETOOTH_FLOSS_FLOSS_DBUS_CLIENT_H_ +#include <map> +#include <memory> #include <ostream> #include <string> +#include <unordered_map> +#include <unordered_set> +#include <utility> +#include <vector> #include "base/containers/contains.h" #include "base/functional/callback.h" #include "base/logging.h" #include "base/no_destructor.h" +#include "base/strings/strcat.h" #include "base/task/single_thread_task_runner.h" #include "base/types/expected.h" #include "dbus/bus.h" @@ -404,34 +411,34 @@ template <typename T> const DBusTypeInfo& GetDBusTypeInfo(const std::vector<T>*) { - static base::NoDestructor<DBusTypeInfo> elem_info( + static const base::NoDestructor<DBusTypeInfo> elem_info( GetDBusTypeInfo(static_cast<T*>(nullptr))); - static base::NoDestructor<DBusTypeInfo> info{ - {"a" + elem_info->dbus_signature, - "vector<" + elem_info->type_name + ">"}}; + static const base::NoDestructor<DBusTypeInfo> info( + {base::StrCat({"a", elem_info->dbus_signature}), + base::StrCat({"vector<", elem_info->type_name, ">"})}); return *info; } template <typename T, typename U> const DBusTypeInfo& GetDBusTypeInfo(const std::map<T, U>*) { - static base::NoDestructor<DBusTypeInfo> key_info( + static const base::NoDestructor<DBusTypeInfo> key_info( GetDBusTypeInfo(static_cast<T*>(nullptr))); - static base::NoDestructor<DBusTypeInfo> val_info( + static const base::NoDestructor<DBusTypeInfo> val_info( GetDBusTypeInfo(static_cast<U*>(nullptr))); - static base::NoDestructor<DBusTypeInfo> info{ - {std::string("a{") + key_info->dbus_signature + val_info->dbus_signature + - std::string("}"), - std::string("map<") + key_info->type_name + ", " + val_info->type_name + - std::string(">")}}; + static const base::NoDestructor<DBusTypeInfo> info( + {base::StrCat( + {"a{", key_info->dbus_signature, val_info->dbus_signature, "}"}), + base::StrCat( + {"map<", key_info->type_name, ", ", val_info->type_name, ">"})}); return *info; } template <typename T> const DBusTypeInfo& GetDBusTypeInfo(const absl::optional<T>*) { - static base::NoDestructor<DBusTypeInfo> elem_info( + static const base::NoDestructor<DBusTypeInfo> elem_info( GetDBusTypeInfo(static_cast<T*>(nullptr))); - static base::NoDestructor<DBusTypeInfo> info{ - {"a{sv}", "optional<" + elem_info->type_name + ">"}}; + static const base::NoDestructor<DBusTypeInfo> info( + {"a{sv}", base::StrCat({"optional<", elem_info->type_name, ">"})}); return *info; } @@ -533,11 +540,9 @@ template <typename T, typename U> static void WriteDBusParam(dbus::MessageWriter* writer, const std::map<T, U>& data) { - std::string signature( - std::string("{") + - GetDBusTypeInfo(static_cast<T*>(nullptr)).dbus_signature + - GetDBusTypeInfo(static_cast<U*>(nullptr)).dbus_signature + - std::string("}")); + std::string signature = base::StrCat( + {"{", GetDBusTypeInfo(static_cast<T*>(nullptr)).dbus_signature, + GetDBusTypeInfo(static_cast<U*>(nullptr)).dbus_signature, "}"}); dbus::MessageWriter array(nullptr); writer->OpenArray(signature, &array); for (auto const& [key, val] : data) {
diff --git a/docs/mac/triage.md b/docs/mac/triage.md index 38cdaf6..401d69a 100644 --- a/docs/mac/triage.md +++ b/docs/mac/triage.md
@@ -61,7 +61,7 @@ bug, so endeavour to get those first - TE time is precious and we should make good use of it. -We wait **30 days** for user feedback on Needs-Feedback bugs; after 30 days +We wait **28 days** for user feedback on Needs-Feedback bugs; after 28 days without a response to a question we move bugs to WontFix. Some useful debugging questions here: @@ -147,7 +147,7 @@ * Admin * Blink * Infra -* Internals>Cast, Headless, Network, Plugins, Printing, Skia, Views +* Internals>Cast, GPU, Headless, Network, Plugins, Printing, Skia, Views * IO>Bluetooth, USB * Platform * Services>Chromoting @@ -158,6 +158,6 @@ [unconfirmed]: https://bugs.chromium.org/p/chromium/issues/list?q=OS%3DMac%20status%3AUnconfirmed%20-component%3ABlink%2CEnterprise%2CInternals%3ENetwork%2CPlatform%3EDevtools%2CServices%3ESyncs%2CUI%3EBrowser%3EPasswords%20-label%3AMac-TriageBypass%20-label%3AHotlist-MacTriageBypass&can=2 [untriaged-m]: https://bugs.chromium.org/p/chromium/issues/list?q=has%3AMac%20status%3AUntriaged%20-label%3AMac-TriageBypass%20-label%3AHotlist-MacTriageBypass&can=2 -[untriaged-c]: https://bugs.chromium.org/p/chromium/issues/list?q=OS%3DMac%20-OS%3DWindows%2CLinux%2CChrome%2CAndroid%2CiOS%20status%3AUntriaged%20-component%3AAdmin%2CBlink%2CInfra%2CInternals%3ECast%2CInternals%3EHeadless%2CInternals%3ENetwork%2CInternals%3EPlugins%3EPDF%2CInternals%3EPrinting%2CInternals%3ESkia%2CInternals%3EUpdater%2CInternals%3EViews%2CIO%3EBluetooth%2CIO%3EUSB%2CPlatform%2CServices%3EChromoting%2CTest%3ETelemetry%2CUI%3EBrowser%3EWebAppInstalls%2CPlatform%3EWebAppProvider%2CUI%3EBrowser%3EWebUI%2CInternals%3EGPU%2CEnterprise%2CUI%3EBrowser%3ESharing%2CUI>Accessibility%20-label%3AMac-TriageBypass%20-label%3AHotlist-MacTriageBypass&can=2 +[untriaged-c]: https://bugs.chromium.org/p/chromium/issues/list?q=OS%3DMac%20-OS%3DWindows%2CLinux%2CChrome%2CAndroid%2CiOS%20status%3AUntriaged%20-component%3AAdmin%2CBlink%2CInfra%2CInternals%3ECast%2CInternals%3EHeadless%2CInternals%3ENetwork%2CInternals%3EPlugins%3EPDF%2CInternals%3EPrinting%2CInternals%3ESkia%2CInternals%3EUpdater%2CInternals%3EViews%2CIO%3EBluetooth%2CIO%3EUSB%2CPlatform%2CServices%3EChromoting%2CTest%3ETelemetry%2CUI%3EBrowser%3EWebAppInstalls%2CPlatform%3EWebAppProvider%2CUI%3EBrowser%3EWebUI%2CInternals%3EGPU%2CEnterprise%2CUI%3EBrowser%3ESharing%2CUI%3EAccessibility%2CInternals%3EGPU%20-label%3AMac-TriageBypass%20-label%3AHotlist-MacTriageBypass&can=2 [available]: https://bugs.chromium.org/p/chromium/issues/list?q=has%3AMac%20status%3AAvailable&can=2 [assigned]: https://bugs.chromium.org/p/chromium/issues/list?q=has%3AMac%20status%3AAssigned&can=2
diff --git a/docs/process/images/branch_diagram.png b/docs/process/images/branch_diagram.png index f737391..0a2aa6fd 100644 --- a/docs/process/images/branch_diagram.png +++ b/docs/process/images/branch_diagram.png Binary files differ
diff --git a/docs/process/images/channel_diagram.png b/docs/process/images/channel_diagram.png index 441a719..95ef7f9 100644 --- a/docs/process/images/channel_diagram.png +++ b/docs/process/images/channel_diagram.png Binary files differ
diff --git a/docs/process/images/release_cycle.png b/docs/process/images/release_cycle.png index fdb172a..060f5c3 100644 --- a/docs/process/images/release_cycle.png +++ b/docs/process/images/release_cycle.png Binary files differ
diff --git a/docs/process/release_cycle.md b/docs/process/release_cycle.md index 84362258..2045c51c 100644 --- a/docs/process/release_cycle.md +++ b/docs/process/release_cycle.md
@@ -7,9 +7,9 @@ Chrome ships a new milestone (major version) to the stable channel every four weeks. The new milestone is developed on main for four weeks (beginning on branch point for the previous milestone) before the milestone's branch is cut, -which is then stabilized for five weeks before being shipped to stable. Once -a milestone reaches stable, biweekly updates (called refreshes) are shipped to -the stable to deploy security fixes and keep Chrome's +which is then stabilized for four weeks before being shipped to stable. Once +a milestone reaches stable, weekly updates (called refreshes) are shipped to +stable to deploy security fixes and keep Chrome's [patch gap](https://groups.google.com/a/chromium.org/g/security-dev/c/fbiuFbW07vI) short. @@ -22,7 +22,7 @@ identical releases; see the [channel lifecycle](#channel-lifecycle) to learn more. The extended stable channel is only available to enterprises on the Windows and Mac platforms, and can be enabled via enterprise policies. Biweekly -refreshes are shipped to extended stable as well. +refreshes are shipped to extended stable. While extended stable is only shipped to Windows and Mac, security fixes that are relevant to any Chrome Browser platforms will be landed on the extended @@ -66,7 +66,7 @@ The branch generated by the daily canary created at branch point is designated as the milestone branch, which is then stabilized over the following -five weeks. All strings should be landed by branch point, and all beta blocking +four weeks. All strings should be landed by branch point, and all beta blocking bugs should be addressed as well. Please consider [these guidelines](../release_branch_guidance.md) when landing @@ -74,10 +74,10 @@ ### Beta Promotion -After one week of stabilization, the new milestone is shipped to the beta -channel for the first time. A new build is shipped to beta each following -week for three additional weeks so that the release spends four weeks total in -the beta channel. +Shortly after branch, the new milestone is shipped to the beta channel for the +first time. A new build is shipped to beta each following week for three +additional weeks so that the release spends four weeks total in the beta +channel. ### Stable Cut @@ -102,9 +102,10 @@ ### Stable Refresh -The stable and extended stable channels are refreshed every two weeks. These -refreshes typically contain important security fixes as well as any urgent -regression fixes that may be available at the discretion of the release team. +The stable channel is refreshed every week, and the extended stable channels is +refreshed every two weeks. These refreshes typically contain important security +fixes as well as any urgent regression fixes that may be available at the +discretion of the release team. ## Channel Lifecycle
diff --git a/docs/security/shepherd.md b/docs/security/shepherd.md index 435bd2c..2451c64 100644 --- a/docs/security/shepherd.md +++ b/docs/security/shepherd.md
@@ -26,11 +26,11 @@ ## What Is A Security Shepherd? -A security shepherd is a member of a rotation -that occurs in 1-week time slots, starting on Tuesdays and ending the following -Monday. There is a primary and secondary shepherd on each rotation. All -shepherds are Googlers and so some links on this page might not be externally -accessible (or indeed locked down to just Chrome Security Googlers). +A security shepherd is a member of a rotation that occurs in two different time +slots: Tues to Thurs or Fri to Mon. There is a primary and secondary shepherd on +each rotation. All shepherds are Googlers and so some links on this page might +not be externally accessible (or indeed locked down to just Chrome Security +Googlers). [Here is the rotation schedule](https://docs.google.com/spreadsheets/d/10sLYZbi6QfLcXrhO-j5eSc82uc7NKnBz_o1pR9y8h7U/edit#gid=0).
diff --git a/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc b/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc index efd34a25..9e02cd1 100644 --- a/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc +++ b/extensions/browser/api/declarative_net_request/file_sequence_helper_unittest.cc
@@ -109,7 +109,8 @@ &FileSequenceHelper::UpdateDynamicRules, base::Unretained(helper_.get()), std::move(data), /* rule_ids_to_remove */ std::vector<int>(), std::move(rules_to_add), - RuleCounts(GetDynamicAndSessionRuleLimit(), GetRegexRuleLimit()), + RuleCounts(GetDynamicAndSessionRuleLimit(), + GetDynamicAndSessionRuleLimit(), GetRegexRuleLimit()), std::move(add_rules_callback)); base::HistogramTester tester;
diff --git a/extensions/browser/api/declarative_net_request/rule_counts.cc b/extensions/browser/api/declarative_net_request/rule_counts.cc index ffd841f..d2339069 100644 --- a/extensions/browser/api/declarative_net_request/rule_counts.cc +++ b/extensions/browser/api/declarative_net_request/rule_counts.cc
@@ -9,17 +9,29 @@ namespace extensions::declarative_net_request { RuleCounts::RuleCounts() = default; -RuleCounts::RuleCounts(size_t rule_count, size_t regex_rule_count) - : rule_count(rule_count), regex_rule_count(regex_rule_count) {} +RuleCounts::RuleCounts(size_t rule_count, + absl::optional<size_t> unsafe_rule_count, + size_t regex_rule_count) + : rule_count(rule_count), + unsafe_rule_count(unsafe_rule_count), + regex_rule_count(regex_rule_count) {} RuleCounts& RuleCounts::operator+=(const RuleCounts& that) { rule_count += that.rule_count; + if (unsafe_rule_count.has_value()) { + *unsafe_rule_count += that.unsafe_rule_count.value_or(0); + } regex_rule_count += that.regex_rule_count; return *this; } RuleCounts& RuleCounts::operator-=(const RuleCounts& that) { CHECK_GE(rule_count, that.rule_count); + if (unsafe_rule_count.has_value()) { + CHECK_GE(*unsafe_rule_count, that.unsafe_rule_count.value_or(0)); + *unsafe_rule_count -= that.unsafe_rule_count.value_or(0); + } + CHECK_GE(regex_rule_count, that.regex_rule_count); rule_count -= that.rule_count; regex_rule_count -= that.regex_rule_count; @@ -38,6 +50,7 @@ bool operator==(const RuleCounts& lhs, const RuleCounts& rhs) { return lhs.rule_count == rhs.rule_count && + lhs.unsafe_rule_count == rhs.unsafe_rule_count && lhs.regex_rule_count == rhs.regex_rule_count; }
diff --git a/extensions/browser/api/declarative_net_request/rule_counts.h b/extensions/browser/api/declarative_net_request/rule_counts.h index 43271d3..b34c25b2 100644 --- a/extensions/browser/api/declarative_net_request/rule_counts.h +++ b/extensions/browser/api/declarative_net_request/rule_counts.h
@@ -7,28 +7,42 @@ #include <cstddef> +#include "third_party/abseil-cpp/absl/types/optional.h" + namespace extensions::declarative_net_request { // Represents the pair of total rule count and regex rule count for a ruleset. struct RuleCounts { RuleCounts(); - RuleCounts(size_t rule_count, size_t regex_rule_count); + RuleCounts(size_t rule_count, + absl::optional<size_t> unsafe_rule_count, + size_t regex_rule_count); RuleCounts& operator+=(const RuleCounts& that); - // This CHECKs that counts in |that| are smaller than or equal to the one in - // |this|. + // This CHECKs that counts in `that` are smaller than or equal to the one in + // `this`. + // TODO(crbug.com/1485747): Only regex rules will share a counter between the + // dynamic and session rulesets, so this can be removed. RuleCounts& operator-=(const RuleCounts& that); + // Tracks the total rule count of a ruleset. size_t rule_count = 0; + // Tracks the "unsafe" rule count of a ruleset (see `ComputeUnsafeRuleCount` + // inside ruleset_matcher.cc for what constitutes an "unsafe" rule). This is + // only counted for dynamic or session rulesets and is null for static + // rulesets. + absl::optional<size_t> unsafe_rule_count = absl::nullopt; + // Tracks the total regex rule count of a ruleset. size_t regex_rule_count = 0; - // TODO(crbug.com/1485747): Add an unsafe_rule_count here. }; RuleCounts operator+(const RuleCounts& lhs, const RuleCounts& rhs); -// This CHECKs that counts in |rhs| are smaller than or equal to the one in -// |lhs|. +// This CHECKs that counts in `rhs` are smaller than or equal to the one in +// `lhs`. +// TODO(crbug.com/1485747): Only regex rules will share a counter between the +// dynamic and session rulesets, so this can be removed. RuleCounts operator-(const RuleCounts& lhs, const RuleCounts& rhs); bool operator==(const RuleCounts& lhs, const RuleCounts& rhs);
diff --git a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc index d06cc8b..8cfafb3d 100644 --- a/extensions/browser/api/declarative_net_request/rules_monitor_service.cc +++ b/extensions/browser/api/declarative_net_request/rules_monitor_service.cc
@@ -631,6 +631,7 @@ // only up to 1 updateDynamicRules/updateSessionRules call is in progress. See // the usage of `ApiCallQueue`. RuleCounts shared_rules_limit(GetDynamicAndSessionRuleLimit(), + GetDynamicAndSessionRuleLimit(), GetRegexRuleLimit()); RuleCounts session_rules_count = GetRuleCounts(extension_id, kSessionRulesetID); @@ -682,6 +683,7 @@ RuleCounts dynamic_rule_count = GetRuleCounts(extension_id, kDynamicRulesetID); RuleCounts shared_rule_limit(GetDynamicAndSessionRuleLimit(), + GetDynamicAndSessionRuleLimit(), GetRegexRuleLimit()); RuleCounts available_limit = shared_rule_limit - dynamic_rule_count; if (new_rules.size() > available_limit.rule_count) { @@ -871,7 +873,7 @@ RuleCounts static_rule_limit( global_rules_tracker_.GetAvailableAllocation(load_data.extension_id) + GetStaticGuaranteedMinimumRuleCount(), - GetRegexRuleLimit()); + /*unsafe_rule_count=*/absl::nullopt, GetRegexRuleLimit()); for (RulesetInfo& ruleset : load_data.rulesets) { if (!ruleset.did_load_successfully()) {
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher.cc b/extensions/browser/api/declarative_net_request/ruleset_matcher.cc index f4f9baf4..0bc685a 100644 --- a/extensions/browser/api/declarative_net_request/ruleset_matcher.cc +++ b/extensions/browser/api/declarative_net_request/ruleset_matcher.cc
@@ -13,12 +13,39 @@ #include "base/metrics/histogram_macros.h" #include "base/time/time.h" #include "extensions/browser/api/declarative_net_request/constants.h" +#include "extensions/browser/api/declarative_net_request/flat/extension_ruleset_generated.h" #include "extensions/browser/api/declarative_net_request/request_action.h" #include "extensions/browser/api/declarative_net_request/rule_counts.h" #include "extensions/browser/api/declarative_net_request/utils.h" +#include "extensions/common/api/declarative_net_request/constants.h" +#include "third_party/abseil-cpp/absl/types/optional.h" -namespace extensions { -namespace declarative_net_request { +namespace extensions::declarative_net_request { + +namespace { + +using ExtensionMetadataList = + flatbuffers::Vector<flatbuffers::Offset<flat::UrlRuleMetadata>>; + +size_t ComputeUnsafeRuleCount(const ExtensionMetadataList* metadata_list) { + size_t unsafe_rule_count = 0; + for (const auto* url_rule_metadata : *metadata_list) { + flat::ActionType rule_action_type = url_rule_metadata->action(); + if (rule_action_type != flat::ActionType_block && + rule_action_type != flat::ActionType_allow && + rule_action_type != flat::ActionType_allow_all_requests && + rule_action_type != flat::ActionType_upgrade_scheme) { + unsafe_rule_count++; + } + } + return unsafe_rule_count; +} + +bool IsRulesetStatic(const RulesetID& id) { + return id != kDynamicRulesetID && id != kSessionRulesetID; +} + +} // namespace RulesetMatcher::RulesetMatcher(std::string ruleset_data, RulesetID id, @@ -33,7 +60,11 @@ regex_matcher_(extension_id, id, root_->regex_rules(), - root_->extension_metadata()) {} + root_->extension_metadata()) { + if (!IsRulesetStatic(id)) { + unsafe_rule_count_ = ComputeUnsafeRuleCount(root_->extension_metadata()); + } +} RulesetMatcher::~RulesetMatcher() = default; @@ -159,12 +190,16 @@ regex_matcher_.GetRulesCount(); } +absl::optional<size_t> RulesetMatcher::GetUnsafeRulesCount() const { + return unsafe_rule_count_; +} + size_t RulesetMatcher::GetRegexRulesCount() const { return regex_matcher_.GetRulesCount(); } RuleCounts RulesetMatcher::GetRuleCounts() const { - return RuleCounts(GetRulesCount(), GetRegexRulesCount()); + return RuleCounts(GetRulesCount(), unsafe_rule_count_, GetRegexRulesCount()); } void RulesetMatcher::OnRenderFrameCreated(content::RenderFrameHost* host) { @@ -200,5 +235,4 @@ return url_pattern_index_matcher_.GetDisabledRuleIdsForTesting(); } -} // namespace declarative_net_request -} // namespace extensions +} // namespace extensions::declarative_net_request
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher.h b/extensions/browser/api/declarative_net_request/ruleset_matcher.h index cb5137f2..dee7c3b 100644 --- a/extensions/browser/api/declarative_net_request/ruleset_matcher.h +++ b/extensions/browser/api/declarative_net_request/ruleset_matcher.h
@@ -60,7 +60,11 @@ bool IsExtraHeadersMatcher() const; size_t GetRulesCount() const; + absl::optional<size_t> GetUnsafeRulesCount() const; size_t GetRegexRulesCount() const; + + // Returns a RuleCounts object for this matcher containing the total rule + // count, the unsafe rule count and the regex rule count. RuleCounts GetRuleCounts() const; void OnRenderFrameCreated(content::RenderFrameHost* host); @@ -89,6 +93,11 @@ const RulesetID id_; + // The number of unsafe rules for this matcher. Computed only for dynamic and + // session scoped rulesets as all rules for static rulesets are considered + // "safe". + absl::optional<size_t> unsafe_rule_count_ = absl::nullopt; + // Underlying matcher for filter-list style rules supported using the // |url_pattern_index| component. ExtensionUrlPatternIndexMatcher url_pattern_index_matcher_;
diff --git a/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc b/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc index 063f862..b7b5ca8b 100644 --- a/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc +++ b/extensions/browser/api/declarative_net_request/ruleset_matcher_unittest.cc
@@ -1110,12 +1110,23 @@ TEST_F(RulesetMatcherTest, RulesCount) { size_t kNumNonRegexRules = 20; size_t kNumRegexRules = 10; + + // Rules that are not block or allow rules are considered unsafe for dynamic + // rulesets. Make some of the rules these types as well. + size_t kNumUnsafeNonRegexRules = 5; + size_t kNumUnsafeRegexRules = 3; + std::vector<TestRule> rules; int id = kMinValidID; for (size_t i = 0; i < kNumNonRegexRules; ++i, ++id) { TestRule rule = CreateGenericRule(); rule.id = id; rule.condition->url_filter = std::to_string(id); + if (i < kNumUnsafeNonRegexRules) { + rule.action->type = "redirect"; + rule.action->redirect.emplace(); + rule.action->redirect->url = "http://google.com"; + } rules.push_back(rule); } @@ -1124,6 +1135,11 @@ rule.id = id; rule.condition->url_filter.reset(); rule.condition->regex_filter = std::to_string(id); + if (i < kNumUnsafeRegexRules) { + rule.action->type = std::string("modifyHeaders"); + rule.action->response_headers = std::vector<TestHeaderInfo>( + {TestHeaderInfo("HEADER3", "append", "VALUE3")}); + } rules.push_back(rule); } @@ -1131,6 +1147,18 @@ ASSERT_TRUE(CreateVerifiedMatcher(rules, CreateTemporarySource(), &matcher)); ASSERT_TRUE(matcher); EXPECT_EQ(kNumRegexRules + kNumNonRegexRules, matcher->GetRulesCount()); + // For static rulesets, no rules are considered unsafe. + EXPECT_EQ(absl::nullopt, matcher->GetUnsafeRulesCount()); + EXPECT_EQ(kNumRegexRules, matcher->GetRegexRulesCount()); + + // Recreate `matcher` for a dynamic ruleset to test that unsafe rule count is + // calculated correctly. + ASSERT_TRUE(CreateVerifiedMatcher( + rules, CreateTemporarySource(kDynamicRulesetID), &matcher)); + ASSERT_TRUE(matcher); + EXPECT_EQ(kNumRegexRules + kNumNonRegexRules, matcher->GetRulesCount()); + EXPECT_EQ(kNumUnsafeNonRegexRules + kNumUnsafeRegexRules, + matcher->GetUnsafeRulesCount()); EXPECT_EQ(kNumRegexRules, matcher->GetRegexRulesCount()); // Also verify the rules count for an empty matcher. @@ -1138,6 +1166,7 @@ CreateVerifiedMatcher({} /* rules */, CreateTemporarySource(), &matcher)); ASSERT_TRUE(matcher); EXPECT_EQ(0u, matcher->GetRulesCount()); + EXPECT_EQ(absl::nullopt, matcher->GetUnsafeRulesCount()); EXPECT_EQ(0u, matcher->GetRegexRulesCount()); }
diff --git a/extensions/browser/api/declarative_net_request/test_utils.cc b/extensions/browser/api/declarative_net_request/test_utils.cc index dd211d5..52cd743 100644 --- a/extensions/browser/api/declarative_net_request/test_utils.cc +++ b/extensions/browser/api/declarative_net_request/test_utils.cc
@@ -352,6 +352,9 @@ std::ostream& operator<<(std::ostream& output, const RuleCounts& count) { output << "\nRuleCounts\n"; output << "|rule_count| " << count.rule_count << "\n"; + if (count.unsafe_rule_count.has_value()) { + output << "|unsafe_rule_count| " << *(count.unsafe_rule_count) << "\n"; + } output << "|regex_rule_count| " << count.regex_rule_count << "\n"; return output; }
diff --git a/extensions/browser/api/scripting/scripting_utils.h b/extensions/browser/api/scripting/scripting_utils.h index 989f0d1..4c1b463a 100644 --- a/extensions/browser/api/scripting/scripting_utils.h +++ b/extensions/browser/api/scripting/scripting_utils.h
@@ -5,7 +5,11 @@ #ifndef EXTENSIONS_BROWSER_API_SCRIPTING_SCRIPTING_UTILS_H_ #define EXTENSIONS_BROWSER_API_SCRIPTING_SCRIPTING_UTILS_H_ +#include <string> + #include "base/containers/contains.h" +#include "base/functional/callback_forward.h" +#include "base/strings/utf_string_conversions.h" #include "extensions/browser/extension_user_script_loader.h" #include "extensions/common/error_utils.h" #include "extensions/common/extension_id.h" @@ -61,6 +65,69 @@ return new_script_ids; } +// Returns a list of UserScript objects for each `scripts_to_update` by +// retrieving the metadata of all loaded scripts with `source` using +// `create_script_callback` and updating them with the given delta using +// `apply_update_callback`. If any of the `scripts_to_update` hasn't been +// previously loaded or parsing fails, populates error and returns nullptr. +template <typename Script> +std::unique_ptr<UserScriptList> UpdateScripts( + std::vector<Script>& scripts_to_update, + UserScript::Source source, + ExtensionUserScriptLoader& loader, + base::RepeatingCallback<Script(const UserScript& script)> + create_script_metadata_callback, + base::RepeatingCallback<std::unique_ptr<UserScript>( + Script& new_script, + Script& existent_script, + int definition_index, + std::u16string* parse_error)> apply_update_callback, + std::string* error) { + // Retrieve the metadata of all loaded scripts with `source`. + std::map<std::string, Script> loaded_scripts_metadata; + const UserScriptList& dynamic_scripts = loader.GetLoadedDynamicScripts(); + for (const std::unique_ptr<UserScript>& script : dynamic_scripts) { + if (script->GetSource() != source) { + continue; + } + + Script script_metadata = create_script_metadata_callback.Run(*script); + loaded_scripts_metadata.emplace(script->id(), std::move(script_metadata)); + } + + // Verify scripts to update have previously been loaded. + for (const auto& script : scripts_to_update) { + if (!loaded_scripts_metadata.contains(script.id)) { + *error = ErrorUtils::FormatErrorMessage( + "Script with ID '*' does not exist or is not fully registered", + UserScript::TrimPrefixFromScriptID(script.id)); + return nullptr; + } + } + + // Update the scripts. + std::u16string parse_error; + auto parsed_scripts = std::make_unique<UserScriptList>(); + parsed_scripts->reserve(scripts_to_update.size()); + for (size_t i = 0; i < scripts_to_update.size(); ++i) { + Script& new_script = scripts_to_update[i]; + CHECK(base::Contains(loaded_scripts_metadata, new_script.id)); + Script& existent_script = loaded_scripts_metadata[new_script.id]; + + std::unique_ptr<UserScript> script = + apply_update_callback.Run(new_script, existent_script, i, &parse_error); + if (!script) { + CHECK(!parse_error.empty()); + *error = base::UTF16ToASCII(parse_error); + return nullptr; + } + + parsed_scripts->push_back(std::move(script)); + } + + return parsed_scripts; +} + // Removes all scripts with `ids` of `extension_id`. If `ids` has no value, // clears all scripts with `source` and `extension_id`. If any of the `ids` // provided is invalid, populates `error` and returns false. Otherwise, returns
diff --git a/extensions/browser/api/user_scripts/user_scripts_api.cc b/extensions/browser/api/user_scripts/user_scripts_api.cc index cad0574..ac5cee6 100644 --- a/extensions/browser/api/user_scripts/user_scripts_api.cc +++ b/extensions/browser/api/user_scripts/user_scripts_api.cc
@@ -4,6 +4,9 @@ #include "extensions/browser/api/user_scripts/user_scripts_api.h" +#include <vector> + +#include "base/functional/bind.h" #include "base/strings/utf_string_conversions.h" #include "base/types/optional_util.h" #include "extensions/browser/api/scripting/scripting_constants.h" @@ -316,4 +319,134 @@ } } +ExtensionFunction::ResponseAction UserScriptsUpdateFunction::Run() { + absl::optional<api::user_scripts::Update::Params> params( + api::user_scripts::Update::Params::Create(args())); + EXTENSION_FUNCTION_VALIDATE(params); + EXTENSION_FUNCTION_VALIDATE(extension()); + + std::vector<api::user_scripts::RegisteredUserScript>& scripts_to_update = + params->scripts; + std::string error; + + // Add the prefix for dynamic user scripts onto the IDs of all `scripts` + // before continuing. + std::set<std::string> ids_to_update = scripting::CreateDynamicScriptIds( + scripts_to_update, UserScript::Source::kDynamicUserScript, + /*existing_script_ids=*/std::set<std::string>(), &error); + + if (!error.empty()) { + CHECK(ids_to_update.empty()); + return RespondNow(Error(std::move(error))); + } + + ExtensionUserScriptLoader* loader = + ExtensionSystem::Get(browser_context()) + ->user_script_manager() + ->GetUserScriptLoaderForExtension(extension()->id()); + + std::unique_ptr<UserScriptList> parsed_scripts = scripting::UpdateScripts( + scripts_to_update, UserScript::Source::kDynamicUserScript, *loader, + base::BindRepeating(&CreateRegisteredUserScriptInfo), + base::BindRepeating(&UserScriptsUpdateFunction::ApplyUpdate, this), + &error); + + if (!error.empty()) { + CHECK(!parsed_scripts); + return RespondNow(Error(std::move(error))); + } + + // Add new script IDs now in case another call with the same script IDs is + // made immediately following this one. + loader->AddPendingDynamicScriptIDs(std::move(ids_to_update)); + + GetExtensionFileTaskRunner()->PostTaskAndReplyWithResult( + FROM_HERE, + base::BindOnce(&scripting::ValidateParsedScriptsOnFileThread, + script_parsing::GetSymlinkPolicy(extension()), + std::move(parsed_scripts)), + base::BindOnce(&UserScriptsUpdateFunction::OnUserScriptFilesValidated, + this)); + + // Balanced in `OnUserScriptFilesValidated()`. + AddRef(); + return RespondLater(); +} + +std::unique_ptr<UserScript> UserScriptsUpdateFunction::ApplyUpdate( + api::user_scripts::RegisteredUserScript& new_script, + api::user_scripts::RegisteredUserScript& original_script, + int definition_index, + std::u16string* parse_error) { + if (new_script.run_at != api::extension_types::RunAt::kNone) { + original_script.run_at = new_script.run_at; + } + + if (new_script.all_frames) { + original_script.all_frames = *new_script.all_frames; + } + + if (new_script.matches) { + original_script.matches = std::move(new_script.matches); + } + + if (new_script.exclude_matches) { + original_script.exclude_matches = std::move(new_script.exclude_matches); + } + + if (!new_script.js.empty()) { + original_script.js = std::move(new_script.js); + } + + std::unique_ptr<UserScript> parsed_script = + ParseUserScript(*extension(), original_script, parse_error); + return parsed_script; +} + +void UserScriptsUpdateFunction::OnUserScriptFilesValidated( + scripting::ValidateScriptsResult result) { + // We cannot proceed if the `browser_context` is not valid as the + // `ExtensionSystem` will not exist. + if (!browser_context()) { + Release(); // Matches the `AddRef()` in `Run()`. + return; + } + + auto error = std::move(result.second); + auto scripts = std::move(result.first); + ExtensionUserScriptLoader* loader = + ExtensionSystem::Get(browser_context()) + ->user_script_manager() + ->GetUserScriptLoaderForExtension(extension()->id()); + + std::set<std::string> script_ids; + for (const auto& script : *scripts) { + script_ids.insert(script->id()); + } + + if (error.has_value()) { + loader->RemovePendingDynamicScriptIDs(script_ids); + Respond(Error(std::move(*error))); + Release(); // Matches the `AddRef()` in `Run()`. + return; + } + + // User scripts are always persisted across sessions. + std::set<std::string> persistent_script_ids = script_ids; + loader->UpdateDynamicScripts( + std::move(scripts), std::move(script_ids), + std::move(persistent_script_ids), + base::BindOnce(&UserScriptsUpdateFunction::OnUserScriptsUpdated, this)); +} + +void UserScriptsUpdateFunction::OnUserScriptsUpdated( + const absl::optional<std::string>& error) { + if (error.has_value()) { + Respond(Error(std::move(*error))); + } else { + Respond(NoArguments()); + } + Release(); // Matches the `AddRef()` in `Run()`. +} + } // namespace extensions
diff --git a/extensions/browser/api/user_scripts/user_scripts_api.h b/extensions/browser/api/user_scripts/user_scripts_api.h index 2fbcd32..fd1de7cb 100644 --- a/extensions/browser/api/user_scripts/user_scripts_api.h +++ b/extensions/browser/api/user_scripts/user_scripts_api.h
@@ -8,6 +8,7 @@ #include "extensions/browser/api/scripting/scripting_utils.h" #include "extensions/browser/extension_function.h" #include "extensions/browser/extension_function_histogram_value.h" +#include "extensions/common/api/user_scripts.h" namespace extensions { @@ -68,6 +69,39 @@ void OnUserScriptsUnregistered(const absl::optional<std::string>& error); }; +class UserScriptsUpdateFunction : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("userScripts.update", USERSCRIPTS_UPDATE) + + UserScriptsUpdateFunction() = default; + UserScriptsUpdateFunction(const UserScriptsUpdateFunction&) = delete; + const UserScriptsUpdateFunction& operator=(const UserScriptsUpdateFunction&) = + delete; + + // ExtensionFunction: + ResponseAction Run() override; + + private: + ~UserScriptsUpdateFunction() override = default; + + // Returns a UserScript object by updating the `original_script` with the + // `new_script` given delta. If the updated script cannot be parsed, populates + // `parse_error` and returns nullptr. + // Note: While `definition_index` is not used, we have it as a parameter to + // match other ApplyUpdate() callbacks. + std::unique_ptr<UserScript> ApplyUpdate( + api::user_scripts::RegisteredUserScript& new_script, + api::user_scripts::RegisteredUserScript& original_script, + int definition_index, + std::u16string* parse_error); + + // Called when user script files have been validated. + void OnUserScriptFilesValidated(scripting::ValidateScriptsResult result); + + // Called when user scripts have been updated.. + void OnUserScriptsUpdated(const absl::optional<std::string>& error); +}; + } // namespace extensions #endif // EXTENSIONS_BROWSER_API_USER_SCRIPTS_USER_SCRIPTS_API_H_
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 25b2b13..4705e7f 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1890,6 +1890,7 @@ OS_DIAGNOSTICS_CANCELROUTINE = 1828, OS_DIAGNOSTICS_ISMEMORYROUTINEARGUMENTSUPPORTED = 1829, ACCESSIBILITY_PRIVATE_CLIPBOARDCOPYINACTIVELACROSGOOGLEDOC = 1830, + USERSCRIPTS_UPDATE = 1831, // Last entry: Add new entries above, then run: // tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/browser/extension_user_script_loader.cc b/extensions/browser/extension_user_script_loader.cc index 0a07dbe1..cb76426 100644 --- a/extensions/browser/extension_user_script_loader.cc +++ b/extensions/browser/extension_user_script_loader.cc
@@ -653,6 +653,25 @@ RemoveDynamicScripts(GetDynamicScriptIDs(source), std::move(callback)); } +void ExtensionUserScriptLoader::UpdateDynamicScripts( + std::unique_ptr<UserScriptList> scripts, + std::set<std::string> script_ids, + std::set<std::string> persistent_script_ids, + ExtensionUserScriptLoader::DynamicScriptsModifiedCallback add_callback) { + // To guarantee that scripts are updated, they need to be removed then added + // again. It should be guaranteed that the new scripts are added after the old + // ones are removed. + RemoveDynamicScripts(script_ids, /*callback=*/base::DoNothing()); + + // Since RemoveDynamicScripts will remove pending script IDs, but + // AddDynamicScripts will only add scripts that are marked as pending, we must + // mark `script_ids` as pending again here. + AddPendingDynamicScriptIDs(std::move(script_ids)); + + AddDynamicScripts(std::move(scripts), std::move(persistent_script_ids), + std::move(add_callback)); +} + std::set<std::string> ExtensionUserScriptLoader::GetDynamicScriptIDs( UserScript::Source source) const { std::set<std::string> dynamic_script_ids;
diff --git a/extensions/browser/extension_user_script_loader.h b/extensions/browser/extension_user_script_loader.h index 97869ec..c854695 100644 --- a/extensions/browser/extension_user_script_loader.h +++ b/extensions/browser/extension_user_script_loader.h
@@ -90,6 +90,15 @@ void ClearDynamicScripts(UserScript::Source source, DynamicScriptsModifiedCallback callback); + // Updates `scripts` with `script_ids` from the set of scripts managed by this + // loader, persisting the ones in `persistent_script_ids`. Invokes + // `add_callback` once scripts are updated. + void UpdateDynamicScripts( + std::unique_ptr<UserScriptList> scripts, + std::set<std::string> script_ids, + std::set<std::string> persistent_script_ids, + ExtensionUserScriptLoader::DynamicScriptsModifiedCallback add_callback); + // Returns the IDs of all dynamic scripts with `source` for the extension, // which includes the IDs of all pending and loaded dynamic scripts. std::set<std::string> GetDynamicScriptIDs(UserScript::Source source) const;
diff --git a/extensions/common/api/user_scripts.idl b/extensions/common/api/user_scripts.idl index d53d4f8..1cf4966 100644 --- a/extensions/common/api/user_scripts.idl +++ b/extensions/common/api/user_scripts.idl
@@ -58,6 +58,8 @@ callback UnregisterCallback = void(); + callback UpdateCallback = void(); + interface Functions { // Registers one or more user scripts for this extension. // |scripts|: Contains a list of user scripts to be registered. @@ -83,5 +85,17 @@ [supportsPromises] static void unregister( optional UserScriptFilter filter, UnregisterCallback callback); + + // Updates one or more user scripts for this extension. + // |scripts|: Contains a list of user scripts to be updated. A property is + // only updated for the existing script if it is specified in this object. + // If there are errors during script parsing/file validation, or if the IDs + // specified do not correspond to a fully registered script, then no scripts + // are updated. + // |callback|: Called once scripts have been fully updated or if an error + // occurs. + [supportsPromises] static void update( + RegisteredUserScript[] scripts, + optional UpdateCallback callback); }; };
diff --git a/gpu/command_buffer/client/gles2_c_lib_autogen.h b/gpu/command_buffer/client/gles2_c_lib_autogen.h index 3225edbf..d9cbc30 100644 --- a/gpu/command_buffer/client/gles2_c_lib_autogen.h +++ b/gpu/command_buffer/client/gles2_c_lib_autogen.h
@@ -1667,12 +1667,17 @@ planes_yuv_color_space, plane_config, subsampling, mailboxes); } void GL_APIENTRY -GLES2ConvertYUVAMailboxesToRGBINTERNAL(GLenum planes_yuv_color_space, +GLES2ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) { gles2::GetGLContext()->ConvertYUVAMailboxesToRGBINTERNAL( - planes_yuv_color_space, plane_config, subsampling, mailboxes); + src_x, src_y, width, height, planes_yuv_color_space, plane_config, + subsampling, mailboxes); } void GL_APIENTRY GLES2CopySharedImageINTERNAL(GLint xoffset, GLint yoffset,
diff --git a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h index 0d77fb57..90693b6f 100644 --- a/gpu/command_buffer/client/gles2_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/gles2_cmd_helper_autogen.h
@@ -3190,7 +3190,11 @@ } } -void ConvertYUVAMailboxesToRGBINTERNALImmediate(GLenum planes_yuv_color_space, +void ConvertYUVAMailboxesToRGBINTERNALImmediate(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) { @@ -3200,7 +3204,8 @@ GetImmediateCmdSpaceTotalSize< gles2::cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate>(size); if (c) { - c->Init(planes_yuv_color_space, plane_config, subsampling, mailboxes); + c->Init(src_x, src_y, width, height, planes_yuv_color_space, plane_config, + subsampling, mailboxes); } }
diff --git a/gpu/command_buffer/client/gles2_implementation_autogen.h b/gpu/command_buffer/client/gles2_implementation_autogen.h index 8cf5856..0bee7df 100644 --- a/gpu/command_buffer/client/gles2_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_autogen.h
@@ -1169,7 +1169,11 @@ GLenum subsampling, const GLbyte* mailboxes) override; -void ConvertYUVAMailboxesToRGBINTERNAL(GLenum planes_yuv_color_space, +void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) override;
diff --git a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h index fded1b1..0907f178 100644 --- a/gpu/command_buffer/client/gles2_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_impl_autogen.h
@@ -3542,13 +3542,18 @@ } void GLES2Implementation::ConvertYUVAMailboxesToRGBINTERNAL( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) { GPU_CLIENT_SINGLE_THREAD_CHECK(); GPU_CLIENT_LOG("[" << GetLogPrefix() - << "] glConvertYUVAMailboxesToRGBINTERNAL(" + << "] glConvertYUVAMailboxesToRGBINTERNAL(" << src_x + << ", " << src_y << ", " << width << ", " << height << ", " << GLES2Util::GetStringEnum(planes_yuv_color_space) << ", " << GLES2Util::GetStringEnum(plane_config) << ", " << GLES2Util::GetStringEnum(subsampling) << ", " @@ -3557,8 +3562,19 @@ for (uint32_t ii = 0; ii < count; ++ii) { GPU_CLIENT_LOG("value[" << ii << "]: " << mailboxes[ii]); } + if (width < 0) { + SetGLError(GL_INVALID_VALUE, "glConvertYUVAMailboxesToRGBINTERNAL", + "width < 0"); + return; + } + if (height < 0) { + SetGLError(GL_INVALID_VALUE, "glConvertYUVAMailboxesToRGBINTERNAL", + "height < 0"); + return; + } helper_->ConvertYUVAMailboxesToRGBINTERNALImmediate( - planes_yuv_color_space, plane_config, subsampling, mailboxes); + src_x, src_y, width, height, planes_yuv_color_space, plane_config, + subsampling, mailboxes); CheckGLError(); }
diff --git a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h index b84ba28b..e327da5 100644 --- a/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h +++ b/gpu/command_buffer/client/gles2_implementation_unittest_autogen.h
@@ -3049,8 +3049,8 @@ data[jj] = static_cast<GLbyte>(jj); } Cmds expected; - expected.cmd.Init(1, 2, 3, &data[0]); - gl_->ConvertYUVAMailboxesToRGBINTERNAL(1, 2, 3, &data[0]); + expected.cmd.Init(1, 2, 3, 4, 5, 6, 7, &data[0]); + gl_->ConvertYUVAMailboxesToRGBINTERNAL(1, 2, 3, 4, 5, 6, 7, &data[0]); EXPECT_EQ(0, memcmp(&expected, commands_, sizeof(expected))); }
diff --git a/gpu/command_buffer/client/gles2_interface_autogen.h b/gpu/command_buffer/client/gles2_interface_autogen.h index a389ea0e..edd260d 100644 --- a/gpu/command_buffer/client/gles2_interface_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_autogen.h
@@ -866,7 +866,11 @@ GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) = 0; -virtual void ConvertYUVAMailboxesToRGBINTERNAL(GLenum planes_yuv_color_space, +virtual void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) = 0;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_autogen.h index 512b8ea..8eb7119 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_autogen.h
@@ -838,7 +838,11 @@ GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) override; -void ConvertYUVAMailboxesToRGBINTERNAL(GLenum planes_yuv_color_space, +void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) override;
diff --git a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h index fdbde05..69e08a4 100644 --- a/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_interface_stub_impl_autogen.h
@@ -1139,6 +1139,10 @@ GLenum /* subsampling */, const GLbyte* /* mailboxes */) {} void GLES2InterfaceStub::ConvertYUVAMailboxesToRGBINTERNAL( + GLint /* src_x */, + GLint /* src_y */, + GLsizei /* width */, + GLsizei /* height */, GLenum /* planes_yuv_color_space */, GLenum /* plane_config */, GLenum /* subsampling */,
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h index 4dfd976..2c3a91e 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_autogen.h
@@ -838,7 +838,11 @@ GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) override; -void ConvertYUVAMailboxesToRGBINTERNAL(GLenum planes_yuv_color_space, +void ConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) override;
diff --git a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h index 8c7aade..42db133 100644 --- a/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h +++ b/gpu/command_buffer/client/gles2_trace_implementation_impl_autogen.h
@@ -2426,13 +2426,18 @@ } void GLES2TraceImplementation::ConvertYUVAMailboxesToRGBINTERNAL( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) { TRACE_EVENT_BINARY_EFFICIENT0( "gpu", "GLES2Trace::ConvertYUVAMailboxesToRGBINTERNAL"); - gl_->ConvertYUVAMailboxesToRGBINTERNAL(planes_yuv_color_space, plane_config, + gl_->ConvertYUVAMailboxesToRGBINTERNAL(src_x, src_y, width, height, + planes_yuv_color_space, plane_config, subsampling, mailboxes); }
diff --git a/gpu/command_buffer/client/raster_cmd_helper_autogen.h b/gpu/command_buffer/client/raster_cmd_helper_autogen.h index 44dbd5a0..11d2f5a8 100644 --- a/gpu/command_buffer/client/raster_cmd_helper_autogen.h +++ b/gpu/command_buffer/client/raster_cmd_helper_autogen.h
@@ -307,7 +307,11 @@ } } -void ConvertYUVAMailboxesToRGBINTERNALImmediate(GLenum planes_yuv_color_space, +void ConvertYUVAMailboxesToRGBINTERNALImmediate(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes) { @@ -317,7 +321,8 @@ GetImmediateCmdSpaceTotalSize< raster::cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate>(size); if (c) { - c->Init(planes_yuv_color_space, plane_config, subsampling, mailboxes); + c->Init(src_x, src_y, width, height, planes_yuv_color_space, plane_config, + subsampling, mailboxes); } }
diff --git a/gpu/command_buffer/client/raster_implementation.cc b/gpu/command_buffer/client/raster_implementation.cc index e03e6fe52c..3a30ce1 100644 --- a/gpu/command_buffer/client/raster_implementation.cc +++ b/gpu/command_buffer/client/raster_implementation.cc
@@ -1336,6 +1336,10 @@ void RasterImplementation::ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, SkYUVColorSpace planes_yuv_color_space, const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, @@ -1372,8 +1376,9 @@ DCHECK_EQ(offset, kByteSize); helper_->ConvertYUVAMailboxesToRGBINTERNALImmediate( - planes_yuv_color_space, static_cast<GLenum>(plane_config), - static_cast<GLenum>(subsampling), reinterpret_cast<GLbyte*>(bytes)); + src_x, src_y, width, height, planes_yuv_color_space, + static_cast<GLenum>(plane_config), 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 fcbdcf8..91f6e98a 100644 --- a/gpu/command_buffer/client/raster_implementation.h +++ b/gpu/command_buffer/client/raster_implementation.h
@@ -138,6 +138,10 @@ void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, SkYUVColorSpace planes_yuv_color_space, const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config,
diff --git a/gpu/command_buffer/client/raster_implementation_gles.cc b/gpu/command_buffer/client/raster_implementation_gles.cc index fbc37cf..b4bf3bdf 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.cc +++ b/gpu/command_buffer/client/raster_implementation_gles.cc
@@ -257,6 +257,10 @@ void RasterImplementationGLES::ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, SkYUVColorSpace planes_yuv_color_space, const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config, @@ -295,8 +299,9 @@ DCHECK_EQ(offset, kByteSize); gl_->ConvertYUVAMailboxesToRGBINTERNAL( - planes_yuv_color_space, static_cast<GLenum>(plane_config), - static_cast<GLenum>(subsampling), reinterpret_cast<GLbyte*>(bytes)); + src_x, src_y, width, height, planes_yuv_color_space, + static_cast<GLenum>(plane_config), static_cast<GLenum>(subsampling), + reinterpret_cast<GLbyte*>(bytes)); } void RasterImplementationGLES::ConvertRGBAToYUVAMailboxes(
diff --git a/gpu/command_buffer/client/raster_implementation_gles.h b/gpu/command_buffer/client/raster_implementation_gles.h index e6d00367..cad708e 100644 --- a/gpu/command_buffer/client/raster_implementation_gles.h +++ b/gpu/command_buffer/client/raster_implementation_gles.h
@@ -81,6 +81,10 @@ void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, SkYUVColorSpace planes_yuv_color_space, const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config,
diff --git a/gpu/command_buffer/client/raster_interface.h b/gpu/command_buffer/client/raster_interface.h index 5c04b6f..a86e295b 100644 --- a/gpu/command_buffer/client/raster_interface.h +++ b/gpu/command_buffer/client/raster_interface.h
@@ -89,6 +89,10 @@ // `dest_mailbox`'s color space. virtual void ConvertYUVAMailboxesToRGB( const gpu::Mailbox& dest_mailbox, + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, SkYUVColorSpace planes_yuv_color_space, const SkColorSpace* planes_rgb_color_space, SkYUVAInfo::PlaneConfig plane_config,
diff --git a/gpu/command_buffer/common/gles2_cmd_format_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_autogen.h index 29d6796..e270e19 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_autogen.h
@@ -15696,11 +15696,19 @@ void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } - void Init(GLenum _planes_yuv_color_space, + void Init(GLint _src_x, + GLint _src_y, + GLsizei _width, + GLsizei _height, + GLenum _planes_yuv_color_space, GLenum _plane_config, GLenum _subsampling, const GLbyte* _mailboxes) { SetHeader(); + src_x = _src_x; + src_y = _src_y; + width = _width; + height = _height; planes_yuv_color_space = _planes_yuv_color_space; plane_config = _plane_config; subsampling = _subsampling; @@ -15708,40 +15716,61 @@ } void* Set(void* cmd, + GLint _src_x, + GLint _src_y, + GLsizei _width, + GLsizei _height, GLenum _planes_yuv_color_space, GLenum _plane_config, GLenum _subsampling, const GLbyte* _mailboxes) { - static_cast<ValueType*>(cmd)->Init(_planes_yuv_color_space, _plane_config, + static_cast<ValueType*>(cmd)->Init(_src_x, _src_y, _width, _height, + _planes_yuv_color_space, _plane_config, _subsampling, _mailboxes); const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; + int32_t src_x; + int32_t src_y; + int32_t width; + int32_t height; uint32_t planes_yuv_color_space; uint32_t plane_config; uint32_t subsampling; }; static_assert( - sizeof(ConvertYUVAMailboxesToRGBINTERNALImmediate) == 16, - "size of ConvertYUVAMailboxesToRGBINTERNALImmediate should be 16"); + sizeof(ConvertYUVAMailboxesToRGBINTERNALImmediate) == 32, + "size of ConvertYUVAMailboxesToRGBINTERNALImmediate should be 32"); static_assert( offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, header) == 0, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate header should be 0"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, src_x) == 4, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate src_x should be 4"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, src_y) == 8, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate src_y should be 8"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, width) == 12, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate width should be 12"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, height) == 16, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate height should be 16"); static_assert(offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, - planes_yuv_color_space) == 4, + planes_yuv_color_space) == 20, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate " - "planes_yuv_color_space should be 4"); + "planes_yuv_color_space should be 20"); static_assert(offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, - plane_config) == 8, + plane_config) == 24, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate " - "plane_config should be 8"); + "plane_config should be 24"); static_assert(offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, - subsampling) == 12, + subsampling) == 28, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate " - "subsampling should be 12"); + "subsampling should be 28"); struct CopySharedImageINTERNALImmediate { typedef CopySharedImageINTERNALImmediate ValueType;
diff --git a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h index 78d78dc..5b18dbce 100644 --- a/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/gles2_cmd_format_test_autogen.h
@@ -5455,17 +5455,22 @@ }; cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate& cmd = *GetBufferAs<cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate>(); - void* next_cmd = - cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12), - static_cast<GLenum>(13), data); + void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLint>(12), + static_cast<GLsizei>(13), static_cast<GLsizei>(14), + static_cast<GLenum>(15), static_cast<GLenum>(16), + static_cast<GLenum>(17), data); EXPECT_EQ(static_cast<uint32_t>( cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.planes_yuv_color_space); - EXPECT_EQ(static_cast<GLenum>(12), cmd.plane_config); - EXPECT_EQ(static_cast<GLenum>(13), cmd.subsampling); + EXPECT_EQ(static_cast<GLint>(11), cmd.src_x); + EXPECT_EQ(static_cast<GLint>(12), cmd.src_y); + EXPECT_EQ(static_cast<GLsizei>(13), cmd.width); + EXPECT_EQ(static_cast<GLsizei>(14), cmd.height); + EXPECT_EQ(static_cast<GLenum>(15), cmd.planes_yuv_color_space); + EXPECT_EQ(static_cast<GLenum>(16), cmd.plane_config); + EXPECT_EQ(static_cast<GLenum>(17), cmd.subsampling); CheckBytesWrittenMatchesExpectedSize( next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); }
diff --git a/gpu/command_buffer/common/raster_cmd_format_autogen.h b/gpu/command_buffer/common/raster_cmd_format_autogen.h index 0142db8..4b8a914 100644 --- a/gpu/command_buffer/common/raster_cmd_format_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_autogen.h
@@ -1427,11 +1427,19 @@ void SetHeader() { header.SetCmdByTotalSize<ValueType>(ComputeSize()); } - void Init(GLenum _planes_yuv_color_space, + void Init(GLint _src_x, + GLint _src_y, + GLsizei _width, + GLsizei _height, + GLenum _planes_yuv_color_space, GLenum _plane_config, GLenum _subsampling, const GLbyte* _mailboxes) { SetHeader(); + src_x = _src_x; + src_y = _src_y; + width = _width; + height = _height; planes_yuv_color_space = _planes_yuv_color_space; plane_config = _plane_config; subsampling = _subsampling; @@ -1439,40 +1447,61 @@ } void* Set(void* cmd, + GLint _src_x, + GLint _src_y, + GLsizei _width, + GLsizei _height, GLenum _planes_yuv_color_space, GLenum _plane_config, GLenum _subsampling, const GLbyte* _mailboxes) { - static_cast<ValueType*>(cmd)->Init(_planes_yuv_color_space, _plane_config, + static_cast<ValueType*>(cmd)->Init(_src_x, _src_y, _width, _height, + _planes_yuv_color_space, _plane_config, _subsampling, _mailboxes); const uint32_t size = ComputeSize(); return NextImmediateCmdAddressTotalSize<ValueType>(cmd, size); } gpu::CommandHeader header; + int32_t src_x; + int32_t src_y; + int32_t width; + int32_t height; uint32_t planes_yuv_color_space; uint32_t plane_config; uint32_t subsampling; }; static_assert( - sizeof(ConvertYUVAMailboxesToRGBINTERNALImmediate) == 16, - "size of ConvertYUVAMailboxesToRGBINTERNALImmediate should be 16"); + sizeof(ConvertYUVAMailboxesToRGBINTERNALImmediate) == 32, + "size of ConvertYUVAMailboxesToRGBINTERNALImmediate should be 32"); static_assert( offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, header) == 0, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate header should be 0"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, src_x) == 4, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate src_x should be 4"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, src_y) == 8, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate src_y should be 8"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, width) == 12, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate width should be 12"); +static_assert( + offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, height) == 16, + "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate height should be 16"); static_assert(offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, - planes_yuv_color_space) == 4, + planes_yuv_color_space) == 20, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate " - "planes_yuv_color_space should be 4"); + "planes_yuv_color_space should be 20"); static_assert(offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, - plane_config) == 8, + plane_config) == 24, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate " - "plane_config should be 8"); + "plane_config should be 24"); static_assert(offsetof(ConvertYUVAMailboxesToRGBINTERNALImmediate, - subsampling) == 12, + subsampling) == 28, "offset of ConvertYUVAMailboxesToRGBINTERNALImmediate " - "subsampling should be 12"); + "subsampling should be 28"); struct ConvertRGBAToYUVAMailboxesINTERNALImmediate { typedef ConvertRGBAToYUVAMailboxesINTERNALImmediate ValueType;
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 0bb5bf9..a9060a24d0 100644 --- a/gpu/command_buffer/common/raster_cmd_format_test_autogen.h +++ b/gpu/command_buffer/common/raster_cmd_format_test_autogen.h
@@ -705,17 +705,22 @@ }; cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate& cmd = *GetBufferAs<cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate>(); - void* next_cmd = - cmd.Set(&cmd, static_cast<GLenum>(11), static_cast<GLenum>(12), - static_cast<GLenum>(13), data); + void* next_cmd = cmd.Set(&cmd, static_cast<GLint>(11), static_cast<GLint>(12), + static_cast<GLsizei>(13), static_cast<GLsizei>(14), + static_cast<GLenum>(15), static_cast<GLenum>(16), + static_cast<GLenum>(17), data); EXPECT_EQ(static_cast<uint32_t>( cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate::kCmdId), cmd.header.command); EXPECT_EQ(sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data)), cmd.header.size * 4u); - EXPECT_EQ(static_cast<GLenum>(11), cmd.planes_yuv_color_space); - EXPECT_EQ(static_cast<GLenum>(12), cmd.plane_config); - EXPECT_EQ(static_cast<GLenum>(13), cmd.subsampling); + EXPECT_EQ(static_cast<GLint>(11), cmd.src_x); + EXPECT_EQ(static_cast<GLint>(12), cmd.src_y); + EXPECT_EQ(static_cast<GLsizei>(13), cmd.width); + EXPECT_EQ(static_cast<GLsizei>(14), cmd.height); + EXPECT_EQ(static_cast<GLenum>(15), cmd.planes_yuv_color_space); + EXPECT_EQ(static_cast<GLenum>(16), cmd.plane_config); + EXPECT_EQ(static_cast<GLenum>(17), cmd.subsampling); CheckBytesWrittenMatchesExpectedSize( next_cmd, sizeof(cmd) + RoundSizeToMultipleOfEntries(sizeof(data))); }
diff --git a/gpu/command_buffer/gles2_cmd_buffer_functions.txt b/gpu/command_buffer/gles2_cmd_buffer_functions.txt index 4abacf1..2b8205b 100644 --- a/gpu/command_buffer/gles2_cmd_buffer_functions.txt +++ b/gpu/command_buffer/gles2_cmd_buffer_functions.txt
@@ -380,7 +380,7 @@ GL_APICALL void GL_APIENTRY glBeginSharedImageAccessDirectCHROMIUM (GLuint texture, GLenumSharedImageAccessMode mode); GL_APICALL void GL_APIENTRY glEndSharedImageAccessDirectCHROMIUM (GLuint texture); GL_APICALL void GL_APIENTRY glConvertRGBAToYUVAMailboxesINTERNAL (GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes); -GL_APICALL void GL_APIENTRY glConvertYUVAMailboxesToRGBINTERNAL (GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes); +GL_APICALL void GL_APIENTRY glConvertYUVAMailboxesToRGBINTERNAL (GLint src_x, GLint src_y, GLsizei width, GLsizei height, GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes); GL_APICALL void GL_APIENTRY glCopySharedImageINTERNAL (GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height, GLboolean unpack_flip_y, const GLbyte* mailboxes); GL_APICALL void GL_APIENTRY glCopySharedImageToTextureINTERNAL (GLuint texture, GLenum target, GLuint internal_format, GLenum type, GLint src_x, GLint src_y, GLsizei width, GLsizei height, GLboolean flip_y, const GLbyte* src_mailbox); GL_APICALL void GL_APIENTRY glReadbackARGBImagePixelsINTERNAL (const GLbyte* mailbox, const void* dst_color_space, GLuint dst_color_space_size, GLuint dst_size, GLuint dst_width, GLuint dst_height, GLuint dst_color_type, GLuint dst_alpha_type, GLuint dst_row_bytes, GLint src_x, GLint src_y, GLint plane_index, void* pixels);
diff --git a/gpu/command_buffer/raster_cmd_buffer_functions.txt b/gpu/command_buffer/raster_cmd_buffer_functions.txt index 56b7012..36aab193 100644 --- a/gpu/command_buffer/raster_cmd_buffer_functions.txt +++ b/gpu/command_buffer/raster_cmd_buffer_functions.txt
@@ -39,7 +39,7 @@ GL_APICALL void GL_APIENTRY glWritePixelsYUVINTERNAL (GLuint src_width, GLuint src_height, GLuint src_row_bytes_plane1, GLuint src_row_bytes_plane2, GLuint src_row_bytes_plane3, GLuint src_row_bytes_plane4, GLuint src_yuv_plane_config, GLuint src_yuv_subsampling, GLuint src_yuv_datatype, GLint shm_id, GLuint shm_offset, GLuint plane2_offset, GLuint plane3_offset, GLuint plane4_offset, const GLbyte* mailbox); GL_APICALL void GL_APIENTRY glReadbackARGBImagePixelsINTERNAL (GLint src_x, GLint src_y, GLint plane_index, GLuint dst_width, GLuint dst_height, GLuint row_bytes, GLuint dst_sk_color_type, GLuint dst_sk_alpha_type, GLint shm_id, GLuint shm_offset, GLuint color_space_offset, GLuint pixels_offset, const GLbyte* mailbox); GL_APICALL void GL_APIENTRY glReadbackYUVImagePixelsINTERNAL (GLuint dst_width, GLuint dst_height, GLint shm_id, GLuint shm_offset, GLuint y_offset, GLuint y_stride, GLuint u_offset, GLuint u_stride, GLuint v_offset, GLuint v_stride, const GLbyte* mailbox); -GL_APICALL void GL_APIENTRY glConvertYUVAMailboxesToRGBINTERNAL (GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes); +GL_APICALL void GL_APIENTRY glConvertYUVAMailboxesToRGBINTERNAL (GLint src_x, GLint src_y, GLsizei width, GLsizei height, GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes); GL_APICALL void GL_APIENTRY glConvertRGBAToYUVAMailboxesINTERNAL (GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, const GLbyte* mailboxes); GL_APICALL void GL_APIENTRY glTraceBeginCHROMIUM (const char* category_name, const char* trace_name); GL_APICALL void GL_APIENTRY glTraceEndCHROMIUM (void);
diff --git a/gpu/command_buffer/service/copy_shared_image_helper.cc b/gpu/command_buffer/service/copy_shared_image_helper.cc index 0cf15ca..531b5f0 100644 --- a/gpu/command_buffer/service/copy_shared_image_helper.cc +++ b/gpu/command_buffer/service/copy_shared_image_helper.cc
@@ -431,6 +431,10 @@ } base::expected<void, GLError> CopySharedImageHelper::ConvertYUVAMailboxesToRGB( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, @@ -503,10 +507,20 @@ } sk_sp<SkImage> result_image; - SkISize dest_size = - SkISize::Make(dest_surface->width(), dest_surface->height()); - SkYUVAInfo yuva_info(dest_size, src_plane_config, src_subsampling, - src_yuv_color_space); + + gfx::Size dest_size = + gfx::Size(dest_surface->width(), dest_surface->height()); + + gfx::Rect dest_rect(0, 0, width, height); + if (!gfx::Rect(dest_size).Contains(dest_rect)) { + return base::unexpected(GLError(GL_INVALID_VALUE, + "ConvertYUVAMailboxesToRGB", + "destination texture bad dimensions.")); + } + + auto src_size = yuva_images[0]->size(); + SkYUVAInfo yuva_info(gfx::SizeToSkISize(src_size), src_plane_config, + src_subsampling, src_yuv_color_space); if (auto* gr_context = shared_context_state_->gr_context()) { std::array<GrBackendTexture, SkYUVAInfo::kMaxPlanes> yuva_textures; for (int i = 0; i < num_src_planes; ++i) { @@ -538,8 +552,10 @@ } else { SkPaint paint; paint.setBlendMode(SkBlendMode::kSrc); - dest_surface->getCanvas()->drawImage(result_image, 0, 0, - SkSamplingOptions(), &paint); + SkRect src_rect = SkRect::MakeXYWH(src_x, src_y, width, height); + dest_surface->getCanvas()->drawImageRect( + result_image, src_rect, gfx::RectToSkRect(dest_rect), + SkSamplingOptions(), &paint, SkCanvas::kStrict_SrcRectConstraint); drew_image = true; } }
diff --git a/gpu/command_buffer/service/copy_shared_image_helper.h b/gpu/command_buffer/service/copy_shared_image_helper.h index 4ef1bfa4..6e04b5a 100644 --- a/gpu/command_buffer/service/copy_shared_image_helper.h +++ b/gpu/command_buffer/service/copy_shared_image_helper.h
@@ -44,6 +44,10 @@ GLenum subsampling, const volatile GLbyte* mailboxes_in); base::expected<void, GLError> ConvertYUVAMailboxesToRGB( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum yuv_color_space, GLenum plane_config, GLenum subsampling, @@ -95,4 +99,4 @@ } // namespace gpu -#endif // GPU_COMMAND_BUFFER_SERVICE_COPY_SHARED_IMAGE_HELPER_H_ \ No newline at end of file +#endif // GPU_COMMAND_BUFFER_SERVICE_COPY_SHARED_IMAGE_HELPER_H_
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder.cc b/gpu/command_buffer/service/gles2_cmd_decoder.cc index 24a67ab..045c9a2 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder.cc
@@ -1128,7 +1128,11 @@ GLenum plane_config, GLenum subsampling, const volatile GLbyte* mailboxes_in); - void DoConvertYUVAMailboxesToRGBINTERNAL(GLenum yuv_color_space, + void DoConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum yuv_color_space, GLenum plane_config, GLenum subsampling, const volatile GLbyte* mailboxes_in); @@ -17237,6 +17241,10 @@ } void GLES2DecoderImpl::DoConvertYUVAMailboxesToRGBINTERNAL( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum yuv_color_space, GLenum plane_config, GLenum subsampling,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h index 9fd2982..591b59f 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_autogen.h
@@ -5355,6 +5355,10 @@ const volatile gles2::cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate& c = *static_cast<const volatile gles2::cmds:: ConvertYUVAMailboxesToRGBINTERNALImmediate*>(cmd_data); + GLint src_x = static_cast<GLint>(c.src_x); + GLint src_y = static_cast<GLint>(c.src_y); + GLsizei width = static_cast<GLsizei>(c.width); + GLsizei height = static_cast<GLsizei>(c.height); GLenum planes_yuv_color_space = static_cast<GLenum>(c.planes_yuv_color_space); GLenum plane_config = static_cast<GLenum>(c.plane_config); GLenum subsampling = static_cast<GLenum>(c.subsampling); @@ -5367,10 +5371,21 @@ } volatile const GLbyte* mailboxes = GetImmediateDataAs<volatile const GLbyte*>( c, mailboxes_size, immediate_data_size); + if (width < 0) { + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glConvertYUVAMailboxesToRGBINTERNAL", + "width < 0"); + return error::kNoError; + } + if (height < 0) { + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glConvertYUVAMailboxesToRGBINTERNAL", + "height < 0"); + return error::kNoError; + } if (mailboxes == nullptr) { return error::kOutOfBounds; } - DoConvertYUVAMailboxesToRGBINTERNAL(planes_yuv_color_space, plane_config, + DoConvertYUVAMailboxesToRGBINTERNAL(src_x, src_y, width, height, + planes_yuv_color_space, plane_config, subsampling, mailboxes); return error::kNoError; }
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h index 193a2f5..7414f60 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doer_prototypes.h
@@ -1063,6 +1063,10 @@ GLenum subsampling, const volatile GLbyte* mailboxes_in); error::Error DoConvertYUVAMailboxesToRGBINTERNAL( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum yuv_color_space, GLenum plane_config, GLenum subsampling,
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc index d1955c5..a4b7b9f1e 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_doers.cc
@@ -5303,6 +5303,10 @@ } error::Error GLES2DecoderPassthroughImpl::DoConvertYUVAMailboxesToRGBINTERNAL( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum yuv_color_space, GLenum plane_config, GLenum subsampling, @@ -5318,7 +5322,8 @@ lazy_context_->shared_context_state()->surface()); CopySharedImageHelper helper(group_->shared_image_representation_factory(), lazy_context_->shared_context_state()); - auto result = helper.ConvertYUVAMailboxesToRGB(yuv_color_space, plane_config, + auto result = helper.ConvertYUVAMailboxesToRGB(src_x, src_y, width, height, + yuv_color_space, plane_config, subsampling, mailboxes_in); if (!result.has_value()) { InsertError(result.error().gl_error, result.error().msg);
diff --git a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc index f406e66d..fd8ed05 100644 --- a/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc +++ b/gpu/command_buffer/service/gles2_cmd_decoder_passthrough_handlers_autogen.cc
@@ -4648,6 +4648,10 @@ const volatile gles2::cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate& c = *static_cast<const volatile gles2::cmds:: ConvertYUVAMailboxesToRGBINTERNALImmediate*>(cmd_data); + GLint src_x = static_cast<GLint>(c.src_x); + GLint src_y = static_cast<GLint>(c.src_y); + GLsizei width = static_cast<GLsizei>(c.width); + GLsizei height = static_cast<GLsizei>(c.height); GLenum planes_yuv_color_space = static_cast<GLenum>(c.planes_yuv_color_space); GLenum plane_config = static_cast<GLenum>(c.plane_config); GLenum subsampling = static_cast<GLenum>(c.subsampling); @@ -4664,7 +4668,8 @@ return error::kOutOfBounds; } error::Error error = DoConvertYUVAMailboxesToRGBINTERNAL( - planes_yuv_color_space, plane_config, subsampling, mailboxes); + src_x, src_y, width, height, planes_yuv_color_space, plane_config, + subsampling, mailboxes); if (error != error::kNoError) { return error; }
diff --git a/gpu/command_buffer/service/raster_decoder.cc b/gpu/command_buffer/service/raster_decoder.cc index 8d5d2a4..00967dd 100644 --- a/gpu/command_buffer/service/raster_decoder.cc +++ b/gpu/command_buffer/service/raster_decoder.cc
@@ -722,7 +722,11 @@ GLuint v_stride, const volatile GLbyte* mailbox); - void DoConvertYUVAMailboxesToRGBINTERNAL(GLenum yuv_color_space, + void DoConvertYUVAMailboxesToRGBINTERNAL(GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, + GLenum yuv_color_space, GLenum plane_config, GLenum subsampling, const volatile GLbyte* mailboxes); @@ -2768,6 +2772,10 @@ } void RasterDecoderImpl::DoConvertYUVAMailboxesToRGBINTERNAL( + GLint src_x, + GLint src_y, + GLsizei width, + GLsizei height, GLenum planes_yuv_color_space, GLenum plane_config, GLenum subsampling, @@ -2775,7 +2783,8 @@ CopySharedImageHelper helper(&shared_image_representation_factory_, shared_context_state_.get()); auto result = helper.ConvertYUVAMailboxesToRGB( - planes_yuv_color_space, plane_config, subsampling, bytes_in); + src_x, src_y, width, height, planes_yuv_color_space, plane_config, + subsampling, bytes_in); if (!result.has_value()) { LOCAL_SET_GL_ERROR(result.error().gl_error, result.error().function_name.c_str(),
diff --git a/gpu/command_buffer/service/raster_decoder_autogen.h b/gpu/command_buffer/service/raster_decoder_autogen.h index d55878ed..0f4b6d90 100644 --- a/gpu/command_buffer/service/raster_decoder_autogen.h +++ b/gpu/command_buffer/service/raster_decoder_autogen.h
@@ -457,6 +457,10 @@ const volatile raster::cmds::ConvertYUVAMailboxesToRGBINTERNALImmediate& c = *static_cast<const volatile raster::cmds:: ConvertYUVAMailboxesToRGBINTERNALImmediate*>(cmd_data); + GLint src_x = static_cast<GLint>(c.src_x); + GLint src_y = static_cast<GLint>(c.src_y); + GLsizei width = static_cast<GLsizei>(c.width); + GLsizei height = static_cast<GLsizei>(c.height); GLenum planes_yuv_color_space = static_cast<GLenum>(c.planes_yuv_color_space); GLenum plane_config = static_cast<GLenum>(c.plane_config); GLenum subsampling = static_cast<GLenum>(c.subsampling); @@ -470,10 +474,21 @@ volatile const GLbyte* mailboxes = gles2::GetImmediateDataAs<volatile const GLbyte*>(c, mailboxes_size, immediate_data_size); + if (width < 0) { + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glConvertYUVAMailboxesToRGBINTERNAL", + "width < 0"); + return error::kNoError; + } + if (height < 0) { + LOCAL_SET_GL_ERROR(GL_INVALID_VALUE, "glConvertYUVAMailboxesToRGBINTERNAL", + "height < 0"); + return error::kNoError; + } if (mailboxes == nullptr) { return error::kOutOfBounds; } - DoConvertYUVAMailboxesToRGBINTERNAL(planes_yuv_color_space, plane_config, + DoConvertYUVAMailboxesToRGBINTERNAL(src_x, src_y, width, height, + planes_yuv_color_space, plane_config, subsampling, mailboxes); return error::kNoError; }
diff --git a/gpu/command_buffer/service/shared_image/shared_image_representation.cc b/gpu/command_buffer/service/shared_image/shared_image_representation.cc index 96e2ced8..33c494b 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_representation.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_representation.cc
@@ -456,7 +456,7 @@ if (!end_state_) { return; } - for (int plane = 0; plane < representation()->format().NumberOfPlanes(); + for (size_t plane = 0; plane < representation()->NumPlanesExpected(); plane++) { if (!ganesh_representation()->gr_context()->setBackendTextureState( promise_image_texture(plane)->backendTexture(), *end_state_)) {
diff --git a/infra/config/generated/builders/ci/android-cronet-riscv64-dbg/properties.json b/infra/config/generated/builders/ci/android-cronet-riscv64-dbg/properties.json new file mode 100644 index 0000000..1e12b965 --- /dev/null +++ b/infra/config/generated/builders/ci/android-cronet-riscv64-dbg/properties.json
@@ -0,0 +1,63 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-riscv64-dbg", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Debug", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-riscv64-dbg", + "project": "chromium" + } + ] + } + }, + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.android.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-riscv64-dbg/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-riscv64-dbg/shadow-properties.json new file mode 100644 index 0000000..999510c --- /dev/null +++ b/infra/config/generated/builders/ci/android-cronet-riscv64-dbg/shadow-properties.json
@@ -0,0 +1,8 @@ +{ + "$build/reclient": { + "instance": "rbe-chromium-untrusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-riscv64-rel/properties.json b/infra/config/generated/builders/ci/android-cronet-riscv64-rel/properties.json new file mode 100644 index 0000000..4069d39f --- /dev/null +++ b/infra/config/generated/builders/ci/android-cronet-riscv64-rel/properties.json
@@ -0,0 +1,63 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-cronet-riscv64-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android.fyi", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "main_builder" + }, + "legacy_chromium_config": { + "apply_configs": [ + "cronet_builder", + "mb" + ], + "build_config": "Release", + "config": "android", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-cronet-riscv64-rel", + "project": "chromium" + } + ] + } + }, + "$build/reclient": { + "instance": "rbe-chromium-trusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.android.fyi", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-cronet-riscv64-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-cronet-riscv64-rel/shadow-properties.json new file mode 100644 index 0000000..999510c --- /dev/null +++ b/infra/config/generated/builders/ci/android-cronet-riscv64-rel/shadow-properties.json
@@ -0,0 +1,8 @@ +{ + "$build/reclient": { + "instance": "rbe-chromium-untrusted", + "jobs": 250, + "metrics_project": "chromium-reclient-metrics", + "scandeps_server": true + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-skylab/properties.json b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-skylab/properties.json index 9a013df5..deaf49f 100644 --- a/infra/config/generated/builders/ci/lacros-amd64-generic-rel-skylab/properties.json +++ b/infra/config/generated/builders/ci/lacros-amd64-generic-rel-skylab/properties.json
@@ -31,7 +31,7 @@ "checkout_lacros_sdk", "chromeos" ], - "config": "chromium" + "config": "chromium_no_telemetry_dependencies" }, "skylab_upload_location": { "gs_bucket": "chromium-ci-skylab"
diff --git a/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json b/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json index 0fb6961..d4fe8be 100644 --- a/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json +++ b/infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/properties.json
@@ -31,7 +31,7 @@ "checkout_lacros_sdk", "chromeos" ], - "config": "chromium" + "config": "chromium_no_telemetry_dependencies" }, "skylab_upload_location": { "gs_bucket": "chromium-ci-skylab" @@ -49,6 +49,10 @@ ] } }, + "$build/flakiness": { + "check_for_flakiness": true, + "check_for_flakiness_with_resultdb": true + }, "$build/reclient": { "instance": "rbe-chromium-untrusted", "jobs": 150, @@ -63,5 +67,6 @@ ] }, "builder_group": "tryserver.chromium.chromiumos", + "cq": "required", "recipe": "chromium_trybot" } \ No newline at end of file
diff --git a/infra/config/generated/cq-builders.md b/infra/config/generated/cq-builders.md index a80ed63..e6359a7 100644 --- a/infra/config/generated/cq-builders.md +++ b/infra/config/generated/cq-builders.md
@@ -628,6 +628,9 @@ * [ios-simulator-siso](https://ci.chromium.org/p/chromium/builders/try/ios-simulator-siso) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""ios-simulator-siso"")) * Experiment percentage: 10.0 +* [lacros-amd64-generic-rel-skylab](https://ci.chromium.org/p/chromium/builders/try/lacros-amd64-generic-rel-skylab) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""lacros-amd64-generic-rel-skylab"")) + * Experiment percentage: 1.0 + * [linux-chromeos-siso-rel](https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel) ([definition](https://cs.chromium.org/search?q=+file:/try/.*\.star$+""linux-chromeos-siso-rel"")) * Experiment percentage: 10.0
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 24d71a7..1b8ec1c0 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -2920,7 +2920,24 @@ } builders { name: "chromium/try/lacros-amd64-generic-rel-skylab" - includable_only: true + experiment_percentage: 1 + 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 + } + location_filters { + gerrit_host_regexp: ".*" + gerrit_project_regexp: ".*" + path_regexp: "infra/config/generated/builders/try/lacros-amd64-generic-rel-skylab/.+" + } } builders { name: "chromium/try/lacros-arm-generic-rel"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 31ac3a9..bef6382 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -30224,6 +30224,192 @@ contact_team_email: "clank-engprod@google.com" } builders { + name: "android-cronet-riscv64-dbg" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "free_space:standard" + dimensions: "os:Ubuntu-22.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/android-cronet-riscv64-dbg/properties.json",' + ' "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-riscv64-dbg/shadow-properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.android.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + priority: 35 + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium_swarming.expose_merge_script_failures" + value: 100 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + shadow_builder_adjustments { + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + pool: "luci.chromium.try" + dimensions: "free_space:" + dimensions: "pool:luci.chromium.try" + } + contact_team_email: "cronet-sheriff@google.com" + } + builders { + name: "android-cronet-riscv64-rel" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "free_space:standard" + dimensions: "os:Ubuntu-22.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/android-cronet-riscv64-rel/properties.json",' + ' "shadow_properties_file": "infra/config/generated/builders/ci/android-cronet-riscv64-rel/shadow-properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.android.fyi",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + priority: 35 + execution_timeout_secs: 10800 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium_swarming.expose_merge_script_failures" + value: 100 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://chrome/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + shadow_builder_adjustments { + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + pool: "luci.chromium.try" + dimensions: "free_space:" + dimensions: "pool:luci.chromium.try" + } + contact_team_email: "cronet-sheriff@google.com" + } + builders { name: "android-cronet-x64-dbg" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -81012,6 +81198,7 @@ ' }' ' },' ' "builder_group": "tryserver.chromium.chromiumos",' + ' "cq": "required",' ' "led_builder_is_bootstrapped": true,' ' "recipe": "chromium_trybot"' '}'
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 8c8c9b9..6c54c95 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -5448,6 +5448,16 @@ category: "cronet|asan" } builders { + name: "buildbucket/luci.chromium.ci/android-cronet-riscv64-dbg" + category: "cronet|riscv64" + short_name: "dbg" + } + builders { + name: "buildbucket/luci.chromium.ci/android-cronet-riscv64-rel" + category: "cronet|riscv64" + short_name: "rel" + } + builders { name: "buildbucket/luci.chromium.ci/android-12l-x64-fyi-dbg" category: "emulator|x64|dbg" short_name: "12L"
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index a310318..e3c731f 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3567,6 +3567,24 @@ } } job { + id: "android-cronet-riscv64-dbg" + realm: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "android-cronet-riscv64-dbg" + } +} +job { + id: "android-cronet-riscv64-rel" + realm: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "android-cronet-riscv64-rel" + } +} +job { id: "android-cronet-x64-dbg" realm: "ci" buildbucket { @@ -6465,6 +6483,8 @@ triggers: "android-cronet-mainline-clang-x86-dbg" triggers: "android-cronet-mainline-clang-x86-rel" triggers: "android-cronet-marshmallow-arm64-perf-rel" + triggers: "android-cronet-riscv64-dbg" + triggers: "android-cronet-riscv64-rel" triggers: "android-cronet-x64-dbg" triggers: "android-cronet-x64-rel" triggers: "android-cronet-x86-dbg"
diff --git a/infra/config/generated/testing/test_suites.pyl b/infra/config/generated/testing/test_suites.pyl index 081ffe4..eb3e2e9 100644 --- a/infra/config/generated/testing/test_suites.pyl +++ b/infra/config/generated/testing/test_suites.pyl
@@ -6913,22 +6913,22 @@ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_mediapipe_validating_telemetry_tests': { + 'gpu_mediapipe_passthrough_telemetry_tests': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_validating_telemetry_tests': { + 'gpu_passthrough_telemetry_tests': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_webcodecs_validating_telemetry_test': { + 'gpu_webcodecs_telemetry_test': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_webgl_conformance_validating_telemetry_tests': { + 'gpu_webgl_conformance_gles_passthrough_telemetry_tests': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], @@ -6938,11 +6938,6 @@ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_webgl2_conformance_validating_telemetry_tests': { - 'variants': [ - 'CROS_JACUZZI_RELEASE_LKGM', - ], - }, }, 'gpu_fyi_lacros_device_release_telemetry_tests': {
diff --git a/infra/config/generated/testing/variants.pyl b/infra/config/generated/testing/variants.pyl index a83d262..66b89cb 100644 --- a/infra/config/generated/testing/variants.pyl +++ b/infra/config/generated/testing/variants.pyl
@@ -70,16 +70,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'identifier': 'Lacros version skew testing ash canary', - 'description': 'Run with ash-chrome version 119.0.6043.0', + 'description': 'Run with ash-chrome version 119.0.6044.0', 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome', ], 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v119.0.6043.0', - 'revision': 'version:119.0.6043.0', + 'location': 'lacros_version_skew_tests_v119.0.6044.0', + 'revision': 'version:119.0.6044.0', }, ], },
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star index 9cfc8e3..76157b3 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -392,3 +392,57 @@ category = "cronet|asan", ), ) + +ci.builder( + name = "android-cronet-riscv64-dbg", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.DEBUG, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), + console_view_entry = consoles.console_view_entry( + category = "cronet|riscv64", + short_name = "dbg", + ), + contact_team_email = "cronet-sheriff@google.com", +) + +ci.builder( + name = "android-cronet-riscv64-rel", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = ["android"], + ), + chromium_config = builder_config.chromium_config( + config = "android", + apply_configs = [ + "cronet_builder", + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config(config = "main_builder"), + build_gs_bucket = "chromium-android-archive", + ), + console_view_entry = consoles.console_view_entry( + category = "cronet|riscv64", + short_name = "rel", + ), + contact_team_email = "cronet-sheriff@google.com", +)
diff --git a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star index 31e20f87..437ce41 100644 --- a/infra/config/subprojects/chromium/ci/chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/ci/chromium.chromiumos.star
@@ -467,7 +467,7 @@ branch_selector = branches.selector.CROS_BRANCHES, builder_spec = builder_config.builder_spec( gclient_config = builder_config.gclient_config( - config = "chromium", + config = "chromium_no_telemetry_dependencies", apply_configs = [ "checkout_lacros_sdk", "chromeos",
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star index 084bbaef3..50cc8467 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.chromiumos.star
@@ -153,6 +153,9 @@ mirrors = [ "ci/lacros-amd64-generic-rel-skylab", ], + tryjob = try_.job( + experiment_percentage = 1, + ), ) try_.builder(
diff --git a/infra/config/targets/lacros-version-skew-variants.json b/infra/config/targets/lacros-version-skew-variants.json index fd4ca76..8e75d6a 100644 --- a/infra/config/targets/lacros-version-skew-variants.json +++ b/infra/config/targets/lacros-version-skew-variants.json
@@ -1,16 +1,16 @@ { "LACROS_VERSION_SKEW_CANARY": { "args": [ - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "identifier": "Lacros version skew testing ash canary", "swarming": { "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ] }
diff --git a/infra/config/targets/matrix_compound_suites.star b/infra/config/targets/matrix_compound_suites.star index 2732cb5..999247da 100644 --- a/infra/config/targets/matrix_compound_suites.star +++ b/infra/config/targets/matrix_compound_suites.star
@@ -273,22 +273,22 @@ "CROS_JACUZZI_RELEASE_LKGM", ], ), - "gpu_mediapipe_validating_telemetry_tests": targets.legacy_matrix_config( + "gpu_mediapipe_passthrough_telemetry_tests": targets.legacy_matrix_config( variants = [ "CROS_JACUZZI_RELEASE_LKGM", ], ), - "gpu_validating_telemetry_tests": targets.legacy_matrix_config( + "gpu_passthrough_telemetry_tests": targets.legacy_matrix_config( variants = [ "CROS_JACUZZI_RELEASE_LKGM", ], ), - "gpu_webcodecs_validating_telemetry_test": targets.legacy_matrix_config( + "gpu_webcodecs_telemetry_test": targets.legacy_matrix_config( variants = [ "CROS_JACUZZI_RELEASE_LKGM", ], ), - "gpu_webgl_conformance_validating_telemetry_tests": targets.legacy_matrix_config( + "gpu_webgl_conformance_gles_passthrough_telemetry_tests": targets.legacy_matrix_config( variants = [ "CROS_JACUZZI_RELEASE_LKGM", ], @@ -298,11 +298,6 @@ "CROS_JACUZZI_RELEASE_LKGM", ], ), - "gpu_webgl2_conformance_validating_telemetry_tests": targets.legacy_matrix_config( - variants = [ - "CROS_JACUZZI_RELEASE_LKGM", - ], - ), }, )
diff --git a/internal b/internal index 1e6025a..b4e35d03 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit 1e6025a7fe2856d4c9400937c1210736f71428d9 +Subproject commit b4e35d03eabbf984521b008315144df3c1b6e22c
diff --git a/ios/chrome/app/strings/ios_chromium_strings.grd b/ios/chrome/app/strings/ios_chromium_strings.grd index 687ac3f..0bb67eb 100644 --- a/ios/chrome/app/strings/ios_chromium_strings.grd +++ b/ios/chrome/app/strings/ios_chromium_strings.grd
@@ -443,6 +443,9 @@ =1 {Chromium will help track this package on the New Tab Page.} other {Chromium will help track these packages on the New Tab Page.}} </message> + <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE" desc="Text for the subtitle string of the Parcel Tracking 'Package Already Tracked' infobar."> + This package has already been tracked on Chromium. + </message> <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_DESCRIPTION" desc="Description for the alert dialog warning the user they are about to hide the parcel tracking module."> If you hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>", Chromium will no longer auto-track your future packages and will delete all your past package tracking data. </message>
diff --git a/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE.png.sha1 new file mode 100644 index 0000000..ea1a4bb5 --- /dev/null +++ b/ios/chrome/app/strings/ios_chromium_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +9f10a14cfc128cd8000226df7dc174bf63f26d83 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings.grd b/ios/chrome/app/strings/ios_google_chrome_strings.grd index c0b877b6..7da9183 100644 --- a/ios/chrome/app/strings/ios_google_chrome_strings.grd +++ b/ios/chrome/app/strings/ios_google_chrome_strings.grd
@@ -443,6 +443,9 @@ =1 {Chrome will help track this package on the New Tab Page.} other {Chrome will help track these packages on the New Tab Page.}} </message> + <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE" desc="Text for the subtitle string of the Parcel Tracking 'Package Already Tracked' infobar."> + This package has already been tracked on Chrome. + </message> <message name="IDS_IOS_PARCEL_TRACKING_MODULE_HIDE_ALERT_DESCRIPTION" desc="Description for the alert dialog warning the user they are about to hide the parcel tracking module."> If you hide "<ph name="Module_Name"><ex>Package Tracking</ex>$1</ph>", Chrome will no longer auto-track your future packages and will delete all your past package tracking data. </message>
diff --git a/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE.png.sha1 new file mode 100644 index 0000000..ea1a4bb5 --- /dev/null +++ b/ios/chrome/app/strings/ios_google_chrome_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +9f10a14cfc128cd8000226df7dc174bf63f26d83 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 789edad..9de885e 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -638,8 +638,8 @@ </message> <message name="IDS_IOS_BULK_UPLOAD_BOOKMARK_TITLE" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This switch label explains how many bookmarks are saved locally."> {count, plural, - =1 {{count} Bookmark} - other {{count} Bookmarks}} + =1 {{count} bookmark} + other {{count} bookmarks}} </message> <message name="IDS_IOS_BULK_UPLOAD_BUTTON_TITLE" desc="The text is the primary button in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome."> Save in Account @@ -659,8 +659,8 @@ </message> <message name="IDS_IOS_BULK_UPLOAD_PASSWORD_TITLE" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This switch label explains how many passwords are saved locally."> {count, plural, - =1 {{count} Password} - other {{count} Passwords}} + =1 {{count} password} + other {{count} passwords}} </message> <message name="IDS_IOS_BULK_UPLOAD_ON_THIS_DEVICE_SETTINGS_HEADER" desc="The text appears as a note in a confirmation dialog where the user can choose to save some data to their Google Account. When data is saved to the Google Account, it's backed up safely and is available on any device where they're signed in to Chrome. This note explains where the user can go to view and manage individual items. like individual bookmarks or passwords."> You can also view and manage these items in your bookmarks, Reading List, or password manager. @@ -992,7 +992,7 @@ Switch in Settings… </message> <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT" desc="Text of button that will take users to iOS settings, where they can change the default browser. Used in the video default browser promo [iOS only]"> - Open Settings + Go to Settings… </message> <message name="IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_STEP_1" desc="Text of the row indicating the first step of the instruction to set Chrome as default browser [iOS only]"> Open "Settings." @@ -2178,6 +2178,9 @@ <message name="IDS_IOS_OPTIONS_TAB_PICKUP_SCREEN_FOOTER" desc="Footer for the screen setting displaying tab suggestion settings."> Gives you tab suggestions based on your browsing activity on your other devices using your Google Account. Your devices must be signed in and synced using the same Google Account. </message> + <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING" desc="Text for the button that allows the user to enable parcel tracking."> + Enable Tracking + </message> <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_ASK_TO_TRACK_TITLE" desc="Text for the title string of the infobar that is displayed to prompt user to track a package."> {COUNT, plural, =1 {Track This Package?} @@ -2188,6 +2191,9 @@ =1 {New Package Tracked} other {New Packages Tracked}} </message> + <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_TITLE" desc="Text for the title string of the infobar that is displayed when a package is already being tracked."> + Package Already Tracked + </message> <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_TRACK_BUTTON" desc="Text for the button on the Parcel Tracking infobars that tracks a package."> Track </message> @@ -2200,8 +2206,24 @@ <message name="IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_UNTRACKED_SUBTITLE" desc="Text for the subtitle string of the infobar that is displayed after a package is untracked."> This package has been successfully untracked. </message> - <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_ENABLE_TRACKING" desc="Text for the button that allows the user to enable parcel tracking."> - Enable Tracking + <message name="IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_DELIVERED_BY" desc="Text that prefaces a parcel carrier in the parcel tracking infobar modal."> + Delivered by + </message> + <message name="IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_LABEL" desc="Text that prefaces a tracking number in the parcel tracking infobar modal when there are multiple packages displayed."> + Package + </message> + <message name="IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_NUMBER" desc="Text that prefaces a tracking number in the parcel tracking infobar modal when there is only one package displayed."> + Package Number + </message> + <message name="IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_TRACK_BUTTON" desc="Text for the button in the parcel tracking infobar modal that tracks the package(s)."> + {COUNT, plural, + =1 {Track this package} + other {Track all packages}} + </message> + <message name="IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_UNTRACK_BUTTON" desc="Text for the button in the parcel tracking infobar modal that untracks the package(s)."> + {COUNT, plural, + =1 {Untrack this package} + other {Untrack all packages}} </message> <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_PRIMARY_ACTION" desc="Text for the primary action string of the parcel tracking opt-in half-sheet screen."> Always Track Detected Packages @@ -2212,6 +2234,9 @@ <message name="IDS_IOS_PARCEL_TRACKING_OPT_IN_TERTIARY_ACTION" desc="Text for the tertiary action string of the parcel tracking opt-in half-sheet screen."> Ask me Every Time </message> + <message name="IDS_IOS_PARCEL_TRACKING_REPORT_AN_ISSUE" desc="Title for the option on the parcel tracking infobar to report an issue"> + Report an issue + </message> <message name="IDS_IOS_PARTIAL_TRANSLATE_ACTION_TRANSLATE_FULL_PAGE" desc="The action button to translate the full page (Title Case)."> Translate Full Page </message> @@ -3144,6 +3169,15 @@ <message name="IDS_IOS_PASSWORD_SHARING_STATUS_PROGRESS_TITLE" desc="Title text on the sharing status view when it is in progress. [iOS only]"> Sharing Password </message> + <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE" desc="Footnote text on the sharing status view when it succeeds describing how to revoke access to the shared password. [iOS only]"> + To stop others from using your password, <ph name="BEGIN_LINK">BEGIN_LINK</ph>change it on <ph name="WEBSITE">$1<ex>amazon.com</ex></ph><ph name="END_LINK">END_LINK</ph> + </message> + <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE" desc="Subtitle text on the sharing status view when it succeeds describing that the recipient can now use the shared password. [iOS only]"> + <ph name="USERNAME">$1<ex>johndoe</ex></ph> can now use your username and password when they use Google Password Manager to sign in to <ph name="WEBSITE">$2<ex>amazon.com</ex></ph>. <ph name="BEGIN_LINK">BEGIN_LINK</ph>Learn more<ph name="END_LINK">END_LINK</ph> + </message> + <message name="IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE" desc="Title text on the sharing status view when it succeeded. [iOS only]"> + Password Shared + </message> <message name="IDS_IOS_PASSWORD_SHARING_TITLE" desc="Title of the password sharing bottom sheet view. [iOS only]"> Share Password </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_BOOKMARK_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_BOOKMARK_TITLE.png.sha1 index 7d020bb..f5fb163e 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_BOOKMARK_TITLE.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_BOOKMARK_TITLE.png.sha1
@@ -1 +1 @@ -a6f1ffeb37f6dc2cec47e648798ecef69eb61223 \ No newline at end of file +26e9514057dee6b67dd362ccc3b0e59a7e5e3a34 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_PASSWORD_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_PASSWORD_TITLE.png.sha1 index 3ffefd49..883c8e0 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_PASSWORD_TITLE.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_BULK_UPLOAD_PASSWORD_TITLE.png.sha1
@@ -1 +1 @@ -6d8be23e50fd80bdb0e88eab8e8e84b759ef9b8c \ No newline at end of file +6e3a8c949e7418c76fdc92771c4e821ac29bf7a3 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT.png.sha1 index af8c644..73650fd 100644 --- a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT.png.sha1 +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT.png.sha1
@@ -1 +1 @@ -767d0505b8d9c3e8054176a8b547fc96d9506ddc \ No newline at end of file +d2175a8e12c41c57fb93cfc098721b9c134c0255 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_TITLE.png.sha1 new file mode 100644 index 0000000..ea1a4bb5 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_INFOBAR_PACKAGE_ALREADY_TRACKED_TITLE.png.sha1
@@ -0,0 +1 @@ +9f10a14cfc128cd8000226df7dc174bf63f26d83 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_DELIVERED_BY.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_DELIVERED_BY.png.sha1 new file mode 100644 index 0000000..4741b83 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_DELIVERED_BY.png.sha1
@@ -0,0 +1 @@ +074bc5d1872a1f5476b59a524ed0c5f228927aa8 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_LABEL.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_LABEL.png.sha1 new file mode 100644 index 0000000..3f1e165 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_LABEL.png.sha1
@@ -0,0 +1 @@ +33a344cf246add9749a1f740e38205babe92cfa5 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_NUMBER.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_NUMBER.png.sha1 new file mode 100644 index 0000000..4741b83 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_NUMBER.png.sha1
@@ -0,0 +1 @@ +074bc5d1872a1f5476b59a524ed0c5f228927aa8 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_TRACK_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_TRACK_BUTTON.png.sha1 new file mode 100644 index 0000000..4741b83 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_TRACK_BUTTON.png.sha1
@@ -0,0 +1 @@ +074bc5d1872a1f5476b59a524ed0c5f228927aa8 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_UNTRACK_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_UNTRACK_BUTTON.png.sha1 new file mode 100644 index 0000000..3f1e165 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_UNTRACK_BUTTON.png.sha1
@@ -0,0 +1 @@ +33a344cf246add9749a1f740e38205babe92cfa5 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_REPORT_AN_ISSUE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_REPORT_AN_ISSUE.png.sha1 new file mode 100644 index 0000000..4741b83 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PARCEL_TRACKING_REPORT_AN_ISSUE.png.sha1
@@ -0,0 +1 @@ +074bc5d1872a1f5476b59a524ed0c5f228927aa8 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE.png.sha1 new file mode 100644 index 0000000..289f8e3 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE.png.sha1
@@ -0,0 +1 @@ +e704378e5516120448f6a9c00eca22b0a64784e2 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE.png.sha1 new file mode 100644 index 0000000..289f8e3 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +e704378e5516120448f6a9c00eca22b0a64784e2 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE.png.sha1 new file mode 100644 index 0000000..289f8e3 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE.png.sha1
@@ -0,0 +1 @@ +e704378e5516120448f6a9c00eca22b0a64784e2 \ No newline at end of file
diff --git a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb index 38820b08..f8057c9 100644 --- a/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_chromium_strings_hi.xtb
@@ -51,7 +51,6 @@ <translation id="2915596697727466327">आपके पासवर्ड का अधिकृत ऐक्सेस पक्का करने के लिए, क्रोमियम 'फ़ेस आईडी' यानी चेहरा पहचान का इस्तेमाल करता है.</translation> <translation id="2918709798697875261">आपके संगठन के लिए यह ज़रूरी है कि आप Chromium से साइन आउट रहें.</translation> <translation id="2942241131342758843">लिंक खोलने, विजेट से खोजने, और अन्य ऐप्लिकेशन में पासवर्ड ऑटोमैटिक भरने के लिए, Chromium को डिफ़ॉल्ट रूप से इस्तेमाल करें</translation> -<translation id="2945410638638762679">"<ph name="MODULE_NAME" />" को छिपाने पर, Chromium आपके आने वाले पैकेज को ऑटोमैटिक तरीके से ट्रैक नहीं करेगा.</translation> <translation id="2977470724722393594">क्रोमियम अप टू डेट है</translation> <translation id="3102849287235003384">सभी वेबसाइटों पर, अपने Google खाते से साइन आउट करने के लिए, <ph name="BEGIN_LINK" />Chromium से साइन आउट करें<ph name="END_LINK" />.</translation> <translation id="3219277919172823720">Chromium में बोलकर खोजें</translation>
diff --git a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb index 20c8983c..7556a04 100644 --- a/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_google_chrome_strings_hi.xtb
@@ -198,7 +198,6 @@ <translation id="8414886616817913619">आपके संगठन के मुताबिक, यह ज़रूरी है कि Chrome का इस्तेमाल करने के लिए आप साइन इन करें. <ph name="BEGIN_LINK" />ज़्यादा जानें<ph name="END_LINK" /></translation> <translation id="84594714173170813">अपने Google खाते में, Chrome के डेटा का इस्तेमाल जारी रखें</translation> <translation id="8459495907675268833">चयनित डेटा Chrome और समन्वयित डिवाइस से निकाल दिया गया है. हो सकता है कि आपके Google खाते में अन्य प्रकार के ब्राउज़िंग इतिहास जैसे खोज और history.google.com पर अन्य Google सेवाओं की गतिविधि हो.</translation> -<translation id="8473652833918591870">"<ph name="MODULE_NAME" />" को छिपाने पर, Chrome आपके आने वाले पैकेज ऑटोमैटिक तरीके से ट्रैक नहीं करेगा.</translation> <translation id="850555388806794946">Chrome को डिफ़ॉल्ट ब्राउज़र के तौर पर सेट करने के लिए: 1. Settings खोलें 2. डिफ़ॉल्ट ब्राउज़र ऐप्लिकेशन पर टैप करें
diff --git a/ios/chrome/app/strings/resources/ios_strings_af.xtb b/ios/chrome/app/strings/resources/ios_strings_af.xtb index c4c48c0..5efdace95 100644 --- a/ios/chrome/app/strings/resources/ios_strings_af.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_af.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Jy het {count} waarskuwing toegemaak}other{Jy het {count} waarskuwings toegemaak}}</translation> <translation id="8558480467877843976">Jy kan Chrome nou enige tyd gebruik wanneer jy blaai of op skakels in boodskappe, dokumente en ander programme tik.</translation> <translation id="8560253818350321773">Wys gereeld gebruikte items eerste.</translation> -<translation id="8580411965900177618">Nee, dankie</translation> <translation id="8588404856427128947">Af</translation> <translation id="8591976964826315682">Blokkeer derdepartywebkoekies in incognito</translation> <translation id="8605219856220328675">Maak oortjie toe.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_am.xtb b/ios/chrome/app/strings/resources/ios_strings_am.xtb index e6c761d5..07ac7f0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_am.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_am.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} ማስጠንቀቂያ አሰናብተዋል}one{{count} ማስጠንቀቂያ አሰናብተዋል}other{{count} ማስጠንቀቂያዎች አሰናብተዋል}}</translation> <translation id="8558480467877843976">አሁን በሚያስሱበት ወይም በመልዕክቶች ውስጥ አገናኞችን መታ በሚያደርጉበት በማንኛውም ጊዜ Chromeን እና ሌሎች መተግበሪያዎችን መጠቀም ይችላሉ።</translation> <translation id="8560253818350321773">መጀመሪያ ጥቅም ላይ የዋሉ ንጥሎችን ያሳያል።</translation> -<translation id="8580411965900177618">አይ አመሰግናለሁ</translation> <translation id="8588404856427128947">ጠፍቷል</translation> <translation id="8591976964826315682">ማንነትን በማያሳውቅ ሁነታ ላይ የሦስተኛ ወገን ኩኪዎችን ያግዱ</translation> <translation id="8605219856220328675">ትር ዝጋ።</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ar.xtb b/ios/chrome/app/strings/resources/ios_strings_ar.xtb index fc4d044..1dc313d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ar.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ar.xtb
@@ -1384,7 +1384,6 @@ <translation id="8556590991644167667">{count,plural, =1{أغلقت تحذيرًا واحدًا ({count}).}zero{أغلقت {count} تحذير.}two{أغلقت تحذيرَين ({count}).}few{أغلقت {count} تحذيرات.}many{أغلقت {count} تحذيرًا.}other{أغلقت {count} تحذير.}}</translation> <translation id="8558480467877843976">يمكنك الآن استخدام Chrome في أي وقت تتصفَّح فيه أو تنقر فيه على الروابط في الرسائل والمستندات والتطبيقات الأخرى.</translation> <translation id="8560253818350321773">عرض العناصر الأكثر استخدامًا أولاً</translation> -<translation id="8580411965900177618">لا، شكرًا</translation> <translation id="8588404856427128947">غير مفعَّل</translation> <translation id="8591976964826315682">حظر ملفات تعريف الارتباط التابعة لجهات خارجية في وضع التصفُّح المتخفي</translation> <translation id="8605219856220328675">إغلاق علامة التبويب.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_as.xtb b/ios/chrome/app/strings/resources/ios_strings_as.xtb index dd40626..6be62b4 100644 --- a/ios/chrome/app/strings/resources/ios_strings_as.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_as.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{আপুনি {count} টা সকীয়নি অগ্ৰাহ্য কৰিছে}one{আপুনি {count} টা সকীয়নি অগ্ৰাহ্য কৰিছে}other{আপুনি {count} টা সকীয়নি অগ্ৰাহ্য কৰিছে}}</translation> <translation id="8558480467877843976">এতিয়া আপুনি বাৰ্তা, নথি আৰু অন্য এপ্সমূহত থকা কোনো লিংক ব্ৰাউজ কৰিলে অথবা টিপিলে যিকোনো সময়তে Chrome ব্যৱহাৰ কৰিব পাৰে।</translation> <translation id="8560253818350321773">প্ৰথমে সঘনাই ব্যৱহৃত বস্তুবোৰ দেখুৱাওক।</translation> -<translation id="8580411965900177618">নালাগে, ধন্যবাদ</translation> <translation id="8588404856427128947">অফ আছে</translation> <translation id="8591976964826315682">ইনক’গনিট’ত তৃতীয় পক্ষৰ কুকিসমূহ অৱৰোধ কৰক</translation> <translation id="8605219856220328675">টেব বন্ধ কৰক।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_az.xtb b/ios/chrome/app/strings/resources/ios_strings_az.xtb index fecc36d..cfca7085 100644 --- a/ios/chrome/app/strings/resources/ios_strings_az.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_az.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} xəbərdarlıqdan imtina etdiniz}other{{count} xəbərdarlıqdan imtina etdiniz}}</translation> <translation id="8558480467877843976">İndi istənilən vaxt axtarış edərkən və ya mesajlar, sənədlər və digər tətbiqlərdə keçidlərə toxunduqda Chrome'u istifadə edə bilərsiniz.</translation> <translation id="8560253818350321773">Əvvəlcə çox istifadə edilənləri göstərin.</translation> -<translation id="8580411965900177618">Xeyr, təşəkkürlər</translation> <translation id="8588404856427128947">Deaktiv</translation> <translation id="8591976964826315682">Anonim rejimdə üçüncü tərəf kukilərini bloklayın</translation> <translation id="8605219856220328675">Paneli qapadı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 39e0456..62ef9e7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_be.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_be.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Вы адхілілі {count} папярэджанне}one{Вы адхілілі {count} папярэджанне}few{Вы адхілілі {count} папярэджанні}many{Вы адхілілі {count} папярэджанняў}other{Вы адхілілі {count} папярэджання}}</translation> <translation id="8558480467877843976">Цяпер вы можаце выкарыстоўваць Chrome кожны раз, калі вам трэба выйсці ў інтэрнэт або адкрыць спасылку ў паведамленнях, дакументах або іншых праграмах.</translation> <translation id="8560253818350321773">Спачатку паказваць элементы, якія часта выкарыстоўваюцца.</translation> -<translation id="8580411965900177618">Не, дзякуй</translation> <translation id="8588404856427128947">Выключаны</translation> <translation id="8591976964826315682">Блакіраваць староннія файлы cookie у рэжыме інкогніта</translation> <translation id="8605219856220328675">Закрыць укладку.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bg.xtb b/ios/chrome/app/strings/resources/ios_strings_bg.xtb index 0ce1196..0187aaf8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bg.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bg.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Отхвърлихте {count} предупреждение}other{Отхвърлихте {count} предупреждения}}</translation> <translation id="8558480467877843976">Вече можете да използвате Chrome всеки път, когато преглеждате съобщения, документи и други приложения или докоснете връзки в тях.</translation> <translation id="8560253818350321773">Първо да се показват често използваните елементи.</translation> -<translation id="8580411965900177618">Не, благодаря</translation> <translation id="8588404856427128947">Изключено</translation> <translation id="8591976964826315682">Блокиране на „бисквитките“ на трети страни в режим „инкогнито“</translation> <translation id="8605219856220328675">Затваряне на раздела.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bn.xtb b/ios/chrome/app/strings/resources/ios_strings_bn.xtb index 5d2f4d8..6ec761c5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bn.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{আপনি {count}টি সতর্কতা বাতিল করেছেন}one{আপনি {count}টি সতর্কতা বাতিল করেছেন}other{আপনি {count}টি সতর্কতা বাতিল করেছেন}}</translation> <translation id="8558480467877843976">এখন থেকে আপনি চাইলে মেসেজ, ডকুমেন্ট এবং অন্যান্য অ্যাপে থাকা লিঙ্ক ব্রাউজ বা ট্যাপ করে তা যেকোনও সময় Chrome খুলতে পারেন।</translation> <translation id="8560253818350321773">প্রায়শই ব্যবহার করা আইটেমগুলিকে আগে দেখায়।</translation> -<translation id="8580411965900177618">না, থাক</translation> <translation id="8588404856427128947">বন্ধ করা আছে</translation> <translation id="8591976964826315682">'ছদ্মবেশী' মোডে থার্ড-পার্টি কুকি ব্লক করুন</translation> <translation id="8605219856220328675">ট্যাব বন্ধ করুন।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_bs.xtb b/ios/chrome/app/strings/resources/ios_strings_bs.xtb index fc7f8d66..0c1478d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_bs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_bs.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Odbacili ste {count} upozorenje}one{Odbacili ste {count} upozorenje}few{Odbacili ste {count} upozorenja}other{Odbacili ste {count} upozorenja}}</translation> <translation id="8558480467877843976">Sada možete koristiti Chrome svaki put kada pregledate ili dodirnete linkove u porukama, dokumentima i drugim aplikacijama.</translation> <translation id="8560253818350321773">Prvo prikažite često korištene stavke.</translation> -<translation id="8580411965900177618">Ne, hvala</translation> <translation id="8588404856427128947">Isključeno</translation> <translation id="8591976964826315682">Blokiraj kolačiće trećih strana u anonimnom načinu rada</translation> <translation id="8605219856220328675">Zatvaranje kartice.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ca.xtb b/ios/chrome/app/strings/resources/ios_strings_ca.xtb index be80eee..5c7702c 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ca.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ca.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Has ignorat {count} advertiment}other{Has ignorat {count} advertiments}}</translation> <translation id="8558480467877843976">Ara pots utilitzar Chrome cada vegada que naveguis o toquis enllaços en missatges, documents i altres aplicacions.</translation> <translation id="8560253818350321773">Mostra primer els elements que s'utilitzen més sovint.</translation> -<translation id="8580411965900177618">No, gràcies</translation> <translation id="8588404856427128947">Desactivada</translation> <translation id="8591976964826315682">Bloqueja les galetes de tercers en mode d'incògnit</translation> <translation id="8605219856220328675">Tanca la pestanya.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cs.xtb b/ios/chrome/app/strings/resources/ios_strings_cs.xtb index 91cc3d8..ec87f2a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cs.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cs.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Zamítli jste {count} upozornění}few{Zamítli jste {count} upozornění}many{Zamítli jste {count} upozornění}other{Zamítli jste {count} upozornění}}</translation> <translation id="8558480467877843976">Nyní můžete Chrome použít při každém procházení a pokaždé, když klepnete na odkazy ve zprávách, dokumentech a jiných aplikacích.</translation> <translation id="8560253818350321773">Nejdříve zobrazte často používané položky.</translation> -<translation id="8580411965900177618">Ne, díky</translation> <translation id="8588404856427128947">Vypnuto</translation> <translation id="8591976964826315682">V anonymním režimu blokovat soubory cookie třetích stran</translation> <translation id="8605219856220328675">Zavřít kartu</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_cy.xtb b/ios/chrome/app/strings/resources/ios_strings_cy.xtb index cd4926e..ef9d8c8 100644 --- a/ios/chrome/app/strings/resources/ios_strings_cy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_cy.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Rydych wedi diystyru {count} rhybudd}zero{Rydych wedi diystyru {count} rhybudd}two{Rydych wedi diystyru {count} rybudd}few{Rydych wedi diystyru {count} rhybudd}many{Rydych wedi diystyru {count} rhybudd}other{Rydych wedi diystyru {count} rhybudd}}</translation> <translation id="8558480467877843976">Gallwch bellach ddefnyddio Chrome unrhyw bryd y byddwch yn pori neu'n tapio dolenni mewn negeseuon, dogfennau ac apiau eraill.</translation> <translation id="8560253818350321773">Dangos eitemau a ddefnyddir yn aml yn gyntaf.</translation> -<translation id="8580411965900177618">Dim Diolch</translation> <translation id="8588404856427128947">Diffodd</translation> <translation id="8591976964826315682">Rhwystro Cwcis Trydydd Parti yn y Modd Anhysbys</translation> <translation id="8605219856220328675">Cau'r tab.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_da.xtb b/ios/chrome/app/strings/resources/ios_strings_da.xtb index d4763b3..520d8e7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_da.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_da.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Du har afvist {count} advarsel}one{Du har afvist {count} advarsel}other{Du har afvist {count} advarsler}}</translation> <translation id="8558480467877843976">Du kan nu bruge Chrome, hver gang du browser eller trykker på links i meddelelser, dokumenter og andre apps.</translation> <translation id="8560253818350321773">Vis ofte benyttede elementer først.</translation> -<translation id="8580411965900177618">Nej tak</translation> <translation id="8588404856427128947">Fra</translation> <translation id="8591976964826315682">Bloker tredjepartscookies i inkognito</translation> <translation id="8605219856220328675">Luk fane.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_de.xtb b/ios/chrome/app/strings/resources/ios_strings_de.xtb index a312e4b8..0c2477f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_de.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_de.xtb
@@ -1371,7 +1371,6 @@ <translation id="8556590991644167667">{count,plural, =1{Du hast {count} Warnung geschlossen}other{Du hast {count} Warnungen geschlossen}}</translation> <translation id="8558480467877843976">Du kannst jetzt Chrome jederzeit nutzen, wenn du surfst oder auf Links in Nachrichten, Dokumenten und anderen Apps tippst.</translation> <translation id="8560253818350321773">Zeigt häufig verwendete Elemente zuerst an.</translation> -<translation id="8580411965900177618">Nein danke</translation> <translation id="8588404856427128947">Aus</translation> <translation id="8591976964826315682">Drittanbieter-Cookies im Inkognitomodus blockieren</translation> <translation id="8605219856220328675">Tab schließen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_el.xtb b/ios/chrome/app/strings/resources/ios_strings_el.xtb index 6ef0fd1..8ca09756 100644 --- a/ios/chrome/app/strings/resources/ios_strings_el.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_el.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Παραβλέψατε {count} προειδοποίηση}other{Παραβλέψατε {count} προειδοποιήσεις}}</translation> <translation id="8558480467877843976">Μπορείτε πλέον να χρησιμοποιείτε το Chrome κάθε φορά που περιηγείστε ή πατάτε συνδέσμους σε μηνύματα, έγγραφα και άλλες εφαρμογές.</translation> <translation id="8560253818350321773">Να εμφανίζονται πρώτα τα στοιχεία που χρησιμοποιούνται συχνά.</translation> -<translation id="8580411965900177618">Όχι, ευχαριστώ</translation> <translation id="8588404856427128947">Ανενεργό</translation> <translation id="8591976964826315682">Αποκλεισμός cookie τρίτου μέρους στην ανώνυμη περιήγηση</translation> <translation id="8605219856220328675">Κλείσιμο καρτέλας.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb index 2f1ebdd..16da218 100644 --- a/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_en-GB.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{You dismissed {count} warning}other{You dismissed {count} warnings}}</translation> <translation id="8558480467877843976">You can now use Chrome any time that you browse or tap links in messages, documents and other apps.</translation> <translation id="8560253818350321773">Show frequently used items first.</translation> -<translation id="8580411965900177618">No, thanks</translation> <translation id="8588404856427128947">Off</translation> <translation id="8591976964826315682">Block third-party cookies in Incognito</translation> <translation id="8605219856220328675">Close tab.</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 49a8642f..bd81e52 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es-419.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es-419.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Descartaste {count} advertencia}other{Descartaste {count} advertencias}}</translation> <translation id="8558480467877843976">Ahora puedes usar Chrome cada vez que navegas o presionas vínculos que aparecen en mensajes, documentos y otras apps.</translation> <translation id="8560253818350321773">Muestra primero los elementos que se usan con frecuencia.</translation> -<translation id="8580411965900177618">No, gracias</translation> <translation id="8588404856427128947">Apagada</translation> <translation id="8591976964826315682">Bloquear cookies de terceros en modo Incógnito</translation> <translation id="8605219856220328675">Cierra la pestaña.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_es.xtb b/ios/chrome/app/strings/resources/ios_strings_es.xtb index 204e07f..1ef6149 100644 --- a/ios/chrome/app/strings/resources/ios_strings_es.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_es.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Has cerrado {count} advertencia}other{Has cerrado {count} advertencias}}</translation> <translation id="8558480467877843976">Ahora puedes usar Chrome cada vez que navegues o toques enlaces de mensajes, documentos y otras aplicaciones.</translation> <translation id="8560253818350321773">Muestra primero los artículos utilizados con más frecuencia.</translation> -<translation id="8580411965900177618">No, gracias</translation> <translation id="8588404856427128947">Desactivada</translation> <translation id="8591976964826315682">Bloquear cookies de terceros en incógnito</translation> <translation id="8605219856220328675">Cerrar pestaña.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_et.xtb b/ios/chrome/app/strings/resources/ios_strings_et.xtb index e7d34b69..b090e27 100644 --- a/ios/chrome/app/strings/resources/ios_strings_et.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_et.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Loobusite {count} hoiatusest}other{Loobusite {count} hoiatusest}}</translation> <translation id="8558480467877843976">Nüüd saate kasutada Chrome'i iga kord, kui sirvite või puudutate linke sõnumites, dokumentides ja muudes rakendustes.</translation> <translation id="8560253818350321773">Sageli kasutatavad üksused kuvatakse eespool.</translation> -<translation id="8580411965900177618">Tänan, ei</translation> <translation id="8588404856427128947">Väljas</translation> <translation id="8591976964826315682">Blokeeri kolmanda osapoole küpsisefailid inkognito režiimis</translation> <translation id="8605219856220328675">Sule vaheleht.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_eu.xtb b/ios/chrome/app/strings/resources/ios_strings_eu.xtb index 57a6cd7..fc371df 100644 --- a/ios/chrome/app/strings/resources/ios_strings_eu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_eu.xtb
@@ -1378,7 +1378,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} abisu baztertu duzu}other{{count} abisu baztertu dituzu}}</translation> <translation id="8558480467877843976">Orain, Chrome erabili ahalko duzu arakatzen duzunean, edo mezuetako, dokumentuetako eta aplikazioetako estekak sakatzen dituzunean.</translation> <translation id="8560253818350321773">Erakutsi maiz erabiltzen diren elementuak lehenik.</translation> -<translation id="8580411965900177618">Ez, eskerrik asko</translation> <translation id="8588404856427128947">Itzalita</translation> <translation id="8591976964826315682">Blokeatu hirugarrenen cookieak ezkutuko moduan</translation> <translation id="8605219856220328675">Itxi fitxa.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fa.xtb b/ios/chrome/app/strings/resources/ios_strings_fa.xtb index d54f70d..83a6be22 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fa.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} هشدار را رد کردید}one{{count} هشدار را رد کردید}other{{count} هشدار را رد کردید}}</translation> <translation id="8558480467877843976">اکنون هرزمان بخواهید میتوانید با مرور کردن یا ضربه زدن روی پیوندهای موجود در پیامها، اسناد، و دیگر برنامهها، از Chrome استفاده کنید.</translation> <translation id="8560253818350321773">موارد پراستفاده در ابتدا نشان داده میشود.</translation> -<translation id="8580411965900177618">نه متشکرم</translation> <translation id="8588404856427128947">خاموش</translation> <translation id="8591976964826315682">مسدود کردن کوکیهای شخص ثالث در «حالت ناشناس»</translation> <translation id="8605219856220328675">بستن برگه</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fi.xtb b/ios/chrome/app/strings/resources/ios_strings_fi.xtb index 940ceae..5eb7d3d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fi.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Olet hylännyt {count} varoituksen}other{Olet hylännyt {count} varoitusta}}</translation> <translation id="8558480467877843976">Voit nyt käyttää Chromea aina selatessasi ja kun napautat linkkejä viesteissä, dokumenteissa tai muissa sovelluksissa.</translation> <translation id="8560253818350321773">Näytä usein käytetyt kohdat.</translation> -<translation id="8580411965900177618">Ei kiitos</translation> <translation id="8588404856427128947">Pois päältä</translation> <translation id="8591976964826315682">Estä kolmannen osapuolen evästeet incognito-tilassa</translation> <translation id="8605219856220328675">Sulje välilehti.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fil.xtb b/ios/chrome/app/strings/resources/ios_strings_fil.xtb index 52676b56..93ed0ba0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fil.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fil.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Nag-dismiss ka ng {count} babala}one{Nag-dismiss ka ng {count} babala}other{Nag-dismiss ka ng {count} na babala}}</translation> <translation id="8558480467877843976">Magagamit mo na ngayon ang Chrome sa tuwing magbo-browse o magta-tap ka ng mga link sa mga mensahe, dokumento, at iba pang app.</translation> <translation id="8560253818350321773">Unang ipakita ang mga item na madalas gamitin.</translation> -<translation id="8580411965900177618">Hindi, Salamat na Lang</translation> <translation id="8588404856427128947">Naka-off</translation> <translation id="8591976964826315682">I-block ang Third-Party na Cookies sa Incognito</translation> <translation id="8605219856220328675">Isara ang tab.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb index f5d58d51..07036fd 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr-CA.xtb
@@ -1376,7 +1376,6 @@ <translation id="8556590991644167667">{count,plural, =1{Vous avez ignoré {count} avertissement}one{Vous avez ignoré {count} avertissement}other{Vous avez ignoré {count} avertissements}}</translation> <translation id="8558480467877843976">Vous pouvez désormais utiliser Chrome chaque fois que vous naviguez ou que vous touchez des liens dans des messages, des documents et d'autres applications.</translation> <translation id="8560253818350321773">Affichez les éléments fréquemment utilisés en premier.</translation> -<translation id="8580411965900177618">Non merci</translation> <translation id="8588404856427128947">Désactivée</translation> <translation id="8591976964826315682">Bloquer les témoins tiers en navigation privée</translation> <translation id="8605219856220328675">Fermer l'onglet.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_fr.xtb b/ios/chrome/app/strings/resources/ios_strings_fr.xtb index ee562c4..f1418ea7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_fr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_fr.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Vous avez ignoré {count} avertissement}one{Vous avez ignoré {count} avertissement}other{Vous avez ignoré {count} avertissements}}</translation> <translation id="8558480467877843976">Vous pouvez désormais utiliser Chrome chaque fois que vous parcourez ou appuyez sur des liens dans des messages, des documents et d'autres applis.</translation> <translation id="8560253818350321773">Afficher en premier les éléments fréquemment utilisés.</translation> -<translation id="8580411965900177618">Non merci</translation> <translation id="8588404856427128947">Éteinte</translation> <translation id="8591976964826315682">Bloquer les cookies tiers en mode navigation privée</translation> <translation id="8605219856220328675">Fermer l'onglet</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gl.xtb b/ios/chrome/app/strings/resources/ios_strings_gl.xtb index 03d7aa3..b560b34 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gl.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Ignoraches {count} aviso}other{Ignoraches {count} avisos}}</translation> <translation id="8558480467877843976">Agora podes usar Chrome sempre que explores contido ou toques ligazóns en mensaxes, documentos e outras aplicacións.</translation> <translation id="8560253818350321773">Móstranse primeiro os elementos usados con máis frecuencia.</translation> -<translation id="8580411965900177618">Non, grazas</translation> <translation id="8588404856427128947">Desactivada</translation> <translation id="8591976964826315682">Bloquear cookies de terceiros no modo de incógnito</translation> <translation id="8605219856220328675">Pechar pestana.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_gu.xtb b/ios/chrome/app/strings/resources/ios_strings_gu.xtb index 2229c74..a84ca281 100644 --- a/ios/chrome/app/strings/resources/ios_strings_gu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_gu.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{તમે {count} ચેતવણી છોડી દીધી}one{તમે {count} ચેતવણી છોડી દીધી}other{તમે {count} ચેતવણી છોડી દીધી}}</translation> <translation id="8558480467877843976">હવે તમે કોઈપણ સમયે બ્રાઉઝ કરીને અથવા મેસેજ, દસ્તાવેજો અને અન્ય ઍપમાં લિંક પર ટૅપ કરીને Chromeનો ઉપયોગ કરી શકો છો.</translation> <translation id="8560253818350321773">પહેલા વારંવાર ઉપયોગમાં લેવામાં આવતી આઇટમ બતાવો.</translation> -<translation id="8580411965900177618">ના, આભાર</translation> <translation id="8588404856427128947">બંધ</translation> <translation id="8591976964826315682">ત્રીજા પક્ષની કુકીને છૂપા મોડમાં બ્લૉક કરો</translation> <translation id="8605219856220328675">ટૅબ બંધ કરો.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hi.xtb b/ios/chrome/app/strings/resources/ios_strings_hi.xtb index d985d0a..6978e861 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hi.xtb
@@ -517,7 +517,6 @@ <translation id="3771033907050503522">गुप्त टैब</translation> <translation id="3775743491439407556">सिंक की सुविधा काम नहीं कर रही है</translation> <translation id="3779810277399252432">कोई इंटरनेट कनेक्शन नहीं.</translation> -<translation id="3787061634640932557">कार्ड की जानकारी में बदलाव करना</translation> <translation id="3789294999358192700">यहां दिया गया तरीका अपनाएं:</translation> <translation id="3789841737615482174">इंस्टॉल करें</translation> <translation id="380329542618494757">नाम</translation> @@ -791,7 +790,6 @@ <translation id="5300589172476337783">दिखाएं</translation> <translation id="5317780077021120954">सेव करें</translation> <translation id="5318298563956633672">इस प्रॉडक्ट को पहले से ही ट्रैक किया जा रहा है.</translation> -<translation id="5330747118195256207">इस कार्ड को छिपाने से, आपके आने वाले पैकेज के लिए ऑटो-ट्रैकिंग की सुविधा बंद हो जाएगी</translation> <translation id="5339316356165661760">'सिंक करें' को चालू करें</translation> <translation id="536067926684072644">बुकमार्क दिखाएं</translation> <translation id="5360976571138293719">निजता, सुरक्षा, और डेटा इकट्ठा करने से जुड़ी ज़्यादा सेटिंग के लिए, <ph name="BEGIN_LINK" />Google की सेवाएं<ph name="END_LINK" /> देखें.</translation> @@ -1404,7 +1402,6 @@ <translation id="8556590991644167667">{count,plural, =1{आपने {count} चेतावनी खारिज की}one{आपने {count} चेतावनी खारिज की}other{आपने {count} चेतावनियां खारिज कीं}}</translation> <translation id="8558480467877843976">अब मैसेज, दस्तावेज़ों, और अन्य ऐप्लिकेशन में मौजूद लिंक को खोलकर सीधे Chrome पर जाया जा सकता है.</translation> <translation id="8560253818350321773">अक्सर इस्तेमाल किए जाने वाले आइटम पहले दिखाएं.</translation> -<translation id="8580411965900177618">रहने दें</translation> <translation id="8588404856427128947">बंद है</translation> <translation id="8591976964826315682">गुप्त मोड में तीसरे पक्ष की कुकी ब्लॉक करें</translation> <translation id="8605219856220328675">टैब बंद करें.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hr.xtb b/ios/chrome/app/strings/resources/ios_strings_hr.xtb index 60712357..a94c1c1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hr.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Odbacili ste {count} upozorenje}one{Odbacili ste {count} upozorenje}few{Odbacili ste {count} upozorenja}other{Odbacili ste {count} upozorenja}}</translation> <translation id="8558480467877843976">Sad možete koristiti Chrome svaki put kad pregledavate ili dodirnete veze u porukama, dokumentima i drugim aplikacijama.</translation> <translation id="8560253818350321773">Najprije prikažite često korištene stavke.</translation> -<translation id="8580411965900177618">Ne, hvala</translation> <translation id="8588404856427128947">Isključeno</translation> <translation id="8591976964826315682">Blokiranje kolačića trećih strana u anonimnom načinu</translation> <translation id="8605219856220328675">Zatvori karticu.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hu.xtb b/ios/chrome/app/strings/resources/ios_strings_hu.xtb index d555d92..01068238 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hu.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Elvetett {count} figyelmeztetést}other{Elvetett {count} figyelmeztetést}}</translation> <translation id="8558480467877843976">Mostantól mindig a Chrome-ot használhatja, amikor üzenetekben, dokumentumokban és más alkalmazásokban linkekre kattint (illetve böngészik köztük).</translation> <translation id="8560253818350321773">Először a gyakran használt elemek jelenjenek meg.</translation> -<translation id="8580411965900177618">Köszönöm, nem</translation> <translation id="8588404856427128947">Kikapcsolva</translation> <translation id="8591976964826315682">Harmadik felektől származó cookie-k letiltása Inkognitó módban</translation> <translation id="8605219856220328675">Lap bezárása.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_hy.xtb b/ios/chrome/app/strings/resources/ios_strings_hy.xtb index e568afc..5e64206 100644 --- a/ios/chrome/app/strings/resources/ios_strings_hy.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_hy.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Դուք փակել եք {count} նախազգուշացում}one{Դուք փակել եք {count} նախազգուշացում}other{Դուք փակել եք {count} նախազգուշացում}}</translation> <translation id="8558480467877843976">Այժմ հաղորդագրություններում, փաստաթղթերում և այլ հավելվածներում առկա հղումները կարող եք բացել Chrome-ում։</translation> <translation id="8560253818350321773">Սկզբում ցուցադրել հաճախակի օգտագործվող տարրերը</translation> -<translation id="8580411965900177618">Ոչ</translation> <translation id="8588404856427128947">Անջատված է</translation> <translation id="8591976964826315682">Արգելափակել կողմնակի կայքերի քուքիները ինկոգնիտո ռեժիմում</translation> <translation id="8605219856220328675">Փակել ներդիրը:</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_id.xtb b/ios/chrome/app/strings/resources/ios_strings_id.xtb index ea98c01..d63518ae 100644 --- a/ios/chrome/app/strings/resources/ios_strings_id.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_id.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Anda menolak {count} peringatan}other{Anda menolak {count} peringatan}}</translation> <translation id="8558480467877843976">Anda kini dapat menggunakan Chrome kapan saja dengan mengakses atau mengetuk link di pesan, dokumen, dan aplikasi lainnya.</translation> <translation id="8560253818350321773">Tampilkan item yang sering digunakan terlebih dahulu.</translation> -<translation id="8580411965900177618">Lain Kali</translation> <translation id="8588404856427128947">Nonaktif</translation> <translation id="8591976964826315682">Blokir Cookie Pihak Ketiga dalam Mode Samaran</translation> <translation id="8605219856220328675">Tutup tab.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_is.xtb b/ios/chrome/app/strings/resources/ios_strings_is.xtb index 717b948..b761961 100644 --- a/ios/chrome/app/strings/resources/ios_strings_is.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_is.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Þú hunsaðir {count} viðvörun}one{Þú hunsaðir {count} viðvörun}other{Þú hunsaðir {count} viðvaranir}}</translation> <translation id="8558480467877843976">Núna geturðu notað Chrome hvenær sem þú skoðar eða ýtir á tengil í skilaboðum, skjölum og öðrum forritum.</translation> <translation id="8560253818350321773">Sýna atriði sem eru notuð oft fyrst.</translation> -<translation id="8580411965900177618">Nei, takk</translation> <translation id="8588404856427128947">Slökkt</translation> <translation id="8591976964826315682">Loka á fótspor þriðju aðila í huliðsstillingu</translation> <translation id="8605219856220328675">Loka flipa.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_it.xtb b/ios/chrome/app/strings/resources/ios_strings_it.xtb index 319799bf..684a14d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_it.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_it.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Hai ignorato {count} avviso}other{Hai ignorato {count} avvisi}}</translation> <translation id="8558480467877843976">Ora puoi usare Chrome ogni volta che navighi o tocchi link in messaggi, documenti e altre app.</translation> <translation id="8560253818350321773">Mostra prima le voci usate di frequente.</translation> -<translation id="8580411965900177618">No, grazie</translation> <translation id="8588404856427128947">Non attiva</translation> <translation id="8591976964826315682">Blocca cookie di terze parti in modalità di navigazione in incognito</translation> <translation id="8605219856220328675">Chiudi la scheda.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_iw.xtb b/ios/chrome/app/strings/resources/ios_strings_iw.xtb index 02f557a..c17d0d9 100644 --- a/ios/chrome/app/strings/resources/ios_strings_iw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_iw.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{סגרת אזהרה אחת ({count})}one{סגרת {count} אזהרות}two{סגרת {count} אזהרות}other{סגרת {count} אזהרות}}</translation> <translation id="8558480467877843976">אפשר עכשיו להשתמש ב-Chrome בכל פעם שגולשים או מקישים על קישורים בהודעות, במסמכים ובאפליקציות אחרות.</translation> <translation id="8560253818350321773">הפריטים שמשתמשים בהם לעתים קרובות יופיעו ראשונים.</translation> -<translation id="8580411965900177618">לא, תודה</translation> <translation id="8588404856427128947">כבוי</translation> <translation id="8591976964826315682">חסימת קובצי cookie של צד שלישי במצב אנונימי</translation> <translation id="8605219856220328675">סגירת כרטיסייה.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ja.xtb b/ios/chrome/app/strings/resources/ios_strings_ja.xtb index 90749a61..d7c0e0fe 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ja.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ja.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} 件の警告を非表示にしました}other{{count} 件の警告を非表示にしました}}</translation> <translation id="8558480467877843976">ブラウジングするときや、メッセージ、ドキュメント、他のアプリのリンクをタップしたときに、常に Chrome が使えるようになります。</translation> <translation id="8560253818350321773">よく使うアイテムを最初に表示します。</translation> -<translation id="8580411965900177618">スキップ</translation> <translation id="8588404856427128947">オフ</translation> <translation id="8591976964826315682">シークレット モードでサードパーティの Cookie をブロックする</translation> <translation id="8605219856220328675">タブを閉じる。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ka.xtb b/ios/chrome/app/strings/resources/ios_strings_ka.xtb index 3c4f87e..d07ada6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ka.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ka.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{თქვენ დახურეთ {count} გაფრთხილება}other{თქვენ დახურეთ {count} გაფრთხილება}}</translation> <translation id="8558480467877843976">ამიერიდან შეგიძლიათ გამოიყენოთ Chrome, როცა ვებს ათვალიერებთ, ან შეტყობინებებში, დოკუმენტებში თუ სხვა აპებში ბმულებს ეხებით.</translation> <translation id="8560253818350321773">ჯერ გამოჩნდეს ხშირად გამოყენებული ერთეულები.</translation> -<translation id="8580411965900177618">არა, გმადლობთ</translation> <translation id="8588404856427128947">გამორთულია</translation> <translation id="8591976964826315682">მესამე მხარის ქუქი-ჩანაწერების დაბლოკვა ინკოგნიტო რეჟიმში</translation> <translation id="8605219856220328675">ჩანართის დახურვა.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kk.xtb b/ios/chrome/app/strings/resources/ios_strings_kk.xtb index 96d88ec..67a79051 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kk.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} ескертуді жауып тастадыңыз.}other{{count} ескертуді жауып тастадыңыз.}}</translation> <translation id="8558480467877843976">Енді хабарларда, құжаттарда және басқа қолданбаларда сілтемелерді шолу не түру арқылы Chrome браузерін кез келген уақытта пайдалана аласыз.</translation> <translation id="8560253818350321773">Алдымен жиі пайдаланылатын элементтерді көрсетіңіз.</translation> -<translation id="8580411965900177618">Жоқ, рақмет</translation> <translation id="8588404856427128947">Өшірулі</translation> <translation id="8591976964826315682">Инкогнито режимінде үшінші тараптың cookie файлдарын бөгеу</translation> <translation id="8605219856220328675">Қойындыны жабу</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_km.xtb b/ios/chrome/app/strings/resources/ios_strings_km.xtb index 1e5099f..7cf822f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_km.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_km.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{អ្នកបានច្រានចោលសារប្រុងប្រយ័ត្ន {count}}other{អ្នកបានច្រានចោលសារប្រុងប្រយ័ត្ន {count}}}</translation> <translation id="8558480467877843976">ឥឡូវនេះ អ្នកអាចប្រើ Chrome រាល់ពេលដែលអ្នករុករក ឬចុចលើតំណនៅក្នុងសារ ឯកសារ និងកម្មវិធីផ្សេងទៀត។</translation> <translation id="8560253818350321773">បង្ហាញធាតុដែលត្រូវបានប្រើញឹកញាប់មុនគេ។</translation> -<translation id="8580411965900177618">ទេ អរគុណ</translation> <translation id="8588404856427128947">បិទ</translation> <translation id="8591976964826315682">ទប់ស្កាត់ខូគីភាគីទីបីក្នុងមុខងារឯកជន</translation> <translation id="8605219856220328675">បិទផ្ទាំង</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_kn.xtb b/ios/chrome/app/strings/resources/ios_strings_kn.xtb index 2d1fba6e..5cc0be7 100644 --- a/ios/chrome/app/strings/resources/ios_strings_kn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_kn.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{ನೀವು {count} ಎಚ್ಚರಿಕೆಯನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ}one{ನೀವು {count} ಎಚ್ಚರಿಕೆಗಳನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ}other{ನೀವು {count} ಎಚ್ಚರಿಕೆಗಳನ್ನು ವಜಾಗೊಳಿಸಿದ್ದೀರಿ}}</translation> <translation id="8558480467877843976">ಇದೀಗ ನೀವು ಸಂದೇಶಗಳು, ಡಾಕ್ಯುಮೆಂಟ್ಗಳು ಮತ್ತು ಇತರ ಆ್ಯಪ್ಗಳಲ್ಲಿ ಲಿಂಕ್ಗಳನ್ನು ಬ್ರೌಸ್ ಮಾಡಿದಾಗ ಅಥವಾ ಟ್ಯಾಪ್ ಮಾಡಿದಾಗ, ಯಾವಾಗ ಬೇಕಾದರೂ Chrome ಅನ್ನು ಬಳಸಬಹುದು.</translation> <translation id="8560253818350321773">ಪದೇ ಪದೇ ಬಳಸುವ ಐಟಂಗಳನ್ನು ಮೊದಲು ತೋರಿಸಿ.</translation> -<translation id="8580411965900177618">ಬೇಡ</translation> <translation id="8588404856427128947">ಆಫ್</translation> <translation id="8591976964826315682">ಅಜ್ಞಾತ ಮೋಡ್ನಲ್ಲಿ ಥರ್ಡ್-ಪಾರ್ಟಿ ಕುಕೀಗಳನ್ನು ನಿರ್ಬಂಧಿಸಿ</translation> <translation id="8605219856220328675">ಟ್ಯಾಬ್ ಮುಚ್ಚಿ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ko.xtb b/ios/chrome/app/strings/resources/ios_strings_ko.xtb index 4b6f372..4c5b58d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ko.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ko.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{경고 {count}개를 닫았습니다}other{경고 {count}개를 닫았습니다}}</translation> <translation id="8558480467877843976">이제 언제든지 메시지, 문서, 기타 앱에서 탐색하거나 링크를 탭하여 Chrome을 사용할 수 있습니다.</translation> <translation id="8560253818350321773">자주 사용하는 항목을 먼저 표시합니다.</translation> -<translation id="8580411965900177618">아니요</translation> <translation id="8588404856427128947">사용 안함</translation> <translation id="8591976964826315682">시크릿 모드에서 서드 파티 쿠키 차단</translation> <translation id="8605219856220328675">탭 닫기</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ky.xtb b/ios/chrome/app/strings/resources/ios_strings_ky.xtb index 4b76135..b9cabdc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ky.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ky.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} эскертүүнү жаптыңыз}other{{count} эскертүүнү жаптыңыз}}</translation> <translation id="8558480467877843976">Эми Chrome'до каалаган убакта сайттарды карап, билдирүүлөрдөгү шилтемелерди, документтерди жана башка колдонмолорду ача аласыз.</translation> <translation id="8560253818350321773">Алгач көп колдонулган нерселерди көрсөтүү.</translation> -<translation id="8580411965900177618">Жок, рахмат</translation> <translation id="8588404856427128947">Өчүк</translation> <translation id="8591976964826315682">Жашыруун режимде үчүнчү тараптын cookie файлдарын бөгөттөө</translation> <translation id="8605219856220328675">Өтмөктү жабуу.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lo.xtb b/ios/chrome/app/strings/resources/ios_strings_lo.xtb index 236f9ae0..39bc69f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lo.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lo.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{ທ່ານໄດ້ປິດ {count} ຄຳເຕືອນໄວ້ແລ້ວ}other{ທ່ານໄດ້ປິດ {count} ຄຳເຕືອນໄວ້ແລ້ວ}}</translation> <translation id="8558480467877843976">ຕອນນີ້ທ່ານສາມາດໃຊ້ Chrome ຕອນໃດກໍໄດ້ທີ່ທ່ານເລືອກເບິ່ງ ຫຼື ແຕະລິ້ງໃນຂໍ້ຄວາມ, ເອກະສານ ແລະ ແອັບອື່ນໆ.</translation> <translation id="8560253818350321773">ສະແດງລາຍການທີ່ໃຊ້ເລື້ອຍໆກ່ອນ.</translation> -<translation id="8580411965900177618">ບໍ່, ຂອບໃຈ</translation> <translation id="8588404856427128947">ປິດ</translation> <translation id="8591976964826315682">ບລັອກຄຸກກີ້ພາກສ່ວນທີສາມໃນໂໝດບໍ່ເປີດເຜີຍຕົວຕົນ</translation> <translation id="8605219856220328675">ປິດແຖບ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lt.xtb b/ios/chrome/app/strings/resources/ios_strings_lt.xtb index 411740a1..734c6ecf 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lt.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lt.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Atsisakėte {count} perspėjimo}one{Atsisakėte {count} perspėjimo}few{Atsisakėte {count} perspėjimų}many{Atsisakėte {count} perspėjimo}other{Atsisakėte {count} perspėjimų}}</translation> <translation id="8558480467877843976">Dabar galite naudoti „Chrome“ bet kada naršydami ar paliesdami nuorodas pranešimuose, dokumentuose ir kitose programose.</translation> <translation id="8560253818350321773">Pirmiausia rodykite dažnai naudojamus elementus.</translation> -<translation id="8580411965900177618">Ne, ačiū</translation> <translation id="8588404856427128947">Išjungta</translation> <translation id="8591976964826315682">Blokuoti trečiųjų šalių slapukus inkognito režimu</translation> <translation id="8605219856220328675">Uždaryti skirtuką.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_lv.xtb b/ios/chrome/app/strings/resources/ios_strings_lv.xtb index 753e76a3..63c6c5a 100644 --- a/ios/chrome/app/strings/resources/ios_strings_lv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_lv.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Jūs noraidījāt {count} brīdinājumu.}zero{Jūs noraidījāt {count} brīdinājumus.}one{Jūs noraidījāt {count} brīdinājumu.}other{Jūs noraidījāt {count} brīdinājumus.}}</translation> <translation id="8558480467877843976">Tagad varat izmantot Chrome ikreiz, kad pārlūkojat saturu vai pieskaraties saitēm ziņojumos, dokumentos un citās lietotnēs.</translation> <translation id="8560253818350321773">Vispirms rādīt bieži izmantotos vienumus.</translation> -<translation id="8580411965900177618">Nē, paldies</translation> <translation id="8588404856427128947">Izslēgts</translation> <translation id="8591976964826315682">Inkognito režīmā bloķēt trešo pušu sīkfailus</translation> <translation id="8605219856220328675">Aizvērt cilni.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mk.xtb b/ios/chrome/app/strings/resources/ios_strings_mk.xtb index 9f801ea..88be8de 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mk.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Отфрливте {count} предупредување}one{Отфрливте {count} предупредување}other{Отфрливте {count} предупредувања}}</translation> <translation id="8558480467877843976">Отсега може да го користите Chrome секогаш кога ќе прелистувате или допрете линкови во пораки, документи и други апликации.</translation> <translation id="8560253818350321773">Прво прикажувај ги често користените ставки.</translation> -<translation id="8580411965900177618">Не, фала</translation> <translation id="8588404856427128947">Исклучена</translation> <translation id="8591976964826315682">Блокирајте колачиња од трети страни во „Инкогнито“</translation> <translation id="8605219856220328675">Затвори ја картичката.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ml.xtb b/ios/chrome/app/strings/resources/ios_strings_ml.xtb index 52d0868..719d256 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ml.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ml.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{നിങ്ങൾ {count} മുന്നറിയിപ്പ് ഡിസ്മിസ് ചെയ്തു}other{നിങ്ങൾ {count} മുന്നറിയിപ്പുകൾ ഡിസ്മിസ് ചെയ്തു}}</translation> <translation id="8558480467877843976">നിങ്ങൾ ബ്രൗസ് ചെയ്യുമ്പോഴോ സന്ദേശങ്ങളിലോ ഡോക്യുമെന്റുകളിലോ മറ്റ് ആപ്പുകളിലോ ലിങ്കുകളിൽ ടാപ്പ് ചെയ്യുമ്പോഴോ എപ്പോൾ വേണമെങ്കിലും നിങ്ങൾക്ക് ഇപ്പോൾ Chrome ഉപയോഗിക്കാം.</translation> <translation id="8560253818350321773">ഇടയ്ക്കിടെ ഉപയോഗിക്കുന്ന ഇനങ്ങൾ ആദ്യം കാണിക്കുക.</translation> -<translation id="8580411965900177618">വേണ്ട, നന്ദി</translation> <translation id="8588404856427128947">ഓഫാണ്</translation> <translation id="8591976964826315682">അദൃശ്യ മോഡിൽ മൂന്നാം കക്ഷി കുക്കികൾ ബ്ലോക്ക് ചെയ്യുക</translation> <translation id="8605219856220328675">ടാബ് അടയ്ക്കുക.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mn.xtb b/ios/chrome/app/strings/resources/ios_strings_mn.xtb index ed8a9a91..de084ea 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mn.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Та {count} сануулгыг үл хэрэгссэн}other{Та {count} сануулгыг үл хэрэгссэн}}</translation> <translation id="8558480467877843976">Та одоо мессеж, документ болон бусад апп дахь холбоосыг үзэх эсвэл товшихын тулд Chrome-г хүссэн үедээ ашиглах боломжтой.</translation> <translation id="8560253818350321773">Байнга ашигладаг зүйлсийг эхэнд харуулна.</translation> -<translation id="8580411965900177618">Үгүй, баярлалаа</translation> <translation id="8588404856427128947">Унтраах</translation> <translation id="8591976964826315682">Нууцлалтай горимд гуравдагч талын күүкиг блоклох</translation> <translation id="8605219856220328675">Цонхыг хаах.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_mr.xtb b/ios/chrome/app/strings/resources/ios_strings_mr.xtb index 7528f17..0380a6c5 100644 --- a/ios/chrome/app/strings/resources/ios_strings_mr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_mr.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{तुम्ही {count} चेतावणी डिसमिस केली आहे}other{तुम्ही {count} चेतावण्या डिसमिस केल्या आहेत}}</translation> <translation id="8558480467877843976">तुम्ही आता मेसेज, दस्तऐवज आणि इतर अॅप्समधील लिंक ब्राउझ करता किंवा त्यावर टॅप करता, तेव्हा Chrome कधीही वापरू शकता.</translation> <translation id="8560253818350321773">वारंवार वापरले जाणारे आयटम सर्वप्रथम दाखवा.</translation> -<translation id="8580411965900177618">नाही, नको</translation> <translation id="8588404856427128947">बंद करा</translation> <translation id="8591976964826315682">तृतीय पक्ष कुकी गुप्त मोडमध्ये ब्लॉक करा</translation> <translation id="8605219856220328675">टॅब बंद करा.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ms.xtb b/ios/chrome/app/strings/resources/ios_strings_ms.xtb index 2f8f6df..ebe1be2 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ms.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ms.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Anda mengetepikan {count} amaran}other{Anda mengetepikan {count} amaran}}</translation> <translation id="8558480467877843976">Kini anda boleh menggunakan Chrome pada bila-bila masa anda menyemak imbas atau mengetik pautan dalam mesej, dokumen dan apl lain.</translation> <translation id="8560253818350321773">Menunjukkan item yang sering digunakan dahulu.</translation> -<translation id="8580411965900177618">Tidak</translation> <translation id="8588404856427128947">Mati</translation> <translation id="8591976964826315682">Sekat Kuki Pihak Ketiga dalam Inkognito</translation> <translation id="8605219856220328675">Tutup tab.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_my.xtb b/ios/chrome/app/strings/resources/ios_strings_my.xtb index 3d7204f..3d218fc 100644 --- a/ios/chrome/app/strings/resources/ios_strings_my.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_my.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{သတိပေးချက် {count} ခုကို ပယ်လိုက်သည်}other{သတိပေးချက် {count} ခုကို ပယ်လိုက်သည်}}</translation> <translation id="8558480467877843976">ယခုအခါ မက်ဆေ့ဂျ်၊ မှတ်တမ်းနှင့် အခြားအက်ပ်များရှိ လင့်ခ်များကို ကြည့်ရှု (သို့) တို့ သည့်အချိန်တိုင်းတွင် Chrome ကို အသုံးပြုနိုင်သည်။</translation> <translation id="8560253818350321773">မကြာခဏသုံးသော အရာများ အရင်ပြမည်။</translation> -<translation id="8580411965900177618">မလိုပါ</translation> <translation id="8588404856427128947">ပိတ်ရန်</translation> <translation id="8591976964826315682">ရုပ်ဖျက်မုဒ်တွင် ပြင်ပအဖွဲ့၏ကွတ်ကီးများကို ပိတ်ထားရန်</translation> <translation id="8605219856220328675">တဘ်ကိုပိတ်ပါ။</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ne.xtb b/ios/chrome/app/strings/resources/ios_strings_ne.xtb index 3f293cc..94c190d0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ne.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ne.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{तपाईंले {count} वटा चेतावनी खारेज गर्नुभएको छ}other{तपाईंले {count} वटा चेतावनी खारेज गर्नुभएको छ}}</translation> <translation id="8558480467877843976">तपाईंले अब म्यासेज, डकुमेन्ट वा अन्य एपमा भएका लिंक ब्राउज गर्दा वा तिनमा ट्याप गर्दा ती लिंक Chrome मा खुल्ने छन्।</translation> <translation id="8560253818350321773">बारम्बार प्रयोग गरिएका वस्तुहरू सुरुमा देखाउनुहोस्।</translation> -<translation id="8580411965900177618">पर्दैन, धन्यवाद</translation> <translation id="8588404856427128947">निष्क्रिय</translation> <translation id="8591976964826315682">इन्कोग्निटो मोडमा तेस्रो पक्षीय कुकीलाई रोक लगाइयोस्</translation> <translation id="8605219856220328675">ट्याब बन्द गर्नुहोस्।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_nl.xtb b/ios/chrome/app/strings/resources/ios_strings_nl.xtb index 0005937..830b384 100644 --- a/ios/chrome/app/strings/resources/ios_strings_nl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_nl.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Je hebt {count} waarschuwing gesloten}other{Je hebt {count} waarschuwingen gesloten}}</translation> <translation id="8558480467877843976">Je kunt Chrome nu gebruiken als je browst of op links in berichten, documenten en andere apps tikt.</translation> <translation id="8560253818350321773">Toon veelgebruikte items eerst.</translation> -<translation id="8580411965900177618">Nee, bedankt</translation> <translation id="8588404856427128947">Uit</translation> <translation id="8591976964826315682">Cookies van derden blokkeren in incognitomodus</translation> <translation id="8605219856220328675">Tabblad sluiten</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_no.xtb b/ios/chrome/app/strings/resources/ios_strings_no.xtb index 104a966..f6deef3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_no.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_no.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Du avviste {count} advarsel}other{Du avviste {count} advarsler}}</translation> <translation id="8558480467877843976">Nå kan du bruke Chrome når du blar gjennom eller trykker på linker i meldinger, dokumenter og andre apper.</translation> <translation id="8560253818350321773">Vis elementene som brukes ofte, først.</translation> -<translation id="8580411965900177618">Nei takk</translation> <translation id="8588404856427128947">Av</translation> <translation id="8591976964826315682">Blokkér informasjonskapsler fra tredjepart i inkognitomodus</translation> <translation id="8605219856220328675">Lukk fanen.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_or.xtb b/ios/chrome/app/strings/resources/ios_strings_or.xtb index 305d93a..c67ec2b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_or.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_or.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{ଆପଣ {count}ଟି ଚେତାବନୀ ଖାରଜ କରିଛନ୍ତି}other{ଆପଣ {count}ଟି ଚେତାବନୀ ଖାରଜ କରିଛନ୍ତି}}</translation> <translation id="8558480467877843976">ବର୍ତ୍ତମାନ ଆପଣ ଯେ କୌଣସି ସମୟରେ ବ୍ରାଉଜ କରି କିମ୍ବା ମେସେଜ, ଡକ୍ୟୁମେଣ୍ଟ ଏବଂ ଅନ୍ୟ ଆପ୍ସରେ ଥିବା ଲିଙ୍କରେ ଟାପ କରି Chrome ବ୍ୟବହାର କରିପାରିବେ।</translation> <translation id="8560253818350321773">ବାରମ୍ବାର ବ୍ୟବହାର କରାଯାଉଥିବା ଆଇଟମଗୁଡ଼ିକୁ ପ୍ରଥମେ ଦେଖାନ୍ତୁ।</translation> -<translation id="8580411965900177618">ନା, ଧନ୍ୟବାଦ</translation> <translation id="8588404856427128947">ବନ୍ଦ ଅଛି</translation> <translation id="8591976964826315682">ଇନକଗ୍ନିଟୋ ମୋଡରେ ତୃତୀୟ-ପକ୍ଷ କୁକୀଗୁଡ଼ିକୁ ବ୍ଲକ୍ କରନ୍ତୁ</translation> <translation id="8605219856220328675">ଟାବ୍ ବନ୍ଦ କରନ୍ତୁ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pa.xtb b/ios/chrome/app/strings/resources/ios_strings_pa.xtb index 65e74c8..85da981 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pa.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pa.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{ਤੁਸੀਂ {count} ਚਿਤਾਵਨੀ ਖਾਰਜ ਕੀਤੀ}one{ਤੁਸੀਂ {count} ਚਿਤਾਵਨੀ ਖਾਰਜ ਕੀਤੀ}other{ਤੁਸੀਂ {count} ਚਿਤਾਵਨੀਆਂ ਖਾਰਜ ਕੀਤੀਆਂ}}</translation> <translation id="8558480467877843976">ਤੁਸੀਂ ਹੁਣ ਤੁਹਾਡੇ ਵੱਲੋਂ ਸੁਨੇਹਿਆਂ, ਦਸਤਾਵੇਜ਼ਾਂ ਅਤੇ ਹੋਰ ਐਪਾਂ ਵਿਚਲੇ ਲਿੰਕਾਂ ਨੂੰ ਬ੍ਰਾਊਜ਼ ਕਰ ਕੇ ਜਾਂ ਉਨ੍ਹਾਂ 'ਤੇ ਟੈਪ ਕਰ ਕੇ ਕਿਸੇ ਵੇਲੇ ਵੀ Chrome ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ।</translation> <translation id="8560253818350321773">ਅਕਸਰ ਵਰਤੀਆਂ ਜਾਣ ਵਾਲੀਆਂ ਆਈਟਮਾਂ ਪਹਿਲਾਂ ਦਿਖਾਓ।</translation> -<translation id="8580411965900177618">ਨਹੀਂ ਧੰਨਵਾਦ</translation> <translation id="8588404856427128947">ਬੰਦ</translation> <translation id="8591976964826315682">ਇਨਕੋਗਨਿਟੋ ਵਿੱਚ ਤੀਜੀ-ਧਿਰ ਦੀਆਂ ਕੁਕੀਜ਼ ਨੂੰ ਬਲਾਕ ਕਰੋ</translation> <translation id="8605219856220328675">ਟੈਬ ਬੰਦ ਕਰੋ।</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pl.xtb b/ios/chrome/app/strings/resources/ios_strings_pl.xtb index d9f08231..9d62003 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pl.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Odrzuciłeś(-aś) {count} ostrzeżenie}few{Odrzuciłeś(-aś) {count} ostrzeżenia}many{Odrzuciłeś(-aś) {count} ostrzeżeń}other{Odrzuciłeś(-aś) {count} ostrzeżenia}}</translation> <translation id="8558480467877843976">Teraz możesz używać Chrome za każdym razem, gdy przeglądasz lub klikasz linki w wiadomościach, dokumentach i innych aplikacjach.</translation> <translation id="8560253818350321773">Najpierw pokazuj elementy często używane.</translation> -<translation id="8580411965900177618">Nie, dziękuję</translation> <translation id="8588404856427128947">Wyłączono</translation> <translation id="8591976964826315682">Blokuj pliki cookie innych firm w trybie incognito</translation> <translation id="8605219856220328675">Zamknij kartę</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb index 0fb4e14..8bb5078 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-BR.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Você dispensou {count} aviso}one{Você dispensou {count} aviso}other{Você dispensou {count} avisos}}</translation> <translation id="8558480467877843976">Agora você pode usar o Chrome sempre que navegar ou tocar em links em mensagens, documentos e outros apps.</translation> <translation id="8560253818350321773">Mostrar primeiro os itens usados com frequência.</translation> -<translation id="8580411965900177618">Não</translation> <translation id="8588404856427128947">Desativada</translation> <translation id="8591976964826315682">Bloquear cookies de terceiros na navegação anônima</translation> <translation id="8605219856220328675">Fechar guia.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb index 398baa0..bd632a0 100644 --- a/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_pt-PT.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{Ignorou {count} aviso}other{Ignorou {count} avisos}}</translation> <translation id="8558480467877843976">Agora, pode usar o Chrome sempre que navegar ou tocar em links de mensagens, documentos e outras apps.</translation> <translation id="8560253818350321773">Mostre primeiro os itens usados frequentemente.</translation> -<translation id="8580411965900177618">Não</translation> <translation id="8588404856427128947">Desativada</translation> <translation id="8591976964826315682">Bloquear cookies de terceiros na Navegação anónima</translation> <translation id="8605219856220328675">Fechar separador.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ro.xtb b/ios/chrome/app/strings/resources/ios_strings_ro.xtb index eddc4ac5..cba3394d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ro.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ro.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Ai respins {count} avertisment}few{Ai respins {count} avertismente}other{Ai respins {count} de avertismente}}</translation> <translation id="8558480467877843976">Acum poți folosi Chrome oricând navighezi sau atingi linkuri în mesaje, documente și alte aplicații.</translation> <translation id="8560253818350321773">Afișează mai întâi elementele folosite frecvent.</translation> -<translation id="8580411965900177618">Nu, mulțumesc</translation> <translation id="8588404856427128947">Stinsă</translation> <translation id="8591976964826315682">Blochează cookie-urile terță parte în modul incognito</translation> <translation id="8605219856220328675">Închide fila.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ru.xtb b/ios/chrome/app/strings/resources/ios_strings_ru.xtb index 70aee27e..9de6aba1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ru.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ru.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Вы закрыли {count} предупреждение.}one{Вы закрыли {count} предупреждение.}few{Вы закрыли {count} предупреждения.}many{Вы закрыли {count} предупреждений.}other{Вы закрыли {count} предупреждения.}}</translation> <translation id="8558480467877843976">Теперь можно сделать так, что при переходе по ссылкам в сообщениях, документах и других приложениях будет открываться браузер Chrome.</translation> <translation id="8560253818350321773">Сначала показывать самые часто используемые элементы</translation> -<translation id="8580411965900177618">Нет, спасибо</translation> <translation id="8588404856427128947">Выключено</translation> <translation id="8591976964826315682">Блокировать файлы cookie сторонних сайтов в режиме инкогнито</translation> <translation id="8605219856220328675">Закрыть вкладку.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_si.xtb b/ios/chrome/app/strings/resources/ios_strings_si.xtb index efc361d..fb86241 100644 --- a/ios/chrome/app/strings/resources/ios_strings_si.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_si.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{ඔබ {count} අනතුරු ඇඟවීමක් අස් කළා}one{ඔබ අනතුරු ඇඟවීම් {count}ක් අස් කළා}other{ඔබ අනතුරු ඇඟවීම් {count}ක් අස් කළා}}</translation> <translation id="8558480467877843976">ඔබට දැන් ඔබ පණිවිඩ, ලේඛන සහ වෙනත් යෙදුම්වල සබැඳි බ්රවුස් කරන හෝ තට්ටු කරන ඕනෑම වේලාවක Chrome භාවිත කළ හැක.</translation> <translation id="8560253818350321773">නිතර භාවිතා කරන අයිතම පළමුව පෙන්වන්න.</translation> -<translation id="8580411965900177618">එපා ස්තුතියි</translation> <translation id="8588404856427128947">අක්රිය</translation> <translation id="8591976964826315682">අප්රසිද්ධය තුළ තෙවන පාර්ශ්ව කුකි අවහිර කරන්න</translation> <translation id="8605219856220328675">පටිත්ත වසන්න.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sk.xtb b/ios/chrome/app/strings/resources/ios_strings_sk.xtb index 5898c861..feff5f3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sk.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Zavreli ste {count} upozornenie}few{Zavreli ste {count} upozornenia}many{You dismissed {count} warnings}other{Zavreli ste {count} upozornení}}</translation> <translation id="8558480467877843976">Chrome môžete teraz kedykoľvek použiť pri prehliadaní alebo klepnutí na odkazy v správach, dokumentoch a ďalších aplikáciách.</translation> <translation id="8560253818350321773">Zobrazujte si často používané položky ako prvé.</translation> -<translation id="8580411965900177618">Nie, ďakujem</translation> <translation id="8588404856427128947">Vypnúť</translation> <translation id="8591976964826315682">Blokovať súbory cookie tretích strán v režime inkognito</translation> <translation id="8605219856220328675">Zatvoriť kartu.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sl.xtb b/ios/chrome/app/strings/resources/ios_strings_sl.xtb index 1227879..b8ee7ee 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sl.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sl.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Opustili ste {count} opozorilo}one{Opustili ste {count} opozorilo}two{Opustili ste {count} opozorili}few{Opustili ste {count} opozorila}other{Opustili ste {count} opozoril}}</translation> <translation id="8558480467877843976">Zdaj lahko uporabljate Chrome, kadar koli brskate po povezavah ali se jih dotaknete v sporočilih, dokumentih in drugih aplikacijah.</translation> <translation id="8560253818350321773">Najprej prikaz pogosto uporabljenih elementov.</translation> -<translation id="8580411965900177618">Ne, hvala</translation> <translation id="8588404856427128947">Izklop</translation> <translation id="8591976964826315682">Blokiraj piškotke drugih mest v anonimnem načinu</translation> <translation id="8605219856220328675">Close tab.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sq.xtb b/ios/chrome/app/strings/resources/ios_strings_sq.xtb index 5f55642..4a656e11 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sq.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sq.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Hoqe {count} paralajmërim}other{Hoqe {count} paralajmërime}}</translation> <translation id="8558480467877843976">Tani mund të përdorësh Chrome sa herë që shfleton ose troket te lidhjet në mesazhe, dokumente dhe aplikacione të tjera.</translation> <translation id="8560253818350321773">Shfaq në fillim artikujt e përdorur shpesh.</translation> -<translation id="8580411965900177618">Jo, faleminderit</translation> <translation id="8588404856427128947">Joaktiv</translation> <translation id="8591976964826315682">Blloko kukit e palëve të treta në modalitetin "i fshehtë"</translation> <translation id="8605219856220328675">Mbylle skedën</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb index 010e845..4c86bca6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr-Latn.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Odbacili ste {count} upozorenje}one{Odbacili ste {count} upozorenje}few{Odbacili ste {count} upozorenja}other{Odbacili ste {count} upozorenja}}</translation> <translation id="8558480467877843976">Sada možete da koristite Chrome svaki put kada pregledate ili dodirnete linkove u porukama, dokumentima i drugim aplikacijama.</translation> <translation id="8560253818350321773">Prvo prikaži često korišćene stavke.</translation> -<translation id="8580411965900177618">Ne, hvala</translation> <translation id="8588404856427128947">Isključeno</translation> <translation id="8591976964826315682">Blokirajte kolačiće trećih strana u režimu bez arhiviranja</translation> <translation id="8605219856220328675">Zatvori karticu.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sr.xtb b/ios/chrome/app/strings/resources/ios_strings_sr.xtb index c935c0d..1a93bab 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sr.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Одбацили сте {count} упозорење}one{Одбацили сте {count} упозорење}few{Одбацили сте {count} упозорења}other{Одбацили сте {count} упозорења}}</translation> <translation id="8558480467877843976">Сада можете да користите Chrome сваки пут када прегледате или додирнете линкове у порукама, документима и другим апликацијама.</translation> <translation id="8560253818350321773">Прво прикажи често коришћене ставке.</translation> -<translation id="8580411965900177618">Не, хвала</translation> <translation id="8588404856427128947">Искључено</translation> <translation id="8591976964826315682">Блокирајте колачиће трећих страна у режиму без архивирања</translation> <translation id="8605219856220328675">Затвори картицу.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sv.xtb b/ios/chrome/app/strings/resources/ios_strings_sv.xtb index afb1916..00235ec6 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sv.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sv.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Du har ignorerat {count} varning}other{Du har ignorerat {count} varningar}}</translation> <translation id="8558480467877843976">Nu kan du använda Chrome varje gång du surfar eller trycker på länkar i meddelanden, dokument och andra appar.</translation> <translation id="8560253818350321773">Visa ofta använda objekt först.</translation> -<translation id="8580411965900177618">Nej tack</translation> <translation id="8588404856427128947">Av</translation> <translation id="8591976964826315682">Blockera cookies från tredje part i inkognitoläge</translation> <translation id="8605219856220328675">Stäng fliken.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_sw.xtb b/ios/chrome/app/strings/resources/ios_strings_sw.xtb index 045b892..4240b59 100644 --- a/ios/chrome/app/strings/resources/ios_strings_sw.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_sw.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Umeondoa onyo {count}}other{Umeondoa maonyo {count}}}</translation> <translation id="8558480467877843976">Sasa unaweza kutumia Chrome wakati wowote unapovinjari au kugusa viungo kwenye ujumbe, hati na programu nyingine.</translation> <translation id="8560253818350321773">Onyesha vipengee vinavyotumika mara kwa mara kwanza.</translation> -<translation id="8580411965900177618">Hapana</translation> <translation id="8588404856427128947">Imezimwa</translation> <translation id="8591976964826315682">Zuia Vidakuzi vya Tovuti Nyingine katika Hali Fiche</translation> <translation id="8605219856220328675">Funga kichupo</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ta.xtb b/ios/chrome/app/strings/resources/ios_strings_ta.xtb index 8a4ed01..4f87e1f 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ta.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ta.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} எச்சரிக்கையை நிராகரித்துள்ளீர்கள்}other{{count} எச்சரிக்கைகளை நிராகரித்துள்ளீர்கள்}}</translation> <translation id="8558480467877843976">நீங்கள் உலாவும் போது அல்லது மெசேஜ்கள், ஆவணங்கள் அல்லது பிற ஆப்ஸில் உள்ள இணைப்புகளைக் கிளிக் செய்யும்போதெல்லாம் Chromeமை பயன்படுத்தலாம்.</translation> <translation id="8560253818350321773">அடிக்கடி பயன்படுத்தியவற்றை முதலில் காட்டும்.</translation> -<translation id="8580411965900177618">வேண்டாம்</translation> <translation id="8588404856427128947">ஆஃப்</translation> <translation id="8591976964826315682">மறைநிலையில் மூன்றாம் தரப்பு குக்கீகளைத் தடு</translation> <translation id="8605219856220328675">தாவலை மூடு.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_te.xtb b/ios/chrome/app/strings/resources/ios_strings_te.xtb index e3a280c..cf6d32b 100644 --- a/ios/chrome/app/strings/resources/ios_strings_te.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_te.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{మీరు {count} హెచ్చరికను విస్మరించారు}other{మీరు {count} హెచ్చరికలను విస్మరించారు}}</translation> <translation id="8558480467877843976">ఇప్పుడు మీరు మెసేజ్లు, డాక్యుమెంట్లు, ఇంకా ఇతర యాప్లలో లింక్లను బ్రౌజ్ చేయడం లేదా ట్యాప్ చేయడం ద్వారా ఎప్పుడైనా Chromeను ఉపయోగించవచ్చు.</translation> <translation id="8560253818350321773">తరచుగా ఉపయోగించే ఐటెమ్లను ముందుగా చూపండి.</translation> -<translation id="8580411965900177618">వద్దు, థ్యాంక్స్</translation> <translation id="8588404856427128947">ఆఫ్ చేయబడి ఉంది</translation> <translation id="8591976964826315682">అజ్ఞాత మోడ్లో థర్డ్-పార్టీ కుక్కీలను బ్లాక్ చేయండి</translation> <translation id="8605219856220328675">ట్యాబ్ను మూసివేయండి.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_th.xtb b/ios/chrome/app/strings/resources/ios_strings_th.xtb index dfa16fc..d74baa3 100644 --- a/ios/chrome/app/strings/resources/ios_strings_th.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_th.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{คุณได้ปิดคำเตือน {count} รายการ}other{คุณได้ปิดคําเตือน {count} รายการ}}</translation> <translation id="8558480467877843976">ตอนนี้คุณจะใช้ Chrome ทุกครั้งที่เรียกดูหรือแตะลิงก์ในข้อความ เอกสาร และแอปอื่นๆ ได้</translation> <translation id="8560253818350321773">แสดงรายการที่ใช้บ่อยก่อน</translation> -<translation id="8580411965900177618">ไม่ ขอบคุณ</translation> <translation id="8588404856427128947">ปิด</translation> <translation id="8591976964826315682">บล็อกคุกกี้ของบุคคลที่สามในโหมดไม่ระบุตัวตน</translation> <translation id="8605219856220328675">ปิดแท็บ</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_tr.xtb b/ios/chrome/app/strings/resources/ios_strings_tr.xtb index 674ec8f..c156cc1 100644 --- a/ios/chrome/app/strings/resources/ios_strings_tr.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_tr.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} uyarıyı kapattınız}other{{count} uyarıyı kapattınız}}</translation> <translation id="8558480467877843976">Artık mesajlardaki, dokümanlardaki ve diğer uygulamalardaki bağlantılara göz attığınızda veya dokunduğunuzda Chrome'u kullanabilirsiniz.</translation> <translation id="8560253818350321773">Sık kullanılan öğeleri önce göster.</translation> -<translation id="8580411965900177618">Hayır, Teşekkürler</translation> <translation id="8588404856427128947">Kapalı</translation> <translation id="8591976964826315682">Gizli modda üçüncü taraf çerezlerini engelle</translation> <translation id="8605219856220328675">Sekmeyi kapat.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uk.xtb b/ios/chrome/app/strings/resources/ios_strings_uk.xtb index 6a9982c..a09a4eb 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uk.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uk.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Ви відхилили {count} попередження}one{Ви відхилили {count} попередження}few{Ви відхилили {count} попередження}many{Ви відхилили {count} попереджень}other{Ви відхилили {count} попередження}}</translation> <translation id="8558480467877843976">Тепер ви можете переглядати й відкривати в Chrome посилання з повідомлень, документів та інших додатків.</translation> <translation id="8560253818350321773">Спочатку показувати продукти, які часто використовуються.</translation> -<translation id="8580411965900177618">Ні, дякую</translation> <translation id="8588404856427128947">Вимкнено</translation> <translation id="8591976964826315682">Блокувати сторонні файли cookie в анонімному режимі</translation> <translation id="8605219856220328675">Закрити вкладку.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_ur.xtb b/ios/chrome/app/strings/resources/ios_strings_ur.xtb index d7e7c919..b1a55708 100644 --- a/ios/chrome/app/strings/resources/ios_strings_ur.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_ur.xtb
@@ -1383,7 +1383,6 @@ <translation id="8556590991644167667">{count,plural, =1{آپ نے {count} وارننگ کو برخاست کر دیا}other{آپ نے {count} وارننگز کو برخاست کر دیا}}</translation> <translation id="8558480467877843976">اب آپ کسی بھی وقت پیغامات، دستاویزات اور دیگر ایپس میں موجود لنکس کو براؤز یا تھپتھپاتے وقت Chrome استعمال کر سکتے ہیں۔</translation> <translation id="8560253818350321773">اکثر استعمال ہونے والے آئٹمز پہلے دکھائیں۔</translation> -<translation id="8580411965900177618">نہیں شکریہ</translation> <translation id="8588404856427128947">آف ہے</translation> <translation id="8591976964826315682">پوشیدگی میں فریق ثالث کی کوکیز کو مسدود کریں</translation> <translation id="8605219856220328675">ٹیب بند کریں۔</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_uz.xtb b/ios/chrome/app/strings/resources/ios_strings_uz.xtb index 2ac18c9..f3523644 100644 --- a/ios/chrome/app/strings/resources/ios_strings_uz.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_uz.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{{count} ta ogohlantirishni yopdingiz}other{{count} ta ogohlantirishni yopdingiz}}</translation> <translation id="8558480467877843976">Siz endi Chrome brauzerini har doim internetni kezish vaqtida yoki xabarlar, hujjatlar va boshqa ilovalardagi havolalar ustiga bosib ishga tushirishingiz mumkin.</translation> <translation id="8560253818350321773">Avval tez-tez ishlatilgan elementlarni chiqarish.</translation> -<translation id="8580411965900177618">Kerak emas</translation> <translation id="8588404856427128947">Oʻchiq</translation> <translation id="8591976964826315682">Inkognito rejimidagi tashqi cookie fayllarni taqiqlash</translation> <translation id="8605219856220328675">Sahifani yopish</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_vi.xtb b/ios/chrome/app/strings/resources/ios_strings_vi.xtb index d107a0c..3cbf01e 100644 --- a/ios/chrome/app/strings/resources/ios_strings_vi.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_vi.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Bạn đã đóng {count} cảnh báo}other{Bạn đã đóng {count} cảnh báo}}</translation> <translation id="8558480467877843976">Giờ bạn có thể dùng Chrome mỗi khi duyệt web hoặc nhấn vào liên kết trong thư/tin nhắn, tài liệu, v.v.</translation> <translation id="8560253818350321773">Hiển thị các mục thường dùng trước tiên.</translation> -<translation id="8580411965900177618">Không, cảm ơn</translation> <translation id="8588404856427128947">Đang tắt</translation> <translation id="8591976964826315682">Chặn cookie của bên thứ ba ở chế độ Ẩn danh</translation> <translation id="8605219856220328675">Đóng thẻ.</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb index cd1477c..f53fb61 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-CN.xtb
@@ -1370,7 +1370,6 @@ <translation id="8556590991644167667">{count,plural, =1{您忽略了 {count} 条警告}other{您忽略了 {count} 条警告}}</translation> <translation id="8558480467877843976">现在,每当浏览或点按消息、文档和其他应用中的链接时,您都可以使用 Chrome 打开链接。</translation> <translation id="8560253818350321773">将常用项显示在最前面。</translation> -<translation id="8580411965900177618">不了,谢谢</translation> <translation id="8588404856427128947">已关闭</translation> <translation id="8591976964826315682">在无痕模式下阻止第三方 Cookie</translation> <translation id="8605219856220328675">关闭标签页。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb index 464000d8..0e8e906 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-HK.xtb
@@ -1380,7 +1380,6 @@ <translation id="8556590991644167667">{count,plural, =1{您已關閉 {count} 個警告}other{您已關閉 {count} 個警告}}</translation> <translation id="8558480467877843976">您現在隨時可使用 Chrome 瀏覽或開啟訊息、文件和其他應用程式中的連結。</translation> <translation id="8560253818350321773">優先顯示常用項目。</translation> -<translation id="8580411965900177618">不用了,謝謝</translation> <translation id="8588404856427128947">閂</translation> <translation id="8591976964826315682">在無痕模式中封鎖第三方 Cookie</translation> <translation id="8605219856220328675">關閉分頁</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb index 84c5f42..b0210e2d 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zh-TW.xtb
@@ -1380,7 +1380,6 @@ <translation id="8556590991644167667">{count,plural, =1{你已忽略 {count} 則警告}other{你已忽略 {count} 則警告}}</translation> <translation id="8558480467877843976">現在起,每當你瀏覽或點選訊息、文件和其他應用程式中的連結時,都可以直接使用 Chrome 來開啟。</translation> <translation id="8560253818350321773">優先顯示常用項目。</translation> -<translation id="8580411965900177618">不用了,謝謝</translation> <translation id="8588404856427128947">關閉</translation> <translation id="8591976964826315682">在無痕模式中封鎖第三方 Cookie</translation> <translation id="8605219856220328675">關閉分頁。</translation>
diff --git a/ios/chrome/app/strings/resources/ios_strings_zu.xtb b/ios/chrome/app/strings/resources/ios_strings_zu.xtb index 36cca6e..76e6d288 100644 --- a/ios/chrome/app/strings/resources/ios_strings_zu.xtb +++ b/ios/chrome/app/strings/resources/ios_strings_zu.xtb
@@ -1382,7 +1382,6 @@ <translation id="8556590991644167667">{count,plural, =1{Uchithe isexwayiso esi-{count}}one{Uchithe izexwayiso ezingu-{count}}other{Uchithe izexwayiso ezingu-{count}}}</translation> <translation id="8558480467877843976">Manje usungasebenzisa i-Chrome noma kunini uma ubhrawuza noma uthepha amalinki emilayezweni, kumadokhumenti, nakwamanye ama-app.</translation> <translation id="8560253818350321773">Veza izinto ezisetshenziswa njalo kuqala.</translation> -<translation id="8580411965900177618">Cha Ngiyabonga</translation> <translation id="8588404856427128947">Valiwe</translation> <translation id="8591976964826315682">Vimba Amakhukhi Wenkampani Yangaphandle ku-Incognito</translation> <translation id="8605219856220328675">Vala ithebhu.</translation>
diff --git a/ios/chrome/browser/bring_android_tabs/model/features.mm b/ios/chrome/browser/bring_android_tabs/model/features.mm index 3b22a3a..9367416 100644 --- a/ios/chrome/browser/bring_android_tabs/model/features.mm +++ b/ios/chrome/browser/bring_android_tabs/model/features.mm
@@ -8,7 +8,7 @@ BASE_FEATURE(kBringYourOwnTabsIOS, "BringYourOwnTabsIOS", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); const char kBringYourOwnTabsIOSParam[] = "bottom-message";
diff --git a/ios/chrome/browser/browser_state/model/BUILD.gn b/ios/chrome/browser/browser_state/model/BUILD.gn index d80b813..5b6c495 100644 --- a/ios/chrome/browser/browser_state/model/BUILD.gn +++ b/ios/chrome/browser/browser_state/model/BUILD.gn
@@ -136,7 +136,7 @@ "//ios/chrome/browser/tabs_search/model:model_factory", "//ios/chrome/browser/text_selection/model", "//ios/chrome/browser/translate", - "//ios/chrome/browser/trusted_vault", + "//ios/chrome/browser/trusted_vault/model", "//ios/chrome/browser/ui/fullscreen", "//ios/chrome/browser/ui/voice", "//ios/chrome/browser/unified_consent/model",
diff --git a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm index f7b93fa8..cb93cb1 100644 --- a/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm +++ b/ios/chrome/browser/browser_state/model/browser_state_keyed_service_factories.mm
@@ -88,7 +88,7 @@ #import "ios/chrome/browser/tabs_search/model/tabs_search_service_factory.h" #import "ios/chrome/browser/text_selection/model/text_classifier_model_service_factory.h" #import "ios/chrome/browser/translate/translate_ranker_factory.h" -#import "ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h" +#import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h" #import "ios/chrome/browser/ui/voice/text_to_speech_playback_controller_factory.h" #import "ios/chrome/browser/unified_consent/model/unified_consent_service_factory.h" #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h"
diff --git a/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.mm b/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.mm index 907b118..acc6c70 100644 --- a/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.mm +++ b/ios/chrome/browser/browsing_data/model/browsing_data_remover_impl.mm
@@ -541,8 +541,10 @@ // The user just changed the account and chose to clear the previously // existing data. As browsing data is being cleared, it is fine to clear the // last username, as there will be no data to be merged. - browser_state_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastGaiaId); - browser_state_->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername); + browser_state_->GetPrefs()->ClearPref( + prefs::kGoogleServicesLastSyncingGaiaId); + browser_state_->GetPrefs()->ClearPref( + prefs::kGoogleServicesLastSyncingUsername); } // Remove stored zoom levels.
diff --git a/ios/chrome/browser/credential_provider_promo/BUILD.gn b/ios/chrome/browser/credential_provider_promo/model/BUILD.gn similarity index 100% rename from ios/chrome/browser/credential_provider_promo/BUILD.gn rename to ios/chrome/browser/credential_provider_promo/model/BUILD.gn
diff --git a/ios/chrome/browser/credential_provider_promo/features.h b/ios/chrome/browser/credential_provider_promo/model/features.h similarity index 82% rename from ios/chrome/browser/credential_provider_promo/features.h rename to ios/chrome/browser/credential_provider_promo/model/features.h index 2bb05f4..f85d1b1 100644 --- a/ios/chrome/browser/credential_provider_promo/features.h +++ b/ios/chrome/browser/credential_provider_promo/model/features.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 IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_PROMO_FEATURES_H_ -#define IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_PROMO_FEATURES_H_ +#ifndef IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_PROMO_MODEL_FEATURES_H_ +#define IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_PROMO_MODEL_FEATURES_H_ #import "base/feature_list.h" @@ -25,4 +25,4 @@ // password copied event. Currently not rolled out. bool IsCredentialProviderExtensionPromoEnabledOnPasswordCopied(); -#endif // IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_PROMO_FEATURES_H_ +#endif // IOS_CHROME_BROWSER_CREDENTIAL_PROVIDER_PROMO_MODEL_FEATURES_H_
diff --git a/ios/chrome/browser/credential_provider_promo/features.mm b/ios/chrome/browser/credential_provider_promo/model/features.mm similarity index 94% rename from ios/chrome/browser/credential_provider_promo/features.mm rename to ios/chrome/browser/credential_provider_promo/model/features.mm index a98564ed..9d30bbb 100644 --- a/ios/chrome/browser/credential_provider_promo/features.mm +++ b/ios/chrome/browser/credential_provider_promo/model/features.mm
@@ -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 "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import <Foundation/Foundation.h>
diff --git a/ios/chrome/browser/default_browser/BUILD.gn b/ios/chrome/browser/default_browser/BUILD.gn index 53972d8..fb95735 100644 --- a/ios/chrome/browser/default_browser/BUILD.gn +++ b/ios/chrome/browser/default_browser/BUILD.gn
@@ -43,6 +43,7 @@ ":test_support", ":utils", "//base/test:test_support", + "//components/feature_engagement/public", "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/shared/public/features", "//testing/gtest",
diff --git a/ios/chrome/browser/default_browser/utils.h b/ios/chrome/browser/default_browser/utils.h index 87ce367..2ba9f95f 100644 --- a/ios/chrome/browser/default_browser/utils.h +++ b/ios/chrome/browser/default_browser/utils.h
@@ -198,7 +198,7 @@ bool IsFullScreenPromoOnOmniboxCopyPasteEnabled(); // Returns true if client is in default browser video in settings experiment. -bool IsDBVideoInSettingsEnabled(); +bool IsDefaultBrowserVideoInSettingsEnabled(); // Returns true if the user has interacted with the Fullscreen Promo previously. // Returns false otherwise.
diff --git a/ios/chrome/browser/default_browser/utils.mm b/ios/chrome/browser/default_browser/utils.mm index d93119c..3d6bdee 100644 --- a/ios/chrome/browser/default_browser/utils.mm +++ b/ios/chrome/browser/default_browser/utils.mm
@@ -687,11 +687,20 @@ kNonModalDefaultBrowserPromoCooldownRefactor); } -bool IsDBVideoInSettingsEnabled() { - return base::FeatureList::IsEnabled(kDBVideoInSettings); +bool IsDefaultBrowserVideoInSettingsEnabled() { + return base::FeatureList::IsEnabled(kDefaultBrowserVideoInSettings); } bool HasUserInteractedWithFullscreenPromoBefore() { + if (base::FeatureList::IsEnabled( + feature_engagement::kDefaultBrowserEligibilitySlidingWindow)) { + return HasRecordedEventForKeyLessThanDelay( + kLastTimeUserInteractedWithFullscreenPromo, + base::Days( + feature_engagement::kDefaultBrowserEligibilitySlidingWindowParam + .Get())); + } + NSNumber* number = GetObjectFromStorageForKey<NSNumber>( kUserHasInteractedWithFullscreenPromo); return number.boolValue;
diff --git a/ios/chrome/browser/default_browser/utils_test_support.h b/ios/chrome/browser/default_browser/utils_test_support.h index a466eb9e..b971ac32 100644 --- a/ios/chrome/browser/default_browser/utils_test_support.h +++ b/ios/chrome/browser/default_browser/utils_test_support.h
@@ -11,7 +11,11 @@ void ClearDefaultBrowserPromoData(); // Sets an object into NSUserDefaults storage under the default browser utils -// key. -void SetObjectInStorageForKey(NSString* key, NSObject* data); +// key. Replaces the entire dictionary, so any existing entries are erased. +void ResetStorageAndSetObjectForKey(NSString* key, NSObject* data); + +// Overwrites the dictionary under the default browser utils key with the +// provided one. +void SetValuesInStorage(NSDictionary<NSString*, NSObject*>* data); #endif // IOS_CHROME_BROWSER_DEFAULT_BROWSER_UTILS_TEST_SUPPORT_H_
diff --git a/ios/chrome/browser/default_browser/utils_test_support.mm b/ios/chrome/browser/default_browser/utils_test_support.mm index 380f0b1..696938b 100644 --- a/ios/chrome/browser/default_browser/utils_test_support.mm +++ b/ios/chrome/browser/default_browser/utils_test_support.mm
@@ -17,7 +17,7 @@ [defaults removeObjectForKey:kDefaultBrowserUtilsKey]; } -void SetObjectInStorageForKey(NSString* key, NSObject* data) { +void ResetStorageAndSetObjectForKey(NSString* key, NSObject* data) { NSMutableDictionary<NSString*, NSObject*>* dict = [[NSMutableDictionary alloc] init]; NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; @@ -25,3 +25,8 @@ [defaults setObject:dict forKey:kDefaultBrowserUtilsKey]; } + +void SetValuesInStorage(NSDictionary<NSString*, NSObject*>* dict) { + NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults]; + [defaults setObject:dict forKey:kDefaultBrowserUtilsKey]; +}
diff --git a/ios/chrome/browser/default_browser/utils_unittest.mm b/ios/chrome/browser/default_browser/utils_unittest.mm index 7e56d454..256e95e 100644 --- a/ios/chrome/browser/default_browser/utils_unittest.mm +++ b/ios/chrome/browser/default_browser/utils_unittest.mm
@@ -7,6 +7,7 @@ #import "base/ios/ios_util.h" #import "base/test/scoped_feature_list.h" #import "base/time/time.h" +#import "components/feature_engagement/public/feature_constants.h" #import "ios/chrome/browser/default_browser/utils_test_support.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "testing/gtest/include/gtest/gtest.h" @@ -31,6 +32,15 @@ // More than 6 hours. constexpr base::TimeDelta kMoreThan6Hours = base::Hours(6) + base::Minutes(1); +// About 6 months. +constexpr base::TimeDelta k6Months = base::Days(6 * 365 / 12); + +// About 2 years. +constexpr base::TimeDelta k2Years = base::Days(2 * 365); + +// About 5 years. +constexpr base::TimeDelta k5Years = base::Days(5 * 365); + // Test key for a generic timestamp in NSUserDefaults. NSString* const kTestTimestampKey = @"testTimestampKeyDefaultBrowserUtils"; @@ -41,6 +51,18 @@ // Test key in storage for timestamp of last valid URL pasted. NSString* const kTimestampLastValidURLPasted = @"TimestampLastValidURLPasted"; +// Test key in storage for flagging default browser promo interaction. +NSString* const kUserHasInteractedWithFullscreenPromo = + @"userHasInteractedWithFullscreenPromo"; + +// Test key in storage for the timestamp of last default browser promo +// interaction. +NSString* const kLastTimeUserInteractedWithFullscreenPromo = + @"lastTimeUserInteractedWithFullscreenPromo"; + +// Test key in storage for counting past default browser promo interactions. +NSString* const kGenericPromoInteractionCount = @"genericPromoInteractionCount"; + class DefaultBrowserUtilsTest : public PlatformTest { protected: void SetUp() override { ClearDefaultBrowserPromoData(); } @@ -49,6 +71,17 @@ base::test::ScopedFeatureList feature_list_; }; +void SimulateUserInteractionWithFullscreenPromo(const base::TimeDelta& timeAgo, + int count) { + NSDictionary<NSString*, NSObject*>* values = @{ + kUserHasInteractedWithFullscreenPromo : @YES, + kLastTimeUserInteractedWithFullscreenPromo : + [[NSDate alloc] initWithTimeIntervalSinceNow:-timeAgo.InSecondsF()], + kGenericPromoInteractionCount : [NSNumber numberWithInt:count] + }; + SetValuesInStorage(values); +} + // Tests interesting information for each type. TEST_F(DefaultBrowserUtilsTest, LogInterestingActivityEach) { // General promo. @@ -137,8 +170,8 @@ TEST_F(DefaultBrowserUtilsTest, NonModalPromoCoolDownWithPriorInteraction) { EXPECT_FALSE(UserInNonModalPromoCooldown()); - SetObjectInStorageForKey(kLastTimeUserInteractedWithNonModalPromo, - [NSDate date]); + ResetStorageAndSetObjectForKey(kLastTimeUserInteractedWithNonModalPromo, + [NSDate date]); EXPECT_TRUE(UserInNonModalPromoCooldown()); } @@ -148,8 +181,8 @@ TEST_F(DefaultBrowserUtilsTest, NonModalPromoCoolDownWithoutPriorInteraction) { EXPECT_FALSE(UserInNonModalPromoCooldown()); - SetObjectInStorageForKey(kLastTimeUserInteractedWithFullscreenPromo, - [NSDate date]); + ResetStorageAndSetObjectForKey(kLastTimeUserInteractedWithFullscreenPromo, + [NSDate date]); EXPECT_TRUE(UserInNonModalPromoCooldown()); } @@ -236,7 +269,7 @@ TEST_F( DefaultBrowserUtilsTest, ManualHasRecentFirstPartyIntentLaunchesAndRecordsCurrentLaunchLessThan6Hours) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTimestampAppLastOpenedViaFirstPartyIntent, [[NSDate alloc] initWithTimeIntervalSinceNow:-kLessThan6Hours.InSecondsF()]); @@ -248,7 +281,7 @@ TEST_F( DefaultBrowserUtilsTest, ManualHasRecentFirstPartyIntentLaunchesAndRecordsCurrentLaunchMoreThan7Days) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTimestampAppLastOpenedViaFirstPartyIntent, [[NSDate alloc] initWithTimeIntervalSinceNow:-kMoreThan7Days.InSecondsF()]); @@ -260,7 +293,7 @@ TEST_F( DefaultBrowserUtilsTest, ManualHasRecentFirstPartyIntentLaunchesAndRecordsCurrentLaunchLessThan7DaysMoreThan6Hours) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTimestampAppLastOpenedViaFirstPartyIntent, [[NSDate alloc] initWithTimeIntervalSinceNow:-kLessThan7Days.InSecondsF()]); @@ -279,7 +312,7 @@ // Manually tests two consecutive pastes recorded within 7 days, should return // true. TEST_F(DefaultBrowserUtilsTest, ManualTwoConsecutivePastesUnder7Days) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTimestampLastValidURLPasted, [[NSDate alloc] initWithTimeIntervalSinceNow:-kLessThan7Days.InSecondsF()]); @@ -289,7 +322,7 @@ // Manually tests two consecutive pastes recorded with more than 7 days between, // should return false. TEST_F(DefaultBrowserUtilsTest, ManualTwoConsecutivePastesOver7Days) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTimestampLastValidURLPasted, [[NSDate alloc] initWithTimeIntervalSinceNow:-kMoreThan7Days.InSecondsF()]); @@ -308,7 +341,7 @@ // Manually tests that a recent event timestamp (less than 6 hours) has already // been recorded. TEST_F(DefaultBrowserUtilsTest, ManualHasRecentTimestampForKeyUnder6Hours) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTestTimestampKey, [[NSDate alloc] initWithTimeIntervalSinceNow:-kLessThan6Hours.InSecondsF()]); @@ -318,13 +351,86 @@ // Manually tests that no recent event timestamp (more than 6 hours) has already // been recorded. TEST_F(DefaultBrowserUtilsTest, ManualRecentTimestampForKeyOver6Hours) { - SetObjectInStorageForKey( + ResetStorageAndSetObjectForKey( kTestTimestampKey, [[NSDate alloc] initWithTimeIntervalSinceNow:-kMoreThan6Hours.InSecondsF()]); EXPECT_FALSE(HasRecentTimestampForKey(kTestTimestampKey)); } +// Tests that past interactions with the default browser promo are correctly +// detected when the sliding eligibility window experiment is disabled. +TEST_F(DefaultBrowserUtilsTest, + HasUserInteractedWithFullscreenPromoBeforeSlidingWindowDisabled) { + feature_list_.InitWithFeatures({/*enabled=*/}, + {/*disabled=*/feature_engagement:: + kDefaultBrowserEligibilitySlidingWindow}); + + // Test with multiple interactions. + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(kMoreThan6Hours, 1); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(kMoreThan14Days, 2); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + + // Test with a single, more distant interaction. + ClearDefaultBrowserPromoData(); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k6Months, 1); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + + // Test with a single, even more distant interaction. + ClearDefaultBrowserPromoData(); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k2Years, 1); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); +} + +// Tests that past interactions with the default browser promo are correctly +// detected when the sliding eligibility window experiment is enabled and set +// to 365 days. +TEST_F(DefaultBrowserUtilsTest, + HasUserInteractedWithFullscreenPromoBeforeSlidingWindowEnabled) { + base::FieldTrialParams feature_params; + feature_params["sliding-window-days"] = "365"; + feature_list_.InitAndEnableFeatureWithParameters( + feature_engagement::kDefaultBrowserEligibilitySlidingWindow, + feature_params); + + // Test with multiple interactions. + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(kMoreThan6Hours, 1); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(kMoreThan14Days, 2); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + + // Test with a single, more distant interaction (but still within the sliding + // window limit). + ClearDefaultBrowserPromoData(); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k6Months, 1); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + + // Test with a single interaction that's outside the sliding window limit. + ClearDefaultBrowserPromoData(); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k2Years, 1); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + + // Test with multiple interactions, some within and some outside the sliding + // window limit. + ClearDefaultBrowserPromoData(); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k5Years, 1); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k2Years, 2); + EXPECT_FALSE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(k6Months, 3); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); + SimulateUserInteractionWithFullscreenPromo(kMoreThan14Days, 4); + EXPECT_TRUE(HasUserInteractedWithFullscreenPromoBefore()); +} + // Test `CalculatePromoStatistics` when feature flag is disabled. TEST_F(DefaultBrowserUtilsTest, CalculatePromoStatisticsTest_FlagDisabled) { feature_list_.InitWithFeatures({}, @@ -367,8 +473,8 @@ NSTimeInterval secondsPerDay = 24 * 60 * 60; NSDate* yesterday = [[NSDate alloc] initWithTimeIntervalSinceNow:-secondsPerDay]; - SetObjectInStorageForKey(kLastTimeUserInteractedWithFullscreenPromo, - yesterday); + ResetStorageAndSetObjectForKey(kLastTimeUserInteractedWithFullscreenPromo, + yesterday); LogFullscreenDefaultBrowserPromoDisplayed();
diff --git a/ios/chrome/browser/flags/BUILD.gn b/ios/chrome/browser/flags/BUILD.gn index e8bbc1a..ddfd1b8 100644 --- a/ios/chrome/browser/flags/BUILD.gn +++ b/ios/chrome/browser/flags/BUILD.gn
@@ -59,7 +59,7 @@ "//ios/chrome/browser/bring_android_tabs/model:features", "//ios/chrome/browser/browsing_data/model:feature_flags", "//ios/chrome/browser/crash_report/model", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/drag_and_drop", "//ios/chrome/browser/find_in_page:util",
diff --git a/ios/chrome/browser/flags/about_flags.mm b/ios/chrome/browser/flags/about_flags.mm index f152e9a..849d999 100644 --- a/ios/chrome/browser/flags/about_flags.mm +++ b/ios/chrome/browser/flags/about_flags.mm
@@ -73,7 +73,7 @@ #import "ios/chrome/browser/bring_android_tabs/model/features.h" #import "ios/chrome/browser/browsing_data/model/browsing_data_features.h" #import "ios/chrome/browser/crash_report/model/features.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/default_browser/utils.h" #import "ios/chrome/browser/find_in_page/util.h" #import "ios/chrome/browser/flags/chrome_switches.h" @@ -1205,9 +1205,9 @@ flags_ui::kOsIos, FEATURE_VALUE_TYPE(kDefaultBrowserTriggerCriteriaExperiment)}, {"default-browser-video-in-settings", - flag_descriptions::kDBVideoInSettingsName, - flag_descriptions::kDBVideoInSettingsDescription, flags_ui::kOsIos, - FEATURE_VALUE_TYPE(kDBVideoInSettings)}, + flag_descriptions::kDefaultBrowserVideoInSettingsName, + flag_descriptions::kDefaultBrowserVideoInSettingsDescription, + flags_ui::kOsIos, FEATURE_VALUE_TYPE(kDefaultBrowserVideoInSettings)}, {"fullscreen-promo-on-omnibox-copy-paste", flag_descriptions::kFullScreenPromoOnOmniboxCopyPasteName, flag_descriptions::kFullScreenPromoOnOmniboxCopyPasteDescription, @@ -1675,6 +1675,10 @@ flag_descriptions::kIOSIncognitoDownloadsWarningName, flag_descriptions::kIOSIncognitoDownloadsWarningDescription, flags_ui::kOsIos, FEATURE_VALUE_TYPE(kIOSIncognitoDownloadsWarning)}, + {"omnibox-shortcuts-database-ios", + flag_descriptions::kOmniboxPopulateShortcutsDatabaseName, + flag_descriptions::kOmniboxPopulateShortcutsDatabaseDescription, + flags_ui::kOsIos, FEATURE_VALUE_TYPE(kOmniboxPopulateShortcutsDatabase)}, }; bool SkipConditionalFeatureEntry(const flags_ui::FeatureEntry& entry) {
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc index f7c067a..c2e03ffd 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.cc
@@ -286,9 +286,9 @@ "When enabled, Credential Provider Extension promo will be " "presented to eligible users."; -const char kDBVideoInSettingsName[] = +const char kDefaultBrowserVideoInSettingsName[] = "Show default browser video in settings experiment"; -const char kDBVideoInSettingsDescription[] = +const char kDefaultBrowserVideoInSettingsDescription[] = "When enabled, default browser video will be displayed to user in " "settings."; @@ -852,6 +852,12 @@ "Google tail non personalized search suggestions provided by a compact on " "device model."; +const char kOmniboxPopulateShortcutsDatabaseName[] = + "Omnibox shortcuts database"; +const char kOmniboxPopulateShortcutsDatabaseDescription[] = + "Enables storing successful query/match in the omnibox shortcut database " + "to provider better suggestions ranking."; + const char kOmniboxReportAssistedQueryStatsName[] = "Omnibox Assisted Query Stats param"; const char kOmniboxReportAssistedQueryStatsDescription[] =
diff --git a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h index 0035fe2..3f7652d3 100644 --- a/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h +++ b/ios/chrome/browser/flags/ios_chrome_flag_descriptions.h
@@ -236,8 +236,8 @@ extern const char kCredentialProviderExtensionPromoDescription[]; // Title and description for default browser video in settings experiment. -extern const char kDBVideoInSettingsName[]; -extern const char kDBVideoInSettingsDescription[]; +extern const char kDefaultBrowserVideoInSettingsName[]; +extern const char kDefaultBrowserVideoInSettingsDescription[]; // Title and description for the flag to enable the default browser blue dot // promo. @@ -730,6 +730,10 @@ extern const char kOmniboxOnFocusSuggestionsName[]; extern const char kOmniboxOnFocusSuggestionsDescription[]; +// Title and description for storing query/match in the shortcuts database. +extern const char kOmniboxPopulateShortcutsDatabaseName[]; +extern const char kOmniboxPopulateShortcutsDatabaseDescription[]; + // Title and description for assisted query stats param reporting. extern const char kOmniboxReportAssistedQueryStatsName[]; extern const char kOmniboxReportAssistedQueryStatsDescription[];
diff --git a/ios/chrome/browser/lens/BUILD.gn b/ios/chrome/browser/lens/BUILD.gn index daafebd..09b50cd 100644 --- a/ios/chrome/browser/lens/BUILD.gn +++ b/ios/chrome/browser/lens/BUILD.gn
@@ -6,6 +6,8 @@ sources = [ "lens_browser_agent.h", "lens_browser_agent.mm", + "lens_tab_helper.h", + "lens_tab_helper.mm", ] deps = [ "//components/search_engines", @@ -24,3 +26,19 @@ "//third_party/abseil-cpp:absl", ] } + +source_set("unit_tests") { + testonly = true + sources = [ "lens_tab_helper_unittest.mm" ] + deps = [ + ":lens", + "//base/test:test_support", + "//ios/chrome/browser/shared/model/browser_state:test_support", + "//ios/chrome/browser/shared/public/commands", + "//ios/chrome/browser/ui/lens:lens_entrypoint", + "//ios/testing:ocmock_support", + "//ios/web/public/test", + "//testing/gtest", + "//third_party/ocmock", + ] +}
diff --git a/ios/chrome/browser/lens/DEPS b/ios/chrome/browser/lens/DEPS index e2a46f39..9c35c01 100644 --- a/ios/chrome/browser/lens/DEPS +++ b/ios/chrome/browser/lens/DEPS
@@ -6,4 +6,7 @@ "^lens_browser_agent.mm": [ "+ios/chrome/browser/ui/lens/lens_entrypoint.h", ], + "^lens_tab_helper.mm": [ + "+ios/chrome/browser/ui/lens/lens_entrypoint.h", + ], }
diff --git a/ios/chrome/browser/lens/lens_tab_helper.h b/ios/chrome/browser/lens/lens_tab_helper.h new file mode 100644 index 0000000..6333b71 --- /dev/null +++ b/ios/chrome/browser/lens/lens_tab_helper.h
@@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_LENS_LENS_TAB_HELPER_H_ +#define IOS_CHROME_BROWSER_LENS_LENS_TAB_HELPER_H_ + +#import "ios/web/public/navigation/web_state_policy_decider.h" +#import "ios/web/public/web_state_user_data.h" +#import "third_party/abseil-cpp/absl/types/optional.h" + +enum class LensEntrypoint; +@protocol LensCommands; + +// A tab helper that handles navigation to Lens action links, i.e. +// links that start with googlechromeaction://lens, by potentially +// opening the Lens UI. +class LensTabHelper : public web::WebStatePolicyDecider, + public web::WebStateUserData<LensTabHelper> { + public: + ~LensTabHelper() override; + + LensTabHelper(const LensTabHelper&) = delete; + LensTabHelper& operator=(const LensTabHelper&) = delete; + + // Sets the Lens CommandDispatcher. + void SetLensCommandsHandler(id<LensCommands> commands_handler); + + // Returns the entry point that the googlechromeaction:// url path points to. + static absl::optional<LensEntrypoint> EntryPointForGoogleChromeActionURLPath( + NSString* path); + + // web::WebStatePolicyDecider: + void ShouldAllowRequest( + NSURLRequest* request, + web::WebStatePolicyDecider::RequestInfo request_info, + web::WebStatePolicyDecider::PolicyDecisionCallback callback) override; + + private: + explicit LensTabHelper(web::WebState* web_state); + + // Opens the Lens input selection UI with the given entry point. + void OpenLensInputSelection(LensEntrypoint entry_point); + + // Handler used to request showing the password bottom sheet. + __weak id<LensCommands> commands_handler_; + + friend class web::WebStateUserData<LensTabHelper>; + WEB_STATE_USER_DATA_KEY_DECL(); +}; + +#endif // IOS_CHROME_BROWSER_LENS_LENS_TAB_HELPER_H_
diff --git a/ios/chrome/browser/lens/lens_tab_helper.mm b/ios/chrome/browser/lens/lens_tab_helper.mm new file mode 100644 index 0000000..dd5a4b6b --- /dev/null +++ b/ios/chrome/browser/lens/lens_tab_helper.mm
@@ -0,0 +1,78 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/lens/lens_tab_helper.h" +#import "ios/chrome/browser/shared/public/commands/lens_commands.h" +#import "ios/chrome/browser/shared/public/commands/open_lens_input_selection_command.h" +#import "ios/chrome/browser/ui/lens/lens_entrypoint.h" +#import "ios/public/provider/chrome/browser/lens/lens_api.h" + +namespace { + +// The scheme for google chrome action URLs. +NSString* const kGoogleChromeActionScheme = @"googlechromeaction"; + +// The host for google chrome action Lens URLs. +NSString* const kLensHost = @"lens"; + +// The path for the web search bar entry point. The logging path is WebSearchBar +// while the url path should be web-search-box to match convention with other +// entry points. +NSString* const kWebSearchBarEntryPointPath = @"/web-search-box"; + +// The path for the search translate box entry point. +NSString* const kTranslateOneboxEntryPointPath = @"/translate-onebox"; + +} // namespace + +LensTabHelper::LensTabHelper(web::WebState* web_state) + : web::WebStatePolicyDecider(web_state) {} + +LensTabHelper::~LensTabHelper() = default; + +void LensTabHelper::SetLensCommandsHandler(id<LensCommands> commands_handler) { + commands_handler_ = commands_handler; +} + +absl::optional<LensEntrypoint> +LensTabHelper::EntryPointForGoogleChromeActionURLPath(NSString* path) { + if ([path caseInsensitiveCompare:kWebSearchBarEntryPointPath] == + NSOrderedSame) { + return LensEntrypoint::WebSearchBar; + } else if ([path caseInsensitiveCompare:kTranslateOneboxEntryPointPath] == + NSOrderedSame) { + return LensEntrypoint::TranslateOnebox; + } + return absl::nullopt; +} + +void LensTabHelper::ShouldAllowRequest( + NSURLRequest* request, + web::WebStatePolicyDecider::RequestInfo request_info, + web::WebStatePolicyDecider::PolicyDecisionCallback callback) { + if (request_info.target_frame_is_main && + [request.URL.scheme isEqualToString:kGoogleChromeActionScheme] && + [request.URL.host isEqualToString:kLensHost]) { + absl::optional<LensEntrypoint> entry_point = + EntryPointForGoogleChromeActionURLPath(request.URL.path); + if (entry_point) { + OpenLensInputSelection(entry_point.value()); + std::move(callback).Run(PolicyDecision::Cancel()); + return; + } + } + + std::move(callback).Run(PolicyDecision::Allow()); +} + +void LensTabHelper::OpenLensInputSelection(LensEntrypoint entry_point) { + OpenLensInputSelectionCommand* command = [[OpenLensInputSelectionCommand + alloc] + initWithEntryPoint:entry_point + presentationStyle:LensInputSelectionPresentationStyle::SlideFromRight + presentationCompletion:nil]; + [commands_handler_ openLensInputSelection:command]; +} + +WEB_STATE_USER_DATA_KEY_IMPL(LensTabHelper)
diff --git a/ios/chrome/browser/lens/lens_tab_helper_unittest.mm b/ios/chrome/browser/lens/lens_tab_helper_unittest.mm new file mode 100644 index 0000000..ba0467d6 --- /dev/null +++ b/ios/chrome/browser/lens/lens_tab_helper_unittest.mm
@@ -0,0 +1,154 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/lens/lens_tab_helper.h" + +#import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" +#import "ios/chrome/browser/shared/public/commands/lens_commands.h" +#import "ios/chrome/browser/shared/public/commands/open_lens_input_selection_command.h" +#import "ios/chrome/browser/ui/lens/lens_entrypoint.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" + +namespace { + +class LensTabHelperTest : public PlatformTest { + public: + LensTabHelperTest() + : task_environment_(web::WebTaskEnvironment::Options::IO_MAINLOOP) { + browser_state_ = TestChromeBrowserState::Builder().Build(); + + web::WebState::CreateParams params(browser_state_.get()); + web_state_ = web::WebState::Create(params); + + LensTabHelper::CreateForWebState(web_state_.get()); + } + + void SetUp() override { + PlatformTest::SetUp(); + + id dispatcher = [[CommandDispatcher alloc] init]; + dispatcher_ = dispatcher; + + helper_ = LensTabHelper::FromWebState(web_state_.get()); + ASSERT_TRUE(helper_); + + helper_->SetLensCommandsHandler(dispatcher); + } + + protected: + std::unique_ptr<TestChromeBrowserState> browser_state_; + std::unique_ptr<web::WebState> web_state_; + web::WebTaskEnvironment task_environment_; + LensTabHelper* helper_ = nullptr; + id handler_; + id dispatcher_; +}; + +// Test `ShouldAllowRequest` for the web search bar. +TEST_F(LensTabHelperTest, ShouldAllowRequest_WebSearchBar) { + NSURLRequest* request = [NSURLRequest + requestWithURL: + [NSURL URLWithString:@"googlechromeaction://lens/web-search-box"]]; + const web::WebStatePolicyDecider::RequestInfo request_info( + ui::PageTransition::PAGE_TRANSITION_LINK, + /*target_frame_is_main=*/true, + /*target_frame_is_cross_origin=*/false, + /*has_user_gesture=*/false); + __block bool callback_called = false; + __block web::WebStatePolicyDecider::PolicyDecision request_policy = + web::WebStatePolicyDecider::PolicyDecision::Allow(); + auto callback = + base::BindOnce(^(web::WebStatePolicyDecider::PolicyDecision decision) { + request_policy = decision; + callback_called = true; + }); + + id mock_lens_commands_handler = OCMProtocolMock(@protocol(LensCommands)); + [dispatcher_ startDispatchingToTarget:mock_lens_commands_handler + forProtocol:@protocol(LensCommands)]; + + OCMExpect([mock_lens_commands_handler + openLensInputSelection:[OCMArg + checkWithBlock:^( + OpenLensInputSelectionCommand* command) { + return command.entryPoint == + LensEntrypoint::WebSearchBar; + }]]); + + helper_->ShouldAllowRequest(request, request_info, std::move(callback)); + + EXPECT_OCMOCK_VERIFY(mock_lens_commands_handler); + EXPECT_TRUE(callback_called); + EXPECT_TRUE(request_policy.ShouldCancelNavigation()); +} + +// Test `ShouldAllowRequest` for the translate onebox. +TEST_F(LensTabHelperTest, ShouldAllowRequest_TranslateOnebox) { + NSURLRequest* request = [NSURLRequest + requestWithURL: + [NSURL URLWithString:@"googlechromeaction://lens/translate-onebox"]]; + const web::WebStatePolicyDecider::RequestInfo request_info( + ui::PageTransition::PAGE_TRANSITION_LINK, + /*target_frame_is_main=*/true, + /*target_frame_is_cross_origin=*/false, + /*has_user_gesture=*/false); + __block bool callback_called = false; + __block web::WebStatePolicyDecider::PolicyDecision request_policy = + web::WebStatePolicyDecider::PolicyDecision::Allow(); + auto callback = + base::BindOnce(^(web::WebStatePolicyDecider::PolicyDecision decision) { + request_policy = decision; + callback_called = true; + }); + + id mock_lens_commands_handler = OCMProtocolMock(@protocol(LensCommands)); + [dispatcher_ startDispatchingToTarget:mock_lens_commands_handler + forProtocol:@protocol(LensCommands)]; + + OCMExpect([mock_lens_commands_handler + openLensInputSelection:[OCMArg + checkWithBlock:^( + OpenLensInputSelectionCommand* command) { + return command.entryPoint == + LensEntrypoint::TranslateOnebox; + }]]); + + helper_->ShouldAllowRequest(request, request_info, std::move(callback)); + + EXPECT_OCMOCK_VERIFY(mock_lens_commands_handler); + EXPECT_TRUE(callback_called); + EXPECT_TRUE(request_policy.ShouldCancelNavigation()); +} + +// Test `EntryPointForGoogleChromeActionURLPath` for the web search bar. +TEST_F(LensTabHelperTest, EntryPointForGoogleChromeActionURLPath_WebSearchBar) { + absl::optional<LensEntrypoint> entry_point = + LensTabHelper::EntryPointForGoogleChromeActionURLPath(@"/web-search-box"); + ASSERT_TRUE(entry_point); + EXPECT_EQ(entry_point.value(), LensEntrypoint::WebSearchBar); +} + +// Test `EntryPointForGoogleChromeActionURLPath` for the translate onebox. +TEST_F(LensTabHelperTest, + EntryPointForGoogleChromeActionURLPath_TranslateOnebox) { + absl::optional<LensEntrypoint> entry_point = + LensTabHelper::EntryPointForGoogleChromeActionURLPath( + @"/translate-onebox"); + ASSERT_TRUE(entry_point); + EXPECT_EQ(entry_point.value(), LensEntrypoint::TranslateOnebox); +} + +// Test `EntryPointForGoogleChromeActionURLPath` for an invalid entry point. +TEST_F(LensTabHelperTest, EntryPointForGoogleChromeActionURLPath_Invalid) { + absl::optional<LensEntrypoint> entry_point = + LensTabHelper::EntryPointForGoogleChromeActionURLPath(@"/invalid"); + EXPECT_FALSE(entry_point); +} + +} // namespace
diff --git a/ios/chrome/browser/metrics/BUILD.gn b/ios/chrome/browser/metrics/BUILD.gn index 9e6df5fa..ef741765 100644 --- a/ios/chrome/browser/metrics/BUILD.gn +++ b/ios/chrome/browser/metrics/BUILD.gn
@@ -209,15 +209,14 @@ "//components/previous_session_info", "//components/ukm/ios:ukm_url_recorder", "//ios/chrome/browser/prerender", - "//ios/chrome/browser/sessions:restoration_agent", "//ios/chrome/browser/sessions:restoration_observer", + "//ios/chrome/browser/sessions:restoration_observer_helper", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/url:constants", "//ios/chrome/browser/shared/model/web_state_list", "//ios/components/webui:url_constants", "//ios/web", - "//ios/web/common:features", "//ios/web/common:user_agent", "//services/metrics/public/cpp:ukm_builders", "//ui/base",
diff --git a/ios/chrome/browser/metrics/model/BUILD.gn b/ios/chrome/browser/metrics/model/BUILD.gn index 3c0bf77..1fc32e08 100644 --- a/ios/chrome/browser/metrics/model/BUILD.gn +++ b/ios/chrome/browser/metrics/model/BUILD.gn
@@ -12,15 +12,14 @@ "//components/navigation_metrics", "//components/profile_metrics", "//ios/chrome/browser/crash_report/model", - "//ios/chrome/browser/sessions:restoration_agent", "//ios/chrome/browser/sessions:restoration_observer", + "//ios/chrome/browser/sessions:restoration_observer_helper", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/url:constants", "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/ui/util", "//ios/chrome/browser/web_state_list:session_metrics", - "//ios/web/common:features", "//ios/web/public", "//ios/web/public:web_state_observer", "//ios/web/public/navigation",
diff --git a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h index b9e18aa..76418e9d 100644 --- a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h +++ b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.h
@@ -39,8 +39,9 @@ void BrowserDestroyed(Browser* browser) override; // SessionRestorationObserver implementation. - void WillStartSessionRestoration() override; + void WillStartSessionRestoration(Browser* browser) override; void SessionRestorationFinished( + Browser* browser, const std::vector<web::WebState*>& restored_web_states) override; // web::WebStateObserver
diff --git a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm index 70f0eaf..7733ab7 100644 --- a/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm +++ b/ios/chrome/browser/metrics/model/web_state_list_metrics_browser_agent.mm
@@ -11,7 +11,7 @@ #import "components/navigation_metrics/navigation_metrics.h" #import "components/profile_metrics/browser_profile_type.h" #import "ios/chrome/browser/crash_report/model/crash_loop_detection_util.h" -#import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" +#import "ios/chrome/browser/sessions/session_restoration_observer_helper.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" #import "ios/chrome/browser/shared/model/url/chrome_url_constants.h" #import "ios/chrome/browser/shared/model/web_state_list/all_web_state_observation_forwarder.h" @@ -24,10 +24,6 @@ #import "ios/web/public/navigation/navigation_manager.h" #import "ios/web/public/web_state.h" -// To get access to UseSessionSerializationOptimizations(). -// TODO(crbug.com/1383087): remove once the feature is fully launched. -#import "ios/web/common/features.h" - BROWSER_USER_DATA_KEY_IMPL(WebStateListMetricsBrowserAgent) WebStateListMetricsBrowserAgent::WebStateListMetricsBrowserAgent( @@ -39,26 +35,38 @@ DCHECK(session_metrics_); browser->AddObserver(this); web_state_list_->AddObserver(this); - web_state_forwarder_.reset( - new AllWebStateObservationForwarder(web_state_list_, this)); + web_state_forwarder_ = + std::make_unique<AllWebStateObservationForwarder>(web_state_list_, this); - if (!web::features::UseSessionSerializationOptimizations()) { - SessionRestorationBrowserAgent* restoration_agent = - SessionRestorationBrowserAgent::FromBrowser(browser); - if (restoration_agent) { - restoration_agent->AddObserver(this); - } - } + AddSessionRestorationObserver(browser, this); } WebStateListMetricsBrowserAgent::~WebStateListMetricsBrowserAgent() = default; -void WebStateListMetricsBrowserAgent::WillStartSessionRestoration() { +#pragma mark - SessionRestorationObserver + +void WebStateListMetricsBrowserAgent::WillStartSessionRestoration( + Browser* browser) { + // Ignore the event if it does not correspond to the browser this + // object is bound to (which can happen with the optimised session + // storage code). + if (browser->GetWebStateList() != web_state_list_) { + return; + } + metric_collection_paused_ = true; } void WebStateListMetricsBrowserAgent::SessionRestorationFinished( + Browser* browser, const std::vector<web::WebState*>& restored_web_states) { + // Ignore the event if it does not correspond to the browser this + // object is bound to (which can happen with the optimised session + // storage code). + if (browser->GetWebStateList() != web_state_list_) { + return; + } + metric_collection_paused_ = false; } @@ -158,13 +166,7 @@ void WebStateListMetricsBrowserAgent::BrowserDestroyed(Browser* browser) { DCHECK_EQ(browser->GetWebStateList(), web_state_list_); - if (!web::features::UseSessionSerializationOptimizations()) { - SessionRestorationBrowserAgent* restoration_agent = - SessionRestorationBrowserAgent::FromBrowser(browser); - if (restoration_agent) { - restoration_agent->RemoveObserver(this); - } - } + RemoveSessionRestorationObserver(browser, this); web_state_forwarder_.reset(nullptr); web_state_list_->RemoveObserver(this);
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.h b/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.h index 468c1e1a..6d122bc 100644 --- a/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.h +++ b/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.h
@@ -157,7 +157,9 @@ const WebStateListStatus& status) override; // SessionRestorationObserver implementation. + void WillStartSessionRestoration(Browser* browser) override; void SessionRestorationFinished( + Browser* browser, const std::vector<web::WebState*>& restored_web_states) override; // Keep track of when the most recent tab restore begins, to record the time
diff --git a/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.mm b/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.mm index 772980b..2ee098d 100644 --- a/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.mm +++ b/ios/chrome/browser/metrics/tab_usage_recorder_browser_agent.mm
@@ -11,7 +11,7 @@ #import "components/ukm/ios/ukm_url_recorder.h" #import "ios/chrome/browser/prerender/prerender_service.h" #import "ios/chrome/browser/prerender/prerender_service_factory.h" -#import "ios/chrome/browser/sessions/session_restoration_browser_agent.h" +#import "ios/chrome/browser/sessions/session_restoration_observer_helper.h" #import "ios/chrome/browser/shared/model/browser/browser.h" #import "ios/chrome/browser/shared/model/url/chrome_url_constants.h" #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" @@ -23,10 +23,6 @@ #import "services/metrics/public/cpp/ukm_builders.h" #import "ui/base/page_transition_types.h" -// To get access to UseSessionSerializationOptimizations(). -// TODO(crbug.com/1383087): remove once the feature is fully launched. -#import "ios/web/common/features.h" - BROWSER_USER_DATA_KEY_IMPL(TabUsageRecorderBrowserAgent) TabUsageRecorderBrowserAgent::TabUsageRecorderBrowserAgent(Browser* browser) @@ -43,13 +39,7 @@ web_state->AddObserver(this); } - if (!web::features::UseSessionSerializationOptimizations()) { - SessionRestorationBrowserAgent* restoration_agent = - SessionRestorationBrowserAgent::FromBrowser(browser); - if (restoration_agent) { - restoration_agent->AddObserver(this); - } - } + AddSessionRestorationObserver(browser, this); // Register for backgrounding and foregrounding notifications. It is safe for // the block to capture a pointer to `this` as they are unregistered in the @@ -85,13 +75,7 @@ web_state_list_->RemoveObserver(this); browser->RemoveObserver(this); - if (!web::features::UseSessionSerializationOptimizations()) { - SessionRestorationBrowserAgent* restoration_agent = - SessionRestorationBrowserAgent::FromBrowser(browser); - if (restoration_agent) { - restoration_agent->RemoveObserver(this); - } - } + RemoveSessionRestorationObserver(browser, this); if (application_backgrounding_observer_) { [[NSNotificationCenter defaultCenter] removeObserver:application_backgrounding_observer_]; @@ -574,8 +558,23 @@ } } +#pragma mark - SessionRestorationObserver + +void TabUsageRecorderBrowserAgent::WillStartSessionRestoration( + Browser* browser) { + // Nothing to do. +} + void TabUsageRecorderBrowserAgent::SessionRestorationFinished( + Browser* browser, const std::vector<web::WebState*>& restored_web_states) { + // Ignore the event if it does not correspond to the browser this + // object is bound to (which can happen with the optimised session + // storage code). + if (browser->GetWebStateList() != web_state_list_) { + return; + } + InitialRestoredTabs(web_state_list_->GetActiveWebState(), restored_web_states); }
diff --git a/ios/chrome/browser/passwords/BUILD.gn b/ios/chrome/browser/passwords/BUILD.gn index eb373c1..1455f9d 100644 --- a/ios/chrome/browser/passwords/BUILD.gn +++ b/ios/chrome/browser/passwords/BUILD.gn
@@ -71,7 +71,7 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/autofill:autofill_shared", "//ios/chrome/browser/autofill/bottom_sheet", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/infobars", "//ios/chrome/browser/infobars:public", "//ios/chrome/browser/safe_browsing", @@ -267,7 +267,7 @@ "//components/ukm:test_support", "//ios/chrome/browser/autofill", "//ios/chrome/browser/autofill/bottom_sheet", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/passwords:store_factory", "//ios/chrome/browser/passwords/test", "//ios/chrome/browser/shared/model/browser/test:test_support", @@ -305,6 +305,7 @@ "//ios/chrome/app/strings", "//ios/chrome/browser/signin:fake_system_identity", "//ios/chrome/browser/ui/authentication:eg_test_support+eg2", + "//ios/chrome/browser/ui/autofill/form_input_accessory:eg_test_support+eg2", "//ios/chrome/browser/ui/infobars/banners:public", "//ios/chrome/browser/ui/passwords/bottom_sheet:eg_test_support+eg2", "//ios/chrome/test:eg_test_support+eg2",
diff --git a/ios/chrome/browser/passwords/DEPS b/ios/chrome/browser/passwords/DEPS index 6204ea6..8023f322 100644 --- a/ios/chrome/browser/passwords/DEPS +++ b/ios/chrome/browser/passwords/DEPS
@@ -4,7 +4,7 @@ "+ios/chrome/browser/infobars", "+ios/chrome/browser/safe_browsing", "+ios/chrome/browser/autofill", - "+ios/chrome/browser/credential_provider_promo/features.h", + "+ios/chrome/browser/credential_provider_promo/model/features.h", "+ios/chrome/browser/translate", "+ios/chrome/browser/webdata_services/model", ]
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_check_manager.h b/ios/chrome/browser/passwords/ios_chrome_password_check_manager.h index ee22995..4d4206de 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_check_manager.h +++ b/ios/chrome/browser/passwords/ios_chrome_password_check_manager.h
@@ -99,6 +99,7 @@ password_manager::BulkLeakCheckServiceInterface::State state) override; void OnCredentialDone(const password_manager::LeakCheckCredential& credential, password_manager::IsLeaked is_leaked) override; + void OnBulkCheckServiceShutDown() override; void OnWeakOrReuseCheckFinished();
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_check_manager.mm b/ios/chrome/browser/passwords/ios_chrome_password_check_manager.mm index b1e331db..83a1744 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_check_manager.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_check_manager.mm
@@ -225,6 +225,10 @@ } } +void IOSChromePasswordCheckManager::OnBulkCheckServiceShutDown() { + observed_bulk_leak_check_service_.Reset(); +} + void IOSChromePasswordCheckManager::OnWeakOrReuseCheckFinished() { last_completed_weak_or_reuse_check_ = base::Time::Now(); NotifyPasswordCheckStatusChanged();
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm index 11672b7..5f0f27f 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client.mm
@@ -28,7 +28,7 @@ #import "components/sync/service/sync_service.h" #import "components/translate/core/browser/translate_manager.h" #import "components/ukm/ios/ukm_url_recorder.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/passwords/ios_chrome_account_password_store_factory.h" #import "ios/chrome/browser/passwords/ios_chrome_password_change_success_tracker_factory.h" #import "ios/chrome/browser/passwords/ios_chrome_password_reuse_manager_factory.h"
diff --git a/ios/chrome/browser/passwords/ios_chrome_password_manager_client_unittest.mm b/ios/chrome/browser/passwords/ios_chrome_password_manager_client_unittest.mm index 0bbc81c..3fd03be 100644 --- a/ios/chrome/browser/passwords/ios_chrome_password_manager_client_unittest.mm +++ b/ios/chrome/browser/passwords/ios_chrome_password_manager_client_unittest.mm
@@ -18,7 +18,7 @@ #import "components/password_manager/core/browser/password_form_manager_for_ui.h" #import "components/password_manager/core/common/password_manager_pref_names.h" #import "components/prefs/testing_pref_service.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/passwords/password_controller.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h"
diff --git a/ios/chrome/browser/passwords/password_controller_egtest.mm b/ios/chrome/browser/passwords/password_controller_egtest.mm index db273049..87537c8 100644 --- a/ios/chrome/browser/passwords/password_controller_egtest.mm +++ b/ios/chrome/browser/passwords/password_controller_egtest.mm
@@ -18,6 +18,7 @@ #import "ios/chrome/browser/signin/fake_system_identity.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey.h" #import "ios/chrome/browser/ui/authentication/signin_earl_grey_ui_test_util.h" +#import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.h" #import "ios/chrome/browser/ui/infobars/banners/infobar_banner_constants.h" #import "ios/chrome/browser/ui/passwords/bottom_sheet/password_suggestion_bottom_sheet_app_interface.h" #import "ios/chrome/grit/ios_strings.h" @@ -128,6 +129,10 @@ config.features_enabled.push_back( password_manager::features::kIOSPasswordBottomSheet); } + if ([self isRunningTest:@selector(testFillPasswordFieldsOnForm)]) { + config.features_disabled.push_back( + password_manager::features::kIOSPasswordBottomSheet); + } return config; } @@ -140,6 +145,22 @@ [ChromeEarlGrey waitForWebStateContainingText:"Login form."]; } +// Verifies that the username and password fields are filled. +- (void)verifyFieldsHaveBeenFilledWithUsername:(NSString*)username + password:(NSString*)password { + // Verify that the username field has been filled. + NSString* condition = [NSString + stringWithFormat:@"window.document.getElementById('%s').value === '%@'", + kFormUsername, username]; + [ChromeEarlGrey waitForJavaScriptCondition:condition]; + + // Verify that the password field has been filled. + NSString* filledFieldCondition = [NSString + stringWithFormat:@"document.getElementById('%s').value === '%@'", + kFormPassword, password]; + [ChromeEarlGrey waitForJavaScriptCondition:filledFieldCondition]; +} + #pragma mark - Tests // Tests that save password prompt is shown on new login. @@ -261,6 +282,33 @@ performAction:grey_tap()]; } +- (void)testFillPasswordFieldsOnForm { + [FormInputAccessoryAppInterface setUpMockReauthenticationModule]; + [FormInputAccessoryAppInterface mockReauthenticationModuleExpectedResult: + ReauthenticationResult::kSuccess]; + + NSString* username = @"user"; + NSString* password = @"password"; + [PasswordManagerAppInterface + storeCredentialWithUsername:username + password:password + URL:net::NSURLWithGURL(self.testServer->GetURL( + "/simple_login_form.html"))]; + [self loadLoginPage]; + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElementWithId(kFormPassword)]; + + id<GREYMatcher> user_chip = grey_accessibilityLabel(@"user ••••••••"); + + [ChromeEarlGrey waitForUIElementToAppearWithMatcher:user_chip]; + + [[EarlGrey selectElementWithMatcher:user_chip] performAction:grey_tap()]; + + [self verifyFieldsHaveBeenFilledWithUsername:username password:password]; + + [FormInputAccessoryAppInterface removeMockReauthenticationModule]; +} + // Tests that update password prompt is shown on submitting the new password // for an already stored login. - (void)testUpdatePromptAppearsOnFormSubmission {
diff --git a/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm b/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm index b3735449..2bca4223 100644 --- a/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm +++ b/ios/chrome/browser/safe_browsing/ohttp_key_service_factory.mm
@@ -39,13 +39,11 @@ if (!safe_browsing_service) { return nullptr; } - // TODO(crbug.com/1468377): Pass through `variations_service` in - // `GetCountryCode` call. if (!base::FeatureList::IsEnabled(safe_browsing::kHashRealTimeOverOhttp) && !safe_browsing::hash_realtime_utils:: IsHashRealTimeLookupEligibleInSessionAndLocation( safe_browsing::hash_realtime_utils::GetCountryCode( - /*variations_service=*/nullptr))) { + GetApplicationContext()->GetVariationsService()))) { return nullptr; } ChromeBrowserState* chrome_browser_state =
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.h b/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.h index 8427e17..c34fb23b 100644 --- a/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.h +++ b/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.h
@@ -25,6 +25,7 @@ safe_browsing::RealTimeUrlLookupService* GetRealTimeUrlLookupService() override; safe_browsing::HashRealTimeService* GetHashRealTimeService() override; + variations::VariationsService* GetVariationsService() override; bool ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const override; void OnMainFrameUrlQueryCancellationDecided(web::WebState* web_state,
diff --git a/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.mm b/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.mm index 8825d8e7..9001113 100644 --- a/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.mm +++ b/ios/chrome/browser/safe_browsing/safe_browsing_client_impl.mm
@@ -40,6 +40,10 @@ return hash_real_time_service_; } +variations::VariationsService* SafeBrowsingClientImpl::GetVariationsService() { + return GetApplicationContext()->GetVariationsService(); +} + bool SafeBrowsingClientImpl::ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const { // Send do-not-proceed signal if the WebState is for a prerender tab.
diff --git a/ios/chrome/browser/safety_check/ios_chrome_safety_check_manager.mm b/ios/chrome/browser/safety_check/ios_chrome_safety_check_manager.mm index eb617fc..39c1d95 100644 --- a/ios/chrome/browser/safety_check/ios_chrome_safety_check_manager.mm +++ b/ios/chrome/browser/safety_check/ios_chrome_safety_check_manager.mm
@@ -71,6 +71,7 @@ pref_change_registrar_.RemoveAll(); pref_service_ = nullptr; local_pref_service_ = nullptr; + password_check_manager_observation_.Reset(); } void IOSChromeSafetyCheckManager::StartSafetyCheck() {
diff --git a/ios/chrome/browser/sessions/session_restoration_browser_agent.mm b/ios/chrome/browser/sessions/session_restoration_browser_agent.mm index 2e4dbd5..ab15de6 100644 --- a/ios/chrome/browser/sessions/session_restoration_browser_agent.mm +++ b/ios/chrome/browser/sessions/session_restoration_browser_agent.mm
@@ -252,7 +252,6 @@ restoring_session_ = true; for (auto& observer : observers_) { - observer.WillStartSessionRestoration(); observer.WillStartSessionRestoration(browser_); } @@ -283,7 +282,6 @@ } for (auto& observer : observers_) { - observer.SessionRestorationFinished(restored_web_states); observer.SessionRestorationFinished(browser_, restored_web_states); }
diff --git a/ios/chrome/browser/sessions/session_restoration_observer.h b/ios/chrome/browser/sessions/session_restoration_observer.h index 09885b4..f6e4e34 100644 --- a/ios/chrome/browser/sessions/session_restoration_observer.h +++ b/ios/chrome/browser/sessions/session_restoration_observer.h
@@ -19,22 +19,13 @@ public: SessionRestorationObserver() = default; - // Invoked before the session restoration starts. - // OBSOLETE: override `WillStartSessionRestoration(Browser*)` instead. - virtual void WillStartSessionRestoration() {} - - // Invoked when the session restoration is finished. - // OBSOLETE: override `SessionRestorationFinished(Browser*, ...)` instead. - virtual void SessionRestorationFinished( - const std::vector<web::WebState*>& restored_web_states) {} - // Invoked before the session restoration starts for `browser`. - virtual void WillStartSessionRestoration(Browser* browser) {} + virtual void WillStartSessionRestoration(Browser* browser) = 0; // Invoked when the session restoration is finished for `browser`. virtual void SessionRestorationFinished( Browser* browser, - const std::vector<web::WebState*>& restored_web_states) {} + const std::vector<web::WebState*>& restored_web_states) = 0; }; #endif // IOS_CHROME_BROWSER_SESSIONS_SESSION_RESTORATION_OBSERVER_H_
diff --git a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm index 9d4ac21..90086b2 100644 --- a/ios/chrome/browser/shared/model/prefs/browser_prefs.mm +++ b/ios/chrome/browser/shared/model/prefs/browser_prefs.mm
@@ -654,15 +654,17 @@ prefs->ClearPref(kDataSaverEnabled); // Added 10/2022. - if (prefs->HasPrefPath(prefs::kGoogleServicesLastAccountIdDeprecated)) { + if (prefs->HasPrefPath( + prefs::kGoogleServicesLastSyncingAccountIdDeprecated)) { std::string account_id = - prefs->GetString(prefs::kGoogleServicesLastAccountIdDeprecated); - prefs->ClearPref(prefs::kGoogleServicesLastAccountIdDeprecated); + prefs->GetString(prefs::kGoogleServicesLastSyncingAccountIdDeprecated); + prefs->ClearPref(prefs::kGoogleServicesLastSyncingAccountIdDeprecated); DCHECK(!base::Contains(account_id, '@')) - << "kGoogleServicesLastAccountId is not expected to be an email: " + << "kGoogleServicesLastSyncingAccountId is not expected to be an " + "email: " << account_id; if (!account_id.empty()) { - prefs->SetString(prefs::kGoogleServicesLastGaiaId, account_id); + prefs->SetString(prefs::kGoogleServicesLastSyncingGaiaId, account_id); } }
diff --git a/ios/chrome/browser/shared/public/features/features.h b/ios/chrome/browser/shared/public/features/features.h index 19d89af..bb12d6a 100644 --- a/ios/chrome/browser/shared/public/features/features.h +++ b/ios/chrome/browser/shared/public/features/features.h
@@ -215,7 +215,7 @@ BASE_DECLARE_FEATURE(kOnlyAccessClipboardAsync); // Feature flag that enables default browser video in settings experiment. -BASE_DECLARE_FEATURE(kDBVideoInSettings); +BASE_DECLARE_FEATURE(kDefaultBrowserVideoInSettings); // Feature flag that enables default browser promo to be displayed without // matching all the criteria and in depth metrics collection for the displayed
diff --git a/ios/chrome/browser/shared/public/features/features.mm b/ios/chrome/browser/shared/public/features/features.mm index 8f1bcea9..d3cf5b3 100644 --- a/ios/chrome/browser/shared/public/features/features.mm +++ b/ios/chrome/browser/shared/public/features/features.mm
@@ -255,8 +255,8 @@ BASE_FEATURE(kOnlyAccessClipboardAsync, "OnlyAccessClipboardAsync", base::FEATURE_DISABLED_BY_DEFAULT); -BASE_FEATURE(kDBVideoInSettings, - "DBVideoInSettings", +BASE_FEATURE(kDefaultBrowserVideoInSettings, + "DefaultBrowserVideoInSettings", base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kDefaultBrowserTriggerCriteriaExperiment, "DefaultBrowserTriggerCriteriaExperiment",
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.h b/ios/chrome/browser/shared/ui/symbols/symbol_names.h index 0d4b209..bf104a3 100644 --- a/ios/chrome/browser/shared/ui/symbols/symbol_names.h +++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
@@ -185,6 +185,7 @@ extern NSString* const kListBulletClipboard; extern NSString* const kListBulletRectangle; extern NSString* const kBoxTruckFill; +extern NSString* const kExclamationMarkBubbleSymbol; // Names of the default symbol being non-monochrome by default. When using them, // you probably want to set their color to monochrome.
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm index b51bcf0..14358c71 100644 --- a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm +++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
@@ -178,6 +178,7 @@ NSString* const kListBulletClipboard = @"list.bullet.clipboard"; NSString* const kListBulletRectangle = @"list.bullet.rectangle.portrait"; NSString* const kBoxTruckFill = @"box.truck.fill"; +NSString* const kExclamationMarkBubbleSymbol = @"exclamationmark.bubble"; // Names of the default symbol being non-monochrome by default. When using them, // you probably want to set their color to monochrome.
diff --git a/ios/chrome/browser/sync/model/BUILD.gn b/ios/chrome/browser/sync/model/BUILD.gn index f1163695..d68e6cd 100644 --- a/ios/chrome/browser/sync/model/BUILD.gn +++ b/ios/chrome/browser/sync/model/BUILD.gn
@@ -88,7 +88,7 @@ "//ios/chrome/browser/sync/model/glue", "//ios/chrome/browser/sync/model/sessions", "//ios/chrome/browser/tabs", - "//ios/chrome/browser/trusted_vault", + "//ios/chrome/browser/trusted_vault/model", "//ios/chrome/browser/webdata_services/model", "//ios/chrome/common", "//ios/components/webui:url_constants",
diff --git a/ios/chrome/browser/sync/model/DEPS b/ios/chrome/browser/sync/model/DEPS index da17c0a..e3ea6e8 100644 --- a/ios/chrome/browser/sync/model/DEPS +++ b/ios/chrome/browser/sync/model/DEPS
@@ -18,7 +18,7 @@ "+ios/chrome/browser/metrics", "+ios/chrome/browser/sessions", "+ios/chrome/browser/settings/sync", - "+ios/chrome/browser/trusted_vault", + "+ios/chrome/browser/trusted_vault/model", "+ios/chrome/browser/dom_distiller", "+ios/chrome/browser/complex_tasks/model", "+ios/chrome/browser/supervised_user",
diff --git a/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm index 114823c..51ccbf693 100644 --- a/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm +++ b/ios/chrome/browser/sync/model/ios_chrome_sync_client.mm
@@ -63,7 +63,7 @@ #import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/chrome/browser/sync/model/session_sync_service_factory.h" #import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" -#import "ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h" +#import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h" #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h" #import "ios/chrome/common/channel_info.h" #import "ios/web/public/thread/web_task_traits.h"
diff --git a/ios/chrome/browser/sync/model/sync_service_factory.mm b/ios/chrome/browser/sync/model/sync_service_factory.mm index 299f21bb..c909f63 100644 --- a/ios/chrome/browser/sync/model/sync_service_factory.mm +++ b/ios/chrome/browser/sync/model/sync_service_factory.mm
@@ -56,7 +56,7 @@ #import "ios/chrome/browser/sync/model/send_tab_to_self_sync_service_factory.h" #import "ios/chrome/browser/sync/model/session_sync_service_factory.h" #import "ios/chrome/browser/sync/model/sync_invalidations_service_factory.h" -#import "ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h" +#import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h" #import "ios/chrome/browser/webdata_services/model/web_data_service_factory.h" #import "ios/chrome/common/channel_info.h" #import "ios/web/public/thread/web_task_traits.h"
diff --git a/ios/chrome/browser/tabs/BUILD.gn b/ios/chrome/browser/tabs/BUILD.gn index 6fd1916..c2a8c7e7 100644 --- a/ios/chrome/browser/tabs/BUILD.gn +++ b/ios/chrome/browser/tabs/BUILD.gn
@@ -78,6 +78,7 @@ "//ios/chrome/browser/infobars/overlays", "//ios/chrome/browser/itunes_urls", "//ios/chrome/browser/language", + "//ios/chrome/browser/lens", "//ios/chrome/browser/link_to_text", "//ios/chrome/browser/main", "//ios/chrome/browser/metrics",
diff --git a/ios/chrome/browser/tabs/tab_helper_util.mm b/ios/chrome/browser/tabs/tab_helper_util.mm index 222ec98..bd1717f 100644 --- a/ios/chrome/browser/tabs/tab_helper_util.mm +++ b/ios/chrome/browser/tabs/tab_helper_util.mm
@@ -54,6 +54,7 @@ #import "ios/chrome/browser/infobars/overlays/infobar_overlay_tab_helper.h" #import "ios/chrome/browser/infobars/overlays/translate_overlay_tab_helper.h" #import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h" +#import "ios/chrome/browser/lens/lens_tab_helper.h" #import "ios/chrome/browser/link_to_text/link_to_text_tab_helper.h" #import "ios/chrome/browser/metrics/pageload_foreground_duration_tab_helper.h" #import "ios/chrome/browser/ntp/features.h" @@ -143,6 +144,11 @@ commerce::CommerceTabHelper::CreateForWebState( web_state, is_off_the_record, commerce::ShoppingServiceFactory::GetForBrowserState(browser_state)); + + // Since LensTabHelper listens for a custom scheme, it needs to be + // created before AppLauncherTabHelper, which will filter out + // unhandled schemes. + LensTabHelper::CreateForWebState(web_state); AppLauncherTabHelper::CreateForWebState( web_state, [[AppLauncherAbuseDetector alloc] init]); security_interstitials::IOSBlockingPageTabHelper::CreateForWebState(
diff --git a/ios/chrome/browser/trusted_vault/BUILD.gn b/ios/chrome/browser/trusted_vault/model/BUILD.gn similarity index 96% rename from ios/chrome/browser/trusted_vault/BUILD.gn rename to ios/chrome/browser/trusted_vault/model/BUILD.gn index 52a6546..fe444eb 100644 --- a/ios/chrome/browser/trusted_vault/BUILD.gn +++ b/ios/chrome/browser/trusted_vault/model/BUILD.gn
@@ -2,7 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. -source_set("trusted_vault") { +source_set("model") { sources = [ "ios_trusted_vault_client.h", "ios_trusted_vault_client.mm",
diff --git a/ios/chrome/browser/trusted_vault/DEPS b/ios/chrome/browser/trusted_vault/model/DEPS similarity index 100% rename from ios/chrome/browser/trusted_vault/DEPS rename to ios/chrome/browser/trusted_vault/model/DEPS
diff --git a/ios/chrome/browser/trusted_vault/OWNERS b/ios/chrome/browser/trusted_vault/model/OWNERS similarity index 100% rename from ios/chrome/browser/trusted_vault/OWNERS rename to ios/chrome/browser/trusted_vault/model/OWNERS
diff --git a/ios/chrome/browser/trusted_vault/ios_trusted_vault_client.h b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h similarity index 92% rename from ios/chrome/browser/trusted_vault/ios_trusted_vault_client.h rename to ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h index a07aa9f6..ed240be8 100644 --- a/ios/chrome/browser/trusted_vault/ios_trusted_vault_client.h +++ b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.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 IOS_CHROME_BROWSER_TRUSTED_VAULT_IOS_TRUSTED_VAULT_CLIENT_H_ -#define IOS_CHROME_BROWSER_TRUSTED_VAULT_IOS_TRUSTED_VAULT_CLIENT_H_ +#ifndef IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_CLIENT_H_ +#define IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_CLIENT_H_ #include "base/memory/raw_ptr.h" #include "base/memory/scoped_refptr.h" @@ -76,4 +76,4 @@ base::WeakPtrFactory<IOSTrustedVaultClient> weak_ptr_factory_{this}; }; -#endif // IOS_CHROME_BROWSER_TRUSTED_VAULT_IOS_TRUSTED_VAULT_CLIENT_H_ +#endif // IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_CLIENT_H_
diff --git a/ios/chrome/browser/trusted_vault/ios_trusted_vault_client.mm b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.mm similarity index 98% rename from ios/chrome/browser/trusted_vault/ios_trusted_vault_client.mm rename to ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.mm index d558906..614af915 100644 --- a/ios/chrome/browser/trusted_vault/ios_trusted_vault_client.mm +++ b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.mm
@@ -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 "ios/chrome/browser/trusted_vault/ios_trusted_vault_client.h" +#import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h" #import "base/feature_list.h" #import "base/functional/callback_helpers.h"
diff --git a/ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h similarity index 85% rename from ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h rename to ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h index 0a7cb56..5aa45952 100644 --- a/ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h +++ b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.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 IOS_CHROME_BROWSER_TRUSTED_VAULT_IOS_TRUSTED_VAULT_SERVICE_FACTORY_H_ -#define IOS_CHROME_BROWSER_TRUSTED_VAULT_IOS_TRUSTED_VAULT_SERVICE_FACTORY_H_ +#ifndef IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_SERVICE_FACTORY_H_ +#define IOS_CHROME_BROWSER_TRUSTED_VAULT_MODEL_IOS_TRUSTED_VAULT_SERVICE_FACTORY_H_ #include <memory>
diff --git a/ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.mm b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.mm similarity index 93% rename from ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.mm rename to ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.mm index dfeeee66..6c1ddf4 100644 --- a/ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.mm +++ b/ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.mm
@@ -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 "ios/chrome/browser/trusted_vault/ios_trusted_vault_service_factory.h" +#import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_service_factory.h" #import "base/no_destructor.h" #import "components/keyed_service/ios/browser_state_dependency_manager.h" @@ -12,7 +12,7 @@ #import "ios/chrome/browser/signin/chrome_account_manager_service_factory.h" #import "ios/chrome/browser/signin/identity_manager_factory.h" #import "ios/chrome/browser/signin/trusted_vault_client_backend_factory.h" -#import "ios/chrome/browser/trusted_vault/ios_trusted_vault_client.h" +#import "ios/chrome/browser/trusted_vault/model/ios_trusted_vault_client.h" #import "services/network/public/cpp/shared_url_loader_factory.h" // static
diff --git a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm index 5879dd07..f8d3a526 100644 --- a/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm +++ b/ios/chrome/browser/ui/authentication/authentication_flow_performer.mm
@@ -221,7 +221,7 @@ // previously syncing account (if any). lastSyncingEmail = base::SysUTF8ToNSString(browserState->GetPrefs()->GetString( - prefs::kGoogleServicesLastUsername)); + prefs::kGoogleServicesLastSyncingUsername)); } if (authenticationService->HasPrimaryIdentityManaged( @@ -304,19 +304,19 @@ - (BOOL)shouldHandleMergeCaseForIdentity:(id<SystemIdentity>)identity browserStatePrefs:(PrefService*)prefs { const std::string lastSignedInGaiaId = - prefs->GetString(prefs::kGoogleServicesLastGaiaId); + prefs->GetString(prefs::kGoogleServicesLastSyncingGaiaId); if (!lastSignedInGaiaId.empty()) { // Merge case exists if the id of the previously signed in account is // different from the one of the account being signed in. return lastSignedInGaiaId != base::SysNSStringToUTF8(identity.gaiaID); } - // kGoogleServicesLastGaiaId pref might not have been populated yet, - // check the old kGoogleServicesLastUsername pref. + // kGoogleServicesLastSyncingGaiaId pref might not have been populated yet, + // check the old kGoogleServicesLastSyncingUsername pref. const std::string currentSignedInEmail = base::SysNSStringToUTF8(identity.userEmail); const std::string lastSignedInEmail = - prefs->GetString(prefs::kGoogleServicesLastUsername); + prefs->GetString(prefs::kGoogleServicesLastSyncingUsername); return !lastSignedInEmail.empty() && !gaia::AreEmailsSame(currentSignedInEmail, lastSignedInEmail); }
diff --git a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm index 20d5220..a394d75f 100644 --- a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm +++ b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_coordinator.mm
@@ -120,8 +120,8 @@ case AddAccountSigninIntent::kSigninAndSyncReauth: DUMP_WILL_BE_CHECK(primaryAccount.IsEmpty()) << base::SysNSStringToUTF8([self description]); - std::string userEmailString = - browserPrefService->GetString(prefs::kGoogleServicesLastUsername); + std::string userEmailString = browserPrefService->GetString( + prefs::kGoogleServicesLastSyncingUsername); // Note(crbug/1443096): Gracefully handle an empty `userEmailString` by // showing the sign-in screen without a prefilled email. if (!userEmailString.empty()) {
diff --git a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_manager_unittest.mm b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_manager_unittest.mm index 1fa7d013..e3d1bde4 100644 --- a/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_manager_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/add_account_signin/add_account_signin_manager_unittest.mm
@@ -74,8 +74,8 @@ PlatformTest::SetUp(); PrefService* prefs = browser_state_->GetPrefs(); - prefs->SetString(prefs::kGoogleServicesLastUsername, kTestEmail); - prefs->SetString(prefs::kGoogleServicesLastGaiaId, kTestGaiaID); + prefs->SetString(prefs::kGoogleServicesLastSyncingUsername, kTestEmail); + prefs->SetString(prefs::kGoogleServicesLastSyncingGaiaId, kTestGaiaID); base_view_controller_ = [[UIViewController alloc] init]; base_view_controller_.view.backgroundColor = UIColor.blueColor; @@ -223,8 +223,8 @@ TEST_F(AddAccountSigninManagerTest, AddAccountWithoutEmailWithSuccessNoLastKnowSyncAccount) { PrefService* prefs = browser_state_->GetPrefs(); - prefs->ClearPref(prefs::kGoogleServicesLastUsername); - prefs->ClearPref(prefs::kGoogleServicesLastGaiaId); + prefs->ClearPref(prefs::kGoogleServicesLastSyncingUsername); + prefs->ClearPref(prefs::kGoogleServicesLastSyncingGaiaId); // Verify that completion was called with canceled result state. FakeSystemIdentityInteractionManager.identity = fake_identity_;
diff --git a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm index a451e6d..9926471 100644 --- a/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm +++ b/ios/chrome/browser/ui/authentication/signin/advanced_settings_signin/advanced_settings_signin_mediator_unittest.mm
@@ -72,9 +72,10 @@ PrefService* GetPrefService() { TestingPrefServiceSimple* prefs = new TestingPrefServiceSimple(); PrefRegistrySimple* registry = prefs->registry(); - registry->RegisterStringPref(prefs::kGoogleServicesLastUsername, + registry->RegisterStringPref(prefs::kGoogleServicesLastSyncingUsername, kTestEmail); - registry->RegisterStringPref(prefs::kGoogleServicesLastGaiaId, kTestGaiaID); + registry->RegisterStringPref(prefs::kGoogleServicesLastSyncingGaiaId, + kTestGaiaID); return prefs; }
diff --git a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm index b88cfe2c..ad35647 100644 --- a/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm +++ b/ios/chrome/browser/ui/authentication/signin_earl_grey_app_interface.mm
@@ -106,7 +106,8 @@ std::string emailAddress = base::SysNSStringToUTF8(identity.userEmail); PrefService* prefService = chrome_test_util::GetOriginalBrowserState()->GetPrefs(); - prefService->SetString(prefs::kGoogleServicesLastUsername, emailAddress); + prefService->SetString(prefs::kGoogleServicesLastSyncingUsername, + emailAddress); ShowSigninCommand* command = [[ShowSigninCommand alloc] initWithOperation:AuthenticationOperation::kSigninAndSyncReauth accessPoint:signin_metrics::AccessPoint::
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn b/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn index c56f23d..3890c4d 100644 --- a/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/BUILD.gn
@@ -21,6 +21,7 @@ "form_suggestion_view.mm", ] deps = [ + ":common", "//base", "//components/autofill/core/browser", "//components/autofill/ios/browser", @@ -89,3 +90,43 @@ "//third_party/ocmock", ] } + +source_set("common") { + sources = [ + "scoped_form_input_accessory_reauth_module_override.h", + "scoped_form_input_accessory_reauth_module_override.mm", + ] + deps = [ + "//base", + "//ios/chrome/common/ui/reauthentication", + ] +} + +source_set("eg_app_support+eg2") { + configs += [ "//build/config/ios:xctest_config" ] + testonly = true + sources = [ + "form_input_accessory_app_interface.h", + "form_input_accessory_app_interface.mm", + ] + deps = [ + ":common", + "//base", + "//ios/chrome/common/ui/reauthentication", + "//ios/chrome/test/app:test_support", + ] +} + +source_set("eg_test_support+eg2") { + configs += [ "//build/config/ios:xctest_config" ] + testonly = true + + sources = [ + "form_input_accessory_app_interface.h", + "form_input_accessory_app_interface_stub.mm", + ] + deps = [ + "//ios/chrome/common/ui/reauthentication", + "//ios/testing/earl_grey:eg_test_support+eg2", + ] +}
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.h b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.h new file mode 100644 index 0000000..0388b7a --- /dev/null +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.h
@@ -0,0 +1,24 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_FORM_INPUT_ACCESSORY_APP_INTERFACE_H_ +#define IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_FORM_INPUT_ACCESSORY_APP_INTERFACE_H_ + +#import "ios/chrome/common/ui/reauthentication/reauthentication_protocol.h" + +// FormInputAccessoryAppInterface contains the app-side +// implementation for helpers. These helpers are compiled into +// the app binary and can be called from either app or test code. +@interface FormInputAccessoryAppInterface : NSObject + +// Sets a re-authentication mock (i.e. what asks user for fingerprint to +// view password) and its options for next test. ++ (void)setUpMockReauthenticationModule; ++ (void)mockReauthenticationModuleExpectedResult: + (ReauthenticationResult)expectedResult; ++ (void)removeMockReauthenticationModule; + +@end + +#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_FORM_INPUT_ACCESSORY_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.mm new file mode 100644 index 0000000..cae4c6f --- /dev/null +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.mm
@@ -0,0 +1,60 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.h" + +#import "base/apple/foundation_util.h" +#import "ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h" +#import "ios/chrome/test/app/chrome_test_util.h" +#import "ios/chrome/test/app/mock_reauthentication_module.h" +#import "ios/chrome/test/app/password_test_util.h" + +using chrome_test_util:: + SetUpAndReturnMockReauthenticationModuleForFormInputAccessory; + +@interface FormInputAccessoryAppInterface () { + std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride> + _scopedReauthOverride; +} + +@end + +@implementation FormInputAccessoryAppInterface + ++ (instancetype)sharedInstance { + static FormInputAccessoryAppInterface* instance; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + instance = [[FormInputAccessoryAppInterface alloc] init]; + }); + return instance; +} + ++ (std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride>&) + scopedReauthOverride { + return [FormInputAccessoryAppInterface sharedInstance]->_scopedReauthOverride; +} + ++ (void)setUpMockReauthenticationModule { + [FormInputAccessoryAppInterface scopedReauthOverride] = + SetUpAndReturnMockReauthenticationModuleForFormInputAccessory(); +} + ++ (void)mockReauthenticationModuleExpectedResult: + (ReauthenticationResult)expectedResult { + std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride>& + scopedReauthOverride = + [FormInputAccessoryAppInterface scopedReauthOverride]; + CHECK(scopedReauthOverride); + MockReauthenticationModule* mockModule = + base::apple::ObjCCastStrict<MockReauthenticationModule>( + scopedReauthOverride->module); + mockModule.expectedResult = expectedResult; +} + ++ (void)removeMockReauthenticationModule { + [FormInputAccessoryAppInterface scopedReauthOverride] = nullptr; +} + +@end
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface_stub.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface_stub.mm new file mode 100644 index 0000000..97c8acd --- /dev/null +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface_stub.mm
@@ -0,0 +1,9 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_app_interface.h" + +#import "ios/testing/earl_grey/earl_grey_test.h" + +GREY_STUB_CLASS_IN_APP_MAIN_QUEUE(FormInputAccessoryAppInterface)
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm index 3e97c7e..a9164bc 100644 --- a/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_mediator.mm
@@ -29,6 +29,7 @@ #import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_chromium_text_data.h" #import "ios/chrome/browser/ui/autofill/form_input_accessory/form_input_accessory_consumer.h" #import "ios/chrome/browser/ui/autofill/form_input_accessory/form_suggestion_view.h" +#import "ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h" #import "ios/chrome/common/ui/elements/form_input_accessory_view.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_event.h" #import "ios/chrome/common/ui/reauthentication/reauthentication_module.h" @@ -449,6 +450,14 @@ #pragma mark - Private +// Returns the reauthentication module, which can be an override for testing +// purposes. +- (ReauthenticationModule*)reauthenticationModule { + return ScopedFormInputAccessoryReauthModuleOverride::instance + ? ScopedFormInputAccessoryReauthModuleOverride::instance->module + : _reauthenticationModule; +} + - (void)updateSuggestionsIfNeeded { if (_hasLastSeenParams && _webState) { [self retrieveSuggestionsForForm:_lastSeenParams webState:_webState];
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h b/ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h new file mode 100644 index 0000000..918996fa --- /dev/null +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h
@@ -0,0 +1,38 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_SCOPED_FORM_INPUT_ACCESSORY_REAUTH_MODULE_OVERRIDE_H_ +#define IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_SCOPED_FORM_INPUT_ACCESSORY_REAUTH_MODULE_OVERRIDE_H_ + +#import "base/memory/raw_ptr.h" + +@protocol ReauthenticationProtocol; + +// Util class enabling a global override of the Reauthentication Module used in +// newly-constructed FormInputAccessoryCoordinator, for testing purposes only. +// Only one ScopedFormInputAccessoryReauthModuleOverride scope should be used at +// any given time, these scopes can't be nested. +class ScopedFormInputAccessoryReauthModuleOverride { + public: + ~ScopedFormInputAccessoryReauthModuleOverride(); + + // Creates a scoped override so that the provided fake/mock/disarmed/etc + // reauthentication module will be used in place of the production + // implementation. + // FormInputAccessoryMediator objects will use `module` as their + // reauthentication module until the override is destroyed. + static std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride> + MakeAndArmForTesting(id<ReauthenticationProtocol> module); + + // Singleton instance of this class. + static raw_ptr<ScopedFormInputAccessoryReauthModuleOverride> instance; + + // The module to be used. + id<ReauthenticationProtocol> module; + + private: + ScopedFormInputAccessoryReauthModuleOverride() = default; +}; + +#endif // IOS_CHROME_BROWSER_UI_AUTOFILL_FORM_INPUT_ACCESSORY_SCOPED_FORM_INPUT_ACCESSORY_REAUTH_MODULE_OVERRIDE_H_
diff --git a/ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.mm b/ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.mm new file mode 100644 index 0000000..185c40ce --- /dev/null +++ b/ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.mm
@@ -0,0 +1,31 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h" + +#import "base/check.h" +#import "ios/chrome/common/ui/reauthentication/reauthentication_module.h" + +// static +raw_ptr<ScopedFormInputAccessoryReauthModuleOverride> + ScopedFormInputAccessoryReauthModuleOverride::instance; + +// static +std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride> +ScopedFormInputAccessoryReauthModuleOverride::MakeAndArmForTesting( + id<ReauthenticationProtocol> module) { + DCHECK(!instance); + // Using new instead of make_unique to access private constructor. + std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride> new_instance( + new ScopedFormInputAccessoryReauthModuleOverride); + new_instance->module = module; + instance = new_instance.get(); + return new_instance; +} + +ScopedFormInputAccessoryReauthModuleOverride:: + ~ScopedFormInputAccessoryReauthModuleOverride() { + DCHECK(instance == this); + instance = nullptr; +}
diff --git a/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm b/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm index 91eaf4c..3fd8a76 100644 --- a/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm +++ b/ios/chrome/browser/ui/bookmarks/home/bookmark_promo_controller.mm
@@ -114,7 +114,7 @@ if (base::FeatureList::IsEnabled(syncer::kEnableBookmarksAccountStorage)) { PrefService* prefs = browserState->GetPrefs(); const std::string lastSignedInGaiaId = - prefs->GetString(prefs::kGoogleServicesLastGaiaId); + prefs->GetString(prefs::kGoogleServicesLastSyncingGaiaId); // If the last signed-in user did not remove data during sign-out, don't // show the signin promo. if (lastSignedInGaiaId.empty()) {
diff --git a/ios/chrome/browser/ui/browser_view/BUILD.gn b/ios/chrome/browser/ui/browser_view/BUILD.gn index 0765177..b49872a7 100644 --- a/ios/chrome/browser/ui/browser_view/BUILD.gn +++ b/ios/chrome/browser/ui/browser_view/BUILD.gn
@@ -54,7 +54,7 @@ "//ios/chrome/browser/commerce/model/push_notification", "//ios/chrome/browser/content_settings/model", "//ios/chrome/browser/crash_report/model", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/download", "//ios/chrome/browser/favicon", @@ -69,6 +69,7 @@ "//ios/chrome/browser/intents:intents_donation_helper", "//ios/chrome/browser/itunes_urls", "//ios/chrome/browser/language", + "//ios/chrome/browser/lens", "//ios/chrome/browser/link_to_text", "//ios/chrome/browser/main", "//ios/chrome/browser/metrics:metrics_browser_agent", @@ -238,6 +239,7 @@ "//ios/components/security_interstitials", "//ios/components/webui:url_constants", "//ios/public/provider/chrome/browser/fullscreen:fullscreen_api", + "//ios/public/provider/chrome/browser/lens:lens_api", "//ios/public/provider/chrome/browser/signin:choice_api", "//ios/public/provider/chrome/browser/text_zoom:text_zoom_api", "//ios/public/provider/chrome/browser/user_feedback:user_feedback_api",
diff --git a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm index ad20d4c9..0f5d5a4 100644 --- a/ios/chrome/browser/ui/browser_view/browser_coordinator.mm +++ b/ios/chrome/browser/ui/browser_view/browser_coordinator.mm
@@ -27,7 +27,7 @@ #import "ios/chrome/browser/app_launcher/model/app_launcher_tab_helper.h" #import "ios/chrome/browser/commerce/model/push_notification/push_notification_feature.h" #import "ios/chrome/browser/content_settings/model/host_content_settings_map_factory.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/default_browser/utils.h" #import "ios/chrome/browser/download/download_directory_util.h" #import "ios/chrome/browser/download/external_app_util.h"
diff --git a/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm b/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm index a045937..a0c1da4c 100644 --- a/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm +++ b/ios/chrome/browser/ui/browser_view/tab_lifecycle_mediator.mm
@@ -13,6 +13,7 @@ #import "ios/chrome/browser/follow/follow_iph_presenter.h" #import "ios/chrome/browser/follow/follow_tab_helper.h" #import "ios/chrome/browser/itunes_urls/itunes_urls_handler_tab_helper.h" +#import "ios/chrome/browser/lens/lens_tab_helper.h" #import "ios/chrome/browser/ntp/new_tab_page_tab_helper.h" #import "ios/chrome/browser/overscroll_actions/overscroll_actions_tab_helper.h" #import "ios/chrome/browser/parcel_tracking/parcel_tracking_util.h" @@ -21,6 +22,7 @@ #import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" #import "ios/chrome/browser/shared/public/commands/autofill_bottom_sheet_commands.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" +#import "ios/chrome/browser/shared/public/commands/lens_commands.h" #import "ios/chrome/browser/shared/public/commands/mini_map_commands.h" #import "ios/chrome/browser/shared/public/commands/parcel_tracking_opt_in_commands.h" #import "ios/chrome/browser/shared/public/commands/web_content_commands.h" @@ -39,6 +41,7 @@ #import "ios/chrome/browser/web_state_list/web_state_dependency_installer_bridge.h" #import "ios/chrome/browser/webui/model/net_export_tab_helper.h" #import "ios/chrome/browser/webui/model/net_export_tab_helper_delegate.h" +#import "ios/public/provider/chrome/browser/lens/lens_api.h" #import "ui/base/device_form_factor.h" @interface TabLifecycleMediator () <DependencyInstalling> @@ -89,6 +92,12 @@ bottomSheetTabHelper->SetAutofillBottomSheetHandler( HandlerForProtocol(_commandDispatcher, AutofillBottomSheetCommands)); + if (ios::provider::IsLensSupported()) { + LensTabHelper* lensTabHelper = LensTabHelper::FromWebState(webState); + lensTabHelper->SetLensCommandsHandler( + HandlerForProtocol(_commandDispatcher, LensCommands)); + } + DCHECK(_overscrollActionsDelegate); OverscrollActionsTabHelper::FromWebState(webState)->SetDelegate( _overscrollActionsDelegate); @@ -170,6 +179,11 @@ AutofillBottomSheetTabHelper::FromWebState(webState); bottomSheetTabHelper->SetAutofillBottomSheetHandler(nil); + LensTabHelper* lensTabHelper = LensTabHelper::FromWebState(webState); + if (lensTabHelper) { + lensTabHelper->SetLensCommandsHandler(nil); + } + OverscrollActionsTabHelper::FromWebState(webState)->SetDelegate(nil); DownloadManagerTabHelper::FromWebState(webState)->SetDelegate(nil);
diff --git a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm index 914d317..eff323b 100644 --- a/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm +++ b/ios/chrome/browser/ui/content_suggestions/content_suggestions_mediator.mm
@@ -39,6 +39,7 @@ #import "components/signin/public/identity_manager/objc/identity_manager_observer_bridge.h" #import "components/strings/grit/components_strings.h" #import "ios/chrome/app/application_delegate/app_state.h" +#import "ios/chrome/app/application_delegate/app_state_observer.h" #import "ios/chrome/browser/default_browser/utils.h" #import "ios/chrome/browser/intents/intents_donation_helper.h" #import "ios/chrome/browser/ntp/features.h" @@ -140,7 +141,8 @@ } // namespace -@interface ContentSuggestionsMediator () <AuthenticationServiceObserving, +@interface ContentSuggestionsMediator () <AppStateObserver, + AuthenticationServiceObserving, SyncObserverModelBridge, IdentityManagerObserverBridgeDelegate, MostVisitedSitesObserving, @@ -350,7 +352,11 @@ SceneState* sceneState = SceneStateBrowserAgent::FromBrowser(browser)->GetSceneState(); + [sceneState addObserver:self]; + + [sceneState.appState addObserver:self]; + _browser = browser; if (IsSafetyCheckMagicStackEnabled() && @@ -371,17 +377,19 @@ prefs::kIosSafetyCheckManagerSafeBrowsingCheckResult, &_prefChangeRegistrar); - IOSChromeSafetyCheckManager* safetyCheckManager = - IOSChromeSafetyCheckManagerFactory::GetForBrowserState( - browser->GetBrowserState()); - _safetyCheckState = [self initialSafetyCheckState]; _safetyCheckManagerObserver = std::make_unique<SafetyCheckObserverBridge>( self, IOSChromeSafetyCheckManagerFactory::GetForBrowserState( browser->GetBrowserState())); - if (_safetyCheckState.runningState == RunningSafetyCheckState::kRunning) { + if (sceneState.appState.initStage > InitStageNormalUI && + sceneState.appState.firstSceneHasInitializedUI && + _safetyCheckState.runningState == RunningSafetyCheckState::kRunning) { + IOSChromeSafetyCheckManager* safetyCheckManager = + IOSChromeSafetyCheckManagerFactory::GetForBrowserState( + browser->GetBrowserState()); + safetyCheckManager->StartSafetyCheck(); } } @@ -412,6 +420,7 @@ _setUpList = nil; SceneState* sceneState = SceneStateBrowserAgent::FromBrowser(self.browser)->GetSceneState(); + [sceneState.appState removeObserver:self]; [sceneState removeObserver:self]; _localState = nullptr; } @@ -544,6 +553,27 @@ })); } +#pragma mark - AppStateObserver + +// Conditionally starts the Safety Check if the upcoming init stage is +// `InitStageFinal` and the Safety Check state indicates it's running. +// +// NOTE: It's safe to call `StartSafetyCheck()` multiple times, because calling +// `StartSafetyCheck()` on an already-running Safety Check is a no-op. +- (void)appState:(AppState*)appState + willTransitionToInitStage:(InitStage)nextInitStage { + if (IsSafetyCheckMagicStackEnabled() && + !safety_check_prefs::IsSafetyCheckInMagicStackDisabled(_localState) && + nextInitStage == InitStageFinal && appState.firstSceneHasInitializedUI && + _safetyCheckState.runningState == RunningSafetyCheckState::kRunning) { + IOSChromeSafetyCheckManager* safetyCheckManager = + IOSChromeSafetyCheckManagerFactory::GetForBrowserState( + _browser->GetBrowserState()); + + safetyCheckManager->StartSafetyCheck(); + } +} + #pragma mark - IdentityManagerObserverBridgeDelegate // Called when a user changes the syncing state. @@ -979,6 +1009,7 @@ } if (IsSafetyCheckMagicStackEnabled() && + !safety_check_prefs::IsSafetyCheckInMagicStackDisabled(_localState) && _safetyCheckState.runningState == RunningSafetyCheckState::kDefault) { [self.consumer showSafetyCheck:_safetyCheckState]; }
diff --git a/ios/chrome/browser/ui/content_suggestions/safety_check/safety_check_item_view.mm b/ios/chrome/browser/ui/content_suggestions/safety_check/safety_check_item_view.mm index 7e289c1..efda7c08 100644 --- a/ios/chrome/browser/ui/content_suggestions/safety_check/safety_check_item_view.mm +++ b/ios/chrome/browser/ui/content_suggestions/safety_check/safety_check_item_view.mm
@@ -191,6 +191,8 @@ UILabel* titleLabel = [self createTitleLabelForLayoutType:_layoutType]; UILabel* descriptionLabel = [self createDescriptionLabel]; + self.accessibilityLabel = + [NSString stringWithFormat:@"%@,%@", titleLabel, descriptionLabel]; // Add a vertical stack for the title and description labels. UIStackView* textStack = [[UIStackView alloc]
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm index a8a5aa1..41c6b2a8 100644 --- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view.mm
@@ -149,10 +149,12 @@ [_itemsStack layoutIfNeeded]; _itemsStack.accessibilityElements = @[ allSetView ]; + _expandButton = nil; + NSArray<UIView*>* itemsStackSubviews = _itemsStack.arrangedSubviews; __weak __typeof(_itemsStack) weakItemsStack = _itemsStack; [UIView animateWithDuration:kAllSetAnimationDuration.InSecondsF() animations:^{ - for (UIView* view in weakItemsStack.arrangedSubviews) { + for (UIView* view in itemsStackSubviews) { view.alpha = 0; view.hidden = YES; // Constrain the old item view's position so that it doesn't move @@ -176,7 +178,7 @@ } } completion:^(BOOL finished) { - for (UIView* view in weakItemsStack.arrangedSubviews) { + for (UIView* view in itemsStackSubviews) { if (view != allSetView) { [view removeFromSuperview]; } @@ -437,7 +439,9 @@ _expandButton.accessibilityLabel = l10n_util::GetNSString(IDS_IOS_SET_UP_LIST_COLLAPSE); - int index = 2; + // Insert new items just before the expand button. + int index = [_itemsStack.arrangedSubviews indexOfObject:_expandButton]; + CHECK_NE(index, NSNotFound); for (SetUpListItemView* item in items) { item.alpha = 0; item.hidden = YES;
diff --git a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm index d88cf99b..65bc1707 100644 --- a/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm +++ b/ios/chrome/browser/ui/content_suggestions/set_up_list/set_up_list_view_unittest.mm
@@ -219,10 +219,12 @@ [_superview addSubview:view]; ExpectSubview(set_up_list::kAllSetID, false); + ExpectSubview(set_up_list::kSignInItemID, true); [view showDoneWithAnimations:nil]; // Give time for run loop to execute events. _task_environment.RunUntilIdle(); ExpectSubview(set_up_list::kAllSetID, true); + ExpectSubview(set_up_list::kSignInItemID, false); }
diff --git a/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn b/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn index f332b800..02e5b1ac 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn +++ b/ios/chrome/browser/ui/credential_provider_promo/BUILD.gn
@@ -21,7 +21,7 @@ "//components/feature_engagement/public", "//components/prefs", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/feature_engagement", "//ios/chrome/browser/promos_manager", "//ios/chrome/browser/promos_manager:factory", @@ -81,7 +81,7 @@ "//components/password_manager/core/common", "//components/prefs:test_support", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/promos_manager", "//ios/chrome/browser/promos_manager:test_support", "//ios/chrome/browser/shared/model/browser/test:test_support",
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_coordinator_unittest.mm b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_coordinator_unittest.mm index e119a14..bd743a2 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_coordinator_unittest.mm
@@ -6,7 +6,7 @@ #import "base/test/metrics/histogram_tester.h" #import "base/test/scoped_feature_list.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h"
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator.mm b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator.mm index 516970e..97ac727bf 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator.mm +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator.mm
@@ -11,7 +11,7 @@ #import "components/feature_engagement/public/tracker.h" #import "components/password_manager/core/browser/password_manager_util.h" #import "components/prefs/pref_service.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/promos_manager/constants.h" #import "ios/chrome/browser/promos_manager/features.h" #import "ios/chrome/browser/promos_manager/promos_manager.h"
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator_unittest.mm b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator_unittest.mm index c45dd7cc..25fbe266 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator_unittest.mm +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_mediator_unittest.mm
@@ -9,7 +9,7 @@ #import "components/password_manager/core/common/password_manager_pref_names.h" #import "components/prefs/pref_registry_simple.h" #import "components/prefs/testing_pref_service.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/promos_manager/mock_promos_manager.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/public/commands/credential_provider_promo_commands.h"
diff --git a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.mm b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.mm index 826ea9d..4e40961 100644 --- a/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.mm +++ b/ios/chrome/browser/ui/credential_provider_promo/credential_provider_promo_scene_agent.mm
@@ -6,7 +6,7 @@ #import "components/password_manager/core/browser/password_manager_util.h" #import "components/prefs/pref_service.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/promos_manager/constants.h" #import "ios/chrome/browser/promos_manager/promos_manager.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h"
diff --git a/ios/chrome/browser/ui/default_promo/BUILD.gn b/ios/chrome/browser/ui/default_promo/BUILD.gn index 229885e..9004c59 100644 --- a/ios/chrome/browser/ui/default_promo/BUILD.gn +++ b/ios/chrome/browser/ui/default_promo/BUILD.gn
@@ -4,6 +4,8 @@ source_set("default_promo") { sources = [ + "default_browser_instructions_view.h", + "default_browser_instructions_view.mm", "default_browser_promo_commands.h", "default_browser_promo_coordinator.h", "default_browser_promo_coordinator.mm", @@ -48,6 +50,7 @@ "//ios/chrome/browser/shared/model/browser_state", "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/commands", + "//ios/chrome/browser/shared/ui/elements", "//ios/chrome/browser/ui/default_promo/resources", "//ios/chrome/browser/ui/default_promo/resources:animation_files", "//ios/chrome/common/ui/colors", @@ -89,7 +92,10 @@ source_set("unit_tests") { testonly = true - sources = [ "default_browser_string_util_unittest.mm" ] + sources = [ + "default_browser_instructions_view_unittest.mm", + "default_browser_string_util_unittest.mm", + ] deps = [ ":default_promo", "//base", @@ -108,6 +114,7 @@ "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/model/web_state_list/test:test_support", "//ios/chrome/browser/shared/public/commands:commands", + "//ios/chrome/common/ui/confirmation_alert:constants", "//ios/web/public/test/fakes", "//testing/gtest", "//third_party/ocmock",
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h new file mode 100644 index 0000000..ac145b52 --- /dev/null +++ b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h
@@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_DEFAULT_PROMO_DEFAULT_BROWSER_INSTRUCTIONS_VIEW_H_ +#define IOS_CHROME_BROWSER_UI_DEFAULT_PROMO_DEFAULT_BROWSER_INSTRUCTIONS_VIEW_H_ + +#import <UIKit/UIKit.h> + +@protocol ConfirmationAlertActionHandler; + +// View for the displaying default browser instructions. +@interface DefaultBrowserInstructionsView : UIView + +// Creates the view based on provided parameters. +- (instancetype)init:(BOOL)hasDismissButton + hasSteps:(BOOL)hasSteps + actionHandler:(id<ConfirmationAlertActionHandler>)actionHandler; + +@end + +#endif // IOS_CHROME_BROWSER_UI_DEFAULT_PROMO_DEFAULT_BROWSER_INSTRUCTIONS_VIEW_H_
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm new file mode 100644 index 0000000..93b17d6 --- /dev/null +++ b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view.mm
@@ -0,0 +1,210 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h" + +#import "ios/chrome/browser/shared/ui/elements/instruction_view.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.h" +#import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/grit/ios_branded_strings.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ios/public/provider/chrome/browser/lottie/lottie_animation_api.h" +#import "ios/public/provider/chrome/browser/lottie/lottie_animation_configuration.h" +#import "ui/base/l10n/l10n_util.h" + +namespace { +// Video animation asset names. +NSString* const kDarkModeAnimationSuffix = @"_darkmode"; +NSString* const kDefaultBrowserAnimation = @"default_browser_animation"; + +// Keys in the lottie assets. +NSString* const kDefaultBrowserAppKeypath = @"IDS_DEFAULT_BROWSER_APP"; +NSString* const kChromeKeypath = @"IDS_CHROME"; + +// Spacing used in the bottom alert view. +constexpr CGFloat kSpacing = 24; +} // namespace + +@interface DefaultBrowserInstructionsView () + +// Custom animation view used in the full-screen promo. +@property(nonatomic, strong) id<LottieAnimation> animationViewWrapper; +// Custom animation view used in the full-screen promo in dark mode. +@property(nonatomic, strong) id<LottieAnimation> animationViewWrapperDarkMode; +// Subview for information and action part of the view. +@property(nonatomic, strong) ConfirmationAlertViewController* alertScreen; + +@end + +@implementation DefaultBrowserInstructionsView + +- (instancetype)init:(BOOL)hasDissmissButton + hasSteps:(BOOL)hasSteps + actionHandler:(id<ConfirmationAlertActionHandler>)actionHandler { + self = [super init]; + if (self) { + [self addVideoSection]; + [self addInformationSection:hasDissmissButton + hasSteps:hasSteps + actionHandler:actionHandler]; + [self setBackgroundColor:[UIColor colorNamed:kGrey100Color]]; + } + + return self; +} + +- (void)traitCollectionDidChange:(UITraitCollection*)previousTraitCollection { + [super traitCollectionDidChange:previousTraitCollection]; + [self selectAnimationForCurrentStyle]; +} + +#pragma mark - Private + +// Adds the top part of the view which contains the video animation. +- (void)addVideoSection { + self.animationViewWrapper = [self createAnimation:kDefaultBrowserAnimation]; + self.animationViewWrapperDarkMode = [self + createAnimation:[kDefaultBrowserAnimation + stringByAppendingString:kDarkModeAnimationSuffix]]; + + // TODO(crbug.com/1487202): For tests the lottie animation is generated by + // `test_lottie_animation.mm` which is always nil. + if (self.animationViewWrapper == nil || + self.animationViewWrapperDarkMode == nil) { + return; + } + + // Set the text localization. + NSDictionary* textProvider = @{ + kDefaultBrowserAppKeypath : l10n_util::GetNSString( + IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_DEFAULT_BROWSER_APP), + kChromeKeypath : l10n_util::GetNSString(IDS_IOS_SHORT_PRODUCT_NAME) + }; + [self.animationViewWrapper setDictionaryTextProvider:textProvider]; + [self.animationViewWrapperDarkMode setDictionaryTextProvider:textProvider]; + + [self addSubview:self.animationViewWrapper.animationView]; + [self addSubview:self.animationViewWrapperDarkMode.animationView]; + + // Layout the animation view to take up the top half of the view. + self.animationViewWrapper.animationView + .translatesAutoresizingMaskIntoConstraints = NO; + self.animationViewWrapper.animationView.contentMode = + UIViewContentModeScaleAspectFit; + self.animationViewWrapperDarkMode.animationView + .translatesAutoresizingMaskIntoConstraints = NO; + self.animationViewWrapperDarkMode.animationView.contentMode = + UIViewContentModeScaleAspectFit; + + [NSLayoutConstraint activateConstraints:@[ + [self.animationViewWrapper.animationView.leadingAnchor + constraintEqualToAnchor:self.leadingAnchor], + [self.animationViewWrapper.animationView.trailingAnchor + constraintEqualToAnchor:self.trailingAnchor], + [self.animationViewWrapper.animationView.topAnchor + constraintEqualToAnchor:self.topAnchor], + [self.animationViewWrapper.animationView.bottomAnchor + constraintEqualToAnchor:self.centerYAnchor], + ]]; + + AddSameConstraints(self.animationViewWrapperDarkMode.animationView, + self.animationViewWrapper.animationView); + + [self selectAnimationForCurrentStyle]; +} + +// Creates and returns the LottieAnimation view for the `animationAssetName`. +- (id<LottieAnimation>)createAnimation:(NSString*)animationAssetName { + LottieAnimationConfiguration* config = + [[LottieAnimationConfiguration alloc] init]; + config.animationName = animationAssetName; + config.loopAnimationCount = -1; // Always loop. + return ios::provider::GenerateLottieAnimation(config); +} + +// Selects regular or dark mode animation based on the given style. +- (void)selectAnimationForStyle:(UIUserInterfaceStyle)style { + if (style == UIUserInterfaceStyleDark) { + self.animationViewWrapper.animationView.hidden = YES; + [self.animationViewWrapper stop]; + + self.animationViewWrapperDarkMode.animationView.hidden = NO; + [self.animationViewWrapperDarkMode play]; + } else { + self.animationViewWrapperDarkMode.animationView.hidden = YES; + [self.animationViewWrapperDarkMode stop]; + + self.animationViewWrapper.animationView.hidden = NO; + [self.animationViewWrapper play]; + } +} + +// Selects the animation based on current dark mode settings. +- (void)selectAnimationForCurrentStyle { + [self selectAnimationForStyle:self.traitCollection.userInterfaceStyle]; +} + +// Adds the bottom section of the view which contains instructions and buttons. +- (void)addInformationSection:(BOOL)hasDissmissButton + hasSteps:(BOOL)hasSteps + actionHandler: + (id<ConfirmationAlertActionHandler>)actionHandler { + ConfirmationAlertViewController* alertScreen = + [[ConfirmationAlertViewController alloc] init]; + alertScreen.actionHandler = actionHandler; + alertScreen.titleString = + l10n_util::GetNSString(IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_TITLE_TEXT); + alertScreen.primaryActionString = l10n_util ::GetNSString( + IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_PRIMARY_BUTTON_TEXT); + alertScreen.imageHasFixedSize = YES; + alertScreen.showDismissBarButton = NO; + alertScreen.titleTextStyle = UIFontTextStyleTitle2; + alertScreen.customSpacingBeforeImageIfNoNavigationBar = kSpacing; + alertScreen.topAlignedLayout = YES; + alertScreen.actionStackBottomMargin = kSpacing; + alertScreen.customSpacingAfterImage = kSpacing; + alertScreen.customSpacing = kSpacing; + + // The view can have either instruction steps or subtitles. + if (hasSteps) { + NSArray* defaultBrowserSteps = @[ + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_FIRST_STEP), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_SECOND_STEP), + l10n_util::GetNSString( + IDS_IOS_FIRST_RUN_DEFAULT_BROWSER_SCREEN_THIRD_STEP) + ]; + + UIView* instructionView = + [[InstructionView alloc] initWithList:defaultBrowserSteps]; + instructionView.translatesAutoresizingMaskIntoConstraints = NO; + + alertScreen.underTitleView = instructionView; + alertScreen.shouldFillInformationStack = YES; + } else { + alertScreen.subtitleString = l10n_util::GetNSString( + IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_SUBTITLE_TEXT); + } + + if (hasDissmissButton) { + alertScreen.secondaryActionString = l10n_util::GetNSString( + IDS_IOS_DEFAULT_BROWSER_VIDEO_PROMO_SECONDARY_BUTTON_TEXT); + } + + [self addSubview:alertScreen.view]; + + // Layout the alert view to take up bottom half of the view. + alertScreen.view.translatesAutoresizingMaskIntoConstraints = NO; + [NSLayoutConstraint activateConstraints:@[ + [alertScreen.view.bottomAnchor constraintEqualToAnchor:self.bottomAnchor], + [alertScreen.view.centerXAnchor constraintEqualToAnchor:self.centerXAnchor], + [alertScreen.view.widthAnchor constraintEqualToAnchor:self.widthAnchor], + [alertScreen.view.topAnchor constraintEqualToAnchor:self.centerYAnchor], + ]]; + self.alertScreen = alertScreen; +} + +@end
diff --git a/ios/chrome/browser/ui/default_promo/default_browser_instructions_view_unittest.mm b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view_unittest.mm new file mode 100644 index 0000000..46272fc8 --- /dev/null +++ b/ios/chrome/browser/ui/default_promo/default_browser_instructions_view_unittest.mm
@@ -0,0 +1,92 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h" + +#import "ios/chrome/common/ui/confirmation_alert/constants.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/gtest_mac.h" +#import "testing/platform_test.h" + +using DefaultBrowserInstructionsViewTest = PlatformTest; + +namespace { + +bool FindByID(UIView* view, NSString* accessibility_id) { + if (view.accessibilityIdentifier == accessibility_id) { + return true; + } + for (UIView* subview in view.subviews) { + if (FindByID(subview, accessibility_id)) { + return true; + } + } + return false; +} + +bool HasTitle(UIView* view) { + return FindByID(view, kConfirmationAlertTitleAccessibilityIdentifier); +} + +bool HasSubTitle(UIView* view) { + return FindByID(view, kConfirmationAlertSubtitleAccessibilityIdentifier); +} + +bool HasInstructionSteps(UIView* view) { + return FindByID(view, + kConfirmationAlertUnderTitleViewAccessibilityIdentifier); +} + +bool HasPrimaryActionButton(UIView* view) { + return FindByID(view, kConfirmationAlertPrimaryActionAccessibilityIdentifier); +} + +bool HasSecondaryActionButton(UIView* view) { + return FindByID(view, + kConfirmationAlertSecondaryActionAccessibilityIdentifier); +} + +} // namespace + +// Test view creation with subtitle. +TEST_F(DefaultBrowserInstructionsViewTest, CreateViewWithSubtitleTest) { + DefaultBrowserInstructionsView* instructionsView = + [[DefaultBrowserInstructionsView alloc] init:NO + hasSteps:NO + actionHandler:nil]; + ASSERT_NE(instructionsView, nil); + EXPECT_TRUE(HasTitle(instructionsView)); + EXPECT_TRUE(HasSubTitle(instructionsView)); + EXPECT_FALSE(HasInstructionSteps(instructionsView)); + EXPECT_TRUE(HasPrimaryActionButton(instructionsView)); + EXPECT_FALSE(HasSecondaryActionButton(instructionsView)); +} + +// Test view creation with instruction steps. +TEST_F(DefaultBrowserInstructionsViewTest, CreateViewWithStepsTest) { + DefaultBrowserInstructionsView* instructionsView = + [[DefaultBrowserInstructionsView alloc] init:NO + hasSteps:YES + actionHandler:nil]; + ASSERT_NE(instructionsView, nil); + EXPECT_TRUE(HasTitle(instructionsView)); + EXPECT_FALSE(HasSubTitle(instructionsView)); + EXPECT_TRUE(HasInstructionSteps(instructionsView)); + EXPECT_TRUE(HasPrimaryActionButton(instructionsView)); + EXPECT_FALSE(HasSecondaryActionButton(instructionsView)); +} + +// Test view creation with secondary button. +TEST_F(DefaultBrowserInstructionsViewTest, CreateViewWithSecondaryButtonTest) { + DefaultBrowserInstructionsView* instructionsView = + [[DefaultBrowserInstructionsView alloc] init:YES + hasSteps:NO + actionHandler:nil]; + ASSERT_NE(instructionsView, nil); + EXPECT_TRUE(HasTitle(instructionsView)); + EXPECT_TRUE(HasSubTitle(instructionsView)); + EXPECT_FALSE(HasInstructionSteps(instructionsView)); + EXPECT_TRUE(HasPrimaryActionButton(instructionsView)); + EXPECT_TRUE(HasSecondaryActionButton(instructionsView)); +}
diff --git a/ios/chrome/browser/ui/default_promo/video_default_browser_promo_coordinator.mm b/ios/chrome/browser/ui/default_promo/video_default_browser_promo_coordinator.mm index 541e9f7d..738410f 100644 --- a/ios/chrome/browser/ui/default_promo/video_default_browser_promo_coordinator.mm +++ b/ios/chrome/browser/ui/default_promo/video_default_browser_promo_coordinator.mm
@@ -43,6 +43,7 @@ #pragma mark - ChromeCoordinator - (void)start { + LogFullscreenDefaultBrowserPromoDisplayed(); RecordAction(UserMetricsAction("IOS.DefaultBrowserVideoPromo.Appear")); self.mediator = [[VideoDefaultBrowserPromoMediator alloc] init]; @@ -60,6 +61,7 @@ } - (void)stop { + LogUserInteractionWithFullscreenPromo(); [self.baseViewController dismissViewControllerAnimated:YES completion:nil]; if (self.halfScreenPromoCoordinator) { [self.halfScreenPromoCoordinator stop];
diff --git a/ios/chrome/browser/ui/download/pass_kit_egtest.mm b/ios/chrome/browser/ui/download/pass_kit_egtest.mm index 11f8948..8e801789 100644 --- a/ios/chrome/browser/ui/download/pass_kit_egtest.mm +++ b/ios/chrome/browser/ui/download/pass_kit_egtest.mm
@@ -130,7 +130,7 @@ // Tests that Chrome PassKit dialog is shown for sucessfully downloaded bundle // pkpasses file. -- (void)testBundlePassKitDownload { +- (void)DISABLED_testBundlePassKitDownload { if ([ChromeEarlGrey isIPadIdiom]) { EARL_GREY_TEST_SKIPPED(@"Wallet app is not supported on iPads."); }
diff --git a/ios/chrome/browser/ui/first_run/first_run_screen_provider.mm b/ios/chrome/browser/ui/first_run/first_run_screen_provider.mm index 5d9fe26..dc13b94d 100644 --- a/ios/chrome/browser/ui/first_run/first_run_screen_provider.mm +++ b/ios/chrome/browser/ui/first_run/first_run_screen_provider.mm
@@ -7,6 +7,7 @@ #import "base/feature_list.h" #import "base/notreached.h" #import "components/search_engines/search_engine_choice_utils.h" +#import "components/signin/public/base/signin_switches.h" #import "components/sync/base/features.h" #import "ios/chrome/browser/policy/browser_state_policy_connector.h" #import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" @@ -28,7 +29,8 @@ BrowserStatePolicyConnector* policyConnector = browserState->GetPolicyConnector(); - if (search_engines::ShouldShowChoiceScreen( + if (base::FeatureList::IsEnabled(switches::kSearchEngineChoiceFre) && + search_engines::ShouldShowChoiceScreen( *policyConnector->GetPolicyService(), /*profile_properties=*/{.is_regular_profile = true, .pref_service = browserState->GetPrefs()})) {
diff --git a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/BUILD.gn b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/BUILD.gn index 16495316..2f63d03 100644 --- a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/BUILD.gn +++ b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/BUILD.gn
@@ -6,14 +6,23 @@ sources = [ "infobar_parcel_tracking_modal_consumer.h", "infobar_parcel_tracking_modal_delegate.h", + "infobar_parcel_tracking_presenter.h", "infobar_parcel_tracking_table_view_controller.h", "infobar_parcel_tracking_table_view_controller.mm", ] deps = [ "//base", + "//ios/chrome/app/strings", "//ios/chrome/browser/parcel_tracking:infobar_delegate", + "//ios/chrome/browser/shared/ui/symbols", "//ios/chrome/browser/shared/ui/table_view", + "//ios/chrome/browser/shared/ui/table_view:styler", "//ios/chrome/browser/ui/infobars/modals", + "//ios/chrome/browser/ui/infobars/modals", + "//ios/chrome/browser/ui/infobars/modals:public", + "//ios/chrome/common/ui/colors", + "//ios/chrome/common/ui/table_view:cells_constants", "//ios/web/public/annotations:custom_text_check_result", + "//ui/base", ] }
diff --git a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_presenter.h b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_presenter.h new file mode 100644 index 0000000..9e30f33 --- /dev/null +++ b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_presenter.h
@@ -0,0 +1,16 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_PARCEL_TRACKING_INFOBAR_PARCEL_TRACKING_PRESENTER_H_ +#define IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_PARCEL_TRACKING_INFOBAR_PARCEL_TRACKING_PRESENTER_H_ + +// Handles presenting "Report an issue" page. +@protocol InfobarParcelTrackingPresenter + +// Called when user has tapped the "Report an issue" button. +- (void)showReportIssueView; + +@end + +#endif // IOS_CHROME_BROWSER_UI_INFOBARS_MODALS_PARCEL_TRACKING_INFOBAR_PARCEL_TRACKING_PRESENTER_H_
diff --git a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.h b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.h index bdcaed6..e98e081 100644 --- a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.h +++ b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.h
@@ -10,15 +10,19 @@ @protocol InfobarModalDelegate; @protocol InfobarParcelTrackingModalDelegate; +@protocol InfobarParcelTrackingPresenter; // View controller that represents the content for the parcel tracking // infobar modal. @interface InfobarParcelTrackingTableViewController : ChromeTableViewController <InfobarParcelTrackingModalConsumer> -// Initializes the view controller with the given `delegate`. -- (instancetype)initWithDelegate: - (id<InfobarModalDelegate, InfobarParcelTrackingModalDelegate>)delegate +// Initializes the view controller with the given `delegate` and +// `presenter`. +- (instancetype) + initWithDelegate: + (id<InfobarModalDelegate, InfobarParcelTrackingModalDelegate>)delegate + presenter:(id<InfobarParcelTrackingPresenter>)presenter NS_DESIGNATED_INITIALIZER; - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.mm b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.mm index 6c3fee72..8df5d679 100644 --- a/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.mm +++ b/ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.mm
@@ -4,9 +4,47 @@ #import "ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.h" +#import "base/apple/foundation_util.h" +#import "base/notreached.h" +#import "base/strings/sys_string_conversions.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_multi_detail_text_item.h" +#import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_button_item.h" +#import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_styler.h" +#import "ios/chrome/browser/shared/ui/util/pasteboard_util.h" +#import "ios/chrome/browser/ui/infobars/modals/infobar_modal_constants.h" #import "ios/chrome/browser/ui/infobars/modals/infobar_modal_delegate.h" #import "ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_modal_delegate.h" +#import "ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_presenter.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/table_view/table_view_cells_constants.h" +#import "ios/chrome/grit/ios_strings.h" #import "ios/web/public/annotations/custom_text_checking_result.h" +#import "ui/base/l10n/l10n_util.h" + +namespace { + +enum SectionIdentifier { + kContent = kSectionIdentifierEnumZero, +}; + +enum ItemType { + kCarrier = kItemTypeEnumZero, + kTrackingNumber, + kTrackButton, +}; + +// Height of the "Report an issue" table footer. +const CGFloat kFooterFrameHeight = 50; + +// Frame of the empty accessory view added after carrier name. +const CGRect kEmptyAccessoryViewFrame = + CGRectMake(0, 0, 0.5, kSymbolAccessoryPointSize); + +// Key used to access carrier info from CustomTextCheckingResult. +NSString* const kCarrierKey = @"carrier"; + +} // namespace @implementation InfobarParcelTrackingTableViewController { // List of parcels. @@ -15,13 +53,18 @@ bool trackingParcels_; // Delegate for this view controller. id<InfobarModalDelegate, InfobarParcelTrackingModalDelegate> delegate_; + // Presenter for this view controller. + id<InfobarParcelTrackingPresenter> presenter_; } -- (instancetype)initWithDelegate: - (id<InfobarModalDelegate, InfobarParcelTrackingModalDelegate>)delegate { +- (instancetype) + initWithDelegate: + (id<InfobarModalDelegate, InfobarParcelTrackingModalDelegate>)delegate + presenter:(id<InfobarParcelTrackingPresenter>)presenter { self = [super initWithStyle:UITableViewStylePlain]; if (self) { delegate_ = delegate; + presenter_ = presenter; } return self; } @@ -30,15 +73,272 @@ - (void)viewDidLoad { [super viewDidLoad]; - // TODO(crbug.com/1473449): implement. + self.view.backgroundColor = [UIColor colorNamed:kBackgroundColor]; + self.styler.cellBackgroundColor = [UIColor colorNamed:kBackgroundColor]; + self.tableView.sectionHeaderHeight = 0; + [self.tableView + setSeparatorInset:UIEdgeInsetsMake(0, kTableViewHorizontalSpacing, 0, 0)]; + + UIBarButtonItem* cancelButton = [[UIBarButtonItem alloc] + initWithBarButtonSystemItem:UIBarButtonSystemItemCancel + target:self + action:@selector(dismissInfobarModal)]; + cancelButton.accessibilityIdentifier = kInfobarModalCancelButton; + + self.navigationItem.leftBarButtonItem = cancelButton; + self.navigationController.navigationBar.prefersLargeTitles = NO; + + self.tableView.tableFooterView = [self reportIssueButton]; + self.tableView.tableFooterView.frame = + CGRectMake(0, 0, self.tableView.bounds.size.width, kFooterFrameHeight); + + [self loadModel]; +} + +- (void)viewDidDisappear:(BOOL)animated { + [super viewDidDisappear:animated]; + [delegate_ modalInfobarWasDismissed:self]; +} + +- (void)viewDidLayoutSubviews { + [super viewDidLayoutSubviews]; + self.tableView.scrollEnabled = + self.tableView.contentSize.height > self.view.frame.size.height; +} + +#pragma mark - TableViewModel + +- (void)loadModel { + [super loadModel]; + + TableViewModel* model = self.tableViewModel; + [model addSectionWithIdentifier:SectionIdentifier::kContent]; + + int previousCarrier = -1; + + for (size_t i = 0; i < parcelList_.count; i++) { + CustomTextCheckingResult* parcel = [parcelList_ objectAtIndex:i]; + // If package has different carrier, add table row with carrier name. + if (parcel.carrier != previousCarrier) { + [model addItem:[self itemForCarrier:parcel.carrier] + toSectionWithIdentifier:SectionIdentifier::kContent]; + previousCarrier = parcel.carrier; + } + [model addItem:[self itemForTrackingNumber:parcel.carrierNumber atIndex:i] + toSectionWithIdentifier:SectionIdentifier::kContent]; + } + + [model addItem:[self trackButtonItem] + toSectionWithIdentifier:SectionIdentifier::kContent]; +} + +#pragma mark - UITableViewDataSource + +- (UITableViewCell*)tableView:(UITableView*)tableView + cellForRowAtIndexPath:(NSIndexPath*)indexPath { + UITableViewCell* cell = [super tableView:tableView + cellForRowAtIndexPath:indexPath]; + ItemType itemType = static_cast<ItemType>( + [self.tableViewModel itemTypeForIndexPath:indexPath]); + + switch (itemType) { + case ItemType::kTrackButton: { + TableViewTextButtonCell* tableViewTextButtonCell = + base::apple::ObjCCastStrict<TableViewTextButtonCell>(cell); + [tableViewTextButtonCell.button + addTarget:self + action:@selector(trackButtonWasPressed:) + forControlEvents:UIControlEventTouchUpInside]; + tableViewTextButtonCell.separatorInset = + UIEdgeInsetsMake(0, 0, 0, self.tableView.bounds.size.width); + break; + } + case ItemType::kTrackingNumber: { + cell.accessoryView = [[UIImageView alloc] + initWithImage:DefaultSymbolTemplateWithPointSize( + kCopyActionSymbol, kSymbolAccessoryPointSize)]; + cell.accessoryView.tintColor = [UIColor colorNamed:kBlueColor]; + break; + } + case ItemType::kCarrier: + cell.accessoryView = + [[UIImageView alloc] initWithFrame:kEmptyAccessoryViewFrame]; + break; + } + + [cell setSelectionStyle:UITableViewCellSelectionStyleNone]; + + return cell; +} + +#pragma mark - UITableViewDelegate + +- (void)tableView:(UITableView*)tableView + didSelectRowAtIndexPath:(NSIndexPath*)indexPath { + UITableViewCell* cell = [super tableView:tableView + cellForRowAtIndexPath:indexPath]; + ItemType itemType = static_cast<ItemType>( + [self.tableViewModel itemTypeForIndexPath:indexPath]); + if (itemType == ItemType::kTrackingNumber) { + TableViewMultiDetailTextCell* tableViewMultiDetailTextCell = + base::apple::ObjCCastStrict<TableViewMultiDetailTextCell>(cell); + StoreTextInPasteboard( + tableViewMultiDetailTextCell.trailingDetailTextLabel.text); + // TODO(crbug.com/1473449): Show snackbar message. + } + [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; } #pragma mark - InfobarParcelTrackingModalConsumer - (void)setParcelList:(NSArray<CustomTextCheckingResult*>*)parcels withTrackingStatus:(bool)tracking { - parcelList_ = parcels; + NSSortDescriptor* sortDescriptor = + [[NSSortDescriptor alloc] initWithKey:kCarrierKey ascending:NO]; + parcelList_ = [parcels sortedArrayUsingDescriptors:@[ sortDescriptor ]]; trackingParcels_ = tracking; } +#pragma mark - Private + +// Dismisses the modal. +- (void)dismissInfobarModal { + [delegate_ dismissInfobarModal:self]; +} + +// Creates and returns the "Report an issue" button. +- (UIButton*)reportIssueButton { + UIButton* button = [[UIButton alloc] init]; + UIButtonConfiguration* buttonConfiguration = + [UIButtonConfiguration plainButtonConfiguration]; + buttonConfiguration.attributedTitle = [self reportIssueString]; + button.configuration = buttonConfiguration; + button.contentVerticalAlignment = UIControlContentVerticalAlignmentTop; + [button addTarget:self + action:@selector(reportIssueButtonWasPressed:) + forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +// Presents the "Send Feeback" page. +- (void)reportIssueButtonWasPressed:(UIButton*)sender { + [presenter_ showReportIssueView]; +} + +// Returns the TableViewItem for the given carrier. +- (TableViewMultiDetailTextItem*)itemForCarrier:(int)carrier { + TableViewMultiDetailTextItem* carrierItem = + [[TableViewMultiDetailTextItem alloc] initWithType:ItemType::kCarrier]; + carrierItem.text = l10n_util::GetNSString( + IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_DELIVERED_BY); + carrierItem.trailingDetailText = [self stringForCarrier:carrier]; + return carrierItem; +} + +// Creates and returns the TableViewItem for the tracking number at row number +// `index` in the table. +- (TableViewMultiDetailTextItem*)itemForTrackingNumber:(NSString*)trackingNumber + atIndex:(size_t)index { + TableViewMultiDetailTextItem* trackingNumberItem = + [[TableViewMultiDetailTextItem alloc] + initWithType:ItemType::kTrackingNumber]; + if (parcelList_.count == 1) { + trackingNumberItem.text = l10n_util::GetNSString( + IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_NUMBER); + } else { + trackingNumberItem.text = + [NSString stringWithFormat: + @"%@ %lu", + l10n_util::GetNSString( + IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_PACKAGE_LABEL), + index + 1]; + } + trackingNumberItem.trailingDetailText = trackingNumber; + return trackingNumberItem; +} + +// Creates and returns the TableViewItem for the (un)track button. +- (TableViewTextButtonItem*)trackButtonItem { + TableViewTextButtonItem* button = + [[TableViewTextButtonItem alloc] initWithType:ItemType::kTrackButton]; + if (trackingParcels_) { + button.buttonText = + base::SysUTF16ToNSString(l10n_util::GetPluralStringFUTF16( + IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_UNTRACK_BUTTON, + parcelList_.count)); + button.buttonTextColor = [UIColor colorNamed:kBlueColor]; + button.buttonBackgroundColor = [UIColor clearColor]; + } else { + button.buttonText = + base::SysUTF16ToNSString(l10n_util::GetPluralStringFUTF16( + IDS_IOS_PARCEL_TRACKING_MODAL_INFOBAR_TRACK_BUTTON, + parcelList_.count)); + button.buttonTextColor = [UIColor colorNamed:kSolidButtonTextColor]; + button.buttonBackgroundColor = [UIColor colorNamed:kBlueColor]; + } + button.disableButtonIntrinsicWidth = YES; + return button; +} + +// (Un)tracks all packages. +- (void)trackButtonWasPressed:(UIButton*)sender { + if (trackingParcels_) { + [delegate_ parcelTrackingTableViewControllerDidTapUntrackAllButton]; + } else { + [delegate_ parcelTrackingTableViewControllerDidTapTrackAllButton]; + } + [self dismissInfobarModal]; +} + +// Returns a string with the name of the given carrier. +- (NSString*)stringForCarrier:(int)carrier { + switch (carrier) { + case 1: + return l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_CARRIER_FEDEX); + case 2: + return l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_CARRIER_UPS); + case 4: + return l10n_util::GetNSString(IDS_IOS_PARCEL_TRACKING_CARRIER_USPS); + default: + // Currently unsupported carriers. + NOTREACHED(); + return @""; + } +} + +// Creates and returns the "Report an issue" string. +- (NSAttributedString*)reportIssueString { + NSDictionary* textAttributes = @{ + NSForegroundColorAttributeName : [UIColor colorNamed:kBlueColor], + NSFontAttributeName : + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote] + }; + + // Add a space to have a distance with the leading icon. + NSAttributedString* attributedString = [[NSAttributedString alloc] + initWithString:[@" " stringByAppendingString: + l10n_util::GetNSString( + IDS_IOS_PARCEL_TRACKING_REPORT_AN_ISSUE)] + attributes:textAttributes]; + + // Create the leading icon. + NSTextAttachment* attachment = [[NSTextAttachment alloc] init]; + UIImage* icon = DefaultSymbolWithPointSize(kExclamationMarkBubbleSymbol, + kInfobarSymbolPointSize); + attachment.image = [icon imageWithTintColor:[UIColor colorNamed:kBlueColor]]; + + // Making sure the image is well centered vertically relative to the text, + // and also that the image scales with the text size. + CGFloat height = attributedString.size.height; + CGFloat capHeight = + [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote].capHeight; + CGFloat verticalOffset = roundf(capHeight - height) / 2.f; + attachment.bounds = CGRectMake(0, verticalOffset, height, height); + + NSMutableAttributedString* outputString = [[NSAttributedString + attributedStringWithAttachment:attachment] mutableCopy]; + [outputString appendAttributedString:attributedString]; + return outputString; +} + @end
diff --git a/ios/chrome/browser/ui/mini_map/mini_map_coordinator_unittest.mm b/ios/chrome/browser/ui/mini_map/mini_map_coordinator_unittest.mm index 504adf8..90b9869 100644 --- a/ios/chrome/browser/ui/mini_map/mini_map_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/mini_map/mini_map_coordinator_unittest.mm
@@ -338,7 +338,8 @@ } // Tests the footer buttons. -TEST_F(MiniMapCoordinatorTest, TestFooterButtons) { +// TODO(crbug.com/1488572): Test is failing on bots. +TEST_F(MiniMapCoordinatorTest, DISABLED_TestFooterButtons) { base::HistogramTester histogram_tester; base::test::ScopedFeatureList scoped_feature_list; scoped_feature_list.InitAndEnableFeature(web::features::kOneTapForMaps);
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc index e700934..a218baa9 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc +++ b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.cc
@@ -37,6 +37,10 @@ "OmniboxLockIconEnabled", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kOmniboxPopulateShortcutsDatabase, + "OmniboxPopulateShortcutsDatabase", + base::FEATURE_DISABLED_BY_DEFAULT); + bool IsIpadPopoutOmniboxEnabled() { return base::FeatureList::IsEnabled(kEnablePopoutOmniboxIpad) && ui::GetDeviceFormFactor() == ui::DEVICE_FORM_FACTOR_TABLET;
diff --git a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h index 4af4d34..4fcacdf 100644 --- a/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h +++ b/ios/chrome/browser/ui/omnibox/omnibox_ui_features.h
@@ -34,4 +34,8 @@ // disabled, no icon is shown for secure pages. BASE_DECLARE_FEATURE(kOmniboxLockIconEnabled); +// Feature flag to enable storing successful query/match in the shortcut +// database. +BASE_DECLARE_FEATURE(kOmniboxPopulateShortcutsDatabase); + #endif // IOS_CHROME_BROWSER_UI_OMNIBOX_OMNIBOX_UI_FEATURES_H_
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/passwords/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_banner/passwords/BUILD.gn index a6511d0a..fa4d646 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/passwords/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_banner/passwords/BUILD.gn
@@ -12,7 +12,7 @@ "//base", "//components/password_manager/core/common:features", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/overlays", "//ios/chrome/browser/overlays/public/default", "//ios/chrome/browser/overlays/public/infobar_banner", @@ -40,7 +40,7 @@ "//components/strings", "//components/url_formatter", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/infobars", "//ios/chrome/browser/overlays", "//ios/chrome/browser/overlays/public/default",
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator.mm index f77877d9..014c336 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator.mm
@@ -7,7 +7,7 @@ #import "base/strings/sys_string_conversions.h" #import "base/strings/utf_string_conversions.h" #import "build/build_config.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/overlays/public/default/default_infobar_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/overlay_request_support.h" #import "ios/chrome/browser/passwords/ios_chrome_save_password_infobar_delegate.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator_unittest.mm b/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator_unittest.mm index 2d76fa6..95b4f11 100644 --- a/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator_unittest.mm +++ b/ios/chrome/browser/ui/overlays/infobar_banner/passwords/password_infobar_banner_overlay_mediator_unittest.mm
@@ -10,7 +10,7 @@ #import "base/test/scoped_feature_list.h" #import "build/build_config.h" #import "components/infobars/core/infobar.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/infobars/infobar_ios.h" #import "ios/chrome/browser/overlays/public/default/default_infobar_overlay_request_config.h" #import "ios/chrome/browser/overlays/public/overlay_request.h"
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/BUILD.gn b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/BUILD.gn index 3153ab9..93f8704ff 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/BUILD.gn +++ b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/BUILD.gn
@@ -15,8 +15,11 @@ "//ios/chrome/browser/overlays/public/default", "//ios/chrome/browser/parcel_tracking:infobar_delegate", "//ios/chrome/browser/parcel_tracking:parcel_tracking_step", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/ui/infobars/modals/parcel_tracking", "//ios/chrome/browser/ui/overlays/infobar_modal:coordinators", "//ios/chrome/browser/ui/overlays/infobar_modal:mediators", + "//ios/public/provider/chrome/browser/user_feedback:user_feedback_api", ] }
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.h b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.h index 8ec55911..011bfc8f 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.h +++ b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.h
@@ -5,11 +5,12 @@ #ifndef IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_PARCEL_TRACKING_PARCEL_TRACKING_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_ #define IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_PARCEL_TRACKING_PARCEL_TRACKING_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_ +#import "ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_presenter.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator.h" // A coordinator that displays the parcel tracking infobar modal UI. @interface ParcelTrackingInfobarModalOverlayCoordinator - : InfobarModalOverlayCoordinator + : InfobarModalOverlayCoordinator <InfobarParcelTrackingPresenter> @end #endif // IOS_CHROME_BROWSER_UI_OVERLAYS_INFOBAR_MODAL_PARCEL_TRACKING_PARCEL_TRACKING_INFOBAR_MODAL_OVERLAY_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.mm index d6aa85b..f0e01ca 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_coordinator.mm
@@ -7,9 +7,13 @@ #import "base/check.h" #import "ios/chrome/browser/overlays/public/default/default_infobar_overlay_request_config.h" #import "ios/chrome/browser/parcel_tracking/parcel_tracking_infobar_delegate.h" +#import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/chrome/browser/shared/public/commands/application_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" #import "ios/chrome/browser/ui/infobars/modals/parcel_tracking/infobar_parcel_tracking_table_view_controller.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/infobar_modal_overlay_coordinator+modal_configuration.h" #import "ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_mediator.h" +#import "ios/public/provider/chrome/browser/user_feedback/user_feedback_sender.h" @interface ParcelTrackingInfobarModalOverlayCoordinator () // Redefine ModalConfiguration properties as readwrite. @@ -36,6 +40,16 @@ return DefaultInfobarOverlayRequestConfig::RequestSupport(); } +#pragma mark - InfobarParcelTrackingPresenter + +- (void)showReportIssueView { + id<ApplicationCommands> handler = HandlerForProtocol( + self.browser->GetCommandDispatcher(), ApplicationCommands); + [handler + showReportAnIssueFromViewController:self.baseViewController + sender:UserFeedbackSender::ParcelTracking]; +} + @end @implementation @@ -50,7 +64,8 @@ self.modalMediator = modalMediator; InfobarParcelTrackingTableViewController* modalViewController = [[InfobarParcelTrackingTableViewController alloc] - initWithDelegate:self.modalMediator]; + initWithDelegate:self.modalMediator + presenter:self]; modalMediator.consumer = modalViewController; self.modalViewController = modalViewController; }
diff --git a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_mediator.mm b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_mediator.mm index efc915da..16bb235 100644 --- a/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_mediator.mm +++ b/ios/chrome/browser/ui/overlays/infobar_modal/parcel_tracking/parcel_tracking_infobar_modal_overlay_mediator.mm
@@ -25,15 +25,21 @@ return static_cast<ParcelTrackingInfobarDelegate*>(self.config->delegate()); } +#pragma mark - OverlayRequestMediator + ++ (const OverlayRequestSupport*)requestSupport { + return DefaultInfobarOverlayRequestConfig::RequestSupport(); +} + #pragma mark - InfobarParcelTrackingModalDelegate - (void)parcelTrackingTableViewControllerDidTapTrackAllButton { - [self parcelTrackingInfobarDelegate]->TrackPackages( + self.parcelTrackingInfobarDelegate->TrackPackages( /*display_infobar=*/false); } - (void)parcelTrackingTableViewControllerDidTapUntrackAllButton { - [self parcelTrackingInfobarDelegate]->UntrackPackages( + self.parcelTrackingInfobarDelegate->UntrackPackages( /*display_infobar=*/false); }
diff --git a/ios/chrome/browser/ui/promos_manager/BUILD.gn b/ios/chrome/browser/ui/promos_manager/BUILD.gn index 8f8c79b..1992a17 100644 --- a/ios/chrome/browser/ui/promos_manager/BUILD.gn +++ b/ios/chrome/browser/ui/promos_manager/BUILD.gn
@@ -65,7 +65,7 @@ ":promos_manager_scene_agent", "//components/crash/core/common:crash_key", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/ntp:features", "//ios/chrome/browser/promos_manager:constants",
diff --git a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm index 2441e82..ed45b73 100644 --- a/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm +++ b/ios/chrome/browser/ui/promos_manager/promos_manager_coordinator.mm
@@ -16,7 +16,7 @@ #import "components/crash/core/common/crash_key.h" #import "components/feature_engagement/public/tracker.h" #import "ios/chrome/app/tests_hook.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/default_browser/utils.h" #import "ios/chrome/browser/feature_engagement/tracker_factory.h" #import "ios/chrome/browser/ntp/features.h"
diff --git a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm index 54a856c..45dfa37 100644 --- a/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm +++ b/ios/chrome/browser/ui/reading_list/reading_list_coordinator.mm
@@ -641,7 +641,7 @@ self.shouldShowSignInPromo = _signinPromoViewMediator.showSpinner; } else { const std::string lastSignedInGaiaId = - _prefService->GetString(prefs::kGoogleServicesLastGaiaId); + _prefService->GetString(prefs::kGoogleServicesLastSyncingGaiaId); // If the last signed-in user did not remove data during sign-out, don't // show the signin promo. self.shouldShowSignInPromo = lastSignedInGaiaId.empty();
diff --git a/ios/chrome/browser/ui/settings/DEPS b/ios/chrome/browser/ui/settings/DEPS index 9cc3956..68bed9b 100644 --- a/ios/chrome/browser/ui/settings/DEPS +++ b/ios/chrome/browser/ui/settings/DEPS
@@ -6,6 +6,7 @@ "+ios/chrome/browser/ui/ntp/new_tab_page_feature.h", "+ios/chrome/browser/ui/scoped_ui_blocker", "+ios/chrome/browser/ui/autofill/cells/autofill_edit_item.h", + "+ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h", ] specific_include_rules = {
diff --git a/ios/chrome/browser/ui/settings/default_browser/BUILD.gn b/ios/chrome/browser/ui/settings/default_browser/BUILD.gn index cd2aad1a..b5461f4c 100644 --- a/ios/chrome/browser/ui/settings/default_browser/BUILD.gn +++ b/ios/chrome/browser/ui/settings/default_browser/BUILD.gn
@@ -11,14 +11,18 @@ "resources:chrome_icon", "//ios/chrome/app/strings", "//ios/chrome/browser/default_browser", + "//ios/chrome/browser/default_browser:utils", "//ios/chrome/browser/intents:intents_donation_helper", "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/shared/ui/table_view:utils", "//ios/chrome/browser/shared/ui/table_view/cells", + "//ios/chrome/browser/ui/default_promo", "//ios/chrome/browser/ui/settings:constants", "//ios/chrome/browser/ui/settings:settings_root", "//ios/chrome/browser/ui/settings/resources:settings", "//ios/chrome/common/ui/colors", + "//ios/chrome/common/ui/confirmation_alert", + "//ios/chrome/common/ui/util", "//ui/base", ] frameworks = [ "UIKit.framework" ] @@ -30,7 +34,9 @@ deps = [ ":default_browser", "//base", + "//base/test:test_support", "//ios/chrome/app/strings", + "//ios/chrome/browser/shared/public/features", "//ios/chrome/browser/shared/ui/table_view:test_support", "//ios/chrome/browser/ui/settings", "//testing/gtest",
diff --git a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.h b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.h index c29b07e..c35df6d 100644 --- a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.h +++ b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.h
@@ -8,11 +8,13 @@ #import "ios/chrome/browser/default_browser/promo_source.h" #import "ios/chrome/browser/ui/settings/settings_controller_protocol.h" #import "ios/chrome/browser/ui/settings/settings_root_table_view_controller.h" +#import "ios/chrome/common/ui/confirmation_alert/confirmation_alert_action_handler.h" // Controller for the UI that shows the user how to set Chrome as the default // browser and provides a button to take the user to the Settings app. @interface DefaultBrowserSettingsTableViewController - : SettingsRootTableViewController <SettingsControllerProtocol> + : SettingsRootTableViewController <SettingsControllerProtocol, + ConfirmationAlertActionHandler> - (instancetype)init NS_DESIGNATED_INITIALIZER; - (instancetype)initWithStyle:(UITableViewStyle)style NS_UNAVAILABLE;
diff --git a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm index 507646f8..9b2d304 100644 --- a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.mm
@@ -7,14 +7,17 @@ #import "base/metrics/histogram_functions.h" #import "base/metrics/user_metrics.h" #import "base/metrics/user_metrics_action.h" +#import "ios/chrome/browser/default_browser/utils.h" #import "ios/chrome/browser/intents/intents_donation_helper.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_detail_icon_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_image_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_link_header_footer_item.h" #import "ios/chrome/browser/shared/ui/table_view/cells/table_view_text_item.h" #import "ios/chrome/browser/shared/ui/table_view/table_view_utils.h" +#import "ios/chrome/browser/ui/default_promo/default_browser_instructions_view.h" #import "ios/chrome/browser/ui/settings/settings_table_view_controller_constants.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/util/constraints_ui_util.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util_mac.h" @@ -59,7 +62,11 @@ self.shouldHideDoneButton = YES; self.tableView.accessibilityIdentifier = kDefaultBrowserSettingsTableViewId; - [self loadModel]; + if (IsDefaultBrowserVideoInSettingsEnabled()) { + [self addDefaultBrowserVideoInstructionsView]; + } else { + [self loadModel]; + } } - (void)viewWillAppear:(BOOL)animated { @@ -174,15 +181,43 @@ [self.tableView deselectRowAtIndexPath:indexPath animated:NO]; if (itemType == ItemTypeOpenSettingsButton) { - base::RecordAction(base::UserMetricsAction("Settings.DefaultBrowser")); - base::UmaHistogramEnumeration("Settings.DefaultBrowserFromSource", - self.source); - [[UIApplication sharedApplication] - openURL:[NSURL - URLWithString:UIApplicationOpenSettingsURLString] - options:{} - completionHandler:nil]; + [self openSettingsButtonPressed]; } } +#pragma mark Private + +// Responds to user action to go to default browser settings. +- (void)openSettingsButtonPressed { + base::RecordAction(base::UserMetricsAction("Settings.DefaultBrowser")); + base::UmaHistogramEnumeration("Settings.DefaultBrowserFromSource", + self.source); + [[UIApplication sharedApplication] + openURL:[NSURL URLWithString:UIApplicationOpenSettingsURLString] + options:{} + completionHandler:nil]; +} + +// Adds default browser video instructions view as a background view. +- (void)addDefaultBrowserVideoInstructionsView { + DefaultBrowserInstructionsView* instructionsView = + [[DefaultBrowserInstructionsView alloc] init:NO + hasSteps:YES + actionHandler:self]; + + self.tableView.backgroundView = [[UIView alloc] init]; + [self.tableView.backgroundView + setBackgroundColor:[UIColor colorNamed:kGrey100Color]]; + [self.tableView addSubview:instructionsView]; + instructionsView.translatesAutoresizingMaskIntoConstraints = NO; + AddSameConstraints(instructionsView, self.tableView); + AddSameConstraints(self.tableView.backgroundView, self.tableView); +} + +#pragma mark - ConfirmationAlertActionHandler + +- (void)confirmationAlertPrimaryAction { + [self openSettingsButtonPressed]; +} + @end
diff --git a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm index 9b8578b..cf3bd7b 100644 --- a/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm +++ b/ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller_unittest.mm
@@ -5,6 +5,8 @@ #import "ios/chrome/browser/ui/settings/default_browser/default_browser_settings_table_view_controller.h" #import "base/apple/foundation_util.h" +#import "base/test/scoped_feature_list.h" +#import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/browser/shared/ui/table_view/chrome_table_view_controller_test.h" #import "ios/chrome/browser/ui/settings/settings_table_view_controller.h" #import "ios/chrome/grit/ios_strings.h" @@ -31,6 +33,8 @@ }; TEST_F(DefaultBrowserSettingsTableViewControllerTest, TestModel) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({}, {kDefaultBrowserVideoInSettings}); CreateController(); CheckController(); @@ -45,4 +49,15 @@ CheckSectionHeaderWithId(IDS_IOS_SETTINGS_FOLLOW_STEPS_BELOW_TEXT, 1); } +TEST_F(DefaultBrowserSettingsTableViewControllerTest, + TestDefaultBrowserInstructionsView) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures({kDefaultBrowserVideoInSettings}, {}); + + CreateController(); + + CheckTitleWithId(IDS_IOS_SETTINGS_SET_DEFAULT_BROWSER); + + EXPECT_EQ(0, NumberOfSections()); +} } // namespace
diff --git a/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_view_controller.mm b/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_view_controller.mm index c518d91..6da6ca1 100644 --- a/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_view_controller.mm +++ b/ios/chrome/browser/ui/settings/google_services/bulk_upload/bulk_upload_view_controller.mm
@@ -46,6 +46,8 @@ - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = UIColor.systemGroupedBackgroundColor; + // Set the bulk upload page title. + self.title = l10n_util::GetNSString(IDS_IOS_BULK_UPLOAD_ON_THIS_DEVICE_TITLE); // Create the table view. _tableViewController = [[BulkUploadTableViewController alloc] initWithStyle:ChromeTableViewStyle()];
diff --git a/ios/chrome/browser/ui/settings/password/BUILD.gn b/ios/chrome/browser/ui/settings/password/BUILD.gn index 39428ec..16b48fee 100644 --- a/ios/chrome/browser/ui/settings/password/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/BUILD.gn
@@ -318,7 +318,7 @@ "//components/sync/base:features", "//components/sync/service", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/metrics:eg_test_support+eg2", "//ios/chrome/browser/policy:eg_test_support+eg2", "//ios/chrome/browser/shared/ui/util",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn index 9579228b..b49989bd 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_details/BUILD.gn
@@ -28,7 +28,7 @@ "//components/sync/base:features", "//components/url_formatter", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/passwords", "//ios/chrome/browser/passwords:password_checkup_metrics", "//ios/chrome/browser/passwords:password_checkup_utils", @@ -143,7 +143,7 @@ "//components/password_manager/core/common:features", "//components/sync/base", "//ios/chrome/app/strings", - "//ios/chrome/browser/credential_provider_promo:features", + "//ios/chrome/browser/credential_provider_promo/model:features", "//ios/chrome/browser/passwords", "//ios/chrome/browser/passwords:store_factory", "//ios/chrome/browser/shared/coordinator/scene:scene_state_browser_agent",
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm index 8099dc4..1841d16 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator.mm
@@ -16,7 +16,7 @@ #import "components/password_manager/core/common/password_manager_features.h" #import "components/prefs/pref_service.h" #import "components/strings/grit/components_strings.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/passwords/password_tab_helper.h" #import "ios/chrome/browser/shared/coordinator/alert/action_sheet_coordinator.h" #import "ios/chrome/browser/shared/coordinator/alert/alert_coordinator.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_unittest.mm index 960943b..76788f46 100644 --- a/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_unittest.mm +++ b/ios/chrome/browser/ui/settings/password/password_details/password_details_coordinator_unittest.mm
@@ -7,7 +7,7 @@ #import "base/test/scoped_feature_list.h" #import "base/test/task_environment.h" #import "components/password_manager/core/browser/ui/affiliated_group.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.h" #import "ios/chrome/browser/shared/public/commands/command_dispatcher.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm index bf0ca75..130a6f9 100644 --- a/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm +++ b/ios/chrome/browser/ui/settings/password/password_manager_egtest.mm
@@ -21,7 +21,7 @@ #import "components/sync/base/features.h" #import "components/sync/base/user_selectable_type.h" #import "components/sync/service/sync_prefs.h" -#import "ios/chrome/browser/credential_provider_promo/features.h" +#import "ios/chrome/browser/credential_provider_promo/model/features.h" #import "ios/chrome/browser/metrics/metrics_app_interface.h" #import "ios/chrome/browser/policy/policy_earl_grey_utils.h" #import "ios/chrome/browser/signin/fake_system_identity.h"
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm index a566129..57907ef09 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.mm
@@ -456,8 +456,6 @@ UIAccessibilityTraitButton; _bulkMovePasswordsToAccountButtonItem.accessibilityIdentifier = kPasswordSettingsBulkMovePasswordsToAccountButtonTableViewId; - _bulkMovePasswordsToAccountButtonItem.accessibilityTraits |= - UIAccessibilityTraitLink; return _bulkMovePasswordsToAccountButtonItem; }
diff --git a/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm index 84206b0e..4897e6f 100644 --- a/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.mm
@@ -4,12 +4,16 @@ #import "ios/chrome/browser/ui/settings/password/password_sharing/sharing_status_view_controller.h" +#import "base/strings/sys_string_conversions.h" #import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/shared/ui/symbols/symbols.h" #import "ios/chrome/browser/shared/ui/util/uikit_ui_util.h" #import "ios/chrome/browser/ui/authentication/authentication_constants.h" +#import "ios/chrome/common/string_util.h" #import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/util/button_util.h" #import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util.h" #import "ui/base/l10n/l10n_util_mac.h" namespace { @@ -29,6 +33,7 @@ const CGFloat kVerticalSpacing = 16.0; const CGFloat kTopPadding = 20.0; const CGFloat kBottomPadding = 42.0; +const CGFloat kHorizontalPadding = 16.0; // Durations of specific parts of the animation. const CGFloat kImagesSlidingOutDuration = 1.0; @@ -69,6 +74,13 @@ // to the middle. @property(nonatomic, strong) UIViewPropertyAnimator* imagesSlidingInAnimation; +// Contains the information that sharing is in progress at first and then is +// modified to convey the result status. +@property(nonatomic, strong) UILabel* titleLabel; + +// The button that cancels the sharing process. +@property(nonatomic, strong) UIButton* cancelButton; + @end @implementation SharingStatusViewController @@ -115,13 +127,13 @@ [view addSubview:cancelButton]; [NSLayoutConstraint activateConstraints:@[ - // Animation container consraints. + // Animation container constraints. [animationView.topAnchor constraintEqualToAnchor:view.topAnchor constant:kTopPadding], [animationView.leadingAnchor constraintEqualToAnchor:view.leadingAnchor - constant:kVerticalSpacing], + constant:kHorizontalPadding], [animationView.trailingAnchor constraintEqualToAnchor:view.trailingAnchor - constant:-kVerticalSpacing], + constant:-kHorizontalPadding], [animationView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor], // Sender image constraints. @@ -252,6 +264,7 @@ title.adjustsFontForContentSizeCategory = YES; title.textColor = [UIColor colorNamed:kTextPrimaryColor]; title.textAlignment = NSTextAlignmentCenter; + self.titleLabel = title; return title; } @@ -264,6 +277,7 @@ [cancelButton addTarget:self action:@selector(cancelButtonTapped) forControlEvents:UIControlEventTouchUpInside]; + self.cancelButton = cancelButton; return cancelButton; } @@ -329,10 +343,117 @@ recipientImage.center.x - kImagesSlidingInDistance, recipientImage.center.y); }]; + [self.imagesSlidingInAnimation + addCompletion:^(UIViewAnimatingPosition finalPosition) { + [weakSelf displaySuccessStatus]; + }]; +} + +// Creates a UITextView with subtitle and footer defaults. +- (UITextView*)createTextView { + UITextView* view = [[UITextView alloc] init]; + view.textAlignment = NSTextAlignmentCenter; + view.translatesAutoresizingMaskIntoConstraints = NO; + view.adjustsFontForContentSizeCategory = YES; + view.editable = NO; + view.selectable = YES; + view.scrollEnabled = NO; + view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + return view; +} + +// Adds link attribute to the specified `range` of the `view`. +- (void)addLinkAttributeToTextView:(UITextView*)view range:(NSRange)range { + NSMutableAttributedString* newView = [[NSMutableAttributedString alloc] + initWithAttributedString:view.attributedText]; + [newView addAttribute:NSLinkAttributeName value:@"" range:range]; + view.attributedText = newView; +} + +// Helper to create the subtitle. +- (UITextView*)createSubtitle { + UITextView* subtitle = [self createTextView]; + subtitle.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + subtitle.textColor = [UIColor colorNamed:kTextPrimaryColor]; + + // TODO(crbug.com/1463882): Add passing name and link values and bolding them. + StringWithTags stringWithTags = + ParseStringWithLinks(base::SysUTF16ToNSString(l10n_util::GetStringFUTF16( + IDS_IOS_PASSWORD_SHARING_SUCCESS_SUBTITLE, u"", u""))); + subtitle.text = stringWithTags.string; + [self addLinkAttributeToTextView:subtitle range:stringWithTags.ranges[0]]; + + return subtitle; +} + +// Helper to create the footer. +- (UITextView*)createFooter { + UITextView* footer = [self createTextView]; + footer.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + footer.textColor = [UIColor colorNamed:kTextSecondaryColor]; + + // TODO(crbug.com/1463882): Add passing link value. + StringWithTags stringWithTags = + ParseStringWithLinks(base::SysUTF16ToNSString(l10n_util::GetStringFUTF16( + IDS_IOS_PASSWORD_SHARING_SUCCESS_FOOTNOTE, u""))); + footer.text = stringWithTags.string; + [self addLinkAttributeToTextView:footer range:stringWithTags.ranges[0]]; + + return footer; +} + +// Helper for creating the done button. +- (UIButton*)createDoneButton { + UIButton* doneButton = PrimaryActionButton(YES); + [doneButton addTarget:self + action:@selector(doneButtonTapped) + forControlEvents:UIControlEventTouchUpInside]; + [doneButton setTitle:l10n_util::GetNSString(IDS_DONE) + forState:UIControlStateNormal]; + doneButton.titleLabel.adjustsFontSizeToFitWidth = YES; + return doneButton; +} + +// Replaces text of the title label, cancel button with done button and adds a +// subtitle and a footer. +// TODO(crbug.com/1463882): Add test. +- (void)displaySuccessStatus { + UILabel* titleLabel = self.titleLabel; + titleLabel.text = + l10n_util::GetNSString(IDS_IOS_PASSWORD_SHARING_SUCCESS_TITLE); + self.cancelButton.hidden = YES; + + UIView* view = self.view; + UIStackView* verticalStack = [[UIStackView alloc] initWithArrangedSubviews:@[ + [self createSubtitle], [self createFooter], [self createDoneButton] + ]]; + verticalStack.axis = UILayoutConstraintAxisVertical; + verticalStack.spacing = kVerticalSpacing; + verticalStack.translatesAutoresizingMaskIntoConstraints = NO; + [view addSubview:verticalStack]; + + [NSLayoutConstraint activateConstraints:@[ + [verticalStack.topAnchor constraintEqualToAnchor:titleLabel.bottomAnchor + constant:kVerticalSpacing], + [verticalStack.leadingAnchor constraintEqualToAnchor:view.leadingAnchor + constant:kHorizontalPadding], + [verticalStack.trailingAnchor constraintEqualToAnchor:view.trailingAnchor + constant:-kHorizontalPadding], + [verticalStack.bottomAnchor constraintEqualToAnchor:view.bottomAnchor + constant:-kBottomPadding], + ]]; + + [view setNeedsLayout]; + [view layoutIfNeeded]; } - (void)cancelButtonTapped { // TODO(crbug.com/1463882): Implement. } +// Handles done buttons clicks by dismissing the view. +- (void)doneButtonTapped { + // TODO(crbug.com/1463882): Implement. +} + @end
diff --git a/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm b/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm index 16a0b02..91ac3614 100644 --- a/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm +++ b/ios/chrome/browser/ui/settings/search_engine_table_view_controller.mm
@@ -69,18 +69,27 @@ @implementation SearchEngineTableViewController { TemplateURLService* _templateURLService; // weak std::unique_ptr<SearchEngineObserverBridge> _observer; - // The first list in the page which contains prepopulted search engines and + // The list of choice screen search engines retrieved from the + // TemplateURLService. + std::vector<std::unique_ptr<TemplateURL>> _choiceScreenTemplateURLs; + // The first list in the page which contains prepopulated search engines and // search engines that are created by policy, and possibly one custom search // engine if it's selected as default search engine. + // Note that `TemplateURL` pointers should not be freed. They either come from + // `TemplateURLService::GetTemplateURLs()`, or they are owned by + // `_choiceScreenTemplateUrls`. std::vector<TemplateURL*> _firstList; // The second list in the page which contains all remaining custom search // engines. + // Note that `TemplateURL` pointers should not be freed. They either come from + // `TemplateURLService::GetTemplateURLs()`, or they are owned by + // `_choiceScreenTemplateUrls`. std::vector<TemplateURL*> _secondList; // FaviconLoader is a keyed service that uses LargeIconService to retrieve // favicon images. FaviconLoader* _faviconLoader; - // Used to retrieve the user's prefs. - PrefService* _prefService; + // Determines which version of the settings UI should be displayed. + BOOL _shouldShowUpdatedSettings; } #pragma mark - Initialization @@ -97,7 +106,8 @@ _templateURLService->Load(); _faviconLoader = IOSChromeFaviconLoaderFactory::GetForBrowserState(browserState); - _prefService = browserState->GetPrefs(); + _shouldShowUpdatedSettings = + search_engines::ShouldShowUpdatedSettings(*browserState->GetPrefs()); [self setTitle:l10n_util::GetNSString(IDS_IOS_SEARCH_ENGINE_SETTING_TITLE)]; self.shouldDisableDoneButtonOnEdit = YES; } @@ -112,8 +122,13 @@ _updatingBackend = updatingBackend; - if (!self.searchEngineChangedInBackground) + // TODO(b/303006727): Remove this check once we figure out a way to keep a + // constant seed for each profile for the random shuffle. In the meantime, it + // prevents the order of the items in the list from changing when the user + // makes a selection. + if (!self.searchEngineChangedInBackground || _shouldShowUpdatedSettings) { return; + } [self loadSearchEngines]; @@ -141,8 +156,8 @@ NSArray* firstListItem = [self.tableViewModel itemsInSectionWithIdentifier:SectionIdentifierFirstList]; for (NSUInteger index = 0; index < firstListItem.count; index++) { - if ([self isItem:firstListItem[index] - differentForTemplateURL:_firstList[index]]) { + if (![self isItem:firstListItem[index] + equalForTemplateURL:_firstList[index]]) { // Item has changed, reload the TableView. [self reloadData]; return; @@ -153,8 +168,8 @@ NSArray* secondListItem = [self.tableViewModel itemsInSectionWithIdentifier:SectionIdentifierSecondList]; for (NSUInteger index = 0; index < secondListItem.count; index++) { - if ([self isItem:secondListItem[index] - differentForTemplateURL:_secondList[index]]) { + if (![self isItem:secondListItem[index] + equalForTemplateURL:_secondList[index]]) { // Item has changed, reload the TableView. [self reloadData]; return; @@ -217,7 +232,7 @@ if (_firstList.size() > 0) { [model addSectionWithIdentifier:SectionIdentifierFirstList]; - if (search_engines::ShouldShowUpdatedSettings(*_prefService)) { + if (_shouldShowUpdatedSettings) { TableViewTextHeaderFooterItem* header = [[TableViewTextHeaderFooterItem alloc] initWithType:ItemTypeHeader]; header.subtitle = @@ -470,21 +485,37 @@ if (_settingsAreDismissed) return; - // TODO(b/280753739): Fetch the list of URLs used for the search engine choice - // screen, when appropriate. + // TODO(b/280753739) Update this method to return the correct list of search + // engines directly (for both choice-screen-eligible users and + // non-choice-screen-eligible users). This way we don't have to worry about + // calling two different methods anymore. std::vector<TemplateURL*> urls = _templateURLService->GetTemplateURLs(); _firstList.clear(); _firstList.reserve(urls.size()); _secondList.clear(); _secondList.reserve(urls.size()); + if (_shouldShowUpdatedSettings) { + // This method returns all the required prepopulated search engines and + // possibly one custom search engine if it's selected as default search + // engine. + _choiceScreenTemplateURLs = + _templateURLService->GetTemplateURLsForChoiceScreen(); + _firstList.reserve(_choiceScreenTemplateURLs.size()); + for (auto& url : _choiceScreenTemplateURLs) { + _firstList.push_back(url.get()); + } + } + // Classify TemplateURLs. for (TemplateURL* url : urls) { - if (_templateURLService->IsPrepopulatedOrCreatedByPolicy(url) || - url == _templateURLService->GetDefaultSearchProvider()) + if (!_shouldShowUpdatedSettings && + (_templateURLService->IsPrepopulatedOrCreatedByPolicy(url) || + url == _templateURLService->GetDefaultSearchProvider())) { _firstList.push_back(url); - else + } else { _secondList.push_back(url); + } } // Do not sort prepopulated search engines, they are already sorted by @@ -529,7 +560,9 @@ } item.text = base::SysUTF16ToNSString(templateURL->short_name()); item.detailText = base::SysUTF16ToNSString(templateURL->keyword()); - if (templateURL == _templateURLService->GetDefaultSearchProvider()) { + if ([self isItem:item + equalForTemplateURL:_templateURLService + ->GetDefaultSearchProvider()]) { [item setAccessoryType:UITableViewCellAccessoryCheckmark]; } return item; @@ -684,14 +717,17 @@ withRowAnimation:UITableViewRowAnimationAutomatic]; } -// Returns whether the `item` is different from an item that would be created +// Returns whether the `item` is the same as an item that would be created // from `templateURL`. - (BOOL)isItem:(SearchEngineItem*)item - differentForTemplateURL:(TemplateURL*)templateURL { + equalForTemplateURL:(const TemplateURL*)templateURL { + if (!templateURL) { + return NO; + } NSString* name = base::SysUTF16ToNSString(templateURL->short_name()); NSString* keyword = base::SysUTF16ToNSString(templateURL->keyword()); - return ![item.text isEqualToString:name] || - ![item.detailText isEqualToString:keyword]; + return [item.text isEqualToString:name] && + [item.detailText isEqualToString:keyword]; } @end
diff --git a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm index bee588f..23f6226 100644 --- a/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm +++ b/ios/chrome/browser/ui/tab_switcher/tab_grid/grid/incognito/incognito_grid_mediator.mm
@@ -46,10 +46,10 @@ if (self = [super initWithConsumer:consumer]) { CHECK(prefService); _prefService = prefService; - _prefChangeRegistrar.Init(_prefService); if (base::FeatureList::IsEnabled( supervised_user:: kFilterWebsitesForSupervisedUsersOnDesktopAndIOS)) { + _prefChangeRegistrar.Init(_prefService); _prefObserverBridge.reset(new PrefObserverBridge(self)); // Register to observe any changes on supervised_user status. _prefObserverBridge->ObserveChangesForPreference( @@ -127,8 +127,11 @@ #pragma mark - Parent's function - (void)disconnect { - _prefChangeRegistrar.RemoveAll(); - _prefObserverBridge.reset(); + if (base::FeatureList::IsEnabled( + supervised_user::kFilterWebsitesForSupervisedUsersOnDesktopAndIOS)) { + _prefChangeRegistrar.RemoveAll(); + _prefObserverBridge.reset(); + } _prefService = nil; [super disconnect]; }
diff --git a/ios/chrome/browser/web/annotations/annotations_tab_helper.h b/ios/chrome/browser/web/annotations/annotations_tab_helper.h index a4eccc4..9858fb68 100644 --- a/ios/chrome/browser/web/annotations/annotations_tab_helper.h +++ b/ios/chrome/browser/web/annotations/annotations_tab_helper.h
@@ -84,7 +84,7 @@ // Triggers the parcel tracking UI display if the given list of annotations // contains at least one parcel number and the user is eligible for the - // prompt. May modify `annotations_list`. + // prompt. Removes parcels from `annotations_list`. void ProcessParcelTrackingNumbers(base::Value::List& annotations_list); // Triggers the parcel tracking UI display for the given parcel
diff --git a/ios/chrome/browser/web/annotations/annotations_tab_helper.mm b/ios/chrome/browser/web/annotations/annotations_tab_helper.mm index d4b7416..870aa99 100644 --- a/ios/chrome/browser/web/annotations/annotations_tab_helper.mm +++ b/ios/chrome/browser/web/annotations/annotations_tab_helper.mm
@@ -192,10 +192,6 @@ void AnnotationsTabHelper::ProcessParcelTrackingNumbers( base::Value::List& annotations_list) { - // Return early if not currently active WebState. - if (!web_state_->IsVisible()) { - return; - } NSMutableArray<CustomTextCheckingResult*>* unique_parcels = [[NSMutableArray alloc] init]; NSMutableSet* existing_parcel_numbers = [NSMutableSet set]; @@ -218,7 +214,8 @@ // tracking number. annotations_list.EraseValue(annotations_list[i]); } - if ([unique_parcels count] > 0) { + // Show UI only if this is the currently active WebState. + if ([unique_parcels count] > 0 && web_state_->IsVisible()) { // Call asynchronously to allow the rest of the annotations to be decorated // first. base::SequencedTaskRunner::GetCurrentDefault()->PostTask(
diff --git a/ios/chrome/browser/web/model/BUILD.gn b/ios/chrome/browser/web/model/BUILD.gn new file mode 100644 index 0000000..4359db5 --- /dev/null +++ b/ios/chrome/browser/web/model/BUILD.gn
@@ -0,0 +1,71 @@ +# Copyright 2016 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//base/allocator/allocator.gni") +import("//ios/web/public/js_messaging/optimize_js.gni") +import("//rlz/buildflags/buildflags.gni") + +source_set("model") { + sources = [ "web_navigation_util.h" ] + deps = [ + ":feature_flags", + ":page_placeholder", + ":tab_helper_delegates", + "//base", + "//components/content_settings/core/browser", + "//components/error_page/common", + "//components/feature_engagement/public", + "//components/pref_registry", + "//components/resources:components_resources_grit", + "//components/resources:dev_ui_components_resources_grit", + "//components/search_engines", + "//components/strings", + "//components/ukm/ios:ukm_url_recorder", + "//components/variations/net", + "//ios/chrome/app/application_delegate:observing_app_state_agent", + "//ios/chrome/app/strings", + "//ios/chrome/browser/content_settings/model", + "//ios/chrome/browser/feature_engagement", + "//ios/chrome/browser/infobars", + "//ios/chrome/browser/infobars:public", + "//ios/chrome/browser/lens", + "//ios/chrome/browser/ntp", + "//ios/chrome/browser/shared/model/application_context", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/model/url:constants", + "//ios/chrome/browser/shared/model/utils", + "//ios/chrome/browser/shared/model/web_state_list", + "//ios/chrome/browser/shared/public/commands", + "//ios/chrome/browser/shared/ui/elements", + "//ios/chrome/browser/shared/ui/util", + "//ios/chrome/browser/ui/fullscreen", + "//ios/chrome/common/ui/util", + "//ios/components/ui_util", + "//ios/components/webui:url_constants", + "//ios/net", + "//ios/web", + "//ios/web/common", + "//ios/web/common:user_agent", + "//ios/web/public/js_messaging", + "//ios/web/public/security", + "//ios/web/public/session", + "//services/metrics/public/cpp:ukm_builders", + "//ui/base", + "//url", + ] + public_deps = [ + "//components/infobars/core", + "//ios/chrome/browser/web:web", + ] +} + +source_set("feature_flags") { + sources = [ "features.h" ] + deps = [ + "//base", + "//ios/web/common:features", + ] + public_deps = [ "//ios/chrome/browser/web:feature_flags" ] +}
diff --git a/ios/chrome/browser/web/model/annotations/BUILD.gn b/ios/chrome/browser/web/model/annotations/BUILD.gn new file mode 100644 index 0000000..d8e5240 --- /dev/null +++ b/ios/chrome/browser/web/model/annotations/BUILD.gn
@@ -0,0 +1,40 @@ +# Copyright 2022 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//build/buildflag_header.gni") +import("//ios/build/config.gni") +import("//ios/web/public/js_messaging/optimize_js.gni") + +source_set("annotations") { + deps = [ + "//base", + "//components/prefs", + "//components/shared_highlighting/ios", + "//components/ukm/ios:ukm_url_recorder", + "//ios/chrome/browser/mailto_handler", + "//ios/chrome/browser/mailto_handler:mailto_handler_factory", + "//ios/chrome/browser/parcel_tracking:util", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/shared/public/commands", + "//ios/chrome/browser/text_selection/model", + "//ios/public/provider/chrome/browser/context_menu:context_menu_api", + "//ios/web/annotations", + "//ios/web/common", + "//ios/web/public", + "//ios/web/public:web_state_observer", + "//ios/web/public/annotations", + "//ios/web/public/annotations:custom_text_check_result", + "//ios/web/public/js_messaging", + "//ios/web/public/navigation", + "//ios/web/public/navigation:referrer", + "//ui/base", + ] + public_deps = [ "//ios/chrome/browser/web/annotations:annotations" ] + + sources = [ + "annotations_tab_helper.h", + "annotations_util.h", + ] +}
diff --git a/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h b/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h new file mode 100644 index 0000000..1c66d5f --- /dev/null +++ b/ios/chrome/browser/web/model/annotations/annotations_tab_helper.h
@@ -0,0 +1,10 @@ +// Copyright 2022 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_MODEL_ANNOTATIONS_ANNOTATIONS_TAB_HELPER_H_ +#define IOS_CHROME_BROWSER_WEB_MODEL_ANNOTATIONS_ANNOTATIONS_TAB_HELPER_H_ + +#include "ios/chrome/browser/web/annotations/annotations_tab_helper.h" + +#endif // IOS_CHROME_BROWSER_WEB_MODEL_ANNOTATIONS_ANNOTATIONS_TAB_HELPER_H_
diff --git a/ios/chrome/browser/web/model/annotations/annotations_util.h b/ios/chrome/browser/web/model/annotations/annotations_util.h new file mode 100644 index 0000000..1734755 --- /dev/null +++ b/ios/chrome/browser/web/model/annotations/annotations_util.h
@@ -0,0 +1,10 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_MODEL_ANNOTATIONS_ANNOTATIONS_UTIL_H_ +#define IOS_CHROME_BROWSER_WEB_MODEL_ANNOTATIONS_ANNOTATIONS_UTIL_H_ + +#include "ios/chrome/browser/web/annotations/annotations_util.h" + +#endif // IOS_CHROME_BROWSER_WEB_MODEL_ANNOTATIONS_ANNOTATIONS_UTIL_H_
diff --git a/ios/chrome/browser/web/model/features.h b/ios/chrome/browser/web/model/features.h new file mode 100644 index 0000000..c8a1a4e --- /dev/null +++ b/ios/chrome/browser/web/model/features.h
@@ -0,0 +1,10 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_MODEL_FEATURES_H_ +#define IOS_CHROME_BROWSER_WEB_MODEL_FEATURES_H_ + +#include "ios/chrome/browser/web/features.h" + +#endif // IOS_CHROME_BROWSER_WEB_MODEL_FEATURES_H_
diff --git a/ios/chrome/browser/web/model/font_size/BUILD.gn b/ios/chrome/browser/web/model/font_size/BUILD.gn new file mode 100644 index 0000000..3e104f81 --- /dev/null +++ b/ios/chrome/browser/web/model/font_size/BUILD.gn
@@ -0,0 +1,28 @@ +# Copyright 2021 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//ios/web/public/js_messaging/optimize_ts.gni") + +source_set("font_size") { + sources = [ "font_size_java_script_feature.h" ] + deps = [ + ":font_size_js", + "//base", + "//components/google/core/common", + "//components/pref_registry", + "//components/prefs", + "//components/ukm/ios:ukm_url_recorder", + "//ios/chrome/browser/shared/model/application_context", + "//ios/chrome/browser/shared/model/browser_state", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/web:feature_flags", + "//ios/components/ui_util", + "//ios/public/provider/chrome/browser/text_zoom:text_zoom_api", + "//services/metrics/public/cpp:ukm_builders", + ] + public_deps = [ + "//ios/chrome/browser/web/font_size:font_size", + "//ios/web/public/js_messaging", + ] +}
diff --git a/ios/chrome/browser/web/model/font_size/font_size_java_script_feature.h b/ios/chrome/browser/web/model/font_size/font_size_java_script_feature.h new file mode 100644 index 0000000..502d864 --- /dev/null +++ b/ios/chrome/browser/web/model/font_size/font_size_java_script_feature.h
@@ -0,0 +1,10 @@ +// Copyright 2021 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_MODEL_FONT_SIZE_FONT_SIZE_JAVA_SCRIPT_FEATURE_H_ +#define IOS_CHROME_BROWSER_WEB_MODEL_FONT_SIZE_FONT_SIZE_JAVA_SCRIPT_FEATURE_H_ + +#include "ios/chrome/browser/web/font_size/font_size_java_script_feature.h" + +#endif // IOS_CHROME_BROWSER_WEB_MODEL_FONT_SIZE_FONT_SIZE_JAVA_SCRIPT_FEATURE_H_
diff --git a/ios/chrome/browser/web/model/web_navigation_util.h b/ios/chrome/browser/web/model/web_navigation_util.h new file mode 100644 index 0000000..cd370eb --- /dev/null +++ b/ios/chrome/browser/web/model/web_navigation_util.h
@@ -0,0 +1,10 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef IOS_CHROME_BROWSER_WEB_MODEL_WEB_NAVIGATION_UTIL_H_ +#define IOS_CHROME_BROWSER_WEB_MODEL_WEB_NAVIGATION_UTIL_H_ + +#include "ios/chrome/browser/web/web_navigation_util.h" + +#endif // IOS_CHROME_BROWSER_WEB_MODEL_WEB_NAVIGATION_UTIL_H_
diff --git a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm index 1d0e61f..1ffe520 100644 --- a/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm +++ b/ios/chrome/common/ui/confirmation_alert/confirmation_alert_view_controller.mm
@@ -134,6 +134,8 @@ } if (self.underTitleView) { + self.underTitleView.accessibilityIdentifier = + kConfirmationAlertUnderTitleViewAccessibilityIdentifier; [stackSubviews addObject:self.underTitleView]; }
diff --git a/ios/chrome/common/ui/confirmation_alert/constants.h b/ios/chrome/common/ui/confirmation_alert/constants.h index d420dc6..3ae00cd 100644 --- a/ios/chrome/common/ui/confirmation_alert/constants.h +++ b/ios/chrome/common/ui/confirmation_alert/constants.h
@@ -15,5 +15,6 @@ extern NSString* const kConfirmationAlertPrimaryActionAccessibilityIdentifier; extern NSString* const kConfirmationAlertSecondaryActionAccessibilityIdentifier; extern NSString* const kConfirmationAlertTertiaryActionAccessibilityIdentifier; +extern NSString* const kConfirmationAlertUnderTitleViewAccessibilityIdentifier; #endif // IOS_CHROME_COMMON_UI_CONFIRMATION_ALERT_CONSTANTS_H_
diff --git a/ios/chrome/common/ui/confirmation_alert/constants.mm b/ios/chrome/common/ui/confirmation_alert/constants.mm index 0f5e1fd..93e693e 100644 --- a/ios/chrome/common/ui/confirmation_alert/constants.mm +++ b/ios/chrome/common/ui/confirmation_alert/constants.mm
@@ -18,3 +18,5 @@ @"kConfirmationAlertSecondaryActionAccessibilityIdentifier"; NSString* const kConfirmationAlertTertiaryActionAccessibilityIdentifier = @"kConfirmationAlertTertiaryActionAccessibilityIdentifier"; +NSString* const kConfirmationAlertUnderTitleViewAccessibilityIdentifier = + @"kConfirmationAlertUnderTitleViewAccessibilityIdentifier";
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 0e524ac..243800b 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -227,6 +227,7 @@ "//ios/chrome/browser/itunes_urls:unit_tests", "//ios/chrome/browser/json_parser:unit_tests", "//ios/chrome/browser/language:unit_tests", + "//ios/chrome/browser/lens:unit_tests", "//ios/chrome/browser/link_to_text:unit_tests", "//ios/chrome/browser/main:unit_tests", "//ios/chrome/browser/metrics:unit_tests",
diff --git a/ios/chrome/test/app/BUILD.gn b/ios/chrome/test/app/BUILD.gn index 6ed5b3d..7613922c 100644 --- a/ios/chrome/test/app/BUILD.gn +++ b/ios/chrome/test/app/BUILD.gn
@@ -87,6 +87,7 @@ "//ios/chrome/browser/ui/authentication", "//ios/chrome/browser/ui/authentication/cells", "//ios/chrome/browser/ui/authentication/history_sync", + "//ios/chrome/browser/ui/autofill/form_input_accessory:common", "//ios/chrome/browser/ui/bookmarks:core", "//ios/chrome/browser/ui/browser_view", "//ios/chrome/browser/ui/main",
diff --git a/ios/chrome/test/app/password_test_util.h b/ios/chrome/test/app/password_test_util.h index 7eb42a3..465b0521 100644 --- a/ios/chrome/test/app/password_test_util.h +++ b/ios/chrome/test/app/password_test_util.h
@@ -7,6 +7,7 @@ #import <memory> +#import "ios/chrome/browser/ui/autofill/form_input_accessory/scoped_form_input_accessory_reauth_module_override.h" #import "ios/chrome/browser/ui/passwords/bottom_sheet/scoped_password_suggestion_bottom_sheet_reauth_module_override.h" #import "ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.h" @@ -26,6 +27,12 @@ std::unique_ptr<ScopedPasswordSuggestionBottomSheetReauthModuleOverride> SetUpAndReturnMockReauthenticationModuleForPasswordSuggestionBottomSheet(); +// Replace the reauthentication module in Form Input Accessory with +// a fake one to avoid being blocked with a reauth prompt, and return the fake +// reauthentication module. +std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride> +SetUpAndReturnMockReauthenticationModuleForFormInputAccessory(); + } // namespace chrome_test_util #endif // IOS_CHROME_TEST_APP_PASSWORD_TEST_UTIL_H_
diff --git a/ios/chrome/test/app/password_test_util.mm b/ios/chrome/test/app/password_test_util.mm index 4da4966..379e16e 100644 --- a/ios/chrome/test/app/password_test_util.mm +++ b/ios/chrome/test/app/password_test_util.mm
@@ -25,4 +25,12 @@ MakeAndArmForTesting(mock_reauthentication_module); } +std::unique_ptr<ScopedFormInputAccessoryReauthModuleOverride> +SetUpAndReturnMockReauthenticationModuleForFormInputAccessory() { + MockReauthenticationModule* mock_reauthentication_module = + [[MockReauthenticationModule alloc] init]; + return ScopedFormInputAccessoryReauthModuleOverride::MakeAndArmForTesting( + mock_reauthentication_module); +} + } // namespace
diff --git a/ios/chrome/test/app/signin_test_util.mm b/ios/chrome/test/app/signin_test_util.mm index d76d356c..ec425ad 100644 --- a/ios/chrome/test/app/signin_test_util.mm +++ b/ios/chrome/test/app/signin_test_util.mm
@@ -119,8 +119,10 @@ } // Clear last signed in user preference. - browser_state->GetPrefs()->ClearPref(prefs::kGoogleServicesLastGaiaId); - browser_state->GetPrefs()->ClearPref(prefs::kGoogleServicesLastUsername); + browser_state->GetPrefs()->ClearPref( + prefs::kGoogleServicesLastSyncingGaiaId); + browser_state->GetPrefs()->ClearPref( + prefs::kGoogleServicesLastSyncingUsername); // `SignOutAndClearIdentities()` is called during shutdown. Commit all pref // changes to ensure that clearing the last signed in account is saved on
diff --git a/ios/chrome/test/earl_grey/BUILD.gn b/ios/chrome/test/earl_grey/BUILD.gn index 9008600f..d430370 100644 --- a/ios/chrome/test/earl_grey/BUILD.gn +++ b/ios/chrome/test/earl_grey/BUILD.gn
@@ -118,6 +118,7 @@ "//ios/chrome/browser/ui/authentication/signin/advanced_settings_signin:constants", "//ios/chrome/browser/ui/autofill:autofill_ui", "//ios/chrome/browser/ui/autofill:eg_app_support+eg2", + "//ios/chrome/browser/ui/autofill/form_input_accessory:eg_app_support+eg2", "//ios/chrome/browser/ui/autofill/manual_fill", "//ios/chrome/browser/ui/autofill/manual_fill:manual_fill_ui", "//ios/chrome/browser/ui/bookmarks:constants",
diff --git a/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.h b/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.h index da84f89a..362b18d 100644 --- a/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.h +++ b/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.h
@@ -46,6 +46,7 @@ safe_browsing::RealTimeUrlLookupService* GetRealTimeUrlLookupService() override; safe_browsing::HashRealTimeService* GetHashRealTimeService() override; + variations::VariationsService* GetVariationsService() override; bool ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const override; void OnMainFrameUrlQueryCancellationDecided(web::WebState* web_state,
diff --git a/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.mm b/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.mm index 43b60ce..27044b5 100644 --- a/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.mm +++ b/ios/components/security_interstitials/safe_browsing/fake_safe_browsing_client.mm
@@ -30,6 +30,10 @@ return nullptr; } +variations::VariationsService* FakeSafeBrowsingClient::GetVariationsService() { + return nullptr; +} + bool FakeSafeBrowsingClient::ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const { return should_block_unsafe_resource_;
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_client.h b/ios/components/security_interstitials/safe_browsing/safe_browsing_client.h index 6c6b78b2..699c8b0 100644 --- a/ios/components/security_interstitials/safe_browsing/safe_browsing_client.h +++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_client.h
@@ -17,6 +17,10 @@ struct UnsafeResource; } // namespace security_interstitials +namespace variations { +class VariationsService; +} // namespace variations + namespace web { class WebState; } // namespace web @@ -34,8 +38,10 @@ // Gets the real time url look up service. Clients may return nullptr. virtual safe_browsing::RealTimeUrlLookupService* GetRealTimeUrlLookupService() = 0; - // Gets the hash-real-time service factory. Client may return nulltpr. + // Gets the hash-real-time service factory. Client may return nullptr. virtual safe_browsing::HashRealTimeService* GetHashRealTimeService() = 0; + // Gets the variations service. Clients may return nullptr. + virtual variations::VariationsService* GetVariationsService() = 0; // Returns whether or not `resource` should be blocked from loading. virtual bool ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const = 0;
diff --git a/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm b/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm index a68b655..5b3da5d 100644 --- a/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm +++ b/ios/components/security_interstitials/safe_browsing/safe_browsing_service_impl.mm
@@ -156,15 +156,13 @@ safe_browsing::HashRealTimeService* hash_real_time_service = client->GetHashRealTimeService(); - // TODO(crbug.com/1468377): Pass through `variations_service` in - // `GetCountryCode` call. safe_browsing::hash_realtime_utils::HashRealTimeSelection hash_real_time_selection = safe_browsing::hash_realtime_utils::DetermineHashRealTimeSelection( web_state->GetBrowserState()->IsOffTheRecord(), pref_change_registrar_->prefs(), safe_browsing::hash_realtime_utils::GetCountryCode( - /*variations_service=*/nullptr), + client->GetVariationsService()), /*log_usage_histograms=*/true); return std::make_unique<safe_browsing::SafeBrowsingUrlCheckerImpl>(
diff --git a/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.h b/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.h index b566634..b60ff6c 100644 --- a/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.h +++ b/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.h
@@ -19,6 +19,7 @@ safe_browsing::RealTimeUrlLookupService* GetRealTimeUrlLookupService() override; safe_browsing::HashRealTimeService* GetHashRealTimeService() override; + variations::VariationsService* GetVariationsService() override; bool ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const override; void OnMainFrameUrlQueryCancellationDecided(web::WebState* web_state,
diff --git a/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.mm b/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.mm index 8fc7e4b..a4f359a 100644 --- a/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.mm +++ b/ios/web_view/internal/safe_browsing/web_view_safe_browsing_client.mm
@@ -34,6 +34,12 @@ return nullptr; } +variations::VariationsService* +WebViewSafeBrowsingClient::GetVariationsService() { + // ios/web_view does not support variations. + return nullptr; +} + bool WebViewSafeBrowsingClient::ShouldBlockUnsafeResource( const security_interstitials::UnsafeResource& resource) const { return false;
diff --git a/ios_internal b/ios_internal index 53a8c42..d1898d6f 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit 53a8c425fd177be6bf436f31930c2b99408e51eb +Subproject commit d1898d6f4bafeaedb7e6d9e61ace74701449b609
diff --git a/media/capture/video/apple/video_capture_device_apple.mm b/media/capture/video/apple/video_capture_device_apple.mm index 261b03f..ba170f42 100644 --- a/media/capture/video/apple/video_capture_device_apple.mm +++ b/media/capture/video/apple/video_capture_device_apple.mm
@@ -28,32 +28,6 @@ #include "media/capture/video/mac/uvc_control_mac.h" #endif -@implementation DeviceNameAndTransportType { - NSString* __strong _deviceName; - // The transport type of the device (USB, PCI, etc), values are defined in - // <IOKit/audio/IOAudioTypes.h> as kIOAudioDeviceTransportType*. - media::VideoCaptureTransportType _transportType; -} - -- (instancetype)initWithName:(NSString*)deviceName - transportType:(media::VideoCaptureTransportType)transportType { - if (self = [super init]) { - _deviceName = [deviceName copy]; - _transportType = transportType; - } - return self; -} - -- (NSString*)deviceName { - return _deviceName; -} - -- (media::VideoCaptureTransportType)deviceTransportType { - return _transportType; -} - -@end // @implementation DeviceNameAndTransportType - namespace media { namespace {
diff --git a/media/capture/video/apple/video_capture_device_avfoundation_utils.h b/media/capture/video/apple/video_capture_device_avfoundation_utils.h index 2ff09bbf..619fae1 100644 --- a/media/capture/video/apple/video_capture_device_avfoundation_utils.h +++ b/media/capture/video/apple/video_capture_device_avfoundation_utils.h
@@ -24,14 +24,6 @@ std::string CAPTURE_EXPORT MacFourCCToString(OSType fourcc); -// Returns a dictionary of capture devices with friendly name and unique id. -// VideoCaptureDeviceApple should call this function to fetch the list of -// devices available in the system; this method returns the list of device names -// that have to be used with -[VideoCaptureDeviceAVFoundation -// setCaptureDevice:]. -NSDictionary<NSString*, DeviceNameAndTransportType*>* -GetVideoCaptureDeviceNames(); - // Extracts |base_address| and |length| out of a SampleBuffer. Returns true on // success and false if we failed to retrieve the information due to OS call // error return, or unexpected output parameters.
diff --git a/media/capture/video/apple/video_capture_device_avfoundation_utils.mm b/media/capture/video/apple/video_capture_device_avfoundation_utils.mm index eabb8e25..4fe66d9 100644 --- a/media/capture/video/apple/video_capture_device_avfoundation_utils.mm +++ b/media/capture/video/apple/video_capture_device_avfoundation_utils.mm
@@ -44,44 +44,6 @@ return status == noErr && length_at_offset == *length; } -NSDictionary<NSString*, DeviceNameAndTransportType*>* -GetVideoCaptureDeviceNames() { - // At this stage we already know that AVFoundation is supported and the whole - // library is loaded and initialised, by the device monitoring. - NSMutableDictionary<NSString*, DeviceNameAndTransportType*>* device_names = - [[NSMutableDictionary alloc] init]; - - NSArray<AVCaptureDevice*>* devices = GetVideoCaptureDevices(); - - for (AVCaptureDevice* device in devices) { - if ([device hasMediaType:AVMediaTypeVideo] || - [device hasMediaType:AVMediaTypeMuxed]) { - if (device.suspended) { - continue; - } - -#if BUILDFLAG(IS_MAC) - // Transport types are defined for Audio devices and reused for video. - int transport_type = device.transportType; - VideoCaptureTransportType device_transport_type = - (transport_type == kIOAudioDeviceTransportTypeBuiltIn || - transport_type == kIOAudioDeviceTransportTypeUSB) - ? VideoCaptureTransportType::APPLE_USB_OR_BUILT_IN - : VideoCaptureTransportType::OTHER_TRANSPORT; -#else - VideoCaptureTransportType device_transport_type = - VideoCaptureTransportType::APPLE_USB_OR_BUILT_IN; -#endif - DeviceNameAndTransportType* name_and_transport_type = - [[DeviceNameAndTransportType alloc] - initWithName:device.localizedName - transportType:device_transport_type]; - device_names[device.uniqueID] = name_and_transport_type; - } - } - return device_names; -} - gfx::Size GetPixelBufferSize(CVPixelBufferRef pixel_buffer) { return gfx::Size(CVPixelBufferGetWidth(pixel_buffer), CVPixelBufferGetHeight(pixel_buffer));
diff --git a/media/capture/video/apple/video_capture_device_factory_apple.mm b/media/capture/video/apple/video_capture_device_factory_apple.mm index 749758309..7f23a2ce 100644 --- a/media/capture/video/apple/video_capture_device_factory_apple.mm +++ b/media/capture/video/apple/video_capture_device_factory_apple.mm
@@ -22,6 +22,8 @@ #include "media/capture/video/video_capture_metrics.h" #if BUILDFLAG(IS_MAC) +#import <IOKit/audio/IOAudioTypes.h> + #import "media/capture/video/mac/video_capture_device_decklink_mac.h" #endif @@ -39,21 +41,9 @@ } } -media::VideoCaptureFormats GetDeviceSupportedFormats( - const media::VideoCaptureDeviceDescriptor& descriptor) { +media::VideoCaptureFormats GetDeviceSupportedFormats(AVCaptureDevice* device) { media::VideoCaptureFormats formats; - NSArray<AVCaptureDevice*>* devices = media::GetVideoCaptureDevices(); - - AVCaptureDevice* device = nil; - for (device in devices) { - if (base::SysNSStringToUTF8(device.uniqueID) == descriptor.device_id) { - break; - } - } - if (device == nil) { - return media::VideoCaptureFormats(); - } for (AVCaptureDeviceFormat* device_format in device.formats) { // MediaSubType is a CMPixelFormatType but can be used as CVPixelFormatType // as well according to CMFormatDescription.h @@ -69,7 +59,7 @@ media::VideoCaptureFormat format( gfx::Size(dimensions.width, dimensions.height), frameRate.maxFrameRate, pixelFormat); - DVLOG(2) << descriptor.display_name() << " " + DVLOG(2) << device.localizedName << " " << media::VideoCaptureFormat::ToString(format); formats.push_back(std::move(format)); } @@ -143,33 +133,48 @@ DCHECK(thread_checker_.CalledOnValidThread()); EnsureRunsOnCFRunLoopEnabledThread(); + NSArray<AVCaptureDevice*>* devices = media::GetVideoCaptureDevices(); + // Loop through all available devices and add to |devices_info|. std::vector<VideoCaptureDeviceInfo> devices_info; DVLOG(1) << "Enumerating video capture devices using AVFoundation"; - NSDictionary<NSString*, DeviceNameAndTransportType*>* capture_devices = - GetVideoCaptureDeviceNames(); - // Enumerate all devices found by AVFoundation, translate the info for each - // to class Name and add it to |device_names|. - for (NSString* key in capture_devices) { - const std::string device_id = base::SysNSStringToUTF8(key); - const VideoCaptureApi capture_api = VideoCaptureApi::MACOSX_AVFOUNDATION; - VideoCaptureTransportType device_transport_type = - [capture_devices[key] deviceTransportType]; - const std::string model_id = VideoCaptureDeviceApple::GetDeviceModelId( - device_id, capture_api, device_transport_type); - const VideoCaptureControlSupport control_support = - VideoCaptureDeviceApple::GetControlSupport(model_id); - VideoCaptureDeviceDescriptor descriptor( - base::SysNSStringToUTF8([capture_devices[key] deviceName]), device_id, - model_id, capture_api, control_support, device_transport_type); - if (IsDeviceBlocked(descriptor)) { - continue; - } - devices_info.emplace_back(descriptor); - // Get supported formats - devices_info.back().supported_formats = - GetDeviceSupportedFormats(descriptor); + for (AVCaptureDevice* device in devices) { + if ([device hasMediaType:AVMediaTypeVideo] || + [device hasMediaType:AVMediaTypeMuxed]) { + if (device.suspended) { + continue; + } + + const std::string device_id = base::SysNSStringToUTF8(device.uniqueID); + const VideoCaptureApi capture_api = VideoCaptureApi::MACOSX_AVFOUNDATION; +#if BUILDFLAG(IS_MAC) + // Transport types are defined for Audio devices and reused for video. + int transport_type = device.transportType; + VideoCaptureTransportType device_transport_type = + (transport_type == kIOAudioDeviceTransportTypeBuiltIn || + transport_type == kIOAudioDeviceTransportTypeUSB) + ? VideoCaptureTransportType::APPLE_USB_OR_BUILT_IN + : VideoCaptureTransportType::OTHER_TRANSPORT; +#else + VideoCaptureTransportType device_transport_type = + VideoCaptureTransportType::APPLE_USB_OR_BUILT_IN; +#endif + const std::string model_id = VideoCaptureDeviceApple::GetDeviceModelId( + device_id, capture_api, device_transport_type); + const VideoCaptureControlSupport control_support = + VideoCaptureDeviceApple::GetControlSupport(model_id); + VideoCaptureDeviceDescriptor descriptor( + base::SysNSStringToUTF8(device.localizedName), device_id, model_id, + capture_api, control_support, device_transport_type); + if (IsDeviceBlocked(descriptor)) { + continue; + } + devices_info.emplace_back(descriptor); + + // Get supported formats + devices_info.back().supported_formats = GetDeviceSupportedFormats(device); + } } #if BUILDFLAG(IS_MAC)
diff --git a/media/renderers/paint_canvas_video_renderer.cc b/media/renderers/paint_canvas_video_renderer.cc index 876a9ca..a707bc0 100644 --- a/media/renderers/paint_canvas_video_renderer.cc +++ b/media/renderers/paint_canvas_video_renderer.cc
@@ -10,6 +10,7 @@ #include "base/barrier_closure.h" #include "base/compiler_specific.h" +#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/functional/callback_helpers.h" #include "base/logging.h" @@ -702,6 +703,60 @@ } } +// Valid gl texture internal format that can try to use direct uploading path +// via SharedImage. This is a subset of the formats supported by +// ValidFormatForDirectUploading(), as IOSurfaceImageBacking cannot support +// shorts (either 4444 or 565). +bool ValidFormatForDirectUploadingViaSharedImage( + viz::RasterContextProvider* raster_context_provider, + GrGLenum format, + unsigned int type) { + const gpu::Capabilities& context_caps = + raster_context_provider->ContextCapabilities(); + switch (format) { + case GL_RGBA: + return type == GL_UNSIGNED_BYTE; + case GL_RGB: + return type == GL_UNSIGNED_BYTE; + // WebGL2 supported sized formats + case GL_RGBA8: + case GL_RGBA16F: + case GL_RGB8: + case GL_RGB10_A2: + return context_caps.major_version >= 3; + default: + return false; + } +} + +// SharedImageFormat corresponding to GL texture format/type, which must be +// valid for direct uploading via SharedImage. +viz::SharedImageFormat SharedImageFormatForDirectUploading( + viz::RasterContextProvider* raster_context_provider, + GrGLenum format, + unsigned int type) { + CHECK(ValidFormatForDirectUploadingViaSharedImage(raster_context_provider, + format, type)); + switch (format) { + case GL_RGBA: + CHECK(type == GL_UNSIGNED_BYTE); + return viz::SinglePlaneFormat::kRGBA_8888; + case GL_RGB: + CHECK(type == GL_UNSIGNED_BYTE); + return viz::SinglePlaneFormat::kRGBX_8888; + // WebGL2 supported sized formats + case GL_RGBA8: + return viz::SinglePlaneFormat::kRGBA_8888; + case GL_RGBA16F: + return viz::SinglePlaneFormat::kRGBA_F16; + case GL_RGB8: + return viz::SinglePlaneFormat::kRGBX_8888; + case GL_RGB10_A2: + return viz::SinglePlaneFormat::kRGBA_1010102; + } + NOTREACHED_NORETURN(); +} + std::tuple<SkYUVAInfo::PlaneConfig, SkYUVAInfo::Subsampling> VideoPixelFormatAsSkYUVAInfoValues(VideoPixelFormat format) { // The 9, 10, and 12 bit formats could be added here if GetYUVAPlanes() were @@ -723,6 +778,12 @@ } } +// Whether SharedImage is used to perform direct GPU-GPU VideoFrame to GL +// texture uploads (when allowed) rather than legacy mailboxes. +BASE_FEATURE(kUseSharedImageForDirectUpload, + "UseSharedImageForDirectUpload", + base::FEATURE_DISABLED_BY_DEFAULT); + } // anonymous namespace // Generates an RGB image from a VideoFrame. Convert YUV to RGB plain on GPU. @@ -1439,7 +1500,8 @@ unsigned int type, int level, bool premultiply_alpha, - bool flip_y) { + bool flip_y, + bool allow_shared_image_for_direct_upload) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); DCHECK(video_frame); DCHECK(video_frame->HasTextures()); @@ -1465,10 +1527,19 @@ (video_frame->NumTextures() > 1 || video_frame->shared_image_format_type() == SharedImageFormatType::kSharedImageFormat)) { - if (UploadVideoFrameToGLTexture(raster_context_provider, destination_gl, - video_frame.get(), target, texture, - internal_format, format, type, flip_y)) { - return true; + if (allow_shared_image_for_direct_upload && + base::FeatureList::IsEnabled(kUseSharedImageForDirectUpload)) { + if (UploadVideoFrameToGLTextureViaSharedImage( + raster_context_provider, destination_gl, video_frame, target, + texture, internal_format, format, type, flip_y)) { + return true; + } + } else { + if (UploadVideoFrameToGLTexture( + raster_context_provider, destination_gl, video_frame.get(), + target, texture, internal_format, format, type, flip_y)) { + return true; + } } } @@ -1537,6 +1608,87 @@ return true; } +bool PaintCanvasVideoRenderer::UploadVideoFrameToGLTextureViaSharedImage( + viz::RasterContextProvider* raster_context_provider, + gpu::gles2::GLES2Interface* destination_gl, + scoped_refptr<VideoFrame> video_frame, + unsigned int target, + unsigned int texture, + unsigned int internal_format, + unsigned int format, + unsigned int type, + bool flip_y) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + DCHECK(video_frame); + if (!VideoFrameYUVConverter::IsVideoFrameFormatSupported(*video_frame)) { + return false; + } + + // TODO(crbug.com/1108154): Support more texture target, e.g. + // 2d array, 3d etc. + if (target != GL_TEXTURE_2D) { + return false; + } + + if (flip_y) { + // CopyVideoFrameToSharedImage() cannot handle `flip_y` being true. + return false; + } + + if (!ValidFormatForDirectUploadingViaSharedImage( + raster_context_provider, static_cast<GLenum>(internal_format), + type)) { + return false; + } + + DCHECK(video_frame->metadata().texture_origin_is_top_left); + + if (!raster_context_provider) { + return false; + } + + auto* sii = raster_context_provider->SharedImageInterface(); + + auto shared_image_format = SharedImageFormatForDirectUploading( + raster_context_provider, static_cast<GLenum>(internal_format), type); + + // Create a SharedImage to associate with `texture`. + gpu::MailboxHolder destination_holder; + destination_holder.texture_target = target; + destination_holder.mailbox = sii->CreateSharedImage( + shared_image_format, video_frame->visible_rect().size(), + GetVideoFrameRGBColorSpacePreferringSRGB(video_frame.get()), + kTopLeft_GrSurfaceOrigin, kPremul_SkAlphaType, + gpu::SHARED_IMAGE_USAGE_GLES2, "PaintCanvasVideoRenderer_DirectUpload", + gpu::kNullSurfaceHandle); + + // Copy the VideoFrame's textures to the SI. + destination_holder.sync_token = sii->GenUnverifiedSyncToken(); + auto copy_token = CopyVideoFrameToSharedImage(raster_context_provider, + video_frame, destination_holder, + /*use_visible_rect=*/true); + + // Ensure that GL waits for the SI to be created and have its contents updated + // before accessing it. + destination_gl->WaitSyncTokenCHROMIUM(copy_token.GetConstData()); + + // Attach the SI to the destination texture and bring the SI's contents into + // that destination texture (note that WebGL can potentially render to this + // texture as well as reading from it, hence access mode READWRITE). + destination_gl->TexImage2DSharedImageCHROMIUM( + texture, destination_holder.mailbox.name); + destination_gl->BeginSharedImageAccessDirectCHROMIUM( + texture, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM); + + // Drop the SharedImage factory ref once GL has finished accessing it - the + // SI will stay alive until the client destroys `texture`. + gpu::SyncToken gl_token; + destination_gl->GenUnverifiedSyncTokenCHROMIUM(gl_token.GetData()); + sii->DestroySharedImage(gl_token, destination_holder.mailbox); + + return true; +} + bool PaintCanvasVideoRenderer::UploadVideoFrameToGLTexture( viz::RasterContextProvider* raster_context_provider, gpu::gles2::GLES2Interface* destination_gl, @@ -1641,6 +1793,100 @@ return true; } +// static +bool PaintCanvasVideoRenderer::PrepareVideoFrameForWebGL( + viz::RasterContextProvider* raster_context_provider, + gpu::gles2::GLES2Interface* destination_gl, + scoped_refptr<VideoFrame> video_frame, + unsigned int target, + unsigned int texture) { + // TODO(776222): This static function uses no common functionality in + // PaintCanvasVideoRenderer, and should be removed from this class. + CHECK(video_frame); + CHECK(video_frame->HasTextures()); + if (video_frame->NumTextures() == 1 && + video_frame->shared_image_format_type() != + SharedImageFormatType::kSharedImageFormat) { + if (target == GL_TEXTURE_EXTERNAL_OES) { + // We don't support Android now. + // TODO(crbug.com/776222): support Android. + return false; + } + // We don't support sharing single video frame texture now. + // TODO(crbug.com/776222): deal with single video frame texture. + return false; + } + + DCHECK(video_frame->metadata().texture_origin_is_top_left); + + if (video_frame->shared_image_format_type() == + SharedImageFormatType::kLegacy) { + // TODO(nazabris): Support OOP-R code path here that does not have + // GrContext. + if (!raster_context_provider || !raster_context_provider->GrContext()) { + return false; + } + + // Take webgl video texture as 2D texture. Setting it as external render + // target backend for skia. + BindAndTexImage2D(destination_gl, target, texture, + /*internal_format=*/GL_RGBA, /*format=*/GL_RGBA, + /*type=*/GL_UNSIGNED_BYTE, /*level=*/0, + video_frame->coded_size()); + + CHECK_GT(video_frame->NumTextures(), 1u); + gpu::MailboxHolder mailbox_holder; + mailbox_holder.texture_target = target; + gpu::raster::RasterInterface* source_ri = + raster_context_provider->RasterInterface(); + destination_gl->ProduceTextureDirectCHROMIUM(texture, + mailbox_holder.mailbox.name); + destination_gl->GenUnverifiedSyncTokenCHROMIUM( + mailbox_holder.sync_token.GetData()); + + // Generate a new image. + VideoFrameYUVConverter::ConvertYUVVideoFrameNoCaching( + video_frame.get(), raster_context_provider, mailbox_holder); + + // Wait for mailbox creation on canvas context before consuming it and + // copying from it on the consumer context. + source_ri->GenUnverifiedSyncTokenCHROMIUM( + mailbox_holder.sync_token.GetData()); + + destination_gl->WaitSyncTokenCHROMIUM( + mailbox_holder.sync_token.GetConstData()); + + WaitAndReplaceSyncTokenClient client(source_ri); + video_frame->UpdateReleaseSyncToken(&client); + } else { + // Take webgl video texture as 2D texture. Setting it as external render + // target backend for skia. + BindAndTexImage2D(destination_gl, target, texture, + /*internal_format=*/GL_RGBA, /*format=*/GL_RGBA, + /*type=*/GL_UNSIGNED_BYTE, /*level=*/0, + video_frame->coded_size()); + + CHECK_EQ(video_frame->NumTextures(), 1u); + CHECK_EQ(video_frame->shared_image_format_type(), + SharedImageFormatType::kSharedImageFormat); + gpu::MailboxHolder mailbox_holder = + GetVideoFrameMailboxHolder(video_frame.get()); + destination_gl->WaitSyncTokenCHROMIUM( + mailbox_holder.sync_token.GetConstData()); + + destination_gl->CopySharedImageToTextureINTERNAL( + texture, target, GL_RGBA, GL_UNSIGNED_BYTE, + /*src_x=*/0, /*src_y=*/0, video_frame->coded_size().width(), + video_frame->coded_size().height(), /*flip_y=*/GL_FALSE, + mailbox_holder.mailbox.name); + + WaitAndReplaceSyncTokenClient client(destination_gl); + video_frame->UpdateReleaseSyncToken(&client); + } + + return true; +} + bool PaintCanvasVideoRenderer::CopyVideoFrameYUVDataToGLTexture( viz::RasterContextProvider* raster_context_provider, gpu::gles2::GLES2Interface* destination_gl, @@ -1652,7 +1898,8 @@ unsigned int type, int level, bool premultiply_alpha, - bool flip_y) { + bool flip_y, + bool allow_shared_image_for_direct_upload) { if (!raster_context_provider) return false; #if BUILDFLAG(IS_ANDROID) @@ -1683,10 +1930,19 @@ // accurate. if ((media::IsOpaque(video_frame->format()) || premultiply_alpha) && level == 0) { - if (UploadVideoFrameToGLTexture(raster_context_provider, destination_gl, - video_frame, target, texture, - internal_format, format, type, flip_y)) { - return true; + if (allow_shared_image_for_direct_upload && + base::FeatureList::IsEnabled(kUseSharedImageForDirectUpload)) { + if (UploadVideoFrameToGLTextureViaSharedImage( + raster_context_provider, destination_gl, video_frame, target, + texture, internal_format, format, type, flip_y)) { + return true; + } + } else { + if (UploadVideoFrameToGLTexture(raster_context_provider, destination_gl, + video_frame, target, texture, + internal_format, format, type, flip_y)) { + return true; + } } }
diff --git a/media/renderers/paint_canvas_video_renderer.h b/media/renderers/paint_canvas_video_renderer.h index 177840b..d4934904d 100644 --- a/media/renderers/paint_canvas_video_renderer.h +++ b/media/renderers/paint_canvas_video_renderer.h
@@ -116,6 +116,13 @@ // Copy the contents of |video_frame| to |texture| of |destination_gl|. // // The format of |video_frame| must be VideoFrame::NATIVE_TEXTURE. + // `allow_shared_image_for_direct_upload` specifies whether it is possible to + // use a temporary SharedImage to perform a GPU-GPU upload from the video + // frame's texture(s) to the destination texture. This requires that the + // caller keep `texture` alive, and should be set to false in contexts where + // that is not the case. + // TODO(986480): Remove `allow_shared_image_for_direct_upload` once + // VideoDecoderShim no longer calls this function. bool CopyVideoFrameTexturesToGLTexture( viz::RasterContextProvider* raster_context_provider, gpu::gles2::GLES2Interface* destination_gl, @@ -127,7 +134,16 @@ unsigned int type, int level, bool premultiply_alpha, - bool flip_y); + bool flip_y, + bool allow_shared_image_for_direct_upload); + + // TODO(776222): Remove this function from PaintCanvasVideoRenderer. + static bool PrepareVideoFrameForWebGL( + viz::RasterContextProvider* raster_context_provider, + gpu::gles2::GLES2Interface* gl, + scoped_refptr<VideoFrame> video_frame, + unsigned int target, + unsigned int texture); // Copy the CPU-side YUV contents of |video_frame| to texture |texture| in // context |destination_gl|. @@ -147,7 +163,8 @@ unsigned int type, int level, bool premultiply_alpha, - bool flip_y); + bool flip_y, + bool allow_shared_image_for_direct_upload); // Calls texImage2D where the texture image data source is the contents of // |video_frame|. Texture |texture| needs to be created and bound to |target| @@ -259,6 +276,17 @@ viz::RasterContextProvider* raster_context_provider, const gpu::MailboxHolder& dest_holder); + bool UploadVideoFrameToGLTextureViaSharedImage( + viz::RasterContextProvider* raster_context_provider, + gpu::gles2::GLES2Interface* destination_gl, + scoped_refptr<VideoFrame> video_frame, + unsigned int target, + unsigned int texture, + unsigned int internal_format, + unsigned int format, + unsigned int type, + bool flip_y); + bool UploadVideoFrameToGLTexture( viz::RasterContextProvider* raster_context_provider, gpu::gles2::GLES2Interface* destination_gl,
diff --git a/media/renderers/paint_canvas_video_renderer_unittest.cc b/media/renderers/paint_canvas_video_renderer_unittest.cc index f2cba64bf..9671fd9 100644 --- a/media/renderers/paint_canvas_video_renderer_unittest.cc +++ b/media/renderers/paint_canvas_video_renderer_unittest.cc
@@ -1095,7 +1095,7 @@ renderer_.CopyVideoFrameTexturesToGLTexture( media_context_.get(), destination_gl, frame, target, texture, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 0, false /* premultiply_alpha */, - false /* flip_y */); + false /* flip_y */, /*allow_shared_image_for_direct_upload=*/true); gfx::Size expected_size = frame->visible_rect().size(); @@ -1254,7 +1254,7 @@ renderer_.CopyVideoFrameYUVDataToGLTexture( media_context_.get(), destination_gl, cropped_frame(), target, texture, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 0, false /* premultiply_alpha */, - false /* flip_y */); + false /* flip_y */, /*allow_shared_image_for_direct_upload=*/true); gfx::Size expected_size = cropped_frame()->visible_rect().size(); @@ -1286,7 +1286,7 @@ renderer_.CopyVideoFrameYUVDataToGLTexture( media_context_.get(), destination_gl, cropped_frame(), target, texture, GL_RGBA, GL_RGBA, GL_UNSIGNED_BYTE, 0, false /* premultiply_alpha */, - true /* flip_y */); + true /* flip_y */, /*allow_shared_image_for_direct_upload=*/true); gfx::Size expected_size = cropped_frame()->visible_rect().size();
diff --git a/media/renderers/video_frame_yuv_converter.cc b/media/renderers/video_frame_yuv_converter.cc index 512b25e0..250019c 100644 --- a/media/renderers/video_frame_yuv_converter.cc +++ b/media/renderers/video_frame_yuv_converter.cc
@@ -181,9 +181,11 @@ mailboxes, /*allow_multiplanar_for_upload=*/false); ri->ConvertYUVAMailboxesToRGB( - dest_mailbox_holder.mailbox, holder_->yuva_info().yuvColorSpace(), - nullptr, holder_->yuva_info().planeConfig(), - holder_->yuva_info().subsampling(), mailboxes); + dest_mailbox_holder.mailbox, 0, 0, video_frame->coded_size().width(), + video_frame->coded_size().height(), + holder_->yuva_info().yuvColorSpace(), nullptr, + holder_->yuva_info().planeConfig(), holder_->yuva_info().subsampling(), + mailboxes); } return true; }
diff --git a/net/android/BUILD.gn b/net/android/BUILD.gn index a4dc2ad..e1a2f24a 100644 --- a/net/android/BUILD.gn +++ b/net/android/BUILD.gn
@@ -161,8 +161,6 @@ # Used as an additional_apk in test scripts. never_incremental = true - enable_multidex = true - # Required on Android Q+ to read from /sdcard when installing certs. target_sdk_version = 28
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java index e9f01d07..dee5d4f 100644 --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -1228,6 +1228,14 @@ } /** + * Returns all connected networks that are useful and accessible to Chrome. + * Only callable on Lollipop and newer releases. + */ + public Network[] getNetworksForTesting() { + return getAllNetworksFiltered(mConnectivityManagerDelegate, null); + } + + /** * Returns an array of all of the device's currently connected * networks and ConnectionTypes, including only those that are useful and accessible to Chrome. * Array elements are a repeated sequence of: @@ -1251,16 +1259,25 @@ } /** + * Returns the device's current default connected network used for + * communication. + * Only implemented on Lollipop and newer releases, returns null when not implemented. + */ + public Network getDefaultNetwork() { + if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { + return null; + } + return mConnectivityManagerDelegate.getDefaultNetwork(); + } + + /** * Returns NetID of device's current default connected network used for * communication. * Only implemented on Lollipop and newer releases, returns NetId.INVALID * when not implemented. */ public long getDefaultNetId() { - if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) { - return NetId.INVALID; - } - Network network = mConnectivityManagerDelegate.getDefaultNetwork(); + Network network = getDefaultNetwork(); return network == null ? NetId.INVALID : networkToNetId(network); }
diff --git a/net/http/transport_security_state_static.json b/net/http/transport_security_state_static.json index 076a01c..3e9b1b7 100644 --- a/net/http/transport_security_state_static.json +++ b/net/http/transport_security_state_static.json
@@ -76,6 +76,16 @@ { "name": "bing", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "xbox", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "microsoft", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "amazon", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "audible", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "fire", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "imdb", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "kindle", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "prime", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "silk", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "zappos", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--cckwcxetd", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--jlq480n2rg", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, // Domains on the public suffix list that have requested to be preloaded. { "name": "bmoattachments.org", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, { "name": "now.sh", "policy": "public-suffix", "mode": "force-https", "include_subdomains": true }, @@ -31378,7 +31388,6 @@ { "name": "musthinsider.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "my-sex-cam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "mywindscreen.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "nbclinic.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nfl.ddns.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nicolettajennings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "nrthcdn.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -33635,7 +33644,6 @@ { "name": "rustls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rustls.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "saathi.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "sachse.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "safenetwork.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "samisoft.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "sandra-perlbach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -50239,11 +50247,8 @@ { "name": "chicago-mold.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "chicagobasementblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "codeberg.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "coderema.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "coderema.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "confia.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "consoe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "coretema.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "coubron-escrime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cubatel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "cuddlybeardaycare.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -84222,7 +84227,6 @@ { "name": "usa10.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "usenethd.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "utterman.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "uubb.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "vakantiehuisverzekeringen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valariejenkins.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "valemusicfest.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -96372,7 +96376,6 @@ { "name": "dunkingwithwolves.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "durand.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "durastudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "durvalpereira.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "duwitmu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dvminsight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dwservice.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -103518,7 +103521,6 @@ { "name": "iwant-sex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ixxat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "iyiarastir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "iyte.edu.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jaipurescortagency.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jamesautodude.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "jameszero.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -108772,7 +108774,6 @@ { "name": "dair.community", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "damsafety.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "danaandnathan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "danielnaaman.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dansasphaltmaintenance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "dashipping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "datatruckers.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -111366,8 +111367,6 @@ { "name": "royoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rsg-ltd.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rubiogafsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rusnum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "rusnum.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "russianflora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "russianflora.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "rust.yokohama", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -114719,7 +114718,6 @@ { "name": "almdrasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "aloeveralisboa.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alskar.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "altenheim.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "alukard.gq", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amanydesignstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "amicare.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -116402,7 +116400,6 @@ { "name": "accent-homedecor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "accessingram.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "acct-affiliate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "acio.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "acquirebpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ad-bp.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "additioacademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117620,7 +117617,6 @@ { "name": "letskona.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "levalbuterol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "levaomat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "levmarkov.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "leyangyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lf-space.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "lgsystems.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -117694,7 +117690,6 @@ { "name": "marife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "markdorf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "markmet.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "markov.com.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "martesanamilano.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marthas.sale", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "marwadionline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -118118,7 +118113,6 @@ { "name": "radio.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radogear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "radsafety.inf.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "raedium.aero", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "raffall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "raisingresilientreaders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "ralaoui.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -120604,7 +120598,6 @@ { "name": "hkde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hkfair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hkmade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, - { "name": "hkmusz.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hksfc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hln.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "hlp.group", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, @@ -125538,6 +125531,2281 @@ { "name": "zuiwuxia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zyhouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, { "name": "zyshow.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "025500.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "047329.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "048661.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "051014.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "074696.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "074758.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "085035.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "089640.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10218app.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10218app10218.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "10218cj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "104760.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "105861.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "161.sh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "172792.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "184325.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "207169.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "223742.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "22ndstreet.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "240525.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "242846.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "29zw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "308274.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "3090.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "31.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "370385.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "377854.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "384854.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "397542.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "419213.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "424102.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "440313.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "443782.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "446072.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "467413.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "476470.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "483610.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "558137.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "572223.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "578064.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "578173.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "594795.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5dm.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5dm.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "5fm.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "608245.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "608460.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "614989.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "692241.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "694640.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "695346.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "725741.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "751930.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "753345.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "755364.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "759419.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "75dr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "78.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "793703.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "7fi.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "805084.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "807252.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "824886.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "863479.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "869293.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "977395.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9ostech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "9wsodl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "academiaofimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accountryclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "accuphotography.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "actonsoft.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adaptiveexercisegroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adcpressurewashing.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adler-international.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adresse-ip-publique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adrianiacobus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "adst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "advancedseo.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aerotrans-service.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "afdrek.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "agpandit.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ahezu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aipdev.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "airconditioningservicejohannesburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aitindo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akcs.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akoestischafbouwen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "akuvo.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alajv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alarko-carrier.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alcatrazz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alimade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alimtyaz.estate", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allbets.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allette.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "allpost.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almadaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "almushealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alonuocsuoi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphaworks.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alphazure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "alternativa-kaluga.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aly.pet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amademy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ambassify.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ambassify.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amelia-wedding.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "amiatlanticare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ammex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "analyticsinsight.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andersonenergy.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andree.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "andsoul.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "animofluteandpiano.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aniosindustries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "annetardif.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "anticas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antifurt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antilight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "antoniolatimore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aoconsultoria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aolipu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aonhewitt.com.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aonhewitt.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aonsolutions.com.cy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aonsolutions.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apartyakamoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apbassettsolicitors.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apexpreciousmetals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apextrailers.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apiana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aporter.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apostasdesportivas.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apostillas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "app-colissimo.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "app-internalapps-v1-uat-crd-hd.azurewebsites.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apparelfashion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "applecool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "applesin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "appo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "apuestaes.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aquatherm72.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arabafenicespa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arakomputer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arcade.casa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arirex.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arktomato.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aroma-wave.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aromacraft.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arpuff.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arrier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "art-et-psyche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artcentar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "arteid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artemovsk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artfight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artificialaxis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artisandairy.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "artworkpath.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aruite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asbf-rambouillet.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aseint.com.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiabasket.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiabyte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiaimage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiaos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiaparking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiapavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asiasign.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "askpam.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "asodia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "assaabloy-partnerportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astonbysqli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astorfoodservice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astorhospitality.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astorline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astrati.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "astreaspa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atlas.computer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atlusnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "atrogi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "attechnical.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "auberson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aufeergroup.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aufnehmen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aurora-nexus.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aurory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "australianfries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "australiangold.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "austsun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autocollimators.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoesa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autokeskus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "automv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autonomicbalance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "autoprince.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avansyourself.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avatedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "averywinters.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avhunter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aviarycourthotel.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avio.rest", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avocadostore.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avocadostore.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avoidfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avrrom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avsee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avtorrent.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "avvisatore.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "awardtraining.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "awing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "aybak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ayunas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "az-flag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azbuka-bp.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azic.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "azirha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b2btaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "b3bra.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baardagaam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "babyroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bacchus.report", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "backbleche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "backcolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "badematten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bags4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bagtea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bagteria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bagun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baibaby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baichat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baichen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baieyes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baifutong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baimap.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baimoney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baiqiuen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baishuiyang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baispace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baitalk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baiwen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bakmaskin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ballamor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baltlex.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bamboorose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bamdad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bank34.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bankja.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "banori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bantoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baochen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baodiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baoguai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baohong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baohu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baomin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baowei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baoyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baoyou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barbarianbear.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barklanepets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "barrafranca.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bartekbv.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bartershift.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baterfly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "batlan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "batmobile.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bats.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "battle-scars.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "battlescars.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "baxian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bayrampasa.bel.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bebra.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bebra.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bebrenok.trade", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bebrik.men", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bebrochka.loan", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beebruh.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beebuy.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beebuy.restaurant", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beeebraa.download", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beiyongjin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bekanntgabe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beniskala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bensvpn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beoandpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "berlponorogo.biz.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bernardocoelho.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bernardwatch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bernerfotos.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "beta.pw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betordertr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "betrisey.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettercommunication.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettingbangladesh.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettingmalaysia.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettingphilippines.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bettysseafoodshack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bhangarh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biahposter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biankong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biblura.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bibra.bid", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigbroeyes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bigmore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bijuteria-venetia.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bijuteriavenetia.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "binyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "birenbaum.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "biret.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bitower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackashstudio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackdogammunition.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackstudio.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blackvinegarcollection.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blend.works", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blk-intern.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blk-kriens.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blogthetech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blucoat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blueboybernie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "blueskycantina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluespace.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluespace.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bluprintoncology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bmblawfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boden.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boden.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodenclothing.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodendirect.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodendirect.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodenpreview.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodenpreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodenpreview.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodenusa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bodusod.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bogenexten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bombeirostv.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bookingplacecostarica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bowlfed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "boxalouer78.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bp-app.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bracesjourney.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brandnous.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brands-sports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brc.fj.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breakinoutpr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "breastdensitynj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brickell.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridge-xs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bridozia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "britishantiquefurniture.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brivawn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "brou.com.uy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bsgcredit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bsgexchange.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buatcvonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "buffandtan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "bundle.tools", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "burakuckun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "businessgold.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "butongshidai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "byzhihuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "c0nfigurati0n.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "c4164.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cablefibreoptique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caduceuslane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cafe-bg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caissefrancaisedefinancementlocal.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calsense.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "calzaturificiogensi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cameriere.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caminosalavida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "canabeinternacional.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cardmates.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cardswith.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carefu.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carlijnottens.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carloscolina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carlsonfonder.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carlsonfund.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carlsonfunds.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "carthagecement.com.tn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cartorio4oficiojuazeiro.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casemoose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casinoscryptos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "casperfect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "caymart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cb96net.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cdnpkg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cedsp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ceo-consulting.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cephx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "certificados.edu.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cfaimpact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cgpcollective.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ch341.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chabliscadillac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chain-reaction.org.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chamsocial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chartmogul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chinadear.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chinadecor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chinaep.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chlopes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chroot.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "chwempower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cim.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "claster.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cleansheetsaz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "climbernews.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "clothoff.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudbees.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cloudshredder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "club-nautique-sainte-maxime.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cneic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cnitc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cnjx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cnlaser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cnpets.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cocogoat.work", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coda-erfurt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "codelinchpin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coefficient.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coffeebiz.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colinobrien.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collideascope.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "collobrieres.restaurant", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coloquiocentrooeste.mat.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colorfultree.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "colorrock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comandate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "commentutiliser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "commeunefleche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "commhealthcollab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "communiquons.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "compact.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "computermaus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "comunism.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conceptfoundation.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "connell.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conque.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conselljoventutillesbalears.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "constructoraisaba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "consuladospanama.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conumdrum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "conventioncamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "convertidos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cookridge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coolala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coolcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "copperminegallery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "copychina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "corima.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "corporatecompany.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "corribee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coscol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "costantina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cosynest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "countrygrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coursegolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "coursehero.ph", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cousot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "couverture-saint-nazaire.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cpumate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cqgj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cqrb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crackaway.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crackroot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "craibstone.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crazyfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creativeground.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creativekitchens.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creativeqc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creayes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creditscoresmart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "creeksidecentre.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crias.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crosschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crowdamp.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crual.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "crypto-gambling.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cryptolinchpin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "csedsp.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "csharpfactory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ctichina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuarentena.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cucciolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuide.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cuifeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "culate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "culiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cumulus.photo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cwalla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberblog.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cyberoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "cybrient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "czyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dagudong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dahuocang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dahuojia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daigang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daigong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dakucha.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "damassimo.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danbaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danglas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "danielaswish.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daodaoquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "daoxiangchun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darkcodes.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darkraver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darksoilcbd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "darysvet.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dasgelbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datenflatrate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "datuanyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "davoiceradio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dawprogram.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dawushan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dbsalon.beauty", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dcmcleanair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "debiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "debofnight.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decima.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "declutteringmymess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "decolour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deephustlellc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "defesa.gov.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "degreequalified.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "degrey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "deindustry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demaecan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "demohubglobal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denizlicilingir.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dentalnasser.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "denver.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "departamentos.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "depcoa.date", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "depd.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dermalenzburg.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "descuentomi.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "desygner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dg-hyp.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dg-hyp.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dghyp.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dhursanconstruction.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dianchoi.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dianzipan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diet-hack.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digicamchart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digilock.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digimen.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digimen.icu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digimen.love", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digimen.store", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digimen.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digimen.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digital4starazagora.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalchange.coach", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalmomblog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "digitalwebstories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dihydrotestosteron.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dingni.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diplobel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "discountdimmers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disgruntledcode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "disinfestazione.roma.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "displaymat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "district08cnca.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "diuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dixieweld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dizun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dkay.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dkbilliards.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dllsearch.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dlzc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm-drogeriemarkt.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dm.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbfinans.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbfonder.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnor.com.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnorfinance.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnorfinans.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnorfinans.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnorfinans.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnorfond.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbnorprivat.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbprivat.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnbung.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dnfirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dns0.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doctaforum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "documentationsite.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dodaf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doghome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doinwp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domaine-de-garbelle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "domainwings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "donate-streamer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dongfangliang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doo.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doremy.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "doveweekend.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dpsengineers.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drap-pa.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drbaxter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drdomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dressrose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dripflow.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dronedeploy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "drugrehabjohannesburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ds-market.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dubboskills.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "duelcasino.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dumbdrinker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "durad.in.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dwarkin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "dylansevier.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-dechet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "e-jasiecki.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eagler.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "earthcam.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eastdragon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eastsafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eastunion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easy2get.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easybeach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "easyenjoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ebikeanswers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ebs.to", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecco-verde.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecolequebec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecopowerenginewash.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ecoscanapp.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ect-telecoms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eduba.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "edubase.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "efficientip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eg-dev.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ekocyber.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elektrikumraniye.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elementmea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eleonora.gay", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elevationxstudios.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eliteholidaylights.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eliteprofit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "elixirfactory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "embouts-et-bouchons.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "emmilein.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "empeltd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "empirestatejazzcafe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "energiemines.ma", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "engineer-route.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enolalingerie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "enrichdata.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "entreutilidades.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eotvosoh.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eqinfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "equipecarriere.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "escale33bienetre.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "esporters.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "etlaq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "euromobi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "euroslim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "eventex-rentals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exescan.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exeterfit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expatwealthatwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "expressstairliftssw.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "extendedteam.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "exterminateur-punaise-de-lit.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fairauctions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fairwaycorner.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fajasreductoras.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "familiebaehr.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "farmako.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "faure.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "felixlatscha.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fennech.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fermenteana.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "filmotekaplus.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "firstserviceplumbing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fisioterapiaalquimia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fitikafo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fixorg.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fizjourogeek.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flakytest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flatreviews.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flexartsocial.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flextypes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flexworkhero.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "flowith.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "followthecult.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "footballforfuture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forboy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forexbrokerinspect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "forexiran.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "formation-astro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "foxpia.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fpspimart.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frankowska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "freebirdairlines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fremontsmilesdentistry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frequenting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frescafit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fresh4trash.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "friendsline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frischgepresst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frisure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "froip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frontwings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "frostexpert.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fruitycasinos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ftkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fucai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuguo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuites-eau-charente.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fullpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fullwise.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "funchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fundschina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "funkeln.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "furniturefromthebarn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuseta.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fustang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "futurefeel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fuzhouair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fxkj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fxzl.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fyfd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fyjs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fzen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "fzsj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g654.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "g684.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gadgetstock.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gadzetomania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaeldst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gagagaga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaidashi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaitianli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "galblaas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gallerytube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gameafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gamepunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gameregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gamingchairmaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gangli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gangneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ganneng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaochan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaoyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gaoyu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "garagenbau.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gardeningtool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gartenanlage.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gasdetect.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gasdruck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gastgeberin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gastroboom.kz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gbchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gbrand.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gbrowse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geheimtipp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geigenbogen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gelangte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gelsemium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gemeen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gemeinderat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gemeinwesen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gentech.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geocell.website", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gerardnass.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gerasimos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "germankid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "germanwedding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "germanypavilion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "getinshape.today", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gewerbe-fix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gewerbefix.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gewerbefix.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "geyoutuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghanitechnologies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghayegh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghope.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghoshal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ghzq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giantcat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giftcrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "giftpremium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gis360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gitmek.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gjirokastra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glass365.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "glatten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "globaled.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gmit.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gmslaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goavio.rest", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "godstart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goecomp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goldcaster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goldjaguar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "golfandfashion.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "golftaiwan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gongqiuxinxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gonls.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodcarbon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodfirst.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodflip.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodfonts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodfox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodgrease.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodled.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodmineral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodtour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodwillbusiness.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goodwillnfp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gorodskoy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gostartkit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gothamcateringnyc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "goutter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gp-lightstone.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gpsking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gpskit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grandshipping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "graphiteconnect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greateuro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greeblehaus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenacrescannabisgroup.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "greenwelcome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grenzach.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "griffin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "griftersnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "grillcoffee.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "groeten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "growthoutpatient.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gruzija.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guangsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guangzhoutower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guangzhu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guanjiapo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gugao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guillouf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "guitarchops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gums.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "gzdh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hackingdumpdrive.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haichan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haifengz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "halicinsaat.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "halloffamespirits.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hamdiscussions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hamilton-builders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hamishmb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "handicraftsmarble.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hanhtrinhxanh.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "haomin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harajiplastic.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hardrocksportsbook.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harmonyeg.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harmonyhomeaidservices.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "harmonylife.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hashe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "havi-engel.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hedoujia.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heilpflanzenmagie.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hell-o.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "helooo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hemmens.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "henrichaussade.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "herbaldunyasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "heritagetechnologies.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hetmanrecovery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hexoff.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hexure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hicrown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "highna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "highthcahempflower.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hinhanhykhoa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hirecto.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hirerecruiters.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hittra.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hkline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hockingfamily.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "holidaycity.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "holidaycitywestnj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "honeyfact.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "honolulu.show", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hoodiessouthafrica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hopf.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "horvath.ooo", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hostbility.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hostelacion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hostker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hotel-vivendi.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hqsy.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hrd-sec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hsi.health", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "http.gs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "huangshuo.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "huemanpesolutions.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "huxixs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hvr.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hyperc.club", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypnotistanbul.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypo-light.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypo-x.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypo4u.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypofix-web.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypofixx.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "hypowelt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i-logic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "i-vignette.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ibc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "icagency.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "id-fxcm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "idropulsoredentale.shop", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ifixture.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "igc.in.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ihres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "illimitmail.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imagisphe.re", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imamiyadental.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imkan.tours", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imperialmetalproducts.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imprenta.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "improvehome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "imprumutdeurgenta.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "in-depth.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inandoutcarwashcharleston.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inceif.edu.my", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "incorp.asia", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "index-education.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indianapolismet.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "indicatifs.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "industrialengineering.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "informassist10.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ingenesis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "initrandom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inlumi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "innermarkerranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inprode.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "insidedomain.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "insideprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "insql.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "installer-borne-electrique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "inthechair.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "intifx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "investnext.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "invisible.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ipoac.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iptv-service.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iragoldreview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ircube.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isbndirect.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isiponline.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "islam360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "islamchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "islamsky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ismaskine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ismet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "isomaker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ispanyadahayat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "israw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "issa.eu.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itbeijing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itomasa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itsuitsyou.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "itunesgiftcard.in.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "iusedtobelieve.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j3dpd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "j9.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jacktor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jaenparaisointerior.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jahanhost.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jailolo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jakoo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jalajala.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jambb.nu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jamukmod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japanesechess.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japanesespring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japanpack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japanpet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "japanspring.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jasm1nii.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jay4.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jclayton.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jenniferbuslerinteriors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jenry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jetdrywallinteriors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jeudy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jeweils.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jfroyalelogistics.com.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jhcd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiachang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiahong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiajiafu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jialing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiandong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiangao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiangdao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiangshun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jianhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jianshangjia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jianshenjiaolian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiaofei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jienengdeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jienuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiezhan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jimjh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jimmyrickenbacker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jingku.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jinhangdao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jiuzuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jizushan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jjmm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jlkg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jmb-jetshades.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnmirenda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnscottcbe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "johnsonroofingltd.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jokerxoth.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "joogle.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "josiekellys.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "josineto.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jouonline.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jowm-jo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "joyindex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jphev.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jproducts.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jsrd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "judian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juicycrones.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juliettesinteriors.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "junen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "juniorsplanet.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "junsheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "junte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "junyu33.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jupiterfy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jushang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "justf.tk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jxfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jybj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "jzpc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaefa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaipeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaitong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaixi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kaizhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kakarotto.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kakeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kalottlyrikal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kambal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kampuste.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kangxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kansai-ramen-derby.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kanustation.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karasev-stroy.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karateclubgavere.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karels.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "karnegi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kashs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kassapa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kassian.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kasumu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katanya.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katcenter.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katfitness.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "katprint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kcmak.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kcomi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keguomei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kekaoxing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kekedou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kensho-everyday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kenyachildrencentres.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kerkhoven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ketnoitre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "keycdn.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kfsys.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khalass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khanh.land", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "khramtsov.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kichhoat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kientrucphunguyen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "killfire.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinderdreirad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kinderenglisch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kindery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kingslate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kiropraktoristockholm.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kiteroas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kladionice.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klimaanlage-fehler.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "klokkenluidersvg.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "knmateriales.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koala-pension.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kondi-save.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "koophost.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "korona-m.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kostlyn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kotlinfactory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kouchai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kozakmateusz.ovh", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kproferm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kqrm.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "krypterz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kss.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuberm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuhio.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kujalichildrenscentre.or.ke", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kumoricon.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kurum.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kuvings.com.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kvrapi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "kvrwines.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laboratoria.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lacatolica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laerepenger.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "laideshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lakenheathfss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lamalla.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lapetitefontaine.restaurant", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "larepenger.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lastcast.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latchlink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latexbedding.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "latrinite.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lauriane-garcia.avocat.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "law.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lawal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lbhpartners.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lcdchart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lclnet.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lear.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leather.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lecheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ledboss.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ledpartyfloors.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lengkujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lenhatthanh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lentuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leqing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lerryn.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lescommunes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lesitederencontre.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leutransporteur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "levelrankings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lexinter.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lexoh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "leziblog.cn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liangpu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "libivis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liesun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liftntake.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ligapolska.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lightinglamp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ligou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "likeall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "likme.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "limid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "line12.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linghouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linkware.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "linuxtage.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lirpa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "listerplace.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "listerventures.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "literaturaacessivel.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "liza.fashion", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lo.fail", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loanandgo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locallawfirms.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locktera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loco-socials.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "locomotionhub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loganmarchione.rocks", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "logndetektor-test.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lojanewinvincible.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lonely.moe", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "longfengchengxiang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lorcanaplayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lostfest.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lostinfilm.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lostwithiel.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lostwithielcommunitycentre.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lotsynergy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loverday.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "loversky.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lubuskibs.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "lucentt.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luckblock.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luckblock.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luckibots.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "luminia-informatique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mack-eng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "macpaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magok.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magschool.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "magyal.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mailflex.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mailster.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "makeitpopadvertising.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "malkiteribki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mandaz.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "manhwaamour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "map.fund", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mapapeterie.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marbleme.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mare.org.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mariaalcazar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marretada.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "marvinelsen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "masalist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "masiavillalonga.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "massaggio.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "matnkat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mauticamp.ng", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "maxconstructionmachinery.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mcdesigns68.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mdgsocialmediasecurity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meanit.ie", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mebelizori.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meciel.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "med-flex.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "media24.world", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medlemsraadgiveren.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "medlemsradgiveren.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mega-microstories.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mein-arabischkurs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meindm.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meinerabatt.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "memories-factory.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "merchant-portal.co.kr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "metaskil.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "meteoweb.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mexiquilanj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "micheldoultremont.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "micrm.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "micromata.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "midea.kg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "migg.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mikelundpainting.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "miletic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "millistice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mindeasy.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minecraft.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minelucky.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minly.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mintstar.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "minutodigitalperu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mipropertiesnorth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mirrors.help", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mirrorz.help", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mitindo.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mktcoral.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mobiledor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moderntreasury.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mogadiscio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mogbox.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mondnacht.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moneyspeaking.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "monrabais.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "montiallison.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mooninvoice.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moravostavdruzstvo.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "moscomes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mossgrove.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motorkohler.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motormummie.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motorst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "motorwrappen.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mrgutternj.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ms67pta.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mstdn.in.th", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "msvbeveiliging.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mts-global.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "muniplus.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "murmeltiere.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myairware.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycba.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycgc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myconcern.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mycourtesy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mydegreeroute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myflatfinders.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mymdindia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mytrialist.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mywings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "myworry.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "mztmzt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "n0099.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "n2o.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naarhuis.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naita.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "najwamall.my.id", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nakupnabytku.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nankeyiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "napareuli.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naschart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nautilusoceanica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "naveah.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "navkan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neath-afan-gymnastics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nebebra.stream", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nechu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nerdygadgets.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neri.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nerispa.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nervepay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nestinvest.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netcapital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netguard.solutions", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netjes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netken.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nettoyeurtombe.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "netvod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "network13.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neurenberg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "neurido.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newcandle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newdistance.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newfield-ext.co.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newhoperailroad.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newosis.life", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "news4me.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "newworldedu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nextvibration.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nftactually.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nguyenslist.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nicehairclinic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nikako.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nikoflix.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ningbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ningnu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ninoxlinks.online", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "njtw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nobco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nocinco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nofund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "noips.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nojoumstudio.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nolanpoe.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nongling.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "norato.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "norderney-zs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nordicequities.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nordlandsbanken.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "notre-planete.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "npdigital.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nrbri.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nsl.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nsncatalog.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nuhs.sg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "numerspiral.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nursetheticsbyliam.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nursinghero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nyammingsfusionbistro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nyau.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "nysusankitchen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oblak.studio", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oboes.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ocardapiovirtual.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ohikkoshi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "okaukuejo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "okcase.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "okeepixels.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olgamilosevic.edu.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "olmportal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onenetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onepieceplayer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onepointzero.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlineinfo.freesite.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onlinestatic.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onuruzunonline.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "onvisit.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opago-pay.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "opoderdaenergiafeminina.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oppstartslos.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "optirank.co", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orize.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "orpheus2.com.ec", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ortsmitte.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "os.web.tr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osandp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "osegredo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oserver.click", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ospo-alliance.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ossso.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "otpnyugdij.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "otticaturi.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ottingergolf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ovosimpatico.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ovosimpatico.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "owethecure.win", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oxibeiras.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "oziosos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pa5am.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pachuca.social", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pack4you.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "padremiguel.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paermartinsson.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panasonic.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pandababy.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "panelsandwich.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pankiewiczlaw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pansionat-himik.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "papattesstore.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parisportif.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parkingaeropuerto-alicante.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parkingaeropuerto-bilbao.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parkingland.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parkstreet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parnumaa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parsink.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "parteneriat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pass-jobcoaching.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pastbuy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "patentverwag.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paul.media", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paullovestugba.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.accountant", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.apartments", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.basketball", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.business", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.catering", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.cleaning", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.condos", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.contractors", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.dentist", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.dog", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.equipment", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.football", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.hockey", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.lawyer", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.management", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.photography", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.plumbing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.rent", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.repair", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.school", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.surf", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.tennis", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.university", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pay.wedding", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "payam.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "payam.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "payment.vet", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "paymentworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "payu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pazeamor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pbiexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcbird.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcbtrade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcera.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcgalleries.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcpasokh.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pcrid.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pe-netz.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pe-portal.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pecchina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peddals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peluqueriacaninacavecanem.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "penglai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peoplespets.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perfectaccount.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perfectlace.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "performancerh.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "perfumecentre.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "peupledefrance.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pfron.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phalcon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pharmalinkinternational.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pharrel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phimmat.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "phishingplanet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pickleballspots.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "picturesalon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "piecesofmind.in.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "piekne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pileawayremovals.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pinoyworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pirate-proxy.top", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "piroscafo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pisarze.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pkvgames.expert", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "planmember.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plasticcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "platformio-cn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pleadings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plumber-in-boksburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plumber-in-sandton.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pluriumint.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "plusinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poac.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pochard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pocketdocument.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pocketec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pojiezhe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pokazywarka.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polskiadwokat.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polyshoes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polyvalents.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "polywoven.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pop-myworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pornaizle.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pornhubapparel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "portaldatorcida.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "portugalbnb.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pose-faux-plafond.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "posteridea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "potrosac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "poupi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powercoder.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powerinn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powerladies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "powertrunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prawer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prchal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "preserveart.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prestashopmanager.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prestec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prestigelegalgroup.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prettybed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prettytour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prices4u.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "priceshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pricesuggestion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "priez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "primit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "primorsk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "primorski.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "privatecolor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prkn.je", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "procurant.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "programagrowup.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "programshow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prometteur.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "promozioni.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prophetdesign.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "proteinak.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "proux.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prowaterproofers.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prowoodthai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "prywatnie.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "psychiatretdah.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "purple.gi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "pvrtours.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qbotica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qiangshen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qianlong.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qianmu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qianshuo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qianzhanggui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qiayuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qicaiyunnan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qihc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qingdu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qisas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qiuke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qiuyiwenyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qlsh.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "qombo.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quantuminformationframework.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "queencdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "quentin-informatique.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "radconinc.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ramonahillsideplayers.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ranchodoalqueidao.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rapid4all.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rapidall.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rareearthhair.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rashane.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "raveharmony.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rawcom.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rcgm168.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rcubesports.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rdb.vote", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "real2000.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "realtys.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reddrops.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reference-expertise.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reformedermatology.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "regento.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reguanli.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reiaudio.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "relais-laguiole.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "remoteassistants.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renascerstp.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "renevo.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reparatieferestre.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "revcovi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "reveal11.cloud", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "riflajelemn.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rijonawnings.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rileypaige.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rmpbuilders.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "roamroofingco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robertsfinejewelers.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "robstibal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rockbandparty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rocketsales.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rocknrowdyranch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rsa-services.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rubblerandburg.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rude.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rumemi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "rutgershealth.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ruzovyslon.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ryenews.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "s-he.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saahild.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saarloosschilderwerken.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saeitalianfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sahpa.co.za", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "salamzibaei.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sampercleaningservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sampertechnologyservices.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "samxoxo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sandpaper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sanjab.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sansgetirsin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saojudastadeu.edu.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sasazono.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sasse9662.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saturday.kiwi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "saunaempire.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "save.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "savesmart.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sawpa.gov", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "schwarzbunt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scmestetic.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scoffable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scopechart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "scotlandrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seaportfish.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "searafoodsolutions.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "searchverdict.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "securai.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selector.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selen.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "selfharm.xyz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seniorcommunitymedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seopredator.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seorepress.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "seringe.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "server4london.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sesperformance.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sexexplorer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sfpdev.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shangyibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shangyun.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sheatoz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sheelyuu.art", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shesherownceo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiftbeyondwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiftkey.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shiningstarlogistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "shrinkmydoc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sibu.one", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sieglercars.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sillasdegamer.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sitco.global", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sizeunknown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sizeunknown.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skat.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skatteforvaltningen.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skcwood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skew.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skezi.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skikkogbank.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skladnicaksiegarska.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skm.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skoi2023.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "skoleelever.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sktst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slatechart.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slavomircapik.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sleeping360.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slimeg.clinic", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slipshade.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "slotstar10.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smoking-robot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "smygehuk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sneakview.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "snowfood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sntry.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "socilit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sociofab.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soface.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sofaware.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sofirm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softbus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softcrack.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "softheal.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sogurtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solaranalytics.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solidway.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "solitairenetwork.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sonet.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soracamed.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sorting.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soscavehumide.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sosharch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sosteric.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soulan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soumu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soundshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "soute.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "southelginumc.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "souto.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spanbilt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sparkedge.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spartour.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spatialnom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spaturbo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spavanje.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spearson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "special.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spentra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spicevids.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spicymemory.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spiel77.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spiralwebtech.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "splatjov.space", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sponichi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sporeprinters.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sportfair.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sportrecife.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "spotkania.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "springsnow.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sprints.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sprizzo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sskamo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sskb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sslsites.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stacabinetdepot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.ae", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.ba", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.com.ar", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.hr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.jp", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "staffaugmentation.vn", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stampix.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "startparadies.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stbmedia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stdenv.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stelem.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stellartraderacademy.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stepbrobd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stephanoptiek.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sternstrailer.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sterowniki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sterydy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "steveshauntedyard.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stoiximatikesetairies.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stolarstwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stomatologiczne.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stonedimension.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stopanskaleasing.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stories-pro.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "straftaten.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stramproy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strangeways.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stratos.support", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strazburg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stressfreiheit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stretchwrap.co.nz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strettoweb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stromberg.marketing", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "strongroom.ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stroynet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stscecyteo.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "studiu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "studyinaustraliafair.africa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "stunfisk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "submittable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sugarlandsara.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suhang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suizas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sujitang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sukma.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sumitronics.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suncheck.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sunnyclub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superidc.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "supermare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "superwing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surfandturfroofing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surfkath.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suros.com.tw", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "surun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sustine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suzannemiller.us", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "suzuki-aps.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "svoya-energy.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "svrjs.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "svtemplemn.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swabia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swanbullion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swebdigitalmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sweetbroom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swiftoutput.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "swprowood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sxpx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sydneydesignprint.com.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sydneyvapeshub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "syfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "symbolisch.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szax.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szerelmes.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szili.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szpv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "sztreasure.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szw-hessen.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "szymczak.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "t-1.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tabella.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tag-verse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tahabrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taie-oreiller-satin.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taleblooplastic.ir", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "talerakademiet.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tambortropical.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tamsi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taodujia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taoge.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taojiehun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taokorea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taoqicheng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taoqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taoshai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tappyshop.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tarbawi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tarhunfirin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tastetasty.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tataru.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tauchkurs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taxi7.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "taxiloerrach.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tea-alpha.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tea-eurobank.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.com.ua", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.fi", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.is", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.it", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.li", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.mk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamsecure.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamtuning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamwass.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teamwass.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teapiraeus.gr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techopark.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.al", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.at", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.be", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.bg", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.es", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.lu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.lv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.md", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.me", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.se", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.si", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techpeer.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techsys.ch", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "techtivity.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tefok.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teksnologi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tekson.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teleport.video", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telescopi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telexpo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "telexsus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "temashop.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tembisa.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tenebra.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tentopdak.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tentou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tenzan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teodw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "teodw.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "testic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "testtable.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thepac.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "therapyworks.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thinkfortune.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thirdwaveanalytics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "threatobserver.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "thriveatfive.org.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ticketpro.ca", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tida.ge", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiendamia.com.do", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiendamia.com.pa", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiendamia.com.py", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiendamia.cr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tigerengine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tigerfocus.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiktokformation.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tiktokglobalshop.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tisknunahadry.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tjeea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tkgeomap.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tlcafrica1.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tljcw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tmmapps.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tmshea.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toachina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tobiasmanske.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "todasnoticias.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "todohealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "togetherplanning.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tokyocare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tokyosaviva.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "toldst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tombari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tomislava.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tootsiewootsies4d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topclaim.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topdisco.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topgameth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topgod.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topjean.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topktv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topnoshgourmet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topsas.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "topyouth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tough-construction.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trabajoen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tracercdn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "traderjobs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "traderpen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trading-ea.pt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trainingchannel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "transformyourmarketing.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "transportesvarelacr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "treasurechina.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tridoor.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trixis.in", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "trockner-fehler.site", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truopio.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truyenmoi.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "truyenmoivn.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tryaatos.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tsna.cc", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tuica.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tuiyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tupeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tuperiodico.soy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "turkeyobesity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tvregion.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twbiz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "twinhealth.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "txwm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tycatering.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tyentbulgaria.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "typesofnote.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "tyukanyo.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uartpastelpaper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uckunlaboratuvari.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ufst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uneltemasini.ro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unfall24.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unheated.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unirotam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unitedwecare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unityfactory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "unlimitedpcs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "upfronthealthcare.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uprawnienie-sep.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "urbanhub.lt", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "uro.soy", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "usacainfo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ustreasuryetf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utahlivebands.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "utilitas.ee", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "v1nce.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vadang.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "valescarodrigues.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "veeam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "venida.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verenpaine.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verityinspections.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verksampsykologi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verleger.biz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "verschil.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vescudero.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viacar.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viajantecolorido.com.br", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vidlen.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vidlen.ru", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vigorous.co.il", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viking-t.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ville-ideale.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vipcan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "virginietessier.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "virtualchecker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "virutasjamon.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "visioniot.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vitaclinicliverpool.co.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vital.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vitallife.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "viverstp.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "voncurr.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vozciudadana.org", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vr-baufi.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vr-baufi24.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vr-hypothekenbank.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vr-immoexpress.info", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vr-immoinvest.eu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vuefactory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vurdst.dk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "vytvorsipotisk.cz", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waragod.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wasp.host", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wassermanx.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "waterdogsmokehouse.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "watermarkktp.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "watlam.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wayfarium.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wball.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wcs.rs", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weavedreams.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webautohelper.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webcamstudio.hu", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webdesigner-lille.digital", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webdns.pro", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webmikham.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webrand.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "websitecontrol.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webthreesome.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "webvpsnet.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wecodify.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "weddingsinbloom.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "welcomehometnt.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wellcarehealthsurvey.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "westphalfamily.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whatzelink.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "whoisonthebench.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wilcojunk.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wingover.su", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wingsung.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wkz.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wnvtech.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wobler.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wogame.wiki", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "womanpub.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wombathost.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woningsnet.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "woo-order.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worayuthit.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wordki.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "work-msg.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worldeg.estate", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "worldvm.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wpbyte.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wpfactory.io", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wpocs.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wpunited.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wranglerworld.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wsdac.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wudangkungfu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wufenzhong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wuhua.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "wuzhishan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "x-sun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xali.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xenwo.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xgcf.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xhacker.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xhamster.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiangdan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiansiniao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xianteng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xianweiyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xianyu.uk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiaodaoxiaoxi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiaoping.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiaose.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiaoshou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiaotong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiaoyima.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiayimiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xinbai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xindongfang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xingkete.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xinglue.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xingzhibao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xinlehui.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xinnongbao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xishu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiuniang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xiuqu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xjzw.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xmfund.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn----7sbbagp2bcfwdeee1afm.xn--p1ai", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--45qv91bb1m.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--7br21al8r.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--bnq37rc0nw50b.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--chrysopekinsiologie-hzbe.fr", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--gtv031d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--hxt814e.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--iet627k.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--klyv21c.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--lrepenger-g3a.no", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--mllingen-65a.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--mxaavenvi2h.live", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--sjtz88d.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xn--ss-sein-fetzt-wob.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xqtv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xtny.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xtopic.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xtopics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xtsna.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xuanshantang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xunhuanniu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xutv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xyz2007.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xyz567.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "xyz66.net", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yabaolu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yacity.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yaden.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yakir.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yamasi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yameng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yaoyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yapayzekablogu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yawnbox.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yazhi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yellowfinlogistics.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yesin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yesmotel.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yesport.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yetv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yhgy.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yikachong.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yimengyuan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yinquan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yirunda.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yiyuyan.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yizhilu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ymrz.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ynec.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yobeverages.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "youjigongchang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yova.nl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yuanliang.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yueqiuche.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yuezhengling.link", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yummiyogi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yunnanbaiyao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yuyin.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yxzb.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yytd.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "yztv.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zakladybukmacherskie.tv", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zda.ag", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zdravypanak.sk", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zendave.au", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zgnq.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhaijia.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhaisou.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhangfeng.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhanpai.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhaodiao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhenbianshu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhengkao.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhinood.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhujike.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhunrun.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zhuoke.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ziwu.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zlate.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zms-qs.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zoltanmatanyi.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zombieclown.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zonnenberg.de", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zpc.st", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "zsnm.pl", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, + { "name": "ztylez.com", "policy": "bulk-1-year", "mode": "force-https", "include_subdomains": true }, // END OF 1-YEAR BULK HSTS ENTRIES // Only eTLD+1 domains can be submitted automatically to hstspreload.org,
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index dc6ee2e..94b204c 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2023-10-01 12:57 UTC +# Last updated: 2023-10-02 12:53 UTC PinsListTimestamp -1696165063 +1696251233 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index 9e7121d5..5e70676 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2023-10-01 12:57 UTC +// Last updated: 2023-10-02 12:53 UTC // { "pinsets": [
diff --git a/net/quic/bidirectional_stream_quic_impl_unittest.cc b/net/quic/bidirectional_stream_quic_impl_unittest.cc index cbf6339..fb5e8a2 100644 --- a/net/quic/bidirectional_stream_quic_impl_unittest.cc +++ b/net/quic/bidirectional_stream_quic_impl_unittest.cc
@@ -570,7 +570,7 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, bool fin, - absl::string_view data) { + std::string_view data) { std::unique_ptr<quic::QuicReceivedPacket> packet( server_maker_.MakeDataPacket(packet_number, stream_id_, fin, data)); DVLOG(2) << "packet(" << packet_number << "): " << std::endl @@ -580,7 +580,7 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructClientDataPacket( bool fin, - absl::string_view data) { + std::string_view data) { return client_maker_.MakeDataPacket(++packet_number_, stream_id_, fin, data); } @@ -695,7 +695,7 @@ uint64_t largest_received, uint64_t smallest_received, bool fin, - absl::string_view data, + std::string_view data, QuicTestPacketMaker* maker) { std::unique_ptr<quic::QuicReceivedPacket> packet( maker->MakeAckAndDataPacket(packet_number, stream_id_, largest_received,
diff --git a/net/quic/crypto/proof_source_chromium.cc b/net/quic/crypto/proof_source_chromium.cc index 64f538d..ab4e2670 100644 --- a/net/quic/crypto/proof_source_chromium.cc +++ b/net/quic/crypto/proof_source_chromium.cc
@@ -77,7 +77,7 @@ const string& hostname, const string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, quiche::QuicheReferenceCountedPointer<quic::ProofSource::Chain>* out_chain, quic::QuicCryptoProof* proof) { DCHECK(proof != nullptr); @@ -133,7 +133,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, std::unique_ptr<Callback> callback) { // As a transitional implementation, just call the synchronous version of // GetProof, then invoke the callback with the results and destroy it. @@ -169,7 +169,7 @@ const quic::QuicSocketAddress& client_address, const std::string& hostname, uint16_t signature_algorithm, - absl::string_view in, + std::string_view in, std::unique_ptr<SignatureCallback> callback) { crypto::OpenSSLErrStackTracer err_tracer(FROM_HERE); bssl::ScopedEVP_MD_CTX sign_context;
diff --git a/net/quic/crypto/proof_source_chromium.h b/net/quic/crypto/proof_source_chromium.h index 6cfbc03..52e36dc 100644 --- a/net/quic/crypto/proof_source_chromium.h +++ b/net/quic/crypto/proof_source_chromium.h
@@ -41,7 +41,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, std::unique_ptr<Callback> callback) override; quiche::QuicheReferenceCountedPointer<Chain> GetCertChain( @@ -55,7 +55,7 @@ const quic::QuicSocketAddress& client_address, const std::string& hostname, uint16_t signature_algorithm, - absl::string_view in, + std::string_view in, std::unique_ptr<SignatureCallback> callback) override; absl::InlinedVector<uint16_t, 8> SupportedTlsSignatureAlgorithms() @@ -70,7 +70,7 @@ const std::string& hostname, const std::string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, quiche::QuicheReferenceCountedPointer<quic::ProofSource::Chain>* out_chain, quic::QuicCryptoProof* proof);
diff --git a/net/quic/crypto/proof_test_chromium.cc b/net/quic/crypto/proof_test_chromium.cc index 075fa15c..d45cc47 100644 --- a/net/quic/crypto/proof_test_chromium.cc +++ b/net/quic/crypto/proof_test_chromium.cc
@@ -58,7 +58,7 @@ const uint16_t port, const string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const std::vector<string>& certs, const string& proof, bool expected_ok) {
diff --git a/net/quic/crypto/proof_verifier_chromium.cc b/net/quic/crypto/proof_verifier_chromium.cc index 3b92afd6..5d4d09a8 100644 --- a/net/quic/crypto/proof_verifier_chromium.cc +++ b/net/quic/crypto/proof_verifier_chromium.cc
@@ -72,7 +72,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature, @@ -123,7 +123,7 @@ bool VerifySignature(const std::string& signed_data, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const std::string& signature, const std::string& cert); @@ -209,7 +209,7 @@ const uint16_t port, const string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const std::vector<string>& certs, const std::string& cert_sct, const string& signature, @@ -457,7 +457,7 @@ bool ProofVerifierChromium::Job::VerifySignature( const string& signed_data, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const string& signature, const string& cert) { size_t size_bits; @@ -578,7 +578,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature,
diff --git a/net/quic/crypto/proof_verifier_chromium.h b/net/quic/crypto/proof_verifier_chromium.h index bc23e4f..d420b23 100644 --- a/net/quic/crypto/proof_verifier_chromium.h +++ b/net/quic/crypto/proof_verifier_chromium.h
@@ -89,7 +89,7 @@ const uint16_t port, const std::string& server_config, quic::QuicTransportVersion quic_version, - absl::string_view chlo_hash, + std::string_view chlo_hash, const std::vector<std::string>& certs, const std::string& cert_sct, const std::string& signature,
diff --git a/net/quic/dedicated_web_transport_http3_client.cc b/net/quic/dedicated_web_transport_http3_client.cc index 927bb086..16cf1f5 100644 --- a/net/quic/dedicated_web_transport_http3_client.cc +++ b/net/quic/dedicated_web_transport_http3_client.cc
@@ -268,7 +268,7 @@ void OnIncomingUnidirectionalStreamAvailable() override { visitor_->OnIncomingUnidirectionalStreamAvailable(); } - void OnDatagramReceived(absl::string_view datagram) override { + void OnDatagramReceived(std::string_view datagram) override { visitor_->OnDatagramReceived(datagram); } void OnCanCreateNewOutgoingBidirectionalStream() override { @@ -877,7 +877,7 @@ } void DedicatedWebTransportHttp3Client::OnDatagramReceived( - absl::string_view datagram) { + std::string_view datagram) { visitor_->OnDatagramReceived(datagram); }
diff --git a/net/quic/dedicated_web_transport_http3_client.h b/net/quic/dedicated_web_transport_http3_client.h index 46105e1..5574f3bf 100644 --- a/net/quic/dedicated_web_transport_http3_client.h +++ b/net/quic/dedicated_web_transport_http3_client.h
@@ -78,7 +78,7 @@ const std::string& error_message) override; void OnIncomingBidirectionalStreamAvailable() override; void OnIncomingUnidirectionalStreamAvailable() override; - void OnDatagramReceived(absl::string_view datagram) override; + void OnDatagramReceived(std::string_view datagram) override; void OnCanCreateNewOutgoingBidirectionalStream() override; void OnCanCreateNewOutgoingUnidirectionalStream() override;
diff --git a/net/quic/mock_decrypter.cc b/net/quic/mock_decrypter.cc index e46a85c..e42cc0d 100644 --- a/net/quic/mock_decrypter.cc +++ b/net/quic/mock_decrypter.cc
@@ -23,19 +23,19 @@ MockDecrypter::MockDecrypter(Perspective perspective) {} -bool MockDecrypter::SetKey(absl::string_view key) { +bool MockDecrypter::SetKey(std::string_view key) { return key.empty(); } -bool MockDecrypter::SetNoncePrefix(absl::string_view nonce_prefix) { +bool MockDecrypter::SetNoncePrefix(std::string_view nonce_prefix) { return nonce_prefix.empty(); } -bool MockDecrypter::SetIV(absl::string_view iv) { +bool MockDecrypter::SetIV(std::string_view iv) { return iv.empty(); } -bool MockDecrypter::SetHeaderProtectionKey(absl::string_view key) { +bool MockDecrypter::SetHeaderProtectionKey(std::string_view key) { return key.empty(); } @@ -51,7 +51,7 @@ return 0; } -bool MockDecrypter::SetPreliminaryKey(absl::string_view key) { +bool MockDecrypter::SetPreliminaryKey(std::string_view key) { LOG(DFATAL) << "Should not be called"; return false; } @@ -62,8 +62,8 @@ } bool MockDecrypter::DecryptPacket(uint64_t /*packet_number*/, - absl::string_view associated_data, - absl::string_view ciphertext, + std::string_view associated_data, + std::string_view ciphertext, char* output, size_t* output_length, size_t max_output_length) { @@ -93,12 +93,12 @@ return std::numeric_limits<quic::QuicPacketCount>::max(); } -absl::string_view MockDecrypter::GetKey() const { - return absl::string_view(); +std::string_view MockDecrypter::GetKey() const { + return std::string_view(); } -absl::string_view MockDecrypter::GetNoncePrefix() const { - return absl::string_view(); +std::string_view MockDecrypter::GetNoncePrefix() const { + return std::string_view(); } } // namespace net
diff --git a/net/quic/mock_decrypter.h b/net/quic/mock_decrypter.h index 03efc9b..d75ddb5 100644 --- a/net/quic/mock_decrypter.h +++ b/net/quic/mock_decrypter.h
@@ -29,21 +29,21 @@ ~MockDecrypter() override = default; // QuicCrypter implementation - bool SetKey(absl::string_view key) override; - bool SetNoncePrefix(absl::string_view nonce_prefix) override; - bool SetIV(absl::string_view iv) override; - bool SetHeaderProtectionKey(absl::string_view key) override; + bool SetKey(std::string_view key) override; + bool SetNoncePrefix(std::string_view nonce_prefix) override; + bool SetIV(std::string_view iv) override; + bool SetHeaderProtectionKey(std::string_view key) override; size_t GetKeySize() const override; size_t GetIVSize() const override; size_t GetNoncePrefixSize() const override; // QuicDecrypter implementation - bool SetPreliminaryKey(absl::string_view key) override; + bool SetPreliminaryKey(std::string_view key) override; bool SetDiversificationNonce( const quic::DiversificationNonce& nonce) override; bool DecryptPacket(uint64_t packet_number, - absl::string_view associated_data, - absl::string_view ciphertext, + std::string_view associated_data, + std::string_view ciphertext, char* output, size_t* output_length, size_t max_output_length) override; @@ -51,8 +51,8 @@ quic::QuicDataReader* sample_reader) override; uint32_t cipher_id() const override; quic::QuicPacketCount GetIntegrityLimit() const override; - absl::string_view GetKey() const override; - absl::string_view GetNoncePrefix() const override; + std::string_view GetKey() const override; + std::string_view GetNoncePrefix() const override; }; } // namespace net
diff --git a/net/quic/mock_encrypter.cc b/net/quic/mock_encrypter.cc index 3f61311..ac478f6 100644 --- a/net/quic/mock_encrypter.cc +++ b/net/quic/mock_encrypter.cc
@@ -21,21 +21,21 @@ MockEncrypter::MockEncrypter(Perspective perspective) {} -bool MockEncrypter::SetKey(absl::string_view key) { +bool MockEncrypter::SetKey(std::string_view key) { return key.empty(); } -bool MockEncrypter::SetNoncePrefix(absl::string_view nonce_prefix) { +bool MockEncrypter::SetNoncePrefix(std::string_view nonce_prefix) { return nonce_prefix.empty(); } -bool MockEncrypter::SetIV(absl::string_view iv) { +bool MockEncrypter::SetIV(std::string_view iv) { return iv.empty(); } bool MockEncrypter::EncryptPacket(uint64_t /*packet_number*/, - absl::string_view associated_data, - absl::string_view plaintext, + std::string_view associated_data, + std::string_view plaintext, char* output, size_t* output_length, size_t max_output_length) { @@ -48,12 +48,12 @@ return true; } -bool MockEncrypter::SetHeaderProtectionKey(absl::string_view key) { +bool MockEncrypter::SetHeaderProtectionKey(std::string_view key) { return key.empty(); } std::string MockEncrypter::GenerateHeaderProtectionMask( - absl::string_view sample) { + std::string_view sample) { return std::string(5, 0); } @@ -81,12 +81,12 @@ return std::numeric_limits<quic::QuicPacketCount>::max(); } -absl::string_view MockEncrypter::GetKey() const { - return absl::string_view(); +std::string_view MockEncrypter::GetKey() const { + return std::string_view(); } -absl::string_view MockEncrypter::GetNoncePrefix() const { - return absl::string_view(); +std::string_view MockEncrypter::GetNoncePrefix() const { + return std::string_view(); } } // namespace net
diff --git a/net/quic/mock_encrypter.h b/net/quic/mock_encrypter.h index e50ea191..bb6b8e1 100644 --- a/net/quic/mock_encrypter.h +++ b/net/quic/mock_encrypter.h
@@ -28,25 +28,25 @@ ~MockEncrypter() override = default; // QuicEncrypter implementation - bool SetKey(absl::string_view key) override; - bool SetNoncePrefix(absl::string_view nonce_prefix) override; - bool SetHeaderProtectionKey(absl::string_view key) override; - bool SetIV(absl::string_view iv) override; + bool SetKey(std::string_view key) override; + bool SetNoncePrefix(std::string_view nonce_prefix) override; + bool SetHeaderProtectionKey(std::string_view key) override; + bool SetIV(std::string_view iv) override; bool EncryptPacket(uint64_t packet_number, - absl::string_view associated_data, - absl::string_view plaintext, + std::string_view associated_data, + std::string_view plaintext, char* output, size_t* output_length, size_t max_output_length) override; - std::string GenerateHeaderProtectionMask(absl::string_view sample) override; + std::string GenerateHeaderProtectionMask(std::string_view sample) override; size_t GetKeySize() const override; size_t GetNoncePrefixSize() const override; size_t GetIVSize() const override; size_t GetMaxPlaintextSize(size_t ciphertext_size) const override; size_t GetCiphertextSize(size_t plaintext_size) const override; quic::QuicPacketCount GetConfidentialityLimit() const override; - absl::string_view GetKey() const override; - absl::string_view GetNoncePrefix() const override; + std::string_view GetKey() const override; + std::string_view GetNoncePrefix() const override; }; } // namespace net
diff --git a/net/quic/quic_chromium_client_session.cc b/net/quic/quic_chromium_client_session.cc index 342a0789f..2775029a 100644 --- a/net/quic/quic_chromium_client_session.cc +++ b/net/quic/quic_chromium_client_session.cc
@@ -1682,7 +1682,7 @@ UMA_HISTOGRAM_CUSTOM_COUNTS("Net.QuicSession.RejectLength", message.GetSerialized().length(), 1000, 10000, 50); - absl::string_view proof; + std::string_view proof; UMA_HISTOGRAM_BOOLEAN("Net.QuicSession.RejectHasProof", message.GetStringPiece(quic::kPROF, &proof)); }
diff --git a/net/quic/quic_chromium_client_session_test.cc b/net/quic/quic_chromium_client_session_test.cc index ab25966..367ebe82 100644 --- a/net/quic/quic_chromium_client_session_test.cc +++ b/net/quic/quic_chromium_client_session_test.cc
@@ -1092,7 +1092,7 @@ CompleteCryptoHandshake(); quic::QuicStreamFrame data(GetNthServerInitiatedUnidirectionalStreamId(0), - false, 1, absl::string_view("SP")); + false, 1, std::string_view("SP")); session_->OnStreamFrame(data); EXPECT_EQ(0u, session_->GetNumActiveStreams()); quic::QuicRstStreamFrame rst(quic::kInvalidControlFrameId, @@ -1119,7 +1119,7 @@ CompleteCryptoHandshake(); quic::QuicStreamId id = GetNthServerInitiatedUnidirectionalStreamId(0); - quic::QuicStreamFrame data(id, false, 1, absl::string_view("SP")); + quic::QuicStreamFrame data(id, false, 1, std::string_view("SP")); session_->OnStreamFrame(data); EXPECT_EQ(0u, session_->GetNumActiveStreams()); session_->ResetStream(id, quic::QUIC_STREAM_NO_ERROR);
diff --git a/net/quic/quic_chromium_client_stream.cc b/net/quic/quic_chromium_client_stream.cc index 955f162..95326dd6 100644 --- a/net/quic/quic_chromium_client_stream.cc +++ b/net/quic/quic_chromium_client_stream.cc
@@ -605,7 +605,7 @@ return len; } -bool QuicChromiumClientStream::WriteStreamData(absl::string_view data, +bool QuicChromiumClientStream::WriteStreamData(std::string_view data, bool fin) { // Writes the data, or buffers it. WriteOrBufferBody(data, fin); @@ -619,7 +619,7 @@ // Writes the data, or buffers it. for (size_t i = 0; i < buffers.size(); ++i) { bool is_fin = fin && (i == buffers.size() - 1); - absl::string_view string_data(buffers[i]->data(), lengths[i]); + std::string_view string_data(buffers[i]->data(), lengths[i]); WriteOrBufferBody(string_data, is_fin); } return !HasBufferedData(); // Was all data written?
diff --git a/net/quic/quic_chromium_client_stream.h b/net/quic/quic_chromium_client_stream.h index 81ea8a9..e09b1ab 100644 --- a/net/quic/quic_chromium_client_stream.h +++ b/net/quic/quic_chromium_client_stream.h
@@ -261,7 +261,7 @@ // Writes |data| to the peer and closes the write side if |fin| is true. // Returns true if the data have been fully written. If the data was not fully // written, returns false and OnCanWrite() will be invoked later. - bool WriteStreamData(absl::string_view data, bool fin); + bool WriteStreamData(std::string_view data, bool fin); // Same as WriteStreamData except it writes data from a vector of IOBuffers, // with the length of each buffer at the corresponding index in |lengths|. bool WritevStreamData(const std::vector<scoped_refptr<IOBuffer>>& buffers,
diff --git a/net/quic/quic_chromium_client_stream_test.cc b/net/quic/quic_chromium_client_stream_test.cc index cca8532..db019f3 100644 --- a/net/quic/quic_chromium_client_stream_test.cc +++ b/net/quic/quic_chromium_client_stream_test.cc
@@ -83,7 +83,7 @@ MOCK_METHOD2(OnStreamHeaders, void(quic::QuicStreamId stream_id, - absl::string_view headers_data)); + std::string_view headers_data)); MOCK_METHOD2(OnStreamHeadersPriority, void(quic::QuicStreamId stream_id, const spdy::SpdyStreamPrecedence& precedence)); @@ -226,13 +226,13 @@ return headers; } - void ReadData(absl::string_view expected_data) { + void ReadData(std::string_view expected_data) { scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(expected_data.length() + 1); EXPECT_EQ(static_cast<int>(expected_data.length()), stream_->Read(buffer.get(), expected_data.length() + 1)); EXPECT_EQ(expected_data, - absl::string_view(buffer->data(), expected_data.length())); + std::string_view(buffer->data(), expected_data.length())); } quic::QuicHeaderList ProcessHeaders(const spdy::Http2HeaderBlock& headers) { @@ -318,7 +318,7 @@ quic::QuicStreamFrame frame2( quic::test::GetNthClientInitiatedBidirectionalStreamId( version_.transport_version, 0), - true, offset, absl::string_view()); + true, offset, std::string_view()); stream_->OnStreamFrame(frame2); EXPECT_TRUE(handle_->fin_received()); handle_->OnFinRead(); @@ -406,7 +406,7 @@ quic::QuicStreamFrame frame2( quic::test::GetNthClientInitiatedBidirectionalStreamId( version_.transport_version, 0), - true, offset, absl::string_view()); + true, offset, std::string_view()); stream_->OnStreamFrame(frame2); } @@ -435,8 +435,7 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(absl::string_view(data), - absl::string_view(buffer->data(), data_len)); + EXPECT_EQ(std::string_view(data), std::string_view(buffer->data(), data_len)); } TEST_P(QuicChromiumClientStreamTest, OnDataAvailableAfterReadBody) { @@ -468,8 +467,7 @@ /*offset=*/offset, data)); EXPECT_EQ(data_len, callback.WaitForResult()); - EXPECT_EQ(absl::string_view(data), - absl::string_view(buffer->data(), data_len)); + EXPECT_EQ(std::string_view(data), std::string_view(buffer->data(), data_len)); base::RunLoop().RunUntilIdle(); } @@ -564,8 +562,7 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(absl::string_view(data), - absl::string_view(buffer->data(), data_len)); + EXPECT_EQ(std::string_view(data), std::string_view(buffer->data(), data_len)); spdy::Http2HeaderBlock trailers; trailers["bar"] = "foo"; @@ -612,8 +609,7 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(absl::string_view(data), - absl::string_view(buffer->data(), data_len)); + EXPECT_EQ(std::string_view(data), std::string_view(buffer->data(), data_len)); // Read again, and it will be pending. EXPECT_THAT( @@ -667,8 +663,7 @@ scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(2 * data_len); EXPECT_EQ(data_len, handle_->ReadBody(buffer.get(), 2 * data_len, callback.callback())); - EXPECT_EQ(absl::string_view(data), - absl::string_view(buffer->data(), data_len)); + EXPECT_EQ(std::string_view(data), std::string_view(buffer->data(), data_len)); // Deliver trailers. Delegate notification is posted asynchronously. spdy::Http2HeaderBlock trailers; @@ -882,8 +877,7 @@ int data_len = std::size(data) - 1; scoped_refptr<IOBuffer> buffer = base::MakeRefCounted<IOBuffer>(data_len + 1); ASSERT_EQ(data_len, stream2->Read(buffer.get(), data_len + 1)); - EXPECT_EQ(absl::string_view(data), - absl::string_view(buffer->data(), data_len)); + EXPECT_EQ(std::string_view(data), std::string_view(buffer->data(), data_len)); } // Regression test for https://crbug.com/1043531.
diff --git a/net/quic/quic_connection_logger.cc b/net/quic/quic_connection_logger.cc index ac521dd..3a8fc02 100644 --- a/net/quic/quic_connection_logger.cc +++ b/net/quic/quic_connection_logger.cc
@@ -456,7 +456,7 @@ void QuicConnectionLogger::OnCryptoHandshakeMessageReceived( const quic::CryptoHandshakeMessage& message) { if (message.tag() == quic::kSHLO) { - absl::string_view address; + std::string_view address; quic::QuicSocketAddressCoder decoder; if (message.GetStringPiece(quic::kCADR, &address) && decoder.Decode(address.data(), address.size())) {
diff --git a/net/quic/quic_crypto_framer_parse_message_fuzzer.cc b/net/quic/quic_crypto_framer_parse_message_fuzzer.cc index 9a8f310..621fb5d 100644 --- a/net/quic/quic_crypto_framer_parse_message_fuzzer.cc +++ b/net/quic/quic_crypto_framer_parse_message_fuzzer.cc
@@ -9,7 +9,7 @@ // Entry point for LibFuzzer. extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) { - absl::string_view crypto_input(reinterpret_cast<const char*>(data), size); + std::string_view crypto_input(reinterpret_cast<const char*>(data), size); std::unique_ptr<quic::CryptoHandshakeMessage> handshake_message( quic::CryptoFramer::ParseMessage(crypto_input));
diff --git a/net/quic/quic_end_to_end_unittest.cc b/net/quic/quic_end_to_end_unittest.cc index 95b2e5de..da1310a8 100644 --- a/net/quic/quic_end_to_end_unittest.cc +++ b/net/quic/quic_end_to_end_unittest.cc
@@ -170,10 +170,10 @@ // Adds an entry to the cache used by the QUIC server to serve // responses. - void AddToCache(absl::string_view path, + void AddToCache(std::string_view path, int response_code, - absl::string_view response_detail, - absl::string_view body) { + std::string_view response_detail, + std::string_view body) { memory_cache_backend_.AddSimpleResponse("test.example.com", path, response_code, body); }
diff --git a/net/quic/quic_event_logger.cc b/net/quic/quic_event_logger.cc index ca5943c..4ff3849 100644 --- a/net/quic/quic_event_logger.cc +++ b/net/quic/quic_event_logger.cc
@@ -716,7 +716,7 @@ void QuicEventLogger::OnCryptoHandshakeMessageReceived( const quic::CryptoHandshakeMessage& message) { if (message.tag() == quic::kSHLO) { - absl::string_view address; + std::string_view address; quic::QuicSocketAddressCoder decoder; if (message.GetStringPiece(quic::kCADR, &address) && decoder.Decode(address.data(), address.size())) {
diff --git a/net/quic/quic_http_stream_test.cc b/net/quic/quic_http_stream_test.cc index be44e43..15fbcf2 100644 --- a/net/quic/quic_http_stream_test.cc +++ b/net/quic/quic_http_stream_test.cc
@@ -456,14 +456,14 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructClientDataPacket( uint64_t packet_number, bool fin, - absl::string_view data) { + std::string_view data) { return client_maker_.MakeDataPacket(packet_number, stream_id_, fin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, bool fin, - absl::string_view data) { + std::string_view data) { return server_maker_.MakeDataPacket(packet_number, stream_id_, fin, data); }
diff --git a/net/quic/quic_network_transaction_unittest.cc b/net/quic/quic_network_transaction_unittest.cc index afe250fb..3ac9878 100644 --- a/net/quic/quic_network_transaction_unittest.cc +++ b/net/quic/quic_network_transaction_unittest.cc
@@ -449,7 +449,7 @@ uint64_t packet_number, quic::QuicStreamId stream_id, bool fin, - absl::string_view data) { + std::string_view data) { return server_maker_.MakeDataPacket(packet_number, stream_id, fin, data); } @@ -457,7 +457,7 @@ uint64_t packet_number, quic::QuicStreamId stream_id, bool fin, - absl::string_view data) { + std::string_view data) { return client_maker_->MakeDataPacket(packet_number, stream_id, fin, data); } @@ -467,7 +467,7 @@ uint64_t largest_received, uint64_t smallest_received, bool fin, - absl::string_view data) { + std::string_view data) { return client_maker_->MakeAckAndDataPacket(packet_number, stream_id, largest_received, smallest_received, fin, data); @@ -481,7 +481,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data) { + std::string_view data) { return client_maker_->MakeAckDataAndRst( packet_number, stream_id, error_code, largest_received, smallest_received, data_id, fin, data); @@ -1287,7 +1287,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( packet_number++, stream_id, false, - absl::string_view(response_data.data() + offset, len))); + std::string_view(response_data.data() + offset, len))); } mock_quic_data.AddRead( @@ -1348,7 +1348,7 @@ mock_quic_data.AddRead( ASYNC, ConstructServerDataPacket( packet_number++, stream_id, false, - absl::string_view(response_data.data() + offset, len))); + std::string_view(response_data.data() + offset, len))); } mock_quic_data.AddRead(
diff --git a/net/quic/quic_proxy_client_socket_unittest.cc b/net/quic/quic_proxy_client_socket_unittest.cc index 0506194..ed8a416 100644 --- a/net/quic/quic_proxy_client_socket_unittest.cc +++ b/net/quic/quic_proxy_client_socket_unittest.cc
@@ -391,7 +391,7 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructDataPacket( uint64_t packet_number, - absl::string_view data) { + std::string_view data) { return client_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, !kFin, data); } @@ -400,7 +400,7 @@ uint64_t packet_number, uint64_t largest_received, uint64_t smallest_received, - absl::string_view data) { + std::string_view data) { return client_maker_.MakeAckAndDataPacket( packet_number, client_data_stream_id1_, largest_received, smallest_received, !kFin, data); @@ -426,14 +426,14 @@ std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataPacket( uint64_t packet_number, - absl::string_view data) { + std::string_view data) { return server_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, !kFin, data); } std::unique_ptr<quic::QuicReceivedPacket> ConstructServerDataFinPacket( uint64_t packet_number, - absl::string_view data) { + std::string_view data) { return server_maker_.MakeDataPacket(packet_number, client_data_stream_id1_, kFin, data); }
diff --git a/net/quic/quic_stream_factory_test.cc b/net/quic/quic_stream_factory_test.cc index d6e48ac..de42d80 100644 --- a/net/quic/quic_stream_factory_test.cc +++ b/net/quic/quic_stream_factory_test.cc
@@ -886,7 +886,7 @@ uint64_t packet_number, quic::QuicStreamId stream_id, bool fin, - absl::string_view data) { + std::string_view data) { return server_maker_.MakeDataPacket(packet_number, stream_id, fin, data); }
diff --git a/net/quic/quic_test_packet_maker.cc b/net/quic/quic_test_packet_maker.cc index 2df886d..54be6a6 100644 --- a/net/quic/quic_test_packet_maker.cc +++ b/net/quic/quic_test_packet_maker.cc
@@ -301,7 +301,7 @@ quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, quic::QuicStreamId data_stream_id, - absl::string_view data) { + std::string_view data) { InitializeHeader(num); if (version_.HasIetfQuicFrames()) { @@ -321,7 +321,7 @@ quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, uint64_t retransmit_frame_count) { DCHECK(save_packet_frames_); InitializeHeader(num); @@ -353,7 +353,7 @@ QuicTestPacketMaker::MakeDataAndRstPacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code) { InitializeHeader(num); @@ -371,7 +371,7 @@ QuicTestPacketMaker::MakeDataRstAndAckPacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, uint64_t largest_received, @@ -455,7 +455,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data) { + std::string_view data) { InitializeHeader(num); AddQuicRstStreamFrame(stream_id, error_code); @@ -473,7 +473,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data) { + std::string_view data) { InitializeHeader(num); AddQuicAckFrame(largest_received, smallest_received); @@ -494,7 +494,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data) { + std::string_view data) { InitializeHeader(num); AddQuicAckFrame(largest_received, smallest_received); @@ -566,7 +566,7 @@ QuicTestPacketMaker::MakeDataRstAndConnectionClosePacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, quic::QuicErrorCode quic_error, @@ -588,7 +588,7 @@ QuicTestPacketMaker::MakeDataRstAckAndConnectionClosePacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, uint64_t largest_received, @@ -614,7 +614,7 @@ QuicTestPacketMaker::MakeDataRstAckAndConnectionClosePacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, uint64_t largest_received, @@ -703,7 +703,7 @@ uint64_t packet_number, quic::QuicStreamId stream_id, bool fin, - absl::string_view data) { + std::string_view data) { InitializeHeader(packet_number); AddQuicStreamFrame(stream_id, fin, data); return BuildPacket(); @@ -715,7 +715,7 @@ uint64_t largest_received, uint64_t smallest_received, bool fin, - absl::string_view data) { + std::string_view data) { InitializeHeader(packet_number); AddQuicAckFrame(largest_received, smallest_received); @@ -732,7 +732,7 @@ uint64_t largest_received, uint64_t smallest_received, bool fin, - absl::string_view data) { + std::string_view data) { InitializeHeader(packet_number); AddQuicAckFrame(largest_received, smallest_received); @@ -1143,7 +1143,7 @@ void QuicTestPacketMaker::AddQuicStreamFrame(quic::QuicStreamId stream_id, bool fin, - absl::string_view data) { + std::string_view data) { AddQuicStreamFrameWithOffset(stream_id, fin, stream_offsets_[stream_id], data); stream_offsets_[stream_id] += data.length(); @@ -1153,10 +1153,10 @@ quic::QuicStreamId stream_id, bool fin, quic::QuicStreamOffset offset, - absl::string_view data) { + std::string_view data) { // Save the stream data so that callers can use temporary objects for data. saved_stream_data_.push_back(std::make_unique<std::string>(data)); - absl::string_view saved_data = *saved_stream_data_.back(); + std::string_view saved_data = *saved_stream_data_.back(); quic::QuicStreamFrame stream_frame(stream_id, fin, offset, saved_data); frames_.push_back(quic::QuicFrame(stream_frame)); @@ -1492,7 +1492,7 @@ std::string data(previous_frame->data_buffer, previous_frame->data_length); data += std::string(new_frame->data_buffer, new_frame->data_length); saved_stream_data_.push_back(std::make_unique<std::string>(data)); - absl::string_view saved_data = *saved_stream_data_.back(); + std::string_view saved_data = *saved_stream_data_.back(); previous_frame->data_buffer = saved_data.data(); previous_frame->data_length = saved_data.length();
diff --git a/net/quic/quic_test_packet_maker.h b/net/quic/quic_test_packet_maker.h index 3afd9ce..651d1b4 100644 --- a/net/quic/quic_test_packet_maker.h +++ b/net/quic/quic_test_packet_maker.h
@@ -122,7 +122,7 @@ quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, quic::QuicStreamId data_stream_id, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeRetransmissionRstAndDataPacket( const std::vector<uint64_t>& original_packet_numbers, @@ -130,20 +130,20 @@ quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, uint64_t retransmit_frame_count = 0); std::unique_ptr<quic::QuicReceivedPacket> MakeDataAndRstPacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code); std::unique_ptr<quic::QuicReceivedPacket> MakeDataRstAndAckPacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode rst_error_code, uint64_t largest_received, @@ -181,7 +181,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckDataAndRst( uint64_t num, @@ -191,7 +191,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckRstAndDataPacket( uint64_t num, @@ -201,7 +201,7 @@ uint64_t smallest_received, quic::QuicStreamId data_id, bool fin, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeRstAndConnectionClosePacket( uint64_t num, @@ -213,7 +213,7 @@ std::unique_ptr<quic::QuicReceivedPacket> MakeDataRstAndConnectionClosePacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, quic::QuicErrorCode quic_error, @@ -223,7 +223,7 @@ MakeDataRstAckAndConnectionClosePacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, uint64_t largest_received, @@ -235,7 +235,7 @@ MakeDataRstAckAndConnectionClosePacket( uint64_t num, quic::QuicStreamId data_stream_id, - absl::string_view data, + std::string_view data, quic::QuicStreamId rst_stream_id, quic::QuicRstStreamErrorCode error_code, uint64_t largest_received, @@ -282,7 +282,7 @@ uint64_t packet_number, quic::QuicStreamId stream_id, bool fin, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndDataPacket( uint64_t packet_number, @@ -290,7 +290,7 @@ uint64_t largest_received, uint64_t smallest_received, bool fin, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckRetransmissionAndDataPacket( uint64_t packet_number, @@ -299,7 +299,7 @@ uint64_t largest_received, uint64_t smallest_received, bool fin, - absl::string_view data); + std::string_view data); std::unique_ptr<quic::QuicReceivedPacket> MakeAckAndRetransmissionPacket( uint64_t packet_number, @@ -443,12 +443,12 @@ // Use and increase stream's current offset. void AddQuicStreamFrame(quic::QuicStreamId stream_id, bool fin, - absl::string_view data); + std::string_view data); // Use |offset| and do not change stream's current offset. void AddQuicStreamFrameWithOffset(quic::QuicStreamId stream_id, bool fin, quic::QuicStreamOffset offset, - absl::string_view data); + std::string_view data); void AddQuicAckFrame(uint64_t largest_received, uint64_t smallest_received); void AddQuicAckFrame(uint64_t first_received, uint64_t largest_received,
diff --git a/net/quic/quic_test_packet_printer.cc b/net/quic/quic_test_packet_printer.cc index bcf13b6..7d6f9b2 100644 --- a/net/quic/quic_test_packet_printer.cc +++ b/net/quic/quic_test_packet_printer.cc
@@ -38,9 +38,9 @@ } void OnRetryPacket(QuicConnectionId original_connection_id, QuicConnectionId new_connection_id, - absl::string_view retry_token, - absl::string_view retry_integrity_tag, - absl::string_view retry_without_tag) override { + std::string_view retry_token, + std::string_view retry_integrity_tag, + std::string_view retry_without_tag) override { *output_ << "OnRetryPacket\n"; } bool OnUnauthenticatedPublicHeader(const QuicPacketHeader& header) override {
diff --git a/net/spdy/buffered_spdy_framer.cc b/net/spdy/buffered_spdy_framer.cc index 5954315..bd44895d 100644 --- a/net/spdy/buffered_spdy_framer.cc +++ b/net/spdy/buffered_spdy_framer.cc
@@ -208,7 +208,7 @@ void BufferedSpdyFramer::OnAltSvc( spdy::SpdyStreamId stream_id, - absl::string_view origin, + std::string_view origin, const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector) { visitor_->OnAltSvc(stream_id, origin, altsvc_vector); }
diff --git a/net/spdy/buffered_spdy_framer.h b/net/spdy/buffered_spdy_framer.h index ecb5bd1fd..21b921e 100644 --- a/net/spdy/buffered_spdy_framer.h +++ b/net/spdy/buffered_spdy_framer.h
@@ -188,7 +188,7 @@ spdy::SpdyStreamId promised_stream_id, bool end) override; void OnAltSvc(spdy::SpdyStreamId stream_id, - absl::string_view origin, + std::string_view origin, const spdy::SpdyAltSvcWireFormat::AlternativeServiceVector& altsvc_vector) override; void OnDataFrameHeader(spdy::SpdyStreamId stream_id, @@ -202,7 +202,7 @@ int weight, bool exclusive) override {} void OnPriorityUpdate(spdy::SpdyStreamId prioritized_stream_id, - absl::string_view priority_field_value) override {} + std::string_view priority_field_value) override {} bool OnUnknownFrame(spdy::SpdyStreamId stream_id, uint8_t frame_type) override; void OnUnknownFrameStart(spdy::SpdyStreamId stream_id, @@ -210,7 +210,7 @@ uint8_t type, uint8_t flags) override {} void OnUnknownFramePayload(spdy::SpdyStreamId stream_id, - absl::string_view payload) override {} + std::string_view payload) override {} // spdy::SpdyFramer methods. size_t ProcessInput(const char* data, size_t len);
diff --git a/net/spdy/fuzzing/hpack_fuzz_util.cc b/net/spdy/fuzzing/hpack_fuzz_util.cc index 7de999de..09f08aa 100644 --- a/net/spdy/fuzzing/hpack_fuzz_util.cc +++ b/net/spdy/fuzzing/hpack_fuzz_util.cc
@@ -108,7 +108,7 @@ } // static -bool HpackFuzzUtil::NextHeaderBlock(Input* input, absl::string_view* out) { +bool HpackFuzzUtil::NextHeaderBlock(Input* input, std::string_view* out) { // ClusterFuzz may truncate input files if the fuzzer ran out of allocated // disk space. Be tolerant of these. CHECK_LE(input->offset, input->input.size()); @@ -123,7 +123,7 @@ if (input->remaining() < length) { return false; } - *out = absl::string_view(input->ptr(), length); + *out = std::string_view(input->ptr(), length); input->offset += length; return true; } @@ -144,7 +144,7 @@ // static bool HpackFuzzUtil::RunHeaderBlockThroughFuzzerStages( FuzzerContext* context, - absl::string_view input_block) { + std::string_view input_block) { // First stage: Decode the input header block. This may fail on invalid input. if (!context->first_stage->HandleControlFrameHeadersData( input_block.data(), input_block.size())) {
diff --git a/net/spdy/fuzzing/hpack_fuzz_util.h b/net/spdy/fuzzing/hpack_fuzz_util.h index 80b175b..c1831b57 100644 --- a/net/spdy/fuzzing/hpack_fuzz_util.h +++ b/net/spdy/fuzzing/hpack_fuzz_util.h
@@ -51,7 +51,7 @@ // Returns true if the next header block was set at |out|. Returns // false if no input header blocks remain. - static bool NextHeaderBlock(Input* input, absl::string_view* out); + static bool NextHeaderBlock(Input* input, std::string_view* out); // Returns the serialized header block length prefix for a block of // |block_size| bytes. @@ -73,7 +73,7 @@ // |second_stage| and |third_stage| as well. Returns whether all stages // processed the input without error. static bool RunHeaderBlockThroughFuzzerStages(FuzzerContext* context, - absl::string_view input_block); + std::string_view input_block); // Flips random bits within |buffer|. The total number of flips is // |flip_per_thousand| bits for every 1,024 bytes of |buffer_length|,
diff --git a/net/spdy/fuzzing/hpack_fuzz_util_test.cc b/net/spdy/fuzzing/hpack_fuzz_util_test.cc index c0fcda9..a092759a 100644 --- a/net/spdy/fuzzing/hpack_fuzz_util_test.cc +++ b/net/spdy/fuzzing/hpack_fuzz_util_test.cc
@@ -69,7 +69,7 @@ HpackFuzzUtil::Input input; input.input.assign(fixture, std::size(fixture) - 1); - absl::string_view block; + std::string_view block; EXPECT_TRUE(HpackFuzzUtil::NextHeaderBlock(&input, &block)); EXPECT_EQ("aaaaa", block); @@ -130,7 +130,7 @@ HpackFuzzUtil::FuzzerContext context; HpackFuzzUtil::InitializeFuzzerContext(&context); - absl::string_view block; + std::string_view block; while (HpackFuzzUtil::NextHeaderBlock(&input, &block)) { // As these are valid examples, all fuzz stages should succeed. EXPECT_TRUE(
diff --git a/net/spdy/header_coalescer.cc b/net/spdy/header_coalescer.cc index 50ec39c4..5c23c7c 100644 --- a/net/spdy/header_coalescer.cc +++ b/net/spdy/header_coalescer.cc
@@ -47,7 +47,7 @@ const NetLogWithSource& net_log) : max_header_list_size_(max_header_list_size), net_log_(net_log) {} -void HeaderCoalescer::OnHeader(absl::string_view key, absl::string_view value) { +void HeaderCoalescer::OnHeader(std::string_view key, absl::string_view value) { if (error_seen_) return; if (!AddHeader(key, value)) {
diff --git a/net/spdy/header_coalescer.h b/net/spdy/header_coalescer.h index 7965906..1cb24a8 100644 --- a/net/spdy/header_coalescer.h +++ b/net/spdy/header_coalescer.h
@@ -21,7 +21,7 @@ void OnHeaderBlockStart() override {} - void OnHeader(absl::string_view key, absl::string_view value) override; + void OnHeader(std::string_view key, absl::string_view value) override; void OnHeaderBlockEnd(size_t uncompressed_header_bytes, size_t compressed_header_bytes) override {}
diff --git a/net/spdy/header_coalescer_test.cc b/net/spdy/header_coalescer_test.cc index 94ca09d..e159bdc 100644 --- a/net/spdy/header_coalescer_test.cc +++ b/net/spdy/header_coalescer_test.cc
@@ -94,12 +94,12 @@ spdy::Http2HeaderBlock header_block = header_coalescer_.release_headers(); EXPECT_THAT(header_block, - ElementsAre(Pair("foo", absl::string_view("bar\0quux", 8)), + ElementsAre(Pair("foo", std::string_view("bar\0quux", 8)), Pair("cookie", "baz; qux"))); } TEST_F(HeaderCoalescerTest, HeaderNameNotValid) { - absl::string_view header_name("\x1\x7F\x80\xFF"); + std::string_view header_name("\x1\x7F\x80\xFF"); header_coalescer_.OnHeader(header_name, "foo"); EXPECT_TRUE(header_coalescer_.error_seen()); ExpectEntry("%ESCAPED:\xE2\x80\x8B \x1\x7F%80%FF", "foo", @@ -108,7 +108,7 @@ // RFC 7540 Section 8.1.2.6. Uppercase in header name is invalid. TEST_F(HeaderCoalescerTest, HeaderNameHasUppercase) { - absl::string_view header_name("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); + std::string_view header_name("ABCDEFGHIJKLMNOPQRSTUVWXYZ"); header_coalescer_.OnHeader(header_name, "foo"); EXPECT_TRUE(header_coalescer_.error_seen()); ExpectEntry("ABCDEFGHIJKLMNOPQRSTUVWXYZ", "foo", @@ -122,7 +122,7 @@ // "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA TEST_F(HeaderCoalescerTest, HeaderNameValid) { // Due to RFC 7540 Section 8.1.2.6. Uppercase characters are not included. - absl::string_view header_name( + std::string_view header_name( "abcdefghijklmnopqrstuvwxyz0123456789!#$%&'*+-." "^_`|~"); header_coalescer_.OnHeader(header_name, "foo");
diff --git a/net/spdy/spdy_test_util_common.cc b/net/spdy/spdy_test_util_common.cc index 409b10b..4df73f3 100644 --- a/net/spdy/spdy_test_util_common.cc +++ b/net/spdy/spdy_test_util_common.cc
@@ -117,8 +117,8 @@ // Copy in the headers. for (int i = 0; i < extra_header_count; i++) { - absl::string_view key(extra_headers[i * 2]); - absl::string_view value(extra_headers[i * 2 + 1]); + std::string_view key(extra_headers[i * 2]); + std::string_view value(extra_headers[i * 2 + 1]); DCHECK(!key.empty()) << "Header key must not be empty."; headers->AppendValueOrAddHeader(key, value); }
diff --git a/net/test/embedded_test_server/http2_connection.cc b/net/test/embedded_test_server/http2_connection.cc index a51ef76..03d0e9c1 100644 --- a/net/test/embedded_test_server/http2_connection.cc +++ b/net/test/embedded_test_server/http2_connection.cc
@@ -67,7 +67,7 @@ return {std::min(chunks_.front().size(), max_length), finished}; } - bool Send(absl::string_view frame_header, size_t payload_length) override { + bool Send(std::string_view frame_header, size_t payload_length) override { std::string concatenated = base::StrCat({frame_header, chunks_.front().substr(0, payload_length)}); const int64_t result = connection_->OnReadyToSend(concatenated); @@ -249,7 +249,7 @@ if (connection_listener_) connection_listener_->ReadFromSocket(*socket_, rv); - absl::string_view remaining_buffer(read_buf_->data(), rv); + std::string_view remaining_buffer(read_buf_->data(), rv); while (!remaining_buffer.empty()) { int result = adapter_->ProcessBytes(remaining_buffer); if (result < 0) @@ -287,7 +287,7 @@ return weak_factory_.GetWeakPtr(); } -int64_t Http2Connection::OnReadyToSend(absl::string_view serialized) { +int64_t Http2Connection::OnReadyToSend(std::string_view serialized) { if (write_buf_) return kSendBlocked; @@ -360,8 +360,8 @@ http2::adapter::Http2VisitorInterface::OnHeaderResult Http2Connection::OnHeaderForStream(http2::adapter::Http2StreamId stream_id, - absl::string_view key, - absl::string_view value) { + std::string_view key, + std::string_view value) { header_map_[stream_id][std::string(key)] = std::string(value); return http2::adapter::Http2VisitorInterface::HEADER_OK; } @@ -409,7 +409,7 @@ } bool Http2Connection::OnDataForStream(StreamId stream_id, - absl::string_view data) { + std::string_view data) { auto request = request_map_.find(stream_id); if (request == request_map_.end()) { // We should not receive data before receiving headers. @@ -430,7 +430,7 @@ bool Http2Connection::OnGoAway(StreamId last_accepted_stream_id, http2::adapter::Http2ErrorCode error_code, - absl::string_view opaque_data) { + std::string_view opaque_data) { return true; } @@ -455,7 +455,7 @@ } bool Http2Connection::OnMetadataForStream(StreamId stream_id, - absl::string_view metadata) { + std::string_view metadata) { return true; }
diff --git a/net/test/embedded_test_server/http2_connection.h b/net/test/embedded_test_server/http2_connection.h index e650818..059ad67 100644 --- a/net/test/embedded_test_server/http2_connection.h +++ b/net/test/embedded_test_server/http2_connection.h
@@ -50,10 +50,10 @@ base::WeakPtr<HttpConnection> GetWeakPtr() override; // http2::adapter::Http2VisitorInterface - int64_t OnReadyToSend(absl::string_view serialized) override; + int64_t OnReadyToSend(std::string_view serialized) override; OnHeaderResult OnHeaderForStream(StreamId stream_id, - absl::string_view key, - absl::string_view value) override; + std::string_view key, + std::string_view value) override; bool OnEndHeadersForStream(StreamId stream_id) override; bool OnEndStream(StreamId stream_id) override; bool OnCloseStream(StreamId stream_id, @@ -70,7 +70,7 @@ void OnSettingsAck() override {} bool OnBeginHeadersForStream(StreamId stream_id) override; bool OnBeginDataForStream(StreamId stream_id, size_t payload_length) override; - bool OnDataForStream(StreamId stream_id, absl::string_view data) override; + bool OnDataForStream(StreamId stream_id, std::string_view data) override; bool OnDataPaddingLength(StreamId stream_id, size_t padding_length) override; void OnRstStream(StreamId stream_id, http2::adapter::Http2ErrorCode error_code) override {} @@ -83,7 +83,7 @@ StreamId promised_stream_id) override {} bool OnGoAway(StreamId last_accepted_stream_id, http2::adapter::Http2ErrorCode error_code, - absl::string_view opaque_data) override; + std::string_view opaque_data) override; void OnWindowUpdate(StreamId stream_id, int window_increment) override {} int OnBeforeFrameSent(uint8_t frame_type, StreamId stream_id, @@ -98,9 +98,9 @@ void OnBeginMetadataForStream(StreamId stream_id, size_t payload_length) override {} bool OnMetadataForStream(StreamId stream_id, - absl::string_view metadata) override; + std::string_view metadata) override; bool OnMetadataEndForStream(StreamId stream_id) override; - void OnErrorDebug(absl::string_view message) override {} + void OnErrorDebug(std::string_view message) override {} http2::adapter::OgHttp2Adapter* adapter() { return adapter_.get(); }
diff --git a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.cc b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.cc index 2c27dfe..2b61ca3 100644 --- a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.cc +++ b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.cc
@@ -17,8 +17,8 @@ namespace quiche { -void QuicheRecordTestOutputToFile(absl::string_view filename, - absl::string_view data) { +void QuicheRecordTestOutputToFile(std::string_view filename, + std::string_view data) { std::string output_dir; if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR", &output_dir) || @@ -37,12 +37,12 @@ QUIC_LOG(INFO) << "Recorded test output into " << path; } -void QuicheSaveTestOutputImpl(absl::string_view filename, - absl::string_view data) { +void QuicheSaveTestOutputImpl(std::string_view filename, + std::string_view data) { QuicheRecordTestOutputToFile(filename, data); } -bool QuicheLoadTestOutputImpl(absl::string_view filename, std::string* data) { +bool QuicheLoadTestOutputImpl(std::string_view filename, std::string* data) { std::string output_dir; if (!base::Environment::Create()->GetVar("QUIC_TEST_OUTPUT_DIR", &output_dir) || @@ -58,8 +58,7 @@ return base::ReadFileToString(path, data); } -void QuicheRecordTraceImpl(absl::string_view identifier, - absl::string_view data) { +void QuicheRecordTraceImpl(std::string_view identifier, std::string_view data) { const testing::TestInfo* test_info = testing::UnitTest::GetInstance()->current_test_info();
diff --git a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.h b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.h index 952278b..bd45c77 100644 --- a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.h +++ b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_test_output_impl.h
@@ -5,17 +5,15 @@ #ifndef NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_TEST_OUTPUT_IMPL_H_ #define NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_TEST_OUTPUT_IMPL_H_ -#include "third_party/abseil-cpp/absl/strings/string_view.h" +#include <string_view> namespace quiche { -void QuicheSaveTestOutputImpl(absl::string_view filename, - absl::string_view data); +void QuicheSaveTestOutputImpl(std::string_view filename, std::string_view data); -bool QuicheLoadTestOutputImpl(absl::string_view filename, std::string* data); +bool QuicheLoadTestOutputImpl(std::string_view filename, std::string* data); -void QuicheRecordTraceImpl(absl::string_view identifier, - absl::string_view data); +void QuicheRecordTraceImpl(std::string_view identifier, std::string_view data); } // namespace quiche
diff --git a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.cc b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.cc index c43785c7..ca4a97c 100644 --- a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.cc +++ b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.cc
@@ -7,13 +7,13 @@ #include <cstdint> #include <limits> #include <string> +#include <string_view> #include "net/third_party/uri_template/uri_template.h" #include "third_party/abseil-cpp/absl/container/flat_hash_map.h" #include "third_party/abseil-cpp/absl/container/flat_hash_set.h" #include "third_party/abseil-cpp/absl/strings/str_cat.h" #include "third_party/abseil-cpp/absl/strings/str_replace.h" -#include "third_party/abseil-cpp/absl/strings/string_view.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/url_canon.h" #include "url/url_util.h" @@ -41,7 +41,7 @@ return result; } -absl::optional<std::string> AsciiUrlDecodeImpl(absl::string_view input) { +absl::optional<std::string> AsciiUrlDecodeImpl(std::string_view input) { std::string input_encoded = std::string(input); url::RawCanonOutputW<1024> canon_output; url::DecodeURLEscapeSequences(input_encoded.c_str(), input_encoded.length(),
diff --git a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.h b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.h index 7b5363e8..3a625b2 100644 --- a/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.h +++ b/net/third_party/quiche/overrides/quiche_platform_impl/quiche_url_utils_impl.h
@@ -6,11 +6,11 @@ #define NET_THIRD_PARTY_QUICHE_OVERRIDES_QUICHE_PLATFORM_IMPL_QUICHE_URL_UTILS_IMPL_H_ #include <string> +#include <string_view> #include "quiche/common/platform/api/quiche_export.h" #include "third_party/abseil-cpp/absl/container/flat_hash_map.h" #include "third_party/abseil-cpp/absl/container/flat_hash_set.h" -#include "third_party/abseil-cpp/absl/strings/string_view.h" #include "third_party/abseil-cpp/absl/types/optional.h" namespace quiche { @@ -29,7 +29,7 @@ // Decodes a URL-encoded string and converts it to ASCII. If the decoded input // contains non-ASCII characters, decoding fails and absl::nullopt is returned. QUICHE_EXPORT absl::optional<std::string> AsciiUrlDecodeImpl( - absl::string_view input); + std::string_view input); } // namespace quiche
diff --git a/net/url_request/url_request_quic_unittest.cc b/net/url_request/url_request_quic_unittest.cc index 9e7b2887..8e93015 100644 --- a/net/url_request/url_request_quic_unittest.cc +++ b/net/url_request/url_request_quic_unittest.cc
@@ -179,8 +179,8 @@ std::string(path); } - void SetDelay(absl::string_view host, - absl::string_view path, + void SetDelay(std::string_view host, + std::string_view path, base::TimeDelta delay) { memory_cache_backend_.SetResponseDelay( host, path,
diff --git a/ppapi/proxy/ppapi_messages.h b/ppapi/proxy/ppapi_messages.h index e62f50e..cbba780b 100644 --- a/ppapi/proxy/ppapi_messages.h +++ b/ppapi/proxy/ppapi_messages.h
@@ -1678,7 +1678,8 @@ PP_VideoProfile /* profile */, PP_HardwareAcceleration /* acceleration */, uint32_t /* min_picture_count */) -IPC_MESSAGE_CONTROL0(PpapiPluginMsg_VideoDecoder_InitializeReply) +IPC_MESSAGE_CONTROL1(PpapiPluginMsg_VideoDecoder_InitializeReply, + bool /* use_shared_images */) IPC_MESSAGE_CONTROL2(PpapiHostMsg_VideoDecoder_GetShm, uint32_t /* shm_id */, uint32_t /* shm_size */) @@ -1703,8 +1704,15 @@ int32_t /* decode_id */, uint32_t /* texture_id */, PP_Rect /* visible_rect */) +IPC_MESSAGE_CONTROL4(PpapiPluginMsg_VideoDecoder_SharedImageReady, + int32_t /* decode_id */, + gpu::Mailbox /* mailbox */, + PP_Size /* size */, + PP_Rect /* visible_rect */) IPC_MESSAGE_CONTROL1(PpapiHostMsg_VideoDecoder_RecyclePicture, uint32_t /* texture_id */) +IPC_MESSAGE_CONTROL1(PpapiHostMsg_VideoDecoder_RecycleSharedImage, + gpu::Mailbox /* mailbox */) IPC_MESSAGE_CONTROL1(PpapiPluginMsg_VideoDecoder_DismissPicture, uint32_t /* texture_id */) IPC_MESSAGE_CONTROL0(PpapiHostMsg_VideoDecoder_Flush)
diff --git a/ppapi/proxy/video_decoder_resource.cc b/ppapi/proxy/video_decoder_resource.cc index 7381760..18e473e 100644 --- a/ppapi/proxy/video_decoder_resource.cc +++ b/ppapi/proxy/video_decoder_resource.cc
@@ -7,6 +7,7 @@ #include <utility> #include "base/functional/bind.h" +#include "gpu/GLES2/gl2extchromium.h" #include "gpu/command_buffer/client/gles2_cmd_helper.h" #include "gpu/command_buffer/client/gles2_implementation.h" #include "gpu/command_buffer/common/mailbox.h" @@ -82,6 +83,21 @@ VideoDecoderResource::~VideoDecoderResource() { // Destroy any textures which haven't been dismissed. + if (initialized_ && use_shared_images()) { + CHECK(textures_.empty()); + + if (!testing_) { + CHECK(gles2_impl_); + for (const auto& shared_image : used_shared_images_) { + gles2_impl_->EndSharedImageAccessDirectCHROMIUM(shared_image.first); + gles2_impl_->DeleteTextures(1, &shared_image.first); + } + + gles2_impl_->ShallowFlushCHROMIUM(); + } + return; + } + TextureMap::iterator it = textures_.begin(); for (; it != textures_.end(); ++it) DeleteGLTexture(it->first); @@ -278,19 +294,33 @@ int32_t VideoDecoderResource::GetPicture( PP_VideoPicture* picture, scoped_refptr<TrackedCallback> callback) { - if (decoder_last_error_) - return decoder_last_error_; - if (reset_callback_.get()) + if (!initialized_) { return PP_ERROR_FAILED; - if (get_picture_callback_.get()) + } + if (decoder_last_error_) { + return decoder_last_error_; + } + if (reset_callback_.get()) { + return PP_ERROR_FAILED; + } + if (get_picture_callback_.get()) { return PP_ERROR_INPROGRESS; + } get_picture_ = picture; - // If the next picture is ready, return it synchronously. - if (!received_pictures_.empty()) { - WriteNextPicture(); - return PP_OK; + if (use_shared_images()) { + // If the next shared image is ready, return it synchronously. + if (!received_shared_images_.empty()) { + WriteNextSharedImage(); + return PP_OK; + } + } else { + // If the next picture is ready, return it synchronously. + if (!received_pictures_.empty()) { + WriteNextPicture(); + return PP_OK; + } } get_picture_callback_ = callback; @@ -299,10 +329,34 @@ } void VideoDecoderResource::RecyclePicture(const PP_VideoPicture* picture) { - if (decoder_last_error_) + if (!initialized_) { return; + } + if (decoder_last_error_) { + return; + } - Post(RENDERER, PpapiHostMsg_VideoDecoder_RecyclePicture(picture->texture_id)); + if (use_shared_images()) { + auto it = used_shared_images_.find(picture->texture_id); + if (it != used_shared_images_.end()) { + gpu::Mailbox mailbox = it->second.mailbox; + + if (!testing_) { + CHECK(gles2_impl_); + gles2_impl_->EndSharedImageAccessDirectCHROMIUM(picture->texture_id); + gles2_impl_->DeleteTextures(1, &picture->texture_id); + gles2_impl_->ShallowFlushCHROMIUM(); + } + + used_shared_images_.erase(it); + + Post(RENDERER, PpapiHostMsg_VideoDecoder_RecycleSharedImage(mailbox)); + } + } else { + CHECK(used_shared_images_.empty()); + Post(RENDERER, + PpapiHostMsg_VideoDecoder_RecyclePicture(picture->texture_id)); + } } int32_t VideoDecoderResource::Flush(scoped_refptr<TrackedCallback> callback) { @@ -354,6 +408,9 @@ PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( PpapiPluginMsg_VideoDecoder_PictureReady, OnPluginMsgPictureReady) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( + PpapiPluginMsg_VideoDecoder_SharedImageReady, + OnPluginMsgSharedImageReady) + PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( PpapiPluginMsg_VideoDecoder_DismissPicture, OnPluginMsgDismissPicture) PPAPI_DISPATCH_PLUGIN_RESOURCE_CALL( PpapiPluginMsg_VideoDecoder_NotifyError, OnPluginMsgNotifyError) @@ -371,6 +428,8 @@ uint32_t num_textures, const PP_Size& size, uint32_t texture_target) { + CHECK(!use_shared_images()); + DCHECK(num_textures); DCHECK(num_textures >= min_picture_count_); std::vector<uint32_t> texture_ids(num_textures); @@ -426,7 +485,28 @@ int32_t decode_id, uint32_t texture_id, const PP_Rect& visible_rect) { - received_pictures_.push(Picture(decode_id, texture_id, visible_rect)); + CHECK(!use_shared_images()); + received_pictures_.emplace(decode_id, texture_id, visible_rect); + + if (TrackedCallback::IsPending(get_picture_callback_)) { + // The plugin may call GetPicture in its callback. + scoped_refptr<TrackedCallback> callback; + callback.swap(get_picture_callback_); + WriteNextPicture(); + callback->Run(PP_OK); + } +} + +void VideoDecoderResource::OnPluginMsgSharedImageReady( + const ResourceMessageReplyParams& params, + int32_t decode_id, + const gpu::Mailbox& mailbox, + const PP_Size& size, + const PP_Rect& visible_rect) { + CHECK(use_shared_images()); + + received_shared_images_.push( + ReceivedSharedImage{decode_id, mailbox, size, visible_rect}); if (TrackedCallback::IsPending(get_picture_callback_)) { // The plugin may call GetPicture in its callback. @@ -440,6 +520,8 @@ void VideoDecoderResource::OnPluginMsgDismissPicture( const ResourceMessageReplyParams& params, uint32_t texture_id) { + CHECK(!use_shared_images()); + DeleteGLTexture(texture_id); textures_.erase(texture_id); } @@ -458,10 +540,15 @@ } void VideoDecoderResource::OnPluginMsgInitializeComplete( - const ResourceMessageReplyParams& params) { + const ResourceMessageReplyParams& params, + bool use_shared_images) { decoder_last_error_ = params.result(); - if (decoder_last_error_ == PP_OK) + if (decoder_last_error_ == PP_OK) { initialized_ = true; + use_shared_images_ = use_shared_images; + LOG(WARNING) << "VideoDecoderResource: Using SharedImages: " + << use_shared_images_; + } // Let the plugin call Initialize again from its callback in case of failure. scoped_refptr<TrackedCallback> callback; @@ -506,11 +593,23 @@ const ResourceMessageReplyParams& params) { // All shm buffers should have been made available by now. DCHECK_EQ(shm_buffers_.size(), available_shm_buffers_.size()); + // Recycle any pictures which haven't been passed to the plugin. - while (!received_pictures_.empty()) { - Post(RENDERER, PpapiHostMsg_VideoDecoder_RecyclePicture( - received_pictures_.front().texture_id)); - received_pictures_.pop(); + if (use_shared_images()) { + CHECK(received_pictures_.empty()); + while (!received_shared_images_.empty()) { + Post(RENDERER, PpapiHostMsg_VideoDecoder_RecycleSharedImage( + received_shared_images_.front().mailbox)); + received_shared_images_.pop(); + } + } else { + CHECK(received_shared_images_.empty()); + + while (!received_pictures_.empty()) { + Post(RENDERER, PpapiHostMsg_VideoDecoder_RecyclePicture( + received_pictures_.front().texture_id)); + received_pictures_.pop(); + } } scoped_refptr<TrackedCallback> callback; @@ -524,6 +623,8 @@ } void VideoDecoderResource::DeleteGLTexture(uint32_t id) { + CHECK(!use_shared_images()); + if (gles2_impl_) { gles2_impl_->DeleteTextures(1, &id); gles2_impl_->Flush(); @@ -531,6 +632,11 @@ } void VideoDecoderResource::WriteNextPicture() { + if (use_shared_images()) { + return WriteNextSharedImage(); + } + + CHECK(received_shared_images_.empty()); DCHECK(!received_pictures_.empty()); Picture& picture = received_pictures_.front(); @@ -568,5 +674,62 @@ received_pictures_.pop(); } +void VideoDecoderResource::WriteNextSharedImage() { + CHECK(use_shared_images()); + CHECK(received_pictures_.empty()); + CHECK(!received_shared_images_.empty()); + auto& shared_image = received_shared_images_.front(); + + // Internally, we identify decodes by a unique id, which the host returns + // to us in the picture. Use this to get the plugin's decode_id. + uint32_t decode_id = + decode_ids_[shared_image.decode_id % kMaximumPictureDelay]; + uint32_t texture_id; + + if (testing_) { + // In unit tests we don't have gles2_impl_, so just generate ids + // sequentially. + static uint32_t texture_ids_for_testing = 1; + texture_id = texture_ids_for_testing++; + } else { + CHECK(gles2_impl_); + // Plugin's GLES2Interface and Renderer's RasterInterface are synchronized + // by issued `ShallowFlushCHROMIUM` after each work. We get shared image + // here after VideoDecoderShim copies new content to it on RasterInterface + // and the context provider is flushed, so we don't need to wait on + // SyncToken here. + texture_id = base::strict_cast<uint32_t>( + gles2_impl_->CreateAndTexStorage2DSharedImageCHROMIUM( + shared_image.mailbox.name)); + gles2_impl_->BeginSharedImageAccessDirectCHROMIUM( + texture_id, GL_SHARED_IMAGE_ACCESS_MODE_READWRITE_CHROMIUM); + + // Flush our GLES2Interface to synchronize with the one that the plugin has. + // They are in a same share group. + gles2_impl_->Flush(); + } + + if (get_picture_) { + DCHECK(!get_picture_0_1_); + get_picture_->decode_id = decode_id; + get_picture_->texture_id = texture_id; + get_picture_->texture_target = GL_TEXTURE_2D; + get_picture_->texture_size = shared_image.size; + get_picture_->visible_rect = shared_image.visible_rect; + get_picture_ = nullptr; + } else { + DCHECK(get_picture_0_1_); + get_picture_0_1_->decode_id = decode_id; + get_picture_0_1_->texture_id = texture_id; + get_picture_0_1_->texture_target = GL_TEXTURE_2D; + get_picture_0_1_->texture_size = shared_image.size; + get_picture_0_1_ = nullptr; + } + + used_shared_images_.insert(std::make_pair(texture_id, shared_image)); + + received_shared_images_.pop(); +} + } // namespace proxy } // namespace ppapi
diff --git a/ppapi/proxy/video_decoder_resource.h b/ppapi/proxy/video_decoder_resource.h index 3463093..eff1a9d 100644 --- a/ppapi/proxy/video_decoder_resource.h +++ b/ppapi/proxy/video_decoder_resource.h
@@ -13,6 +13,7 @@ #include "base/containers/queue.h" #include "base/memory/scoped_refptr.h" +#include "gpu/command_buffer/common/mailbox.h" #include "ppapi/proxy/connection.h" #include "ppapi/proxy/plugin_resource.h" #include "ppapi/proxy/ppapi_proxy_export.h" @@ -118,6 +119,18 @@ PP_Rect visible_rect; }; + struct ReceivedSharedImage { + int32_t decode_id; + gpu::Mailbox mailbox; + PP_Size size; + PP_Rect visible_rect; + }; + + bool use_shared_images() const { + CHECK(initialized_); + return use_shared_images_; + } + // Unsolicited reply message handlers. void OnPluginMsgRequestTextures(const ResourceMessageReplyParams& params, uint32_t num_textures, @@ -127,13 +140,20 @@ int32_t decode_id, uint32_t texture_id, const PP_Rect& visible_rect); + void OnPluginMsgSharedImageReady(const ResourceMessageReplyParams& params, + int32_t decode_id, + const gpu::Mailbox& mailbox, + const PP_Size& size, + const PP_Rect& visible_rect); + void OnPluginMsgDismissPicture(const ResourceMessageReplyParams& params, uint32_t texture_id); void OnPluginMsgNotifyError(const ResourceMessageReplyParams& params, int32_t error); // Reply message handlers for operations that are done in the host. - void OnPluginMsgInitializeComplete(const ResourceMessageReplyParams& params); + void OnPluginMsgInitializeComplete(const ResourceMessageReplyParams& params, + bool use_shared_images); void OnPluginMsgDecodeComplete(const ResourceMessageReplyParams& params, uint32_t shm_id); void OnPluginMsgFlushComplete(const ResourceMessageReplyParams& params); @@ -142,6 +162,7 @@ void RunCallbackWithError(scoped_refptr<TrackedCallback>* callback); void DeleteGLTexture(uint32_t texture_id); void WriteNextPicture(); + void WriteNextSharedImage(); // The shared memory buffers. std::vector<std::unique_ptr<ShmBuffer>> shm_buffers_; @@ -158,6 +179,8 @@ using PictureQueue = base::queue<Picture>; PictureQueue received_pictures_; + base::queue<ReceivedSharedImage> received_shared_images_; + // Pending callbacks. scoped_refptr<TrackedCallback> initialize_callback_; scoped_refptr<TrackedCallback> decode_callback_; @@ -188,6 +211,11 @@ bool initialized_; bool testing_; int32_t decoder_last_error_; + bool use_shared_images_ = false; + + // |used_shared_images_| maps texture names to ReceivedSharedImages that are + // in use by the plugin. + base::flat_map<uint32_t, ReceivedSharedImage> used_shared_images_; }; } // namespace proxy
diff --git a/ppapi/proxy/video_decoder_resource_unittest.cc b/ppapi/proxy/video_decoder_resource_unittest.cc index c4fdd50..a7659e7 100644 --- a/ppapi/proxy/video_decoder_resource_unittest.cc +++ b/ppapi/proxy/video_decoder_resource_unittest.cc
@@ -59,10 +59,18 @@ int32_t result_; }; -class VideoDecoderResourceTest : public PluginProxyTest { +class VideoDecoderResourceTest : public PluginProxyTestHarness, + public testing::TestWithParam<bool> { public: VideoDecoderResourceTest() - : decoder_iface_(thunk::GetPPB_VideoDecoder_1_1_Thunk()) {} + : PluginProxyTestHarness(SINGLETON_GLOBALS), + decoder_iface_(thunk::GetPPB_VideoDecoder_1_1_Thunk()) {} + + void SetUp() override { SetUpHarness(); } + + void TearDown() override { TearDownHarness(); } + + bool use_shared_images() { return GetParam(); } const PPB_VideoDecoder_1_1* decoder_iface() const { return decoder_iface_; } @@ -121,7 +129,8 @@ PpapiHostMsg_VideoDecoder_Initialize::ID, ¶ms, &msg)) return 0; sink().ClearMessages(); - SendReply(params, PP_OK, PpapiPluginMsg_VideoDecoder_InitializeReply()); + SendReply(params, PP_OK, + PpapiPluginMsg_VideoDecoder_InitializeReply(use_shared_images())); return decoder; } @@ -215,6 +224,15 @@ decode_count, texture_id, visible_rect)); } + void SendSharedImageReady(const ResourceMessageCallParams& params, + uint32_t decode_count, + const gpu::Mailbox& mailbox) { + PP_Rect visible_rect = PP_MakeRectFromXYWH(0, 0, 640, 480); + SendReply(params, PP_OK, + PpapiPluginMsg_VideoDecoder_SharedImageReady( + decode_count, mailbox, visible_rect.size, visible_rect)); + } + void SendFlushReply(const ResourceMessageCallParams& params) { SendReply(params, PP_OK, PpapiPluginMsg_VideoDecoder_FlushReply()); } @@ -257,6 +275,18 @@ texture_id); } + bool CheckRecycleSharedImageMsg(ResourceMessageCallParams* params, + gpu::Mailbox& mailbox) { + IPC::Message msg; + if (!sink().GetFirstResourceCallMatching( + PpapiHostMsg_VideoDecoder_RecycleSharedImage::ID, params, &msg)) { + return false; + } + sink().ClearMessages(); + return UnpackMessage<PpapiHostMsg_VideoDecoder_RecycleSharedImage>( + msg, &mailbox); + } + bool CheckFlushMsg(ResourceMessageCallParams* params) { return CheckMsg(params, PpapiHostMsg_VideoDecoder_Flush::ID); } @@ -286,6 +316,7 @@ return true; } + base::test::SingleThreadTaskEnvironment task_environment_; const PPB_VideoDecoder_1_1* decoder_iface_; char decode_buffer_[kDecodeBufferSize]; @@ -293,7 +324,9 @@ } // namespace -TEST_F(VideoDecoderResourceTest, Initialize) { +INSTANTIATE_TEST_SUITE_P(, VideoDecoderResourceTest, testing::Bool()); + +TEST_P(VideoDecoderResourceTest, Initialize) { // Initialize with 0 graphics3d_context should fail. { LockingResourceReleaser decoder(CreateDecoder()); @@ -355,13 +388,14 @@ ASSERT_TRUE(sink().GetFirstResourceCallMatching( PpapiHostMsg_VideoDecoder_Initialize::ID, ¶ms, &msg)); sink().ClearMessages(); - SendReply(params, PP_OK, PpapiPluginMsg_VideoDecoder_InitializeReply()); + SendReply(params, PP_OK, + PpapiPluginMsg_VideoDecoder_InitializeReply(use_shared_images())); ASSERT_TRUE(cb.called()); ASSERT_EQ(PP_OK, cb.result()); } } -TEST_F(VideoDecoderResourceTest, Uninitialized) { +TEST_P(VideoDecoderResourceTest, Uninitialized) { // Operations on uninitialized decoders should fail. LockingResourceReleaser decoder(CreateDecoder()); MockCompletionCallback uncalled_cb; @@ -383,7 +417,7 @@ // message for GetShm isn't received, causing Decode to fail. // http://crbug.com/379260 #if !BUILDFLAG(IS_WIN) || !defined(ARCH_CPU_64_BITS) -TEST_F(VideoDecoderResourceTest, DecodeAndGetPicture) { +TEST_P(VideoDecoderResourceTest, DecodeAndGetPicture) { LockingResourceReleaser decoder(CreateAndInitializeDecoder()); ResourceMessageCallParams params, params2; MockCompletionCallback decode_cb, get_picture_cb, uncalled_cb; @@ -430,11 +464,20 @@ ASSERT_EQ(PP_ERROR_INPROGRESS, CallGetPicture(decoder.get(), &picture, &uncalled_cb)); ASSERT_FALSE(uncalled_cb.called()); - // Send 'request textures' message to initialize textures. - SendRequestTextures(params); - // Send a picture ready message for Decode call 1. The GetPicture callback - // should complete. - SendPictureReady(params, 1U, kTextureId1); + + if (use_shared_images()) { + const auto mailbox1 = gpu::Mailbox::GenerateForSharedImage(); + // Send a shared image ready message for Decode call 1. The GetPicture + // callback should complete. + SendSharedImageReady(params, 1U, mailbox1); + } else { + // Send 'request textures' message to initialize textures. + SendRequestTextures(params); + // Send a picture ready message for Decode call 1. The GetPicture callback + // should complete. + SendPictureReady(params, 1U, kTextureId1); + } + ASSERT_TRUE(get_picture_cb.called()); ASSERT_EQ(PP_OK, get_picture_cb.result()); ASSERT_EQ(kDecodeId, picture.decode_id); @@ -442,7 +485,13 @@ // Send a picture ready message for Decode call 2. Since there is no pending // GetPicture call, the picture should be queued. - SendPictureReady(params, 2U, kTextureId2); + if (use_shared_images()) { + const auto mailbox2 = gpu::Mailbox::GenerateForSharedImage(); + SendSharedImageReady(params, 2U, mailbox2); + } else { + SendPictureReady(params, 2U, kTextureId2); + } + // The next GetPicture should return synchronously. ASSERT_EQ(PP_OK, CallGetPicture(decoder.get(), &picture, &uncalled_cb)); ASSERT_FALSE(uncalled_cb.called()); @@ -454,7 +503,7 @@ // message for GetShm isn't received, causing Decode to fail. // http://crbug.com/379260 #if !BUILDFLAG(IS_WIN) || !defined(ARCH_CPU_64_BITS) -TEST_F(VideoDecoderResourceTest, RecyclePicture) { +TEST_P(VideoDecoderResourceTest, RecyclePicture) { LockingResourceReleaser decoder(CreateAndInitializeDecoder()); ResourceMessageCallParams params; MockCompletionCallback decode_cb, get_picture_cb, uncalled_cb; @@ -467,29 +516,65 @@ int32_t decode_id; CheckDecodeMsg(¶ms, &shm_id, &decode_size, &decode_id); SendDecodeReply(params, 0U); - // Send 'request textures' message to initialize textures. - SendRequestTextures(params); + + if (!use_shared_images()) { + // Send 'request textures' message to initialize textures. + SendRequestTextures(params); + } // Call GetPicture and send 'picture ready' message to get a picture to // recycle. PP_VideoPicture picture; ASSERT_EQ(PP_OK_COMPLETIONPENDING, CallGetPicture(decoder.get(), &picture, &get_picture_cb)); - SendPictureReady(params, 0U, kTextureId1); - ASSERT_EQ(kTextureId1, picture.texture_id); - CallRecyclePicture(decoder.get(), picture); - uint32_t texture_id; - ASSERT_TRUE(CheckRecyclePictureMsg(¶ms, &texture_id)); - ASSERT_EQ(kTextureId1, texture_id); + if (use_shared_images()) { + const auto mailbox = gpu::Mailbox::GenerateForSharedImage(); + SendSharedImageReady(params, 0U, mailbox); + + CallRecyclePicture(decoder.get(), picture); + gpu::Mailbox recycle_mailbox; + ASSERT_TRUE(CheckRecycleSharedImageMsg(¶ms, recycle_mailbox)); + ASSERT_EQ(mailbox, recycle_mailbox); + } else { + SendPictureReady(params, 0U, kTextureId1); + ASSERT_EQ(kTextureId1, picture.texture_id); + + CallRecyclePicture(decoder.get(), picture); + uint32_t texture_id; + ASSERT_TRUE(CheckRecyclePictureMsg(¶ms, &texture_id)); + ASSERT_EQ(kTextureId1, texture_id); + } ClearCallbacks(decoder.get()); } #endif // !BUILDFLAG(IS_WIN) || !defined(ARCH_CPU_64_BITS) -TEST_F(VideoDecoderResourceTest, Flush) { +TEST_P(VideoDecoderResourceTest, Flush) { LockingResourceReleaser decoder(CreateAndInitializeDecoder()); ResourceMessageCallParams params, params2; - MockCompletionCallback flush_cb, get_picture_cb, uncalled_cb; + MockCompletionCallback flush_cb, get_picture_cb, uncalled_cb, decode_cb; + + // Get to a state where we have a picture to recycle. + PpapiHostMsg_VideoDecoder_GetShm shm_msg(0U, kDecodeBufferSize); + ASSERT_EQ(PP_OK, CallDecode(decoder.get(), &decode_cb, &shm_msg)); + uint32_t shm_id; + uint32_t decode_size; + int32_t decode_id; + CheckDecodeMsg(¶ms, &shm_id, &decode_size, &decode_id); + SendDecodeReply(params, 0U); + + gpu::Mailbox mailbox; + if (use_shared_images()) { + mailbox = gpu::Mailbox::GenerateForSharedImage(); + SendSharedImageReady(params, 0U, mailbox); + } else { + // Send 'request textures' message to initialize textures. + SendRequestTextures(params); + SendPictureReady(params, 0U, kTextureId1); + } + + PP_VideoPicture picture; + ASSERT_EQ(PP_OK, CallGetPicture(decoder.get(), &picture, &get_picture_cb)); ASSERT_EQ(PP_OK_COMPLETIONPENDING, CallFlush(decoder.get(), &flush_cb)); ASSERT_FALSE(flush_cb.called()); @@ -510,11 +595,16 @@ ASSERT_FALSE(uncalled_cb.called()); // Plugin can call RecyclePicture while Flush is pending. - PP_VideoPicture picture; - picture.texture_id = kTextureId1; CallRecyclePicture(decoder.get(), picture); - uint32_t texture_id; - ASSERT_TRUE(CheckRecyclePictureMsg(¶ms2, &texture_id)); + + if (use_shared_images()) { + gpu::Mailbox recycle_mailbox; + ASSERT_TRUE(CheckRecycleSharedImageMsg(¶ms2, recycle_mailbox)); + ASSERT_EQ(mailbox, recycle_mailbox); + } else { + uint32_t texture_id; + ASSERT_TRUE(CheckRecyclePictureMsg(¶ms2, &texture_id)); + } SendFlushReply(params); // Any pending GetPicture call is aborted. @@ -531,7 +621,7 @@ // message for GetShm isn't received, causing Decode to fail. // http://crbug.com/379260 #if !BUILDFLAG(IS_WIN) || !defined(ARCH_CPU_64_BITS) -TEST_F(VideoDecoderResourceTest, NotifyError) { +TEST_P(VideoDecoderResourceTest, NotifyError) { LockingResourceReleaser decoder(CreateAndInitializeDecoder()); ResourceMessageCallParams params; MockCompletionCallback decode_cb, get_picture_cb, uncalled_cb;
diff --git a/remoting/android/remoting_apk_tmpl.gni b/remoting/android/remoting_apk_tmpl.gni index 4e6311e..56f1584c 100644 --- a/remoting/android/remoting_apk_tmpl.gni +++ b/remoting/android/remoting_apk_tmpl.gni
@@ -12,7 +12,6 @@ if (!is_java_debug) { proguard_enabled = true - enable_multidex = false # -checkdiscard checks fail due to -dontoptimize. enable_proguard_checks = false
diff --git a/services/network/cors/cors_url_loader.cc b/services/network/cors/cors_url_loader.cc index f3a9b342..9ea8a48 100644 --- a/services/network/cors/cors_url_loader.cc +++ b/services/network/cors/cors_url_loader.cc
@@ -397,7 +397,8 @@ } bool CorsURLLoader::ShouldBlockRequestForAfpExperiment(GURL request_url) { - if (context_ && context_->network_service() && + if (context_ && context_->AfpBlockListExperimentEnabled() && + context_->network_service() && context_->network_service()->network_service_resource_block_list()) { return context_->network_service() ->network_service_resource_block_list()
diff --git a/services/network/cors/cors_url_loader_factory.cc b/services/network/cors/cors_url_loader_factory.cc index f1b76dc..11b0696 100644 --- a/services/network/cors/cors_url_loader_factory.cc +++ b/services/network/cors/cors_url_loader_factory.cc
@@ -317,7 +317,8 @@ bool CorsURLLoaderFactory::ShouldBlockRequestForAfpExperiment( const ResourceRequest& resource_request) { - if (resource_block_list_ && resource_block_list_->IsEnabled()) { + if (context_ && context_->AfpBlockListExperimentEnabled() && + resource_block_list_) { return resource_block_list_->Matches( resource_request.url, URLLoader::GetIsolationInfo(isolation_info_, false, resource_request));
diff --git a/services/network/cors/cors_url_loader_factory_unittest.cc b/services/network/cors/cors_url_loader_factory_unittest.cc index 7cc540b..9d51e47 100644 --- a/services/network/cors/cors_url_loader_factory_unittest.cc +++ b/services/network/cors/cors_url_loader_factory_unittest.cc
@@ -4,7 +4,6 @@ #include <memory> -#include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "components/privacy_sandbox/masked_domain_list/masked_domain_list.pb.h" #include "mojo/public/cpp/bindings/remote.h" @@ -22,7 +21,6 @@ #include "services/network/masked_domain_list/network_service_resource_block_list.h" #include "services/network/network_context.h" #include "services/network/network_service.h" -#include "services/network/public/cpp/features.h" #include "services/network/public/cpp/resource_request.h" #include "services/network/public/mojom/network_context.mojom-forward.h" #include "services/network/public/mojom/url_loader.mojom.h" @@ -60,13 +58,13 @@ protected: // testing::Test implementation. - void BaseSetup(mojom::URLLoaderFactoryParamsPtr factory_params) { + void BaseSetup(mojom::URLLoaderFactoryParamsPtr factory_params, + mojom::NetworkContextParamsPtr context_params) { test_server_.AddDefaultHandlers(); ASSERT_TRUE(test_server_.Start()); network_service_ = NetworkService::CreateForTesting(); - auto context_params = mojom::NetworkContextParams::New(); // Use a dummy CertVerifier that always passes cert verification, since // these unittests don't need to test CertVerifier behavior. context_params->cert_verifier_params = @@ -75,6 +73,7 @@ // configuration. context_params->initial_proxy_config = net::ProxyConfigWithAnnotation::CreateDirect(); + network_context_ = std::make_unique<NetworkContext>( network_service_.get(), network_context_remote_.BindNewPipeAndPassReceiver(), @@ -96,8 +95,8 @@ } void SetUp() override { - auto factory_params = network::mojom::URLLoaderFactoryParams::New(); - BaseSetup(std::move(factory_params)); + BaseSetup(network::mojom::URLLoaderFactoryParams::New(), + mojom::NetworkContextParams::New()); } void CreateLoaderAndStart(const ResourceRequest& request) { @@ -344,20 +343,17 @@ auto factory_params = network::mojom::URLLoaderFactoryParams::New(); factory_params->is_trusted = true; - BaseSetup(std::move(factory_params)); + auto context_params = mojom::NetworkContextParams::New(); + context_params->afp_block_list_experiment_enabled = true; + + BaseSetup(std::move(factory_params), std::move(context_params)); } }; TEST_F(TrustedCorsURLLoaderFactoryTest, RequestIsBlockedByBlockList) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {network::features::kEnableNetworkServiceResourceBlockList, - network::features::kMaskedDomainList}, - {}); - auto mdl = masked_domain_list::MaskedDomainList(); auto* resource = mdl.add_resource_owners()->add_owned_resources(); - resource->set_domain("blocked.com"); + resource->set_domain(test_server()->base_url().host()); resource->add_experiments(masked_domain_list::Resource_Experiment:: Resource_Experiment_EXPERIMENT_AFP); resource_block_list_.UseMaskedDomainList(mdl); @@ -366,7 +362,7 @@ url::Origin::Create(GURL("https://top.frame.com")); ResourceRequest request; - GURL url = GURL("http://blocked.com/resource.js"); + GURL url = test_server()->GetURL("/resource.js"); request.mode = mojom::RequestMode::kCors; request.credentials_mode = mojom::CredentialsMode::kOmit; request.method = net::HttpRequestHeaders::kGetMethod; @@ -388,17 +384,11 @@ TEST_F(TrustedCorsURLLoaderFactoryTest, RequestBypassesBlockListBecauseTopFrameIsFirstParty) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitWithFeatures( - {network::features::kEnableNetworkServiceResourceBlockList, - network::features::kMaskedDomainList}, - {}); - auto mdl = masked_domain_list::MaskedDomainList(); auto* owner = mdl.add_resource_owners(); owner->add_owned_properties("top.frame.com"); auto* resource = owner->add_owned_resources(); - resource->set_domain("blocked.com"); + resource->set_domain(test_server()->base_url().host()); resource->add_experiments(masked_domain_list::Resource_Experiment:: Resource_Experiment_EXPERIMENT_AFP); @@ -408,7 +398,7 @@ url::Origin::Create(GURL("https://top.frame.com")); ResourceRequest request; - GURL url = GURL("http://blocked.com/resource.js"); + GURL url = test_server()->GetURL("/resource.js"); request.mode = mojom::RequestMode::kCors; request.credentials_mode = mojom::CredentialsMode::kOmit; request.method = net::HttpRequestHeaders::kGetMethod; @@ -425,7 +415,51 @@ client->RunUntilComplete(); EXPECT_TRUE(client->has_received_completion()); - EXPECT_NE(net::ERR_BLOCKED_BY_CLIENT, client->completion_status().error_code); + EXPECT_EQ(net::OK, client->completion_status().error_code); +} + +class AfpDisabledCorsURLLoaderFactoryTest : public CorsURLLoaderFactoryTest { + void SetUp() override { + auto factory_params = network::mojom::URLLoaderFactoryParams::New(); + factory_params->is_trusted = true; + + auto context_params = mojom::NetworkContextParams::New(); + context_params->afp_block_list_experiment_enabled = false; + + BaseSetup(std::move(factory_params), std::move(context_params)); + } +}; + +TEST_F(AfpDisabledCorsURLLoaderFactoryTest, BlockListIsNotUsed) { + auto mdl = masked_domain_list::MaskedDomainList(); + auto* resource = mdl.add_resource_owners()->add_owned_resources(); + resource->set_domain(test_server()->base_url().host()); + resource->add_experiments(masked_domain_list::Resource_Experiment:: + Resource_Experiment_EXPERIMENT_AFP); + resource_block_list_.UseMaskedDomainList(mdl); + + url::Origin top_frame_origin = + url::Origin::Create(GURL("https://top.frame.com")); + + ResourceRequest request; + GURL url = test_server()->GetURL("/resource.js"); + request.mode = mojom::RequestMode::kCors; + request.credentials_mode = mojom::CredentialsMode::kOmit; + request.method = net::HttpRequestHeaders::kGetMethod; + request.url = url; + request.referrer = top_frame_origin.GetURL(); + request.request_initiator = url::Origin::Create(test_server()->base_url()); + request.trusted_params = network::ResourceRequest::TrustedParams(); + request.trusted_params->isolation_info = net::IsolationInfo::Create( + net::IsolationInfo::RequestType::kOther, top_frame_origin, + top_frame_origin, net::SiteForCookies::FromOrigin(top_frame_origin)); + CreateLoaderAndStart(request); + + auto* client = test_cors_loader_clients().back().get(); + client->RunUntilComplete(); + + EXPECT_TRUE(client->has_received_completion()); + EXPECT_EQ(net::OK, client->completion_status().error_code); } } // namespace network::cors
diff --git a/services/network/cors/cors_url_loader_test_util.cc b/services/network/cors/cors_url_loader_test_util.cc index d7b7bdb..b75a6da 100644 --- a/services/network/cors/cors_url_loader_test_util.cc +++ b/services/network/cors/cors_url_loader_test_util.cc
@@ -171,6 +171,10 @@ context_params->shared_dictionary_enabled = shared_dictionary_enabled; + // The AFP Block List experiment won't affect tests that don't also populate + // the block list, so this is safe to enable for all tests. + context_params->afp_block_list_experiment_enabled = true; + network_context_ = std::make_unique<NetworkContext>( network_service_.get(), network_context_remote_.BindNewPipeAndPassReceiver(),
diff --git a/services/network/masked_domain_list/network_service_resource_block_list.cc b/services/network/masked_domain_list/network_service_resource_block_list.cc index c20efb86..20d0fbf 100644 --- a/services/network/masked_domain_list/network_service_resource_block_list.cc +++ b/services/network/masked_domain_list/network_service_resource_block_list.cc
@@ -34,12 +34,6 @@ return base::trace_event::EstimateMemoryUsage(url_matcher_with_bypass_); } -bool NetworkServiceResourceBlockList::IsEnabled() { - return base::FeatureList::IsEnabled( - network::features::kEnableNetworkServiceResourceBlockList) && - base::FeatureList::IsEnabled(network::features::kMaskedDomainList); -} - bool NetworkServiceResourceBlockList::IsPopulated() { return url_matcher_with_bypass_.IsPopulated(); }
diff --git a/services/network/masked_domain_list/network_service_resource_block_list.h b/services/network/masked_domain_list/network_service_resource_block_list.h index 2f9ffd30..bbc9375 100644 --- a/services/network/masked_domain_list/network_service_resource_block_list.h +++ b/services/network/masked_domain_list/network_service_resource_block_list.h
@@ -28,10 +28,6 @@ // See base/trace_event/memory_usage_estimator.h for more info. size_t EstimateMemoryUsage() const; - // Returns true if the block list is eligible to be used but does not - // indicate that allow list is currently populated. - bool IsEnabled(); - // Returns true if there are entries in the block list and it is possible to // match on them. If false, `Matches` will always return false. bool IsPopulated();
diff --git a/services/network/masked_domain_list/network_service_resource_block_list_unittest.cc b/services/network/masked_domain_list/network_service_resource_block_list_unittest.cc index d2a33a1f9..4ec58ac73 100644 --- a/services/network/masked_domain_list/network_service_resource_block_list_unittest.cc +++ b/services/network/masked_domain_list/network_service_resource_block_list_unittest.cc
@@ -25,33 +25,7 @@ } // namespace -class NetworkServiceResourceBlockListTest : public ::testing::Test { - void SetUp() override { - scoped_feature_list_.InitWithFeatures( - {network::features::kEnableNetworkServiceResourceBlockList, - network::features::kMaskedDomainList}, - {}); - } - - private: - base::test::ScopedFeatureList scoped_feature_list_; -}; - -TEST_F(NetworkServiceResourceBlockListTest, NotEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndDisableFeature( - network::features::kEnableNetworkServiceResourceBlockList); - NetworkServiceResourceBlockList blockList; - EXPECT_FALSE(blockList.IsEnabled()); -} - -TEST_F(NetworkServiceResourceBlockListTest, IsEnabled) { - base::test::ScopedFeatureList scoped_feature_list; - scoped_feature_list.InitAndEnableFeature( - network::features::kEnableNetworkServiceResourceBlockList); - NetworkServiceResourceBlockList blockList; - EXPECT_TRUE(blockList.IsEnabled()); -} +class NetworkServiceResourceBlockListTest : public ::testing::Test {}; TEST_F(NetworkServiceResourceBlockListTest, Matches_IsNotPartOfExperiment) { MaskedDomainList mdl;
diff --git a/services/network/network_context.cc b/services/network/network_context.cc index a88d817..0a0fa877 100644 --- a/services/network/network_context.cc +++ b/services/network/network_context.cc
@@ -3075,6 +3075,10 @@ return !url_matcher_->MatchURL(scheme_host_port.GetURL()).empty(); } +bool NetworkContext::AfpBlockListExperimentEnabled() const { + return params_ && params_->afp_block_list_experiment_enabled; +} + void NetworkContext::CreateTrustedUrlLoaderFactoryForNetworkService( mojo::PendingReceiver<mojom::URLLoaderFactory> url_loader_factory_pending_receiver) {
diff --git a/services/network/network_context.h b/services/network/network_context.h index 3f51ecd9..ef4140d 100644 --- a/services/network/network_context.h +++ b/services/network/network_context.h
@@ -665,6 +665,11 @@ const std::vector<net::ReportingEndpoint>& endpoints) override; #endif // BUILDFLAG(ENABLE_REPORTING) + // TODO(crbug.com/1478868): This is an interim method only for AFP block list + // experiment. This method should not be used for other use cases. This will + // be removed when AFP block list logic is migrated to subresource filter. + bool AfpBlockListExperimentEnabled() const; + private: class NetworkContextHttpAuthPreferences : public net::HttpAuthPreferences { public:
diff --git a/services/network/public/cpp/features.cc b/services/network/public/cpp/features.cc index 40dd0d3..0e9af69 100644 --- a/services/network/public/cpp/features.cc +++ b/services/network/public/cpp/features.cc
@@ -123,14 +123,6 @@ "MdnsResponderGeneratedNameListing", base::FEATURE_DISABLED_BY_DEFAULT); -// When enabled, resource requests will be evaluated against the Network -// Service's block list. The block list is populated by the MaskedDomainList, so -// "MaskedDomainList" will need to also be enabled for the block list to have -// any contents. -BASE_FEATURE(kEnableNetworkServiceResourceBlockList, - "EnableNetworkServiceResourceBlockList", - base::FEATURE_DISABLED_BY_DEFAULT); - // Enables ORB blocked responses being treated as errors (according to the spec) // rather than the current, CORB-style handling of injecting an empty response. // This exempts fetches initiated by scripts. (Technically, fetches with an
diff --git a/services/network/public/cpp/features.h b/services/network/public/cpp/features.h index 6c6b6fb..2bb7d24 100644 --- a/services/network/public/cpp/features.h +++ b/services/network/public/cpp/features.h
@@ -37,8 +37,6 @@ kMaskedDomainListExperimentalVersion; COMPONENT_EXPORT(NETWORK_CPP) BASE_DECLARE_FEATURE(kMdnsResponderGeneratedNameListing); -COMPONENT_EXPORT(NETWORK_CPP) -BASE_DECLARE_FEATURE(kEnableNetworkServiceResourceBlockList); COMPONENT_EXPORT(NETWORK_CPP) BASE_DECLARE_FEATURE(kOpaqueResponseBlockingV02); COMPONENT_EXPORT(NETWORK_CPP) BASE_DECLARE_FEATURE(kOpaqueResponseBlockingErrorsForAllFetches);
diff --git a/services/network/public/mojom/network_context.mojom b/services/network/public/mojom/network_context.mojom index d790176..3d95f8c 100644 --- a/services/network/public/mojom/network_context.mojom +++ b/services/network/public/mojom/network_context.mojom
@@ -591,6 +591,14 @@ // side opt-in to testing without cookies. See: // https://developer.chrome.com/en/docs/privacy-sandbox/chrome-testing/#mode-a string? cookie_deprecation_label; + + // Whether the experimental AFP block list is enabled for this NetworkContext. + // Default is false and will only be true if a feature corresponding to the + // type of NetworkContext is enabled. + // TODO(crbug.com/1478868): This is an interim field only for AFP block list + // experiment. This field should not be used for other use cases. This will + // be removed when AFP block list logic is migrated to subresource filter. + bool afp_block_list_experiment_enabled = false; }; struct NetworkConditions {
diff --git a/skia/BUILD.gn b/skia/BUILD.gn index 0b415e3d..b5d93532 100644 --- a/skia/BUILD.gn +++ b/skia/BUILD.gn
@@ -77,6 +77,7 @@ "SK_DISABLE_LEGACY_GRDIRECTCONTEXT_FLUSH", "SK_DISABLE_LEGACY_GRDIRECTCONTEXT_BOOLS", "SK_DISABLE_LEGACY_GL_GRDIRECTCONTEXT_FACTORIES", + "SK_DISABLE_LEGACY_PNG_WRITEBUFFER", ] include_dirs = [
diff --git a/skia/config/SkUserConfig.h b/skia/config/SkUserConfig.h index 8dd2214..cc56fa81 100644 --- a/skia/config/SkUserConfig.h +++ b/skia/config/SkUserConfig.h
@@ -235,8 +235,6 @@ #define SK_ENABLE_SKSL_IN_RASTER_PIPELINE -#define SK_USE_SAFE_INSET_FOR_TEXTURE_SAMPLING - ///////////////////////// Imported from BUILD.gn and skia_common.gypi /* In some places Skia can use static initializers for global initialization,
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestApplication.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestApplication.java index 63c68d21..3f59f5ab 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestApplication.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestApplication.java
@@ -12,8 +12,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.library_loader.LibraryLoader; import org.chromium.base.library_loader.LibraryProcessType; -import org.chromium.base.multidex.ChromiumMultiDexInstaller; -import org.chromium.build.BuildConfig; /** * An {@link android.app.Application} for running native browser tests. @@ -25,11 +23,6 @@ initApplicationContext(); setLibraryProcessType(); - if (isMainProcess() || isBrowserProcess()) { - // We need secondary dex in order to run EmbeddedTestServer in a - // privileged process. - if (BuildConfig.IS_MULTIDEX_ENABLED) ChromiumMultiDexInstaller.install(this); - } if (isBrowserProcess()) { CommandLine.init(new String[] {}); ApplicationStatus.initialize(this);
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTestApplication.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTestApplication.java index d6cd2d55..4f3c123c 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTestApplication.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTestApplication.java
@@ -8,8 +8,6 @@ import android.content.Context; import org.chromium.base.CommandLine; -import org.chromium.base.multidex.ChromiumMultiDexInstaller; -import org.chromium.build.BuildConfig; /** * Application class to be used by native_test apks. @@ -19,9 +17,6 @@ protected void attachBaseContext(Context base) { super.attachBaseContext(base); assert getBaseContext() != null; - if (BuildConfig.IS_MULTIDEX_ENABLED) { - ChromiumMultiDexInstaller.install(this); - } CommandLine.init(new String[] {}); // This is required for Mockito to initialize mocks without running under Instrumentation.
diff --git a/testing/buildbot/chrome.gpu.fyi.json b/testing/buildbot/chrome.gpu.fyi.json index 08a0c17..d5667906 100644 --- a/testing/buildbot/chrome.gpu.fyi.json +++ b/testing/buildbot/chrome.gpu.fyi.json
@@ -19,8 +19,8 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating", - "name": "context_lost_validating_tests JACUZZI_RELEASE_LKGM", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", + "name": "context_lost_passthrough_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -47,8 +47,8 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating", - "name": "expected_color_pixel_validating_test JACUZZI_RELEASE_LKGM", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", + "name": "expected_color_pixel_passthrough_test JACUZZI_RELEASE_LKGM", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -148,8 +148,8 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --force_higher_performance_gpu --use-cmd-decoder=validating", - "name": "mediapipe_validating_tests JACUZZI_RELEASE_LKGM", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --force_higher_performance_gpu --use-cmd-decoder=passthrough --use-gl=angle", + "name": "mediapipe_passthrough_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -177,8 +177,8 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating", - "name": "pixel_skia_gold_validating_test JACUZZI_RELEASE_LKGM", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", + "name": "pixel_skia_gold_passthrough_test JACUZZI_RELEASE_LKGM", "precommit_args": [ "--gerrit-issue=${patch_issue}", "--gerrit-patchset=${patch_set}", @@ -206,8 +206,8 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating", - "name": "screenshot_sync_validating_tests JACUZZI_RELEASE_LKGM", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=passthrough --use-gl=angle", + "name": "screenshot_sync_passthrough_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, "has_native_resultdb_integration": true @@ -254,7 +254,7 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc", "name": "webcodecs_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, @@ -293,32 +293,6 @@ }, { "args": [ - "webgl2_conformance", - "--show-stdout", - "--browser=cros-chrome", - "--passthrough", - "-v", - "--stable-jobs", - "--webgl-conformance-version=2.0.1", - "--read-abbreviated-json-results-from=../../content/test/data/gpu/webgl2_conformance_linux_runtimes.json", - "--jobs=1" - ], - "autotest_name": "chromium_Graphics", - "cros_board": "jacuzzi", - "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "name": "webgl2_conformance_validating_tests JACUZZI_RELEASE_LKGM", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "test": "telemetry_gpu_integration_test", - "test_id_prefix": "ninja://chrome/test:telemetry_gpu_integration_test/", - "timeout_sec": 10800, - "variant_id": "JACUZZI_RELEASE_LKGM" - }, - { - "args": [ "webgl1_conformance", "--show-stdout", "--browser=cros-chrome", @@ -331,8 +305,8 @@ "autotest_name": "chromium_Graphics", "cros_board": "jacuzzi", "cros_img": "jacuzzi-release/R119-15629.0.0", - "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-cmd-decoder=validating --force_high_performance_gpu", - "name": "webgl_conformance_validating_tests JACUZZI_RELEASE_LKGM", + "extra_browser_args": "--log-level=0 --js-flags=--expose-gc --use-gl=angle --use-angle=gles --use-cmd-decoder=passthrough --force_high_performance_gpu", + "name": "webgl_conformance_gles_passthrough_tests JACUZZI_RELEASE_LKGM", "resultdb": { "enable": true, "has_native_resultdb_integration": true
diff --git a/testing/buildbot/chromium.android.fyi.json b/testing/buildbot/chromium.android.fyi.json index d337772..144044f 100644 --- a/testing/buildbot/chromium.android.fyi.json +++ b/testing/buildbot/chromium.android.fyi.json
@@ -8306,6 +8306,95 @@ } ] }, + "android-cronet-riscv64-dbg": { + "additional_compile_targets": [ + "cronet_package", + "cronet_perf_test_apk", + "cronet_sample_test_apk", + "cronet_smoketests_missing_native_library_instrumentation_apk", + "cronet_smoketests_platform_only_instrumentation_apk", + "cronet_test_instrumentation_apk", + "cronet_tests_android", + "cronet_unittests_android", + "net_unittests" + ], + "isolated_scripts": [ + { + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "cronet_sizes", + "resultdb": { + "enable": true, + "result_file": "${ISOLATED_OUTDIR}/sizes/test_results.json", + "result_format": "single" + }, + "swarming": { + "dimensions": { + "cpu": "x86-64", + "os": "Ubuntu-22.04" + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_sizes", + "test_id_prefix": "ninja://components/cronet/android:cronet_sizes/" + } + ] + }, + "android-cronet-riscv64-rel": { + "additional_compile_targets": [ + "cronet_package", + "cronet_perf_test_apk", + "cronet_sample_test_apk", + "cronet_smoketests_missing_native_library_instrumentation_apk", + "cronet_smoketests_platform_only_instrumentation_apk", + "cronet_test_instrumentation_apk", + "cronet_tests_android", + "cronet_unittests_android", + "net_unittests" + ], + "isolated_scripts": [ + { + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "cronet_sizes", + "resultdb": { + "enable": true, + "result_file": "${ISOLATED_OUTDIR}/sizes/test_results.json", + "result_format": "single" + }, + "swarming": { + "dimensions": { + "cpu": "x86-64", + "os": "Ubuntu-22.04" + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cronet_sizes", + "test_id_prefix": "ninja://components/cronet/android:cronet_sizes/" + }, + { + "merge": { + "script": "//tools/perf/process_perf_results.py" + }, + "name": "resource_sizes_cronet_sample_apk", + "resultdb": { + "enable": true, + "result_format": "single" + }, + "swarming": { + "dimensions": { + "cpu": "x86-64", + "os": "Ubuntu-22.04" + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "resource_sizes_cronet_sample_apk", + "test_id_prefix": "ninja://components/cronet/android:resource_sizes_cronet_sample_apk/" + } + ] + }, "android-webview-12-x64-dbg-tests": { "gtest_tests": [ {
diff --git a/testing/buildbot/chromium.chromiumos.json b/testing/buildbot/chromium.chromiumos.json index ed375b7..77cab27 100644 --- a/testing/buildbot/chromium.chromiumos.json +++ b/testing/buildbot/chromium.chromiumos.json
@@ -5176,9 +5176,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5188,8 +5188,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -5330,9 +5330,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5342,8 +5342,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -5467,9 +5467,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -5479,8 +5479,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": {
diff --git a/testing/buildbot/chromium.coverage.json b/testing/buildbot/chromium.coverage.json index 6b4782f..9b002f6 100644 --- a/testing/buildbot/chromium.coverage.json +++ b/testing/buildbot/chromium.coverage.json
@@ -25384,9 +25384,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25396,8 +25396,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -25532,9 +25532,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25544,8 +25544,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -25664,9 +25664,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -25676,8 +25676,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -28875,10 +28875,12 @@ "name": "sync_integration_tests", "swarming": { "dimensions": { - "os": "Windows-10-19045" + "os": "Windows-10-19045", + "pool": "chromium.tests.coverage", + "ssd": "1" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 + "shards": 4 }, "test": "sync_integration_tests", "test_id_prefix": "ninja://chrome/test:sync_integration_tests/"
diff --git a/testing/buildbot/chromium.fyi.json b/testing/buildbot/chromium.fyi.json index 0d8dbbd..f229a52 100644 --- a/testing/buildbot/chromium.fyi.json +++ b/testing/buildbot/chromium.fyi.json
@@ -43572,9 +43572,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -43583,8 +43583,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -43720,9 +43720,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -43731,8 +43731,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -43852,9 +43852,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -43863,8 +43863,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -45176,9 +45176,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -45187,8 +45187,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -45324,9 +45324,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -45335,8 +45335,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -45456,9 +45456,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -45467,8 +45467,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -46166,9 +46166,9 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome" + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" }, @@ -46177,8 +46177,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": {
diff --git a/testing/buildbot/chromium.memory.json b/testing/buildbot/chromium.memory.json index d27cce7..c1e8818 100644 --- a/testing/buildbot/chromium.memory.json +++ b/testing/buildbot/chromium.memory.json
@@ -16538,12 +16538,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.interactive_ui_tests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -16553,8 +16553,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -16706,12 +16706,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -16721,8 +16721,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": { @@ -16853,12 +16853,12 @@ { "args": [ "--test-launcher-filter-file=../../testing/buildbot/filters/linux-lacros.lacros_chrome_browsertests.skew.filter", - "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome", + "--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome", "--test-launcher-print-test-stdio=always", "--combine-ash-logs-on-bots", "--asan-symbolize-output" ], - "description": "Run with ash-chrome version 119.0.6043.0", + "description": "Run with ash-chrome version 119.0.6044.0", "isolate_profile_data": true, "merge": { "script": "//testing/merge_scripts/standard_gtest_merge.py" @@ -16868,8 +16868,8 @@ "cipd_packages": [ { "cipd_package": "chromium/testing/linux-ash-chromium/x86_64/ash.zip", - "location": "lacros_version_skew_tests_v119.0.6043.0", - "revision": "version:119.0.6043.0" + "location": "lacros_version_skew_tests_v119.0.6044.0", + "revision": "version:119.0.6044.0" } ], "dimensions": {
diff --git a/testing/buildbot/test_suite_exceptions.pyl b/testing/buildbot/test_suite_exceptions.pyl index 5440516..312748d9 100644 --- a/testing/buildbot/test_suite_exceptions.pyl +++ b/testing/buildbot/test_suite_exceptions.pyl
@@ -2616,6 +2616,17 @@ }, }, }, + 'expected_color_pixel_passthrough_test JACUZZI_RELEASE_LKGM': { + 'modifications': { + 'ChromeOS FYI Release Skylab (jacuzzi)': { + 'args': [ + # Skylab currently doesn't support use of LUCI_CONTEXT, so Gold cannot + # automatically get the service account to authenticate with. + '--service-account=/creds/service_accounts/skylab-drone.json', + ], + }, + }, + }, 'expected_color_pixel_validating_test': { 'modifications': { 'Android FYI Release (Pixel 4)': { @@ -2650,17 +2661,6 @@ }, }, }, - 'expected_color_pixel_validating_test JACUZZI_RELEASE_LKGM': { - 'modifications': { - 'ChromeOS FYI Release Skylab (jacuzzi)': { - 'args': [ - # Skylab currently doesn't support use of LUCI_CONTEXT, so Gold cannot - # automatically get the service account to authenticate with. - '--service-account=/creds/service_accounts/skylab-drone.json', - ], - }, - }, - }, 'extensions_browsertests': { 'remove_from': [ 'CrWinAsan(dll)', # https://crbug.com/935598 @@ -3904,6 +3904,17 @@ }, }, }, + 'pixel_skia_gold_passthrough_test JACUZZI_RELEASE_LKGM': { + 'modifications': { + 'ChromeOS FYI Release Skylab (jacuzzi)': { + 'args': [ + # Skylab currently doesn't support use of LUCI_CONTEXT, so Gold cannot + # automatically get the service account to authenticate with. + '--service-account=/creds/service_accounts/skylab-drone.json', + ], + }, + }, + }, 'pixel_skia_gold_validating_test': { 'modifications': { 'Android FYI Release (Pixel 4)': { @@ -3938,17 +3949,6 @@ }, }, }, - 'pixel_skia_gold_validating_test JACUZZI_RELEASE_LKGM': { - 'modifications': { - 'ChromeOS FYI Release Skylab (jacuzzi)': { - 'args': [ - # Skylab currently doesn't support use of LUCI_CONTEXT, so Gold cannot - # automatically get the service account to authenticate with. - '--service-account=/creds/service_accounts/skylab-drone.json', - ], - }, - }, - }, 'pixel_test':{ 'modifications': { 'Android Release (Nexus 5X)': { @@ -4243,6 +4243,15 @@ 'shards': 3, }, }, + 'win10-code-coverage': { + 'swarming': { + 'shards': 4, + 'dimensions': { + 'pool': 'chromium.tests.coverage', + 'ssd': '1', + }, + } + }, }, }, 'sync_integration_tests_no_field_trial': {
diff --git a/testing/buildbot/test_suites.pyl b/testing/buildbot/test_suites.pyl index 081ffe4..eb3e2e9 100644 --- a/testing/buildbot/test_suites.pyl +++ b/testing/buildbot/test_suites.pyl
@@ -6913,22 +6913,22 @@ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_mediapipe_validating_telemetry_tests': { + 'gpu_mediapipe_passthrough_telemetry_tests': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_validating_telemetry_tests': { + 'gpu_passthrough_telemetry_tests': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_webcodecs_validating_telemetry_test': { + 'gpu_webcodecs_telemetry_test': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_webgl_conformance_validating_telemetry_tests': { + 'gpu_webgl_conformance_gles_passthrough_telemetry_tests': { 'variants': [ 'CROS_JACUZZI_RELEASE_LKGM', ], @@ -6938,11 +6938,6 @@ 'CROS_JACUZZI_RELEASE_LKGM', ], }, - 'gpu_webgl2_conformance_validating_telemetry_tests': { - 'variants': [ - 'CROS_JACUZZI_RELEASE_LKGM', - ], - }, }, 'gpu_fyi_lacros_device_release_telemetry_tests': {
diff --git a/testing/buildbot/variants.pyl b/testing/buildbot/variants.pyl index a83d262..66b89cb 100644 --- a/testing/buildbot/variants.pyl +++ b/testing/buildbot/variants.pyl
@@ -70,16 +70,16 @@ }, 'LACROS_VERSION_SKEW_CANARY': { 'identifier': 'Lacros version skew testing ash canary', - 'description': 'Run with ash-chrome version 119.0.6043.0', + 'description': 'Run with ash-chrome version 119.0.6044.0', 'args': [ - '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6043.0/test_ash_chrome', + '--ash-chrome-path-override=../../lacros_version_skew_tests_v119.0.6044.0/test_ash_chrome', ], 'swarming': { 'cipd_packages': [ { 'cipd_package': 'chromium/testing/linux-ash-chromium/x86_64/ash.zip', - 'location': 'lacros_version_skew_tests_v119.0.6043.0', - 'revision': 'version:119.0.6043.0', + 'location': 'lacros_version_skew_tests_v119.0.6044.0', + 'revision': 'version:119.0.6044.0', }, ], },
diff --git a/testing/buildbot/waterfalls.pyl b/testing/buildbot/waterfalls.pyl index 05957ae..f9e9735 100644 --- a/testing/buildbot/waterfalls.pyl +++ b/testing/buildbot/waterfalls.pyl
@@ -1296,6 +1296,38 @@ }, 'os_type': 'android', }, + 'android-cronet-riscv64-dbg': { + 'additional_compile_targets': [ + 'cronet_package', + 'cronet_perf_test_apk', + 'cronet_sample_test_apk', + 'cronet_smoketests_missing_native_library_instrumentation_apk', + 'cronet_smoketests_platform_only_instrumentation_apk', + 'cronet_test_instrumentation_apk', + 'cronet_tests_android', + 'cronet_unittests_android', + 'net_unittests', + ], + 'test_suites': { + 'isolated_scripts': 'cronet_dbg_isolated_scripts', + }, + }, + 'android-cronet-riscv64-rel': { + 'additional_compile_targets': [ + 'cronet_package', + 'cronet_perf_test_apk', + 'cronet_sample_test_apk', + 'cronet_smoketests_missing_native_library_instrumentation_apk', + 'cronet_smoketests_platform_only_instrumentation_apk', + 'cronet_test_instrumentation_apk', + 'cronet_tests_android', + 'cronet_unittests_android', + 'net_unittests', + ], + 'test_suites': { + 'isolated_scripts': 'cronet_rel_isolated_scripts', + }, + }, 'android-webview-12-x64-dbg-tests': { 'mixins': [ '12-x64-emulator',
diff --git a/testing/test.gni b/testing/test.gni index 239c67df..94f8934 100644 --- a/testing/test.gni +++ b/testing/test.gni
@@ -314,7 +314,6 @@ "android_manifest_dep", "android_manifest_template", "app_as_shared_lib", - "enable_multidex", "product_config_java_packages", "loadable_modules", "loadable_module_deps",
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index eb4bd3c4..f099092 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -190,6 +190,21 @@ ] } ], + "AndroidAppIntegrationSafeSearch": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "AndroidAppIntegrationSafeSearch" + ] + } + ] + } + ], "AndroidAutofillFormSubmissionCheckById": [ { "platforms": [ @@ -2691,6 +2706,28 @@ ] } ], + "CPSS-V2": [ + { + "platforms": [ + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled_20230926", + "params": { + "holdback_chance": "0.3" + }, + "enable_features": [ + "PermissionDedicatedCpssSettings", + "PermissionPredictionsV2" + ] + } + ] + } + ], "CSSCustomPropertiesAblation": [ { "platforms": [ @@ -5885,6 +5922,21 @@ ] } ], + "EarlyInitializeStartupMetrics": [ + { + "platforms": [ + "android" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "EarlyInitializeStartupMetrics" + ] + } + ] + } + ], "En840AndFstDecoderParamsUpdate": [ { "platforms": [ @@ -8143,21 +8195,6 @@ ] } ], - "IOSBringYourOwnTabs": [ - { - "platforms": [ - "ios" - ], - "experiments": [ - { - "name": "Enabled", - "enable_features": [ - "BringYourOwnTabsIOS" - ] - } - ] - } - ], "IOSBrowserEditMenuMetrics": [ { "platforms": [ @@ -8542,13 +8579,14 @@ ], "experiments": [ { - "name": "Enabled_Magic_Stack_Less_Top_Space_20230912", + "name": "Enabled_Magic_Stack_Less_Top_Space_20230928", "params": { "ReducedNTPTopSpace": "20", "enable_default_model": "true" }, "enable_features": [ "MagicStack", + "SafetyCheckMagicStack", "SegmentationPlatformIosModuleRanker", "SegmentationPlatformUserVisibleTaskRunner", "TabResumption" @@ -10372,6 +10410,22 @@ ] } ], + "NearbySharingSelfShare": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NearbySharingSelfShare" + ] + } + ] + } + ], "NetAdapterMaxBufSize": [ { "platforms": [ @@ -14429,6 +14483,26 @@ ] } ], + "SafeBrowsingTailoredSecurityRetryForSyncUsers": [ + { + "platforms": [ + "android", + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "TailoredSecurityRetryForSyncUsers" + ] + } + ] + } + ], "SafetyCheckNotificationPermissions": [ { "platforms": [ @@ -16369,6 +16443,25 @@ ] } ], + "SynchronizedScrolling": [ + { + "platforms": [ + "chromeos", + "chromeos_lacros", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Disabled", + "disable_features": [ + "SynchronizedScrolling" + ] + } + ] + } + ], "SynthesizePageLoadOnlyOnInitialMainDocumentAccess": [ { "platforms": [ @@ -19535,24 +19628,6 @@ ] } ], - "Win10UnattendedDefault": [ - { - "platforms": [ - "windows" - ], - "experiments": [ - { - "name": "Default" - }, - { - "name": "Enabled", - "enable_features": [ - "Win10UnattendedDefault" - ] - } - ] - } - ], "WinSboxWarmupProcessPrng": [ { "platforms": [
diff --git a/third_party/.gitignore b/third_party/.gitignore index 3f2f87ce..2d9aed0c 100644 --- a/third_party/.gitignore +++ b/third_party/.gitignore
@@ -106,7 +106,6 @@ /cronet_android_mainline_clang/linux-amd64 /mesa/src /mingw-w64 -/minizip/src /mkl /mocha /mockito/src
diff --git a/third_party/android_deps/BUILD.gn b/third_party/android_deps/BUILD.gn index d92df05..279c0723 100644 --- a/third_party/android_deps/BUILD.gn +++ b/third_party/android_deps/BUILD.gn
@@ -676,116 +676,6 @@ if (!limit_android_deps) { # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - java_prebuilt("android_arch_lifecycle_common_java") { - jar_path = "libs/android_arch_lifecycle_common/common-1.1.1.jar" - output_name = "android_arch_lifecycle_common" - supports_android = true - enable_bytecode_checks = false - deps = [ ":com_android_support_support_annotations_java" ] - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - java_prebuilt("android_arch_lifecycle_common_java8_java") { - jar_path = "libs/android_arch_lifecycle_common_java8/common-java8-1.1.1.jar" - output_name = "android_arch_lifecycle_common_java8" - supports_android = true - enable_bytecode_checks = false - deps = [ - ":android_arch_lifecycle_common_java", - ":com_android_support_support_annotations_java", - ] - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("android_arch_lifecycle_runtime_java") { - aar_path = "libs/android_arch_lifecycle_runtime/runtime-1.1.1.aar" - info_path = "libs/android_arch_lifecycle_runtime/android_arch_lifecycle_runtime.info" - enable_bytecode_checks = false - deps = [ - ":android_arch_core_common_java", - ":android_arch_lifecycle_common_java", - ":com_android_support_support_annotations_java", - ] - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("android_arch_lifecycle_viewmodel_java") { - aar_path = "libs/android_arch_lifecycle_viewmodel/viewmodel-1.1.1.aar" - info_path = "libs/android_arch_lifecycle_viewmodel/android_arch_lifecycle_viewmodel.info" - enable_bytecode_checks = false - deps = [ ":com_android_support_support_annotations_java" ] - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_asynclayoutinflater_java") { - aar_path = "libs/com_android_support_asynclayoutinflater/asynclayoutinflater-28.0.0.aar" - info_path = "libs/com_android_support_asynclayoutinflater/com_android_support_asynclayoutinflater.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - java_prebuilt("com_android_support_collections_java") { - jar_path = "libs/com_android_support_collections/collections-28.0.0.jar" - output_name = "com_android_support_collections" - supports_android = true - enable_bytecode_checks = false - deps = [ ":com_android_support_support_annotations_java" ] - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_coordinatorlayout_java") { - aar_path = "libs/com_android_support_coordinatorlayout/coordinatorlayout-28.0.0.aar" - info_path = "libs/com_android_support_coordinatorlayout/com_android_support_coordinatorlayout.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_customview_java", - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ] - resource_overlay = true - - # Reduce binary size. https:crbug.com/954584 - ignore_proguard_configs = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_customview_java") { - aar_path = "libs/com_android_support_customview/customview-28.0.0.aar" - info_path = "libs/com_android_support_customview/com_android_support_customview.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_design_java") { - aar_path = "libs/com_android_support_design/design-28.0.0.aar" - info_path = - "libs/com_android_support_design/com_android_support_design.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_appcompat_v7_java", - ":com_android_support_cardview_v7_java", - ":com_android_support_recyclerview_v7_java", - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ":com_android_support_support_core_ui_java", - ":com_android_support_support_core_utils_java", - ":com_android_support_support_fragment_java", - ":com_android_support_transition_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("com_android_support_drawerlayout_java") { aar_path = "libs/com_android_support_drawerlayout/drawerlayout-28.0.0.aar" info_path = "libs/com_android_support_drawerlayout/com_android_support_drawerlayout.info" @@ -799,33 +689,6 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_interpolator_java") { - aar_path = "libs/com_android_support_interpolator/interpolator-28.0.0.aar" - info_path = "libs/com_android_support_interpolator/com_android_support_interpolator.info" - enable_bytecode_checks = false - deps = [ ":com_android_support_support_annotations_java" ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_localbroadcastmanager_java") { - aar_path = "libs/com_android_support_localbroadcastmanager/localbroadcastmanager-28.0.0.aar" - info_path = "libs/com_android_support_localbroadcastmanager/com_android_support_localbroadcastmanager.info" - enable_bytecode_checks = false - deps = [ ":com_android_support_support_annotations_java" ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_multidex_java") { - aar_path = "libs/com_android_support_multidex/multidex-1.0.0.aar" - info_path = - "libs/com_android_support_multidex/com_android_support_multidex.info" - enable_bytecode_checks = false - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("com_android_support_support_annotations_java") { jar_path = "libs/com_android_support_support_annotations/support-annotations-28.0.0.jar" output_name = "com_android_support_support_annotations" @@ -884,81 +747,6 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_support_core_utils_java") { - aar_path = "libs/com_android_support_support_core_utils/support-core-utils-28.0.0.aar" - info_path = "libs/com_android_support_support_core_utils/com_android_support_support_core_utils.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_documentfile_java", - ":com_android_support_loader_java", - ":com_android_support_localbroadcastmanager_java", - ":com_android_support_print_java", - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_support_fragment_java") { - aar_path = - "libs/com_android_support_support_fragment/support-fragment-28.0.0.aar" - info_path = "libs/com_android_support_support_fragment/com_android_support_support_fragment.info" - enable_bytecode_checks = false - deps = [ - ":android_arch_lifecycle_viewmodel_java", - ":com_android_support_loader_java", - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ":com_android_support_support_core_ui_java", - ":com_android_support_support_core_utils_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_support_v4_java") { - aar_path = "libs/com_android_support_support_v4/support-v4-28.0.0.aar" - info_path = "libs/com_android_support_support_v4/com_android_support_support_v4.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_support_compat_java", - ":com_android_support_support_core_ui_java", - ":com_android_support_support_core_utils_java", - ":com_android_support_support_fragment_java", - ":com_android_support_support_media_compat_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_swiperefreshlayout_java") { - aar_path = "libs/com_android_support_swiperefreshlayout/swiperefreshlayout-28.0.0.aar" - info_path = "libs/com_android_support_swiperefreshlayout/com_android_support_swiperefreshlayout.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_interpolator_java", - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_viewpager_java") { - aar_path = "libs/com_android_support_viewpager/viewpager-28.0.0.aar" - info_path = - "libs/com_android_support_viewpager/com_android_support_viewpager.info" - enable_bytecode_checks = false - deps = [ - ":com_android_support_customview_java", - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt( "com_google_android_apps_common_testing_accessibility_framework_accessibility_test_framework_java") { aar_path = "libs/com_google_android_apps_common_testing_accessibility_framework_accessibility_test_framework/accessibility-test-framework-4.0.0.aar" @@ -1683,6 +1471,22 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + java_prebuilt("android_arch_lifecycle_common_java") { + jar_path = "libs/android_arch_lifecycle_common/common-1.1.1.jar" + output_name = "android_arch_lifecycle_common" + supports_android = true + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ ":com_android_support_support_annotations_java" ] + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("android_arch_lifecycle_livedata_java") { aar_path = "libs/android_arch_lifecycle_livedata/livedata-1.1.1.aar" info_path = "libs/android_arch_lifecycle_livedata/android_arch_lifecycle_livedata.info" @@ -1722,9 +1526,9 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_animated_vector_drawable_java") { - aar_path = "libs/com_android_support_animated_vector_drawable/animated-vector-drawable-28.0.0.aar" - info_path = "libs/com_android_support_animated_vector_drawable/com_android_support_animated_vector_drawable.info" + android_aar_prebuilt("android_arch_lifecycle_runtime_java") { + aar_path = "libs/android_arch_lifecycle_runtime/runtime-1.1.1.aar" + info_path = "libs/android_arch_lifecycle_runtime/android_arch_lifecycle_runtime.info" enable_bytecode_checks = false # To remove visibility constraint, add this dependency to @@ -1734,41 +1538,16 @@ "//third_party/androidx:*", ] deps = [ - ":com_android_support_support_core_ui_java", - ":com_android_support_support_vector_drawable_java", - ] - resource_overlay = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_appcompat_v7_java") { - aar_path = "libs/com_android_support_appcompat_v7/appcompat-v7-28.0.0.aar" - info_path = "libs/com_android_support_appcompat_v7/com_android_support_appcompat_v7.info" - enable_bytecode_checks = false - - # To remove visibility constraint, add this dependency to - # //third_party/android_deps/build.gradle. - visibility = [ - ":*", - "//third_party/androidx:*", - ] - deps = [ - ":com_android_support_animated_vector_drawable_java", - ":com_android_support_collections_java", - ":com_android_support_cursoradapter_java", + ":android_arch_core_common_java", + ":android_arch_lifecycle_common_java", ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ":com_android_support_support_core_utils_java", - ":com_android_support_support_fragment_java", - ":com_android_support_support_vector_drawable_java", ] - resource_overlay = true } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_cardview_v7_java") { - aar_path = "libs/com_android_support_cardview_v7/cardview-v7-28.0.0.aar" - info_path = "libs/com_android_support_cardview_v7/com_android_support_cardview_v7.info" + android_aar_prebuilt("android_arch_lifecycle_viewmodel_java") { + aar_path = "libs/android_arch_lifecycle_viewmodel/viewmodel-1.1.1.aar" + info_path = "libs/android_arch_lifecycle_viewmodel/android_arch_lifecycle_viewmodel.info" enable_bytecode_checks = false # To remove visibility constraint, add this dependency to @@ -1778,10 +1557,67 @@ "//third_party/androidx:*", ] deps = [ ":com_android_support_support_annotations_java" ] + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + android_aar_prebuilt("com_android_support_asynclayoutinflater_java") { + aar_path = "libs/com_android_support_asynclayoutinflater/asynclayoutinflater-28.0.0.aar" + info_path = "libs/com_android_support_asynclayoutinflater/com_android_support_asynclayoutinflater.info" + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ + ":com_android_support_support_annotations_java", + ":com_android_support_support_compat_java", + ] resource_overlay = true } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + java_prebuilt("com_android_support_collections_java") { + jar_path = "libs/com_android_support_collections/collections-28.0.0.jar" + output_name = "com_android_support_collections" + supports_android = true + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ ":com_android_support_support_annotations_java" ] + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + android_aar_prebuilt("com_android_support_coordinatorlayout_java") { + aar_path = "libs/com_android_support_coordinatorlayout/coordinatorlayout-28.0.0.aar" + info_path = "libs/com_android_support_coordinatorlayout/com_android_support_coordinatorlayout.info" + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ + ":com_android_support_customview_java", + ":com_android_support_support_annotations_java", + ":com_android_support_support_compat_java", + ] + resource_overlay = true + + # Reduce binary size. https:crbug.com/954584 + ignore_proguard_configs = true + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("com_android_support_cursoradapter_java") { aar_path = "libs/com_android_support_cursoradapter/cursoradapter-28.0.0.aar" info_path = "libs/com_android_support_cursoradapter/com_android_support_cursoradapter.info" @@ -1798,6 +1634,25 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + android_aar_prebuilt("com_android_support_customview_java") { + aar_path = "libs/com_android_support_customview/customview-28.0.0.aar" + info_path = "libs/com_android_support_customview/com_android_support_customview.info" + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ + ":com_android_support_support_annotations_java", + ":com_android_support_support_compat_java", + ] + resource_overlay = true + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("com_android_support_documentfile_java") { aar_path = "libs/com_android_support_documentfile/documentfile-28.0.0.aar" info_path = "libs/com_android_support_documentfile/com_android_support_documentfile.info" @@ -1814,6 +1669,22 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + android_aar_prebuilt("com_android_support_interpolator_java") { + aar_path = "libs/com_android_support_interpolator/interpolator-28.0.0.aar" + info_path = "libs/com_android_support_interpolator/com_android_support_interpolator.info" + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ ":com_android_support_support_annotations_java" ] + resource_overlay = true + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. android_aar_prebuilt("com_android_support_loader_java") { aar_path = "libs/com_android_support_loader/loader-28.0.0.aar" info_path = @@ -1836,9 +1707,9 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_print_java") { - aar_path = "libs/com_android_support_print/print-28.0.0.aar" - info_path = "libs/com_android_support_print/com_android_support_print.info" + android_aar_prebuilt("com_android_support_localbroadcastmanager_java") { + aar_path = "libs/com_android_support_localbroadcastmanager/localbroadcastmanager-28.0.0.aar" + info_path = "libs/com_android_support_localbroadcastmanager/com_android_support_localbroadcastmanager.info" enable_bytecode_checks = false # To remove visibility constraint, add this dependency to @@ -1852,10 +1723,9 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_recyclerview_v7_java") { - aar_path = - "libs/com_android_support_recyclerview_v7/recyclerview-v7-28.0.0.aar" - info_path = "libs/com_android_support_recyclerview_v7/com_android_support_recyclerview_v7.info" + android_aar_prebuilt("com_android_support_print_java") { + aar_path = "libs/com_android_support_print/print-28.0.0.aar" + info_path = "libs/com_android_support_print/com_android_support_print.info" enable_bytecode_checks = false # To remove visibility constraint, add this dependency to @@ -1864,11 +1734,7 @@ ":*", "//third_party/androidx:*", ] - deps = [ - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ":com_android_support_support_core_ui_java", - ] + deps = [ ":com_android_support_support_annotations_java" ] resource_overlay = true } @@ -1893,9 +1759,9 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_support_media_compat_java") { - aar_path = "libs/com_android_support_support_media_compat/support-media-compat-28.0.0.aar" - info_path = "libs/com_android_support_support_media_compat/com_android_support_support_media_compat.info" + android_aar_prebuilt("com_android_support_support_core_utils_java") { + aar_path = "libs/com_android_support_support_core_utils/support-core-utils-28.0.0.aar" + info_path = "libs/com_android_support_support_core_utils/com_android_support_support_core_utils.info" enable_bytecode_checks = false # To remove visibility constraint, add this dependency to @@ -1905,29 +1771,10 @@ "//third_party/androidx:*", ] deps = [ - ":com_android_support_support_annotations_java", - ":com_android_support_support_compat_java", - ":com_android_support_versionedparcelable_java", - ] - resource_overlay = true - - # Target has AIDL, but we do not support it yet: http://crbug.com/644439 - ignore_aidl = true - } - - # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_support_vector_drawable_java") { - aar_path = "libs/com_android_support_support_vector_drawable/support-vector-drawable-28.0.0.aar" - info_path = "libs/com_android_support_support_vector_drawable/com_android_support_support_vector_drawable.info" - enable_bytecode_checks = false - - # To remove visibility constraint, add this dependency to - # //third_party/android_deps/build.gradle. - visibility = [ - ":*", - "//third_party/androidx:*", - ] - deps = [ + ":com_android_support_documentfile_java", + ":com_android_support_loader_java", + ":com_android_support_localbroadcastmanager_java", + ":com_android_support_print_java", ":com_android_support_support_annotations_java", ":com_android_support_support_compat_java", ] @@ -1935,9 +1782,9 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - android_aar_prebuilt("com_android_support_transition_java") { - aar_path = "libs/com_android_support_transition/transition-28.0.0.aar" - info_path = "libs/com_android_support_transition/com_android_support_transition.info" + android_aar_prebuilt("com_android_support_swiperefreshlayout_java") { + aar_path = "libs/com_android_support_swiperefreshlayout/swiperefreshlayout-28.0.0.aar" + info_path = "libs/com_android_support_swiperefreshlayout/com_android_support_swiperefreshlayout.info" enable_bytecode_checks = false # To remove visibility constraint, add this dependency to @@ -1947,11 +1794,11 @@ "//third_party/androidx:*", ] deps = [ + ":com_android_support_interpolator_java", ":com_android_support_support_annotations_java", ":com_android_support_support_compat_java", ] resource_overlay = true - deps += [ ":com_android_support_support_fragment_java" ] } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. @@ -1981,6 +1828,27 @@ } # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. + android_aar_prebuilt("com_android_support_viewpager_java") { + aar_path = "libs/com_android_support_viewpager/viewpager-28.0.0.aar" + info_path = + "libs/com_android_support_viewpager/com_android_support_viewpager.info" + enable_bytecode_checks = false + + # To remove visibility constraint, add this dependency to + # //third_party/android_deps/build.gradle. + visibility = [ + ":*", + "//third_party/androidx:*", + ] + deps = [ + ":com_android_support_customview_java", + ":com_android_support_support_annotations_java", + ":com_android_support_support_compat_java", + ] + resource_overlay = true + } + + # This is generated, do not edit. Update BuildConfigGenerator.groovy instead. java_prebuilt("com_google_android_annotations_java") { jar_path = "libs/com_google_android_annotations/annotations-4.1.1.4.jar" output_name = "com_google_android_annotations"
diff --git a/third_party/android_deps/additional_readme_paths.json b/third_party/android_deps/additional_readme_paths.json index e27daee..331ed58 100644 --- a/third_party/android_deps/additional_readme_paths.json +++ b/third_party/android_deps/additional_readme_paths.json
@@ -2,39 +2,27 @@ "libs/android_arch_core_common", "libs/android_arch_core_runtime", "libs/android_arch_lifecycle_common", - "libs/android_arch_lifecycle_common_java8", "libs/android_arch_lifecycle_livedata", "libs/android_arch_lifecycle_livedata_core", "libs/android_arch_lifecycle_runtime", "libs/android_arch_lifecycle_viewmodel", - "libs/com_android_support_animated_vector_drawable", - "libs/com_android_support_appcompat_v7", "libs/com_android_support_asynclayoutinflater", - "libs/com_android_support_cardview_v7", "libs/com_android_support_collections", "libs/com_android_support_coordinatorlayout", "libs/com_android_support_cursoradapter", "libs/com_android_support_customview", - "libs/com_android_support_design", "libs/com_android_support_documentfile", "libs/com_android_support_drawerlayout", "libs/com_android_support_interpolator", "libs/com_android_support_loader", "libs/com_android_support_localbroadcastmanager", - "libs/com_android_support_multidex", "libs/com_android_support_print", - "libs/com_android_support_recyclerview_v7", "libs/com_android_support_slidingpanelayout", "libs/com_android_support_support_annotations", "libs/com_android_support_support_compat", "libs/com_android_support_support_core_ui", "libs/com_android_support_support_core_utils", - "libs/com_android_support_support_fragment", - "libs/com_android_support_support_media_compat", - "libs/com_android_support_support_v4", - "libs/com_android_support_support_vector_drawable", "libs/com_android_support_swiperefreshlayout", - "libs/com_android_support_transition", "libs/com_android_support_versionedparcelable", "libs/com_android_support_viewpager", "libs/com_android_tools_common",
diff --git a/third_party/android_deps/build.gradle b/third_party/android_deps/build.gradle index 25dd34c..eb2484b 100644 --- a/third_party/android_deps/build.gradle +++ b/third_party/android_deps/build.gradle
@@ -44,13 +44,6 @@ compile 'com.google.android.play:feature-delivery:2.0.1' - // Architecture components - String archComponentsVersion = '1.1.1' - compile "android.arch.lifecycle:runtime:${archComponentsVersion}" - compile "android.arch.lifecycle:common:${archComponentsVersion}" - compile "android.arch.lifecycle:common-java8:${archComponentsVersion}" - compile "android.arch.lifecycle:viewmodel:${archComponentsVersion}" - // Play services libraries // See https://developers.google.com/android/guides/releases for updates // Starting from 15.0.0 these libraries are allowed to update independently @@ -78,26 +71,10 @@ // TODO (bjoyce): Remove after androidx migration crbug.com/896775 // Support v4 libraries String supportLibVersion = '28.0.0' - compile "com.android.support:support-v4:${supportLibVersion}" + compile "com.android.support:drawerlayout:${supportLibVersion}" + compile "com.android.support:support-annotations:${supportLibVersion}" compile "com.android.support:support-compat:${supportLibVersion}" compile "com.android.support:support-core-ui:${supportLibVersion}" - compile "com.android.support:support-core-utils:${supportLibVersion}" - compile "com.android.support:support-fragment:${supportLibVersion}" - - compile "com.android.support:support-annotations:${supportLibVersion}" - compile "com.android.support:design:${supportLibVersion}" - - compile "com.android.support:asynclayoutinflater:${supportLibVersion}" - compile "com.android.support:collections:${supportLibVersion}" - compile "com.android.support:coordinatorlayout:${supportLibVersion}" - compile "com.android.support:customview:${supportLibVersion}" - compile "com.android.support:drawerlayout:${supportLibVersion}" - compile "com.android.support:interpolator:${supportLibVersion}" - compile 'com.android.support:localbroadcastmanager:1.1.0-SNAPSHOT' - compile "com.android.support:swiperefreshlayout:${supportLibVersion}" - compile "com.android.support:viewpager:${supportLibVersion}" - - compile 'com.android.support:multidex:1.0.0' compile 'com.google.code.findbugs:jsr305:3.0.2' compile 'com.google.firebase:firebase-iid:21.0.1'
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/3pp.pb b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py deleted file mode 100755 index 982456c..0000000 --- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'android/arch/lifecycle' -_MODULE_NAME = 'common-java8' -_FILE_EXT = 'jar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/LICENSE b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/OWNERS b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/README.chromium b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/README.chromium deleted file mode 100644 index 02e32c499..0000000 --- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Lifecycle-Common for Java 8 Language -Short Name: common-java8 -URL: https://developer.android.com/topic/libraries/architecture/index.html -Version: 1.1.1 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Android Lifecycle-Common for Java 8 Language - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/cipd.yaml b/third_party/android_deps/libs/android_arch_lifecycle_common_java8/cipd.yaml deleted file mode 100644 index 61116e5c..0000000 --- a/third_party/android_deps/libs/android_arch_lifecycle_common_java8/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@1.1.1.cr1 -package: chromium/third_party/android_deps/libs/android_arch_lifecycle_common_java8 -description: "Android Lifecycle-Common for Java 8 Language" -data: -- file: common-java8-1.1.1.jar
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py deleted file mode 100755 index 4994165..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'animated-vector-drawable' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/LICENSE b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/OWNERS b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/README.chromium b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/README.chromium deleted file mode 100644 index d7c84a3..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support AnimatedVectorDrawable -Short Name: animated-vector-drawable -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Android Support AnimatedVectorDrawable - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/cipd.yaml b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/cipd.yaml deleted file mode 100644 index be4148e..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_animated_vector_drawable -description: "Android Support AnimatedVectorDrawable" -data: -- file: animated-vector-drawable-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/com_android_support_animated_vector_drawable.info b/third_party/android_deps/libs/com_android_support_animated_vector_drawable/com_android_support_animated_vector_drawable.info deleted file mode 100644 index f42f349a..0000000 --- a/third_party/android_deps/libs/com_android_support_animated_vector_drawable/com_android_support_animated_vector_drawable.info +++ /dev/null
@@ -1,14 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = true -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.graphics.drawable" -resources = [] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py deleted file mode 100755 index b70afd7..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'appcompat-v7' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/LICENSE b/third_party/android_deps/libs/com_android_support_appcompat_v7/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/OWNERS b/third_party/android_deps/libs/com_android_support_appcompat_v7/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/README.chromium b/third_party/android_deps/libs/com_android_support_appcompat_v7/README.chromium deleted file mode 100644 index 7f403be..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android AppCompat Library v7 -Short Name: appcompat-v7 -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later. - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/cipd.yaml b/third_party/android_deps/libs/com_android_support_appcompat_v7/cipd.yaml deleted file mode 100644 index b18ea14..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_appcompat_v7 -description: "Android AppCompat Library v7" -data: -- file: appcompat-v7-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_appcompat_v7/com_android_support_appcompat_v7.info b/third_party/android_deps/libs/com_android_support_appcompat_v7/com_android_support_appcompat_v7.info deleted file mode 100644 index 85bd2624..0000000 --- a/third_party/android_deps/libs/com_android_support_appcompat_v7/com_android_support_appcompat_v7.info +++ /dev/null
@@ -1,473 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = true -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.v7.appcompat" -resources = [ - "res/anim/abc_fade_in.xml", - "res/anim/abc_fade_out.xml", - "res/anim/abc_grow_fade_in_from_bottom.xml", - "res/anim/abc_popup_enter.xml", - "res/anim/abc_popup_exit.xml", - "res/anim/abc_shrink_fade_out_from_bottom.xml", - "res/anim/abc_slide_in_bottom.xml", - "res/anim/abc_slide_in_top.xml", - "res/anim/abc_slide_out_bottom.xml", - "res/anim/abc_slide_out_top.xml", - "res/anim/abc_tooltip_enter.xml", - "res/anim/abc_tooltip_exit.xml", - "res/color/abc_background_cache_hint_selector_material_dark.xml", - "res/color/abc_background_cache_hint_selector_material_light.xml", - "res/color/abc_btn_colored_borderless_text_material.xml", - "res/color/abc_btn_colored_text_material.xml", - "res/color/abc_hint_foreground_material_dark.xml", - "res/color/abc_hint_foreground_material_light.xml", - "res/color/abc_primary_text_disable_only_material_dark.xml", - "res/color/abc_primary_text_disable_only_material_light.xml", - "res/color/abc_primary_text_material_dark.xml", - "res/color/abc_primary_text_material_light.xml", - "res/color/abc_search_url_text.xml", - "res/color/abc_secondary_text_material_dark.xml", - "res/color/abc_secondary_text_material_light.xml", - "res/color/abc_tint_btn_checkable.xml", - "res/color/abc_tint_default.xml", - "res/color/abc_tint_edittext.xml", - "res/color/abc_tint_seek_thumb.xml", - "res/color/abc_tint_spinner.xml", - "res/color/abc_tint_switch_track.xml", - "res/color/switch_thumb_material_dark.xml", - "res/color/switch_thumb_material_light.xml", - "res/color-v21/abc_btn_colored_borderless_text_material.xml", - "res/color-v23/abc_btn_colored_borderless_text_material.xml", - "res/color-v23/abc_btn_colored_text_material.xml", - "res/color-v23/abc_color_highlight_material.xml", - "res/color-v23/abc_tint_btn_checkable.xml", - "res/color-v23/abc_tint_default.xml", - "res/color-v23/abc_tint_edittext.xml", - "res/color-v23/abc_tint_seek_thumb.xml", - "res/color-v23/abc_tint_spinner.xml", - "res/color-v23/abc_tint_switch_track.xml", - "res/drawable/abc_btn_borderless_material.xml", - "res/drawable/abc_btn_check_material.xml", - "res/drawable/abc_btn_colored_material.xml", - "res/drawable/abc_btn_default_mtrl_shape.xml", - "res/drawable/abc_btn_radio_material.xml", - "res/drawable/abc_cab_background_internal_bg.xml", - "res/drawable/abc_cab_background_top_material.xml", - "res/drawable/abc_dialog_material_background.xml", - "res/drawable/abc_edit_text_material.xml", - "res/drawable/abc_ic_ab_back_material.xml", - "res/drawable/abc_ic_arrow_drop_right_black_24dp.xml", - "res/drawable/abc_ic_clear_material.xml", - "res/drawable/abc_ic_go_search_api_material.xml", - "res/drawable/abc_ic_menu_overflow_material.xml", - "res/drawable/abc_ic_search_api_material.xml", - "res/drawable/abc_ic_voice_search_api_material.xml", - "res/drawable/abc_item_background_holo_dark.xml", - "res/drawable/abc_item_background_holo_light.xml", - "res/drawable/abc_list_divider_material.xml", - "res/drawable/abc_list_selector_background_transition_holo_dark.xml", - "res/drawable/abc_list_selector_background_transition_holo_light.xml", - "res/drawable/abc_list_selector_holo_dark.xml", - "res/drawable/abc_list_selector_holo_light.xml", - "res/drawable/abc_ratingbar_indicator_material.xml", - "res/drawable/abc_ratingbar_material.xml", - "res/drawable/abc_ratingbar_small_material.xml", - "res/drawable/abc_seekbar_thumb_material.xml", - "res/drawable/abc_seekbar_tick_mark_material.xml", - "res/drawable/abc_seekbar_track_material.xml", - "res/drawable/abc_spinner_textfield_background_material.xml", - "res/drawable/abc_switch_thumb_material.xml", - "res/drawable/abc_tab_indicator_material.xml", - "res/drawable/abc_text_cursor_material.xml", - "res/drawable/abc_textfield_search_material.xml", - "res/drawable/abc_vector_test.xml", - "res/drawable/tooltip_frame_dark.xml", - "res/drawable/tooltip_frame_light.xml", - "res/drawable-hdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_000.png", - "res/drawable-hdpi-v4/abc_btn_check_to_on_mtrl_015.png", - "res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_000.png", - "res/drawable-hdpi-v4/abc_btn_radio_to_on_mtrl_015.png", - "res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png", - "res/drawable-hdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png", - "res/drawable-hdpi-v4/abc_cab_background_top_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png", - "res/drawable-hdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-hdpi-v4/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-hdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png", - "res/drawable-hdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png", - "res/drawable-hdpi-v4/abc_ic_menu_share_mtrl_alpha.png", - "res/drawable-hdpi-v4/abc_ic_star_black_16dp.png", - "res/drawable-hdpi-v4/abc_ic_star_black_36dp.png", - "res/drawable-hdpi-v4/abc_ic_star_black_48dp.png", - "res/drawable-hdpi-v4/abc_ic_star_half_black_16dp.png", - "res/drawable-hdpi-v4/abc_ic_star_half_black_36dp.png", - "res/drawable-hdpi-v4/abc_ic_star_half_black_48dp.png", - "res/drawable-hdpi-v4/abc_list_divider_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_list_focused_holo.9.png", - "res/drawable-hdpi-v4/abc_list_longpressed_holo.9.png", - "res/drawable-hdpi-v4/abc_list_pressed_holo_dark.9.png", - "res/drawable-hdpi-v4/abc_list_pressed_holo_light.9.png", - "res/drawable-hdpi-v4/abc_list_selector_disabled_holo_dark.9.png", - "res/drawable-hdpi-v4/abc_list_selector_disabled_holo_light.9.png", - "res/drawable-hdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png", - "res/drawable-hdpi-v4/abc_popup_background_mtrl_mult.9.png", - "res/drawable-hdpi-v4/abc_scrubber_control_off_mtrl_alpha.png", - "res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png", - "res/drawable-hdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png", - "res/drawable-hdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_scrubber_track_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-hdpi-v4/abc_switch_track_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_tab_indicator_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_dark.png", - "res/drawable-hdpi-v4/abc_text_select_handle_left_mtrl_light.png", - "res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_dark.png", - "res/drawable-hdpi-v4/abc_text_select_handle_middle_mtrl_light.png", - "res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_dark.png", - "res/drawable-hdpi-v4/abc_text_select_handle_right_mtrl_light.png", - "res/drawable-hdpi-v4/abc_textfield_activated_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_textfield_default_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png", - "res/drawable-hdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png", - "res/drawable-ldrtl-hdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-ldrtl-hdpi-v17/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-ldrtl-hdpi-v17/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-ldrtl-mdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-ldrtl-mdpi-v17/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-ldrtl-mdpi-v17/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-ldrtl-xhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-ldrtl-xhdpi-v17/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-ldrtl-xxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-ldrtl-xxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-ldrtl-xxxhdpi-v17/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-ldrtl-xxxhdpi-v17/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-mdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_000.png", - "res/drawable-mdpi-v4/abc_btn_check_to_on_mtrl_015.png", - "res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_000.png", - "res/drawable-mdpi-v4/abc_btn_radio_to_on_mtrl_015.png", - "res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png", - "res/drawable-mdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png", - "res/drawable-mdpi-v4/abc_cab_background_top_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png", - "res/drawable-mdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-mdpi-v4/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-mdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png", - "res/drawable-mdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png", - "res/drawable-mdpi-v4/abc_ic_menu_share_mtrl_alpha.png", - "res/drawable-mdpi-v4/abc_ic_star_black_16dp.png", - "res/drawable-mdpi-v4/abc_ic_star_black_36dp.png", - "res/drawable-mdpi-v4/abc_ic_star_black_48dp.png", - "res/drawable-mdpi-v4/abc_ic_star_half_black_16dp.png", - "res/drawable-mdpi-v4/abc_ic_star_half_black_36dp.png", - "res/drawable-mdpi-v4/abc_ic_star_half_black_48dp.png", - "res/drawable-mdpi-v4/abc_list_divider_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_list_focused_holo.9.png", - "res/drawable-mdpi-v4/abc_list_longpressed_holo.9.png", - "res/drawable-mdpi-v4/abc_list_pressed_holo_dark.9.png", - "res/drawable-mdpi-v4/abc_list_pressed_holo_light.9.png", - "res/drawable-mdpi-v4/abc_list_selector_disabled_holo_dark.9.png", - "res/drawable-mdpi-v4/abc_list_selector_disabled_holo_light.9.png", - "res/drawable-mdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png", - "res/drawable-mdpi-v4/abc_popup_background_mtrl_mult.9.png", - "res/drawable-mdpi-v4/abc_scrubber_control_off_mtrl_alpha.png", - "res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png", - "res/drawable-mdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png", - "res/drawable-mdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_scrubber_track_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-mdpi-v4/abc_switch_track_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_tab_indicator_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_dark.png", - "res/drawable-mdpi-v4/abc_text_select_handle_left_mtrl_light.png", - "res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_dark.png", - "res/drawable-mdpi-v4/abc_text_select_handle_middle_mtrl_light.png", - "res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_dark.png", - "res/drawable-mdpi-v4/abc_text_select_handle_right_mtrl_light.png", - "res/drawable-mdpi-v4/abc_textfield_activated_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_textfield_default_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png", - "res/drawable-mdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png", - "res/drawable-v21/abc_action_bar_item_background_material.xml", - "res/drawable-v21/abc_btn_colored_material.xml", - "res/drawable-v21/abc_dialog_material_background.xml", - "res/drawable-v21/abc_edit_text_material.xml", - "res/drawable-v21/abc_list_divider_material.xml", - "res/drawable-v23/abc_control_background_material.xml", - "res/drawable-watch-v20/abc_dialog_material_background.xml", - "res/drawable-xhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_000.png", - "res/drawable-xhdpi-v4/abc_btn_check_to_on_mtrl_015.png", - "res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_000.png", - "res/drawable-xhdpi-v4/abc_btn_radio_to_on_mtrl_015.png", - "res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png", - "res/drawable-xhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png", - "res/drawable-xhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png", - "res/drawable-xhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-xhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-xhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png", - "res/drawable-xhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png", - "res/drawable-xhdpi-v4/abc_ic_menu_share_mtrl_alpha.png", - "res/drawable-xhdpi-v4/abc_ic_star_black_16dp.png", - "res/drawable-xhdpi-v4/abc_ic_star_black_36dp.png", - "res/drawable-xhdpi-v4/abc_ic_star_black_48dp.png", - "res/drawable-xhdpi-v4/abc_ic_star_half_black_16dp.png", - "res/drawable-xhdpi-v4/abc_ic_star_half_black_36dp.png", - "res/drawable-xhdpi-v4/abc_ic_star_half_black_48dp.png", - "res/drawable-xhdpi-v4/abc_list_divider_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_list_focused_holo.9.png", - "res/drawable-xhdpi-v4/abc_list_longpressed_holo.9.png", - "res/drawable-xhdpi-v4/abc_list_pressed_holo_dark.9.png", - "res/drawable-xhdpi-v4/abc_list_pressed_holo_light.9.png", - "res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_dark.9.png", - "res/drawable-xhdpi-v4/abc_list_selector_disabled_holo_light.9.png", - "res/drawable-xhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png", - "res/drawable-xhdpi-v4/abc_popup_background_mtrl_mult.9.png", - "res/drawable-xhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png", - "res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png", - "res/drawable-xhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png", - "res/drawable-xhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-xhdpi-v4/abc_switch_track_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_dark.png", - "res/drawable-xhdpi-v4/abc_text_select_handle_left_mtrl_light.png", - "res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_dark.png", - "res/drawable-xhdpi-v4/abc_text_select_handle_middle_mtrl_light.png", - "res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_dark.png", - "res/drawable-xhdpi-v4/abc_text_select_handle_right_mtrl_light.png", - "res/drawable-xhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_textfield_default_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png", - "res/drawable-xhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_ab_share_pack_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_000.png", - "res/drawable-xxhdpi-v4/abc_btn_check_to_on_mtrl_015.png", - "res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png", - "res/drawable-xxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png", - "res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png", - "res/drawable-xxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png", - "res/drawable-xxhdpi-v4/abc_cab_background_top_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_ic_commit_search_api_mtrl_alpha.png", - "res/drawable-xxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-xxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-xxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png", - "res/drawable-xxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png", - "res/drawable-xxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png", - "res/drawable-xxhdpi-v4/abc_ic_star_black_16dp.png", - "res/drawable-xxhdpi-v4/abc_ic_star_black_36dp.png", - "res/drawable-xxhdpi-v4/abc_ic_star_black_48dp.png", - "res/drawable-xxhdpi-v4/abc_ic_star_half_black_16dp.png", - "res/drawable-xxhdpi-v4/abc_ic_star_half_black_36dp.png", - "res/drawable-xxhdpi-v4/abc_ic_star_half_black_48dp.png", - "res/drawable-xxhdpi-v4/abc_list_divider_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_list_focused_holo.9.png", - "res/drawable-xxhdpi-v4/abc_list_longpressed_holo.9.png", - "res/drawable-xxhdpi-v4/abc_list_pressed_holo_dark.9.png", - "res/drawable-xxhdpi-v4/abc_list_pressed_holo_light.9.png", - "res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_dark.9.png", - "res/drawable-xxhdpi-v4/abc_list_selector_disabled_holo_light.9.png", - "res/drawable-xxhdpi-v4/abc_menu_hardkey_panel_mtrl_mult.9.png", - "res/drawable-xxhdpi-v4/abc_popup_background_mtrl_mult.9.png", - "res/drawable-xxhdpi-v4/abc_scrubber_control_off_mtrl_alpha.png", - "res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png", - "res/drawable-xxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png", - "res/drawable-xxhdpi-v4/abc_scrubber_primary_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_scrubber_track_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_switch_track_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png", - "res/drawable-xxhdpi-v4/abc_text_select_handle_left_mtrl_light.png", - "res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_dark.png", - "res/drawable-xxhdpi-v4/abc_text_select_handle_middle_mtrl_light.png", - "res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_dark.png", - "res/drawable-xxhdpi-v4/abc_text_select_handle_right_mtrl_light.png", - "res/drawable-xxhdpi-v4/abc_textfield_activated_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_textfield_default_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_textfield_search_activated_mtrl_alpha.9.png", - "res/drawable-xxhdpi-v4/abc_textfield_search_default_mtrl_alpha.9.png", - "res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_000.png", - "res/drawable-xxxhdpi-v4/abc_btn_check_to_on_mtrl_015.png", - "res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_000.png", - "res/drawable-xxxhdpi-v4/abc_btn_radio_to_on_mtrl_015.png", - "res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00001.9.png", - "res/drawable-xxxhdpi-v4/abc_btn_switch_to_on_mtrl_00012.9.png", - "res/drawable-xxxhdpi-v4/abc_ic_menu_copy_mtrl_am_alpha.png", - "res/drawable-xxxhdpi-v4/abc_ic_menu_cut_mtrl_alpha.png", - "res/drawable-xxxhdpi-v4/abc_ic_menu_paste_mtrl_am_alpha.png", - "res/drawable-xxxhdpi-v4/abc_ic_menu_selectall_mtrl_alpha.png", - "res/drawable-xxxhdpi-v4/abc_ic_menu_share_mtrl_alpha.png", - "res/drawable-xxxhdpi-v4/abc_ic_star_black_16dp.png", - "res/drawable-xxxhdpi-v4/abc_ic_star_black_36dp.png", - "res/drawable-xxxhdpi-v4/abc_ic_star_black_48dp.png", - "res/drawable-xxxhdpi-v4/abc_ic_star_half_black_16dp.png", - "res/drawable-xxxhdpi-v4/abc_ic_star_half_black_36dp.png", - "res/drawable-xxxhdpi-v4/abc_ic_star_half_black_48dp.png", - "res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_000.png", - "res/drawable-xxxhdpi-v4/abc_scrubber_control_to_pressed_mtrl_005.png", - "res/drawable-xxxhdpi-v4/abc_spinner_mtrl_am_alpha.9.png", - "res/drawable-xxxhdpi-v4/abc_switch_track_mtrl_alpha.9.png", - "res/drawable-xxxhdpi-v4/abc_tab_indicator_mtrl_alpha.9.png", - "res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_dark.png", - "res/drawable-xxxhdpi-v4/abc_text_select_handle_left_mtrl_light.png", - "res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_dark.png", - "res/drawable-xxxhdpi-v4/abc_text_select_handle_right_mtrl_light.png", - "res/layout/abc_action_bar_title_item.xml", - "res/layout/abc_action_bar_up_container.xml", - "res/layout/abc_action_menu_item_layout.xml", - "res/layout/abc_action_menu_layout.xml", - "res/layout/abc_action_mode_bar.xml", - "res/layout/abc_action_mode_close_item_material.xml", - "res/layout/abc_activity_chooser_view.xml", - "res/layout/abc_activity_chooser_view_list_item.xml", - "res/layout/abc_alert_dialog_button_bar_material.xml", - "res/layout/abc_alert_dialog_material.xml", - "res/layout/abc_alert_dialog_title_material.xml", - "res/layout/abc_cascading_menu_item_layout.xml", - "res/layout/abc_dialog_title_material.xml", - "res/layout/abc_expanded_menu_layout.xml", - "res/layout/abc_list_menu_item_checkbox.xml", - "res/layout/abc_list_menu_item_icon.xml", - "res/layout/abc_list_menu_item_layout.xml", - "res/layout/abc_list_menu_item_radio.xml", - "res/layout/abc_popup_menu_header_item_layout.xml", - "res/layout/abc_popup_menu_item_layout.xml", - "res/layout/abc_screen_content_include.xml", - "res/layout/abc_screen_simple.xml", - "res/layout/abc_screen_simple_overlay_action_mode.xml", - "res/layout/abc_screen_toolbar.xml", - "res/layout/abc_search_dropdown_item_icons_2line.xml", - "res/layout/abc_search_view.xml", - "res/layout/abc_select_dialog_material.xml", - "res/layout/abc_tooltip.xml", - "res/layout/select_dialog_item_material.xml", - "res/layout/select_dialog_multichoice_material.xml", - "res/layout/select_dialog_singlechoice_material.xml", - "res/layout/support_simple_spinner_dropdown_item.xml", - "res/layout-v26/abc_screen_toolbar.xml", - "res/layout-watch-v20/abc_alert_dialog_button_bar_material.xml", - "res/layout-watch-v20/abc_alert_dialog_title_material.xml", - "res/values/values.xml", - "res/values-af/values-af.xml", - "res/values-am/values-am.xml", - "res/values-ar/values-ar.xml", - "res/values-as/values-as.xml", - "res/values-az/values-az.xml", - "res/values-b+sr+Latn/values-b+sr+Latn.xml", - "res/values-be/values-be.xml", - "res/values-bg/values-bg.xml", - "res/values-bn/values-bn.xml", - "res/values-bs/values-bs.xml", - "res/values-ca/values-ca.xml", - "res/values-cs/values-cs.xml", - "res/values-da/values-da.xml", - "res/values-de/values-de.xml", - "res/values-el/values-el.xml", - "res/values-en-rAU/values-en-rAU.xml", - "res/values-en-rCA/values-en-rCA.xml", - "res/values-en-rGB/values-en-rGB.xml", - "res/values-en-rIN/values-en-rIN.xml", - "res/values-en-rXC/values-en-rXC.xml", - "res/values-es/values-es.xml", - "res/values-es-rUS/values-es-rUS.xml", - "res/values-et/values-et.xml", - "res/values-eu/values-eu.xml", - "res/values-fa/values-fa.xml", - "res/values-fi/values-fi.xml", - "res/values-fr/values-fr.xml", - "res/values-fr-rCA/values-fr-rCA.xml", - "res/values-gl/values-gl.xml", - "res/values-gu/values-gu.xml", - "res/values-h720dp-v13/values-h720dp-v13.xml", - "res/values-hdpi-v4/values-hdpi-v4.xml", - "res/values-hi/values-hi.xml", - "res/values-hr/values-hr.xml", - "res/values-hu/values-hu.xml", - "res/values-hy/values-hy.xml", - "res/values-in/values-in.xml", - "res/values-is/values-is.xml", - "res/values-it/values-it.xml", - "res/values-iw/values-iw.xml", - "res/values-ja/values-ja.xml", - "res/values-ka/values-ka.xml", - "res/values-kk/values-kk.xml", - "res/values-km/values-km.xml", - "res/values-kn/values-kn.xml", - "res/values-ko/values-ko.xml", - "res/values-ky/values-ky.xml", - "res/values-land/values-land.xml", - "res/values-large-v4/values-large-v4.xml", - "res/values-ldltr-v21/values-ldltr-v21.xml", - "res/values-lo/values-lo.xml", - "res/values-lt/values-lt.xml", - "res/values-lv/values-lv.xml", - "res/values-mk/values-mk.xml", - "res/values-ml/values-ml.xml", - "res/values-mn/values-mn.xml", - "res/values-mr/values-mr.xml", - "res/values-ms/values-ms.xml", - "res/values-my/values-my.xml", - "res/values-nb/values-nb.xml", - "res/values-ne/values-ne.xml", - "res/values-night-v8/values-night-v8.xml", - "res/values-nl/values-nl.xml", - "res/values-or/values-or.xml", - "res/values-pa/values-pa.xml", - "res/values-pl/values-pl.xml", - "res/values-port/values-port.xml", - "res/values-pt/values-pt.xml", - "res/values-pt-rBR/values-pt-rBR.xml", - "res/values-pt-rPT/values-pt-rPT.xml", - "res/values-ro/values-ro.xml", - "res/values-ru/values-ru.xml", - "res/values-si/values-si.xml", - "res/values-sk/values-sk.xml", - "res/values-sl/values-sl.xml", - "res/values-sq/values-sq.xml", - "res/values-sr/values-sr.xml", - "res/values-sv/values-sv.xml", - "res/values-sw/values-sw.xml", - "res/values-sw600dp-v13/values-sw600dp-v13.xml", - "res/values-ta/values-ta.xml", - "res/values-te/values-te.xml", - "res/values-th/values-th.xml", - "res/values-tl/values-tl.xml", - "res/values-tr/values-tr.xml", - "res/values-uk/values-uk.xml", - "res/values-ur/values-ur.xml", - "res/values-uz/values-uz.xml", - "res/values-v16/values-v16.xml", - "res/values-v17/values-v17.xml", - "res/values-v18/values-v18.xml", - "res/values-v21/values-v21.xml", - "res/values-v22/values-v22.xml", - "res/values-v23/values-v23.xml", - "res/values-v24/values-v24.xml", - "res/values-v25/values-v25.xml", - "res/values-v26/values-v26.xml", - "res/values-v28/values-v28.xml", - "res/values-vi/values-vi.xml", - "res/values-watch-v20/values-watch-v20.xml", - "res/values-watch-v21/values-watch-v21.xml", - "res/values-xlarge-v4/values-xlarge-v4.xml", - "res/values-zh-rCN/values-zh-rCN.xml", - "res/values-zh-rHK/values-zh-rHK.xml", - "res/values-zh-rTW/values-zh-rTW.xml", - "res/values-zu/values-zu.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py deleted file mode 100755 index e6d1f5d..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'cardview-v7' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/LICENSE b/third_party/android_deps/libs/com_android_support_cardview_v7/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/OWNERS b/third_party/android_deps/libs/com_android_support_cardview_v7/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/README.chromium b/third_party/android_deps/libs/com_android_support_cardview_v7/README.chromium deleted file mode 100644 index bdd10c3..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support CardView v7 -Short Name: cardview-v7 -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Android Support CardView v7 - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/cipd.yaml b/third_party/android_deps/libs/com_android_support_cardview_v7/cipd.yaml deleted file mode 100644 index 5855f5e8..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_cardview_v7 -description: "Android Support CardView v7" -data: -- file: cardview-v7-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_cardview_v7/com_android_support_cardview_v7.info b/third_party/android_deps/libs/com_android_support_cardview_v7/com_android_support_cardview_v7.info deleted file mode 100644 index d8368a8..0000000 --- a/third_party/android_deps/libs/com_android_support_cardview_v7/com_android_support_cardview_v7.info +++ /dev/null
@@ -1,17 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = false -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.v7.cardview" -resources = [ - "res/values/values.xml", - "res/values-v23/values-v23.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_design/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_design/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_design/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py deleted file mode 100755 index ae83ec1..0000000 --- a/third_party/android_deps/libs/com_android_support_design/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'design' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_design/LICENSE b/third_party/android_deps/libs/com_android_support_design/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_design/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_design/OWNERS b/third_party/android_deps/libs/com_android_support_design/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_design/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_design/README.chromium b/third_party/android_deps/libs/com_android_support_design/README.chromium deleted file mode 100644 index 9a6a413..0000000 --- a/third_party/android_deps/libs/com_android_support_design/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Material Components for Android -Short Name: design -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Material Components for Android is a static library that you can add to your Android application in order to use APIs that provide implementations of the Material Design specification. Compatible on devices running API 14 or later. - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_design/cipd.yaml b/third_party/android_deps/libs/com_android_support_design/cipd.yaml deleted file mode 100644 index 0fe7930..0000000 --- a/third_party/android_deps/libs/com_android_support_design/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_design -description: "Material Components for Android" -data: -- file: design-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_design/com_android_support_design.info b/third_party/android_deps/libs/com_android_support_design/com_android_support_design.info deleted file mode 100644 index b64bb1d..0000000 --- a/third_party/android_deps/libs/com_android_support_design/com_android_support_design.info +++ /dev/null
@@ -1,108 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = true -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.design" -resources = [ - "res/anim/design_bottom_sheet_slide_in.xml", - "res/anim/design_bottom_sheet_slide_out.xml", - "res/anim/design_snackbar_in.xml", - "res/anim/design_snackbar_out.xml", - "res/anim-v21/design_bottom_sheet_slide_in.xml", - "res/anim-v21/design_bottom_sheet_slide_out.xml", - "res/animator/design_fab_hide_motion_spec.xml", - "res/animator/design_fab_show_motion_spec.xml", - "res/animator/mtrl_btn_state_list_anim.xml", - "res/animator/mtrl_btn_unelevated_state_list_anim.xml", - "res/animator/mtrl_chip_state_list_anim.xml", - "res/animator/mtrl_fab_hide_motion_spec.xml", - "res/animator/mtrl_fab_show_motion_spec.xml", - "res/animator/mtrl_fab_transformation_sheet_collapse_spec.xml", - "res/animator/mtrl_fab_transformation_sheet_expand_spec.xml", - "res/animator-v21/design_appbar_state_list_animator.xml", - "res/color/design_error.xml", - "res/color/design_tint_password_toggle.xml", - "res/color/mtrl_bottom_nav_colored_item_tint.xml", - "res/color/mtrl_bottom_nav_item_tint.xml", - "res/color/mtrl_btn_bg_color_selector.xml", - "res/color/mtrl_btn_ripple_color.xml", - "res/color/mtrl_btn_stroke_color_selector.xml", - "res/color/mtrl_btn_text_btn_ripple_color.xml", - "res/color/mtrl_btn_text_color_selector.xml", - "res/color/mtrl_chip_background_color.xml", - "res/color/mtrl_chip_close_icon_tint.xml", - "res/color/mtrl_chip_ripple_color.xml", - "res/color/mtrl_chip_text_color.xml", - "res/color/mtrl_fab_ripple_color.xml", - "res/color/mtrl_tabs_colored_ripple_color.xml", - "res/color/mtrl_tabs_icon_color_selector.xml", - "res/color/mtrl_tabs_icon_color_selector_colored.xml", - "res/color/mtrl_tabs_legacy_text_color_selector.xml", - "res/color/mtrl_tabs_ripple_color.xml", - "res/color/mtrl_text_btn_text_color_selector.xml", - "res/color-v23/design_tint_password_toggle.xml", - "res/drawable/design_bottom_navigation_item_background.xml", - "res/drawable/design_fab_background.xml", - "res/drawable/design_password_eye.xml", - "res/drawable/design_snackbar_background.xml", - "res/drawable/ic_mtrl_chip_checked_black.xml", - "res/drawable/ic_mtrl_chip_checked_circle.xml", - "res/drawable/ic_mtrl_chip_close_circle.xml", - "res/drawable/mtrl_snackbar_background.xml", - "res/drawable/mtrl_tabs_default_indicator.xml", - "res/drawable/navigation_empty_icon.xml", - "res/drawable-anydpi-v21/design_ic_visibility.xml", - "res/drawable-anydpi-v21/design_ic_visibility_off.xml", - "res/drawable-hdpi-v4/design_ic_visibility.png", - "res/drawable-hdpi-v4/design_ic_visibility_off.png", - "res/drawable-mdpi-v4/design_ic_visibility.png", - "res/drawable-mdpi-v4/design_ic_visibility_off.png", - "res/drawable-v21/avd_hide_password.xml", - "res/drawable-v21/avd_show_password.xml", - "res/drawable-v21/design_bottom_navigation_item_background.xml", - "res/drawable-v21/design_password_eye.xml", - "res/drawable-xhdpi-v4/design_ic_visibility.png", - "res/drawable-xhdpi-v4/design_ic_visibility_off.png", - "res/drawable-xxhdpi-v4/design_ic_visibility.png", - "res/drawable-xxhdpi-v4/design_ic_visibility_off.png", - "res/drawable-xxxhdpi-v4/design_ic_visibility.png", - "res/drawable-xxxhdpi-v4/design_ic_visibility_off.png", - "res/interpolator/mtrl_fast_out_linear_in.xml", - "res/interpolator/mtrl_fast_out_slow_in.xml", - "res/interpolator/mtrl_linear.xml", - "res/interpolator/mtrl_linear_out_slow_in.xml", - "res/interpolator-v21/mtrl_fast_out_linear_in.xml", - "res/interpolator-v21/mtrl_fast_out_slow_in.xml", - "res/interpolator-v21/mtrl_linear_out_slow_in.xml", - "res/layout/design_bottom_navigation_item.xml", - "res/layout/design_bottom_sheet_dialog.xml", - "res/layout/design_layout_snackbar.xml", - "res/layout/design_layout_snackbar_include.xml", - "res/layout/design_layout_tab_icon.xml", - "res/layout/design_layout_tab_text.xml", - "res/layout/design_menu_item_action_area.xml", - "res/layout/design_navigation_item.xml", - "res/layout/design_navigation_item_header.xml", - "res/layout/design_navigation_item_separator.xml", - "res/layout/design_navigation_item_subheader.xml", - "res/layout/design_navigation_menu.xml", - "res/layout/design_navigation_menu_item.xml", - "res/layout/design_text_input_password_icon.xml", - "res/layout/mtrl_layout_snackbar.xml", - "res/layout/mtrl_layout_snackbar_include.xml", - "res/layout-sw600dp-v13/design_layout_snackbar.xml", - "res/layout-sw600dp-v13/mtrl_layout_snackbar.xml", - "res/values/values.xml", - "res/values-land/values-land.xml", - "res/values-large-v4/values-large-v4.xml", - "res/values-sw600dp-v13/values-sw600dp-v13.xml", - "res/values-v21/values-v21.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_multidex/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_multidex/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py deleted file mode 100755 index 95ff5b1..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'multidex' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_multidex/LICENSE b/third_party/android_deps/libs/com_android_support_multidex/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_multidex/OWNERS b/third_party/android_deps/libs/com_android_support_multidex/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_multidex/README.chromium b/third_party/android_deps/libs/com_android_support_multidex/README.chromium deleted file mode 100644 index 6b0d4599..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Multi-Dex Library -Short Name: multidex -URL: http://developer.android.com/tools/extras/support-library.html -Version: 1.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Library for legacy multi-dex support - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_multidex/cipd.yaml b/third_party/android_deps/libs/com_android_support_multidex/cipd.yaml deleted file mode 100644 index 2327413..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@1.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_multidex -description: "Android Multi-Dex Library" -data: -- file: multidex-1.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_multidex/com_android_support_multidex.info b/third_party/android_deps/libs/com_android_support_multidex/com_android_support_multidex.info deleted file mode 100644 index c3b8deac..0000000 --- a/third_party/android_deps/libs/com_android_support_multidex/com_android_support_multidex.info +++ /dev/null
@@ -1,14 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = false -has_r_text_file = false -is_manifest_empty = true -manifest_package = "android.support.multidex" -resources = [] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py deleted file mode 100755 index f403600..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'recyclerview-v7' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/LICENSE b/third_party/android_deps/libs/com_android_support_recyclerview_v7/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/OWNERS b/third_party/android_deps/libs/com_android_support_recyclerview_v7/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/README.chromium b/third_party/android_deps/libs/com_android_support_recyclerview_v7/README.chromium deleted file mode 100644 index 1850d9a..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support RecyclerView v7 -Short Name: recyclerview-v7 -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Android Support RecyclerView v7 - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/cipd.yaml b/third_party/android_deps/libs/com_android_support_recyclerview_v7/cipd.yaml deleted file mode 100644 index f49df6d2..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_recyclerview_v7 -description: "Android Support RecyclerView v7" -data: -- file: recyclerview-v7-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_recyclerview_v7/com_android_support_recyclerview_v7.info b/third_party/android_deps/libs/com_android_support_recyclerview_v7/com_android_support_recyclerview_v7.info deleted file mode 100644 index 2e705e3..0000000 --- a/third_party/android_deps/libs/com_android_support_recyclerview_v7/com_android_support_recyclerview_v7.info +++ /dev/null
@@ -1,16 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = true -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.v7.recyclerview" -resources = [ - "res/values/values.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_support_fragment/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py deleted file mode 100755 index 303734c5..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'support-fragment' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/LICENSE b/third_party/android_deps/libs/com_android_support_support_fragment/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/OWNERS b/third_party/android_deps/libs/com_android_support_support_fragment/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/README.chromium b/third_party/android_deps/libs/com_android_support_support_fragment/README.chromium deleted file mode 100644 index 49e45df..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support Library fragment -Short Name: support-fragment -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later. - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/cipd.yaml b/third_party/android_deps/libs/com_android_support_support_fragment/cipd.yaml deleted file mode 100644 index 45a9c73..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_support_fragment -description: "Android Support Library fragment" -data: -- file: support-fragment-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_support_fragment/com_android_support_support_fragment.info b/third_party/android_deps/libs/com_android_support_support_fragment/com_android_support_support_fragment.info deleted file mode 100644 index f96fc0f4a..0000000 --- a/third_party/android_deps/libs/com_android_support_support_fragment/com_android_support_support_fragment.info +++ /dev/null
@@ -1,14 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = false -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.fragment" -resources = [] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py deleted file mode 100755 index bb354641..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'support-media-compat' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/LICENSE b/third_party/android_deps/libs/com_android_support_support_media_compat/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/OWNERS b/third_party/android_deps/libs/com_android_support_support_media_compat/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/README.chromium b/third_party/android_deps/libs/com_android_support_support_media_compat/README.chromium deleted file mode 100644 index 449b0dc..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support Library media compat -Short Name: support-media-compat -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later. - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/cipd.yaml b/third_party/android_deps/libs/com_android_support_support_media_compat/cipd.yaml deleted file mode 100644 index cbc8e7c..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_support_media_compat -description: "Android Support Library media compat" -data: -- file: support-media-compat-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_support_media_compat/com_android_support_support_media_compat.info b/third_party/android_deps/libs/com_android_support_support_media_compat/com_android_support_support_media_compat.info deleted file mode 100644 index 3e03d0e..0000000 --- a/third_party/android_deps/libs/com_android_support_support_media_compat/com_android_support_support_media_compat.info +++ /dev/null
@@ -1,34 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [ - "aidl/android/support/v4/media/MediaDescriptionCompat.aidl", - "aidl/android/support/v4/media/MediaMetadataCompat.aidl", - "aidl/android/support/v4/media/RatingCompat.aidl", - "aidl/android/support/v4/media/session/MediaSessionCompat.aidl", - "aidl/android/support/v4/media/session/ParcelableVolumeInfo.aidl", - "aidl/android/support/v4/media/session/PlaybackStateCompat.aidl" -] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = true -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.mediacompat" -resources = [ - "res/layout/notification_media_action.xml", - "res/layout/notification_media_cancel_action.xml", - "res/layout/notification_template_big_media.xml", - "res/layout/notification_template_big_media_custom.xml", - "res/layout/notification_template_big_media_narrow.xml", - "res/layout/notification_template_big_media_narrow_custom.xml", - "res/layout/notification_template_lines_media.xml", - "res/layout/notification_template_media.xml", - "res/layout/notification_template_media_custom.xml", - "res/values/values.xml", - "res/values-v21/values-v21.xml", - "res/values-v24/values-v24.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_support_v4/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py deleted file mode 100755 index 74d62b86..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'support-v4' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/LICENSE b/third_party/android_deps/libs/com_android_support_support_v4/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/OWNERS b/third_party/android_deps/libs/com_android_support_support_v4/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/README.chromium b/third_party/android_deps/libs/com_android_support_support_v4/README.chromium deleted file mode 100644 index b55271f..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support Library v4 -Short Name: support-v4 -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -The Support Library is a static library that you can add to your Android application in order to use APIs that are either not available for older platform versions or utility APIs that aren't a part of the framework APIs. Compatible on devices running API 14 or later. - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/cipd.yaml b/third_party/android_deps/libs/com_android_support_support_v4/cipd.yaml deleted file mode 100644 index 2f8a0ac..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_support_v4 -description: "Android Support Library v4" -data: -- file: support-v4-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_support_v4/com_android_support_support_v4.info b/third_party/android_deps/libs/com_android_support_support_v4/com_android_support_support_v4.info deleted file mode 100644 index d4ea6e6..0000000 --- a/third_party/android_deps/libs/com_android_support_support_v4/com_android_support_support_v4.info +++ /dev/null
@@ -1,14 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = false -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.v4" -resources = [] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py deleted file mode 100755 index 06104ca..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'support-vector-drawable' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/LICENSE b/third_party/android_deps/libs/com_android_support_support_vector_drawable/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/OWNERS b/third_party/android_deps/libs/com_android_support_support_vector_drawable/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/README.chromium b/third_party/android_deps/libs/com_android_support_support_vector_drawable/README.chromium deleted file mode 100644 index aaaed24..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Support VectorDrawable -Short Name: support-vector-drawable -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Android Support VectorDrawable - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/cipd.yaml b/third_party/android_deps/libs/com_android_support_support_vector_drawable/cipd.yaml deleted file mode 100644 index 0606d4a..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_support_vector_drawable -description: "Android Support VectorDrawable" -data: -- file: support-vector-drawable-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_support_vector_drawable/com_android_support_support_vector_drawable.info b/third_party/android_deps/libs/com_android_support_support_vector_drawable/com_android_support_support_vector_drawable.info deleted file mode 100644 index 42c03a0..0000000 --- a/third_party/android_deps/libs/com_android_support_support_vector_drawable/com_android_support_support_vector_drawable.info +++ /dev/null
@@ -1,14 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = false -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.graphics.drawable" -resources = [] -subjar_tuples = [] -subjars = []
diff --git a/third_party/android_deps/libs/com_android_support_transition/3pp/3pp.pb b/third_party/android_deps/libs/com_android_support_transition/3pp/3pp.pb deleted file mode 100644 index d743b51b..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/3pp/3pp.pb +++ /dev/null
@@ -1,16 +0,0 @@ -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy instead. - -create { - source { - script { name: "fetch.py" } - } -} - -upload { - pkg_prefix: "chromium/third_party/android_deps/libs" - universal: true -}
diff --git a/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py b/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py deleted file mode 100755 index 47359ba..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/3pp/fetch.py +++ /dev/null
@@ -1,78 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2021 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This is generated, do not edit. Update BuildConfigGenerator.groovy and -# 3ppFetch.template instead. - -import argparse -import json -import os -import re -import urllib.request - -_REPO_URL = 'https://dl.google.com/dl/android/maven2' -_GROUP_NAME = 'com/android/support' -_MODULE_NAME = 'transition' -_FILE_EXT = 'aar' -_OVERRIDE_LATEST = None -_PATCH_VERSION = 'cr1' - - -def do_latest(): - if _OVERRIDE_LATEST is not None: - print(_OVERRIDE_LATEST + f'.{_PATCH_VERSION}') - return - maven_metadata_url = '{}/{}/{}/maven-metadata.xml'.format( - _REPO_URL, _GROUP_NAME, _MODULE_NAME) - metadata = urllib.request.urlopen(maven_metadata_url).read().decode( - 'utf-8') - # Do not parse xml with the python included parser since it is susceptible - # to maliciously crafted xmls. Only use regular expression parsing to be - # safe. RE should be enough to handle what we need to extract. - match = re.search('<latest>([^<]+)</latest>', metadata) - if match: - latest = match.group(1) - else: - # if no latest info was found just hope the versions are sorted and the - # last one is the latest (as is commonly the case). - latest = re.findall('<version>([^<]+)</version>', metadata)[-1] - print(latest + f'.{_PATCH_VERSION}') - - -def get_download_url(version): - # Remove the patch version when getting the download url - version_no_patch, patch = version.rsplit('.', 1) - if patch.startswith('cr'): - version = version_no_patch - file_url = '{0}/{1}/{2}/{3}/{2}-{3}.{4}'.format(_REPO_URL, _GROUP_NAME, - _MODULE_NAME, version, - _FILE_EXT) - file_name = file_url.rsplit('/', 1)[-1] - - partial_manifest = { - 'url': [file_url], - 'name': [file_name], - 'ext': '.' + _FILE_EXT, - } - print(json.dumps(partial_manifest)) - - -def main(): - ap = argparse.ArgumentParser() - sub = ap.add_subparsers() - - latest = sub.add_parser('latest') - latest.set_defaults(func=lambda _opts: do_latest()) - - download = sub.add_parser('get_url') - download.set_defaults( - func=lambda _opts: get_download_url(os.environ['_3PP_VERSION'])) - - opts = ap.parse_args() - opts.func(opts) - - -if __name__ == '__main__': - main()
diff --git a/third_party/android_deps/libs/com_android_support_transition/LICENSE b/third_party/android_deps/libs/com_android_support_transition/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/android_deps/libs/com_android_support_transition/OWNERS b/third_party/android_deps/libs/com_android_support_transition/OWNERS deleted file mode 100644 index aea47a05..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/OWNERS +++ /dev/null
@@ -1 +0,0 @@ -file://third_party/android_deps/OWNERS
diff --git a/third_party/android_deps/libs/com_android_support_transition/README.chromium b/third_party/android_deps/libs/com_android_support_transition/README.chromium deleted file mode 100644 index 064be36e..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/README.chromium +++ /dev/null
@@ -1,15 +0,0 @@ -Name: Android Transition Support Library -Short Name: transition -URL: http://developer.android.com/tools/extras/support-library.html -Version: 28.0.0 -License: Apache Version 2.0 -License File: LICENSE -CPEPrefix: unknown -Security Critical: yes -Shipped: yes - -Description: -Android Transition Support Library - -Local Modifications: -No modifications.
diff --git a/third_party/android_deps/libs/com_android_support_transition/cipd.yaml b/third_party/android_deps/libs/com_android_support_transition/cipd.yaml deleted file mode 100644 index 9cf1c93..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/cipd.yaml +++ /dev/null
@@ -1,10 +0,0 @@ -# Copyright 2018 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# To create CIPD package run the following command. -# cipd create --pkg-def cipd.yaml -tag version:2@28.0.0.cr1 -package: chromium/third_party/android_deps/libs/com_android_support_transition -description: "Android Transition Support Library" -data: -- file: transition-28.0.0.aar
diff --git a/third_party/android_deps/libs/com_android_support_transition/com_android_support_transition.info b/third_party/android_deps/libs/com_android_support_transition/com_android_support_transition.info deleted file mode 100644 index 1f305b7..0000000 --- a/third_party/android_deps/libs/com_android_support_transition/com_android_support_transition.info +++ /dev/null
@@ -1,16 +0,0 @@ -# Generated by //build/android/gyp/aar.py -# To regenerate, use "update_android_aar_prebuilts = true" and run "gn gen". - -aidl = [] -assets = [] -has_classes_jar = true -has_native_libraries = false -has_proguard_flags = true -has_r_text_file = true -is_manifest_empty = true -manifest_package = "android.support.transition" -resources = [ - "res/values/values.xml" -] -subjar_tuples = [] -subjars = []
diff --git a/third_party/angle b/third_party/angle index 34c8778..32ef34d 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit 34c8778b4a73855471c2b27e5ea221e2861a6d73 +Subproject commit 32ef34df48920cff6f6b629c515e052fa4baa968
diff --git a/third_party/blink/common/features.cc b/third_party/blink/common/features.cc index 64dc482..00002cf5 100644 --- a/third_party/blink/common/features.cc +++ b/third_party/blink/common/features.cc
@@ -1064,6 +1064,12 @@ const base::FeatureParam<int> kLCPPFontURLPredictorMaxUrlCountPerOrigin{ &kLCPPFontURLPredictor, "lcpp_max_font_url_count_per_origin", 10}; +const base::FeatureParam<double> kLCPPFontURLPredictorFrequencyThreshold{ + &kLCPPFontURLPredictor, "lcpp_font_url_frequency_threshold", 0.5}; + +const base::FeatureParam<int> kLCPPFontURLPredictorMaxPreloadCount{ + &kLCPPFontURLPredictor, "lcpp_max_font_url_to_preload", 5}; + // Enables reporting as LCP of the time the first frame of a video was painted. BASE_FEATURE(kLCPVideoFirstFrame, "LCPVideoFirstFrame", @@ -1450,9 +1456,9 @@ const base::FeatureParam<int> kProduceCompileHintsOnIdleDelayParam{ &kProduceCompileHints2, "delay-in-ms", 10000}; const base::FeatureParam<double> kProduceCompileHintsNoiseLevel{ - &kProduceCompileHints2, "noise probability", 0.5}; + &kProduceCompileHints2, "noise-probability", 0.5}; const base::FeatureParam<double> kProduceCompileHintsDataProductionLevel{ - &kProduceCompileHints2, "data production probability", 0.005}; + &kProduceCompileHints2, "data-production-probability", 0.005}; BASE_FEATURE(kForceProduceCompileHints, "ForceProduceCompileHints", base::FEATURE_DISABLED_BY_DEFAULT); @@ -1677,9 +1683,9 @@ &kSharedStorageSelectURLLimit, "SharedStorageSelectURLBitBudgetPerPageLoad", 12}; const base::FeatureParam<int> - kSharedStorageSelectURLBitBudgetPerOriginPerPageLoad = { + kSharedStorageSelectURLBitBudgetPerSitePerPageLoad = { &kSharedStorageSelectURLLimit, - "SharedStorageSelectURLBitBudgetPerOriginPerPageLoad", 6}; + "SharedStorageSelectURLBitBudgetPerSitePerPageLoad", 6}; BASE_FEATURE(kSharedStorageAPIM118, "SharedStorageAPIM118",
diff --git a/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc b/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc index 8ea584db..8af71d7 100644 --- a/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc +++ b/third_party/blink/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.cc
@@ -140,11 +140,11 @@ } // static -const url::Origin& +const net::SchemefulSite& StructTraits<blink::mojom::SharedStorageBudgetMetadataDataView, blink::FencedFrame::SharedStorageBudgetMetadata>:: - origin(const blink::FencedFrame::SharedStorageBudgetMetadata& input) { - return input.origin; + site(const blink::FencedFrame::SharedStorageBudgetMetadata& input) { + return input.site; } // static double StructTraits<blink::mojom::SharedStorageBudgetMetadataDataView, @@ -166,7 +166,7 @@ blink::FencedFrame::SharedStorageBudgetMetadata>:: Read(blink::mojom::SharedStorageBudgetMetadataDataView data, blink::FencedFrame::SharedStorageBudgetMetadata* out_data) { - if (!data.ReadOrigin(&out_data->origin)) { + if (!data.ReadSite(&out_data->site)) { return false; } out_data->budget_to_charge = data.budget_to_charge();
diff --git a/third_party/blink/public/common/features.h b/third_party/blink/public/common/features.h index 382f3ae1..b8ac1f5 100644 --- a/third_party/blink/public/common/features.h +++ b/third_party/blink/public/common/features.h
@@ -593,6 +593,14 @@ BLINK_COMMON_EXPORT extern const base::FeatureParam<int> kLCPPFontURLPredictorMaxUrlCountPerOrigin; +// Fonts are preloaded if frequencies are above this threshold. +BLINK_COMMON_EXPORT extern const base::FeatureParam<double> + kLCPPFontURLPredictorFrequencyThreshold; + +// The maximum number of Fonts to be sent for preload. +BLINK_COMMON_EXPORT extern const base::FeatureParam<int> + kLCPPFontURLPredictorMaxPreloadCount; + BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLCPVideoFirstFrame); BLINK_COMMON_EXPORT BASE_DECLARE_FEATURE(kLightweightNoStatePrefetch); @@ -1075,11 +1083,11 @@ // `sharedStorage.selectURL()`, if `kSharedStorageSelectURLLimit` is enabled. BLINK_COMMON_EXPORT extern const base::FeatureParam<int> kSharedStorageSelectURLBitBudgetPerPageLoad; -// Maximum number of bits of entropy per origin per pageload that are allowed to +// Maximum number of bits of entropy per site per pageload that are allowed to // leak via `sharedStorage.selectURL()`, if `kSharedStorageSelectURLLimit` is // enabled. BLINK_COMMON_EXPORT extern const base::FeatureParam<int> - kSharedStorageSelectURLBitBudgetPerOriginPerPageLoad; + kSharedStorageSelectURLBitBudgetPerSitePerPageLoad; // Additional Shared Storage API features shipped in M118. // TODO(crbug.com/1218540): Merge this flag with `kSharedStorageAPI` once
diff --git a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h index 67eade1..aa26830 100644 --- a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h +++ b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config.h
@@ -12,6 +12,7 @@ #include <utility> #include <vector> +#include "net/base/schemeful_site.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "third_party/blink/public/common/common_export.h" #include "third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom-forward.h" @@ -55,13 +56,13 @@ }; // The metadata for the shared storage runURLSelectionOperation's budget, -// which includes the shared storage's origin and the amount of budget to +// which includes the shared storage's `site` and the amount of budget to // charge when a fenced frame that originates from the URN is navigating a top // frame. Before the fenced frame results in a top navigation, this // `SharedStorageBudgetMetadata` will be stored/associated with the URN inside // the `FencedFrameURLMapping`. struct BLINK_COMMON_EXPORT SharedStorageBudgetMetadata { - url::Origin origin; + net::SchemefulSite site; double budget_to_charge = 0; // The bool `top_navigated` needs to be mutable because the overall
diff --git a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h index 18dc500..9beb173d 100644 --- a/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h +++ b/third_party/blink/public/common/fenced_frame/redacted_fenced_frame_config_mojom_traits.h
@@ -60,7 +60,7 @@ struct BLINK_COMMON_EXPORT StructTraits<blink::mojom::SharedStorageBudgetMetadataDataView, blink::FencedFrame::SharedStorageBudgetMetadata> { - static const url::Origin& origin( + static const net::SchemefulSite& site( const blink::FencedFrame::SharedStorageBudgetMetadata& input); static double budget_to_charge( const blink::FencedFrame::SharedStorageBudgetMetadata& input);
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index 407a53f..e845855 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -9359,6 +9359,7 @@ win additionalBid additionalBidWin + clear # Ad advertising element inside an interest group. type InterestGroupAd extends object @@ -11487,7 +11488,7 @@ enum AccountChooser AutoReauthn - ConfirmIdpSignin + ConfirmIdpLogin # Corresponds to IdentityRequestAccount type Account extends object @@ -11498,7 +11499,7 @@ string givenName string pictureUrl string idpConfigUrl - string idpSigninUrl + string idpLoginUrl LoginState loginState # These two are only set if the loginState is signUp optional string termsOfServiceUrl @@ -11528,9 +11529,9 @@ string dialogId integer accountIndex - # Only valid if the dialog type is ConfirmIdpSignin. Acts as if the user had + # Only valid if the dialog type is ConfirmIdpLogin. Acts as if the user had # clicked the continue button. - command confirmIdpSignin + command confirmIdpLogin parameters string dialogId
diff --git a/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom b/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom index 9c3475db..048917a 100644 --- a/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom +++ b/third_party/blink/public/mojom/fenced_frame/fenced_frame_config.mojom
@@ -7,6 +7,7 @@ module blink.mojom; +import "services/network/public/mojom/schemeful_site.mojom"; import "third_party/blink/public/mojom/permissions_policy/permissions_policy_feature.mojom"; import "ui/gfx/geometry/mojom/geometry.mojom"; import "url/mojom/url.mojom"; @@ -82,7 +83,7 @@ }; struct SharedStorageBudgetMetadata { - url.mojom.Origin origin; + network.mojom.SchemefulSite site; double budget_to_charge; bool top_navigated; };
diff --git a/third_party/blink/public/mojom/mediasession/media_session.mojom b/third_party/blink/public/mojom/mediasession/media_session.mojom index 4709135..8739df287 100644 --- a/third_party/blink/public/mojom/mediasession/media_session.mojom +++ b/third_party/blink/public/mojom/mediasession/media_session.mojom
@@ -29,13 +29,8 @@ bool fast_seek; }; -struct MediaSessionPictureInPictureActionDetails { - bool automatic; -}; - union MediaSessionActionDetails { MediaSessionSeekToDetails seek_to; - MediaSessionPictureInPictureActionDetails picture_in_picture; }; // MediaMetadata
diff --git a/third_party/blink/public/mojom/payments/payment_request.mojom b/third_party/blink/public/mojom/payments/payment_request.mojom index 888c4be6..b990c52 100644 --- a/third_party/blink/public/mojom/payments/payment_request.mojom +++ b/third_party/blink/public/mojom/payments/payment_request.mojom
@@ -29,11 +29,21 @@ string? shipping_option; PayerDetail payer; + // The assertion for secure payment confirmation. + // This member is deprecated in favor of the + // get_assertion_authenticator_response below and can be removed once flag + // SecurePaymentConfirmationExtensions is removed. SecurePaymentConfirmationResponse? secure_payment_confirmation; + + // The assertion for secure payment confirmation. + // This member replaces secure_payment_confirmation above behind the + // SecurePaymentConfirmationExtensions flag. + blink.mojom.GetAssertionAuthenticatorResponse? get_assertion_authenticator_response; }; // A response for the "secure-payment-confirmation" payment method. A subset of -// blink.mojom.GetAssertionAuthenticatorResponse. +// blink.mojom.GetAssertionAuthenticatorResponse. This struct can be removed +// once flag SecurePaymentConfirmationExtensions is removed. struct SecurePaymentConfirmationResponse { blink.mojom.CommonCredentialInfo credential_info; array<uint8> signature;
diff --git a/third_party/blink/public/mojom/webid/federated_auth_request.mojom b/third_party/blink/public/mojom/webid/federated_auth_request.mojom index d7cf671..78f1f72 100644 --- a/third_party/blink/public/mojom/webid/federated_auth_request.mojom +++ b/third_party/blink/public/mojom/webid/federated_auth_request.mojom
@@ -51,6 +51,11 @@ kContinue }; +enum RpMode { + kButton, + kWidget +}; + // The details of a single logout request from an identity provider. struct LogoutRpsRequest { // URL to which the request will be sent. The origin is validated to @@ -146,6 +151,10 @@ // TODO(crbug.com/1335237): consider moving this up to IdentityProviderConfig // when/if we support the Context API for Multiple IdPs at a time. RpContext context; + + // Controls the UX of the FedCM prompt: modality, behavior when the + // user is signed-out, etc. + RpMode mode; }; // The error which occurred during the retrieval of a token.
diff --git a/third_party/blink/renderer/bindings/generated_in_core.gni b/third_party/blink/renderer/bindings/generated_in_core.gni index f8f1aa0..22883f5 100644 --- a/third_party/blink/renderer/bindings/generated_in_core.gni +++ b/third_party/blink/renderer/bindings/generated_in_core.gni
@@ -59,8 +59,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_reporting_observer_callback.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_resize_observer_callback.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_resize_observer_callback.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_state_callback.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_state_callback.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_underlying_source_cancel_callback.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_underlying_source_cancel_callback.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_underlying_source_pull_callback.cc", @@ -361,8 +359,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_into_view_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_options.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_state_init.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_state_init.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_timeline_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_timeline_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_to_options.cc", @@ -498,8 +494,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_mojo_interface_interceptor_scope.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_mojo_scope.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_mojo_scope.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_native_scroll_behavior.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_native_scroll_behavior.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_navigation_commit_behavior.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_navigation_commit_behavior.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_navigation_entropy.cc", @@ -1299,8 +1293,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scheduling.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_screen.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_screen.h", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_state.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_state.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_timeline.cc", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_scroll_timeline.h", "$root_gen_dir/third_party/blink/renderer/bindings/core/v8/v8_security_policy_violation_event.cc",
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index e8cb0c27..a25b2c9 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -677,8 +677,6 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_recorder_options.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_details.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_details.h", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_session_picture_in_picture_action_details.cc", - "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_session_picture_in_picture_action_details.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_session_seek_to_action_details.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_session_seek_to_action_details.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_media_settings_range.cc", @@ -1402,6 +1400,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_idb_transaction_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_context.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_context.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_mode.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_mode.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_smoothing_quality.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_image_smoothing_quality.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_item_type.cc", @@ -2751,6 +2751,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_webgl_vertex_array_object.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_webgl_vertex_array_object_oes.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_webgl_vertex_array_object_oes.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_webgl_video_texture.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_webgl_video_texture.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_websocket.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_websocket.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_websocket_stream.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_core.gni b/third_party/blink/renderer/bindings/idl_in_core.gni index 4fe088b..3ee2dc8d 100644 --- a/third_party/blink/renderer/bindings/idl_in_core.gni +++ b/third_party/blink/renderer/bindings/idl_in_core.gni
@@ -540,8 +540,6 @@ "//third_party/blink/renderer/core/offscreencanvas/offscreen_canvas.idl", "//third_party/blink/renderer/core/page/color_page_popup_controller.idl", "//third_party/blink/renderer/core/page/page_popup_controller.idl", - "//third_party/blink/renderer/core/page/scrolling/scroll_state.idl", - "//third_party/blink/renderer/core/page/scrolling/scroll_state_init.idl", "//third_party/blink/renderer/core/permissions_policy/feature_policy.idl", "//third_party/blink/renderer/core/resize_observer/resize_observer.idl", "//third_party/blink/renderer/core/resize_observer/resize_observer_entry.idl",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index 4ec8a05..eb969325 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -421,7 +421,6 @@ "//third_party/blink/renderer/modules/mediasession/media_position_state.idl", "//third_party/blink/renderer/modules/mediasession/media_session.idl", "//third_party/blink/renderer/modules/mediasession/media_session_action_details.idl", - "//third_party/blink/renderer/modules/mediasession/media_session_picture_in_picture_action_details.idl", "//third_party/blink/renderer/modules/mediasession/media_session_seek_to_action_details.idl", "//third_party/blink/renderer/modules/mediasession/navigator_media_session.idl", "//third_party/blink/renderer/modules/mediasource/audio_track_source_buffer.idl", @@ -1000,6 +999,7 @@ "//third_party/blink/renderer/modules/webgl/webgl_uniform_location.idl", "//third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.idl", "//third_party/blink/renderer/modules/webgl/webgl_vertex_array_object_oes.idl", + "//third_party/blink/renderer/modules/webgl/webgl_video_texture.idl", "//third_party/blink/renderer/modules/webgpu/gpu.idl", "//third_party/blink/renderer/modules/webgpu/gpu_adapter.idl", "//third_party/blink/renderer/modules/webgpu/gpu_adapter_info.idl",
diff --git a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h index 6c66b0b..807e8f8 100644 --- a/third_party/blink/renderer/core/css/css_primitive_value_mappings.h +++ b/third_party/blink/renderer/core/css/css_primitive_value_mappings.h
@@ -41,7 +41,6 @@ #include "third_party/blink/renderer/core/css/css_to_length_conversion_data.h" #include "third_party/blink/renderer/core/css/css_value.h" #include "third_party/blink/renderer/core/css_value_keywords.h" -#include "third_party/blink/renderer/core/scroll/scroll_customization.h" #include "third_party/blink/renderer/core/scroll/scrollable_area.h" #include "third_party/blink/renderer/core/style/computed_style_constants.h" #include "third_party/blink/renderer/platform/fonts/font_description.h" @@ -1157,34 +1156,6 @@ } template <> -inline scroll_customization::ScrollDirection CSSIdentifierValue::ConvertTo() - const { - switch (value_id_) { - case CSSValueID::kNone: - return scroll_customization::kScrollDirectionNone; - case CSSValueID::kAuto: - return scroll_customization::kScrollDirectionAuto; - case CSSValueID::kPanLeft: - return scroll_customization::kScrollDirectionPanLeft; - case CSSValueID::kPanRight: - return scroll_customization::kScrollDirectionPanRight; - case CSSValueID::kPanX: - return scroll_customization::kScrollDirectionPanX; - case CSSValueID::kPanUp: - return scroll_customization::kScrollDirectionPanUp; - case CSSValueID::kPanDown: - return scroll_customization::kScrollDirectionPanDown; - case CSSValueID::kPanY: - return scroll_customization::kScrollDirectionPanY; - default: - break; - } - - NOTREACHED(); - return scroll_customization::kScrollDirectionNone; -} - -template <> inline CSSIdentifierValue::CSSIdentifierValue(CSSBoxType css_box) : CSSValue(kIdentifierClass) { switch (css_box) {
diff --git a/third_party/blink/renderer/core/css/css_properties.json5 b/third_party/blink/renderer/core/css/css_properties.json5 index c215856..7dd8bf9 100644 --- a/third_party/blink/renderer/core/css/css_properties.json5 +++ b/third_party/blink/renderer/core/css/css_properties.json5
@@ -4253,18 +4253,6 @@ typedom_types: ["Keyword", "Length"], }, { - name: "scroll-customization", - property_methods: ["ParseSingleValue", "CSSValueFromComputedStyleInternal"], - converter: "ConvertFlags<blink::scroll_customization::ScrollDirection>", - type_name: "scroll_customization::ScrollDirection", - field_group: "*", - field_size: 4, - field_template: "primitive", - default_value: "scroll_customization::kScrollDirectionNone", - include_paths: ["third_party/blink/renderer/core/scroll/scroll_customization.h"], - runtime_flag: "ScrollCustomization", - }, - { name: "scroll-margin-block-start", property_methods: ["ParseSingleValue"], logical_property_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 2cb865c..22db6a09 100644 --- a/third_party/blink/renderer/core/css/css_property_equality.cc +++ b/third_party/blink/renderer/core/css/css_property_equality.cc
@@ -602,8 +602,6 @@ return a.ScrollbarWidth() == b.ScrollbarWidth(); case CSSPropertyID::kScrollBehavior: return a.GetScrollBehavior() == b.GetScrollBehavior(); - case CSSPropertyID::kScrollCustomization: - return a.ScrollCustomization() == b.ScrollCustomization(); case CSSPropertyID::kScrollMarginBottom: return a.ScrollMarginBottom() == b.ScrollMarginBottom(); case CSSPropertyID::kScrollMarginLeft:
diff --git a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc index 53fde87..472d8cf 100644 --- a/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc +++ b/third_party/blink/renderer/core/css/parser/css_property_parser_test.cc
@@ -332,51 +332,6 @@ EXPECT_TRUE(doc->IsUseCounted(WebFeature::kBasicShapeEllipseNoRadius)); } -TEST(CSSPropertyParserTest, ScrollCustomizationPropertySingleValue) { - ScopedScrollCustomizationForTest scoped_feature(true); - const CSSValue* value = CSSParser::ParseSingleValue( - CSSPropertyID::kScrollCustomization, "pan-down", - StrictCSSParserContext(SecureContextMode::kSecureContext)); - const auto* list = To<CSSValueList>(value); - EXPECT_EQ(1U, list->length()); - EXPECT_EQ(CSSValueID::kPanDown, - To<CSSIdentifierValue>(list->Item(0U)).GetValueID()); -} - -TEST(CSSPropertyParserTest, ScrollCustomizationPropertyTwoValuesCombined) { - ScopedScrollCustomizationForTest scoped_feature(true); - const CSSValue* value = CSSParser::ParseSingleValue( - CSSPropertyID::kScrollCustomization, "pan-left pan-y", - StrictCSSParserContext(SecureContextMode::kSecureContext)); - const auto* list = To<CSSValueList>(value); - EXPECT_EQ(2U, list->length()); - EXPECT_EQ(CSSValueID::kPanLeft, - To<CSSIdentifierValue>(list->Item(0U)).GetValueID()); - EXPECT_EQ(CSSValueID::kPanY, - To<CSSIdentifierValue>(list->Item(1U)).GetValueID()); -} - -TEST(CSSPropertyParserTest, ScrollCustomizationPropertyInvalidEntries) { - // We expect exactly one property value per coordinate. - ScopedScrollCustomizationForTest scoped_feature(true); - const CSSValue* value = CSSParser::ParseSingleValue( - CSSPropertyID::kScrollCustomization, "pan-left pan-right", - StrictCSSParserContext(SecureContextMode::kSecureContext)); - EXPECT_FALSE(value); - value = CSSParser::ParseSingleValue( - CSSPropertyID::kScrollCustomization, "pan-up pan-down", - StrictCSSParserContext(SecureContextMode::kSecureContext)); - EXPECT_FALSE(value); - value = CSSParser::ParseSingleValue( - CSSPropertyID::kScrollCustomization, "pan-x pan-left", - StrictCSSParserContext(SecureContextMode::kSecureContext)); - EXPECT_FALSE(value); - value = CSSParser::ParseSingleValue( - CSSPropertyID::kScrollCustomization, "pan-x pan-x", - StrictCSSParserContext(SecureContextMode::kSecureContext)); - EXPECT_FALSE(value); -} - TEST(CSSPropertyParserTest, GradientUseCount) { auto dummy_page_holder = std::make_unique<DummyPageHolder>(gfx::Size(800, 600));
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc index 47e41b0..b864496 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.cc +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.cc
@@ -3953,43 +3953,6 @@ return list; } -// Returns up to two values for 'scroll-customization' property. The values -// correspond to the customization values for 'x' and 'y' axes. -CSSValue* ComputedStyleUtils::ScrollCustomizationFlagsToCSSValue( - scroll_customization::ScrollDirection scroll_customization) { - CSSValueList* list = CSSValueList::CreateSpaceSeparated(); - if (scroll_customization == scroll_customization::kScrollDirectionAuto) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kAuto)); - } else if (scroll_customization == - scroll_customization::kScrollDirectionNone) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kNone)); - } else { - if ((scroll_customization & scroll_customization::kScrollDirectionPanX) == - scroll_customization::kScrollDirectionPanX) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kPanX)); - } else if (scroll_customization & - scroll_customization::kScrollDirectionPanLeft) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kPanLeft)); - } else if (scroll_customization & - scroll_customization::kScrollDirectionPanRight) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kPanRight)); - } - if ((scroll_customization & scroll_customization::kScrollDirectionPanY) == - scroll_customization::kScrollDirectionPanY) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kPanY)); - } else if (scroll_customization & - scroll_customization::kScrollDirectionPanUp) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kPanUp)); - } else if (scroll_customization & - scroll_customization::kScrollDirectionPanDown) { - list->Append(*CSSIdentifierValue::Create(CSSValueID::kPanDown)); - } - } - - DCHECK(list->length()); - return list; -} - CSSValue* ComputedStyleUtils::ValueForGapLength( const absl::optional<Length>& gap_length, const ComputedStyle& style) {
diff --git a/third_party/blink/renderer/core/css/properties/computed_style_utils.h b/third_party/blink/renderer/core/css/properties/computed_style_utils.h index 0b38a5a3..130661d 100644 --- a/third_party/blink/renderer/core/css/properties/computed_style_utils.h +++ b/third_party/blink/renderer/core/css/properties/computed_style_utils.h
@@ -316,8 +316,6 @@ static CSSValueList* ValuesForContainerShorthand(const ComputedStyle&, const LayoutObject*, bool allow_visited_style); - static CSSValue* ScrollCustomizationFlagsToCSSValue( - scroll_customization::ScrollDirection); static CSSValue* ValueForGapLength(const absl::optional<Length>&, const ComputedStyle&); static CSSValue* ValueForStyleName(const StyleName&);
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 b0b45c09..44cb8af 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
@@ -6945,65 +6945,6 @@ return CSSIdentifierValue::Create(style.GetScrollBehavior()); } -namespace { - -static bool ConsumePan(CSSParserTokenRange& range, - CSSValue** pan_x, - CSSValue** pan_y) { - CSSValueID id = range.Peek().Id(); - if ((id == CSSValueID::kPanX || id == CSSValueID::kPanRight || - id == CSSValueID::kPanLeft) && - !*pan_x) { - *pan_x = css_parsing_utils::ConsumeIdent(range); - } else if ((id == CSSValueID::kPanY || id == CSSValueID::kPanDown || - id == CSSValueID::kPanUp) && - !*pan_y) { - *pan_y = css_parsing_utils::ConsumeIdent(range); - } else { - return false; - } - return true; -} - -} // namespace - -const CSSValue* ScrollCustomization::ParseSingleValue( - CSSParserTokenRange& range, - const CSSParserContext& context, - const CSSParserLocalContext&) const { - CSSValueList* list = CSSValueList::CreateSpaceSeparated(); - CSSValueID id = range.Peek().Id(); - if (id == CSSValueID::kAuto || id == CSSValueID::kNone) { - list->Append(*css_parsing_utils::ConsumeIdent(range)); - return list; - } - - CSSValue* pan_x = nullptr; - CSSValue* pan_y = nullptr; - if (!ConsumePan(range, &pan_x, &pan_y)) { - return nullptr; - } - if (!range.AtEnd() && !ConsumePan(range, &pan_x, &pan_y)) { - return nullptr; - } - - if (pan_x) { - list->Append(*pan_x); - } - if (pan_y) { - list->Append(*pan_y); - } - return list; -} - -const CSSValue* ScrollCustomization::CSSValueFromComputedStyleInternal( - const ComputedStyle& style, - const LayoutObject*, - bool allow_visited_style) const { - return ComputedStyleUtils::ScrollCustomizationFlagsToCSSValue( - style.ScrollCustomization()); -} - const CSSValue* ScrollMarginBlockEnd::ParseSingleValue( CSSParserTokenRange& range, const CSSParserContext& context,
diff --git a/third_party/blink/renderer/core/css/resolver/font_builder.cc b/third_party/blink/renderer/core/css/resolver/font_builder.cc index 948f05ef..e01c8bc 100644 --- a/third_party/blink/renderer/core/css/resolver/font_builder.cc +++ b/third_party/blink/renderer/core/css/resolver/font_builder.cc
@@ -387,7 +387,7 @@ font_description.SetSizeAdjust(FontSizeAdjust( aspect_value.has_value() ? aspect_value.value() : FontSizeAdjust::kFontSizeAdjustNone, - size_adjust.GetMetric(), size_adjust.IsFromFont())); + size_adjust.GetMetric(), FontSizeAdjust::ValueType::kFromFont)); } if (auto adjusted_size = FontSizeFunctions::MetricsMultiplierAdjustedFontSize(
diff --git a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc index c23da58..c4c6cdb 100644 --- a/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc +++ b/third_party/blink/renderer/core/css/resolver/style_builder_converter.cc
@@ -745,7 +745,8 @@ if (identifier_value && identifier_value->GetValueID() == CSSValueID::kFromFont) { - return FontSizeAdjust(FontSizeAdjust::kFontSizeAdjustNone, true); + return FontSizeAdjust(FontSizeAdjust::kFontSizeAdjustNone, + FontSizeAdjust::ValueType::kFromFont); } if (value.IsPrimitiveValue()) { @@ -767,7 +768,8 @@ DCHECK(To<CSSIdentifierValue>(pair.Second()).GetValueID() == CSSValueID::kFromFont); - return FontSizeAdjust(FontSizeAdjust::kFontSizeAdjustNone, metric, true); + return FontSizeAdjust(FontSizeAdjust::kFontSizeAdjustNone, metric, + FontSizeAdjust::ValueType::kFromFont); } FontSizeAdjust StyleBuilderConverter::ConvertFontSizeAdjust(
diff --git a/third_party/blink/renderer/core/dom/element.idl b/third_party/blink/renderer/core/dom/element.idl index 7b0edf8..24a2c416 100644 --- a/third_party/blink/renderer/core/dom/element.idl +++ b/third_party/blink/renderer/core/dom/element.idl
@@ -18,12 +18,6 @@ * Boston, MA 02110-1301, USA. */ -// See -// https://docs.google.com/document/d/1VnvAqeWFG9JFZfgG5evBqrLGDZYRE5w6G5jEDORekPY -// for details. -enum NativeScrollBehavior { "disable-native-scroll", "perform-before-native-scroll", "perform-after-native-scroll" }; -callback ScrollStateCallback = void (ScrollState scrollState); - // https://drafts.csswg.org/cssom-view/#dictdef-checkvisibilityoptions dictionary CheckVisibilityOptions { boolean checkOpacity = false;
diff --git a/third_party/blink/renderer/core/dom/node.cc b/third_party/blink/renderer/core/dom/node.cc index 3d1a99e1..0eae68c 100644 --- a/third_party/blink/renderer/core/dom/node.cc +++ b/third_party/blink/renderer/core/dom/node.cc
@@ -478,19 +478,6 @@ : &TreeRoot(); } -void Node::setDistributeScroll(V8ScrollStateCallback* scroll_state_callback, - const String& native_scroll_behavior) { - GetScrollCustomizationCallbacks().SetDistributeScroll( - this, ScrollStateCallbackV8Impl::Create(scroll_state_callback, - native_scroll_behavior)); -} - -void Node::setApplyScroll(V8ScrollStateCallback* scroll_state_callback, - const String& native_scroll_behavior) { - SetApplyScroll(ScrollStateCallbackV8Impl::Create(scroll_state_callback, - native_scroll_behavior)); -} - void Node::SetApplyScroll(ScrollStateCallback* scroll_state_callback) { GetScrollCustomizationCallbacks().SetApplyScroll(this, scroll_state_callback); } @@ -612,14 +599,6 @@ ->GlobalRootScrollerController() .IsViewportScrollCallback(callback); - bool is_global_root_scroller = - GetLayoutObject() && GetLayoutObject()->IsGlobalRootScroller(); - - disable_custom_callbacks |= - !is_global_root_scroller && - RuntimeEnabledFeatures::ScrollCustomizationEnabled() && - !GetScrollCustomizationCallbacks().InScrollPhase(this); - if (!callback || disable_custom_callbacks) { NativeDistributeScroll(scroll_state); return; @@ -658,14 +637,6 @@ ->GlobalRootScrollerController() .IsViewportScrollCallback(callback); - bool is_global_root_scroller = - GetLayoutObject() && GetLayoutObject()->IsGlobalRootScroller(); - - disable_custom_callbacks |= - !is_global_root_scroller && - RuntimeEnabledFeatures::ScrollCustomizationEnabled() && - !GetScrollCustomizationCallbacks().InScrollPhase(this); - if (!callback || disable_custom_callbacks) { NativeApplyScroll(scroll_state); return;
diff --git a/third_party/blink/renderer/core/dom/node.h b/third_party/blink/renderer/core/dom/node.h index d74f19b..3e86c22 100644 --- a/third_party/blink/renderer/core/dom/node.h +++ b/third_party/blink/renderer/core/dom/node.h
@@ -90,7 +90,6 @@ class StaticNodeTypeList; using StaticNodeList = StaticNodeTypeList<Node>; class StyleChangeReasonForTracing; -class V8ScrollStateCallback; class V8UnionNodeOrStringOrTrustedScript; class V8UnionStringOrTrustedScript; class WebPluginContainerImpl; @@ -228,11 +227,7 @@ Node* lastChild() const; Node* getRootNode(const GetRootNodeOptions*) const; - // Scroll Customization API. See crbug.com/410974 for details. - void setDistributeScroll(V8ScrollStateCallback*, - const String& native_scroll_behavior); - void setApplyScroll(V8ScrollStateCallback*, - const String& native_scroll_behavior); + // TODO(crbug.com/1369739): Get rid of these. void SetApplyScroll(ScrollStateCallback*); void RemoveApplyScroll(); ScrollStateCallback* GetApplyScroll();
diff --git a/third_party/blink/renderer/core/dom/node.idl b/third_party/blink/renderer/core/dom/node.idl index f11f9ee..eac7c52 100644 --- a/third_party/blink/renderer/core/dom/node.idl +++ b/third_party/blink/renderer/core/dom/node.idl
@@ -40,10 +40,6 @@ readonly attribute USVString baseURI; - // Scroll Customization API. See crbug.com/410974 for details. - [RuntimeEnabled=ScrollCustomization] void setApplyScroll(ScrollStateCallback scrollStateCallback, NativeScrollBehavior nativeScrollBehavior); - [RuntimeEnabled=ScrollCustomization] void setDistributeScroll(ScrollStateCallback scrollStateCallback, NativeScrollBehavior nativeScrollBehavior); - [Measure] readonly attribute boolean isConnected; [PerWorldBindings] readonly attribute Document? ownerDocument; [PerWorldBindings] readonly attribute Node? parentNode;
diff --git a/third_party/blink/renderer/core/editing/ime/edit_context.cc b/third_party/blink/renderer/core/editing/ime/edit_context.cc index 26a7d7c..66d1f77 100644 --- a/third_party/blink/renderer/core/editing/ime/edit_context.cc +++ b/third_party/blink/renderer/core/editing/ime/edit_context.cc
@@ -642,8 +642,6 @@ WebTextInputInfo EditContext::TextInputInfo() { WebTextInputInfo info; // Fetch all the text input info from edit context. - // TODO(crbug.com/1197325): Change this to refer to the "view" part of the - // EditContext once the EditContext spec adds this feature. info.node_id = GetInputMethodController().NodeIdOfFocusedElement(); info.action = GetInputMethodController().InputActionOfFocusedElement(); info.input_mode = GetInputMethodController().InputModeOfFocusedElement(); @@ -651,7 +649,7 @@ info.virtual_keyboard_policy = GetInputMethodController().VirtualKeyboardPolicyOfFocusedElement(); info.value = text(); - info.flags = TextInputFlags(); + info.flags = GetInputMethodController().TextInputFlags(); info.selection_start = selection_start_; info.selection_end = selection_end_; info.composition_start = composition_range_start_; @@ -659,20 +657,6 @@ return info; } -int EditContext::TextInputFlags() const { - int flags = 0; - // Disable spellcheck & autocorrect for EditContext. - flags |= kWebTextInputFlagAutocorrectOff; - flags |= kWebTextInputFlagSpellcheckOff; - - // TODO:(snianu) Enable this once the password type - // is supported by inputMode attribute. - // if (input_mode_ == WebTextInputMode::kPassword) - // flags |= kWebTextInputFlagHasBeenPasswordField; - - return flags; -} - WebRange EditContext::CompositionRange() const { return WebRange(composition_range_start_, composition_range_end_ - composition_range_start_);
diff --git a/third_party/blink/renderer/core/editing/ime/edit_context.h b/third_party/blink/renderer/core/editing/ime/edit_context.h index 8721aec0..eacc186 100644 --- a/third_party/blink/renderer/core/editing/ime/edit_context.h +++ b/third_party/blink/renderer/core/editing/ime/edit_context.h
@@ -137,7 +137,6 @@ ConfirmCompositionBehavior selection_behavior) override; WebTextInputInfo TextInputInfo() override; int ComputeWebTextInputNextPreviousFlags() override { return 0; } - int TextInputFlags() const; WebRange CompositionRange() const override; bool GetCompositionCharacterBounds(WebVector<gfx::Rect>& bounds) override; WebRange GetSelectionOffsets() const override;
diff --git a/third_party/blink/renderer/core/editing/ime/input_method_controller.h b/third_party/blink/renderer/core/editing/ime/input_method_controller.h index 476415f..daa7e9c 100644 --- a/third_party/blink/renderer/core/editing/ime/input_method_controller.h +++ b/third_party/blink/renderer/core/editing/ime/input_method_controller.h
@@ -167,6 +167,7 @@ ui::mojom::VirtualKeyboardPolicy VirtualKeyboardPolicyOfFocusedElement() const; WebTextInputType TextInputType() const; + int TextInputFlags() const; private: friend class InputMethodControllerTest; @@ -231,7 +232,6 @@ int selection_start, int selection_end, size_t text_length) const; - int TextInputFlags() const; // Implements |ExecutionContextLifecycleObserver|. void ContextDestroyed() final;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index acb43e9..8fd06b6 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -1286,10 +1286,9 @@ LocalFrameView* frame_view = MainFrameImpl()->GetFrameView(); gfx::Size old_size = frame_view->Size(); UpdateICBAndResizeViewport(visible_viewport_size); - gfx::Size new_size = frame_view->Size(); - frame_view->InvalidateLayoutForViewportConstrainedObjects( - old_size.width() != new_size.width(), - old_size.height() != new_size.height()); + if (old_size != frame_view->Size()) { + frame_view->InvalidateLayoutForViewportConstrainedObjects(); + } } fullscreen_controller_->UpdateSize();
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 f36bbfa..51973d17 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.cc +++ b/third_party/blink/renderer/core/frame/local_frame_view.cc
@@ -326,7 +326,6 @@ visitor->Trace(scroll_anchoring_scrollable_areas_); visitor->Trace(animating_scrollable_areas_); visitor->Trace(user_scrollable_areas_); - visitor->Trace(fixed_position_objects_); visitor->Trace(background_attachment_fixed_objects_); visitor->Trace(auto_size_info_); visitor->Trace(plugins_); @@ -488,7 +487,6 @@ // tracking groups when they update style or are destroyed, but sometimes they // are missed. It would be good to understand how/why that happens, but in the // mean time, it's not safe to keep pointers around to defunct LayoutObjects. - fixed_position_objects_.Clear(); background_attachment_fixed_objects_.clear(); // Destroy |m_autoSizeInfo| as early as possible, to avoid dereferencing @@ -564,9 +562,6 @@ } void LocalFrameView::FrameRectsChanged(const gfx::Rect& old_rect) { - const bool width_changed = Size().width() != old_rect.width(); - const bool height_changed = Size().height() != old_rect.height(); - PropagateFrameRects(); if (FrameRect() != old_rect) { @@ -574,8 +569,8 @@ layout_view->SetShouldCheckForPaintInvalidation(); } - if (width_changed || height_changed) { - ViewportSizeChanged(width_changed, height_changed); + if (Size() != old_rect.size()) { + ViewportSizeChanged(); if (frame_->IsMainFrame()) frame_->GetPage()->GetVisualViewport().MainFrameDidChangeSize(); GetFrame().Loader().RestoreScrollPositionAndViewState(); @@ -826,11 +821,8 @@ layout_object_counter_, contents_height_before_layout, GetLayoutView()->DocumentRect().Height(), Height()); - gfx::Size new_size(Size()); - if (old_size != new_size) { - InvalidateLayoutForViewportConstrainedObjects( - old_size.width() != new_size.width(), - old_size.height() != new_size.height()); + if (old_size != Size()) { + InvalidateLayoutForViewportConstrainedObjects(); } if (frame_->IsMainFrame()) { @@ -1207,20 +1199,7 @@ return false; } -void LocalFrameView::AddFixedPositionObject(LayoutObject& object) { - if (!fixed_position_objects_) - fixed_position_objects_ = MakeGarbageCollected<ObjectSet>(); - fixed_position_objects_->insert(&object); -} - -void LocalFrameView::RemoveFixedPositionObject(LayoutObject& object) { - if (fixed_position_objects_) - fixed_position_objects_->erase(&object); -} - -void LocalFrameView::ViewportSizeChanged(bool width_changed, - bool height_changed) { - DCHECK(width_changed || height_changed); +void LocalFrameView::ViewportSizeChanged() { DCHECK(frame_->GetPage()); if (frame_->GetDocument() && frame_->GetDocument()->Lifecycle().LifecyclePostponed()) @@ -1254,64 +1233,30 @@ layout_view->SetShouldCheckForPaintInvalidation(); if (GetFrame().GetDocument() && !IsInPerformLayout()) { - InvalidateLayoutForViewportConstrainedObjects(width_changed, - height_changed); + InvalidateLayoutForViewportConstrainedObjects(); } if (GetPaintTimingDetector().Visualizer()) GetPaintTimingDetector().Visualizer()->OnViewportChanged(); } -void LocalFrameView::InvalidateLayoutForViewportConstrainedObjects( - bool width_changed, - bool height_changed) { +void LocalFrameView::InvalidateLayoutForViewportConstrainedObjects() { auto* layout_view = GetLayoutView(); if (layout_view && !layout_view->NeedsLayout()) { for (const auto& fragment : layout_view->PhysicalFragments()) { if (RuntimeEnabledFeatures::LayoutNewStickyLogicEnabled() && fragment.StickyDescendants()) { layout_view->SetNeedsSimplifiedLayout(); - break; + return; } - if (RuntimeEnabledFeatures::LayoutNewFixedPositionInvalidationEnabled()) { - if (!fragment.HasOutOfFlowFragmentChild()) { - continue; + if (!fragment.HasOutOfFlowFragmentChild()) { + continue; + } + for (const auto& fragment_child : fragment.Children()) { + if (fragment_child->IsFixedPositioned()) { + layout_view->SetNeedsSimplifiedLayout(); + return; } - for (const auto& fragment_child : fragment.Children()) { - if (fragment_child->IsFixedPositioned()) { - layout_view->SetNeedsSimplifiedLayout(); - return; - } - } - } - } - } - - if (RuntimeEnabledFeatures::LayoutNewFixedPositionInvalidationEnabled()) { - return; - } - - if (!HasFixedPositionObjects() || !(width_changed || height_changed)) - return; - - for (const auto& layout_object : *fixed_position_objects_) { - const ComputedStyle& style = layout_object->StyleRef(); - if (width_changed) { - if (style.UsedWidth().IsFixed() && - (style.UsedLeft().IsAuto() || style.UsedRight().IsAuto())) { - layout_object->ContainingBlock()->SetNeedsSimplifiedLayout(); - } else { - layout_object->SetNeedsLayoutAndFullPaintInvalidation( - layout_invalidation_reason::kSizeChanged); - } - } - if (height_changed) { - if (style.UsedHeight().IsFixed() && - (style.UsedTop().IsAuto() || style.UsedBottom().IsAuto())) { - layout_object->ContainingBlock()->SetNeedsSimplifiedLayout(); - } else { - layout_object->SetNeedsLayoutAndFullPaintInvalidation( - layout_invalidation_reason::kSizeChanged); } } }
diff --git a/third_party/blink/renderer/core/frame/local_frame_view.h b/third_party/blink/renderer/core/frame/local_frame_view.h index 96c2126..377b18d9 100644 --- a/third_party/blink/renderer/core/frame/local_frame_view.h +++ b/third_party/blink/renderer/core/frame/local_frame_view.h
@@ -295,26 +295,16 @@ void DidChangeScrollOffset(); - void ViewportSizeChanged(bool width_changed, bool height_changed); - void InvalidateLayoutForViewportConstrainedObjects(bool width_changed, - bool height_changed); + void ViewportSizeChanged(); + void InvalidateLayoutForViewportConstrainedObjects(); void DynamicViewportUnitsChanged(); AtomicString MediaType() const; void SetMediaType(const AtomicString&); void AdjustMediaTypeForPrinting(bool printing); - typedef HeapHashSet<Member<LayoutObject>> ObjectSet; - void AddFixedPositionObject(LayoutObject&); - void RemoveFixedPositionObject(LayoutObject&); - const ObjectSet* FixedPositionObjects() const { - return fixed_position_objects_; - } - bool HasFixedPositionObjects() const { - return fixed_position_objects_ && fixed_position_objects_->size() > 0; - } - // Objects with background-attachment:fixed. + typedef HeapHashSet<Member<LayoutObject>> ObjectSet; void AddBackgroundAttachmentFixedObject(LayoutObject*); void RemoveBackgroundAttachmentFixedObject(LayoutObject*); bool RequiresMainThreadScrollingForBackgroundAttachmentFixed() const; @@ -1063,7 +1053,6 @@ Member<ScrollableAreaSet> animating_scrollable_areas_; // Scrollable areas which are user-scrollable, whether they overflow or not. Member<ScrollableAreaSet> user_scrollable_areas_; - Member<ObjectSet> fixed_position_objects_; ObjectSet background_attachment_fixed_objects_; Member<FrameViewAutoSizeInfo> auto_size_info_;
diff --git a/third_party/blink/renderer/core/frame/visual_viewport_test.cc b/third_party/blink/renderer/core/frame/visual_viewport_test.cc index 90356810..fdbe711 100644 --- a/third_party/blink/renderer/core/frame/visual_viewport_test.cc +++ b/third_party/blink/renderer/core/frame/visual_viewport_test.cc
@@ -2135,7 +2135,7 @@ // A resize will do a layout synchronously so manually check that we don't // setNeedsLayout from viewportSizeChanged. - document->View()->ViewportSizeChanged(false, true); + document->View()->ViewportSizeChanged(); unsigned needs_layout_objects = 0; unsigned total_objects = 0; bool is_subtree = false;
diff --git a/third_party/blink/renderer/core/inspector/main_thread_debugger_test.cc b/third_party/blink/renderer/core/inspector/main_thread_debugger_test.cc index ef5afc2..eaf01e9 100644 --- a/third_party/blink/renderer/core/inspector/main_thread_debugger_test.cc +++ b/third_party/blink/renderer/core/inspector/main_thread_debugger_test.cc
@@ -32,7 +32,7 @@ // The following steps would cause either style update or layout, it should // never crash. - document.View()->ViewportSizeChanged(true, true); + document.View()->ViewportSizeChanged(); document.View()->UpdateAllLifecyclePhases(DocumentUpdateReason::kTest); document.UpdateStyleAndLayout(DocumentUpdateReason::kTest); document.UpdateStyleAndLayoutTree();
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index d975ea4e..118d0333 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -501,8 +501,6 @@ if (!DocumentBeingDestroyed()) { DisassociatePhysicalFragments(); - if (IsFixedPositioned()) - GetFrameView()->RemoveFixedPositionObject(*this); } SetSnapContainer(nullptr); @@ -734,19 +732,6 @@ } } - if (LocalFrameView* frame_view = View()->GetFrameView()) { - bool new_style_is_fixed_position = - StyleRef().GetPosition() == EPosition::kFixed; - bool old_style_is_fixed_position = - old_style && old_style->GetPosition() == EPosition::kFixed; - if (new_style_is_fixed_position != old_style_is_fixed_position) { - if (new_style_is_fixed_position && Layer()) - frame_view->AddFixedPositionObject(*this); - else - frame_view->RemoveFixedPositionObject(*this); - } - } - // Update the script style map, from the new computed style. if (IsCustomItem()) GetCustomLayoutChild()->styleMap()->UpdateStyle(GetDocument(), StyleRef());
diff --git a/third_party/blink/renderer/core/page/build.gni b/third_party/blink/renderer/core/page/build.gni index bdcb80a..a581debdc 100644 --- a/third_party/blink/renderer/core/page/build.gni +++ b/third_party/blink/renderer/core/page/build.gni
@@ -78,7 +78,6 @@ "scrolling/scroll_customization_callbacks.h", "scrolling/scroll_state.cc", "scrolling/scroll_state.h", - "scrolling/scroll_state_callback.cc", "scrolling/scroll_state_callback.h", "scrolling/scrolling_coordinator.cc", "scrolling/scrolling_coordinator.h",
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state.cc b/third_party/blink/renderer/core/page/scrolling/scroll_state.cc index 929e0c0..0b8cf271 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state.cc +++ b/third_party/blink/renderer/core/page/scrolling/scroll_state.cc
@@ -6,7 +6,6 @@ #include <memory> -#include "third_party/blink/renderer/bindings/core/v8/v8_scroll_state_init.h" #include "third_party/blink/renderer/core/dom/dom_node_ids.h" #include "third_party/blink/renderer/core/dom/element.h" #include "third_party/blink/renderer/core/layout/layout_object.h" @@ -24,29 +23,6 @@ } // namespace -ScrollState* ScrollState::Create(ScrollStateInit* init) { - std::unique_ptr<ScrollStateData> scroll_state_data = - std::make_unique<ScrollStateData>(); - scroll_state_data->delta_x = init->deltaX(); - scroll_state_data->delta_y = init->deltaY(); - scroll_state_data->delta_x_hint = init->deltaXHint(); - scroll_state_data->delta_y_hint = init->deltaYHint(); - scroll_state_data->position_x = init->positionX(); - scroll_state_data->position_y = init->positionY(); - scroll_state_data->velocity_x = init->velocityX(); - scroll_state_data->velocity_y = init->velocityY(); - scroll_state_data->is_beginning = init->isBeginning(); - scroll_state_data->is_in_inertial_phase = init->isInInertialPhase(); - scroll_state_data->is_ending = init->isEnding(); - scroll_state_data->from_user_input = init->fromUserInput(); - scroll_state_data->is_direct_manipulation = init->isDirectManipulation(); - scroll_state_data->delta_granularity = - static_cast<ui::ScrollGranularity>(init->deltaGranularity()); - ScrollState* scroll_state = - MakeGarbageCollected<ScrollState>(std::move(scroll_state_data)); - return scroll_state; -} - ScrollState::ScrollState(std::unique_ptr<ScrollStateData> data) : data_(std::move(data)) {}
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state.h b/third_party/blink/renderer/core/page/scrolling/scroll_state.h index 19422624..cda6512a 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state.h +++ b/third_party/blink/renderer/core/page/scrolling/scroll_state.h
@@ -11,22 +11,17 @@ #include "third_party/blink/renderer/core/dom/node.h" #include "third_party/blink/renderer/core/scroll/scroll_state_data.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" -#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/wtf/deque.h" #include "third_party/blink/renderer/platform/wtf/forward.h" namespace blink { -class ScrollStateInit; - -class CORE_EXPORT ScrollState final : public ScriptWrappable { - DEFINE_WRAPPERTYPEINFO(); - +// TODO(crbug.com/1369739): Remove this class. +class CORE_EXPORT ScrollState final : public GarbageCollected<ScrollState> { public: - static ScrollState* Create(ScrollStateInit*); - explicit ScrollState(std::unique_ptr<ScrollStateData>); - ~ScrollState() override = default; + ~ScrollState() = default; // Web exposed methods. @@ -94,10 +89,7 @@ ScrollStateData* Data() const { return data_.get(); } - void Trace(Visitor* visitor) const override { - visitor->Trace(node_); - ScriptWrappable::Trace(visitor); - } + void Trace(Visitor* visitor) const { visitor->Trace(node_); } private: ScrollState() = delete;
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state.idl b/third_party/blink/renderer/core/page/scrolling/scroll_state.idl deleted file mode 100644 index d21dee93..0000000 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state.idl +++ /dev/null
@@ -1,28 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://docs.google.com/document/d/1VnvAqeWFG9JFZfgG5evBqrLGDZYRE5w6G5jEDORekPY - -[ - Exposed=Window, - RuntimeEnabled=ScrollCustomization -] interface ScrollState -{ - constructor(optional ScrollStateInit scrollStateInit = {}); - readonly attribute double deltaX; - readonly attribute double deltaY; - readonly attribute long positionX; - readonly attribute long positionY; - readonly attribute double velocityX; - readonly attribute double velocityY; - readonly attribute boolean isBeginning; - readonly attribute boolean inInertialPhase; - readonly attribute boolean isEnding; - readonly attribute boolean fromUserInput; - readonly attribute boolean isDirectManipulation; - readonly attribute double deltaGranularity; - - [RaisesException] void consumeDelta(double x, double y); - void distributeToScrollChainDescendant(); -};
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.cc b/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.cc deleted file mode 100644 index 3178f7b..0000000 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.cc +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2015 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h" - -#include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" - -namespace blink { - -void ScrollStateCallbackV8Impl::Trace(Visitor* visitor) const { - visitor->Trace(callback_); - ScrollStateCallback::Trace(visitor); -} - -void ScrollStateCallbackV8Impl::Invoke(ScrollState* scroll_state) { - callback_->InvokeAndReportException(nullptr, scroll_state); -} - -NativeScrollBehavior ScrollStateCallbackV8Impl::ParseNativeScrollBehavior( - const String& native_scroll_behavior) { - static const char kDisable[] = "disable-native-scroll"; - static const char kBefore[] = "perform-before-native-scroll"; - static const char kAfter[] = "perform-after-native-scroll"; - - if (native_scroll_behavior == kDisable) - return NativeScrollBehavior::kDisableNativeScroll; - if (native_scroll_behavior == kBefore) - return NativeScrollBehavior::kPerformBeforeNativeScroll; - if (native_scroll_behavior == kAfter) - return NativeScrollBehavior::kPerformAfterNativeScroll; - - NOTREACHED(); - return NativeScrollBehavior::kDisableNativeScroll; -} - -} // namespace blink
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h b/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h index 26f2889..9ca0cb64 100644 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h +++ b/third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h
@@ -5,7 +5,6 @@ #ifndef THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLL_STATE_CALLBACK_H_ #define THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLL_STATE_CALLBACK_H_ -#include "third_party/blink/renderer/bindings/core/v8/v8_scroll_state_callback.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" namespace blink { @@ -18,6 +17,7 @@ kPerformAfterNativeScroll, }; +// TODO(crbug.com/1369739): Remove this class. class ScrollStateCallback : public GarbageCollected<ScrollStateCallback> { public: virtual ~ScrollStateCallback() = default; @@ -40,33 +40,6 @@ const enum NativeScrollBehavior native_scroll_behavior_; }; -class ScrollStateCallbackV8Impl : public ScrollStateCallback { - public: - static ScrollStateCallbackV8Impl* Create( - V8ScrollStateCallback* callback, - const String& native_scroll_behavior) { - DCHECK(callback); - return MakeGarbageCollected<ScrollStateCallbackV8Impl>( - callback, ParseNativeScrollBehavior(native_scroll_behavior)); - } - - explicit ScrollStateCallbackV8Impl( - V8ScrollStateCallback* callback, - enum NativeScrollBehavior native_scroll_behavior) - : ScrollStateCallback(native_scroll_behavior), callback_(callback) {} - ~ScrollStateCallbackV8Impl() override = default; - - void Trace(Visitor*) const override; - - void Invoke(ScrollState*) override; - - private: - static enum NativeScrollBehavior ParseNativeScrollBehavior( - const String& native_scroll_behavior); - - Member<V8ScrollStateCallback> callback_; -}; - } // namespace blink #endif // THIRD_PARTY_BLINK_RENDERER_CORE_PAGE_SCROLLING_SCROLL_STATE_CALLBACK_H_
diff --git a/third_party/blink/renderer/core/page/scrolling/scroll_state_init.idl b/third_party/blink/renderer/core/page/scrolling/scroll_state_init.idl deleted file mode 100644 index 45ac5b8..0000000 --- a/third_party/blink/renderer/core/page/scrolling/scroll_state_init.idl +++ /dev/null
@@ -1,23 +0,0 @@ -// Copyright 2016 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://docs.google.com/document/d/1VnvAqeWFG9JFZfgG5evBqrLGDZYRE5w6G5jEDORekPY - -dictionary ScrollStateInit { - double deltaX = 0; - double deltaY = 0; - double deltaXHint = 0; - double deltaYHint = 0; - long positionX = 0; - long positionY = 0; - double velocityX = 0; - double velocityY = 0; - boolean isBeginning = false; - boolean isInInertialPhase = false; - boolean isEnding = false; - boolean shouldPropagate = true; - boolean fromUserInput = false; - boolean isDirectManipulation = false; - double deltaGranularity = 0; -};
diff --git a/third_party/blink/renderer/core/page/scrolling/viewport_scroll_callback.h b/third_party/blink/renderer/core/page/scrolling/viewport_scroll_callback.h index 7d31bfb..2bcd64d 100644 --- a/third_party/blink/renderer/core/page/scrolling/viewport_scroll_callback.h +++ b/third_party/blink/renderer/core/page/scrolling/viewport_scroll_callback.h
@@ -8,6 +8,7 @@ #include "third_party/blink/renderer/core/page/scrolling/scroll_state_callback.h" #include "third_party/blink/renderer/core/scroll/scroll_types.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" +#include "third_party/blink/renderer/platform/heap/member.h" #include "ui/events/types/scroll_types.h" namespace blink {
diff --git a/third_party/blink/renderer/core/paint/box_painter_base.cc b/third_party/blink/renderer/core/paint/box_painter_base.cc index d7f4e22d..b5679779 100644 --- a/third_party/blink/renderer/core/paint/box_painter_base.cc +++ b/third_party/blink/renderer/core/paint/box_painter_base.cc
@@ -133,6 +133,80 @@ return element_animations->CompositedBackgroundColorStatus(); } +void ClipToBorderEdge(GraphicsContext& context, + const FloatRoundedRect& border, + bool has_border_radius, + bool has_opaque_background) { + FloatRoundedRect rect_to_clip_out = border; + + // If the box is opaque, it is unnecessary to clip it out. However, + // doing so saves time when painting the shadow. On the other hand, it + // introduces subpixel gaps along the corners / edges. Those are avoided + // by insetting the clipping path by one CSS pixel. + if (has_opaque_background) { + rect_to_clip_out.Inset(1); + } + + if (has_border_radius) { + if (!rect_to_clip_out.IsEmpty()) { + context.ClipOutRoundedRect(rect_to_clip_out); + } + } else { + if (!rect_to_clip_out.IsEmpty()) { + context.ClipOut(rect_to_clip_out.Rect()); + } + } +} + +void ClipToSides(GraphicsContext& context, + const FloatRoundedRect& border, + const ShadowData& shadow, + PhysicalBoxSides sides_to_include) { + // Create a "pseudo-infinite" clip rectangle that should be large enough to + // contain shadows on all four sides, including blur. Clip to the original + // box for the sides that are excluded in this fragment. + gfx::OutsetsF shadow_outsets = shadow.RectOutsets(); + // If an edge is not included, then reset the outset on that edge. + if (!sides_to_include.left) { + shadow_outsets.set_left(0); + } + if (!sides_to_include.top) { + shadow_outsets.set_top(0); + } + if (!sides_to_include.right) { + shadow_outsets.set_right(0); + } + if (!sides_to_include.bottom) { + shadow_outsets.set_bottom(0); + } + gfx::RectF keep = border.Rect(); + keep.Outset(shadow_outsets); + context.Clip(keep); +} + +void AdjustRectForSideClipping(gfx::RectF& rect, + const ShadowData& shadow, + PhysicalBoxSides sides_to_include) { + if (!sides_to_include.left) { + float extend_by = std::max(shadow.X(), 0.0f) + shadow.Blur(); + rect.Offset(-extend_by, 0); + rect.set_width(rect.width() + extend_by); + } + if (!sides_to_include.top) { + float extend_by = std::max(shadow.Y(), 0.0f) + shadow.Blur(); + rect.Offset(0, -extend_by); + rect.set_height(rect.height() + extend_by); + } + if (!sides_to_include.right) { + float shrink_by = std::min(shadow.X(), 0.0f) - shadow.Blur(); + rect.set_width(rect.width() - shrink_by); + } + if (!sides_to_include.bottom) { + float shrink_by = std::min(shadow.Y(), 0.0f) - shadow.Blur(); + rect.set_height(rect.height() - shrink_by); + } +} + } // namespace void BoxPainterBase::PaintNormalBoxShadow(const PaintInfo& info, @@ -189,38 +263,19 @@ // The clip does not depend on any shadow-specific properties. if (!state_saver.Saved()) { state_saver.Save(); + ClipToBorderEdge(context, border, has_border_radius, + has_opaque_background); + } - FloatRoundedRect rect_to_clip_out = border; + // Recompute the shadow shape so that spread isn't applied twice in the + // border-radius case. + fill_rect = border.Rect(); - // If the box is opaque, it is unnecessary to clip it out. However, - // doing so saves time when painting the shadow. On the other hand, it - // introduces subpixel gaps along the corners / edges. Those are avoided - // by insetting the clipping path by one CSS pixel. - if (has_opaque_background) - rect_to_clip_out.Inset(1); - - if (has_border_radius) { - if (!rect_to_clip_out.IsEmpty()) - context.ClipOutRoundedRect(rect_to_clip_out); - } else { - if (!rect_to_clip_out.IsEmpty()) - context.ClipOut(rect_to_clip_out.Rect()); - } - - if (!sides_to_include.HasAllSides()) { - // Create a "pseudo-infinite" clip rectangle that should be large enough - // to contain shadows on all four sides, including blur. Clip to the - // border box for the sides that are excluded in this fragment. - gfx::RectF keep = fill_rect + shadow_offset; - keep.Outset(shadow_blur * 3); - const gfx::RectF& clip = border.Rect(); - - float left = sides_to_include.left ? keep.x() : clip.x(); - float top = sides_to_include.top ? keep.y() : clip.y(); - float right = sides_to_include.right ? keep.right() : clip.right(); - float bottom = sides_to_include.bottom ? keep.bottom() : clip.bottom(); - context.Clip(gfx::RectF(left, top, right - left, bottom - top)); - } + GraphicsContextStateSaver sides_clip_saver(context, false); + if (!sides_to_include.HasAllSides()) { + sides_clip_saver.Save(); + ClipToSides(context, border, shadow, sides_to_include); + AdjustRectForSideClipping(fill_rect, shadow, sides_to_include); } // Draw only the shadow. If the color of the shadow is transparent we will @@ -232,12 +287,13 @@ context.SetDrawLooper(draw_looper_builder.DetachDrawLooper()); if (has_border_radius) { - FloatRoundedRect rounded_fill_rect = border; + FloatRoundedRect rounded_fill_rect(fill_rect, border.GetRadii()); ApplySpreadToShadowShape(rounded_fill_rect, shadow_spread); context.FillRoundedRect( rounded_fill_rect, Color::kBlack, PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground)); } else { + fill_rect.Outset(shadow_spread); context.FillRect( fill_rect, Color::kBlack, PaintAutoDarkMode(style, DarkModeFilter::ElementRole::kBackground)); @@ -283,29 +339,6 @@ return gfx::UnionRects(bounds, offset_bounds); } -void AdjustInnerRectForSideClipping(gfx::RectF& inner_rect, - const ShadowData& shadow, - PhysicalBoxSides sides_to_include) { - if (!sides_to_include.left) { - float extend_by = std::max(shadow.X(), 0.0f) + shadow.Blur(); - inner_rect.Offset(-extend_by, 0); - inner_rect.set_width(inner_rect.width() + extend_by); - } - if (!sides_to_include.top) { - float extend_by = std::max(shadow.Y(), 0.0f) + shadow.Blur(); - inner_rect.Offset(0, -extend_by); - inner_rect.set_height(inner_rect.height() + extend_by); - } - if (!sides_to_include.right) { - float shrink_by = std::min(shadow.X(), 0.0f) - shadow.Blur(); - inner_rect.set_width(inner_rect.width() - shrink_by); - } - if (!sides_to_include.bottom) { - float shrink_by = std::min(shadow.Y(), 0.0f) - shadow.Blur(); - inner_rect.set_height(inner_rect.height() - shrink_by); - } -} - } // namespace void BoxPainterBase::PaintInsetBoxShadow(const PaintInfo& info, @@ -336,7 +369,7 @@ : resolved_shadow_color; gfx::RectF inner_rect = bounds.Rect(); - AdjustInnerRectForSideClipping(inner_rect, shadow, sides_to_include); + AdjustRectForSideClipping(inner_rect, shadow, sides_to_include); FloatRoundedRect inner_rounded_rect(inner_rect, bounds.GetRadii()); ApplySpreadToShadowShape(inner_rounded_rect, -shadow.Spread()); if (inner_rounded_rect.IsEmpty()) {
diff --git a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc index b705a36..c472d63 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.cc
@@ -10,6 +10,7 @@ #include "third_party/blink/renderer/core/layout/ng/inline/ng_inline_cursor.h" #include "third_party/blink/renderer/core/layout/ng/ng_fragment.h" #include "third_party/blink/renderer/core/paint/background_image_geometry.h" +#include "third_party/blink/renderer/core/paint/nine_piece_image_painter.h" #include "third_party/blink/renderer/core/paint/object_painter.h" #include "third_party/blink/renderer/core/paint/paint_info.h" #include "third_party/blink/renderer/core/paint/paint_layer.h" @@ -58,15 +59,20 @@ paint_info.context, inline_box_item_.FragmentId()); const LayoutObject& layout_object = *inline_box_fragment_.GetLayoutObject(); absl::optional<ScopedSVGPaintState> svg_paint_state; - if (layout_object.IsSVGInline()) - svg_paint_state.emplace(layout_object, paint_info); - const PhysicalOffset adjusted_paint_offset = paint_offset + inline_box_item_.OffsetInContainerFragment(); - if (paint_info.phase == PaintPhase::kForeground && - !layout_object.IsSVGInline()) - PaintBackgroundBorderShadow(paint_info, adjusted_paint_offset); + if (!layout_object.IsSVGInline()) { + if (paint_info.phase == PaintPhase::kMask) { + PaintMask(paint_info, adjusted_paint_offset); + return; + } + if (paint_info.phase == PaintPhase::kForeground) { + PaintBackgroundBorderShadow(paint_info, adjusted_paint_offset); + } + } else { + svg_paint_state.emplace(layout_object, paint_info); + } const bool suppress_box_decoration_background = true; DCHECK(inline_context_); NGInlinePaintContext::ScopedInlineItem scoped_item(inline_box_item_, @@ -78,6 +84,60 @@ suppress_box_decoration_background); } +void NGInlineBoxFragmentPainter::PaintMask(const PaintInfo& paint_info, + const PhysicalOffset& paint_offset) { + DCHECK_EQ(PaintPhase::kMask, paint_info.phase); + if (!style_.HasMask() || style_.Visibility() != EVisibility::kVisible) { + return; + } + + const DisplayItemClient& display_item_client = GetDisplayItemClient(); + if (DrawingRecorder::UseCachedDrawingIfPossible( + paint_info.context, display_item_client, paint_info.phase)) { + return; + } + + DrawingRecorder recorder(paint_info.context, display_item_client, + paint_info.phase, VisualRect(paint_offset)); + PhysicalRect adjusted_frame_rect(paint_offset, + inline_box_fragment_.LocalRect().size); + + const LayoutObject& layout_object = *inline_box_fragment_.GetLayoutObject(); + bool object_may_have_multiple_boxes = + MayHaveMultipleFragmentItems(inline_box_item_, layout_object); + + DCHECK(inline_box_cursor_); + NGBoxFragmentPainter box_painter(*inline_box_cursor_, inline_box_item_, + PhysicalFragment(), inline_context_); + + BackgroundImageGeometry geometry( + static_cast<const LayoutBoxModelObject&>(layout_object)); + PaintFillLayers(box_painter, paint_info, Color::kTransparent, + style_.MaskLayers(), adjusted_frame_rect, geometry, + object_may_have_multiple_boxes); + + gfx::Rect adjusted_clip_rect; + SlicePaintingType border_painting_type = + GetSlicePaintType(style_.MaskBoxImage(), adjusted_frame_rect, + adjusted_clip_rect, object_may_have_multiple_boxes); + if (border_painting_type == kDontPaint) { + return; + } + GraphicsContextStateSaver state_saver(paint_info.context, false); + PhysicalRect adjusted_paint_rect; + if (border_painting_type == kPaintWithClip) { + state_saver.Save(); + paint_info.context.Clip(adjusted_clip_rect); + adjusted_paint_rect = + PaintRectForImageStrip(adjusted_frame_rect, style_.Direction()); + } else { + adjusted_paint_rect = adjusted_frame_rect; + } + NinePieceImagePainter::Paint(paint_info.context, image_observer_, *document_, + node_, adjusted_paint_rect, style_, + style_.MaskBoxImage(), SidesToInclude()); +} + void NGInlineBoxFragmentPainterBase::PaintBackgroundBorderShadow( const PaintInfo& paint_info, const PhysicalOffset& paint_offset) { @@ -270,35 +330,46 @@ return clip_rect; } -NGInlineBoxFragmentPainterBase::BorderPaintingType +NGInlineBoxFragmentPainterBase::SlicePaintingType NGInlineBoxFragmentPainterBase::GetBorderPaintType( const PhysicalRect& adjusted_frame_rect, gfx::Rect& adjusted_clip_rect, bool object_has_multiple_boxes) const { const ComputedStyle& style = inline_box_fragment_.Style(); - if (!style.HasBorderDecoration()) - return kDontPaintBorders; + if (!style.HasBorderDecoration()) { + return kDontPaint; + } + return GetSlicePaintType(style.BorderImage(), adjusted_frame_rect, + adjusted_clip_rect, object_has_multiple_boxes); +} - const NinePieceImage& border_image = style.BorderImage(); - StyleImage* border_image_source = border_image.GetImage(); - bool has_border_image = - border_image_source && border_image_source->CanRender(); - if (has_border_image && !border_image_source->IsLoaded()) - return kDontPaintBorders; +NGInlineBoxFragmentPainterBase::SlicePaintingType +NGInlineBoxFragmentPainterBase::GetSlicePaintType( + const NinePieceImage& nine_piece_image, + const PhysicalRect& adjusted_frame_rect, + gfx::Rect& adjusted_clip_rect, + bool object_has_multiple_boxes) const { + StyleImage* nine_piece_image_source = nine_piece_image.GetImage(); + bool has_nine_piece_image = + nine_piece_image_source && nine_piece_image_source->CanRender(); + if (has_nine_piece_image && !nine_piece_image_source->IsLoaded()) { + return kDontPaint; + } // The simple case is where we either have no border image or we are the // only box for this object. In those cases only a single call to draw is // required. - if (!has_border_image || !object_has_multiple_boxes || + const ComputedStyle& style = inline_box_fragment_.Style(); + if (!has_nine_piece_image || !object_has_multiple_boxes || style.BoxDecorationBreak() == EBoxDecorationBreak::kClone) { adjusted_clip_rect = ToPixelSnappedRect(adjusted_frame_rect); - return kPaintBordersWithoutClip; + return kPaintWithoutClip; } // We have a border image that spans multiple lines. adjusted_clip_rect = ToPixelSnappedRect(ClipRectForNinePieceImageStrip( - style, SidesToInclude(), border_image, adjusted_frame_rect)); - return kPaintBordersWithClip; + style, SidesToInclude(), nine_piece_image, adjusted_frame_rect)); + return kPaintWithClip; } void NGInlineBoxFragmentPainterBase::PaintNormalBoxShadow( @@ -336,17 +407,17 @@ PaintInsetBoxShadow(paint_info, line_style_, adjusted_frame_rect); gfx::Rect adjusted_clip_rect; - BorderPaintingType border_painting_type = GetBorderPaintType( + SlicePaintingType border_painting_type = GetBorderPaintType( adjusted_frame_rect, adjusted_clip_rect, object_has_multiple_boxes); switch (border_painting_type) { - case kDontPaintBorders: + case kDontPaint: break; - case kPaintBordersWithoutClip: + case kPaintWithoutClip: BoxPainterBase::PaintBorder(image_observer_, *document_, node_, paint_info, adjusted_frame_rect, line_style_, kBackgroundBleedNone, sides_to_include); break; - case kPaintBordersWithClip: + case kPaintWithClip: // FIXME: What the heck do we do with RTL here? The math we're using is // obviously not right, but it isn't even clear how this should work at // all.
diff --git a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h index 85a3861..d2d5cc2 100644 --- a/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h +++ b/third_party/blink/renderer/core/paint/ng/ng_inline_box_fragment_painter.h
@@ -88,14 +88,18 @@ const NinePieceImage& image, const PhysicalRect& paint_rect); - enum BorderPaintingType { - kDontPaintBorders, - kPaintBordersWithoutClip, - kPaintBordersWithClip + enum SlicePaintingType { + kDontPaint, + kPaintWithoutClip, + kPaintWithClip, }; - BorderPaintingType GetBorderPaintType(const PhysicalRect& adjusted_frame_rect, - gfx::Rect& adjusted_clip_rect, - bool object_has_multiple_boxes) const; + SlicePaintingType GetBorderPaintType(const PhysicalRect& adjusted_frame_rect, + gfx::Rect& adjusted_clip_rect, + bool object_has_multiple_boxes) const; + SlicePaintingType GetSlicePaintType(const NinePieceImage&, + const PhysicalRect& adjusted_frame_rect, + gfx::Rect& adjusted_clip_rect, + bool object_has_multiple_boxes) const; void PaintNormalBoxShadow(const PaintInfo&, const ComputedStyle&, @@ -184,6 +188,8 @@ const PaintInfo&); private: + void PaintMask(const PaintInfo&, const PhysicalOffset& paint_offset); + const NGPhysicalBoxFragment& PhysicalFragment() const { return static_cast<const NGPhysicalBoxFragment&>(inline_box_fragment_); }
diff --git a/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc b/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc index 94b128f..bcaed246 100644 --- a/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc +++ b/third_party/blink/renderer/core/paint/timing/paint_timing_detector.cc
@@ -622,9 +622,13 @@ image_paint_timing_detector_->UpdateMetricsCandidate(); } - lcp_calculator->UpdateWebExposedLargestContentfulPaintIfNeeded( - largest_text_record, largest_image_record, - /*is_triggered_by_soft_navigation=*/lcp_was_restarted_); + // If we're still recording the initial LCP, or if LCP was explicitly + // restarted for soft navigations, fire the web exposed entry. + if (record_lcp_to_metrics_ || lcp_was_restarted_) { + lcp_calculator->UpdateWebExposedLargestContentfulPaintIfNeeded( + largest_text_record, largest_image_record, + /*is_triggered_by_soft_navigation=*/lcp_was_restarted_); + } } void PaintTimingDetector::ReportIgnoredContent() {
diff --git a/third_party/blink/renderer/core/testing/internals.idl b/third_party/blink/renderer/core/testing/internals.idl index 29c39e3..6588086 100644 --- a/third_party/blink/renderer/core/testing/internals.idl +++ b/third_party/blink/renderer/core/testing/internals.idl
@@ -341,7 +341,6 @@ UnionTypesTest unionTypesTest(); InternalsUkmRecorder initializeUKMRecorder(); CallbackFunctionTest callbackFunctionTest(); - [RaisesException] void setScrollChain(ScrollState scrollState, sequence<Element> elements); DOMString selectedHTMLForClipboard(); DOMString selectedTextForClipboard();
diff --git a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc index 81ed436..7b97747 100644 --- a/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc +++ b/third_party/blink/renderer/core/view_transition/view_transition_style_tracker.cc
@@ -1153,6 +1153,7 @@ auto* resize_observer_entry = MakeGarbageCollected<ResizeObserverEntry>( To<Element>(layout_object.GetNode())); auto entry_size = resize_observer_entry->borderBoxSize()[0]; + // ResizeObserver gives us CSS space pixels. border_box_size_in_css_space = layout_object.IsHorizontalWritingMode() ? PhysicalSize(LayoutUnit(entry_size->inlineSize()), @@ -1162,6 +1163,9 @@ } else if (auto* box_model = DynamicTo<LayoutBoxModelObject>(layout_object)) { border_box_size_in_css_space = PhysicalSize(box_model->BorderBoundingBox().size()); + // Size BorderBoundingBox is in Layout space, we need to convert to CSS + // space. + border_box_size_in_css_space.Scale(1.f / device_pixel_ratio_); } // If the object's effective zoom differs from device_pixel_ratio, adjust
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 3e88e4d..0ebf6ca 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
@@ -1452,10 +1452,6 @@ } } - CHECK(IsProcessingDeferredEvents()) - << "Only create AXObjects while processing AX events and tree: " << node - << " " << layout_object; - AXID axid = GenerateAXID(); DCHECK(!base::Contains(objects_, axid)); @@ -2650,11 +2646,13 @@ } void AXObjectCacheImpl::CheckTreeIsUpdated() const { - CHECK(nodes_with_pending_children_changed_.empty()); - CHECK(tree_update_callback_queue_main_.empty()); - CHECK(tree_update_callback_queue_popup_.empty()); - CHECK(invalidated_ids_main_.empty()); - CHECK(invalidated_ids_popup_.empty()); + // TODO(crbug.com/1480442) Add back as once we implement improved tree repair + // in crrev.com/c/4873421. + // CHECK(nodes_with_pending_children_changed_.empty()); + // CHECK(tree_update_callback_queue_main_.empty()); + // CHECK(tree_update_callback_queue_popup_.empty()); + // CHECK(invalidated_ids_main_.empty()); + // CHECK(invalidated_ids_popup_.empty()); #if DCHECK_IS_ON() for (const auto& entry : objects_) { @@ -2692,18 +2690,6 @@ } } } -#else - // TODO(crbug.com/1480627) Temporary: do not ship in stable builds. - for (const auto& entry : objects_) { - const AXObject* object = entry.value; - CHECK(!object->IsDetached()); - CHECK(!object->IsMissingParent()) - << "No object should be missing its parent: " - << "\n* Object: " << object->ToString(true, true) - << "\n* Computed parent: " - << (object->ComputeParent() ? object->ComputeParent()->ToString(true) - : "not found"); - } #endif }
diff --git a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path.cc b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path.cc index 827543d..a1403ce89 100644 --- a/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path.cc +++ b/third_party/blink/renderer/modules/canvas/canvas2d/canvas_path.cc
@@ -51,6 +51,22 @@ if (UNLIKELY(IsEmpty())) { return; } + // If the current path is a zero lengthed path (ex: moveTo p1 and lineTo p1), + // then closePath is no op. + if (UNLIKELY(path_.BoundingRect().height() == 0 && + path_.BoundingRect().width() == 0 && + (IsLine() && line_builder_.BoundingRect().height() == 0 && + line_builder_.BoundingRect().width() == 0))) { + if (!path_.HasCurrentPoint()) { + Clear(); + return; + } + auto p = path_.CurrentPoint(); + Clear(); + moveTo(p.x(), p.y()); + return; + } + UpdatePathFromLineIfNecessaryForMutation(); if (UNLIKELY(identifiability_study_helper_.ShouldUpdateBuilder())) { identifiability_study_helper_.UpdateBuilder(CanvasOps::kClosePath);
diff --git a/third_party/blink/renderer/modules/compute_pressure/pressure_client_impl.cc b/third_party/blink/renderer/modules/compute_pressure/pressure_client_impl.cc index d71f4b40..9e1affbc 100644 --- a/third_party/blink/renderer/modules/compute_pressure/pressure_client_impl.cc +++ b/third_party/blink/renderer/modules/compute_pressure/pressure_client_impl.cc
@@ -155,13 +155,13 @@ return false; } - // 9. If origin is same origin-domain with focused document, return true. + // 9. If origin is same origin with focused document, return true. // 10. Otherwise, return false. const SecurityOrigin* focused_frame_origin = focused_frame->GetSecurityContext()->GetSecurityOrigin(); const SecurityOrigin* this_origin = this_frame->GetSecurityContext()->GetSecurityOrigin(); - return focused_frame_origin->CanAccess(this_origin); + return focused_frame_origin->IsSameOriginWith(this_origin); } } // namespace blink
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc index b31f552..2f1f0dd7 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.cc
@@ -14,15 +14,20 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_typedefs.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_payment_inputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_values.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authenticator_selection_criteria.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_cable_authentication_data.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_logout_r_ps_request.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_context.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_mode.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_provider_config.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_user_info.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_creation_options.h" @@ -88,6 +93,7 @@ using blink::mojom::blink::RemoteDesktopClientOverridePtr; using blink::mojom::blink::ResidentKeyRequirement; using blink::mojom::blink::RpContext; +using blink::mojom::blink::RpMode; using blink::mojom::blink::UserVerificationRequirement; using blink::mojom::blink::WalletFieldRequirement; using blink::mojom::blink::WalletFieldRequirementPtr; @@ -170,6 +176,92 @@ return nullptr; } +static blink::DOMArrayBuffer* VectorToDOMArrayBuffer( + const Vector<uint8_t> buffer) { + return blink::DOMArrayBuffer::Create(static_cast<const void*>(buffer.data()), + buffer.size()); +} + +#if BUILDFLAG(IS_ANDROID) +static Vector<Vector<uint32_t>> UvmEntryToArray( + const Vector<blink::mojom::blink::UvmEntryPtr>& user_verification_methods) { + Vector<Vector<uint32_t>> uvm_array; + for (const auto& uvm : user_verification_methods) { + Vector<uint32_t> uvmEntry = {uvm->user_verification_method, + uvm->key_protection_type, + uvm->matcher_protection_type}; + uvm_array.push_back(uvmEntry); + } + return uvm_array; +} +#endif + +// static template <> +blink::AuthenticationExtensionsClientOutputs* +TypeConverter<blink::AuthenticationExtensionsClientOutputs*, + blink::mojom::blink::AuthenticationExtensionsClientOutputsPtr>:: + Convert(const blink::mojom::blink::AuthenticationExtensionsClientOutputsPtr& + extensions) { + auto* extension_outputs = + blink::AuthenticationExtensionsClientOutputs::Create(); + if (extensions->echo_appid_extension) { + extension_outputs->setAppid(extensions->appid_extension); + } +#if BUILDFLAG(IS_ANDROID) + if (extensions->echo_user_verification_methods) { + extension_outputs->setUvm( + UvmEntryToArray(std::move(*extensions->user_verification_methods))); + } +#endif + if (extensions->echo_large_blob) { + DCHECK(blink::RuntimeEnabledFeatures:: + WebAuthenticationLargeBlobExtensionEnabled()); + blink::AuthenticationExtensionsLargeBlobOutputs* large_blob_outputs = + blink::AuthenticationExtensionsLargeBlobOutputs::Create(); + if (extensions->large_blob) { + large_blob_outputs->setBlob( + VectorToDOMArrayBuffer(std::move(*extensions->large_blob))); + } + if (extensions->echo_large_blob_written) { + large_blob_outputs->setWritten(extensions->large_blob_written); + } + extension_outputs->setLargeBlob(large_blob_outputs); + } + if (extensions->get_cred_blob) { + extension_outputs->setGetCredBlob( + VectorToDOMArrayBuffer(std::move(*extensions->get_cred_blob))); + } + if (extensions->device_public_key) { + blink::AuthenticationExtensionsDevicePublicKeyOutputs* + device_public_key_outputs = + blink::AuthenticationExtensionsDevicePublicKeyOutputs::Create(); + device_public_key_outputs->setAuthenticatorOutput(VectorToDOMArrayBuffer( + std::move(extensions->device_public_key->authenticator_output))); + device_public_key_outputs->setSignature(VectorToDOMArrayBuffer( + std::move(extensions->device_public_key->signature))); + extension_outputs->setDevicePubKey(device_public_key_outputs); + } + if (extensions->echo_prf) { + auto* prf_outputs = blink::AuthenticationExtensionsPRFOutputs::Create(); + if (extensions->prf_results) { + auto* values = blink::AuthenticationExtensionsPRFValues::Create(); + values->setFirst( + MakeGarbageCollected<blink::V8UnionArrayBufferOrArrayBufferView>( + VectorToDOMArrayBuffer( + std::move(extensions->prf_results->first)))); + if (extensions->prf_results->second) { + values->setSecond( + MakeGarbageCollected<blink::V8UnionArrayBufferOrArrayBufferView>( + VectorToDOMArrayBuffer( + std::move(extensions->prf_results->second.value())))); + } + prf_outputs->setResults(values); + } + extension_outputs->setPrf(prf_outputs); + } + return extension_outputs; +} + // static helper method. Vector<uint8_t> ConvertFixedSizeArray(const blink::V8BufferSource* buffer, unsigned length) { @@ -833,6 +925,18 @@ } } +// static +RpMode +TypeConverter<RpMode, blink::V8IdentityCredentialRequestOptionsMode>::Convert( + const blink::V8IdentityCredentialRequestOptionsMode& mode) { + switch (mode.AsEnum()) { + case blink::V8IdentityCredentialRequestOptionsMode::Enum::kWidget: + return RpMode::kWidget; + case blink::V8IdentityCredentialRequestOptionsMode::Enum::kButton: + return RpMode::kButton; + } +} + IdentityUserInfoPtr TypeConverter<IdentityUserInfoPtr, blink::IdentityUserInfo>::Convert( const blink::IdentityUserInfo& user_info) {
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h index 34555d8..026acde 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h +++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h
@@ -17,6 +17,7 @@ namespace blink { class AuthenticationExtensionsClientInputs; +class AuthenticationExtensionsClientOutputs; class AuthenticationExtensionsDevicePublicKeyInputs; class AuthenticationExtensionsPRFInputs; class AuthenticationExtensionsPRFValues; @@ -35,6 +36,7 @@ class RemoteDesktopClientOverride; class UserVerificationRequirement; class V8IdentityCredentialRequestOptionsContext; +class V8IdentityCredentialRequestOptionsMode; class V8UnionArrayBufferOrArrayBufferView; } // namespace blink @@ -55,6 +57,14 @@ const blink::mojom::blink::CredentialInfoPtr&); }; +template <> +struct MODULES_EXPORT TypeConverter< + blink::AuthenticationExtensionsClientOutputs*, + blink::mojom::blink::AuthenticationExtensionsClientOutputsPtr> { + static blink::AuthenticationExtensionsClientOutputs* Convert( + const blink::mojom::blink::AuthenticationExtensionsClientOutputsPtr&); +}; + // blink::mojom::blink::Authenticator --------------------------------------- template <> struct TypeConverter<Vector<uint8_t>, @@ -222,6 +232,14 @@ }; template <> +struct MODULES_EXPORT + TypeConverter<blink::mojom::blink::RpMode, + blink::V8IdentityCredentialRequestOptionsMode> { + static blink::mojom::blink::RpMode Convert( + const blink::V8IdentityCredentialRequestOptionsMode&); +}; + +template <> struct TypeConverter<blink::mojom::blink::IdentityUserInfoPtr, blink::IdentityUserInfo> { static blink::mojom::blink::IdentityUserInfoPtr Convert(
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc index 15351e53..5285c1b 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters_unittest.cc
@@ -5,14 +5,19 @@ #include "third_party/blink/renderer/modules/credentialmanagement/credential_manager_type_converters.h" #include "mojo/public/cpp/bindings/type_converter.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/mojom/webauthn/authenticator.mojom-blink.h" #include "third_party/blink/public/mojom/webid/federated_auth_request.mojom-blink.h" #include "third_party/blink/renderer/bindings/core/v8/v8_union_arraybuffer_arraybufferview.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_client_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_device_public_key_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_large_blob_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_inputs.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_outputs.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_authentication_extensions_prf_values.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_cable_authentication_data.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_identity_credential_request_options_context.h" @@ -48,6 +53,202 @@ } TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_appidNotSet) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_appid_extension = false; + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_FALSE(blink_type->hasAppid()); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_appidSetTrue) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_appid_extension = true; + mojo_type->appid_extension = true; + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasAppid()); + EXPECT_TRUE(blink_type->appid()); +} + +#if BUILDFLAG(IS_ANDROID) +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_userVerificationMethods) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_user_verification_methods = true; + mojo_type->user_verification_methods = + Vector<blink::mojom::blink::UvmEntryPtr>(); + mojo_type->user_verification_methods->emplace_back( + blink::mojom::blink::UvmEntry::New(/*user_verification_method=*/1, + /*key_protection_type=*/2, + /*matcher_protection_type=*/3)); + mojo_type->user_verification_methods->emplace_back( + blink::mojom::blink::UvmEntry::New(/*user_verification_method=*/4, + /*key_protection_type=*/5, + /*matcher_protection_type=*/6)); + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasUvm()); + EXPECT_THAT(blink_type->uvm(), + ::testing::ElementsAre(Vector<uint32_t>{1, 2, 3}, + Vector<uint32_t>{4, 5, 6})); +} +#endif + +MATCHER_P(DOMArrayBufferEqualTo, vector, "") { + if (arg->ByteLength() != std::size(vector)) { + return false; + } + uint8_t* data = (uint8_t*)arg->Data(); + return std::equal(data, data + arg->ByteLength(), std::begin(vector)); +} + +MATCHER_P(UnionDOMArrayBufferOrViewEqualTo, vector, "") { + blink::DOMArrayBuffer* buffer = arg->IsArrayBuffer() + ? arg->GetAsArrayBuffer() + : arg->GetAsArrayBufferView()->buffer(); + if (buffer->ByteLength() != std::size(vector)) { + return false; + } + uint8_t* data = (uint8_t*)buffer->Data(); + return std::equal(data, data + buffer->ByteLength(), std::begin(vector)); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_largeBlobEmpty) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_large_blob = true; + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasLargeBlob()); + EXPECT_FALSE(blink_type->largeBlob()->hasBlob()); + EXPECT_FALSE(blink_type->largeBlob()->hasWritten()); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_largeBlobRead) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_large_blob = true; + mojo_type->large_blob = Vector<uint8_t>({1, 2, 3}); + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasLargeBlob()); + EXPECT_THAT(blink_type->largeBlob()->blob(), + DOMArrayBufferEqualTo(Vector<uint8_t>{1, 2, 3})); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_largeBlobWritten) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_large_blob = true; + mojo_type->echo_large_blob_written = true; + mojo_type->large_blob_written = true; + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasLargeBlob()); + EXPECT_TRUE(blink_type->largeBlob()->written()); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_credBlob) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->get_cred_blob = Vector<uint8_t>{1, 2, 3}; + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasGetCredBlob()); + EXPECT_THAT(blink_type->getCredBlob(), + DOMArrayBufferEqualTo(Vector<uint8_t>{1, 2, 3})); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_devicePublicKey) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->device_public_key = + blink::mojom::blink::DevicePublicKeyResponse::New( + /*authenticator_output=*/Vector<uint8_t>{1, 2, 3}, + /*signature=*/Vector<uint8_t>{4, 5, 6}); + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasDevicePubKey()); + EXPECT_TRUE(blink_type->devicePubKey()->hasAuthenticatorOutput()); + EXPECT_THAT(blink_type->devicePubKey()->authenticatorOutput(), + DOMArrayBufferEqualTo(Vector<uint8_t>{1, 2, 3})); + EXPECT_TRUE(blink_type->devicePubKey()->hasSignature()); + EXPECT_THAT(blink_type->devicePubKey()->signature(), + DOMArrayBufferEqualTo(Vector<uint8_t>{4, 5, 6})); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_prf) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_prf = true; + mojo_type->prf_results = blink::mojom::blink::PRFValues::New( + /*id=*/absl::nullopt, + /*first=*/Vector<uint8_t>{1, 2, 3}, + /*second=*/absl::nullopt); + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasPrf()); + EXPECT_TRUE(blink_type->prf()->hasResults()); + blink::AuthenticationExtensionsPRFValues* prf_results = + blink_type->prf()->results(); + EXPECT_TRUE(prf_results->hasFirst()); + EXPECT_THAT(prf_results->first(), + UnionDOMArrayBufferOrViewEqualTo(Vector<uint8_t>{1, 2, 3})); + EXPECT_FALSE(prf_results->hasSecond()); +} + +TEST(CredentialManagerTypeConvertersTest, + AuthenticationExtensionsClientOutputs_prfWithSecond) { + auto mojo_type = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + mojo_type->echo_prf = true; + mojo_type->prf_results = blink::mojom::blink::PRFValues::New( + /*id=*/absl::nullopt, + /*first=*/Vector<uint8_t>{1, 2, 3}, + /*second=*/Vector<uint8_t>{4, 5, 6}); + + auto* blink_type = + ConvertTo<blink::AuthenticationExtensionsClientOutputs*>(mojo_type); + + EXPECT_TRUE(blink_type->hasPrf()); + EXPECT_TRUE(blink_type->prf()->hasResults()); + blink::AuthenticationExtensionsPRFValues* blink_prf_values = + blink_type->prf()->results(); + EXPECT_TRUE(blink_prf_values->hasSecond()); + EXPECT_THAT(blink_prf_values->second(), + UnionDOMArrayBufferOrViewEqualTo(Vector<uint8_t>{4, 5, 6})); +} + +TEST(CredentialManagerTypeConvertersTest, PublicKeyCredentialRequestOptions_extensions) { blink::PublicKeyCredentialRequestOptions* blink_type = blink::PublicKeyCredentialRequestOptions::Create();
diff --git a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc index b1e6bd95..de79289 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/credentials_container.cc
@@ -830,6 +830,24 @@ AuthenticationExtensionsClientOutputsPtr& extensions = credential->extensions; + if (RuntimeEnabledFeatures::SecurePaymentConfirmationExtensionsEnabled()) { + AuthenticationExtensionsClientOutputs* extension_outputs = + ConvertTo<AuthenticationExtensionsClientOutputs*>( + credential->extensions); +#if BUILDFLAG(IS_ANDROID) + if (extensions->echo_user_verification_methods) { + UseCounter::Count(resolver->GetExecutionContext(), + WebFeature::kCredentialManagerGetSuccessWithUVM); + } +#endif + resolver->Resolve(MakeGarbageCollected<PublicKeyCredential>( + credential->info->id, + VectorToDOMArrayBuffer(std::move(credential->info->raw_id)), + authenticator_response, credential->authenticator_attachment, + extension_outputs)); + return; + } + AuthenticationExtensionsClientOutputs* extension_outputs = AuthenticationExtensionsClientOutputs::Create(); if (extensions->echo_appid_extension) { @@ -1481,6 +1499,14 @@ } base::UmaHistogramEnumeration("Blink.FedCm.RpContext", rp_context); + mojom::blink::RpMode rp_mode = mojom::blink::RpMode::kWidget; + if (options->identity()->hasMode()) { + // TODO(crbug.com/1429083): add use counters for rp mode. + rp_mode = + mojo::ConvertTo<mojom::blink::RpMode>(options->identity()->mode()); + } + // TODO(crbug.com/1429083): add uma histograms for rp mode. + CredentialMediationRequirement mediation_requirement; if (options->mediation() == "conditional") { resolver->Reject(MakeGarbageCollected<DOMException>( @@ -1528,7 +1554,7 @@ Vector<mojom::blink::IdentityProviderGetParametersPtr> idp_get_params; mojom::blink::IdentityProviderGetParametersPtr get_params = mojom::blink::IdentityProviderGetParameters::New( - std::move(identity_provider_ptrs), rp_context); + std::move(identity_provider_ptrs), rp_context, rp_mode); idp_get_params.push_back(std::move(get_params)); auto* auth_request = @@ -1552,8 +1578,9 @@ std::move(scoped_abort_state)); } - web_identity_requester_->AppendGetCall( - WrapPersistent(resolver), options->identity()->providers(), rp_context); + web_identity_requester_->AppendGetCall(WrapPersistent(resolver), + options->identity()->providers(), + rp_context, rp_mode); return promise; }
diff --git a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl index 3e3557af..c74c1741 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl +++ b/third_party/blink/renderer/modules/credentialmanagement/identity_credential_request_options.idl
@@ -10,10 +10,17 @@ "continue" }; +enum IdentityCredentialRequestOptionsMode { + "button", + "widget" +}; + // https://fedidcg.github.io/FedCM/#dictdef-identitycredentialrequestoptions dictionary IdentityCredentialRequestOptions { required sequence<IdentityProviderConfig> providers; IdentityCredentialRequestOptionsContext context = "signin"; + // Allows an RP to select between the two UX modes of operation: button flows or widgets. + [RuntimeEnabled=FedCmAuthz] IdentityCredentialRequestOptionsMode mode = "widget"; // A querying language that allows an RP to ask what it wants from the IdPs. [RuntimeEnabled=FedCmSelectiveDisclosure] IdentityStandardClaims claims; };
diff --git a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc index 2c23ce9..63a1db46 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc +++ b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.cc
@@ -92,7 +92,8 @@ void WebIdentityRequester::AppendGetCall( ScriptPromiseResolver* resolver, const HeapVector<Member<IdentityProviderConfig>>& providers, - mojom::blink::RpContext rp_context) { + mojom::blink::RpContext rp_context, + mojom::blink::RpMode rp_mode) { if (is_requesting_token_) { resolver->Reject(MakeGarbageCollected<DOMException>( DOMExceptionCode::kNotAllowedError, @@ -123,7 +124,7 @@ mojom::blink::IdentityProviderGetParametersPtr get_params = mojom::blink::IdentityProviderGetParameters::New(std::move(idp_ptrs), - rp_context); + rp_context, rp_mode); idp_get_params_.push_back(std::move(get_params)); if (window_onload_event_listener_ || has_posted_task_)
diff --git a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h index ca2f1eb..cb14e4e 100644 --- a/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h +++ b/third_party/blink/renderer/modules/credentialmanagement/web_identity_requester.h
@@ -40,7 +40,8 @@ void AppendGetCall( ScriptPromiseResolver* resolver, const HeapVector<Member<IdentityProviderConfig>>& providers, - mojom::blink::RpContext rp_context); + mojom::blink::RpContext rp_context, + mojom::blink::RpMode rp_mode); void InsertScopedAbortState( std::unique_ptr<ScopedAbortState> scoped_abort_state);
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc index 50250b3..ab9c7f7 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
@@ -23,6 +23,7 @@ #include "media/base/mime_util.h" #include "media/base/video_codecs.h" #include "media/base/video_frame.h" +#include "media/formats/mp4/mp4_status.h" #include "media/mojo/clients/mojo_video_encoder_metrics_provider.h" #include "media/muxers/live_webm_muxer_delegate.h" #include "media/muxers/mp4_muxer.h" @@ -54,6 +55,8 @@ base::FEATURE_DISABLED_BY_DEFAULT); namespace { +constexpr double kDefaultVideoFrameRate = 30.0; + // Encoding smoothness depends on a number of parameters, namely: frame rate, // resolution, hardware support availability, platform and IsLowEndDevice(); to // simplify calculations we compare the amount of pixels per second (i.e. @@ -719,9 +722,51 @@ if (invalidated_) return; +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + // TODO(crbug.com/1441395). Once Encoder supports VideoEncoder, then the + // below code could go away. + + // Convert annex stream to avc bit stream for h264. + if (IsMp4MuxerRequired(audio_codec_id_) && + video_codec_profile_.codec_id == VideoTrackRecorder::CodecId::kH264 && + is_key_frame && !codec_description.has_value()) { + if (!h264_converter_) { + h264_converter_ = + std::make_unique<media::H264AnnexBToAvcBitstreamConverter>(); + } + + // We don't care the config_changed or not, we just pass the configuration + // data as a codec_descriptions. + bool config_changed = false; + size_t desired_size = 0; + std::vector<uint8_t> ouput_chunk; + base::span<const uint8_t> data_span( + reinterpret_cast<const uint8_t*>(encoded_data.data()), + encoded_data.size()); + auto status = h264_converter_->ConvertChunk(data_span, ouput_chunk, + &config_changed, &desired_size); + DCHECK_EQ(status.code(), media::MP4Status::Codes::kBufferTooSmall); + ouput_chunk.resize(desired_size); + status = h264_converter_->ConvertChunk(data_span, ouput_chunk, + &config_changed, &desired_size); + DCHECK(status.is_ok()); + + const auto& config = h264_converter_->GetCurrentConfig(); + media::VideoEncoder::CodecDescription avc_config_data; + if (!config.Serialize(avc_config_data)) { + DVLOG(1) << "Failed to get h264 config"; + } + codec_description = std::move(avc_config_data); + } +#endif + auto params_with_codec = params; params_with_codec.codec = MediaVideoCodecFromCodecId(video_codec_profile_.codec_id); + if (!params_with_codec.frame_rate) { + params_with_codec.frame_rate = kDefaultVideoFrameRate; + } + HandleEncodedVideo(params_with_codec, std::move(encoded_data), std::move(encoded_alpha), std::move(codec_description), timestamp, is_key_frame);
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h index bcf7774..b056deb 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h
@@ -24,6 +24,10 @@ #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" #include "third_party/blink/renderer/platform/wtf/vector.h" +#if BUILDFLAG(USE_PROPRIETARY_CODECS) +#include "media/formats/mp4/h264_annex_b_to_avc_bitstream_converter.h" +#endif + namespace media { class AudioBus; class AudioParameters; @@ -204,6 +208,10 @@ // Worker class doing the actual muxing work. std::unique_ptr<media::Muxer> muxer_; + +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + std::unique_ptr<media::H264AnnexBToAvcBitstreamConverter> h264_converter_; +#endif }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc index 239f6e1..ba1879d 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler_unittest.cc
@@ -15,6 +15,7 @@ #include "media/base/audio_bus.h" #include "media/base/video_color_space.h" #include "media/base/video_frame.h" +#include "media/formats/mp4/box_definitions.h" #include "media/media_buildflags.h" #include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" @@ -36,6 +37,7 @@ #include "third_party/blink/renderer/platform/mediastream/media_stream_audio_track.h" #include "third_party/blink/renderer/platform/mediastream/media_stream_component_impl.h" #include "third_party/blink/renderer/platform/testing/io_task_runner_testing_platform_support.h" +#include "third_party/blink/renderer/platform/testing/unit_test_helpers.h" #include "third_party/blink/renderer/platform/wtf/text/string_builder.h" using base::test::RunOnceClosure; @@ -79,6 +81,7 @@ const char* const mime_type; const char* const codecs; const bool encoder_supports_alpha; + const bool use_mp4_muxer = false; }; // Array of valid combinations of video/audio/codecs and expected collected @@ -101,7 +104,8 @@ #if BUILDFLAG(USE_PROPRIETARY_CODECS) {true, true, false, "video/x-matroska", "avc1", false}, {true, true, false, "video/mp4", "avc1", false}, - {true, false, true, "audio/mp4", "aac", false}, + {true, true, true, "video/mp4", "avc1,aac", false, true}, + {true, false, true, "audio/mp4", "aac", false, true}, #endif {true, false, true, "audio/webm", "opus", true}, {true, false, true, "audio/webm", "", true}, // Should default to opus. @@ -178,14 +182,17 @@ base::TimeTicks::Now()); } - void OnEncodedVideoForTesting(const media::Muxer::VideoParameters& params, - std::string encoded_data, - std::string encoded_alpha, - base::TimeTicks timestamp, - bool is_key_frame) { + void OnEncodedVideoForTesting( + const media::Muxer::VideoParameters& params, + std::string encoded_data, + std::string encoded_alpha, + base::TimeTicks timestamp, + bool is_key_frame, + absl::optional<media::VideoEncoder::CodecDescription> codec_description = + absl::nullopt) { media_recorder_handler_->OnEncodedVideo( params, std::move(encoded_data), std::move(encoded_alpha), - absl::nullopt, timestamp, is_key_frame); + std::move(codec_description), timestamp, is_key_frame); } void OnEncodedAudioForTesting(const media::AudioParameters& params, @@ -228,6 +235,38 @@ bus.get()); return bus; } +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + void PopulateAVCDecoderConfiguration(std::vector<uint8_t>& code_description) { + // copied from box_reader_unittest.cc. + std::vector<uint8_t> test_data{ + 0x1, // configurationVersion = 1 + 0x64, // AVCProfileIndication = 100 + 0x0, // profile_compatibility = 0 + 0xc, // AVCLevelIndication = 10 + 0xff, // lengthSizeMinusOne = 3 + 0xe1, // numOfSequenceParameterSets = 1 + 0x0, 0x19, // sequenceParameterSetLength = 25 + + // sequenceParameterSet + 0x67, 0x64, 0x0, 0xc, 0xac, 0xd9, 0x41, 0x41, 0xfb, 0x1, 0x10, 0x0, 0x0, + 0x3, 0x0, 0x10, 0x0, 0x0, 0x3, 0x1, 0x40, 0xf1, 0x42, 0x99, 0x60, + + 0x1, // numOfPictureParameterSets + 0x0, 0x6, // pictureParameterSetLength = 6 + 0x68, 0xeb, 0xe3, 0xcb, 0x22, 0xc0, + + 0xfd, // chroma_format = 1 + 0xf8, // bit_depth_luma_minus8 = 0 + 0xf8, // bit_depth_chroma_minus8 = 0 + 0x0, // numOfSequanceParameterSetExt = 0 + }; + + media::mp4::AVCDecoderConfigurationRecord avc_config; + ASSERT_TRUE( + avc_config.Parse(test_data.data(), static_cast<int>(test_data.size()))); + ASSERT_TRUE(avc_config.Serialize(code_description)); + } +#endif ScopedTestingPlatformSupport<IOTaskRunnerTestingPlatformSupport> platform_; MockMediaStreamRegistry registry_; @@ -279,6 +318,14 @@ return true; } + bool IsAacCodecInUnSupportedPlatform(const String codecs) { +#if !defined(HAS_AAC_ENCODER) + return codecs.Find("aac") != kNotFound; +#else + return false; +#endif + } + private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -514,11 +561,9 @@ const String mime_type(GetParam().mime_type); const String codecs(GetParam().codecs); -#if !defined(HAS_AAC_ENCODER) - if (EqualIgnoringASCIICase(codecs, "aac")) { + if (IsAacCodecInUnSupportedPlatform(codecs)) { return; } -#endif EXPECT_TRUE(media_recorder_handler_->Initialize( recorder, registry_.test_stream(), mime_type, codecs, @@ -542,9 +587,17 @@ // Sends 2 opaque frames and 1 transparent frame and expects them as WebM // contained encoded data in writeData(). TEST_P(MediaRecorderHandlerTest, EncodeVideoFrames) { - // Video-only test. - if (GetParam().has_audio || !IsCodecSupported() || - !IsStreamWriteSupported()) { + // Video-only test unless it is Mp4 muxer that needs `aac` audio codec. + if ((GetParam().has_audio && !GetParam().use_mp4_muxer) || + !IsCodecSupported()) { + return; + } + + if (!GetParam().has_video) { + return; + } + + if (IsAacCodecInUnSupportedPlatform(GetParam().codecs)) { return; } @@ -563,61 +616,84 @@ const scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateBlackFrame(gfx::Size(160, 80)); - { - const size_t kEncodedSizeThreshold = 16; - base::RunLoop run_loop; - // writeData() is pinged a number of times as the WebM header is written; - // the last time it is called it has the encoded data. - EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) - .Times(AtLeast(1)); - EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) - .Times(1) - .WillOnce(RunOnceClosure(run_loop.QuitClosure())); + if (GetParam().use_mp4_muxer) { + { + const size_t kMfraBoxSize = 76; + base::RunLoop run_loop; + // WriteData is called as many as fragments (`moof` box) in addition + // to 3 times of `ftyp`, `moov`, `mfra` boxes. + EXPECT_CALL(*recorder, WriteData(_, Lt(kMfraBoxSize), _, _, _)) + .Times(AtLeast(1)); + EXPECT_CALL(*recorder, WriteData(_, Gt(kMfraBoxSize), _, _, _)) + .Times(AtLeast(1)); + EXPECT_CALL(*recorder, WriteData(_, kMfraBoxSize, _, _, _)) + .Times(1) + .WillOnce(RunOnceClosure(run_loop.QuitClosure())); - OnVideoFrameForTesting(video_frame); - run_loop.Run(); - } - Mock::VerifyAndClearExpectations(recorder); + OnVideoFrameForTesting(video_frame); + test::RunDelayedTasks(base::Seconds(2)); - { - const size_t kEncodedSizeThreshold = 12; - base::RunLoop run_loop; - // The second time around writeData() is called a number of times to write - // the WebM frame header, and then is pinged with the encoded data. - EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) - .Times(AtLeast(1)); - EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) - .Times(1) - .WillOnce(RunOnceClosure(run_loop.QuitClosure())); - - OnVideoFrameForTesting(video_frame); - run_loop.Run(); - } - Mock::VerifyAndClearExpectations(recorder); - { - const scoped_refptr<media::VideoFrame> alpha_frame = - media::VideoFrame::CreateTransparentFrame(gfx::Size(160, 80)); - const size_t kEncodedSizeThreshold = 16; - EXPECT_EQ(4u, media::VideoFrame::NumPlanes(alpha_frame->format())); - base::RunLoop run_loop; - // The second time around writeData() is called a number of times to write - // the WebM frame header, and then is pinged with the encoded data. - EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) - .Times(AtLeast(1)); - EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) - .Times(1) - .WillOnce(RunOnceClosure(run_loop.QuitClosure())); - if (GetParam().encoder_supports_alpha) { + // Mp4Muxer will flush when it is destroyed. + media_recorder_handler_->Stop(); + run_loop.Run(); + } + } else { + { + const size_t kEncodedSizeThreshold = 16; + base::RunLoop run_loop; + // writeData() is pinged a number of times as the WebM header is written; + // the last time it is called it has the encoded data. EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) .Times(AtLeast(1)); EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) .Times(1) .WillOnce(RunOnceClosure(run_loop.QuitClosure())); + + OnVideoFrameForTesting(video_frame); + run_loop.Run(); } - OnVideoFrameForTesting(alpha_frame); - run_loop.Run(); + Mock::VerifyAndClearExpectations(recorder); + { + const size_t kEncodedSizeThreshold = 12; + base::RunLoop run_loop; + // The second time around writeData() is called a number of times to write + // the WebM frame header, and then is pinged with the encoded data. + EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) + .Times(AtLeast(1)); + EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) + .Times(1) + .WillOnce(RunOnceClosure(run_loop.QuitClosure())); + + OnVideoFrameForTesting(video_frame); + run_loop.Run(); + } + Mock::VerifyAndClearExpectations(recorder); + { + const scoped_refptr<media::VideoFrame> alpha_frame = + media::VideoFrame::CreateTransparentFrame(gfx::Size(160, 80)); + const size_t kEncodedSizeThreshold = 16; + EXPECT_EQ(4u, media::VideoFrame::NumPlanes(alpha_frame->format())); + base::RunLoop run_loop; + // The second time around writeData() is called a number of times to write + // the WebM frame header, and then is pinged with the encoded data. + EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) + .Times(AtLeast(1)); + EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) + .Times(1) + .WillOnce(RunOnceClosure(run_loop.QuitClosure())); + if (GetParam().encoder_supports_alpha) { + EXPECT_CALL(*recorder, WriteData(_, Lt(kEncodedSizeThreshold), _, _, _)) + .Times(AtLeast(1)); + EXPECT_CALL(*recorder, WriteData(_, Gt(kEncodedSizeThreshold), _, _, _)) + .Times(1) + .WillOnce(RunOnceClosure(run_loop.QuitClosure())); + } + OnVideoFrameForTesting(alpha_frame); + run_loop.Run(); + } + Mock::VerifyAndClearExpectations(recorder); } - Mock::VerifyAndClearExpectations(recorder); + media_recorder_handler_->Stop(); } @@ -763,6 +839,8 @@ #if BUILDFLAG(USE_PROPRIETARY_CODECS) if (EqualIgnoringASCIICase(GetParam().codecs, "aac")) { actual_mime_type.Append("m4a.40.2"); + } else if (EqualIgnoringASCIICase(GetParam().codecs, "avc1,aac")) { + actual_mime_type.Append("avc1,m4a.40.2"); } else { actual_mime_type.Append(GetParam().codecs); } @@ -782,7 +860,7 @@ TEST_P(MediaRecorderHandlerTest, PauseRecorderForVideo) { // Video-only test: Audio would be very similar. - if (GetParam().has_audio || !IsStreamWriteSupported()) { + if (GetParam().has_audio) { return; } @@ -802,11 +880,24 @@ Mock::VerifyAndClearExpectations(recorder); media_recorder_handler_->Pause(); - EXPECT_CALL(*recorder, WriteData).Times(AtLeast(1)); - media::Muxer::VideoParameters params(gfx::Size(), 1, media::VideoCodec::kVP9, - gfx::ColorSpace()); - OnEncodedVideoForTesting(params, "vp9 frame", "", base::TimeTicks::Now(), - true); + if (GetParam().use_mp4_muxer) { +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + EXPECT_CALL(*recorder, WriteData).Times(AtLeast(1)); + media::Muxer::VideoParameters params( + gfx::Size(), 1, media::VideoCodec::kH264, gfx::ColorSpace()); + std::vector<uint8_t> codec_description; + PopulateAVCDecoderConfiguration(codec_description); + OnEncodedVideoForTesting(params, "h264 frame", "", base::TimeTicks::Now(), + true, std::move(codec_description)); + media_recorder_handler_->Stop(); +#endif + } else { + EXPECT_CALL(*recorder, WriteData).Times(AtLeast(1)); + media::Muxer::VideoParameters params( + gfx::Size(), 1, media::VideoCodec::kVP9, gfx::ColorSpace()); + OnEncodedVideoForTesting(params, "vp9 frame", "", base::TimeTicks::Now(), + true); + } Mock::VerifyAndClearExpectations(recorder);
diff --git a/third_party/blink/renderer/modules/mediasession/media_session.cc b/third_party/blink/renderer/modules/mediasession/media_session.cc index 63739d4..889def45 100644 --- a/third_party/blink/renderer/modules/mediasession/media_session.cc +++ b/third_party/blink/renderer/modules/mediasession/media_session.cc
@@ -14,7 +14,6 @@ #include "third_party/blink/renderer/bindings/modules/v8/v8_media_position_state.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_details.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_handler.h" -#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_picture_in_picture_action_details.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_seek_to_action_details.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h"
diff --git a/third_party/blink/renderer/modules/mediasession/media_session_picture_in_picture_action_details.idl b/third_party/blink/renderer/modules/mediasession/media_session_picture_in_picture_action_details.idl deleted file mode 100644 index 7b8aac9..0000000 --- a/third_party/blink/renderer/modules/mediasession/media_session_picture_in_picture_action_details.idl +++ /dev/null
@@ -1,9 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// https://wicg.github.io/mediasession/#dictdef-mediasessionpictureinpictureactiondetails - -dictionary MediaSessionPictureInPictureActionDetails : MediaSessionActionDetails { - boolean automatic; -};
diff --git a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc index 988a191..dc8ba0e 100644 --- a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc +++ b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.cc
@@ -19,10 +19,6 @@ blink_details = TypeConverter< blink::MediaSessionSeekToActionDetails*, blink::mojom::blink::MediaSessionActionDetailsPtr>::Convert(details); - } else if (details && details->is_picture_in_picture()) { - blink_details = TypeConverter< - blink::MediaSessionPictureInPictureActionDetails*, - blink::mojom::blink::MediaSessionActionDetailsPtr>::Convert(details); } else { DCHECK(!details); blink_details = blink::MediaSessionActionDetails::Create(); @@ -43,16 +39,6 @@ return blink_details; } -blink::MediaSessionPictureInPictureActionDetails* -TypeConverter<blink::MediaSessionPictureInPictureActionDetails*, - blink::mojom::blink::MediaSessionActionDetailsPtr>:: - Convert(const blink::mojom::blink::MediaSessionActionDetailsPtr& details) { - auto* blink_details = - blink::MediaSessionPictureInPictureActionDetails::Create(); - blink_details->setAutomatic(details->get_picture_in_picture()->automatic); - return blink_details; -} - media_session::mojom::blink::MediaPositionPtr TypeConverter< media_session::mojom::blink::MediaPositionPtr, blink::MediaPositionState*>::Convert(const blink::MediaPositionState*
diff --git a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h index a6e4689..62baee8 100644 --- a/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h +++ b/third_party/blink/renderer/modules/mediasession/media_session_type_converters.h
@@ -8,7 +8,6 @@ #include "third_party/blink/public/mojom/mediasession/media_session.mojom-blink.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_position_state.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_action_details.h" -#include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_picture_in_picture_action_details.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_media_session_seek_to_action_details.h" namespace mojo { @@ -29,13 +28,6 @@ }; template <> -struct TypeConverter<blink::MediaSessionPictureInPictureActionDetails*, - blink::mojom::blink::MediaSessionActionDetailsPtr> { - static blink::MediaSessionPictureInPictureActionDetails* Convert( - const blink::mojom::blink::MediaSessionActionDetailsPtr& details); -}; - -template <> struct TypeConverter<media_session::mojom::blink::MediaPositionPtr, blink::MediaPositionState*> { static media_session::mojom::blink::MediaPositionPtr Convert(
diff --git a/third_party/blink/renderer/modules/payments/payment_response.cc b/third_party/blink/renderer/modules/payments/payment_response.cc index 599e9f3..de91c89 100644 --- a/third_party/blink/renderer/modules/payments/payment_response.cc +++ b/third_party/blink/renderer/modules/payments/payment_response.cc
@@ -18,6 +18,7 @@ #include "third_party/blink/renderer/modules/payments/payment_state_resolver.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/runtime_enabled_features.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" namespace blink { @@ -28,7 +29,30 @@ v8::Local<v8::Value> BuildDetails( ScriptState* script_state, const String& json, - SecurePaymentConfirmationResponsePtr secure_payment_confirmation) { + SecurePaymentConfirmationResponsePtr secure_payment_confirmation, + mojom::blink::GetAssertionAuthenticatorResponsePtr + get_assertion_authentication_response) { + if (RuntimeEnabledFeatures::SecurePaymentConfirmationExtensionsEnabled()) { + if (get_assertion_authentication_response) { + const auto& info = get_assertion_authentication_response->info; + auto* authenticator_response = + MakeGarbageCollected<AuthenticatorAssertionResponse>( + std::move(info->client_data_json), + std::move(info->authenticator_data), + std::move(get_assertion_authentication_response->signature), + get_assertion_authentication_response->user_handle); + + auto* result = MakeGarbageCollected<PublicKeyCredential>( + get_assertion_authentication_response->info->id, + DOMArrayBuffer::Create(static_cast<const void*>(info->raw_id.data()), + info->raw_id.size()), + authenticator_response, + get_assertion_authentication_response->authenticator_attachment, + ConvertTo<AuthenticationExtensionsClientOutputs*>( + get_assertion_authentication_response->extensions)); + return result->Wrap(script_state).ToLocalChecked(); + } + } if (secure_payment_confirmation) { const auto& info = secure_payment_confirmation->credential_info; auto* authenticator_response = @@ -86,9 +110,11 @@ payment_state_resolver_(payment_state_resolver) { DCHECK(payment_state_resolver_); ScriptState::Scope scope(script_state); - details_.Set(script_state->GetIsolate(), - BuildDetails(script_state, response->stringified_details, - std::move(response->secure_payment_confirmation))); + details_.Set( + script_state->GetIsolate(), + BuildDetails(script_state, response->stringified_details, + std::move(response->secure_payment_confirmation), + std::move(response->get_assertion_authenticator_response))); } PaymentResponse::~PaymentResponse() = default; @@ -106,9 +132,11 @@ payer_email_ = response->payer->email; payer_phone_ = response->payer->phone; ScriptState::Scope scope(script_state); - details_.Set(script_state->GetIsolate(), - BuildDetails(script_state, response->stringified_details, - std::move(response->secure_payment_confirmation))); + details_.Set( + script_state->GetIsolate(), + BuildDetails(script_state, response->stringified_details, + std::move(response->secure_payment_confirmation), + std::move(response->get_assertion_authenticator_response))); } void PaymentResponse::UpdatePayerDetail(
diff --git a/third_party/blink/renderer/modules/payments/payment_response_test.cc b/third_party/blink/renderer/modules/payments/payment_response_test.cc index 60edf17e..684324f1 100644 --- a/third_party/blink/renderer/modules/payments/payment_response_test.cc +++ b/third_party/blink/renderer/modules/payments/payment_response_test.cc
@@ -14,11 +14,13 @@ #include "third_party/blink/renderer/bindings/core/v8/v8_binding_for_testing.h" #include "third_party/blink/renderer/bindings/core/v8/v8_object_builder.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_payment_validation_errors.h" +#include "third_party/blink/renderer/modules/credentialmanagement/public_key_credential.h" #include "third_party/blink/renderer/modules/payments/payment_address.h" #include "third_party/blink/renderer/modules/payments/payment_state_resolver.h" #include "third_party/blink/renderer/modules/payments/payment_test_helper.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" +#include "third_party/blink/renderer/platform/testing/runtime_enabled_features_test_helpers.h" namespace blink { namespace { @@ -95,6 +97,83 @@ EXPECT_EQ(123, transaction_id.V8Value().As<v8::Number>()->Value()); } +MATCHER_P(ArrayBufferEqualTo, other_buffer, "equal to") { + if (arg->ByteLength() != std::size(other_buffer)) { + return false; + } + + uint8_t* data = (uint8_t*)arg->Data(); + return std::equal(data, data + arg->ByteLength(), std::begin(other_buffer)); +} + +// Calls getClientExtensionResults on the given public_key_credential. +static v8::Local<v8::Object> GetClientExtensionResults( + V8TestingScope& scope, + v8::Local<v8::Object> public_key_credential) { + v8::Local<v8::Function> get_client_extension_results_method = + public_key_credential.As<v8::Object>() + ->Get(scope.GetContext(), + V8String(scope.GetIsolate(), "getClientExtensionResults")) + .ToLocalChecked() + .As<v8::Function>(); + return get_client_extension_results_method + ->Call(scope.GetContext(), public_key_credential, + /*argc=*/0, + /*argv=*/nullptr) + .ToLocalChecked() + .As<v8::Object>(); +} + +// Gets a v8 object property of array_buffer type. +static v8::Local<v8::ArrayBuffer> GetArrayBuffer(V8TestingScope& scope, + v8::Local<v8::Object>& object, + const char* property_key) { + return object + ->Get(scope.GetContext(), V8String(scope.GetIsolate(), property_key)) + .ToLocalChecked() + .As<v8::ArrayBuffer>(); +} + +TEST(PaymentResponseTest, + PaymentResponseDetailsContainsSpcExtensionsDevicePublicKey) { + ScopedSecurePaymentConfirmationExtensionsForTest extensions_flag(true); + V8TestingScope scope; + payments::mojom::blink::PaymentResponsePtr input = + BuildPaymentResponseForTest(); + input->get_assertion_authenticator_response = + blink::mojom::blink::GetAssertionAuthenticatorResponse::New(); + input->get_assertion_authenticator_response->info = + blink::mojom::blink::CommonCredentialInfo::New(); + input->get_assertion_authenticator_response->info->id = "rpid"; + input->get_assertion_authenticator_response->extensions = + blink::mojom::blink::AuthenticationExtensionsClientOutputs::New(); + input->get_assertion_authenticator_response->extensions->device_public_key = + mojom::blink::DevicePublicKeyResponse::New( + /*authenticator_output=*/WTF::Vector<uint8_t>{1, 2, 3}, + /*signature=*/WTF::Vector<uint8_t>{4, 5, 6}); + MockPaymentStateResolver* complete_callback = + MakeGarbageCollected<MockPaymentStateResolver>(); + + PaymentResponse* output = MakeGarbageCollected<PaymentResponse>( + scope.GetScriptState(), std::move(input), /*shipping_address=*/nullptr, + complete_callback, "request_id"); + + v8::Local<v8::Object> details = + output->details(scope.GetScriptState()).V8Value().As<v8::Object>(); + v8::Local<v8::Object> device_pub_key = + GetClientExtensionResults(scope, details) + ->Get(scope.GetContext(), + V8String(scope.GetIsolate(), "devicePubKey")) + .ToLocalChecked() + .As<v8::Object>(); + v8::Local<v8::ArrayBuffer> authenticator_output = + GetArrayBuffer(scope, device_pub_key, "authenticatorOutput"); + EXPECT_THAT(authenticator_output, ArrayBufferEqualTo(WTF::Vector{1, 2, 3})); + v8::Local<v8::ArrayBuffer> signature = + GetArrayBuffer(scope, device_pub_key, "signature"); + EXPECT_THAT(signature, ArrayBufferEqualTo(WTF::Vector{4, 5, 6})); +} + TEST(PaymentResponseTest, PaymentResponseDetailsWithUnexpectedJSONFormatString) { V8TestingScope scope;
diff --git a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc index d97c58ec..243e0b41 100644 --- a/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc +++ b/third_party/blink/renderer/modules/peerconnection/rtc_peer_connection.cc
@@ -143,7 +143,7 @@ BASE_FEATURE(kWebRtcLegacyGetStatsThrows, "WebRtcLegacyGetStatsThrows", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); namespace {
diff --git a/third_party/blink/renderer/modules/webgl/BUILD.gn b/third_party/blink/renderer/modules/webgl/BUILD.gn index b1239f696..097879a 100644 --- a/third_party/blink/renderer/modules/webgl/BUILD.gn +++ b/third_party/blink/renderer/modules/webgl/BUILD.gn
@@ -183,6 +183,9 @@ "webgl_vertex_array_object_base.h", "webgl_vertex_array_object_oes.cc", "webgl_vertex_array_object_oes.h", + "webgl_video_texture.cc", + "webgl_video_texture.h", + "webgl_video_texture_enum.h", ] # The modules/webgl/ directly is a larger module, and
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc index 199b22af..6593d52 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.cc
@@ -57,6 +57,7 @@ #include "third_party/blink/renderer/modules/webgl/webgl_render_shared_exponent.h" #include "third_party/blink/renderer/modules/webgl/webgl_shader_pixel_local_storage.h" #include "third_party/blink/renderer/modules/webgl/webgl_stencil_texturing.h" +#include "third_party/blink/renderer/modules/webgl/webgl_video_texture.h" #include "third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h" namespace blink { @@ -207,6 +208,7 @@ RegisterExtension(webgl_render_shared_exponent_, kDraftExtension); RegisterExtension(webgl_shader_pixel_local_storage_, kDraftExtension); RegisterExtension(webgl_stencil_texturing_, kDraftExtension); + RegisterExtension(webgl_video_texture_, kDraftExtension); } void WebGL2RenderingContext::Trace(Visitor* visitor) const { @@ -250,6 +252,7 @@ visitor->Trace(webgl_render_shared_exponent_); visitor->Trace(webgl_shader_pixel_local_storage_); visitor->Trace(webgl_stencil_texturing_); + visitor->Trace(webgl_video_texture_); WebGL2RenderingContextBase::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h index d5fe9238..936c3c9c 100644 --- a/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h +++ b/third_party/blink/renderer/modules/webgl/webgl2_rendering_context.h
@@ -46,6 +46,7 @@ class WebGLRenderSharedExponent; class WebGLShaderPixelLocalStorage; class WebGLStencilTexturing; +class WebGLVideoTexture; class WebGL2RenderingContext : public WebGL2RenderingContextBase { DEFINE_WRAPPERTYPEINFO(); @@ -129,6 +130,7 @@ Member<WebGLRenderSharedExponent> webgl_render_shared_exponent_; Member<WebGLShaderPixelLocalStorage> webgl_shader_pixel_local_storage_; Member<WebGLStencilTexturing> webgl_stencil_texturing_; + Member<WebGLVideoTexture> webgl_video_texture_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/webgl/webgl_extension_name.h b/third_party/blink/renderer/modules/webgl/webgl_extension_name.h index 1768392..2799fd9 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_extension_name.h +++ b/third_party/blink/renderer/modules/webgl/webgl_extension_name.h
@@ -68,6 +68,7 @@ kWebGLRenderSharedExponentName, kWebGLShaderPixelLocalStorageName, kWebGLStencilTexturingName, + kWebGLVideoTextureName, kWebGLWebCodecsVideoFrameName, kWebGLExtensionNameCount, // Must be the last entry };
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc index fa4bb65..e73ef76 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.cc
@@ -78,6 +78,7 @@ #include "third_party/blink/renderer/modules/webgl/webgl_multi_draw.h" #include "third_party/blink/renderer/modules/webgl/webgl_multi_draw_instanced_base_vertex_base_instance.h" #include "third_party/blink/renderer/modules/webgl/webgl_polygon_mode.h" +#include "third_party/blink/renderer/modules/webgl/webgl_video_texture.h" #include "third_party/blink/renderer/platform/graphics/gpu/drawing_buffer.h" namespace blink { @@ -218,6 +219,7 @@ RegisterExtension(webgl_lose_context_, kApprovedExtension); RegisterExtension(webgl_multi_draw_); RegisterExtension(webgl_polygon_mode_, kDraftExtension); + RegisterExtension(webgl_video_texture_, kDraftExtension); } void WebGLRenderingContext::Trace(Visitor* visitor) const { @@ -260,6 +262,7 @@ visitor->Trace(webgl_lose_context_); visitor->Trace(webgl_multi_draw_); visitor->Trace(webgl_polygon_mode_); + visitor->Trace(webgl_video_texture_); WebGLRenderingContextBase::Trace(visitor); }
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.h index 247716d..c005a880 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context.h
@@ -64,6 +64,7 @@ class WebGLLoseContext; class WebGLMultiDraw; class WebGLPolygonMode; +class WebGLVideoTexture; class WebGLRenderingContext final : public WebGLRenderingContextBase { DEFINE_WRAPPERTYPEINFO(); @@ -143,6 +144,7 @@ Member<WebGLLoseContext> webgl_lose_context_; Member<WebGLMultiDraw> webgl_multi_draw_; Member<WebGLPolygonMode> webgl_polygon_mode_; + Member<WebGLVideoTexture> webgl_video_texture_; }; } // namespace blink
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 4843ce6..b85b1e94 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
@@ -111,6 +111,8 @@ #include "third_party/blink/renderer/modules/webgl/webgl_uniform_location.h" #include "third_party/blink/renderer/modules/webgl/webgl_vertex_array_object.h" #include "third_party/blink/renderer/modules/webgl/webgl_vertex_array_object_oes.h" +#include "third_party/blink/renderer/modules/webgl/webgl_video_texture.h" +#include "third_party/blink/renderer/modules/webgl/webgl_video_texture_enum.h" #include "third_party/blink/renderer/modules/xr/xr_system.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/bindings/script_state.h" @@ -208,30 +210,6 @@ return *forcibly_evicted_contexts_persistent; } -WebGLVideoFrameUploadMetadata CreateVideoFrameUploadMetadata( - const media::VideoFrame* frame, - media::VideoFrame::ID already_uploaded_id) { - DCHECK(frame); - WebGLVideoFrameUploadMetadata metadata = {}; - if (!RuntimeEnabledFeatures::ExtraWebGLVideoTextureMetadataEnabled()) { - return metadata; - } - - metadata.frame_id = frame->unique_id(); - metadata.visible_rect = frame->visible_rect(); - metadata.timestamp = frame->timestamp(); - if (frame->metadata().frame_duration.has_value()) { - metadata.expected_timestamp = - frame->timestamp() + *frame->metadata().frame_duration; - }; - - // Skip uploading frames which have already been uploaded. - if (already_uploaded_id == frame->unique_id()) { - metadata.skipped = true; - } - return metadata; -} - } // namespace ScopedRGBEmulationColorMask::ScopedRGBEmulationColorMask( @@ -2174,6 +2152,14 @@ texture_units_[active_texture_unit_].texture2d_array_binding_ = texture; } else if (IsWebGL2() && target == GL_TEXTURE_3D) { texture_units_[active_texture_unit_].texture3d_binding_ = texture; + } else if (target == GL_TEXTURE_VIDEO_IMAGE_WEBGL) { + if (!ExtensionEnabled(kWebGLVideoTextureName)) { + SynthesizeGLError( + GL_INVALID_VALUE, "bindTexture", + "unhandled type, WEBGL_video_texture extension not enabled"); + return; + } + texture_units_[active_texture_unit_].texture_video_image_binding_ = texture; } else if (target == GL_TEXTURE_EXTERNAL_OES) { SynthesizeGLError(GL_INVALID_ENUM, "bindTexture", "GL_TEXTURE_EXTERNAL_OES textures not supported"); @@ -2187,7 +2173,29 @@ return; } - ContextGL()->BindTexture(target, ObjectOrZero(texture)); + // We use TEXTURE_EXTERNAL_OES to implement video texture on Android platform + if (target == GL_TEXTURE_VIDEO_IMAGE_WEBGL) { +#if BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/776222): Support extension on Android + NOTIMPLEMENTED(); + return; +#else + // TODO(crbug.com/776222): Using GL_TEXTURE_VIDEO_IMAGE_WEBGL in blink + ContextGL()->BindTexture(GL_TEXTURE_2D, ObjectOrZero(texture)); + if (texture && !texture->GetTarget()) { + ContextGL()->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, + GL_LINEAR); + ContextGL()->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR); + ContextGL()->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, + GL_CLAMP_TO_EDGE); + ContextGL()->TexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, + GL_CLAMP_TO_EDGE); + } +#endif // BUILDFLAG(IS_ANDROID) + } else { + ContextGL()->BindTexture(target, ObjectOrZero(texture)); + } if (texture) { texture->SetTarget(target); one_plus_max_non_default_texture_unit_ = @@ -4330,6 +4338,16 @@ base_type = GL_INT; length = 1; break; + case GL_SAMPLER_VIDEO_IMAGE_WEBGL: + if (!ExtensionEnabled(kWebGLVideoTextureName)) { + SynthesizeGLError( + GL_INVALID_VALUE, "getUniform", + "unhandled type, WEBGL_video_texture extension not enabled"); + return ScriptValue::CreateNull(script_state->GetIsolate()); + } + base_type = GL_INT; + length = 1; + break; default: if (!IsWebGL2()) { // Can't handle this type @@ -6148,7 +6166,7 @@ if (auto sk_img = local_handle->sk_image()) { DCHECK(!sk_img->isTextureBacked()); // For WebGL last-uploaded-frame-metadata API. https://crbug.com/639174 - auto metadata = CreateVideoFrameUploadMetadata( + auto metadata = WebGLVideoTexture::CreateVideoFrameUploadMetadata( local_handle->frame().get(), texture->GetLastUploadedVideoFrameId()); if (metadata.skipped) { texture->UpdateLastUploadedFrame(metadata); @@ -6175,7 +6193,7 @@ DCHECK(texture); DCHECK(media_video_frame); - auto metadata = CreateVideoFrameUploadMetadata( + auto metadata = WebGLVideoTexture::CreateVideoFrameUploadMetadata( media_video_frame.get(), texture->GetLastUploadedVideoFrameId()); if (metadata.skipped) { texture->UpdateLastUploadedFrame(metadata); @@ -6245,7 +6263,7 @@ raster_context_provider, ContextGL(), media_video_frame, params.target, texture->Object(), adjusted_internalformat, params.format, params.type, params.level, unpack_premultiply_alpha_, - unpack_flip_y_)) { + unpack_flip_y_, /*allow_shared_image_for_direct_upload=*/true)) { texture->UpdateLastUploadedFrame(metadata); return; } @@ -6262,7 +6280,7 @@ raster_context_provider, ContextGL(), media_video_frame, params.target, texture->Object(), adjusted_internalformat, params.format, params.type, params.level, unpack_premultiply_alpha_, - unpack_flip_y_)) { + unpack_flip_y_, /*allow_shared_image_for_direct_upload=*/true)) { texture->UpdateLastUploadedFrame(metadata); return; } @@ -6471,6 +6489,14 @@ return; switch (pname) { case GL_TEXTURE_MIN_FILTER: + if (target == GL_TEXTURE_VIDEO_IMAGE_WEBGL) { + if ((is_float && paramf != GL_NEAREST && paramf != GL_LINEAR) || + (!is_float && parami != GL_NEAREST && parami != GL_LINEAR)) { + SynthesizeGLError(GL_INVALID_ENUM, "texParameter", + "invalid parameter name"); + return; + } + } break; case GL_TEXTURE_MAG_FILTER: break; @@ -6500,6 +6526,15 @@ SynthesizeGLError(GL_INVALID_ENUM, "texParameter", "invalid parameter"); return; } + + if (target == GL_TEXTURE_VIDEO_IMAGE_WEBGL) { + if ((is_float && paramf != GL_CLAMP_TO_EDGE) || + (!is_float && parami != GL_CLAMP_TO_EDGE)) { + SynthesizeGLError(GL_INVALID_ENUM, "texParameter", + "invalid parameter"); + return; + } + } break; case GL_TEXTURE_MAX_ANISOTROPY_EXT: // EXT_texture_filter_anisotropic if (!ExtensionEnabled(kEXTTextureFilterAnisotropicName)) { @@ -7757,6 +7792,15 @@ } tex = texture_units_[active_texture_unit_].texture2d_array_binding_.Get(); break; + case GL_TEXTURE_VIDEO_IMAGE_WEBGL: + if (!ExtensionEnabled(kWebGLVideoTextureName)) { + SynthesizeGLError(GL_INVALID_ENUM, function_name, + "invalid texture target"); + return nullptr; + } + tex = texture_units_[active_texture_unit_] + .texture_video_image_binding_.Get(); + break; default: SynthesizeGLError(GL_INVALID_ENUM, function_name, "invalid texture target"); @@ -8007,6 +8051,8 @@ case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: return max_cube_map_texture_level_; + case GL_TEXTURE_VIDEO_IMAGE_WEBGL: + return 1; } return 0; } @@ -8044,6 +8090,7 @@ switch (target) { case GL_TEXTURE_2D: + case GL_TEXTURE_VIDEO_IMAGE_WEBGL: if (width > (max_texture_size_ >> level) || height > (max_texture_size_ >> level)) { SynthesizeGLError(GL_INVALID_VALUE, function_name,
diff --git a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h index 771f4dc0..439888d 100644 --- a/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h +++ b/third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h
@@ -723,6 +723,7 @@ friend class WebGLMultiDrawCommon; friend class WebGLMultiDrawInstancedBaseVertexBaseInstance; friend class WebGLShaderPixelLocalStorage; + friend class WebGLVideoTexture; WebGLRenderingContextBase(CanvasRenderingContextHost*, std::unique_ptr<WebGraphicsContext3DProvider>,
diff --git a/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc b/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc new file mode 100644 index 0000000..24c71270 --- /dev/null +++ b/third_party/blink/renderer/modules/webgl/webgl_video_texture.cc
@@ -0,0 +1,180 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/webgl/webgl_video_texture.h" + +#include "build/build_config.h" +#include "media/renderers/paint_canvas_video_renderer.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_video_frame_metadata.h" +#include "third_party/blink/renderer/core/html/media/html_video_element.h" +#include "third_party/blink/renderer/modules/webgl/webgl_rendering_context_base.h" +#include "third_party/blink/renderer/modules/webgl/webgl_video_texture_enum.h" +#include "third_party/blink/renderer/platform/bindings/exception_state.h" +#include "third_party/blink/renderer/platform/graphics/gpu/shared_gpu_context.h" + +namespace blink { + +WebGLVideoTexture::WebGLVideoTexture(WebGLRenderingContextBase* context) + : WebGLExtension(context) { + context->ExtensionsUtil()->EnsureExtensionEnabled("GL_WEBGL_video_texture"); +} + +WebGLExtensionName WebGLVideoTexture::GetName() const { + return kWebGLVideoTextureName; +} + +bool WebGLVideoTexture::Supported(WebGLRenderingContextBase* context) { +#if BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/776222): support extension on Android + return false; +#else + return true; +#endif +} + +const char* WebGLVideoTexture::ExtensionName() { + return "WEBGL_video_texture"; +} + +void WebGLVideoTexture::Trace(Visitor* visitor) const { + visitor->Trace(current_frame_metadata_); + WebGLExtension::Trace(visitor); +} + +VideoFrameMetadata* WebGLVideoTexture::shareVideoImageWEBGL( + ScriptState* script_state, + unsigned target, + HTMLVideoElement* video, + ExceptionState& exception_state) { + WebGLExtensionScopedContext scoped(this); + if (!video || scoped.IsLost()) + return nullptr; + + if (target != GL_TEXTURE_VIDEO_IMAGE_WEBGL) { + scoped.Context()->SynthesizeGLError(GL_INVALID_ENUM, "WEBGLVideoTexture", + "invalid texture target"); + } + + ExecutionContext* execution_context = ExecutionContext::From(script_state); + if (!scoped.Context()->ValidateHTMLVideoElement( + execution_context->GetSecurityOrigin(), "WEBGLVideoTexture", video, + exception_state)) { + return nullptr; + } + + if (!scoped.Context()->ValidateTexFuncDimensions( + "WEBGLVideoTexture", WebGLRenderingContextBase::kTexImage, target, 0, + video->videoWidth(), video->videoHeight(), 1)) { + return nullptr; + } + + WebGLTexture* texture = + scoped.Context()->ValidateTextureBinding("WEBGLVideoTexture", target); + if (!texture) { + exception_state.ThrowTypeError( + "Failed to get correct binding texture for WEBGL_video_texture"); + return nullptr; + } + +#if BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/776222): support extension on Android + NOTIMPLEMENTED(); + return nullptr; +#else + media::PaintCanvasVideoRenderer* video_renderer = nullptr; + scoped_refptr<media::VideoFrame> media_video_frame; + if (auto* wmp = video->GetWebMediaPlayer()) { + media_video_frame = wmp->GetCurrentFrameThenUpdate(); + video_renderer = wmp->GetPaintCanvasVideoRenderer(); + } + + if (!media_video_frame || !video_renderer) + return nullptr; + + // For WebGL last-uploaded-frame-metadata API. + auto metadata = CreateVideoFrameUploadMetadata( + media_video_frame.get(), texture->GetLastUploadedVideoFrameId()); + if (metadata.skipped) { + texture->UpdateLastUploadedFrame(metadata); + DCHECK(current_frame_metadata_); + return current_frame_metadata_; + } + + target = GL_TEXTURE_2D; + + viz::RasterContextProvider* raster_context_provider = nullptr; + if (auto wrapper = SharedGpuContext::ContextProviderWrapper()) { + if (auto* context_provider = wrapper->ContextProvider()) + raster_context_provider = context_provider->RasterContextProvider(); + } + + // TODO(shaobo.yan@intel.com) : A fallback path or exception needs to be + // added when video is not using gpu decoder. + const bool success = video_renderer->PrepareVideoFrameForWebGL( + raster_context_provider, scoped.Context()->ContextGL(), + std::move(media_video_frame), target, texture->Object()); + if (!success) { + exception_state.ThrowTypeError("Failed to share video to texture."); + return nullptr; + } + + if (RuntimeEnabledFeatures::ExtraWebGLVideoTextureMetadataEnabled()) + texture->UpdateLastUploadedFrame(metadata); + + if (!current_frame_metadata_) + current_frame_metadata_ = VideoFrameMetadata::Create(); + + // TODO(crbug.com/776222): These should be read from the VideoFrameCompositor + // when the VideoFrame is retrieved in WebMediaPlayerImpl. These fields are + // not currently saved in VideoFrameCompositor, so VFC::ProcessNewFrame() + // would need to save the current time as well as the presentation time. + current_frame_metadata_->setPresentationTime( + metadata.timestamp.InMicrosecondsF()); + current_frame_metadata_->setExpectedDisplayTime( + metadata.expected_timestamp.InMicrosecondsF()); + + current_frame_metadata_->setWidth(metadata.visible_rect.width()); + current_frame_metadata_->setHeight(metadata.visible_rect.height()); + current_frame_metadata_->setMediaTime(metadata.timestamp.InSecondsF()); + + // This is a required field. It is supposed to be monotonically increasing for + // video.requestVideoFrameCallback, but it isn't used yet for + // WebGLVideoTexture. + current_frame_metadata_->setPresentedFrames(0); + return current_frame_metadata_; +#endif // BUILDFLAG(IS_ANDROID) +} + +bool WebGLVideoTexture::releaseVideoImageWEBGL( + unsigned target, + ExceptionState& exception_state) { + // NOTE: In current WEBGL_video_texture status, there is no lock on video + // frame. So this API doesn't need to do anything. + return true; +} + +// static +WebGLVideoFrameUploadMetadata WebGLVideoTexture::CreateVideoFrameUploadMetadata( + const media::VideoFrame* frame, + media::VideoFrame::ID already_uploaded_id) { + DCHECK(frame); + WebGLVideoFrameUploadMetadata metadata = {}; + if (!RuntimeEnabledFeatures::ExtraWebGLVideoTextureMetadataEnabled()) + return metadata; + + metadata.frame_id = frame->unique_id(); + metadata.visible_rect = frame->visible_rect(); + metadata.timestamp = frame->timestamp(); + if (frame->metadata().frame_duration.has_value()) { + metadata.expected_timestamp = + frame->timestamp() + *frame->metadata().frame_duration; + }; + + // Skip uploading frames which have already been uploaded. + if (already_uploaded_id == frame->unique_id()) + metadata.skipped = true; + return metadata; +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/webgl/webgl_video_texture.h b/third_party/blink/renderer/modules/webgl/webgl_video_texture.h new file mode 100644 index 0000000..66b5f0fe --- /dev/null +++ b/third_party/blink/renderer/modules/webgl/webgl_video_texture.h
@@ -0,0 +1,54 @@ +// Copyright 2018 The Chromium Authors +// 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_MODULES_WEBGL_WEBGL_VIDEO_TEXTURE_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGL_WEBGL_VIDEO_TEXTURE_H_ + +#include "media/base/video_frame.h" +#include "third_party/blink/renderer/modules/webgl/webgl_extension.h" +#include "third_party/blink/renderer/platform/heap/member.h" + +namespace blink { + +class ExceptionState; +class ScriptState; +class HTMLVideoElement; +class VideoFrameMetadata; +struct WebGLVideoFrameUploadMetadata; + +class WebGLVideoTexture final : public WebGLExtension { + DEFINE_WRAPPERTYPEINFO(); + + public: + static bool Supported(WebGLRenderingContextBase*); + static const char* ExtensionName(); + + explicit WebGLVideoTexture(WebGLRenderingContextBase*); + + WebGLExtensionName GetName() const override; + + void Trace(Visitor*) const override; + + // Get video frame from video frame compositor and bind it to platform + // texture. + VideoFrameMetadata* shareVideoImageWEBGL(ScriptState*, + unsigned, + HTMLVideoElement*, + ExceptionState&); + + bool releaseVideoImageWEBGL(unsigned, ExceptionState&); + + // Helper method for filling in WebGLVideoFrameUploadMetadata. Will be default + // initialized (skipped = false) if the metadata API is disabled. + static WebGLVideoFrameUploadMetadata CreateVideoFrameUploadMetadata( + const media::VideoFrame* frame, + media::VideoFrame::ID already_uploaded_id); + + private: + Member<VideoFrameMetadata> current_frame_metadata_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGL_WEBGL_VIDEO_TEXTURE_H_
diff --git a/third_party/blink/renderer/modules/webgl/webgl_video_texture.idl b/third_party/blink/renderer/modules/webgl/webgl_video_texture.idl new file mode 100644 index 0000000..30bb063 --- /dev/null +++ b/third_party/blink/renderer/modules/webgl/webgl_video_texture.idl
@@ -0,0 +1,16 @@ +// Copyright 2018 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://www.khronos.org/registry/webgl/extensions/proposals/WEBGL_video_texture/ + +[ + RuntimeEnabled=WebGLDraftExtensions, + LegacyNoInterfaceObject +] interface WebGLVideoTexture { + const GLenum TEXTURE_VIDEO_IMAGE = 0x9248; + const GLenum SAMPLER_VIDEO_IMAGE = 0x9249; + + [CallWith=ScriptState, RaisesException] VideoFrameMetadata? shareVideoImageWEBGL(GLenum target, HTMLVideoElement video); + [RaisesException] boolean releaseVideoImageWEBGL(GLenum target); +};
diff --git a/third_party/blink/renderer/modules/webgl/webgl_video_texture_enum.h b/third_party/blink/renderer/modules/webgl/webgl_video_texture_enum.h new file mode 100644 index 0000000..5127a803 --- /dev/null +++ b/third_party/blink/renderer/modules/webgl/webgl_video_texture_enum.h
@@ -0,0 +1,10 @@ +// Copyright 2018 The Chromium Authors +// 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_MODULES_WEBGL_WEBGL_VIDEO_TEXTURE_ENUM_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGL_WEBGL_VIDEO_TEXTURE_ENUM_H_ + +#define GL_TEXTURE_VIDEO_IMAGE_WEBGL 0x9248 +#define GL_SAMPLER_VIDEO_IMAGE_WEBGL 0x9249 + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_WEBGL_WEBGL_VIDEO_TEXTURE_ENUM_H_
diff --git a/third_party/blink/renderer/platform/fonts/font_size_adjust.cc b/third_party/blink/renderer/platform/fonts/font_size_adjust.cc index 9951a8ea..7966aad 100644 --- a/third_party/blink/renderer/platform/fonts/font_size_adjust.cc +++ b/third_party/blink/renderer/platform/fonts/font_size_adjust.cc
@@ -14,7 +14,7 @@ // Normalize negative zero. WTF::AddFloatToHash(computed_hash, value_ == 0.0 ? 0.0 : value_); WTF::AddIntToHash(computed_hash, static_cast<const unsigned>(metric_)); - WTF::AddIntToHash(computed_hash, is_from_font_); + WTF::AddIntToHash(computed_hash, static_cast<const unsigned>(type_)); return computed_hash; }
diff --git a/third_party/blink/renderer/platform/fonts/font_size_adjust.h b/third_party/blink/renderer/platform/fonts/font_size_adjust.h index bdad218..eb9dd6e 100644 --- a/third_party/blink/renderer/platform/fonts/font_size_adjust.h +++ b/third_party/blink/renderer/platform/fonts/font_size_adjust.h
@@ -16,30 +16,31 @@ class PLATFORM_EXPORT FontSizeAdjust { public: enum class Metric { kExHeight, kCapHeight, kChWidth, kIcWidth }; + enum class ValueType : bool { kNumber, kFromFont }; FontSizeAdjust() = default; explicit FontSizeAdjust(float value) : value_(value) {} - explicit FontSizeAdjust(float value, bool is_from_font) - : value_(value), is_from_font_(is_from_font) {} + explicit FontSizeAdjust(float value, ValueType type) + : value_(value), type_(type) {} explicit FontSizeAdjust(float value, Metric metric) : value_(value), metric_(metric) {} - explicit FontSizeAdjust(float value, Metric metric, bool is_from_font) - : value_(value), metric_(metric), is_from_font_(is_from_font) {} + explicit FontSizeAdjust(float value, Metric metric, ValueType type) + : value_(value), metric_(metric), type_(type) {} static constexpr float kFontSizeAdjustNone = -1; explicit operator bool() const { - return value_ != kFontSizeAdjustNone || is_from_font_; + return value_ != kFontSizeAdjustNone || type_ == ValueType::kFromFont; } bool operator==(const FontSizeAdjust& other) const { return value_ == other.Value() && metric_ == other.GetMetric() && - is_from_font_ == other.IsFromFont(); + IsFromFont() == other.IsFromFont(); } bool operator!=(const FontSizeAdjust& other) const { return !operator==(other); } - bool IsFromFont() const { return is_from_font_; } + bool IsFromFont() const { return type_ == ValueType::kFromFont; } float Value() const { return value_; } Metric GetMetric() const { return metric_; } @@ -51,7 +52,7 @@ float value_{kFontSizeAdjustNone}; Metric metric_{Metric::kExHeight}; - bool is_from_font_{false}; + ValueType type_{ValueType::kNumber}; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/fonts/font_size_adjust_test.cc b/third_party/blink/renderer/platform/fonts/font_size_adjust_test.cc index 329652eb..b019fa6 100644 --- a/third_party/blink/renderer/platform/fonts/font_size_adjust_test.cc +++ b/third_party/blink/renderer/platform/fonts/font_size_adjust_test.cc
@@ -24,19 +24,22 @@ EXPECT_EQ(FontSizeAdjust(0.5).GetHash(), FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight).GetHash()); - EXPECT_EQ(FontSizeAdjust(0.5), FontSizeAdjust(0.5, false)); + EXPECT_EQ(FontSizeAdjust(0.5), + FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kNumber)); EXPECT_EQ(FontSizeAdjust(0.5).GetHash(), - FontSizeAdjust(0.5, false).GetHash()); + FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kNumber).GetHash()); EXPECT_EQ(FontSizeAdjust(0.5), - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, false)); - EXPECT_EQ( - FontSizeAdjust(0.5).GetHash(), - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, false).GetHash()); + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, + FontSizeAdjust::ValueType::kNumber)); + EXPECT_EQ(FontSizeAdjust(0.5).GetHash(), + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, + FontSizeAdjust::ValueType::kNumber) + .GetHash()); - EXPECT_EQ(FontSizeAdjust(0.5, false), + EXPECT_EQ(FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kNumber), FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight)); - EXPECT_EQ(FontSizeAdjust(0.5, false).GetHash(), + EXPECT_EQ(FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kNumber).GetHash(), FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight).GetHash()); EXPECT_NE(FontSizeAdjust(), FontSizeAdjust(0.0)); @@ -45,8 +48,11 @@ EXPECT_NE(FontSizeAdjust(0.5), FontSizeAdjust(1.5)); EXPECT_NE(FontSizeAdjust(0.5).GetHash(), FontSizeAdjust(1.5).GetHash()); - EXPECT_NE(FontSizeAdjust(0.5), FontSizeAdjust(0.5, true)); - EXPECT_NE(FontSizeAdjust(0.5).GetHash(), FontSizeAdjust(0.5, true).GetHash()); + EXPECT_NE(FontSizeAdjust(0.5), + FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kFromFont)); + EXPECT_NE( + FontSizeAdjust(0.5).GetHash(), + FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kFromFont).GetHash()); EXPECT_NE(FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight), FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight)); @@ -64,10 +70,12 @@ FontSizeAdjust(1.5, FontSizeAdjust::Metric::kCapHeight).GetHash()); EXPECT_NE(FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight), - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight, true)); - EXPECT_NE( - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight).GetHash(), - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight, true).GetHash()); + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight, + FontSizeAdjust::ValueType::kFromFont)); + EXPECT_NE(FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight).GetHash(), + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight, + FontSizeAdjust::ValueType::kFromFont) + .GetHash()); } TEST(FontSizeAdjustTest, Serialization) { @@ -82,19 +90,24 @@ EXPECT_EQ("ic-width 0.5", FontSizeAdjust(0.5, FontSizeAdjust::Metric::kIcWidth).ToString()); - EXPECT_EQ("from-font", FontSizeAdjust(0.5, true).ToString()); EXPECT_EQ( "from-font", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, true).ToString()); - EXPECT_EQ( - "cap-height from-font", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight, true).ToString()); - EXPECT_EQ( - "ch-width from-font", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kChWidth, true).ToString()); - EXPECT_EQ( - "ic-width from-font", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kIcWidth, true).ToString()); + FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kFromFont).ToString()); + EXPECT_EQ("from-font", FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); + EXPECT_EQ("cap-height from-font", + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); + EXPECT_EQ("ch-width from-font", + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kChWidth, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); + EXPECT_EQ("ic-width from-font", + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kIcWidth, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); EXPECT_NE("none", FontSizeAdjust(0.0).ToString()); EXPECT_NE("ex-height 0.5", FontSizeAdjust(0.5).ToString()); @@ -103,19 +116,24 @@ EXPECT_NE("cap-height 1.5", FontSizeAdjust(0.5, FontSizeAdjust::Metric::kCapHeight).ToString()); - EXPECT_NE("0.5", FontSizeAdjust(0.5, true).ToString()); EXPECT_NE( "0.5", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, true).ToString()); - EXPECT_NE( - "ex-height 0.5", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, true).ToString()); - EXPECT_NE( - "cap-height 0.5", - FontSizeAdjust(0.5, FontSizeAdjust::Metric::kChWidth, true).ToString()); - EXPECT_NE( - "cap-height 1.5", - FontSizeAdjust(1.5, FontSizeAdjust::Metric::kCapHeight, true).ToString()); + FontSizeAdjust(0.5, FontSizeAdjust::ValueType::kFromFont).ToString()); + EXPECT_NE("0.5", FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); + EXPECT_NE("ex-height 0.5", + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kExHeight, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); + EXPECT_NE("cap-height 0.5", + FontSizeAdjust(0.5, FontSizeAdjust::Metric::kChWidth, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); + EXPECT_NE("cap-height 1.5", + FontSizeAdjust(1.5, FontSizeAdjust::Metric::kCapHeight, + FontSizeAdjust::ValueType::kFromFont) + .ToString()); } } // namespace blink
diff --git a/third_party/blink/renderer/platform/graphics/color.cc b/third_party/blink/renderer/platform/graphics/color.cc index 3e9d2b3f..f93027e 100644 --- a/third_party/blink/renderer/platform/graphics/color.cc +++ b/third_party/blink/renderer/platform/graphics/color.cc
@@ -680,15 +680,9 @@ case ColorSpace::kOklab: return gfx::OklabToSkColor4f(param0_, param1_, param2_, alpha_); case ColorSpace::kLch: - return gfx::LchToSkColor4f( - param0_, param1_, - param2_is_none_ ? absl::nullopt : absl::optional<float>(param2_), - alpha_); + return gfx::LchToSkColor4f(param0_, param1_, param2_, alpha_); case ColorSpace::kOklch: - return gfx::OklchToSkColor4f( - param0_, param1_, - param2_is_none_ ? absl::nullopt : absl::optional<float>(param2_), - alpha_); + return gfx::OklchToSkColor4f(param0_, param1_, param2_, alpha_); case ColorSpace::kHSL: return gfx::HSLToSkColor4f(param0_, param1_, param2_, alpha_); case ColorSpace::kHWB:
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 5395ad0..c482c45a 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2186,10 +2186,6 @@ name: "LayoutIgnoreMarginsForSticky", }, { - name: "LayoutNewFixedPositionInvalidation", - status: "stable", - }, - { name: "LayoutNewOverflowLogic", status: "stable", }, @@ -3293,10 +3289,6 @@ status: "experimental", }, { - name: "ScrollCustomization", - base_feature: "none", - }, - { name: "ScrollEndEvents", status: "stable", }, @@ -3350,6 +3342,12 @@ public: true, }, { + name: "SecurePaymentConfirmationExtensions", + // No status since extensions are not set in the payment app without the + // corresponding chromium feature flag. + public: true, + }, + { name: "SecurePaymentConfirmationOptOut", origin_trial_feature_name: "SecurePaymentConfirmationOptOut", origin_trial_allows_third_party: true,
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 1d0a21d..3ee70bd 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
@@ -429,16 +429,6 @@ "Scheduler.BlockingInputExpectedSoon", &main_thread_scheduler_impl->tracing_controller_, YesNoStateToString), - have_reported_blocking_intervention_in_current_policy( - false, - "Scheduler.HasReportedBlockingInterventionInCurrentPolicy", - &main_thread_scheduler_impl->tracing_controller_, - YesNoStateToString), - have_reported_blocking_intervention_since_navigation( - false, - "Scheduler.HasReportedBlockingInterventionSinceNavigation", - &main_thread_scheduler_impl->tracing_controller_, - YesNoStateToString), has_visible_render_widget_with_touch_handler( false, "Scheduler.HasVisibleRenderWidgetWithTouchHandler", @@ -1901,12 +1891,6 @@ dict.Add("is_any_main_frame_loading", any_thread().is_any_main_frame_loading); dict.Add("have_seen_input_since_navigation", any_thread().have_seen_input_since_navigation); - dict.Add( - "have_reported_blocking_intervention_in_current_policy", - main_thread_only().have_reported_blocking_intervention_in_current_policy); - dict.Add( - "have_reported_blocking_intervention_since_navigation", - main_thread_only().have_reported_blocking_intervention_since_navigation); dict.Add("renderer_backgrounded", main_thread_only().renderer_backgrounded.get()); dict.Add("now", (optional_now - base::TimeTicks()).InMillisecondsF()); @@ -2086,8 +2070,6 @@ any_thread().is_any_main_frame_loading = IsAnyOrdinaryMainFrameLoading(); any_thread().have_seen_input_since_navigation = false; main_thread_only().idle_time_estimator.Clear(); - main_thread_only().have_reported_blocking_intervention_since_navigation = - false; 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 ab12ef3..f99ba56 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
@@ -787,10 +787,6 @@ TraceableState<bool, TracingCategory::kDefault> blocking_input_expected_soon; TraceableState<bool, TracingCategory::kDebug> - have_reported_blocking_intervention_in_current_policy; - TraceableState<bool, TracingCategory::kDebug> - have_reported_blocking_intervention_since_navigation; - TraceableState<bool, TracingCategory::kDebug> has_visible_render_widget_with_touch_handler; TraceableState<bool, TracingCategory::kDebug> in_idle_period_for_testing; TraceableState<bool, TracingCategory::kTopLevel> is_audio_playing;
diff --git a/third_party/blink/tools/blinkpy/w3c/import_notifier.py b/third_party/blink/tools/blinkpy/w3c/import_notifier.py index 48afee2..29971580 100644 --- a/third_party/blink/tools/blinkpy/w3c/import_notifier.py +++ b/third_party/blink/tools/blinkpy/w3c/import_notifier.py
@@ -461,6 +461,20 @@ _log.warning('buganizer instantiation failed') _log.warning(e) + # TODO(crbug.com/1488118): clean up the test code once api is confirmed + if bugs: + bug = bugs[0] + try: + buganizer_res = buganizer_api.NewIssue( + title=bug.summary, + description=bug.description, + cc=bug.cc + ['nihardamar@google.com'], + status="New", + componentId=BUGANIZER_WPT_COMPONENT) + except Exception as e: + _log.warning('buganizer api call to new issue failed') + _log.warning(e) + for index, bug in enumerate(bugs, start=1): buganizer_component_id = BUGANIZER_WPT_COMPONENT if buganizer_api and USE_BUGANIZER:
diff --git a/third_party/blink/tools/commit_stats/git-dirs.txt b/third_party/blink/tools/commit_stats/git-dirs.txt index 50bb032..61e87b9 100644 --- a/third_party/blink/tools/commit_stats/git-dirs.txt +++ b/third_party/blink/tools/commit_stats/git-dirs.txt
@@ -35,7 +35,6 @@ ./third_party/vulkan-deps/spirv-cross/src,Vulkan ./third_party/crc32c/src,crc32c ./third_party/jsoncpp/source,jsoncpp -./third_party/minizip/src,minizip ./third_party/dav1d/libdav1d,dav1d ./third_party/cros_system_api,cros_system_api ./third_party/grpc/src,gRPC
diff --git a/third_party/blink/web_tests/SlowTests b/third_party/blink/web_tests/SlowTests index 9aa55dd..bd00ade 100644 --- a/third_party/blink/web_tests/SlowTests +++ b/third_party/blink/web_tests/SlowTests
@@ -134,7 +134,7 @@ crbug.com/678482 [ Mac11 Release ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ] crbug.com/678482 [ Mac12 ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ] crbug.com/678482 [ Release Win ] http/tests/devtools/debugger/fetch-breakpoints.js [ Slow ] -crbug.com/1451884 http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin.js [ Slow ] +crbug.com/1451884 http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login.js [ Slow ] crbug.com/1236466 inspector-protocol/runtime/runtime-execution-contexts-events.js [ Slow ] crbug.com/1229701 [ Debug Mac13-arm64 ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ] crbug.com/1229701 [ Linux ] http/tests/inspector-protocol/network/disable-cache-media-resource.js [ Slow ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index f534de3b..4bb8bce606 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1245,8 +1245,6 @@ crbug.com/591099 external/wpt/css/css-text/shaping/shaping-011.html [ Failure ] crbug.com/591099 [ Mac ] fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ] crbug.com/591099 [ Win ] fast/backgrounds/quirks-mode-line-box-backgrounds.html [ Failure ] -crbug.com/591099 [ Linux ] fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ] -crbug.com/591099 [ Win ] fast/borders/inline-mask-overlay-image-outset-vertical-rl.html [ Failure ] crbug.com/835484 fast/css/outline-narrowLine.html [ Failure ] crbug.com/591099 [ Mac ] fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ] crbug.com/591099 [ Win ] fast/css3-text/css3-text-decoration/text-underline-position/text-underline-position-under.html [ Failure ] @@ -1281,6 +1279,10 @@ crbug.com/1219041 external/wpt/css/css-text/white-space/text-space-collapse-discard-001.xht [ Failure ] crbug.com/1219041 external/wpt/css/css-text/white-space/text-space-trim-trim-inner-001.xht [ Failure ] +# css counters failures to be fixed with new implementation. +crbug.com/990657 external/wpt/css/css-contain/contain-style-counters-005.html [ Failure ] +crbug.com/990657 fast/css/containment/style-contain-dialogue-element.html [ Failure ] + # LayoutNG ref-tests that need to be updated (cannot be rebaselined). crbug.com/591099 [ Win ] virtual/text-antialias/ellipsis-with-self-painting-layer.html [ Failure ] crbug.com/1098801 virtual/text-antialias/whitespace/whitespace-in-pre.html [ Failure ] @@ -3602,7 +3604,6 @@ # ====== Tests from enabling .any.js/.worker.js tests begin here ====== crbug.com/709227 external/wpt/html/browsers/history/the-location-interface/per-global.window.html [ Failure ] crbug.com/709227 external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.arc.worker.html [ Failure ] -crbug.com/709227 external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.worker.html [ Failure ] crbug.com/709227 external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.curve.worker.html [ Failure ] crbug.com/709227 external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.line.worker.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index aa10fb6a..5d89fb5 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -178,7 +178,7 @@ "bases": ["wpt_internal/attribution-reporting"], "exclusive_tests": "ALL", "args": ["--attribution-reporting-debug-mode", - "--enable-features=AttributionReportingCrossAppWeb,AttributionReportingReportVerification,PrivacySandboxAdsAPIsOverride,PrivacySandboxAggregationService:trusted_server_url/https%3A%2F%2Fweb-platform.test%3A8444%2Fwpt_internal%2Fattribution-reporting%2Fresources%2FpublicKeys", + "--enable-features=AttributionReportingCrossAppWeb,AttributionReportingReportVerification,PrivacySandboxAdsAPIsOverride,AggregationServiceMultipleCloudProviders:aws_cloud/https%3A%2F%2Fweb-platform.test%3A8444/gcp_cloud/https%3A%2F%2Fwww1.web-platform.test%3A8444", "--additional-private-state-token-key-commitments={\"https://web-platform.test:8444\":{\"PrivateStateTokenV3VOPRF\":{\"protocol_version\":\"PrivateStateTokenV3VOPRF\",\"id\":1,\"batchsize\":1,\"keys\":{\"0\":{\"Y\":\"AAAAAASqh8oivosFN46xxx7zIK10bh07Younm5hZ90HgglQqOFUC8l2/VSlsOlReOHJ2CrfJ6CG1adnTkKJhZ0BtbSPWBwviQtdl64MWJc7sSg9HPvWfTjDigX5ihbzihG8V8aA=\",\"expiry\":\"253402300799000000\"}}}}}", "--disable-threaded-compositing", "--disable-threaded-animation"], "expires": "Oct 8, 2023" @@ -271,7 +271,8 @@ "media/stable", "webexposed", "compositing/filters", - "external/wpt/performance-timeline/tentative/with-filter-options-originA.html" + "external/wpt/performance-timeline/tentative/with-filter-options-originA.html", + "external/wpt/soft-navigation-heuristics/disabled.html" ], "exclusive_tests": ["media/stable"], "args": ["--stable-release-mode", @@ -1729,7 +1730,7 @@ ], "args": [ "--enable-privacy-sandbox-ads-apis", - "--enable-features=FencedFramesDefaultMode,PrivacySandboxAggregationService:trusted_server_url/https%3A%2F%2Fweb-platform.test%3A8444%2Fwpt_internal%2Fattribution-reporting%2Fresources%2FpublicKeys,FencedFramesEnforceFocus", + "--enable-features=FencedFramesDefaultMode,AggregationServiceMultipleCloudProviders:aws_cloud/https%3A%2F%2Fweb-platform.test%3A8444,FencedFramesEnforceFocus", "--disable-threaded-compositing", "--disable-threaded-animation" ], "expires": "Jan 1, 2024" @@ -1746,7 +1747,7 @@ "args": [ "--enable-privacy-sandbox-ads-apis", "--private-aggregation-developer-mode", - "--enable-features=FencedFramesDefaultMode,PrivacySandboxAggregationService:trusted_server_url/https%3A%2F%2Fweb-platform.test%3A8444%2Fwpt_internal%2Fattribution-reporting%2Fresources%2FpublicKeys,PrivateAggregationApiBundledEnhancements", + "--enable-features=FencedFramesDefaultMode,AggregationServiceMultipleCloudProviders:aws_cloud/https%3A%2F%2Fweb-platform.test%3A8444,PrivateAggregationApiBundledEnhancements", "--disable-threaded-compositing", "--disable-threaded-animation" ], "expires": "Jan 1, 2024" @@ -1779,7 +1780,7 @@ "exclusive_tests": [ "external/wpt/shared-storage-selecturl-limit/" ], - "args": ["--enable-features=SharedStorageAPI,FencedFrames:implementation_type/mparch,FencedFramesAPIChanges,FencedFramesDefaultMode,FencedFramesEnforceFocus,PrivacySandboxAdsAPIsOverride,SharedStorageSelectURLLimit", + "args": ["--enable-features=SharedStorageAPI,FencedFrames:implementation_type/mparch,FencedFramesAPIChanges,FencedFramesDefaultMode,FencedFramesEnforceFocus,PrivacySandboxAdsAPIsOverride,SharedStorageSelectURLLimit:SharedStorageSelectURLBitBudgetPerPageLoad/9,SharedStorageAPIM118", "--disable-threaded-compositing", "--disable-threaded-animation"], "expires": "Jan 1, 2024" },
diff --git a/third_party/blink/web_tests/compositing/culling/filter-occlusion-blur-large-expected.png b/third_party/blink/web_tests/compositing/culling/filter-occlusion-blur-large-expected.png index 6502368..25fbe7e 100644 --- a/third_party/blink/web_tests/compositing/culling/filter-occlusion-blur-large-expected.png +++ b/third_party/blink/web_tests/compositing/culling/filter-occlusion-blur-large-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/compositing/overflow/mask-with-filter-expected.png index cde6daa5..02a7a63b 100644 --- a/third_party/blink/web_tests/compositing/overflow/mask-with-filter-expected.png +++ b/third_party/blink/web_tests/compositing/overflow/mask-with-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-clipping-2-expected.png b/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-clipping-2-expected.png index 40bed39..783131b7 100644 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-clipping-2-expected.png +++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-clipping-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png index 1e0a4c9..c6b9e48 100644 --- a/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/css3/filters/effect-all-on-background-hw-expected.png index 5eeb3c6..95d668f8 100644 --- a/third_party/blink/web_tests/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/css3/filters/effect-blur-hw-expected.png index 1a9d58e..2ceb4c6 100644 --- a/third_party/blink/web_tests/css3/filters/effect-blur-hw-expected.png +++ b/third_party/blink/web_tests/css3/filters/effect-blur-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/css3/filters/effect-reference-ordering-hw-expected.png index 340ab5a1..a4c012f6 100644 --- a/third_party/blink/web_tests/css3/filters/effect-reference-ordering-hw-expected.png +++ b/third_party/blink/web_tests/css3/filters/effect-reference-ordering-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/css3/filters/effect-reference-zoom-hw-expected.png index 5e3c74e..56b2dfc2 100644 --- a/third_party/blink/web_tests/css3/filters/effect-reference-zoom-hw-expected.png +++ b/third_party/blink/web_tests/css3/filters/effect-reference-zoom-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/resources/publicKeys b/third_party/blink/web_tests/external/wpt/.well-known/aggregation-service/v1/public-keys similarity index 100% rename from third_party/blink/web_tests/wpt_internal/attribution-reporting/resources/publicKeys rename to third_party/blink/web_tests/external/wpt/.well-known/aggregation-service/v1/public-keys
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest-not-in-list.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest-not-in-list.json index b6d8a55..e6f5a1bb 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest-not-in-list.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest-not-in-list.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest.py b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest.py index 5a6166f..f8dced8f 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest.py +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest.py
@@ -14,6 +14,6 @@ "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token.py", "revocation_endpoint": "revoke.py", - "signin_url": "signin.html" + "login_url": "signin.html" } """
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_accounts.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_accounts.json index 5aec07f4..4a8a5469 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_accounts.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_accounts.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "/common/redirect.py?location=/credential-management/support/fedcm/accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_token.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_token.json index 8480088..35e75d1 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_token.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_redirect_token.json
@@ -3,5 +3,5 @@ "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "/common/redirect.py?location=/credential-management/support/fedcm/token.py&status=308", "revocation_endpoint": "revoke.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_account_auto_selected_flag.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_account_auto_selected_flag.json index 20ee0bf4..e3f38b79 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_account_auto_selected_flag.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_account_auto_selected_flag.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "two_accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token_with_account_auto_selected_flag.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_no_accounts.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_no_accounts.json index 3667eae..761a38b 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_no_accounts.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_no_accounts.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "no_accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token_with_account_id.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_single_account.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_single_account.json index d1eb008..72b0d6b 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_single_account.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_single_account.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "single_account.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token_with_account_id.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_two_accounts.json b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_two_accounts.json index 2a93b2f..00ae4cb 100644 --- a/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_two_accounts.json +++ b/third_party/blink/web_tests/external/wpt/credential-management/support/fedcm/manifest_with_two_accounts.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "two_accounts.py", "client_metadata_endpoint": "client_metadata.py", "id_assertion_endpoint": "token_with_account_id.py", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-001-ref.html index 7e64fa9..66951d44 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-001-ref.html
@@ -4,14 +4,18 @@ .piece { position: absolute; left: 5px; - top: 5px; + top: 0; width: 95px; - height: 95px; + height: 100px; border: solid; } + .start { + top: 5px; + height: 95px; + } </style> <div style="position:relative; margin:50px;"> - <div class="piece" style="border-width:0 5px 0 0;"></div> + <div class="piece start" style="border-width:0 5px 0 0"></div> <div class="piece" style="margin-left:120px; border-width:0 5px 0 0;"></div> <div class="piece" style="margin-left:240px; border-width:0 5px 5px 0;"></div> </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-002-ref.html index 2c148d8..1453d54 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-002-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-block-fragmentation-002-ref.html
@@ -6,12 +6,15 @@ left: -5px; top: 0; width: 95px; - height: 95px; + height: 100px; border: solid; } + .end { + height: 95px; + } </style> <div style="position:relative; margin:50px;"> <div class="piece" style="top:-5px; border-width:5px 0 0 5px;"></div> <div class="piece" style="margin-left:120px; border-width:0 0 0 5px;"></div> - <div class="piece" style="margin-left:240px; border-width:0 0 0 5px;"></div> + <div class="piece end" style="margin-left:240px; border-width:0 0 0 5px;"></div> </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-001-ref.html index 171e493..e116d81 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-001-ref.html
@@ -9,11 +9,11 @@ <br> <span style="position:relative;"> pppÉÉÉ - <div style="position:absolute; inset:5px 0 -5px 5px; border:solid black; border-width:0 0 5px 0;"></div> + <div style="position:absolute; inset:5px 0 -5px 0; border:solid black; border-width:0 0 5px 0;"></div> </span> <br> <span style="position:relative;"> pppÉÉÉ - <div style="position:absolute; inset:5px -5px -5px 5px; border:solid black; border-width:0 5px 5px 0;"></div> + <div style="position:absolute; inset:5px -5px -5px 0; border:solid black; border-width:0 5px 5px 0;"></div> </span> </div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-002-ref.html index baf297f..01bbf542 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-002-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-backgrounds/box-shadow/slice-inline-fragmentation-002-ref.html
@@ -4,12 +4,12 @@ <div style="font:16px/40px Ahem; color:cyan;"> <span style="position:relative;"> pppÉÉÉ - <div style="position:absolute; inset:-5px 5px 5px -5px; border:solid black; border-width:5px 0 0 5px;"></div> + <div style="position:absolute; inset:-5px 0 5px -5px; border:solid black; border-width:5px 0 0 5px;"></div> </span> <br> <span style="position:relative;"> pppÉÉÉ - <div style="position:absolute; inset:-5px 5px 5px 0; border:solid black; border-width:5px 0 0 0;"></div> + <div style="position:absolute; inset:-5px 0 5px 0; border:solid black; border-width:5px 0 0 0;"></div> </span> <br> <span style="position:relative;">
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-style-counters-005.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-style-counters-005.html index 6e22f7a..437836c4 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-style-counters-005.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-style-counters-005.html
@@ -9,7 +9,7 @@ clear: both; } .reset { counter-reset: c;} -.increment:before { content: counters(c, ""); } +.increment::before { content: counters(c, "."); } .increment { counter-increment: c; } </style> <body>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-style-counters-005-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-style-counters-005-ref.html index 1ea1ae3..30ecd231 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-style-counters-005-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/reference/contain-style-counters-005-ref.html
@@ -4,19 +4,16 @@ float: right; clear: both; } -.reset { counter-reset: c;} -.increment:before { content: counters(c, ""); } -.increment { counter-increment: c; } </style> <body> <div>1</div> <div class="contain"> - <div>1</div> - <div>1</div> + <div>1.1</div> + <div>1.1</div> </div> <div>2</div> <div class="contain"> - <div>1</div> - <div>2</div> + <div>2.1</div> + <div>2.2</div> </div> -<div>3</div> \ No newline at end of file +<div>3</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/mask-image/mask-image-inline-sliced-1.html b/third_party/blink/web_tests/external/wpt/css/css-masking/mask-image/mask-image-inline-sliced-1.html new file mode 100644 index 0000000..9d09cc0 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/mask-image/mask-image-inline-sliced-1.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>'box-decoration-break: slice' and 'mask-image'</title> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<link rel="help" href="https://www.w3.org/TR/css-break-3/#break-decoration"> +<link rel="help" href="https://drafts.fxtf.org/css-masking/#the-mask-image"> +<link rel="match" href="reference/mask-image-inline-sliced-1-ref.html"> +<style> + .mask-image { + font: 100px/1 Ahem; + color: green; + -webkit-mask-image: linear-gradient(to right, white 50%, transparent 50%); + mask-image: linear-gradient(to right, white 50%, transparent 50%); + } +</style> +<p>There should be a green square below.</p> +<div style="width: 100px"> + <span class="mask-image">A A</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-masking/mask-image/reference/mask-image-inline-sliced-1-ref.html b/third_party/blink/web_tests/external/wpt/css/css-masking/mask-image/reference/mask-image-inline-sliced-1-ref.html new file mode 100644 index 0000000..4e540c2 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-masking/mask-image/reference/mask-image-inline-sliced-1-ref.html
@@ -0,0 +1,14 @@ +<!DOCTYPE html> +<title>'box-decoration-break: slice' and 'mask-image' (reference)</title> +<meta name="flags" content="ahem"> +<link rel="stylesheet" type="text/css" href="/fonts/ahem.css"> +<style> + .mask-image { + font: 100px/1 Ahem; + color: green; + } +</style> +<p>There should be a green square below.</p> +<div style="width: 100px"> + <span class="mask-image">A</span> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-element-size-ref.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-element-size-ref.html new file mode 100644 index 0000000..177594c8 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-element-size-ref.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<html> +<title>View transitions: capture elements with display inline (ref)</title> +<link rel="help" href="https://github.com/WICG/view-transitions"> +<link rel="author" href="mailto:vmpstr@chromium.org"> + +<style> +body { + background: pink; +} +#box { + background: green; +} + +</style> + +<span id=box>BOX</span> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-element-size.html b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-element-size.html new file mode 100644 index 0000000..c9f0d48 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-view-transitions/inline-element-size.html
@@ -0,0 +1,35 @@ +<!DOCTYPE html> +<html class="reftest-wait"> +<title>View transitions: capture elements with display inline</title> +<link rel="help" href="https://github.com/WICG/view-transitions"> +<link rel="author" href="mailto:vmpstr@chromium.org"> +<link rel="match" href="inline-element-size-ref.html"> +<script src="/common/reftest-wait.js"></script> +<style> +#box { + background: green; + view-transition-name: target; +} + +/* We're verifying what we capture, so just display the old contents for 5 minutes. */ +html::view-transition-group(*) { animation-duration: 300s; } +html::view-transition-group(target) { background: green; } +html::view-transition-new(*) { animation: unset; opacity: 0; } +html::view-transition-old(*) { animation: unset; opacity: 1; } +/* hide the root so we show transition background to ensure we're in a transition */ +html::view-transition-group(root) { animation: unset; opacity: 0; } +html::view-transition { background: pink; } +</style> + +<span id=box>BOX</span> +<script> +failIfNot(document.startViewTransition, "Missing document.startViewTransition"); + +async function runTest() { + let t = document.startViewTransition(); + t.ready.then(takeScreenshot); +} +onload = () => requestAnimationFrame(() => requestAnimationFrame(runTest)); +</script> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-expected.html new file mode 100644 index 0000000..cc10684a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-expected.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + // No clipping. + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html new file mode 100644 index 0000000..377dd55e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.html new file mode 100644 index 0000000..88a3a67c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance.html new file mode 100644 index 0000000..8ade08be --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.long-distance.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.long-distance-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + // No clipping. + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-expected.html new file mode 100644 index 0000000..8980708 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-expected.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + // No clipping. + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html new file mode 100644 index 0000000..024fc8c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.html new file mode 100644 index 0000000..7ced448 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.html
@@ -0,0 +1,30 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance.html b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance.html new file mode 100644 index 0000000..37398400 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/layers/2d.layer.shadow-from-outside-canvas.short-distance.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.short-distance-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + // No clipping. + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed-expected.txt b/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed-expected.txt deleted file mode 100644 index 4b3f6e06..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Zero-length line segments from closed paths are removed before stroking assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed.html.ini deleted file mode 100644 index 3f3c570b..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/2d.path.stroke.prune.closed.html.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[2d.path.stroke.prune.closed.html] - [Zero-length line segments from closed paths are removed before stroking] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-expected.html new file mode 100644 index 0000000..cc10684a --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-expected.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + // No clipping. + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html new file mode 100644 index 0000000..377dd55e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.html new file mode 100644 index 0000000..98262f53 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.w.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.w.html new file mode 100644 index 0000000..90b4332 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance-with-clipping.w.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.long-distance-with-clipping-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance.html new file mode 100644 index 0000000..eea9b5d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.long-distance-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + // No clipping. + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance.w.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance.w.html new file mode 100644 index 0000000..e442255 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.long-distance.w.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.long-distance-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.long-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.long-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 10000; + + // No clipping. + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-expected.html new file mode 100644 index 0000000..8980708 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-expected.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + // No clipping. + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html new file mode 100644 index 0000000..024fc8c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html
@@ -0,0 +1,21 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = document.getElementById("canvas"); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.html new file mode 100644 index 0000000..d5f5b0c --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.html
@@ -0,0 +1,33 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.w.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.w.html new file mode 100644 index 0000000..acbf09e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance-with-clipping.w.html
@@ -0,0 +1,47 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.short-distance-with-clipping-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance-with-clipping</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance.html new file mode 100644 index 0000000..a1c4689 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance.html
@@ -0,0 +1,31 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.short-distance-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script> + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + // No clipping. + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const outputCanvas = document.getElementById("canvas"); + outputCanvas.getContext('2d').drawImage(canvas, 0, 0); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance.w.html b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance.w.html new file mode 100644 index 0000000..2e39091 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/layers/2d.layer.shadow-from-outside-canvas.short-distance.w.html
@@ -0,0 +1,45 @@ +<!DOCTYPE html> +<!-- DO NOT EDIT! This test has been generated by /html/canvas/tools/gentest.py. --> +<html class="reftest-wait"> +<link rel="match" href="2d.layer.shadow-from-outside-canvas.short-distance-expected.html"> +<title>Canvas test: 2d.layer.shadow-from-outside-canvas.short-distance</title> +<h1>2d.layer.shadow-from-outside-canvas.short-distance</h1> +<p class="desc">Checks shadow produced by object drawn outside the canvas</p> +<canvas id="canvas" width="200" height="200"> + <p class="fallback">FAIL (fallback content)</p> +</canvas> +<script id='myWorker' type='text/worker'> + self.onmessage = function(e) { + const canvas = new OffscreenCanvas(200, 200); + const ctx = canvas.getContext('2d'); + + const delta = 1; + + // No clipping. + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -(200 + delta), + dy: -(200 + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect(200 + delta, 200 + delta, 100, 100); + + ctx.endLayer(); + + const bitmap = canvas.transferToImageBitmap(); + self.postMessage(bitmap, bitmap); + }; +</script> +<script> + const blob = new Blob([document.getElementById('myWorker').textContent]); + const worker = new Worker(URL.createObjectURL(blob)); + worker.addEventListener('message', msg => { + const outputCtx = document.getElementById("canvas").getContext('2d'); + outputCtx.drawImage(msg.data, 0, 0); + document.documentElement.classList.remove("reftest-wait"); + }); + worker.postMessage(null); +</script> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed-expected.txt b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed-expected.txt deleted file mode 100644 index 4b3f6e06..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed-expected.txt +++ /dev/null
@@ -1,4 +0,0 @@ -This is a testharness.js-based test. -FAIL Zero-length line segments from closed paths are removed before stroking assert_equals: Red channel of the pixel at (50, 25) expected 0 but got 255 -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.html.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.html.ini deleted file mode 100644 index 3f3c570b..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.html.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[2d.path.stroke.prune.closed.html] - [Zero-length line segments from closed paths are removed before stroking] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.worker.js.ini b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.worker.js.ini deleted file mode 100644 index aced550..0000000 --- a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/2d.path.stroke.prune.closed.worker.js.ini +++ /dev/null
@@ -1,3 +0,0 @@ -[2d.path.stroke.prune.closed.worker.html] - [Zero-length line segments from closed paths are removed before stroking] - expected: FAIL
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml index c790389..9145108 100644 --- a/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml +++ b/third_party/blink/web_tests/external/wpt/html/canvas/tools/yaml-new/layers.yaml
@@ -737,4 +737,53 @@ clipping: |- const clipRegion = new Path2D(); clipRegion.rect(20, 20, 160, 160); - ctx.clip(clipRegion); \ No newline at end of file + ctx.clip(clipRegion); + +- name: 2d.layer.shadow-from-outside-canvas + desc: Checks shadow produced by object drawn outside the canvas + size: [200, 200] + code: | + {{ distance }} + + {{ clipping }} + + ctx.beginLayer({filter: [ + {name: 'dropShadow', dx: -({{ size[0] }} + delta), + dy: -({{ size[1] }} + delta), stdDeviation: 0, + floodColor: 'green'}, + ]}); + + ctx.fillStyle = 'red'; + ctx.fillRect({{ size[0] }} + delta, {{ size[1] }} + delta, 100, 100); + + ctx.endLayer(); + reference: | + {{ distance }} + + {{ clipping }} + + ctx.fillStyle = 'green'; + ctx.fillRect(0, 0, 100, 100); + variants: + short-distance: + distance: |- + const delta = 1; + clipping: // No clipping. + short-distance-with-clipping: + distance: |- + const delta = 1; + clipping: |- + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion); + long-distance: + distance: |- + const delta = 10000; + clipping: // No clipping. + long-distance-with-clipping: + distance: |- + const delta = 10000; + clipping: |- + const clipRegion = new Path2D(); + clipRegion.rect(20, 20, 160, 160); + ctx.clip(clipRegion);
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-failure.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-failure.https.html index 3194ee4d..b512afc 100644 --- a/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-failure.https.html +++ b/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-failure.https.html
@@ -1,4 +1,5 @@ <!doctype html> +<meta name=timeout content=long> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-success.https.html b/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-success.https.html index c616091..1d89032 100644 --- a/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-success.https.html +++ b/third_party/blink/web_tests/external/wpt/private-aggregation/protected-audience-surface-success.https.html
@@ -1,4 +1,5 @@ <!doctype html> +<meta name=timeout content=long> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> <script src="/common/utils.js"></script>
diff --git a/third_party/blink/web_tests/external/wpt/private-aggregation/resources/protected-audience-helper-module.js b/third_party/blink/web_tests/external/wpt/private-aggregation/resources/protected-audience-helper-module.js index 09d2355..53b79c0a 100644 --- a/third_party/blink/web_tests/external/wpt/private-aggregation/resources/protected-audience-helper-module.js +++ b/third_party/blink/web_tests/external/wpt/private-aggregation/resources/protected-audience-helper-module.js
@@ -45,7 +45,7 @@ return createReportingURL(uuid, 'read'); } -async function waitForObservedReports(uuid, expectedNumReports, timeout = 1000 /*ms*/) { +async function waitForObservedReports(uuid, expectedNumReports, timeout = 5000 /*ms*/) { expectedReports = Array(expectedNumReports).fill('default-report'); const reportURL = createReadingURL(uuid); let startTime = performance.now();
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html b/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html similarity index 67% rename from third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html rename to third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html index df69597..b71c368 100644 --- a/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html +++ b/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html
@@ -11,9 +11,9 @@ <script> 'use strict'; -function getOtherOriginURL(url) { +function getCrossSiteURL(url) { return new URL(url.toString().replace(location.origin, - get_host_info().AUTHENTICATED_ORIGIN)); + get_host_info().HTTPS_NOTSAMESITE_ORIGIN)); } promise_test(async () => { @@ -26,14 +26,21 @@ "resources/run-url-selection-operation-limit-inner.https.html", [ancestorKey]); - // The per origin per pageload limit is 6 bits. + // The per site per pageload limit is 6 bits. url0.searchParams.append(bitsKey, perOriginBitLimit.toString()); attachIFrame(url0); const result0 = await nextValueFromServer(ancestorKey); assert_equals(result0, "run_url_selection_limit_inner_succeeded"); - // This url will already have a search param of ("bits", "6") appended. - let url1 = getRemoteOriginURL(url0); + let url1 = generateURL( + "/shared-storage-selecturl-limit/" + + "resources/run-url-selection-operation-limit-inner.https.html", + [ancestorKey]); + + // The overall pageload budget should have 3 bits remaining, as we have set + // it to start at 9. + url1.searchParams.append(bitsKey, "3"); + url1 = getCrossSiteURL(url1); attachIFrame(url1); const result1 = await nextValueFromServer(ancestorKey); assert_equals(result1, "run_url_selection_limit_inner_succeeded"); @@ -43,11 +50,11 @@ "resources/run-url-selection-operation-limit-inner.https.html", [ancestorKey]); - // Since the overall per pageload limit is 12 bits, it should have already - // been reached, but we need to verify this using a third origin whose per - // origin budget is fresh. + // Since the overall per pageload limit is 9 bits here, it should have + // already been reached, even though `url2`'s site should have 3 bits + // remaining in the per-site budget, since it is same-site with `url1`. url2.searchParams.append(bitsKey, "0"); - url2 = getOtherOriginURL(url2); + url2 = getCrossSiteURL(url2); attachIFrame(url2); const result2 = await nextValueFromServer(ancestorKey); assert_equals(result2, "run_url_selection_limit_inner_succeeded");
diff --git a/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html.ini b/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html.ini similarity index 62% rename from third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html.ini rename to third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html.ini index bb8ff69..2e24774 100644 --- a/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html.ini +++ b/third_party/blink/web_tests/external/wpt/shared-storage-selecturl-limit/run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html.ini
@@ -1,4 +1,4 @@ -[run-url-selection-operation-limit-multiple-origins.tentative.https.sub.html] +[run-url-selection-operation-limit-multiple-sites.tentative.https.sub.html] expected: if product == "chrome": TIMEOUT ERROR
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/disabled-expected.txt b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/disabled-expected.txt new file mode 100644 index 0000000..964b8da --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/disabled-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +FAIL Test that a soft navigation is not detected when the feature is disabled promise_test: Unhandled rejection with value: "Soft navigation should not be triggered" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/disabled.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/disabled.html new file mode 100644 index 0000000..b53c2f7 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/disabled.html
@@ -0,0 +1,31 @@ +<!DOCTYPE HTML> +<html> +<head> +<meta charset="utf-8"> +<title>Detect simple soft navigation.</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="resources/soft-navigation-helper.js"></script> +</head> +<body> + <main id=main> + <a id=link>Click me!</a> + </main> + <script> + const link = document.getElementById("link"); + testSoftNavigationNotDetected({ + eventHandler: url => { + addTextToDivOnMain(); + history.pushState({}, '', 'foobar.html'); + }, + link: link, + eventName: "click", + eventTarget: link, + testName: "Test that a soft navigation is not detected when the feature " + + "is disabled"}); + </script> +</body> +</html> +
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/resources/soft-navigation-helper.js b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/resources/soft-navigation-helper.js index 37097b2..7f83df75f 100644 --- a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/resources/soft-navigation-helper.js +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/resources/soft-navigation-helper.js
@@ -91,8 +91,13 @@ }); t.step_timeout(resolve, 1000); }); - assert_equals( + if (document.softNavigations) { + assert_equals( document.softNavigations, 0, 'Soft Navigation not detected'); + } + const postClickLcp = await getLcpEntries(); + assert_equals( + preClickLcp.length, postClickLcp.length, 'No LCP entries accumulated'); }, options.testName); };
diff --git a/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering-expected.html b/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering-expected.html index 994c5f7..e9afb97 100644 --- a/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering-expected.html +++ b/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering-expected.html
@@ -13,12 +13,13 @@ .shadowObscurer { display: inline; position: absolute; - width: 5px; + width: 7px; height: 40px; background: white; } #rightCutHighlight { display: inline; + padding-right: 3px; border-top: 2px solid red; border-right: 0px solid red; border-left: 2px solid red; @@ -29,7 +30,9 @@ #leftCutHighlight { display: inline; margin: 0px; + margin-left: -3px; padding: 0px; + padding-left: 3px; border-top: 2px solid red; border-right: 2px solid red; border-left: 0px solid red; @@ -54,9 +57,9 @@ <span> This long word should break in a new line : <span id="rightCutHighlight">veryveryveryveryveryveryvery-</span> - <div class="shadowObscurer" style="top:40px;"></div><br> - <div class="shadowObscurer" style="top:80px; margin-left:-5px;"></div> - <span id="leftCutHighlight">-longword</span>. box-decoration-break is set to cloned, + <div class="shadowObscurer" style="top:40px; margin-left:-3px;"></div><br> + <div class="shadowObscurer" style="top:80px; margin-left:-7px;"></div> + <span id="leftCutHighlight">-longword</span>. box-decoration-break is set to sliced, so the right edge of the previous line is cut, and the left edge of the highlight in this line is cut too. </span> </div>
diff --git a/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering.html b/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering.html index 988b14b1..618f920 100644 --- a/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering.html +++ b/third_party/blink/web_tests/fast/box-decoration-break/box-decoration-break-rendering.html
@@ -30,7 +30,7 @@ <body> <h1>Box-decoration-break: slice</h1> <div style="line-height:40px;"> - <span id="slice">This long word should break in a new line : <highlight>veryveryveryveryveryveryvery-<br>-longword</highlight>. box-decoration-break is set to cloned, + <span id="slice">This long word should break in a new line : <highlight>veryveryveryveryveryveryvery-<br>-longword</highlight>. box-decoration-break is set to sliced, so the right edge of the previous line is cut, and the left edge of the highlight in this line is cut too.</span> </div> <h1>Box-decoration-break: clone</h1>
diff --git a/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element-expected.html b/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element-expected.html index b4c10ae4..1e7fd95 100644 --- a/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element-expected.html +++ b/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element-expected.html
@@ -2,10 +2,10 @@ <div>1</div> <div> <dialog id="test"> - <div>1</div> + <div>1.1</div> </dialog> </div> <div>2</div> <script> document.getElementById("test").showModal(); -</script> \ No newline at end of file +</script>
diff --git a/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element.html b/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element.html index 33fd21f..2a6a6b0 100644 --- a/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element.html +++ b/third_party/blink/web_tests/fast/css/containment/style-contain-dialogue-element.html
@@ -2,7 +2,7 @@ <style> .contain { contain: style; } .reset { counter-reset: c;} -.increment:before { content: counters(c, ""); } +.increment::before { content: counters(c, "."); } .increment { counter-increment: c; } </style> <div class="increment"></div> @@ -14,4 +14,4 @@ <div class="increment"></div> <script> document.getElementById("test").showModal(); -</script> \ No newline at end of file +</script>
diff --git a/third_party/blink/web_tests/fast/css/containment/style-containment-with-counter-nodes-expected.html b/third_party/blink/web_tests/fast/css/containment/style-containment-with-counter-nodes-expected.html deleted file mode 100644 index d32a724..0000000 --- a/third_party/blink/web_tests/fast/css/containment/style-containment-with-counter-nodes-expected.html +++ /dev/null
@@ -1,22 +0,0 @@ -<!DOCTYPE html> -<style> -.contain { - float: right; - clear: both; -} -.reset { counter-reset: c;} -.increment:before { content: counters(c, ""); } -.increment { counter-increment: c; } -</style> -<body> -<div>1</div> -<div class="contain"> - <div>1</div> - <div>1</div> -</div> -<div>2</div> -<div class="contain"> - <div>1</div> - <div>2</div> -</div> -<div>3</div> \ No newline at end of file
diff --git a/third_party/blink/web_tests/fast/css/containment/style-containment-with-counter-nodes.html b/third_party/blink/web_tests/fast/css/containment/style-containment-with-counter-nodes.html deleted file mode 100644 index 4b40fba..0000000 --- a/third_party/blink/web_tests/fast/css/containment/style-containment-with-counter-nodes.html +++ /dev/null
@@ -1,24 +0,0 @@ -<!DOCTYPE html> -<style> -.contain { - float: right; - contain: style; - clear: both; -} -.reset { counter-reset: c;} -.increment:before { content: counters(c, ""); } -.increment { counter-increment: c; } -</style> -<body> -<div class="increment"></div> -<div class="contain"> - <div class="increment"></div> - <div class="reset"></div> - <div class="increment"></div> -</div> -<div class="increment"></div> -<div class="contain"> - <div class="increment"></div> - <div class="increment"></div> -</div> -<div class="increment"></div> \ No newline at end of file
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png deleted file mode 100644 index 7cb20ce..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png deleted file mode 100644 index 53f79205..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png deleted file mode 100644 index 62546a27..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png deleted file mode 100644 index 2c10663..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png deleted file mode 100644 index ffc699295..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/unfenced-top.https-expected.txt b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/unfenced-top.https-expected.txt deleted file mode 100644 index e25ea921..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/fenced-frame-mparch/wpt_internal/fenced_frame/unfenced-top.https-expected.txt +++ /dev/null
@@ -1,12 +0,0 @@ -This is a testharness.js-based test. -FAIL _unfencedTop opaque-ads non-refresh success case promise_test: Unhandled rejection with value: object "SecurityError: An attempt was made to break through the security policy of the user agent." -PASS _unfencedTop opaque-ads refresh success case -PASS _unfencedTop opaque-ads nested iframe success case -PASS _unfencedTop :javascript URL failure -PASS _unfencedTop :blob URL failure -PASS _unfencedTop fragment navigation -PASS _unfencedTop outside a fenced frame -PASS _unfencedTop in default fenced frame -PASS _unfencedTop in opaque-ads -> default fenced frame -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/overflow/overflow-transform-perspective-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/overflow/overflow-transform-perspective-expected.png deleted file mode 100644 index 4f6a3cb..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/overflow/overflow-transform-perspective-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-expected.png deleted file mode 100644 index b6d286c..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png deleted file mode 100644 index 3fd0b1f..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/transformed-caret-expected.png deleted file mode 100644 index 3206076..0000000 --- a/third_party/blink/web_tests/flag-specific/disable-site-isolation-trials/virtual/single-threaded-tests/transforms/transformed-caret-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/compositing/culling/filter-occlusion-blur-large-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/compositing/culling/filter-occlusion-blur-large-expected.png index 86a8b54..ddd9e61 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/compositing/culling/filter-occlusion-blur-large-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/compositing/culling/filter-occlusion-blur-large-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/highdpi/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/flag-specific/highdpi/compositing/geometry/vertical-scroll-composited-expected.png index 71198d7..d2c6cf7d 100644 --- a/third_party/blink/web_tests/flag-specific/highdpi/compositing/geometry/vertical-scroll-composited-expected.png +++ b/third_party/blink/web_tests/flag-specific/highdpi/compositing/geometry/vertical-scroll-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/mask-with-filter-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/mask-with-filter-expected.png index 6c87e2be..8879db8 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/mask-with-filter-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/overflow/mask-with-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png index eebc94e..eb0991e 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/animation-inside-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/compositing-change-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/compositing-change-inside-reflection-expected.png index 424b33f0..7e3b306 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/compositing-change-inside-reflection-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/compositing-change-inside-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/deeply-nested-reflections-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/deeply-nested-reflections-expected.png index b6e9a49..e58c76bb 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/deeply-nested-reflections-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/deeply-nested-reflections-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png index 58f6b21..12abb5e7 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-animated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-expected.png index 6c4719e..892b470a 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-on-overflow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-on-overflow-expected.png index c84cc9d..cb25a34 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-on-overflow-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-on-overflow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-opacity-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-opacity-expected.png index 33c4181..e22d44b5 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-opacity-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-size-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-size-change-expected.png index 0597873c..2576af6 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-size-change-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/nested-reflection-size-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/reflection-positioning-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/reflection-positioning-expected.png index ece944d..f84dfa5 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/reflection-positioning-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/reflection-positioning-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/simple-composited-reflections-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/simple-composited-reflections-expected.png index ca250b27..d09f785 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/simple-composited-reflections-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/simple-composited-reflections-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png index 78e61a9..646ab69c 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/compositing/reflections/transform-inside-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-parents-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-parents-expected.png index 901194446..aee41abb 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-parents-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-parents-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-self-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-self-expected.png index 80d94d0..435df40 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-self-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/blur-filter-page-scroll-self-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/crash-filter-change-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/crash-filter-change-expected.png index 852ee4d0..f142c26 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/crash-filter-change-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/crash-filter-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-blur-expected.png index 3692ebb..87dd7a7 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-blur-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/effect-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-change-repaint-expected.png index 531ccc05..14db73d 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-change-repaint-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-change-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-blur-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-blur-expected.png index 9aad9ab..8fda600 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-blur-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-expected.png index 50f27a4..76a14e5 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-shadow-expected.png b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-shadow-expected.png index 45d595d..9e14a44 100644 --- a/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-shadow-expected.png +++ b/third_party/blink/web_tests/flag-specific/skia-vulkan-swiftshader/css3/filters/filter-repaint-shadow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-registered-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-registered-expected.txt index 2f5287b..e48b13f 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-registered-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/attribution-reporting/source-registered-expected.txt
@@ -1,6 +1,7 @@ Test that the Storage.attributionReportingSourceRegistered event is fired. { registration : { + aggregatableReportWindow : 2592000 aggregationKeys : [ [0] : { key : d
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login-expected.txt similarity index 82% rename from third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin-expected.txt rename to third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login-expected.txt index f7584d02..3a90ad2b8 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login-expected.txt
@@ -3,8 +3,8 @@ accounts : [ ] dialogId : <string> - dialogType : ConfirmIdpSignin - title : Confirm IDP Signin + dialogType : ConfirmIdpLogin + title : Confirm IDP Login } msg.params: { accounts : [ @@ -13,7 +13,7 @@ email : john_doe@idp.example givenName : John idpConfigUrl : https://127.0.0.1:8443/resources/fedcm/fedcm.json - idpSigninUrl : https://127.0.0.1:8443/resources/fedcm/signin.html + idpLoginUrl : https://127.0.0.1:8443/resources/fedcm/signin.html loginState : SignIn name : John Doe pictureUrl : https://idp.example/profile/123 @@ -23,7 +23,7 @@ email : aisha@idp.example givenName : Aisha idpConfigUrl : https://127.0.0.1:8443/resources/fedcm/fedcm.json - idpSigninUrl : https://127.0.0.1:8443/resources/fedcm/signin.html + idpLoginUrl : https://127.0.0.1:8443/resources/fedcm/signin.html loginState : SignUp name : Aisha Ahmad pictureUrl : https://idp.example/profile/567
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin.js b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login.js similarity index 92% rename from third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin.js rename to third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login.js index 6532d65..9b242123 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-signin.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-confirm-idp-login.js
@@ -29,11 +29,11 @@ } testRunner.log(msg.params, "msg.params: ", ["dialogId"]); - if (msg.params.dialogType != "ConfirmIdpSignin") { + if (msg.params.dialogType != "ConfirmIdpLogin") { testRunner.fail("Wrong dialog type"); return; } - dp.FedCm.confirmIdpSignin({dialogId: msg.params.dialogId}); + dp.FedCm.confirmIdpLogin({dialogId: msg.params.dialogId}); // Now wait for the account chooser dialog. msg = await dp.FedCm.onceDialogShown();
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-after-dialog-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-after-dialog-expected.txt index f4d6b8a85..0f00c686 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-after-dialog-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-after-dialog-expected.txt
@@ -6,7 +6,7 @@ email : john_doe@idp.example givenName : John idpConfigUrl : https://127.0.0.1:8443/resources/fedcm/fedcm.json - idpSigninUrl : https://127.0.0.1:8443/resources/fedcm/signin.html + idpLoginUrl : https://127.0.0.1:8443/resources/fedcm/signin.html loginState : SignIn name : John Doe pictureUrl : https://idp.example/profile/123 @@ -16,7 +16,7 @@ email : aisha@idp.example givenName : Aisha idpConfigUrl : https://127.0.0.1:8443/resources/fedcm/fedcm.json - idpSigninUrl : https://127.0.0.1:8443/resources/fedcm/signin.html + idpLoginUrl : https://127.0.0.1:8443/resources/fedcm/signin.html loginState : SignUp name : Aisha Ahmad pictureUrl : https://idp.example/profile/567
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-before-dialog-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-before-dialog-expected.txt index ae3ea85..6e93d655 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-before-dialog-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/fedcm/fedcm-dialog-event-enable-before-dialog-expected.txt
@@ -6,7 +6,7 @@ email : john_doe@idp.example givenName : John idpConfigUrl : https://127.0.0.1:8443/resources/fedcm/fedcm.json - idpSigninUrl : https://127.0.0.1:8443/resources/fedcm/signin.html + idpLoginUrl : https://127.0.0.1:8443/resources/fedcm/signin.html loginState : SignIn name : John Doe pictureUrl : https://idp.example/profile/123 @@ -16,7 +16,7 @@ email : aisha@idp.example givenName : Aisha idpConfigUrl : https://127.0.0.1:8443/resources/fedcm/fedcm.json - idpSigninUrl : https://127.0.0.1:8443/resources/fedcm/signin.html + idpLoginUrl : https://127.0.0.1:8443/resources/fedcm/signin.html loginState : SignUp name : Aisha Ahmad pictureUrl : https://idp.example/profile/567
diff --git a/third_party/blink/web_tests/http/tests/resources/fedcm/fedcm.json b/third_party/blink/web_tests/http/tests/resources/fedcm/fedcm.json index c4f60117..9a50849 100644 --- a/third_party/blink/web_tests/http/tests/resources/fedcm/fedcm.json +++ b/third_party/blink/web_tests/http/tests/resources/fedcm/fedcm.json
@@ -2,5 +2,5 @@ "accounts_endpoint": "accounts.php", "client_metadata_endpoint": "client_metadata.json", "id_assertion_endpoint": "token.php", - "signin_url": "signin.html" + "login_url": "signin.html" }
diff --git a/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-expected.png b/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-expected.png index 7235f65..0f08e2b 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-large-expected.png b/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-large-expected.png index 39042eb1..8a79e226 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-large-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/culling/filter-occlusion-blur-large-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png b/third_party/blink/web_tests/platform/linux/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png index a39deb8c..bf846960 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/geometry/fixed-position-transform-composited-page-scale-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/geometry/vertical-scroll-composited-expected.png b/third_party/blink/web_tests/platform/linux/compositing/geometry/vertical-scroll-composited-expected.png index 52b015e..89891943 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/geometry/vertical-scroll-composited-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/geometry/vertical-scroll-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/animation-inside-reflection-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/animation-inside-reflection-expected.png index 8c227cb..ab6f2ddf 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/animation-inside-reflection-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/animation-inside-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/compositing-change-inside-reflection-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/compositing-change-inside-reflection-expected.png index bc04b97..1756937 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/compositing-change-inside-reflection-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/compositing-change-inside-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/deeply-nested-reflections-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/deeply-nested-reflections-expected.png index 663edac1..7c09b1dc 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/deeply-nested-reflections-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/deeply-nested-reflections-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png index 1ac87c9..84385dd 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-animated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-expected.png index bf37084..196142c 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-on-overflow-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-on-overflow-expected.png index 2546cc6a5..bca977f 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-on-overflow-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-on-overflow-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-opacity-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-opacity-expected.png index 1e28ed0..af61c6cb 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-opacity-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-opacity-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-size-change-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-size-change-expected.png index a0f44ac..bc1c606 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-size-change-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-size-change-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-transition-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-transition-expected.png index 06ed71fb9..3c93498 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-transition-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/nested-reflection-transition-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-in-composited-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-in-composited-expected.png index 24706e3..aa0a69b 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-in-composited-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-in-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-positioning-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-positioning-expected.png index c0381e2..b4daa4d 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-positioning-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/reflection-positioning-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/simple-composited-reflections-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/simple-composited-reflections-expected.png index 4edab7a..c536759 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/simple-composited-reflections-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/simple-composited-reflections-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/reflections/transform-inside-reflection-expected.png b/third_party/blink/web_tests/platform/linux/compositing/reflections/transform-inside-reflection-expected.png index f34d57ea..b68c850 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/reflections/transform-inside-reflection-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/reflections/transform-inside-reflection-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/platform/linux/compositing/transform-3d-scales-different-x-y-expected.png index dfff484..37bbcf54 100644 --- a/third_party/blink/web_tests/platform/linux/compositing/transform-3d-scales-different-x-y-expected.png +++ b/third_party/blink/web_tests/platform/linux/compositing/transform-3d-scales-different-x-y-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-boundary-expected.png index d4ead27..17ea25b 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-clipping-2-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-clipping-2-expected.png index 81f36ce..e03a789 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-clipping-2-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-clipping-2-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-pixels-expected.png index d752910c1..3337567 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/composited-reflected-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/composited-reflected-expected.png index eb50b76..1028597 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/composited-reflected-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/composited-reflected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/effect-all-on-background-hw-expected.png index f4be9bab..5e0dbbc 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/effect-blur-hw-expected.png index a062de8..3c2b6c8 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/effect-blur-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/effect-blur-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/effect-contrast-hw-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/effect-contrast-hw-expected.png index d52e4d7..8c6fb7d 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/effect-contrast-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/effect-contrast-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/effect-reference-ordering-hw-expected.png index 2ebadf00..df1e2a4 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/effect-reference-ordering-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/effect-reference-ordering-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-composited-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-composited-expected.png index 60c5bb4..cd5c04ac 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-composited-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-expected.png index df01499..771a7e7 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/filter-change-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-composited-fallback-crash-expected.png b/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-composited-fallback-crash-expected.png index 6d7fb3f..d739ef7 100644 --- a/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-composited-fallback-crash-expected.png +++ b/third_party/blink/web_tests/platform/linux/css3/filters/filter-repaint-composited-fallback-crash-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/border-radius-split-inline-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/border-radius-split-inline-expected.png index aecf0e5..ebb0a008 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/border-radius-split-inline-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/border-radius-split-inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png index 7a94b84..be2a7a0 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png index 822c23d7..e5cb7fdb 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png index 880ff15..82ffd4d8 100644 --- a/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/box-shadow/basic-shadows-expected.png b/third_party/blink/web_tests/platform/linux/fast/box-shadow/basic-shadows-expected.png index 1739a2a..40bd4908 100644 --- a/third_party/blink/web_tests/platform/linux/fast/box-shadow/basic-shadows-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/box-shadow/basic-shadows-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/fast/frames/frame-set-scaling-skew-expected.png b/third_party/blink/web_tests/platform/linux/fast/frames/frame-set-scaling-skew-expected.png index b5a6f80..dd2bbcc 100644 --- a/third_party/blink/web_tests/platform/linux/fast/frames/frame-set-scaling-skew-expected.png +++ b/third_party/blink/web_tests/platform/linux/fast/frames/frame-set-scaling-skew-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/platform/linux/images/optimize-contrast-canvas-expected.png index d470cbe..bfedbd1 100644 --- a/third_party/blink/web_tests/platform/linux/images/optimize-contrast-canvas-expected.png +++ b/third_party/blink/web_tests/platform/linux/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/platform/linux/images/optimize-contrast-image-expected.png index d470cbe..bfedbd1 100644 --- a/third_party/blink/web_tests/platform/linux/images/optimize-contrast-image-expected.png +++ b/third_party/blink/web_tests/platform/linux/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/paint/invalidation/transform/caret-with-transformation-expected.png b/third_party/blink/web_tests/platform/linux/paint/invalidation/transform/caret-with-transformation-expected.png index 16128b5..a11f927 100644 --- a/third_party/blink/web_tests/platform/linux/paint/invalidation/transform/caret-with-transformation-expected.png +++ b/third_party/blink/web_tests/platform/linux/paint/invalidation/transform/caret-with-transformation-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png index 7dd02f5..31bb723 100644 --- a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png +++ b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-overlapping-expected.png b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-overlapping-expected.png index d3457df..d1de9d0 100644 --- a/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-overlapping-expected.png +++ b/third_party/blink/web_tests/platform/linux/transforms/3d/point-mapping/3d-point-mapping-overlapping-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png index 7cb20ce..464bb8ac 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png index 53f79205..93182e8 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-appearance-highlight-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png index 62546a27..a3ab735 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/calendar-picker/date-picker-disabled-values-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png index 2c10663..24705b4 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/time-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png index ffc699295..919cca7 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/controls-refresh-hc/fast/forms/color-scheme/suggestion-picker/week-suggestion-picker-appearance-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png deleted file mode 100644 index 54ea6ab7..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/lots-of-img-layers-expected.png deleted file mode 100644 index fc45b6e..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/lots-of-img-layers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/lots-of-img-layers-with-opacity-expected.png deleted file mode 100644 index 6bb5d7a..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/lots-of-img-layers-with-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-added-filters-expected.png index 53badce..783e874 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-removed-filters-expected.png deleted file mode 100644 index 2f15646..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/masks/mask-with-removed-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/reflections/nested-reflection-transformed-expected.png deleted file mode 100644 index 4fde7ce5..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/disable-solid-color-layers/compositing/reflections/nested-reflection-transformed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png index 26352107..bdcbb91 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-image-expected.png index 26352107..bdcbb91 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-image-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png index 071c1fc..2931e50 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/yuv-decode-eligible/color-profile-filter-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png index 82d5c06..bdb8b959 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png index 4842b6f..1df98f4 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/composited-reflected-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/composited-reflected-expected.png index 7c7ff58..da03487 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/composited-reflected-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/composited-reflected-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png index 9c16e75..b6b0f4f 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png index ffb22ba..b4e1441 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png index 0180773a..ff239fd 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png index 8468c2a..d2917dd 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png index a918559..e5fe1bd 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-contrast-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png index 830f243c..ab73d13 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-drop-shadow-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png index 7e0219f5..d34aadd 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-invert-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png index 039b84af..39f6b66 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-opacity-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png index 95d1db4..771cafb 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png index 1ecb915..4a58f58 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png index eff7de9..6bee5ff 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png index c41cd26..6175406 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png index 39399b6e..c936af4 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-composited-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-composited-expected.png index 6e7bc80a..88b6f60 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-composited-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-composited-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-expected.png b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-expected.png index 54eccc1..6dceaa9 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/scalefactor200/css3/filters/filter-change-repaint-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png deleted file mode 100644 index 54ea6ab7..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/gestures/gesture-tapHighlight-pixel-rotated-link-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/lots-of-img-layers-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/lots-of-img-layers-expected.png deleted file mode 100644 index fc45b6e..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/lots-of-img-layers-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/lots-of-img-layers-with-opacity-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/lots-of-img-layers-with-opacity-expected.png deleted file mode 100644 index 6bb5d7a..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/lots-of-img-layers-with-opacity-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-added-filters-expected.png index 53badce..783e874 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-removed-filters-expected.png deleted file mode 100644 index 2f15646..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/masks/mask-with-removed-filters-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/reflections/nested-reflection-transformed-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/reflections/nested-reflection-transformed-expected.png deleted file mode 100644 index 4fde7ce5..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/compositing/reflections/nested-reflection-transformed-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png deleted file mode 100644 index 2ed8864..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-combined-hw-expected.png deleted file mode 100644 index 6ec0731..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-combined-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-colorspace-hw-expected.png deleted file mode 100644 index 9ad03b58..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-colorspace-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-hw-expected.png deleted file mode 100644 index d9acb9b..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-hw-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-subregion-hw-expected.png index 41a8ae5f..0520fc4 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-subregion-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-subregion-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-zoom-hw-expected.png index fa151a6766..d0ba6e7c 100644 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-zoom-hw-expected.png +++ b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/effect-reference-zoom-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/filter-repaint-composited-fallback-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/filter-repaint-composited-fallback-expected.png deleted file mode 100644 index 6d7fb3f..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/css3/filters/filter-repaint-composited-fallback-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/images/yuv-decode-eligible/color-profile-layer-filter-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/images/yuv-decode-eligible/color-profile-layer-filter-expected.png deleted file mode 100644 index 544a9da52..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/images/yuv-decode-eligible/color-profile-layer-filter-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/overflow/overflow-transform-perspective-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/overflow/overflow-transform-perspective-expected.png deleted file mode 100644 index 4f6a3cb..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/overflow/overflow-transform-perspective-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-expected.png deleted file mode 100644 index b6d286c..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png deleted file mode 100644 index 3fd0b1f..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/transformed-caret-expected.png deleted file mode 100644 index 3206076..0000000 --- a/third_party/blink/web_tests/platform/linux/virtual/single-threaded-tests/transforms/transformed-caret-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index e279622..0000000 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png index 393f2ea8..f59dd9f2 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png index 6558a0d..d295b5b8 100644 --- a/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac11-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index e279622..0000000 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png index 393f2ea8..f59dd9f2 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png index 6558a0d..d295b5b8 100644 --- a/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac12-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png deleted file mode 100644 index e279622..0000000 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png index 393f2ea8..f59dd9f2 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png index 6558a0d..d295b5b8 100644 --- a/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac-mac13-arm64/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png index 9ce1da4..4e30528 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png index 370bf78a..2df70a3 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png index 431dff0..2e451a2 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/perspective-interest-rect-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/platform/mac/compositing/reflections/nested-reflection-animated-expected.png index 839b9c8c2..f5e61452 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/reflections/nested-reflection-animated-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/reflections/nested-reflection-animated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/platform/mac/compositing/transform-3d-scales-different-x-y-expected.png index c3ff12b..8d4cee80 100644 --- a/third_party/blink/web_tests/platform/mac/compositing/transform-3d-scales-different-x-y-expected.png +++ b/third_party/blink/web_tests/platform/mac/compositing/transform-3d-scales-different-x-y-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png index 7f4ac934..c41d2ac0 100644 --- a/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/blending/background-blend-mode-overlapping-accelerated-elements-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-combined-hw-expected.png index 1e70aaa7..f7402b0 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png index 8859c7f..4e299f7 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-colorspace-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-hw-expected.png index 9a381b9..cc8bf87 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png index 884fa3e..c0c645e 100644 --- a/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/css3/filters/effect-reference-subregion-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/border-radius-split-inline-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/border-radius-split-inline-expected.png index b5954bf..c4d239fb 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/border-radius-split-inline-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/border-radius-split-inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png index b48bdf3..1bc80d6 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png index 3edd113..c1853292 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png index 11405bd..b90911d 100644 --- a/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/fast/box-shadow/basic-shadows-expected.png b/third_party/blink/web_tests/platform/mac/fast/box-shadow/basic-shadows-expected.png index d4bb5f2..ad4bbc73 100644 --- a/third_party/blink/web_tests/platform/mac/fast/box-shadow/basic-shadows-expected.png +++ b/third_party/blink/web_tests/platform/mac/fast/box-shadow/basic-shadows-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png index 03f1e534..ae33b139 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-expected.png index 408e9123..16390c2 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png index 6f5eed00..ff41197 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/platform/mac/transforms/transformed-caret-expected.png index c198fb2..1b16bba 100644 --- a/third_party/blink/web_tests/platform/mac/transforms/transformed-caret-expected.png +++ b/third_party/blink/web_tests/platform/mac/transforms/transformed-caret-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png new file mode 100644 index 0000000..c15e7eb2 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png index ebbc0331..b941c11 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png index c548dedc..03bcab5 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png index b5dfed9..68cd40a 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png index 95b8265..b24bd77 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png index b626e94..be0b39f 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png index f1a1c71e..bbb153e 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png index f7660378..0052e1ec 100644 --- a/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png +++ b/third_party/blink/web_tests/platform/mac/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png index 540212bc..52a7dbc 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-added-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png index 6f64178..33773cb 100644 --- a/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/masks/mask-with-removed-filters-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png b/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png index c3c6437..9601165 100644 --- a/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/perspective-interest-rect-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/reflections/nested-reflection-animated-expected.png b/third_party/blink/web_tests/platform/win/compositing/reflections/nested-reflection-animated-expected.png index 542a245..d0795d389 100644 --- a/third_party/blink/web_tests/platform/win/compositing/reflections/nested-reflection-animated-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/reflections/nested-reflection-animated-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/compositing/transform-3d-scales-different-x-y-expected.png b/third_party/blink/web_tests/platform/win/compositing/transform-3d-scales-different-x-y-expected.png index ebfe7a4..c96e9ae 100644 --- a/third_party/blink/web_tests/platform/win/compositing/transform-3d-scales-different-x-y-expected.png +++ b/third_party/blink/web_tests/platform/win/compositing/transform-3d-scales-different-x-y-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png index a1793562..ccaa3c5 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-combined-hw-expected.png index fb776f57..45a01556 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-colorspace-hw-expected.png index 45891c96..5fa84f6 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-colorspace-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-colorspace-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-hw-expected.png index b43f47e..714bc03 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-hw-expected.png index 62480db..14d64e4 100644 --- a/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/css3/filters/effect-reference-subregion-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/border-radius-split-inline-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/border-radius-split-inline-expected.png index 1cab0175..1622bc2 100644 --- a/third_party/blink/web_tests/platform/win/fast/borders/border-radius-split-inline-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/borders/border-radius-split-inline-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-expected.png index 205f365..5140757 100644 --- a/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-expected.png index 0318379..65b5a31 100644 --- a/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png b/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png index 70caec5..9802899 100644 --- a/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/borders/inline-mask-overlay-image-outset-vertical-rl-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/fast/box-shadow/basic-shadows-expected.png b/third_party/blink/web_tests/platform/win/fast/box-shadow/basic-shadows-expected.png index 7af3d79..dae5368 100644 --- a/third_party/blink/web_tests/platform/win/fast/box-shadow/basic-shadows-expected.png +++ b/third_party/blink/web_tests/platform/win/fast/box-shadow/basic-shadows-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png index fdaef51d..df3a019 100644 --- a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-coplanar-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-expected.png b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-expected.png index 3cf3984..5de5c281 100644 --- a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png index e53a233..32956902 100644 --- a/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/3d/point-mapping/3d-point-mapping-preserve-3d-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/transforms/transformed-caret-expected.png b/third_party/blink/web_tests/platform/win/transforms/transformed-caret-expected.png index fa6b49a..851c99b 100644 --- a/third_party/blink/web_tests/platform/win/transforms/transformed-caret-expected.png +++ b/third_party/blink/web_tests/platform/win/transforms/transformed-caret-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png deleted file mode 100644 index 594bf96f..0000000 --- a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png +++ /dev/null Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png index 073a5270..715f7c1 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-boundary-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png index 721e5d36..29f5163 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/backdrop-filter-edge-pixels-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png index e22ebdf..e74dfff 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-blur-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png index 7e02c29..ae8a9af 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-brightness-clamping-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png index 7c2736e..dc8db7c 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-combined-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png index 4746cc6..80d541f 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-colorspace-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png index 5595fd58..5bcf7d37 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png index 46c0e54..0260980 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-subregion-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png index 4816619..6d7be82b 100644 --- a/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png +++ b/third_party/blink/web_tests/platform/win/virtual/scalefactor200/css3/filters/effect-reference-zoom-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png new file mode 100644 index 0000000..49fad35 --- /dev/null +++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-canvas-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-image-expected.png b/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-image-expected.png index 594bf96f..49fad35 100644 --- a/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-image-expected.png +++ b/third_party/blink/web_tests/virtual/exotic-color-space/images/optimize-contrast-image-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png b/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png index 83e5be0..4163370 100644 --- a/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png +++ b/third_party/blink/web_tests/virtual/gpu/fast/canvas/canvas-pattern-no-repeat-with-transformations-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png index 1f098c5..8c74ea8 100644 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png +++ b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-all-on-background-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png index 93e28bd..588bedf1 100644 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png +++ b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/effect-reference-ordering-hw-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png index 3fce727..920d7c76 100644 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png +++ b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-crash-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png index 3fce727..920d7c76 100644 --- a/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png +++ b/third_party/blink/web_tests/virtual/scalefactor200/css3/filters/filter-repaint-composited-fallback-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/stable/external/wpt/soft-navigation-heuristics/disabled-expected.txt b/third_party/blink/web_tests/virtual/stable/external/wpt/soft-navigation-heuristics/disabled-expected.txt new file mode 100644 index 0000000..da58657 --- /dev/null +++ b/third_party/blink/web_tests/virtual/stable/external/wpt/soft-navigation-heuristics/disabled-expected.txt
@@ -0,0 +1,4 @@ +This is a testharness.js-based test. +PASS Test that a soft navigation is not detected when the feature is disabled +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report-coordinator.sub.https.html b/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report-coordinator.sub.https.html new file mode 100644 index 0000000..4abb03a --- /dev/null +++ b/third_party/blink/web_tests/wpt_internal/attribution-reporting/simple-aggregatable-report-coordinator.sub.https.html
@@ -0,0 +1,66 @@ +<!doctype html> +<meta charset=utf-8> +<meta name=timeout content=long> +<meta name=variant content="?cloud=aws"> +<meta name=variant content="?cloud=gcp"> +<script src="/common/get-host-info.sub.js"></script> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/attribution-reporting/resources/helpers.js"></script> +<script> +attribution_reporting_promise_test(async t => { + const host = 'https://{{host}}'; + + const cloud = new URLSearchParams(location.search).get('cloud'); + const aggregation_coordinator_origin = cloud === 'aws' ? location.origin : get_host_info().HTTPS_REMOTE_ORIGIN; + + registerAttributionSrcByImg(createRedirectChain([ + { + source: { + aggregation_keys: { + campaignCounts: '0x159', + }, + destination: host, + }, + }, + { + trigger: { + aggregatable_trigger_data: [ + { + key_piece: '0x400', + source_keys: ['campaignCounts'], + }, + ], + aggregatable_values: { + campaignCounts: 32768, + }, + aggregation_coordinator_origin, + }, + }, + ])); + + const payload = await pollAggregatableReports(location.origin); + assert_equals(payload.reports.length, 1); + const report = JSON.parse(payload.reports[0].body); + const headers = payload.reports[0].headers; + assert_own_property(report, 'shared_info'); + const shared_info = JSON.parse(report.shared_info); + assert_own_property(shared_info, 'api'); + assert_equals(shared_info.api, 'attribution-reporting'); + assert_own_property(shared_info, 'report_id'); + assert_own_property(shared_info, 'reporting_origin'); + assert_own_property(shared_info, 'scheduled_report_time'); + assert_own_property(shared_info, 'version'); + assert_own_property(shared_info, 'attribution_destination'); + assert_equals(shared_info.attribution_destination, host); + assert_not_own_property(report, 'source_debug_key'); + assert_not_own_property(report, 'trigger_debug_key'); + assert_own_property(report, 'aggregation_service_payloads'); + assert_equals(report.aggregation_service_payloads.length, 1); + const aggregation_service_payload = report.aggregation_service_payloads[0]; + assert_own_property(aggregation_service_payload, 'payload'); + assert_own_property(aggregation_service_payload, 'key_id'); + assert_not_own_property(aggregation_service_payload, 'debug_cleartext_payload'); + validateReportHeaders(headers); +}, 'Ensure aggregatable attribution report is received.'); +</script>
diff --git a/third_party/blink/web_tests/wpt_internal/credential-management/fedcm-mismatch-dialog.tentative.https.html b/third_party/blink/web_tests/wpt_internal/credential-management/fedcm-mismatch-dialog.tentative.https.html index 2a3a19c..8b9acfa5db 100644 --- a/third_party/blink/web_tests/wpt_internal/credential-management/fedcm-mismatch-dialog.tentative.https.html +++ b/third_party/blink/web_tests/wpt_internal/credential-management/fedcm-mismatch-dialog.tentative.https.html
@@ -32,9 +32,9 @@ cred_promise = promise_rejects_dom(t, "NetworkError", cred_promise); let type = await fedcm_get_dialog_type_promise(t); - assert_equals("ConfirmIdpSignin", type); + assert_equals("ConfirmIdpLogin", type); window.test_driver.cancel_fedcm_dialog(); return cred_promise; -}, "Dismiss IDP signin dialog"); +}, "Dismiss IDP login dialog"); </script>
diff --git a/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js b/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js index 5de6f09..f7cf742 100644 --- a/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js +++ b/third_party/blink/web_tests/wpt_internal/private-aggregation/resources/utils.js
@@ -179,6 +179,8 @@ assert_own_property(report, 'aggregation_service_payloads'); verifyAggregationServicePayloads(report.aggregation_service_payloads, expected_cleartext_payload); + assert_own_property(report, "aggregation_coordinator_origin"); + if (context_id) { assert_own_property(report, 'context_id'); assert_equals(report.context_id, context_id); @@ -187,7 +189,7 @@ } // Check there are no extra keys - let expected_length = 2; + let expected_length = 3; if (debug_key) { ++expected_length; }
diff --git a/third_party/chromite b/third_party/chromite index e884bb3..f76c26c 160000 --- a/third_party/chromite +++ b/third_party/chromite
@@ -1 +1 @@ -Subproject commit e884bb39adc4411392a38ef69a0fb7c3299365f4 +Subproject commit f76c26cb2612ceff9adf29c0f63c539c285b5f4a
diff --git a/third_party/chromium-variations b/third_party/chromium-variations index 923dfb9..990efdd 160000 --- a/third_party/chromium-variations +++ b/third_party/chromium-variations
@@ -1 +1 @@ -Subproject commit 923dfb9e61617b401ffc72b882a8eb48210d1bef +Subproject commit 990efdd6cf54f2124621d065e2de629856c395e4
diff --git a/third_party/cros_system_api b/third_party/cros_system_api index 9f50954..b7b78587 160000 --- a/third_party/cros_system_api +++ b/third_party/cros_system_api
@@ -1 +1 @@ -Subproject commit 9f5095452ada37b9ffb6b4909c0b8e08e3c18d9c +Subproject commit b7b78587c03de1cd478f31f734498430773adeb3
diff --git a/third_party/dawn b/third_party/dawn index addd749..e1f1c01 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit addd7493ccd6a001f0e5458007982f10df77cd0a +Subproject commit e1f1c0135a5eca328a320d4f14d21b24576eea9b
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal index 46b0231..5c18380 160000 --- a/third_party/devtools-frontend-internal +++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@ -Subproject commit 46b0231738a9dbba7b3827649d231fe6a6290fb9 +Subproject commit 5c18380d0cee521d0eb41984f178253763d2f7c1
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index d49819fe..46268f4 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit d49819fe244438697b53be6ca829f35b0959f009 +Subproject commit 46268f4b777d9e3812ae478fd3254f82fea73f3a
diff --git a/third_party/espresso/BUILD.gn b/third_party/espresso/BUILD.gn index b248d546..6c15120 100644 --- a/third_party/espresso/BUILD.gn +++ b/third_party/espresso/BUILD.gn
@@ -47,7 +47,6 @@ jar_path = "lib/espresso-core-release-no-dep.jar" deps = [ ":espresso_idling_java", - "//third_party/android_deps:com_android_support_support_annotations_java", "//third_party/android_deps:guava_android_java", "//third_party/android_deps:javax_inject_javax_inject_java", "//third_party/android_deps:org_codehaus_mojo_animal_sniffer_annotations_java",
diff --git a/third_party/fuzztest/BUILD.gn b/third_party/fuzztest/BUILD.gn index 3e39647..5224e41 100644 --- a/third_party/fuzztest/BUILD.gn +++ b/third_party/fuzztest/BUILD.gn
@@ -79,6 +79,9 @@ "-Wno-unused-private-field", "-Wno-unreachable-code-return", "-Wno-unused-but-set-variable", + "-Wno-shadow", + "-Wno-unused-const-variable", + "-Wno-unused-function", ] # int_utils.h depends on an SSE 4.2 intrinsic. @@ -173,5 +176,7 @@ "src/centipede/stats.cc", "src/centipede/symbol_table.cc", "src/centipede/util.cc", + "src/centipede/workdir.cc", + "src/centipede/workdir.h", ] }
diff --git a/third_party/fuzztest/src b/third_party/fuzztest/src index d0d81c43..ce460dd 160000 --- a/third_party/fuzztest/src +++ b/third_party/fuzztest/src
@@ -1 +1 @@ -Subproject commit d0d81c430b7bf5b282f98f479b312bfca670e67f +Subproject commit ce460dd7cae252b8505ce0009121bcac17939e3a
diff --git a/third_party/grpc/LICENSE b/third_party/grpc/LICENSE deleted file mode 100644 index d645695..0000000 --- a/third_party/grpc/LICENSE +++ /dev/null
@@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License.
diff --git a/third_party/libFuzzer/src b/third_party/libFuzzer/src index 26cc39e..758bd21 160000 --- a/third_party/libFuzzer/src +++ b/third_party/libFuzzer/src
@@ -1 +1 @@ -Subproject commit 26cc39e59b2bf5cbc20486296248a842c536878d +Subproject commit 758bd21f103a501b362b1ca46fa8fcb692eaa303
diff --git a/third_party/libavifinfo/src b/third_party/libavifinfo/src index 5e8d92c..b496868 160000 --- a/third_party/libavifinfo/src +++ b/third_party/libavifinfo/src
@@ -1 +1 @@ -Subproject commit 5e8d92c8bbc63dead2781d67c7236a26aef209cf +Subproject commit b496868f7c3fd17dfeeecc0364fe37e19edd548a
diff --git a/third_party/perfetto b/third_party/perfetto index d3bf532..a3d4c1d 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit d3bf532f84cf34f899c5785043ceb4af8f76d4e3 +Subproject commit a3d4c1de9bcf2a0471ab183c45cf111efd29571e
diff --git a/third_party/skia b/third_party/skia index 0fef7d2..fcd1b75 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 0fef7d25a55f52cfb7153b4990e288a8e36f2a2a +Subproject commit fcd1b7521805ab1cde2947be6118f329e4ace14d
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps index 1e40b8e..7413048 160000 --- a/third_party/vulkan-deps +++ b/third_party/vulkan-deps
@@ -1 +1 @@ -Subproject commit 1e40b8e966f5dbac2e886e5ba1eb30f660cd5cf9 +Subproject commit 7413048934e28b97ae00c37c419e576db8add866
diff --git a/third_party/webgpu-cts/src b/third_party/webgpu-cts/src index f2b59e0..609645e 160000 --- a/third_party/webgpu-cts/src +++ b/third_party/webgpu-cts/src
@@ -1 +1 @@ -Subproject commit f2b59e03621238d0d0fd6305be2c406ce3e45ac2 +Subproject commit 609645eb5b272668cbfb120d1aa9549eee86e02d
diff --git a/third_party/webrtc b/third_party/webrtc index dd15070..bce7ce7 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit dd15070b4539d49ae5e135e7d12b64bbc7bafb27 +Subproject commit bce7ce7ba054ac0e79fed49b84ef52fb24c31778
diff --git a/tools/android/checkxmlstyle/checkxmlstyle.py b/tools/android/checkxmlstyle/checkxmlstyle.py index 959210c..e49fa8f 100644 --- a/tools/android/checkxmlstyle/checkxmlstyle.py +++ b/tools/android/checkxmlstyle/checkxmlstyle.py
@@ -144,14 +144,17 @@ output_api.PresubmitError( ''' Android Color Reference Check failed: - Your new code added new color references that are not color resources from - ui/android/java/res/values/color_palette.xml, listed below. + Your new code contains hard coded hex color values in a resource file. You + likely should be using a @macro or color state list to support dynamic + colors, see + https://chromium.googlesource.com/chromium/src/+/main/docs/ui/android/dynamic_colors.md - This is banned, please use the existing color resources or create a new - color resource in color_palette.xml, and reference the color by @color/.... + In the cases where you purposefully want fixed colors (like incognito), at + the very least @color references to color_palette.xml or one_off_colors.xml + will be necessary. If the new added color is a one-off color, please contact UX for approval - and then add it to ui/android/java/res/values/one_off_colors.xml. + and then add it to ui/android/java/res/values/one_off_colors.xml See https://crbug.com/775198 for more information. ''', errors) @@ -161,11 +164,14 @@ output_api.PresubmitPromptWarning( ''' Android Color Reference Check warning: - Your new code added new color references that are not color resources from - ui/android/java/res/values/color_palette.xml, listed below. + Your new code contains hard coded hex color values in a resource file. You + likely should be using a @macro or color state list to support dynamic + colors, see + https://chromium.googlesource.com/chromium/src/+/main/docs/ui/android/dynamic_colors.md - This is typically not needed even in vector/shape drawables. Please consider - using an existing color resources if possible. + In the cases where you purposefully want fixed colors (like incognito), at + the very least @color references to color_palette.xml or one_off_colors.xml + will be necessary. Only bypass this check if you are confident that you should be using a HEX reference, e.g. you are adding an illustration or a shadow using XML rather @@ -322,7 +328,6 @@ warnings.append(issue) if warnings: - # TODO(https://crbug.com/1224883): Replace bug with a upstream doc link. return [ output_api.PresubmitPromptWarning( ''' @@ -330,9 +335,8 @@ Your new code is using @color references. These will not correctly support dynamic colors. Instead you should use a @macro that routes into an ?attr. Note using color references is currently okay for incognito code, as it should - not be dynamically colored. - - See https://crbug.com/1302056 for more information. + not be dynamically colored. See + https://chromium.googlesource.com/chromium/src/+/main/docs/ui/android/dynamic_colors.md. ''', warnings) ]
diff --git a/tools/binary_size/libsupersize/file_format.py b/tools/binary_size/libsupersize/file_format.py index 8a764d8..ed5634a 100644 --- a/tools/binary_size/libsupersize/file_format.py +++ b/tools/binary_size/libsupersize/file_format.py
@@ -39,6 +39,7 @@ models.SECTION_TEXT: 0, models.SECTION_BSS: 1, models.SECTION_BSS_REL_RO: 1, + models.SECTION_RELRO_PADDING: 1, models.SECTION_PART_END: 1, models.SECTION_DEX: 2, models.SECTION_DEX_METHOD: 3,
diff --git a/tools/binary_size/libsupersize/models.py b/tools/binary_size/libsupersize/models.py index 550f87eb..32cad0a9 100644 --- a/tools/binary_size/libsupersize/models.py +++ b/tools/binary_size/libsupersize/models.py
@@ -52,6 +52,7 @@ SECTION_PAK_NONTRANSLATED = '.pak.nontranslated' SECTION_PAK_TRANSLATIONS = '.pak.translations' SECTION_PART_END = '.part.end' +SECTION_RELRO_PADDING = '.relro_padding' SECTION_RODATA = '.rodata' SECTION_TEXT = '.text' # Used by SymbolGroup when they contain a mix of sections. @@ -79,6 +80,7 @@ SECTION_BSS, SECTION_BSS_REL_RO, SECTION_PART_END, + SECTION_RELRO_PADDING, ) PAK_SECTIONS = ( SECTION_PAK_NONTRANSLATED, @@ -100,6 +102,7 @@ SECTION_PART_END: 'b', SECTION_PAK_NONTRANSLATED: 'P', SECTION_PAK_TRANSLATIONS: 'p', + SECTION_RELRO_PADDING: 'b', SECTION_RODATA: 'r', SECTION_TEXT: 't', SECTION_MULTIPLE: '*',
diff --git a/tools/checklicenses/checklicenses.py b/tools/checklicenses/checklicenses.py index 092e112..059bcdf 100755 --- a/tools/checklicenses/checklicenses.py +++ b/tools/checklicenses/checklicenses.py
@@ -474,9 +474,6 @@ 'third_party/sqlite': [ 'UNKNOWN', ], - 'third_party/minizip': [ - 'UNKNOWN', - ], # BSD License. http://bugzilla.maptools.org/show_bug.cgi?id=2532 'third_party/pdfium/third_party/libtiff/tif_ojpeg.c': [
diff --git a/tools/clang/blink_gc_plugin/tests/forbidden_fields.h b/tools/clang/blink_gc_plugin/tests/forbidden_fields.h index fa3a78f6..98f97c6 100644 --- a/tools/clang/blink_gc_plugin/tests/forbidden_fields.h +++ b/tools/clang/blink_gc_plugin/tests/forbidden_fields.h
@@ -37,8 +37,11 @@ SecondLevelPartObject array_of_embedded_object_[2]; std::vector<TaskRunnerTimer<AnotherHeapObject>> std_vec_of_timers_; absl::optional<TaskRunnerTimer<AnotherHeapObject>> optional_timer_; + std::optional<TaskRunnerTimer<AnotherHeapObject>> optional_timer2_; absl::optional<SecondLevelPartObject> optional_embedded_object_; + std::optional<SecondLevelPartObject> optional_embedded_object2_; absl::variant<SecondLevelPartObject> variant_embedded_object_; + std::variant<SecondLevelPartObject> variant_embedded_object2_; std::unique_ptr<TaskRunnerTimer<AnotherHeapObject>> unique_ptr_timer_; TaskRunnerTimer<AnotherHeapObject>* raw_ptr_timer_; scoped_refptr<TaskRunnerTimer<AnotherHeapObject>> scoped_refptr_timer_;
diff --git a/tools/clang/blink_gc_plugin/tests/forbidden_fields.txt b/tools/clang/blink_gc_plugin/tests/forbidden_fields.txt index 92fb879..f35ffde 100644 --- a/tools/clang/blink_gc_plugin/tests/forbidden_fields.txt +++ b/tools/clang/blink_gc_plugin/tests/forbidden_fields.txt
@@ -50,28 +50,43 @@ ./forbidden_fields.h:39:3: note: [blink-gc] TaskRunnerTimer field 'optional_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. absl::optional<TaskRunnerTimer<AnotherHeapObject>> optional_timer_; ^ -./forbidden_fields.h:40:3: note: [blink-gc] From part object field 'optional_embedded_object_' here: +./forbidden_fields.h:40:3: note: [blink-gc] TaskRunnerTimer field 'optional_timer2_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. + std::optional<TaskRunnerTimer<AnotherHeapObject>> optional_timer2_; + ^ +./forbidden_fields.h:41:3: note: [blink-gc] From part object field 'optional_embedded_object_' here: absl::optional<SecondLevelPartObject> optional_embedded_object_; ^ ./forbidden_fields.h:17:3: note: [blink-gc] TaskRunnerTimer field 'timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. TaskRunnerTimer<SecondLevelPartObject> timer_; ^ -./forbidden_fields.h:41:3: note: [blink-gc] From part object field 'variant_embedded_object_' here: +./forbidden_fields.h:42:3: note: [blink-gc] From part object field 'optional_embedded_object2_' here: + std::optional<SecondLevelPartObject> optional_embedded_object2_; + ^ +./forbidden_fields.h:17:3: note: [blink-gc] TaskRunnerTimer field 'timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. + TaskRunnerTimer<SecondLevelPartObject> timer_; + ^ +./forbidden_fields.h:43:3: note: [blink-gc] From part object field 'variant_embedded_object_' here: absl::variant<SecondLevelPartObject> variant_embedded_object_; ^ ./forbidden_fields.h:17:3: note: [blink-gc] TaskRunnerTimer field 'timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. TaskRunnerTimer<SecondLevelPartObject> timer_; ^ -./forbidden_fields.h:42:3: note: [blink-gc] TaskRunnerTimer field 'unique_ptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. +./forbidden_fields.h:44:3: note: [blink-gc] From part object field 'variant_embedded_object2_' here: + std::variant<SecondLevelPartObject> variant_embedded_object2_; + ^ +./forbidden_fields.h:17:3: note: [blink-gc] TaskRunnerTimer field 'timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. + TaskRunnerTimer<SecondLevelPartObject> timer_; + ^ +./forbidden_fields.h:45:3: note: [blink-gc] TaskRunnerTimer field 'unique_ptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. std::unique_ptr<TaskRunnerTimer<AnotherHeapObject>> unique_ptr_timer_; ^ -./forbidden_fields.h:43:3: note: [blink-gc] TaskRunnerTimer field 'raw_ptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. +./forbidden_fields.h:46:3: note: [blink-gc] TaskRunnerTimer field 'raw_ptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. TaskRunnerTimer<AnotherHeapObject>* raw_ptr_timer_; ^ -./forbidden_fields.h:44:3: note: [blink-gc] TaskRunnerTimer field 'scoped_refptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. +./forbidden_fields.h:47:3: note: [blink-gc] TaskRunnerTimer field 'scoped_refptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. scoped_refptr<TaskRunnerTimer<AnotherHeapObject>> scoped_refptr_timer_; ^ -./forbidden_fields.h:45:3: note: [blink-gc] TaskRunnerTimer field 'weak_ptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. +./forbidden_fields.h:48:3: note: [blink-gc] TaskRunnerTimer field 'weak_ptr_timer_' used within a garbage collected context. Consider using HeapTaskRunnerTimer instead. WeakPtr<TaskRunnerTimer<AnotherHeapObject>> weak_ptr_timer_; ^ 2 warnings generated.
diff --git a/tools/clang/blink_gc_plugin/tests/heap/stubs.h b/tools/clang/blink_gc_plugin/tests/heap/stubs.h index f237adc..18d95d45 100644 --- a/tools/clang/blink_gc_plugin/tests/heap/stubs.h +++ b/tools/clang/blink_gc_plugin/tests/heap/stubs.h
@@ -150,6 +150,10 @@ class array {}; template <typename T1, typename T2> class pair {}; +template <typename T> +class optional {}; +template <class... Ts> +class variant {}; } // namespace std
diff --git a/tools/clang/blink_gc_plugin/tests/optional_gc_object.cpp b/tools/clang/blink_gc_plugin/tests/optional_gc_object.cpp index a54a4bb..c22195c 100644 --- a/tools/clang/blink_gc_plugin/tests/optional_gc_object.cpp +++ b/tools/clang/blink_gc_plugin/tests/optional_gc_object.cpp
@@ -12,17 +12,31 @@ private: absl::optional<Base> optional_field_; // Optional fields are disallowed. + std::optional<Base> optional_field2_; }; -void DisallowedUseOfUniquePtr() { - absl::optional<Base> optional_base; // Must be okay. - (void)optional_base; +void DisallowedUseOfOptional() { + { + absl::optional<Base> optional_base; // Must be okay. + (void)optional_base; - absl::optional<Derived> optional_derived; // Must also be okay. - (void)optional_derived; + absl::optional<Derived> optional_derived; // Must also be okay. + (void)optional_derived; - new absl::optional<Base>; // New expression with gced optionals are not - // allowed. + new absl::optional<Base>; // New expression with gced optionals are not + // allowed. + } + + { + std::optional<Base> optional_base; // Must be okay. + (void)optional_base; + + std::optional<Derived> optional_derived; // Must also be okay. + (void)optional_derived; + + new std::optional<Base>; // New expression with gced optionals are not + // allowed. + } } } // namespace blink
diff --git a/tools/clang/blink_gc_plugin/tests/optional_gc_object.txt b/tools/clang/blink_gc_plugin/tests/optional_gc_object.txt index 9963922..738a9bf 100644 --- a/tools/clang/blink_gc_plugin/tests/optional_gc_object.txt +++ b/tools/clang/blink_gc_plugin/tests/optional_gc_object.txt
@@ -1,7 +1,13 @@ optional_gc_object.cpp:14:3: warning: [blink-gc] Disallowed optional field of 'optional<blink::Base>' found; 'Base' is a garbage-collected type. Optional fields cannot hold garbage-collected objects. absl::optional<Base> optional_field_; // Optional fields are disallowed. ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -optional_gc_object.cpp:24:3: warning: [blink-gc] Disallowed new-expression of 'optional<blink::Base>' found; 'Base' is a garbage-collected type. GCed types cannot be created with new. - new absl::optional<Base>; // New expression with gced optionals are not - ^~~~~~~~~~~~~~~~~~~~~~~~ -2 warnings generated. +optional_gc_object.cpp:15:3: warning: [blink-gc] Disallowed optional field of 'optional<blink::Base>' found; 'Base' is a garbage-collected type. Optional fields cannot hold garbage-collected objects. + std::optional<Base> optional_field2_; + ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +optional_gc_object.cpp:26:5: warning: [blink-gc] Disallowed new-expression of 'optional<blink::Base>' found; 'Base' is a garbage-collected type. GCed types cannot be created with new. + new absl::optional<Base>; // New expression with gced optionals are not + ^~~~~~~~~~~~~~~~~~~~~~~~ +optional_gc_object.cpp:37:5: warning: [blink-gc] Disallowed new-expression of 'optional<blink::Base>' found; 'Base' is a garbage-collected type. GCed types cannot be created with new. + new std::optional<Base>; // New expression with gced optionals are not + ^~~~~~~~~~~~~~~~~~~~~~~ +4 warnings generated.
diff --git a/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.cpp b/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.cpp index f10e8fb..196336d0 100644 --- a/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.cpp +++ b/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.cpp
@@ -7,19 +7,37 @@ namespace blink { void ForbidsVariantsOfGcedTypes() { - absl::variant<Base> not_ok; - (void)not_ok; + { + absl::variant<Base> not_ok; + (void)not_ok; - absl::variant<Base, Base> similarly_not_ok; - (void)similarly_not_ok; + absl::variant<Base, Base> similarly_not_ok; + (void)similarly_not_ok; - absl::variant<int, Base> not_ok_either; - (void)not_ok_either; + absl::variant<int, Base> not_ok_either; + (void)not_ok_either; - absl::variant<int, Derived> ditto; - (void)ditto; + absl::variant<int, Derived> ditto; + (void)ditto; - new absl::variant<Mixin>; + new absl::variant<Mixin>; + } + + { + std::variant<Base> not_ok; + (void)not_ok; + + std::variant<Base, Base> similarly_not_ok; + (void)similarly_not_ok; + + std::variant<int, Base> not_ok_either; + (void)not_ok_either; + + std::variant<int, Derived> ditto; + (void)ditto; + + new std::variant<Mixin>; + } } } // namespace blink
diff --git a/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.txt b/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.txt index d5f7558..c00bf89 100644 --- a/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.txt +++ b/tools/clang/blink_gc_plugin/tests/variant_of_gced_type.txt
@@ -1,16 +1,31 @@ -variant_of_gced_type.cpp:10:23: warning: [blink-gc] Disallowed construction of 'variant<blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. - absl::variant<Base> not_ok; - ^~~~~~ -variant_of_gced_type.cpp:13:29: warning: [blink-gc] Disallowed construction of 'variant<blink::Base, blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. - absl::variant<Base, Base> similarly_not_ok; - ^~~~~~~~~~~~~~~~ -variant_of_gced_type.cpp:16:28: warning: [blink-gc] Disallowed construction of 'variant<int, blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. - absl::variant<int, Base> not_ok_either; - ^~~~~~~~~~~~~ -variant_of_gced_type.cpp:19:31: warning: [blink-gc] Disallowed construction of 'variant<int, blink::Derived>' found; 'Derived' is a garbage-collected type. Variant cannot hold garbage-collected objects. - absl::variant<int, Derived> ditto; - ^~~~~ -variant_of_gced_type.cpp:22:7: warning: [blink-gc] Disallowed construction of 'variant<blink::Mixin>' found; 'Mixin' is a garbage-collected type. Variant cannot hold garbage-collected objects. - new absl::variant<Mixin>; - ^~~~ -5 warnings generated. +variant_of_gced_type.cpp:11:25: warning: [blink-gc] Disallowed construction of 'variant<blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. + absl::variant<Base> not_ok; + ^~~~~~ +variant_of_gced_type.cpp:14:31: warning: [blink-gc] Disallowed construction of 'variant<blink::Base, blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. + absl::variant<Base, Base> similarly_not_ok; + ^~~~~~~~~~~~~~~~ +variant_of_gced_type.cpp:17:30: warning: [blink-gc] Disallowed construction of 'variant<int, blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. + absl::variant<int, Base> not_ok_either; + ^~~~~~~~~~~~~ +variant_of_gced_type.cpp:20:33: warning: [blink-gc] Disallowed construction of 'variant<int, blink::Derived>' found; 'Derived' is a garbage-collected type. Variant cannot hold garbage-collected objects. + absl::variant<int, Derived> ditto; + ^~~~~ +variant_of_gced_type.cpp:23:9: warning: [blink-gc] Disallowed construction of 'variant<blink::Mixin>' found; 'Mixin' is a garbage-collected type. Variant cannot hold garbage-collected objects. + new absl::variant<Mixin>; + ^~~~ +variant_of_gced_type.cpp:27:24: warning: [blink-gc] Disallowed construction of 'variant<blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. + std::variant<Base> not_ok; + ^~~~~~ +variant_of_gced_type.cpp:30:30: warning: [blink-gc] Disallowed construction of 'variant<blink::Base, blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. + std::variant<Base, Base> similarly_not_ok; + ^~~~~~~~~~~~~~~~ +variant_of_gced_type.cpp:33:29: warning: [blink-gc] Disallowed construction of 'variant<int, blink::Base>' found; 'Base' is a garbage-collected type. Variant cannot hold garbage-collected objects. + std::variant<int, Base> not_ok_either; + ^~~~~~~~~~~~~ +variant_of_gced_type.cpp:36:32: warning: [blink-gc] Disallowed construction of 'variant<int, blink::Derived>' found; 'Derived' is a garbage-collected type. Variant cannot hold garbage-collected objects. + std::variant<int, Derived> ditto; + ^~~~~ +variant_of_gced_type.cpp:39:9: warning: [blink-gc] Disallowed construction of 'variant<blink::Mixin>' found; 'Mixin' is a garbage-collected type. Variant cannot hold garbage-collected objects. + new std::variant<Mixin>; + ^~~ +10 warnings generated.
diff --git a/tools/clang/scripts/dashboard.py b/tools/clang/scripts/dashboard.py index 438e977..0353bcf 100755 --- a/tools/clang/scripts/dashboard.py +++ b/tools/clang/scripts/dashboard.py
@@ -14,6 +14,9 @@ CHROMIUM_REPO = os.path.abspath(os.path.join(THIS_DIR, '..', '..', '..')) LLVM_REPO = '' # This gets filled in by main(). +# This script produces the dashboard at +# https://commondatastorage.googleapis.com/chromium-browser-clang/toolchain-dashboard.html +# # Usage: # # ./dashboard.py > /tmp/toolchain-dashboard.html @@ -51,6 +54,9 @@ f'{FIRST_GIT_ROLL}..origin/main', '--', 'tools/clang/scripts/update.py' ]).decode('utf-8') + # AuthorDate is when a commit was first authored; CommitDate (part of + # --pretty=fuller) is when a commit was last updated. We use the latter since + # it's more likely to reflect when the commit become part of upstream. DATE_RE = re.compile(r'^CommitDate: (\d+)$') VERSION_RE = re.compile( r'^\+CLANG_REVISION = \'llvmorg-\d+-init-\d+-g([0-9a-f]+)\'$') @@ -77,13 +83,11 @@ of timestamp string and clang revision age in days at that timestamp.''' ages = [] - ts = sorted(rolls.keys()) - assert (len(ts) > 0) - def add(timestamp, rev): ages.append((timestamp_to_str(timestamp), (timestamp - get_git_timestamp(LLVM_REPO, rev)) / (3600 * 24))) + assert (rolls) prev_roll_rev = None for roll_time, roll_rev in sorted(rolls.items()): if prev_roll_rev: @@ -100,9 +104,12 @@ ages = clang_roll_ages(rolls) print(''' -<html> +<!doctype html> +<html lang="en"> <head> - <title>Chromium Toolchain Dashbaord</title> + <meta charset="utf-8"> + <meta name="viewport" content="width=device-width,initial-scale=1"> + <title>Chromium Toolchain Dashboard</title> <script type="text/javascript" src="https://www.gstatic.com/charts/loader.js"></script> <script type="text/javascript"> google.charts.load('current', {'packages':['corechart', 'controls']}); @@ -148,7 +155,7 @@ </script> </head> <body> - <h1>Chromium Toolchain Dashboard (go/clang-roll-dashboard)</h1>''') + <h1>Chromium Toolchain Dashboard (go/chrome-clang-dash)</h1>''') print(f'<p>Last updated: {timestamp_to_str(time.time())} UTC</p>')
diff --git a/tools/grit/grit_rule.gni b/tools/grit/grit_rule.gni index 8dd0cef..7956feb 100644 --- a/tools/grit/grit_rule.gni +++ b/tools/grit/grit_rule.gni
@@ -333,6 +333,7 @@ public_configs += invoker.public_configs } + configs += [ "//build/config/compiler:wexit_time_destructors" ] if (defined(invoker.configs)) { configs += invoker.configs }
diff --git a/tools/gritsettings/resource_ids.spec b/tools/gritsettings/resource_ids.spec index ec4710e..9932203 100644 --- a/tools/gritsettings/resource_ids.spec +++ b/tools/gritsettings/resource_ids.spec
@@ -243,10 +243,14 @@ "META": {"sizes": {"includes": [50]}}, "includes": [2960], }, - "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/connectors_internals/resources.grd": { + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/compose/resources.grd": { "META": {"sizes": {"includes": [15]}}, "includes": [2980], }, + "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/connectors_internals/resources.grd": { + "META": {"sizes": {"includes": [15]}}, + "includes": [2990], + }, "<(SHARED_INTERMEDIATE_DIR)/chrome/browser/resources/discards/resources.grd": { "META": {"sizes": {"includes": [20],}}, "includes": [3000],
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index 8d217db..60d368e 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -158,6 +158,8 @@ 'android-chrome-pie-x86-wpt-android-specific': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient', 'android-chrome-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient', 'android-cronet-asan-x86-rel': 'android_cronet_release_bot_minimal_symbols_x86_clang_asan_reclient', + 'android-cronet-riscv64-dbg': 'android_cronet_debug_static_bot_riscv64_reclient', + 'android-cronet-riscv64-rel': 'android_cronet_release_bot_minimal_symbols_riscv64_reclient', 'android-weblayer-with-aosp-webview-x86-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_resource_allowlisting_disable_proguard_chrome_google_reclient', 'android-webview-pie-x86-wpt-fyi-rel': 'android_release_bot_minimal_symbols_x86_fastbuild_webview_monochrome_reclient', },
diff --git a/tools/mb/mb_config_expectations/chromium.android.fyi.json b/tools/mb/mb_config_expectations/chromium.android.fyi.json index c6b1fcd..02e410f 100644 --- a/tools/mb/mb_config_expectations/chromium.android.fyi.json +++ b/tools/mb/mb_config_expectations/chromium.android.fyi.json
@@ -131,6 +131,65 @@ "use_thin_lto": false } }, + "android-cronet-riscv64-dbg": { + "gn_args": { + "clang_use_default_sample_profile": false, + "debuggable_apks": false, + "default_min_sdk_version": 21, + "disable_file_support": true, + "enable_base_tracing": false, + "enable_reporting": true, + "enable_resource_allowlist_generation": false, + "enable_websockets": false, + "ffmpeg_branding": "Chrome", + "include_transport_security_state_preload_list": false, + "is_component_build": false, + "is_cronet_build": true, + "is_debug": true, + "media_use_ffmpeg": false, + "proprietary_codecs": true, + "symbol_level": 1, + "target_cpu": "riscv64", + "target_os": "android", + "use_crash_key_stubs": true, + "use_hashed_jni_names": true, + "use_partition_alloc": false, + "use_platform_icu_alternatives": true, + "use_remoteexec": true, + "use_thin_lto": false + } + }, + "android-cronet-riscv64-rel": { + "gn_args": { + "clang_use_default_sample_profile": false, + "dcheck_always_on": false, + "debuggable_apks": false, + "default_min_sdk_version": 21, + "disable_file_support": true, + "enable_base_tracing": false, + "enable_reporting": true, + "enable_resource_allowlist_generation": false, + "enable_websockets": false, + "ffmpeg_branding": "Chrome", + "include_transport_security_state_preload_list": false, + "is_component_build": false, + "is_cronet_build": true, + "is_debug": false, + "is_official_build": true, + "media_use_ffmpeg": false, + "proprietary_codecs": true, + "strip_debug_info": true, + "symbol_level": 1, + "target_cpu": "riscv64", + "target_os": "android", + "use_crash_key_stubs": true, + "use_hashed_jni_names": true, + "use_partition_alloc": false, + "use_platform_icu_alternatives": true, + "use_remoteexec": true, + "use_thin_lto": false + } + }, "android-weblayer-with-aosp-webview-x86-fyi-rel": { "gn_args": { "android_static_analysis": "off",
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 9d3bcd2..d47f30d 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -12004,6 +12004,11 @@ <int value="1" label="Attempted"/> </enum> +<enum name="BooleanAutofillExtendedMenuDeleteAddress"> + <int value="0" label="Canceled"/> + <int value="1" label="Deleted"/> +</enum> + <enum name="BooleanAutofillFillAfterInteraction"> <int value="0" label="Not filled"/> <int value="1" label="Filled"/> @@ -26598,13 +26603,6 @@ <int value="3" label="Other Mode is Default"/> </enum> -<enum name="DefaultDirectAttemptResult"> - <int value="0" label="Succeeded"/> - <int value="1" label="Failed at getting the SID"/> - <int value="2" label="Failed at finding the salt"/> - <int value="3" label="Failed at setting the registry value"/> -</enum> - <enum name="DefaultOfflineClosingReason"> <int value="0" label="Network re-established"/> <int value="1" label="New navigation"/> @@ -27004,91 +27002,6 @@ <int value="4" label="Tether Hosts section shown"/> </enum> -<enum name="DeviceActiveCheckMembershipResponseCases"> -<!-- This must be kept current with DeviceActivityClient::CheckMembershipResponseCases -located in chromeos/ash/components/device_activity/device_activity_client.h --> - - <int value="0" label="Unknown"/> - <int value="1" label="CreateOprfRequestFailed"/> - <int value="2" label="OprfResponseBodyFailed"/> - <int value="3" label="NotHasRlweOprfResponse"/> - <int value="4" label="CreateQueryRequestFailed"/> - <int value="5" label="QueryResponseBodyFailed"/> - <int value="6" label="NotHasRlweQueryResponse"/> - <int value="7" label="ProcessQueryResponseFailed"/> - <int value="8" label="MembershipResponsesSizeIsNotOne"/> - <int value="9" label="IsNotPsmIdMember"/> - <int value="10" label="SuccessfullySetLocalState"/> -</enum> - -<enum name="DeviceActiveClientPreservedFileState"> -<!-- This must be kept current with DeviceActivityClient::PreservedFileState -located in chromeos/ash/components/device_activity/device_activity_client.h --> - - <int value="0" label="Unknown"/> - <int value="1" label="Success read file and empty local state"/> - <int value="2" label="Success read file but local state already set"/> - <int value="3" label="Fail read file and local state is either set or unset"/> -</enum> - -<enum name="DeviceActiveClientPsmResponse"> -<!-- This must be kept current with DeviceActivityClient::PsmResponse -located in chromeos/ash/components/device_activity/device_activity_client.h --> - - <int value="0" label="Unknown"/> - <int value="1" label="Success"/> - <int value="2" label="Error"/> - <int value="3" label="Timeout"/> -</enum> - -<enum name="DeviceActiveClientState"> -<!-- This must be kept current with DeviceActivityClient::State -located in chromeos/ash/components/device_activity/device_activity_client.h --> - - <int value="0" label="Unknown"/> - <int value="1" label="Idle"/> - <int value="2" label="CheckingMembershipOprf"/> - <int value="3" label="CheckingMembershipQuery"/> - <int value="4" label="CheckingIn"/> - <int value="5" label="HealthCheck"/> -</enum> - -<enum name="DeviceActivityMethod"> -<!-- This must be kept current with DeviceActivityClient::DeviceActivityMethod -located in chromeos/ash/components/device_activity/device_activity_client.h --> - - <int value="0" label="Unknown"/> - <int value="1" label="DeviceActivityControllerConstructor"/> - <int value="2" label="DeviceActivityControllerDestructor"/> - <int value="3" label="DeviceActivityControllerStart"/> - <int value="4" - label="DeviceActivityControllerOnPsmDeviceActiveSecretFetched"/> - <int value="5" label="DeviceActivityControllerOnMachineStatisticsLoaded"/> - <int value="6" label="DeviceActivityClientConstructor"/> - <int value="7" label="DeviceActivityClientDestructor"/> - <int value="8" label="DeviceActivityClientOnNetworkOnline"/> - <int value="9" label="DeviceActivityClientOnNetworkOffline"/> - <int value="10" label="DeviceActivityClientReportUseCases"/> - <int value="11" label="DeviceActivityClientCancelUseCases"/> - <int value="12" label="DeviceActivityClientTransitionOutOfIdle"/> - <int value="13" label="DeviceActivityClientTransitionToHealthCheck"/> - <int value="14" label="DeviceActivityClientOnHealthCheckDone"/> - <int value="15" label="DeviceActivityClientTransitionToCheckMembershipOprf"/> - <int value="16" label="DeviceActivityClientOnCheckMembershipOprfDone"/> - <int value="17" label="DeviceActivityClientTransitionToCheckMembershipQuery"/> - <int value="18" label="DeviceActivityClientOnCheckMembershipQueryDone"/> - <int value="19" label="DeviceActivityClientTransitionToCheckIn"/> - <int value="20" label="DeviceActivityClientOnCheckInDone"/> - <int value="21" label="DeviceActivityClientTransitionToIdle"/> - <int value="22" label="DeviceActivityClientOnSystemClockSyncResult"/> - <int value="23" label="DeviceActivityClientReportingTriggeredByTimer"/> - <int value="24" label="DeviceActivityClientSaveLastPingDatesStatus"/> - <int value="25" - label="DeviceActivityClientOnSaveLastPingDatesStatusComplete"/> - <int value="26" label="DeviceActivityClientGetLastPingDatesStatus"/> - <int value="27" label="DeviceActivityClientOnGetLastPingDatesStatusFetched"/> -</enum> - <enum name="DeviceAuthFinalResult"> <int value="0" label="Success with unknown method"/> <int value="1" label="Success with biometrics"/> @@ -27206,6 +27119,11 @@ <int value="44" label="Unknown owner no key, no policy"/> </enum> +<enum name="DeviceSettingsStaticShortcutAction"> + <int value="0" label="Copy"/> + <int value="1" label="Paste"/> +</enum> + <enum name="DeviceSettingsStatus"> <int value="0" label="STORE_SUCCESS"/> <int value="1" label="STORE_KEY_UNAVAILABLE"/> @@ -33978,6 +33896,7 @@ <int value="1163" label="PPAPISharedImagesForVideoDecoderAllowed"/> <int value="1164" label="ProfileReauthPrompt"/> <int value="1165" label="RelatedWebsiteSetsEnabled"/> + <int value="1166" label="DeviceExtendedFkeysModifier"/> </enum> <enum name="EnterprisePoliciesSources"> @@ -34834,7 +34753,7 @@ <int value="0" label="errSecSuccess"/> </enum> -<enum name="ESimInstallResult"> +<enum name="ESimOperationResult"> <int value="0" label="Success"/> <int value="1" label="Inhibit failed"/> <int value="2" label="Hermes failed"/> @@ -37793,6 +37712,7 @@ <int value="1829" label="OS_DIAGNOSTICS_ISMEMORYROUTINEARGUMENTSUPPORTED"/> <int value="1830" label="ACCESSIBILITY_PRIVATE_CLIPBOARDCOPYINACTIVELACROSGOOGLEDOC"/> + <int value="1831" label="USERSCRIPTS_UPDATE"/> </enum> <enum name="ExtensionIconState"> @@ -60902,6 +60822,8 @@ <int value="-2056198604" label="InterestFeedV2Hearts:disabled"/> <int value="-2054871630" label="PasswordsAccountStorageRevisedOptInFlow:enabled"/> + <int value="-2054733957" + label="CookieDeprecationFacilitatedTesting:disabled"/> <int value="-2054612904" label="BuiltInModuleInfra:enabled"/> <int value="-2053860791" label="XGEOVisibleNetworks:enabled"/> <int value="-2053098867" label="AutofillEnableCvcStorageAndFilling:enabled"/> @@ -60980,6 +60902,7 @@ <int value="-2028232016" label="spurious-power-button-lid-angle-change"/> <int value="-2028202891" label="AutofillEnableFixedPaymentsBubbleLogging:disabled"/> + <int value="-2027299676" label="CdmStorageDatabaseMigration:disabled"/> <int value="-2027019131" label="LegacyTechReportTopLevelUrl:enabled"/> <int value="-2026838590" label="OmniboxSteadyStateHeight:disabled"/> <int value="-2026156288" @@ -62346,6 +62269,7 @@ <int value="-1369089674" label="ArcTouchModeMouse:enabled"/> <int value="-1368913664" label="TabSearch:disabled"/> <int value="-1368499577" label="OnTheFlyMhtmlHashComputation:enabled"/> + <int value="-1367479795" label="CookieDeprecationFacilitatedTesting:enabled"/> <int value="-1367447724" label="IncognitoClearBrowsingDataDialogForDesktop:disabled"/> <int value="-1366114365" label="BluetoothAdvertisementMonitoring:disabled"/> @@ -63031,6 +62955,7 @@ <int value="-1034344165" label="V8NoTurbo:disabled"/> <int value="-1033738911" label="enable-mac-views-dialogs"/> <int value="-1032884201" label="HeavyAdPrivacyMitigations:enabled"/> + <int value="-1032545529" label="FileSystemAccessLockingScheme:disabled"/> <int value="-1032265414" label="AutocompleteExtendedSuggestions:disabled"/> <int value="-1031350684" label="PdfIsolation:disabled"/> <int value="-1030683709" label="OnlyShowNewShortcutsApp:disabled"/> @@ -64234,8 +64159,6 @@ <int value="-436470115" label="TouchpadAndWheelScrollLatching:enabled"/> <int value="-435914745" label="ClipboardContentSetting:disabled"/> <int value="-435636565" label="EnableLensPing:disabled"/> - <int value="-435410583" - label="TrackingProtectionOnboardingResetEligibilityForTesting:disabled"/> <int value="-434474445" label="OmniboxSteadyStateBackgroundColor:enabled"/> <int value="-433879402" label="EnableAmbientAuthenticationInIncognito:disabled"/> @@ -64685,6 +64608,7 @@ <int value="-215103767" label="ShoppingList:disabled"/> <int value="-215048684" label="NtpComprehensiveThemeRealbox:disabled"/> <int value="-214859547" label="OmniboxActionsUISimplification:enabled"/> + <int value="-214763255" label="AndroidHub:disabled"/> <int value="-214618160" label="ESimPolicy:enabled"/> <int value="-213893901" label="AutofillUpstreamAuthenticatePreflightCall:disabled"/> @@ -65099,6 +65023,7 @@ <int value="-11983392" label="MagnifierContinuousMouseFollowingModeSetting:enabled"/> <int value="-11260186" label="enable-offline-pages-as-saved-pages"/> + <int value="-11209341" label="FileSystemAccessLockingScheme:enabled"/> <int value="-10709540" label="OmniboxUIExperimentHideSuggestionUrlScheme:enabled"/> <int value="-9881235" @@ -65278,8 +65203,6 @@ <int value="79595680" label="OmniboxTabSwitchSuggestions:enabled"/> <int value="79729295" label="WebBundles:enabled"/> <int value="80036427" label="AutofillEnableCardProductName:disabled"/> - <int value="80225926" - label="TrackingProtectionOnboardingResetEligibilityForTesting:enabled"/> <int value="82303171" label="AccountIdMigration:disabled"/> <int value="82489049" label="AutofillSaveCardUiExperiment:enabled"/> <int value="82922831" label="NtpHistoryClustersModuleDiscounts:enabled"/> @@ -66336,6 +66259,7 @@ <int value="609568740" label="ImprovedSemanticsActivityIndicators:disabled"/> <int value="609580715" label="ArcCupsApi:disabled"/> <int value="610545308" label="enable-potentially-annoying-security-features"/> + <int value="613578742" label="CdmStorageDatabaseMigration:enabled"/> <int value="613629912" label="LookalikeUrlNavigationSuggestions:enabled"/> <int value="614174812" label="GlobalMediaControlsOverlayControls:disabled"/> <int value="615008173" label="UserAgentOverrideExperiment:enabled"/> @@ -66718,6 +66642,7 @@ <int value="782167080" label="enable-new-qp-input-view"/> <int value="783270752" label="AndroidHistoryManager:enabled"/> <int value="783443490" label="ArcInputOverlayBeta:enabled"/> + <int value="784664314" label="CompanyEntityIconAdjustment:disabled"/> <int value="784856302" label="EnableBorderlessPrinting:disabled"/> <int value="785273919" label="CompositingBasedThrottling:disabled"/> <int value="785795587" label="AndroidAppIntegrationSafeSearch:enabled"/> @@ -67975,6 +67900,7 @@ <int value="1413948819" label="NupPrinting:enabled"/> <int value="1414652547" label="LinkCapturingAutoDisplayIntentPicker:enabled"/> <int value="1414918327" label="enable-accelerated-video-decode"/> + <int value="1416395000" label="CompanyEntityIconAdjustment:enabled"/> <int value="1416592483" label="ash-enable-mirrored-screen"/> <int value="1416845437" label="InstallPromptSegmentation:disabled"/> <int value="1416970206" label="ArcGameModeFeature:disabled"/> @@ -68884,6 +68810,7 @@ <int value="1850641630" label="ForceSecurePaymentConfirmationDialog:enabled"/> <int value="1851358497" label="enable-ash-sidebar"/> <int value="1851746253" label="ReducedReferrerGranularity:disabled"/> + <int value="1852099433" label="AndroidHub:enabled"/> <int value="1852285132" label="AutofillEnableRankingFormulaAddressProfiles:disabled"/> <int value="1852630189" label="NTPBookmarkSuggestions:disabled"/> @@ -97102,6 +97029,17 @@ <int value="33" label="NONE"/> </enum> +<enum name="SearchEngineChoiceScreenConditions"> + <int value="0" label="Has custom search engine set"/> + <int value="1" label="Has search provider override"/> + <int value="2" label="Not in regional scope"/> + <int value="3" label="Is controlled by policy"/> + <int value="4" label="The profile is out of scope"/> + <int value="5" label="An extension controls the default search engine"/> + <int value="6" label="Eligible"/> + <int value="7" label="Already completed"/> +</enum> + <enum name="SearchEngineChoiceScreenEvents"> <int value="0" label="Unknown"/> <int value="1" label="Choice Screen Was Displayed"/> @@ -108063,7 +108001,7 @@ <int value="3" label="kRestoreOnStartup"/> <int value="4" label="kURLsToRestoreOnStartup"/> <int value="5" label="extensions::pref_names::kExtensions"/> - <int value="6" label="kGoogleServicesLastUsername"/> + <int value="6" label="kGoogleServicesLastSyncingUsername"/> <int value="7" label="kSearchProviderOverrides"/> <int value="8" label="kDefaultSearchProviderSearchURL (Obsolete 12/2016)"/> <int value="9" label="kDefaultSearchProviderKeyword (Obsolete 12/2016)"/> @@ -108081,7 +108019,7 @@ <int value="21" label="kGoogleServicesUsername (Obsolete 9/2019)"/> <int value="22" label="kSwReporterPromptSeed (Obsolete 9/2023)"/> <int value="23" label="kGoogleServicesAccountId"/> - <int value="24" label="kGoogleServicesLastAccountId"/> + <int value="24" label="kGoogleServicesLastSyncingAccountId"/> <int value="25" label="kSettingsResetPromptPromptWave (Obsolete 9/2023)"/> <int value="26" label="kSettingsResetPromptLastTriggeredForDefaultSearch (Obsolete
diff --git a/tools/metrics/histograms/metadata/ash/histograms.xml b/tools/metrics/histograms/metadata/ash/histograms.xml index bcf490e..12d809dd 100644 --- a/tools/metrics/histograms/metadata/ash/histograms.xml +++ b/tools/metrics/histograms/metadata/ash/histograms.xml
@@ -186,21 +186,6 @@ <variant name="Video.NewMexico" summary="New Mexico video"/> </variants> -<variants name="DeviceActiveClientState"> - <variant name="CheckingIn" - summary="The device active reporting client is in Checking In State"/> - <variant name="CheckingMembershipOprf" - summary="The device active reporting client is in Oprf State"/> - <variant name="CheckingMembershipQuery" - summary="The device active reporting client is in Query State"/> - <variant name="HealthCheck" - summary="The device active reporting client is in Health Check State"/> - <variant name="Idle" - summary="The device active reporting client is in Idle State"/> - <variant name="Unknown" - summary="The device active reporting client is in Unknown State"/> -</variants> - <variants name="DisplayModes"> <!-- Should be kept in sync with variants AppDisplayModes in tools/metrics/histograms/metadata/apps/histograms.xml. @@ -1227,10 +1212,10 @@ <owner>jiamingc@google.com</owner> <owner>cros-status-area-eng@google.com</owner> <summary> - Records the number of currently visible events shown to the user when the - Calendar Event List view displays in one day. i.e. the user opens the sys - tray calendar, clicks on a date cell and sees 2 events, this metric will - track a count of 2. + (For pre Jelly Calendar) Records the number of currently visible events + shown to the user when the Calendar Event List view displays in one day. + i.e. the user opens the sys tray calendar, clicks on a date cell and sees 2 + events, this metric will track a count of 2. </summary> </histogram> @@ -1246,6 +1231,18 @@ </summary> </histogram> +<histogram name="Ash.Calendar.EventListViewJelly.EventDisplayedCount" + units="int" expires_after="2024-09-04"> + <owner>newcomer@google.com</owner> + <owner>cros-status-area-eng@google.com</owner> + <summary> + (For Jelly Calendar) Records the number of currently visible events shown to + the user when the Calendar Event List view displays in one day. i.e. the + user opens the sys tray calendar, clicks on a date cell and sees 2 events, + this metric will track a count of 2. + </summary> +</histogram> + <histogram name="Ash.Calendar.EventsDisplayedToUser" enum="Boolean" expires_after="2024-09-04"> <owner>samcackett@google.com</owner> @@ -2083,6 +2080,29 @@ </summary> </histogram> +<histogram name="Ash.DeskApi.CloseAllUndo" enum="BooleanClicked" + expires_after="2024-03-17"> + <owner>aprilzhou@google.com</owner> + <owner>janetmac@chromium.org</owner> + <owner>mclare@google.com</owner> + <summary> + Emitted after a virtual desk being removed by Desk API and undo toast being + clicked. + </summary> +</histogram> + +<histogram name="Ash.DeskApi.RemoveDeskType" enum="DeskCloseType" + expires_after="2024-04-17"> + <owner>aprilzhou@google.com</owner> + <owner>janetmac@chromium.org</owner> + <owner>mclare@google.com</owner> + <summary> + Emitted when a virtual desk is removed by Desk Api to specify the category + of this remove operation among close all, combine desk, and close all and + wait. + </summary> +</histogram> + <histogram name="Ash.DeskApi.{Method}.Result" units="BooleanSuccess" expires_after="2024-04-07"> <owner>aprilzhou@google.com</owner> @@ -2763,7 +2783,7 @@ </histogram> <histogram name="Ash.DeskTemplate.AddOrUpdateTemplateStatus" - enum="DeskModelAddOrUpdateEntryStatus" expires_after="2023-12-17"> + enum="DeskModelAddOrUpdateEntryStatus" expires_after="2024-09-27"> <owner>yzd@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2774,7 +2794,7 @@ </histogram> <histogram name="Ash.DeskTemplate.AdminTemplateTabCount" units="count" - expires_after="2024-05-08"> + expires_after="2024-09-27"> <owner>hongyulong@chromium.org</owner> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> @@ -2784,7 +2804,7 @@ </histogram> <histogram name="Ash.DeskTemplate.AdminTemplateWindowCount" units="count" - expires_after="2024-05-08"> + expires_after="2024-09-27"> <owner>hongyulong@chromium.org</owner> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> @@ -2794,7 +2814,7 @@ </histogram> <histogram name="Ash.DeskTemplate.DeleteSaveAndRecall" units="BooleanHit" - expires_after="2023-12-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2803,14 +2823,14 @@ </histogram> <histogram name="Ash.DeskTemplate.DeleteTemplate" enum="BooleanHit" - expires_after="2023-12-10"> + expires_after="2024-09-27"> <owner>avynn@google.com</owner> <owner>janetmac@chromium.org</owner> <summary>Recorded when desk templates are deleted, is never false.</summary> </histogram> <histogram name="Ash.DeskTemplate.FloatingWorkspaceTabCount" units="tabs" - expires_after="2024-02-02"> + expires_after="2024-09-27"> <owner>ligeng@google.com</owner> <owner>marcuskoehler@google.com</owner> <summary> @@ -2819,7 +2839,7 @@ </histogram> <histogram name="Ash.DeskTemplate.FloatingWorkspaceWindowAndTabCount" - units="windows and tabs" expires_after="2024-02-02"> + units="windows and tabs" expires_after="2024-09-27"> <owner>ligeng@google.com</owner> <owner>marcuskoehler@google.com</owner> <summary> @@ -2829,7 +2849,7 @@ </histogram> <histogram name="Ash.DeskTemplate.FloatingWorkspaceWindowCount" units="windows" - expires_after="2024-02-02"> + expires_after="2024-09-27"> <owner>ligeng@google.com</owner> <owner>marcuskoehler@google.com</owner> <summary> @@ -2838,14 +2858,14 @@ </histogram> <histogram name="Ash.DeskTemplate.LaunchFloatingWorkspace" enum="BooleanHit" - expires_after="2024-02-02"> + expires_after="2024-09-27"> <owner>ligeng@google.com</owner> <owner>marcuskoehler@google.com</owner> <summary>Emitted when a Floating Workspace desk is launched.</summary> </histogram> <histogram name="Ash.DeskTemplate.LaunchFromTemplate" enum="BooleanHit" - expires_after="2023-12-10"> + expires_after="2024-09-27"> <owner>richui@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2854,14 +2874,14 @@ </histogram> <histogram name="Ash.DeskTemplate.LaunchSaveAndRecall" enum="BooleanHit" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary>Emitted when a Save and Recall desk is launched.</summary> </histogram> <histogram name="Ash.DeskTemplate.LoadTemplateGrid" enum="BooleanHit" - expires_after="2023-12-04"> + expires_after="2024-09-27"> <owner>avynn@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2870,14 +2890,14 @@ </histogram> <histogram name="Ash.DeskTemplate.NewSaveAndRecall" units="BooleanHit" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary>Recorded when a new Save and Recall desk is created.</summary> </histogram> <histogram name="Ash.DeskTemplate.NewTemplate" enum="BooleanHit" - expires_after="2023-12-10"> + expires_after="2024-09-27"> <owner>avynn@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2886,14 +2906,14 @@ </histogram> <histogram name="Ash.DeskTemplate.ReplaceSaveAndRecall" enum="BooleanHit" - expires_after="2023-12-10"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary>Recorded when the user replaces a Save and Recall desk.</summary> </histogram> <histogram name="Ash.DeskTemplate.ReplaceTemplate" enum="BooleanHit" - expires_after="2023-10-03"> + expires_after="2024-09-27"> <owner>aprilzhou@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2910,7 +2930,7 @@ </histogram> <histogram name="Ash.DeskTemplate.SaveAndRecallTabCount" units="count" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2919,7 +2939,7 @@ </histogram> <histogram name="Ash.DeskTemplate.SaveAndRecallTemplateSize" units="B" - expires_after="2023-11-08"> + expires_after="2024-09-27"> <owner>zhumatthew@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2929,7 +2949,7 @@ </histogram> <histogram name="Ash.DeskTemplate.SaveAndRecallUnsupportedAppDialogShow" - units="count" expires_after="2024-02-11"> + units="count" expires_after="2024-09-27"> <owner>dandersson@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2941,7 +2961,7 @@ </histogram> <histogram name="Ash.DeskTemplate.SaveAndRecallWindowAndTabCount" units="count" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2951,7 +2971,7 @@ </histogram> <histogram name="Ash.DeskTemplate.SaveAndRecallWindowCount" units="count" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2960,14 +2980,14 @@ </histogram> <histogram name="Ash.DeskTemplate.TabCount" units="count" - expires_after="2024-03-10"> + expires_after="2024-09-27"> <owner>richui@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary>Records the number of tabs in a template when it is saved.</summary> </histogram> <histogram name="Ash.DeskTemplate.TemplateSize" units="B" - expires_after="2024-03-10"> + expires_after="2024-09-27"> <owner>zhumatthew@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2976,7 +2996,7 @@ </histogram> <histogram name="Ash.DeskTemplate.TimeBetweenSaveAndRecall" units="seconds" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2986,7 +3006,7 @@ </histogram> <histogram name="Ash.DeskTemplate.TimeToLoadTemplate" units="ms" - expires_after="2024-03-17"> + expires_after="2024-09-27"> <owner>avynn@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -2996,7 +3016,7 @@ </histogram> <histogram name="Ash.DeskTemplate.UnsupportedAppDialogShow" units="count" - expires_after="2023-10-03"> + expires_after="2024-09-27"> <owner>avynn@google.com</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -3008,7 +3028,7 @@ </histogram> <histogram name="Ash.DeskTemplate.UserSaveAndRecallCount" units="count" - expires_after="2024-02-04"> + expires_after="2024-09-27"> <owner>dandersson@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -3018,7 +3038,7 @@ </histogram> <histogram name="Ash.DeskTemplate.UserTemplateCount" units="count" - expires_after="2023-12-10"> + expires_after="2024-09-27"> <owner>richui@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -3028,7 +3048,7 @@ </histogram> <histogram name="Ash.DeskTemplate.WindowAndTabCount" units="count" - expires_after="2023-12-10"> + expires_after="2024-09-27"> <owner>richui@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -3037,7 +3057,7 @@ </histogram> <histogram name="Ash.DeskTemplate.WindowCount" units="count" - expires_after="2024-03-10"> + expires_after="2024-09-27"> <owner>richui@chromium.org</owner> <owner>janetmac@chromium.org</owner> <summary> @@ -3045,193 +3065,6 @@ </summary> </histogram> -<histogram name="Ash.DeviceActiveClient.CheckMembershipCases" - enum="DeviceActiveCheckMembershipResponseCases" expires_after="2024-03-17"> - <owner>qianwan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record the number of different failed/success cases for check membership - process. Refer to ash::device_activity::DeviceActivityClient for details. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.Duration.{DeviceActiveClientState}" - units="ms" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record the total duration to transition between DeviceActivityClient states. - States are defined in //chromeos/ash/components/device_activity_client.h. - ChromeOS only. {DeviceActiveClientState} - </summary> - <token key="DeviceActiveClientState" variants="DeviceActiveClientState"/> -</histogram> - -<histogram name="Ash.DeviceActiveClient.IsPsmOprfResponseBodySet" - enum="BooleanSuccess" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record success if the PSM OPRF response contains a value. This network - request is called after browser start if the last ping timestamp of the - Chromebook is not known. ChromeOS only. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.IsPsmOprfResponseParsedCorrectly" - enum="BooleanSuccess" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record success if the PSM OPRF response is able to be parsed correctly. This - network request is called after browser start if the last ping timestamp of - the Chromebook is not known. ChromeOS only. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.IsPsmQueryResponseBodySet" - enum="BooleanSuccess" expires_after="2024-01-01"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record success if the PSM Query response contains a value. This network - request is called after browser start if the last ping timestamp of the - Chromebook is not known. ChromeOS only. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.IsPsmQueryResponseParsedCorrectly" - enum="BooleanSuccess" expires_after="2024-03-24"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record success if the PSM Query response is able to be parsed correctly. - This network request is called after browser start if the last ping - timestamp of the Chromebook is not known. ChromeOS only. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.PreservedFileState" - enum="DeviceActiveClientPreservedFileState" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record the states after reading preserved file over DBus for last active utc - dates. PreservedFileState is defined in - //chromeos/ash/components/device_activity_client.h. ChromeOS only. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.PsmOprfResponseNetErrorCode" - enum="NetErrorCodes" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Emit the NetError code associated with the PSM OPRF response. This network - request is called after browser start if the last ping timestamp of the - Chromebook is not known. ChromeOS only. Enum for histogram will contain 0 - - 899. Ranges are defined //net/base/net_error_list.h;l=14-23. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.PsmQueryResponseNetErrorCode" - enum="NetErrorCodes" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Emit the NetError code associated with the PSM Query response. This network - request is called after browser start if the last ping timestamp of the - Chromebook is not known. ChromeOS only. Enum for histogram will contain 0 - - 899. Ranges are defined //net/base/net_error_list.h;l=14-23. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.QueryMembershipResult" - enum="BooleanSuccess" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Whether the private set membership query response is true or false. - </summary> -</histogram> - -<histogram - name="Ash.DeviceActiveClient.Recorded{DeviceActivityClientTransitionMethod}Minute" - units="int" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Emitted in the minute during the hour that DeviceActivityClient - {DeviceActivityClientTransitionMethod} is called. ChromeOS only. - </summary> - <token key="DeviceActivityClientTransitionMethod"> - <variant name="TransitionOutOfIdle" summary="transition-out-of-idle"/> - <variant name="TransitionToCheckIn" summary="transition-to-check-in"/> - </token> -</histogram> - -<histogram name="Ash.DeviceActiveClient.Response.{DeviceActiveClientState}" - enum="DeviceActiveClientPsmResponse" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record the PsmResponse whenever a response is received from the server. - PsmResponse is defined in - //chromeos/ash/components/device_activity_client.h. ChromeOS only. - {DeviceActiveClientState} - </summary> - <token key="DeviceActiveClientState" variants="DeviceActiveClientState"/> -</histogram> - -<histogram name="Ash.DeviceActiveClient.SavePreservedFileSuccess" - enum="BooleanSuccess" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record success boolean after attempting to write last active utc dates for - all use case to the preserved file, over DBus. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveClient.StateCount" - enum="DeviceActiveClientState" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Recorded every time the DeviceActivityClient enters a new state in its FSM. - States are defined in //chromeos/ash/components/device_activity_client.h. - ChromeOS only. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveController.IsTestImageDevice" - enum="BooleanSuccess" expires_after="2024-03-24"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record success boolean to indicate whether a branded ChromeOS device is a - testimage/unknown channel type or a legitimate device. Frequency of - recording the histogram is on every device browser startup. - </summary> -</histogram> - -<histogram name="Ash.DeviceActiveController.PsmDeviceActiveSecretIsSet" - enum="BooleanSuccess" expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary>Whether the PSM derived active secret is set (non empty).</summary> -</histogram> - -<histogram name="Ash.DeviceActivity.MethodCalled" enum="DeviceActivityMethod" - expires_after="2024-03-17"> - <owner>hirthanan@google.com</owner> - <owner>chromeos-data-team@google.com</owner> - <summary> - Record the number of times various methods are called in - //chromeos/ash/components/device_activity/. ChromeOS only. - </summary> -</histogram> - <histogram name="Ash.Display.InternalDisplay.ActiveEffectiveResolution" enum="EffectiveResolution" expires_after="2024-03-17"> <owner>malaykeshav@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/autofill/histograms.xml b/tools/metrics/histograms/metadata/autofill/histograms.xml index 45b88edd..fe605b9a 100644 --- a/tools/metrics/histograms/metadata/autofill/histograms.xml +++ b/tools/metrics/histograms/metadata/autofill/histograms.xml
@@ -1685,6 +1685,17 @@ </summary> </histogram> +<histogram name="Autofill.ExtendedMenu.DeleteAddress" + enum="BooleanAutofillExtendedMenuDeleteAddress" expires_after="2024-10-01"> + <owner>tchudakov@google.com</owner> + <owner>chrome-autofill-alerts@google.com</owner> + <summary> + This metric measures how many users Clicked on the Delete Address option in + the extended Autofill menu and the next action. The metric is logged when + the user closes the delete address profile dialog. + </summary> +</histogram> + <histogram name="Autofill.ExtractNewForms.ShallowEqualityDiffersFromDeepEquality" enum="FormDataEquality" expires_after="M108">
diff --git a/tools/metrics/histograms/metadata/chromeos/histograms.xml b/tools/metrics/histograms/metadata/chromeos/histograms.xml index 4e2448b..00744ae0 100644 --- a/tools/metrics/histograms/metadata/chromeos/histograms.xml +++ b/tools/metrics/histograms/metadata/chromeos/histograms.xml
@@ -2865,6 +2865,22 @@ </histogram> <histogram + name="ChromeOS.Settings.Device.{Peripheral}.ButtonRemapping.StaticShortcutAction.Initial" + enum="DeviceSettingsStaticShortcutAction" expires_after="2024-03-22"> + <owner>dpad@google.com</owner> + <owner>cros-peripherals@google.com</owner> + <summary> + Records the value of the button_remapping StaticShortcutAction property when + the {Peripheral} device button_remapping is first initialized. + </summary> + <token key="Peripheral"> + <variant name="GraphicsTablet"/> + <variant name="GraphicsTabletPen"/> + <variant name="Mouse"/> + </token> +</histogram> + +<histogram name="ChromeOS.Settings.Device.{Peripheral}.{PeripheralSetting}.Changed" enum="Boolean" expires_after="2024-03-22"> <owner>dpad@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/families/histograms.xml b/tools/metrics/histograms/metadata/families/histograms.xml index 8dfbae1..a64c294 100644 --- a/tools/metrics/histograms/metadata/families/histograms.xml +++ b/tools/metrics/histograms/metadata/families/histograms.xml
@@ -314,6 +314,35 @@ </summary> </histogram> +<histogram + name="FamilyLinkUser.ClassifyUrlRequest.{AuthErrorState}.AccessTokenLatency" + units="ms" expires_after="2023-11-01"> + <owner>tju@google.com</owner> + <owner>chrome-kids-eng@google.com</owner> + <summary> + Latency of the access token fetching before making calls to Kids Management + API::ClassifyURL. Currenlty only successful authentication is counted. + </summary> + <token key="AuthErrorState"> + <variant name="NONE"/> + </token> +</histogram> + +<histogram + name="FamilyLinkUser.ClassifyUrlRequest.{HttpStatusOrNetError}.ApiLatency" + units="ms" expires_after="2023-11-01"> + <owner>tju@google.com</owner> + <owner>chrome-kids-eng@google.com</owner> + <summary> + Latency of the calls in calls to Kids Management API::ClassifyURL that + resulted with "{HttpStatusOrNetError}" status. Currently only + succesful communication with API is recorded. + </summary> + <token key="HttpStatusOrNetError"> + <variant name="HTTP_OK"/> + </token> +</histogram> + <histogram name="FamilyLinkUser.ClassifyUrlRequest.{Status}.Latency" units="ms" expires_after="2023-11-01"> <owner>tju@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index 2f58110..7f6c4dab 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -2454,6 +2454,16 @@ </summary> </histogram> +<histogram name="Media.EME.CdmStorageDatabaseSQLiteError.ClearDatabase" + enum="SqliteLoggedResultCode" expires_after="2023-12-19"> + <owner>vpasupathy@chromium.org</owner> + <owner>media-dev-uma@chromium.org</owner> + <summary> + This UMA records SQLite specific errors that occur when clearing the Cdm + Storage Database. This UMA is recorded on every error for this operation. + </summary> +</histogram> + <histogram name="Media.EME.CdmStorageDatabaseSQLiteError.DeleteFile" enum="SqliteLoggedResultCode" expires_after="2023-12-19"> <owner>vpasupathy@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/network/histograms.xml b/tools/metrics/histograms/metadata/network/histograms.xml index bc40cc8c..1f18c300 100644 --- a/tools/metrics/histograms/metadata/network/histograms.xml +++ b/tools/metrics/histograms/metadata/network/histograms.xml
@@ -332,7 +332,7 @@ <histogram name="Network.Ash.Cellular.ESim.PolicyInstall.{UserErrorHandling}.{Method}" - enum="ESimInstallResult" expires_after="2023-12-31"> + enum="ESimOperationResult" expires_after="2023-12-31"> <owner>chadduffin@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <summary> @@ -369,6 +369,27 @@ </histogram> <histogram + name="Network.Ash.Cellular.ESim.SmdsScan.{SmdsType}.{UserErrorHandling}" + enum="ESimOperationResult" expires_after="2023-12-31"> + <owner>chadduffin@chromium.org</owner> + <owner>cros-connectivity@google.com</owner> + <summary> + Records the result of a single SM-DS scan of a single SM-DS server. The + {SmdsType} token indicates the type of SM-DS server that was scanned, and + the {UserErrorHandling} token indicates the result filtering used, if any. + The "included" variant will always be emitted to; the + "filtered" variant, however, will not be emitted to when the + result was due to an Hermes failure that was caused by something outside the + control of ChromeOS, e.g. an invalid activation code. + </summary> + <token key="SmdsType" variants="SmdsType"/> + <token key="UserErrorHandling"> + <variant name="UserErrorsFiltered"/> + <variant name="UserErrorsIncluded"/> + </token> +</histogram> + +<histogram name="Network.Ash.Cellular.ESim.SmdsScanDuration.{SmdsType}.{DurationType}" units="ms" expires_after="2024-09-30"> <owner>chadduffin@google.com</owner> @@ -403,7 +424,7 @@ <histogram name="Network.Ash.Cellular.ESim.UserInstall.{UserErrorHandling}.{Method}" - enum="ESimInstallResult" expires_after="2023-12-31"> + enum="ESimOperationResult" expires_after="2023-12-31"> <owner>chadduffin@chromium.org</owner> <owner>cros-connectivity@google.com</owner> <summary> @@ -3719,7 +3740,7 @@ </histogram> <histogram name="Network.Shill.Wifi.SecurityChange" - enum="NetworkSecurityChange" expires_after="2023-10-08"> + enum="NetworkSecurityChange" expires_after="2024-02-25"> <owner>andrzejo@google.com</owner> <owner>cros-network-metrics@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/performance_manager/histograms.xml b/tools/metrics/histograms/metadata/performance_manager/histograms.xml index 14df6cb..73d083a 100644 --- a/tools/metrics/histograms/metadata/performance_manager/histograms.xml +++ b/tools/metrics/histograms/metadata/performance_manager/histograms.xml
@@ -34,6 +34,34 @@ </summary> </histogram> +<histogram + name="PerformanceManager.PerformanceInterventions.CPU.DurationOverThreshold" + units="seconds" expires_after="2024-01-01"> + <owner>agale@chromium.org</owner> + <owner>joenotcharles@chromium.org</owner> + <owner>chrome-catan@google.com</owner> + <summary> + Recorded when a device drops back below the CPU threshold, this histogram + represents the total time that the device was above the threshold. + </summary> +</histogram> + +<histogram + name="PerformanceManager.PerformanceInterventions.CPU.TotalBackgroundCPU.{Timing}" + units="%" expires_after="2024-01-01"> + <owner>agale@chromium.org</owner> + <owner>joenotcharles@chromium.org</owner> + <owner>chrome-catan@google.com</owner> + <summary> + Recorded when the CPU threshold is reached, this histogram represents the + percent of CPU capacity being used by background tabs. + </summary> + <token key="Timing"> + <variant name="Delayed"/> + <variant name="Immediate"/> + </token> +</histogram> + <histogram name="PerformanceManager.SiteDB.DatabaseInit" enum="LocalSiteCharacteristicsDBInitStatus" expires_after="2023-12-28"> <owner>joenotcharles@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/search/histograms.xml b/tools/metrics/histograms/metadata/search/histograms.xml index 310d1dd7..0e9869b 100644 --- a/tools/metrics/histograms/metadata/search/histograms.xml +++ b/tools/metrics/histograms/metadata/search/histograms.xml
@@ -121,7 +121,7 @@ </histogram> <histogram name="Search.ChoiceScreenEvents" - enum="SearchEngineChoiceScreenEvents" expires_after="2024-02-04"> + enum="SearchEngineChoiceScreenEvents" expires_after="2024-03-31"> <owner>samarchehade@chromium.org</owner> <owner>chrome-waffle-eng@google.com</owner> <summary> @@ -133,6 +133,33 @@ </summary> </histogram> +<histogram name="Search.ChoiceScreenNavigationConditions" + enum="SearchEngineChoiceScreenConditions" expires_after="2024-03-31"> + <owner>dgn@chromium.org</owner> + <owner>muellerj@chromium.org</owner> + <owner>chrome-waffle-eng@google.com</owner> + <summary> + Records the conditon state at page navigation for whether to display the + search engine choice screen. This is recorded every time the eligibility + state is being checked, which might be as often as every page navigation. + The enum is shared with ChoiceScreenProfileInitConditions, and individual + enum members might appear in only one histogram. + </summary> +</histogram> + +<histogram name="Search.ChoiceScreenProfileInitConditions" + enum="SearchEngineChoiceScreenConditions" expires_after="2024-03-31"> + <owner>dgn@chromium.org</owner> + <owner>muellerj@chromium.org</owner> + <owner>chrome-waffle-eng@google.com</owner> + <summary> + Records the conditon state at profile initialization for displaying the + search engine choice screen that the profile is in. The enum is shared with + ChoiceScreenNavigationConditions, and individual enum members might appear + in only one histogram. + </summary> +</histogram> + <histogram name="Search.ContextualSearch.All.ResultsSeen" enum="Boolean" expires_after="never"> <!-- expires-never: dashboard metric (internal: go/cs-metrics-dashboard) -->
diff --git a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml index 47fa2c19..c0cdfc3 100644 --- a/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml +++ b/tools/metrics/histograms/metadata/segmentation_platform/histograms.xml
@@ -308,7 +308,7 @@ </histogram> <histogram name="SegmentationPlatform.DeviceCountByOsType.{OsType}" - units="devices" expires_after="2023-10-01"> + units="devices" expires_after="2024-10-01"> <owner>junzou@chromium.org</owner> <owner>ssid@chromium.org</owner> <owner>chrome-segmentation-team@google.com</owner> @@ -336,7 +336,7 @@ <histogram name="SegmentationPlatform.FeatureProcessing.Error.{SegmentationModel}" enum="SegmentationPlatformFeatureProcessingError" - expires_after="2023-10-01"> + expires_after="2024-10-01"> <owner>haileywang@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -360,7 +360,7 @@ <histogram name="SegmentationPlatform.Init.ModelUpdatedTimeDifferenceInDays.{SegmentID}" - units="days" expires_after="2023-10-01"> + units="days" expires_after="2024-10-01"> <owner>haileywang@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -384,7 +384,7 @@ </histogram> <histogram name="SegmentationPlatform.Maintenance.CleanupSignalSuccessCount" - units="signals" expires_after="2023-10-01"> + units="signals" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -398,7 +398,7 @@ <histogram name="SegmentationPlatform.Maintenance.CompactionResult.{SignalType}" - enum="BooleanSuccess" expires_after="2023-10-01"> + enum="BooleanSuccess" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -412,7 +412,7 @@ </histogram> <histogram name="SegmentationPlatform.Maintenance.SignalIdentifierCount" - units="ids" expires_after="2023-10-01"> + units="ids" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -425,7 +425,7 @@ </histogram> <histogram name="SegmentationPlatform.ModelAvailability.{SegmentationModel}" - enum="SegmentationModelAvailability" expires_after="2023-10-01"> + enum="SegmentationModelAvailability" expires_after="2024-10-01"> <owner>ssid@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -444,7 +444,7 @@ <histogram name="SegmentationPlatform.ModelDelivery.DeleteResult.{SegmentationModel}" - enum="BooleanSuccess" expires_after="2023-10-01"> + enum="BooleanSuccess" expires_after="2024-10-01"> <owner>salg@chromium.org</owner> <owner>ssid@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -460,7 +460,7 @@ <histogram name="SegmentationPlatform.ModelDelivery.HasMetadata.{SegmentationModel}" - enum="BooleanYesNo" expires_after="2023-10-01"> + enum="BooleanYesNo" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -476,7 +476,7 @@ <histogram name="SegmentationPlatform.ModelDelivery.Metadata.FeatureCount.{SegmentationModel}" - units="features" expires_after="2023-10-01"> + units="features" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -492,7 +492,7 @@ <histogram name="SegmentationPlatform.ModelDelivery.Metadata.Validation.{ValidationPhase}.{SegmentationModel}" - enum="SegmentationPlatformValidationResult" expires_after="2023-10-01"> + enum="SegmentationPlatformValidationResult" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -524,7 +524,7 @@ <histogram name="SegmentationPlatform.ModelDelivery.SaveResult.{SegmentationModel}" - enum="BooleanSuccess" expires_after="2023-10-01"> + enum="BooleanSuccess" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -540,7 +540,7 @@ <histogram name="SegmentationPlatform.ModelDelivery.SegmentIdMatches.{SegmentationModel}" - enum="BooleanYesNo" expires_after="2023-10-01"> + enum="BooleanYesNo" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -556,7 +556,7 @@ <histogram name="SegmentationPlatform.ModelExecution.DefaultProvider.Status.{SegmentationModel}" - enum="SegmentationPlatformModelExecutionStatus" expires_after="2023-10-01"> + enum="SegmentationPlatformModelExecutionStatus" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -570,7 +570,7 @@ <histogram name="SegmentationPlatform.ModelExecution.Duration.FeatureProcessing.{SegmentationModel}" - units="ms" expires_after="2023-10-01"> + units="ms" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -585,7 +585,7 @@ <histogram name="SegmentationPlatform.ModelExecution.Duration.Model.{SegmentationModel}.{ModelExecutionStatus}" - units="ms" expires_after="2023-10-01"> + units="ms" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -602,7 +602,7 @@ <histogram name="SegmentationPlatform.ModelExecution.Duration.Total.{SegmentationModel}.{ModelExecutionStatus}" - units="ms" expires_after="2023-10-01"> + units="ms" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -621,7 +621,7 @@ <histogram name="SegmentationPlatform.ModelExecution.Result.{Index}.{SegmentationModel}" - units="score" expires_after="2023-10-01"> + units="score" expires_after="2024-10-01"> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -637,7 +637,7 @@ <histogram name="SegmentationPlatform.ModelExecution.Result.{SegmentationModel}" - units="score" expires_after="2023-10-01"> + units="score" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -653,7 +653,7 @@ <histogram name="SegmentationPlatform.ModelExecution.SaveResult.{SegmentationModel}" - enum="BooleanSuccess" expires_after="2023-10-01"> + enum="BooleanSuccess" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -669,7 +669,7 @@ <histogram name="SegmentationPlatform.ModelExecution.Status.{SegmentationModel}" - enum="SegmentationPlatformModelExecutionStatus" expires_after="2023-10-01"> + enum="SegmentationPlatformModelExecutionStatus" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -696,7 +696,7 @@ <histogram name="SegmentationPlatform.ModelExecution.ZeroValuePercent.{SegmentationModel}" - units="%" expires_after="2023-10-01"> + units="%" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -710,7 +710,7 @@ </histogram> <histogram name="SegmentationPlatform.ModelScore.{SegmentID}" units="%" - expires_after="2023-10-01"> + expires_after="2024-10-01"> <obsolete> Deprecated as of 2022-10-24. </obsolete> @@ -726,7 +726,7 @@ <histogram name="SegmentationPlatform.SegmentInfoDatabase.ProtoDBUpdateResult.{SegmentationKey}" - units="BooleanSuccess" expires_after="2023-10-01"> + units="BooleanSuccess" expires_after="2024-10-01"> <owner>salg@google.com</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -743,7 +743,7 @@ <histogram name="SegmentationPlatform.SegmentSelectionOnDemand.Duration.{SegmentationKey}.{SelectedSegment}" - units="ms" expires_after="2023-10-01"> + units="ms" expires_after="2024-10-01"> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -776,7 +776,7 @@ </histogram> <histogram name="SegmentationPlatform.SelectionFailedReason.{SegmentationKey}" - enum="SegmentationSelectionFailureReason" expires_after="2023-10-01"> + enum="SegmentationSelectionFailureReason" expires_after="2024-10-01"> <owner>ssid@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -794,7 +794,7 @@ <histogram name="SegmentationPlatform.SignalDatabase.GetSamples.DatabaseEntryCount" - units="entries" expires_after="2023-12-04"> + units="entries" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -822,7 +822,7 @@ </histogram> <histogram name="SegmentationPlatform.SignalDatabase.GetSamples.SampleCount" - units="samples" expires_after="2023-10-01"> + units="samples" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -837,7 +837,7 @@ </histogram> <histogram name="SegmentationPlatform.Signals.ListeningCount.{SignalType}" - units="signals" expires_after="2023-10-01"> + units="signals" expires_after="2024-10-01"> <owner>nyquist@chromium.org</owner> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -850,7 +850,7 @@ </histogram> <histogram name="SegmentationPlatform.StructuredMetrics.TooManyTensors.Count" - units="tensors" expires_after="2023-10-01"> + units="tensors" expires_after="2024-10-01"> <owner>qinmin@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -894,7 +894,7 @@ </histogram> <histogram name="SegmentationPlatform.SyncSessions.TimeFromStartupToSyncUpdate" - units="ms" expires_after="2023-12-04"> + units="ms" expires_after="2024-10-01"> <owner>ritikagup@google.com</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -943,7 +943,7 @@ <histogram name="SegmentationPlatform.TrainingDataCollectionEvents.{SegmentationModel}" enum="SegmentationPlatformTrainingDataCollectionEvent" - expires_after="2023-10-01"> + expires_after="2024-10-01"> <owner>ssid@chromium.org</owner> <owner>qinmin@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> @@ -956,7 +956,7 @@ </histogram> <histogram name="SegmentationPlatform.{BooleanModel}.SegmentSwitched" - enum="SegmentationBooleanSegmentSwitch" expires_after="2023-10-01"> + enum="SegmentationBooleanSegmentSwitch" expires_after="2024-10-01"> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -969,7 +969,7 @@ <histogram name="SegmentationPlatform.{SegmentationKey}.PostProcessing.TopLabel.Computed" - units="index" expires_after="2023-10-01"> + units="index" expires_after="2024-10-01"> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -983,7 +983,7 @@ <histogram name="SegmentationPlatform.{SegmentationKey}.PostProcessing.TopLabel.Switched" - units="index" expires_after="2023-10-01"> + units="index" expires_after="2024-10-01"> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary> @@ -997,7 +997,7 @@ <histogram name="SegmentationPlatform.{SegmentationKey}.SegmentSelection.Computed2" - enum="SegmentationPlatformSegmentationModel" expires_after="2023-10-01"> + enum="SegmentationPlatformSegmentationModel" expires_after="2024-10-01"> <owner>shaktisahu@chromium.org</owner> <owner>chrome-segmentation-platform@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/signin/histograms.xml b/tools/metrics/histograms/metadata/signin/histograms.xml index e71afd64..669de99e 100644 --- a/tools/metrics/histograms/metadata/signin/histograms.xml +++ b/tools/metrics/histograms/metadata/signin/histograms.xml
@@ -265,17 +265,31 @@ </summary> </histogram> -<histogram name="Signin.AccountTracker.IsAccountIdEmpty" enum="BooleanEmpty" - expires_after="2023-12-31"> +<histogram name="Signin.AccountTracker.RefreshAccountInfo.IsTrackingAccount" + enum="Boolean" expires_after="2023-12-31"> + <owner>msarda@chromium.org</owner> + <owner>chrome-signin-team@google.com</owner> + <summary> + Indicates whether the account was seeded when the account info needs to be + refreshed. + + This histogram will be used to decide whether the account needs to be seeded + during while refreshing the account info. + </summary> +</histogram> + +<histogram name="Signin.AccountTracker.SeedAccountInfo.IsAccountIdEmpty" + enum="BooleanEmpty" expires_after="2023-12-31"> + <owner>msarda@chromium.org</owner> <owner>sinhak@chromium.org</owner> <owner>chrome-signin-team@google.com</owner> <summary> - Indicates if the account being tracked by AccountTracker has an empty - account id. This is recorded whenever AccountTracker starts tracking a new - account. + Indicates if the account being seeded by AccountTracker has an empty account + id. This is in general an error as the account with an empty id cannot be + tracked. This histogram will be used to decide the severity of AccountTracker - receiving malformed account ids. + receiving malformed account ids during the seeding process. </summary> </histogram>
diff --git a/tools/metrics/histograms/metadata/storage/histograms.xml b/tools/metrics/histograms/metadata/storage/histograms.xml index c090a5e..6d3eb8d 100644 --- a/tools/metrics/histograms/metadata/storage/histograms.xml +++ b/tools/metrics/histograms/metadata/storage/histograms.xml
@@ -528,7 +528,7 @@ </histogram> <histogram name="Storage.InterestGroup.DBErrors" units="count" - expires_after="2023-10-08"> + expires_after="M123"> <owner>behamilton@google.com</owner> <owner>pauljensen@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/variations/histograms.xml b/tools/metrics/histograms/metadata/variations/histograms.xml index c207a476..51ec1d4 100644 --- a/tools/metrics/histograms/metadata/variations/histograms.xml +++ b/tools/metrics/histograms/metadata/variations/histograms.xml
@@ -139,7 +139,7 @@ </histogram> <histogram name="Variations.FirstRun.SeedConnectTime" units="ms" - expires_after="2023-10-22"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -152,7 +152,7 @@ </histogram> <histogram name="Variations.FirstRun.SeedFetchResult" - enum="VariationsSeedFetchResult" expires_after="2023-11-01"> + enum="VariationsSeedFetchResult" expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -165,7 +165,7 @@ </histogram> <histogram name="Variations.FirstRun.SeedFetchTime" units="ms" - expires_after="2024-02-25"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -176,7 +176,7 @@ </histogram> <histogram name="Variations.FirstRunResult" enum="VariationsFirstRunResult" - expires_after="2023-10-22"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -214,7 +214,7 @@ </histogram> <histogram name="Variations.Headers.ExperimentCount" units="units" - expires_after="2024-02-04"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -270,7 +270,7 @@ </histogram> <histogram name="Variations.InvalidLayerReason" - enum="VariationsInvalidLayerReason" expires_after="2023-11-01"> + enum="VariationsInvalidLayerReason" expires_after="2024-11-01"> <owner>holte@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -280,7 +280,7 @@ </histogram> <histogram name="Variations.InvalidStudyReason" - enum="VariationsInvalidStudyReason" expires_after="2023-11-01"> + enum="VariationsInvalidStudyReason" expires_after="2024-11-01"> <owner>jwd@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -290,7 +290,7 @@ </histogram> <histogram name="Variations.Limits.VariationKeySize.{Size}" units="KiB" - expires_after="2024-03-12"> + expires_after="2024-11-01"> <owner>dalerogerson@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -311,7 +311,7 @@ <histogram name="Variations.LoadPermanentConsistencyCountryResult" enum="VariationsPermanentConsistencyCountryResult" - expires_after="2023-11-01"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -323,7 +323,7 @@ </histogram> <histogram name="Variations.LoadSeedSignature" enum="VariationSeedSignature" - expires_after="2018-08-30"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -491,7 +491,7 @@ </histogram> <histogram name="Variations.SeedDateChange" enum="VariationsSeedDateChange" - expires_after="2024-02-11"> + expires_after="2024-11-01"> <owner>jwd@chromium.org</owner> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -505,7 +505,7 @@ </histogram> <histogram name="Variations.SeedFetchResponseOrErrorCode{ConnectionType}" - enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-02-20"> + enum="CombinedHttpResponseAndNetErrorCode" expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -521,7 +521,7 @@ </histogram> <histogram name="Variations.SeedFetchTimeOnFirstRun" units="ms" - expires_after="2024-02-25"> + expires_after="2024-11-01"> <owner>ginnyhuang@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -534,7 +534,7 @@ </histogram> <histogram name="Variations.SeedFreshness" units="minutes" - expires_after="2024-02-04"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -563,7 +563,7 @@ </histogram> <histogram name="Variations.SeedFreshness.Future" units="days" - expires_after="M117"> + expires_after="2024-11-01"> <owner>caitlinfischer@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -574,7 +574,7 @@ </histogram> <histogram name="Variations.SeedLoadBlockingTime" units="ms" - expires_after="2023-11-14"> + expires_after="2024-11-01"> <owner>ntfschr@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <owner>src/android_webview/OWNERS</owner> @@ -590,7 +590,7 @@ </histogram> <histogram name="Variations.SeedLoadResult" enum="VariationsSeedLoadResult" - expires_after="2024-02-04"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -602,7 +602,7 @@ </histogram> <histogram name="Variations.SeedProcessingTime" units="ms" - expires_after="2024-02-05"> + expires_after="2024-11-01"> <owner>isherman@chromium.org</owner> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -615,7 +615,7 @@ </histogram> <histogram name="Variations.SeedStoreResult" enum="VariationsSeedStoreResult" - expires_after="2024-02-04"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -626,7 +626,7 @@ </histogram> <histogram name="Variations.SeedUsage" enum="VariationsSeedUsage" - expires_after="2024-02-04"> + expires_after="2024-11-01"> <owner>caitlinfischer@google.com</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -637,7 +637,7 @@ </histogram> <histogram name="Variations.StoreSeed.DataSize" units="KiB" - expires_after="2023-12-10"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -648,7 +648,7 @@ </histogram> <histogram name="Variations.StoreSeed.Time" units="ms" - expires_after="2024-02-04"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> <summary> @@ -657,7 +657,7 @@ </histogram> <histogram name="Variations.StoreSeedSignature" enum="VariationSeedSignature" - expires_after="2023-11-01"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner> @@ -679,7 +679,7 @@ </histogram> <histogram name="Variations.TimeSinceLastFetchAttempt" units="minutes" - expires_after="2023-11-01"> + expires_after="2024-11-01"> <owner>asvitkine@chromium.org</owner> <owner>rkaplow@chromium.org</owner> <owner>src/base/metrics/OWNERS</owner>
diff --git a/tools/metrics/histograms/metadata/windows/histograms.xml b/tools/metrics/histograms/metadata/windows/histograms.xml index 3c54c6d..03e30ea9 100644 --- a/tools/metrics/histograms/metadata/windows/histograms.xml +++ b/tools/metrics/histograms/metadata/windows/histograms.xml
@@ -171,17 +171,6 @@ </summary> </histogram> -<histogram name="Windows.MakeChromeDefaultDirectly.Result" - enum="DefaultDirectAttemptResult" expires_after="2024-01-28"> - <owner>robliao@chromium.org</owner> - <owner>davidbienvenu@chromium.org</owner> - <summary> - Records the outcome of attempting to set the default directly. Recorded when - a request to make Chrome default is received and is eligible for the direct - path. - </summary> -</histogram> - <histogram name="Windows.Menu.Win11Style" enum="BooleanWin11MenuStyle" expires_after="M97"> <owner>kylixrd@chromium.org</owner>
diff --git a/tools/metrics/structured/OWNERS b/tools/metrics/structured/OWNERS index 7c7e11aa..3df776b 100644 --- a/tools/metrics/structured/OWNERS +++ b/tools/metrics/structured/OWNERS
@@ -1,2 +1,3 @@ tby@chromium.org jongahn@chromium.org +andrewbregger@google.com
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index f25ff5c..d1ff4c0 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "perfetto-luci-artifacts/v37.0/linux-arm64/trace_processor_shell" }, "win": { - "hash": "d2d4fdde7691f6bedcf29249825533d3e39c449d", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f95244890e05c2d6fae40a293035ce479db6fc3c/trace_processor_shell.exe" + "hash": "631e5890bec6fbf53b736ab408e2c231cd70f25f", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/ee5cadbada4d39bc97bac3bf6cdb592e369f1a99/trace_processor_shell.exe" }, "linux_arm": { "hash": "4ad0dc8eeae3ad92d6a1da2f1653a81fb9e3c4c1", @@ -22,7 +22,7 @@ }, "linux": { "hash": "a0d37191475ed9da1200b7baa7208c34035102ab", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/d3bf532f84cf34f899c5785043ceb4af8f76d4e3/trace_processor_shell" + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/a3d4c1de9bcf2a0471ab183c45cf111efd29571e/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/typescript/validate_tsconfig.py b/tools/typescript/validate_tsconfig.py index 85e0e5a8..f987d92 100644 --- a/tools/typescript/validate_tsconfig.py +++ b/tools/typescript/validate_tsconfig.py
@@ -111,8 +111,6 @@ 'ash/webui/diagnostics_ui/', 'ash/webui/face_ml_app_ui/', 'ash/webui/file_manager/resources/labs/', - # TODO(b/299520240): Migrate scanning to TypeScript and remove exception. - 'ash/webui/scanning/', 'ash/webui/shortcut_customization_ui/', 'ash/webui/sample_system_web_app_ui/', 'ui/file_manager/',
diff --git a/ui/actions/actions.cc b/ui/actions/actions.cc index cc5fd7dd..f6a3793 100644 --- a/ui/actions/actions.cc +++ b/ui/actions/actions.cc
@@ -7,14 +7,15 @@ #include <algorithm> #include <limits> -#include "base/memory/ptr_util.h" #include "base/no_destructor.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/metadata/metadata_impl_macros.h" +namespace actions { + namespace { -class GlobalActionManager : public actions::ActionManager { +class GlobalActionManager : public ActionManager { public: GlobalActionManager() = default; GlobalActionManager(const GlobalActionManager&) = delete; @@ -29,7 +30,6 @@ } // namespace -namespace actions { DEFINE_UI_CLASS_PROPERTY_KEY(bool, kActionItemPinnableKey, false) ActionList::ActionList(Delegate* delegate) : delegate_(delegate) {} @@ -515,12 +515,11 @@ #include "ui/actions/action_id_macros.inc" // static -base::flat_map<ActionId, std::string_view>& -ActionManager::GetActionIdToStringMap() { - static base::flat_map<ActionId, std::string_view> action_id_to_string_map_ = +ActionManager::ActionIdToStringMap& ActionManager::GetActionIdToStringMap() { + static ActionIdToStringMap map = base::MakeFlatMap<ActionId, std::string_view>( std::vector<std::pair<ActionId, std::string_view>>{ACTION_IDS}); - return action_id_to_string_map_; + return map; } #include "ui/actions/action_id_macros.inc" @@ -530,12 +529,11 @@ #include "ui/actions/action_id_macros.inc" // static -base::flat_map<std::string_view, ActionId>& -ActionManager::GetStringToActionIdMap() { - static base::flat_map<std::string_view, ActionId> string_to_action_id_map_ = +ActionManager::StringToActionIdMap& ActionManager::GetStringToActionIdMap() { + static StringToActionIdMap map = base::MakeFlatMap<std::string_view, ActionId>( std::vector<std::pair<std::string_view, ActionId>>{ACTION_IDS}); - return string_to_action_id_map_; + return map; } #include "ui/actions/action_id_macros.inc" @@ -568,8 +566,7 @@ action_id_strings.reserve(action_ids.size()); for (ActionId action_id : action_ids) { - absl::optional<std::string> str = ActionIdToString(action_id); - action_id_strings.push_back(str); + action_id_strings.push_back(ActionIdToString(action_id)); } return action_id_strings; } @@ -581,8 +578,7 @@ action_ids.reserve(action_id_strings.size()); for (std::string action_id_string : action_id_strings) { - absl::optional<ActionId> action_id = StringToActionId(action_id_string); - action_ids.push_back(action_id); + action_ids.push_back(StringToActionId(action_id_string)); } return action_ids; } @@ -592,20 +588,18 @@ base::flat_map<T, U>& map2) { auto vec1 = std::move(map1).extract(); auto vec2 = std::move(map2).extract(); - std::vector<std::pair<T, U>> vec3((int)vec1.size() + (int)vec2.size()); + std::vector<std::pair<T, U>> vec3(vec1.size() + vec2.size()); std::merge(vec1.begin(), vec1.end(), vec2.begin(), vec2.end(), vec3.begin()); map1.replace(std::move(vec3)); } // static -void ActionManager::AddActionIdToStringMappings( - base::flat_map<ActionId, std::string_view> map) { +void ActionManager::AddActionIdToStringMappings(ActionIdToStringMap map) { MergeMaps<ActionId, std::string_view>(GetActionIdToStringMap(), map); } // static -void ActionManager::AddStringToActionIdMappings( - base::flat_map<std::string_view, ActionId> map) { +void ActionManager::AddStringToActionIdMappings(StringToActionIdMap map) { MergeMaps(GetStringToActionIdMap(), map); }
diff --git a/ui/actions/actions.h b/ui/actions/actions.h index ab401bc8..7969d0e3 100644 --- a/ui/actions/actions.h +++ b/ui/actions/actions.h
@@ -5,7 +5,9 @@ #ifndef UI_ACTIONS_ACTIONS_H_ #define UI_ACTIONS_ACTIONS_H_ +#include <memory> #include <string> +#include <utility> #include <vector> #include "base/callback_list.h" @@ -264,6 +266,8 @@ using ActionItemInitializerList = base::RepeatingCallbackList<void(ActionManager*)>; + using ActionIdToStringMap = base::flat_map<ActionId, std::string_view>; + using StringToActionIdMap = base::flat_map<std::string_view, ActionId>; ActionManager(const ActionManager&) = delete; ActionManager& operator=(const ActionManager&) = delete; @@ -284,10 +288,8 @@ static std::vector<absl::optional<ActionId>> StringsToActionIds( std::vector<std::string> action_id_strings); - static void AddActionIdToStringMappings( - base::flat_map<ActionId, std::string_view> map); - static void AddStringToActionIdMappings( - base::flat_map<std::string_view, ActionId> map); + static void AddActionIdToStringMappings(ActionIdToStringMap map); + static void AddStringToActionIdMappings(StringToActionIdMap map); // The second element in the pair is set to true if a new ActionId is // created, or false if an ActionId with the given name already exists. @@ -337,14 +339,14 @@ template <typename T, typename U> static void MergeMaps(base::flat_map<T, U>& map1, base::flat_map<T, U>& map2); + static ActionIdToStringMap& GetActionIdToStringMap(); + static StringToActionIdMap& GetStringToActionIdMap(); + // Holds the chain of ActionManager initializer callbacks. std::unique_ptr<ActionItemInitializerList> initializer_list_; // All "root" actions are parented to this action. BaseAction root_action_parent_; - - static base::flat_map<ActionId, std::string_view>& GetActionIdToStringMap(); - static base::flat_map<std::string_view, ActionId>& GetStringToActionIdMap(); }; COMPONENT_EXPORT(ACTIONS)
diff --git a/ui/actions/actions_unittest.cc b/ui/actions/actions_unittest.cc index c962aaa..c89e3f7 100644 --- a/ui/actions/actions_unittest.cc +++ b/ui/actions/actions_unittest.cc
@@ -7,6 +7,7 @@ #include "base/callback_list.h" #include "base/functional/bind.h" #include "base/test/metrics/histogram_tester.h" +#include "testing/gmock/include/gmock/gmock.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "ui/base/class_property.h" @@ -187,47 +188,42 @@ TEST_F(ActionManagerTest, MapBetweenEnumAndString) { const std::string expected_action_string = "kActionPaste"; auto actual_action_string = ActionManager::ActionIdToString(kActionPaste); - ASSERT_TRUE(actual_action_string.has_value()); - EXPECT_EQ(expected_action_string, actual_action_string.value()); + ASSERT_THAT(actual_action_string, testing::Optional(expected_action_string)); // Map back from enum to string - const ActionId expected_action_id = kActionPaste; auto actual_action_id = ActionManager::StringToActionId(actual_action_string.value()); - ASSERT_TRUE(actual_action_id.has_value()); - EXPECT_EQ(expected_action_id, actual_action_id.value()); + EXPECT_THAT(actual_action_id, testing::Optional(kActionPaste)); const std::vector<std::string> strings{"kActionPaste", "kActionCut"}; const std::vector<ActionId> action_ids{kActionPaste, kActionCut}; auto actual_strings = ActionManager::ActionIdsToStrings(action_ids); - EXPECT_EQ(strings.size(), actual_strings.size()); - EXPECT_EQ(strings[0], actual_strings[0].value()); - EXPECT_EQ(strings[1], actual_strings[1].value()); + ASSERT_EQ(strings.size(), actual_strings.size()); + EXPECT_THAT(actual_strings[0], testing::Optional(strings[0])); + EXPECT_THAT(actual_strings[1], testing::Optional(strings[1])); auto actual_action_ids = ActionManager::StringsToActionIds(strings); - EXPECT_EQ(action_ids.size(), actual_action_ids.size()); - EXPECT_EQ(action_ids[0], actual_action_ids[0].value()); - EXPECT_EQ(action_ids[1], actual_action_ids[1].value()); + ASSERT_EQ(action_ids.size(), actual_action_ids.size()); + EXPECT_THAT(actual_action_ids[0], testing::Optional(action_ids[0])); + EXPECT_THAT(actual_action_ids[1], testing::Optional(action_ids[1])); } #define MAP_ACTION_IDS_TO_STRINGS #include "ui/actions/action_id_macros.inc" TEST_F(ActionManagerTest, MergeMaps) { - auto kTestActionMap = base::MakeFlatMap<ActionId, std::string_view>( + auto test_action_map = base::MakeFlatMap<ActionId, std::string_view>( std::vector<std::pair<ActionId, std::string_view>>{TEST_ACTION_IDS}); - ActionManager::AddActionIdToStringMappings(kTestActionMap); + ActionManager::AddActionIdToStringMappings(test_action_map); const std::string expected_action_string = "kActionPaste"; auto actual_action_string = ActionManager::ActionIdToString(kActionPaste); - ASSERT_TRUE(actual_action_string.has_value()); - EXPECT_EQ(expected_action_string, actual_action_string.value()); + EXPECT_THAT(actual_action_string, testing::Optional(expected_action_string)); const std::string expected_string = "kActionTest2"; auto actual_string = ActionManager::ActionIdToString(kActionTest2); - ASSERT_TRUE(actual_string.has_value()); - EXPECT_EQ(expected_string, actual_string.value()); + EXPECT_THAT(actual_string, testing::Optional(expected_string)); } #include "ui/actions/action_id_macros.inc"
diff --git a/ui/aura/client/screen_position_client.h b/ui/aura/client/screen_position_client.h index 1ce3eb8..d729f2a 100644 --- a/ui/aura/client/screen_position_client.h +++ b/ui/aura/client/screen_position_client.h
@@ -40,8 +40,10 @@ // See the comments for ash::GetRootWindowRelativeToWindow for details. virtual void ConvertHostPointToScreen(Window* root_window, gfx::Point* point) = 0; - // Sets the bounds of the window. The implementation is responsible - // for finding out and translating the right coordinates for the |window|. + // Sets the bounds of the window. The implementation is responsible for + // finding out and translating the right coordinates for the |window|. + // `display` may be invalid on Windows platform and the implementation needs + // to be tolerant for it. virtual void SetBounds(Window* window, const gfx::Rect& bounds, const display::Display& display) = 0;
diff --git a/ui/base/BUILD.gn b/ui/base/BUILD.gn index 6eb8ca6..099dd57 100644 --- a/ui/base/BUILD.gn +++ b/ui/base/BUILD.gn
@@ -592,7 +592,6 @@ sources += [ "glib/glib_cast.h", "glib/glib_integers.h", - "glib/glib_signal.h", "glib/scoped_gobject.h", "glib/scoped_gsignal.cc", "glib/scoped_gsignal.h",
diff --git a/ui/base/glib/glib_signal.h b/ui/base/glib/glib_signal.h deleted file mode 100644 index c37a1fd..0000000 --- a/ui/base/glib/glib_signal.h +++ /dev/null
@@ -1,148 +0,0 @@ -// Copyright 2011 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef UI_BASE_GLIB_GLIB_SIGNAL_H_ -#define UI_BASE_GLIB_GLIB_SIGNAL_H_ - -typedef void* gpointer; - -// At the time of writing this, there were two common ways of binding our C++ -// code to the gobject C system. We either defined a whole bunch of "static -// MethodThunk()" which just called nonstatic Method()s on a class (which hurt -// readability of the headers and signal connection code) OR we declared -// "static Method()" and passed in the current object as the gpointer (and hurt -// readability in the implementation by having "context->" before every -// variable). - -// The hopeful result of using these macros is that the code will be more -// readable and regular. There shouldn't be a bunch of static Thunks visible in -// the headers and the implementations shouldn't be filled with "context->" -// de-references. - -#define CHROMEG_CALLBACK_0(CLASS, RETURN, METHOD, SENDER) \ - static RETURN METHOD##Thunk(SENDER sender, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender); \ - } \ - \ - RETURN METHOD(SENDER) - -#define CHROMEG_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one); \ - } \ - \ - RETURN METHOD(SENDER, ARG1) - -#define CHROMEG_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, \ - gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two); \ - } \ - \ - RETURN METHOD(SENDER, ARG1, ARG2) - -#define CHROMEG_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, \ - three); \ - } \ - \ - RETURN METHOD(SENDER, ARG1, ARG2, ARG3) - -#define CHROMEG_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ - ARG4) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - ARG4 four, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, three, \ - four); \ - } \ - \ - RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4) - -#define CHROMEG_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ - ARG4, ARG5) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - ARG4 four, ARG5 five, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, three, \ - four, five); \ - } \ - \ - RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5) - -#define CHROMEG_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, ARG3, \ - ARG4, ARG5, ARG6) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - ARG4 four, ARG5 five, ARG6 six, \ - gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, three, \ - four, five, six); \ - } \ - \ - RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) - -#define CHROMEG_VIRTUAL_CALLBACK_0(CLASS, RETURN, METHOD, SENDER) \ - static RETURN METHOD##Thunk(SENDER sender, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender); \ - } \ - \ - virtual RETURN METHOD(SENDER) - -#define CHROMEG_VIRTUAL_CALLBACK_1(CLASS, RETURN, METHOD, SENDER, ARG1) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one); \ - } \ - \ - virtual RETURN METHOD(SENDER, ARG1) - -#define CHROMEG_VIRTUAL_CALLBACK_2(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, \ - gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two); \ - } \ - \ - virtual RETURN METHOD(SENDER, ARG1, ARG2) - -#define CHROMEG_VIRTUAL_CALLBACK_3(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ - ARG3) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, \ - three); \ - } \ - \ - virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3) - -#define CHROMEG_VIRTUAL_CALLBACK_4(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ - ARG3, ARG4) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - ARG4 four, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, three, \ - four); \ - } \ - \ - virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4) - -#define CHROMEG_VIRTUAL_CALLBACK_5(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ - ARG3, ARG4, ARG5) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - ARG4 four, ARG5 five, gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, three, \ - four, five); \ - } \ - \ - virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5) - -#define CHROMEG_VIRTUAL_CALLBACK_6(CLASS, RETURN, METHOD, SENDER, ARG1, ARG2, \ - ARG3, ARG4, ARG5, ARG6) \ - static RETURN METHOD##Thunk(SENDER sender, ARG1 one, ARG2 two, ARG3 three, \ - ARG4 four, ARG5 five, ARG6 six, \ - gpointer userdata) { \ - return reinterpret_cast<CLASS*>(userdata)->METHOD(sender, one, two, three, \ - four, five, six); \ - } \ - \ - virtual RETURN METHOD(SENDER, ARG1, ARG2, ARG3, ARG4, ARG5, ARG6) - -#endif // UI_BASE_GLIB_GLIB_SIGNAL_H_
diff --git a/ui/base/x/x11_display_util.cc b/ui/base/x/x11_display_util.cc index d9fafd7..8f833ba 100644 --- a/ui/base/x/x11_display_util.cc +++ b/ui/base/x/x11_display_util.cc
@@ -370,8 +370,8 @@ display.set_depth_per_component(bits_per_component); // Set monitor refresh rate - float refresh_rate = - GetRefreshRateFromXRRModeInfo(resources->modes, crtc->mode); + int refresh_rate = static_cast<int>( + GetRefreshRateFromXRRModeInfo(resources->modes, crtc->mode)); display.set_display_frequency(refresh_rate); }
diff --git a/ui/chromeos/strings/network/network_element_localized_strings_provider.cc b/ui/chromeos/strings/network/network_element_localized_strings_provider.cc index 5893d07..2afe661f 100644 --- a/ui/chromeos/strings/network/network_element_localized_strings_provider.cc +++ b/ui/chromeos/strings/network/network_element_localized_strings_provider.cc
@@ -145,6 +145,8 @@ {"networkIconLabelConnecting", IDS_NETWORK_ICON_LABEL_CONNECTING}, {"networkIconLabelNotConnected", IDS_NETWORK_ICON_LABEL_NOT_CONNECTED}, {"networkIconLabelSignalStrength", IDS_NETWORK_ICON_LABEL_SIGNAL_STRENGTH}, + {"networkListItemUpdatedCellularSimCardCarrierLocked", + IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_CARRIER_LOCKED}, }; } // namespace @@ -507,6 +509,8 @@ html_source->AddBoolean("isApnRevampEnabled", ash::features::IsApnRevampEnabled()); + html_source->AddBoolean("isCellularCarrierLockEnabled", + ash::features::IsCellularCarrierLockEnabled()); } void AddConfigLocalizedStrings(content::WebUIDataSource* html_source) {
diff --git a/ui/chromeos/ui_chromeos_strings.grd b/ui/chromeos/ui_chromeos_strings.grd index 771f0ab..84521942 100644 --- a/ui/chromeos/ui_chromeos_strings.grd +++ b/ui/chromeos/ui_chromeos_strings.grd
@@ -1436,6 +1436,9 @@ <message name="IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_LOCKED" desc="Text in the network list element when a Cellular network's SIM card is locked. Used when updated cellular activation flag in on."> Locked </message> + <message name="IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_CARRIER_LOCKED" desc="Text in the network list element when a Cellular network's SIM card is locked to a specific carrier. Used when updated cellular activation flag in on."> + Locked by provider + </message> <message name="IDS_NETWORK_LIST_NOT_CONNECTED" desc="Text in the network list element when there is a network for the type, but it is not connected or connecting."> Not connected </message>
diff --git a/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_CARRIER_LOCKED.png.sha1 b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_CARRIER_LOCKED.png.sha1 new file mode 100644 index 0000000..b97757d --- /dev/null +++ b/ui/chromeos/ui_chromeos_strings_grd/IDS_NETWORK_LIST_UPDATED_CELLULAR_SIM_CARD_CARRIER_LOCKED.png.sha1
@@ -0,0 +1 @@ +20183b381739f787503bdd89ce18d119d7d2fc4e \ No newline at end of file
diff --git a/ui/display/display.h b/ui/display/display.h index 890d2329..67d728b 100644 --- a/ui/display/display.h +++ b/ui/display/display.h
@@ -267,8 +267,8 @@ void set_is_monochrome(bool is_monochrome) { is_monochrome_ = is_monochrome; } // The display frequency of the monitor. - float display_frequency() const { return display_frequency_; } - void set_display_frequency(float display_frequency) { + int display_frequency() const { return display_frequency_; } + void set_display_frequency(int display_frequency) { display_frequency_ = display_frequency; } @@ -334,7 +334,7 @@ int depth_per_component_; bool is_monochrome_ = false; bool detected_ = true; - float display_frequency_ = 0; + int display_frequency_ = 0; std::string label_; uint32_t audio_formats_ = 0; };
diff --git a/ui/display/display_unittest.cc b/ui/display/display_unittest.cc index ce9e5c14..7707742 100644 --- a/ui/display/display_unittest.cc +++ b/ui/display/display_unittest.cc
@@ -74,11 +74,11 @@ TEST(DisplayTest, DisplayFrequency) { Display display(0, gfx::Rect(0, 0, 100, 100)); - display.set_display_frequency(60.0f); - EXPECT_EQ(60.0f, display.display_frequency()); + display.set_display_frequency(60); + EXPECT_EQ(60, display.display_frequency()); - display.set_display_frequency(120.0f); - EXPECT_EQ(120.0f, display.display_frequency()); + display.set_display_frequency(120); + EXPECT_EQ(120, display.display_frequency()); } TEST(DisplayTest, DisplayLabel) {
diff --git a/ui/display/mojom/display.mojom b/ui/display/mojom/display.mojom index d11de5c..7b95a7c 100644 --- a/ui/display/mojom/display.mojom +++ b/ui/display/mojom/display.mojom
@@ -45,6 +45,6 @@ int32 color_depth; int32 depth_per_component; bool is_monochrome; - float display_frequency; + int32 display_frequency; string label; };
diff --git a/ui/display/mojom/display_mojom_traits.h b/ui/display/mojom/display_mojom_traits.h index 7c9ccef..c021d92c 100644 --- a/ui/display/mojom/display_mojom_traits.h +++ b/ui/display/mojom/display_mojom_traits.h
@@ -100,7 +100,7 @@ return display.is_monochrome(); } - static float display_frequency(const display::Display& display) { + static int32_t display_frequency(const display::Display& display) { return display.display_frequency(); } static const std::string& label(const display::Display& display) {
diff --git a/ui/display/mojom/screen_info.mojom b/ui/display/mojom/screen_info.mojom index cd697ac..7991569 100644 --- a/ui/display/mojom/screen_info.mojom +++ b/ui/display/mojom/screen_info.mojom
@@ -34,7 +34,7 @@ // The display frequency in Hz of the monitor. Set to 0 if it fails in the // monitor frequency query. - float display_frequency; + uint32 display_frequency; // The display monitor rectangle in virtual-screen coordinates. Note that // this may be negative.
diff --git a/ui/display/mojom/screen_info_mojom_traits.h b/ui/display/mojom/screen_info_mojom_traits.h index 7aed71b..57f37527 100644 --- a/ui/display/mojom/screen_info_mojom_traits.h +++ b/ui/display/mojom/screen_info_mojom_traits.h
@@ -34,7 +34,7 @@ return r.is_monochrome; } - static float display_frequency(const display::ScreenInfo& r) { + static int display_frequency(const display::ScreenInfo& r) { return r.display_frequency; }
diff --git a/ui/display/screen_info.h b/ui/display/screen_info.h index 082e53c..13f51ce 100644 --- a/ui/display/screen_info.h +++ b/ui/display/screen_info.h
@@ -38,7 +38,7 @@ // The display frequency in Hz of the monitor. Set to 0 if it fails in the // monitor frequency query. - float display_frequency = 0; + int display_frequency = 0; // This is set from the rcMonitor member of MONITORINFOEX, to whit: // "A RECT structure that specifies the display monitor rectangle,
diff --git a/ui/display/win/display_info.cc b/ui/display/win/display_info.cc index 76bcd33f5..a6b195d7 100644 --- a/ui/display/win/display_info.cc +++ b/ui/display/win/display_info.cc
@@ -14,7 +14,7 @@ float device_scale_factor, float sdr_white_level, Display::Rotation rotation, - float display_frequency, + int display_frequency, const gfx::Vector2dF& pixels_per_inch, DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology, const std::string& label)
diff --git a/ui/display/win/display_info.h b/ui/display/win/display_info.h index e2221e4..dd1a9d1 100644 --- a/ui/display/win/display_info.h +++ b/ui/display/win/display_info.h
@@ -20,7 +20,7 @@ float device_scale_factor, float sdr_white_level, Display::Rotation rotation, - float display_frequency, + int display_frequency, const gfx::Vector2dF& pixels_per_inch, DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology, const std::string& label); @@ -35,7 +35,7 @@ float device_scale_factor() const { return device_scale_factor_; } float sdr_white_level() const { return sdr_white_level_; } Display::Rotation rotation() const { return rotation_; } - float display_frequency() const { return display_frequency_; } + int display_frequency() const { return display_frequency_; } const gfx::Vector2dF& pixels_per_inch() const { return pixels_per_inch_; } DISPLAYCONFIG_VIDEO_OUTPUT_TECHNOLOGY output_technology() const { return output_technology_; @@ -57,7 +57,7 @@ float device_scale_factor_; float sdr_white_level_; Display::Rotation rotation_; - float display_frequency_; + int display_frequency_; // Pixels per inch of a display. This value will only be set for touch // monitors. In non-touch cases, it will be set to Zero. gfx::Vector2dF pixels_per_inch_;
diff --git a/ui/display/win/scaling_util_unittest.cc b/ui/display/win/scaling_util_unittest.cc index 4b831660..c18edc2 100644 --- a/ui/display/win/scaling_util_unittest.cc +++ b/ui/display/win/scaling_util_unittest.cc
@@ -24,8 +24,8 @@ gfx::Rect(x, y, width, height), kFakeDisplayName); return internal::DisplayInfo( - monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60.0f, - gfx::Vector2dF(), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()); + monitor_info, scale_factor, 1.0f, Display::ROTATE_0, 60, gfx::Vector2dF(), + DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()); } ::testing::AssertionResult AssertOffsetsEqual(
diff --git a/ui/display/win/screen_win_unittest.cc b/ui/display/win/screen_win_unittest.cc index e96bf4d..cddf74c9 100644 --- a/ui/display/win/screen_win_unittest.cc +++ b/ui/display/win/screen_win_unittest.cc
@@ -166,7 +166,7 @@ win::test::CreateMonitorInfo(pixel_bounds, pixel_work, device_name); monitor_infos_.push_back(monitor_info); display_infos_.push_back(internal::DisplayInfo( - monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60.0f, + monitor_info, device_scale_factor, 1.0f, Display::ROTATE_0, 60, gfx::Vector2dF(), tech, std::string())); }
diff --git a/ui/display/win/test/scoped_screen_win.cc b/ui/display/win/test/scoped_screen_win.cc index d3f43312..0d05660 100644 --- a/ui/display/win/test/scoped_screen_win.cc +++ b/ui/display/win/test/scoped_screen_win.cc
@@ -16,9 +16,9 @@ const MONITORINFOEX monitor_info = CreateMonitorInfo(kPixelBounds, kPixelWork, L"primary"); UpdateFromDisplayInfos( - {{monitor_info, /*device_scale_factor=*/1.0f, 1.0f, Display::ROTATE_0, - 60.0f, gfx::Vector2dF(96.0, 96.0), - DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, std::string()}}); + {{monitor_info, /*device_scale_factor=*/1.0f, 1.0f, Display::ROTATE_0, 60, + gfx::Vector2dF(96.0, 96.0), DISPLAYCONFIG_OUTPUT_TECHNOLOGY_OTHER, + std::string()}}); } } // namespace test
diff --git a/ui/gfx/color_conversions.cc b/ui/gfx/color_conversions.cc index b741c01..7e32e9e 100644 --- a/ui/gfx/color_conversions.cc +++ b/ui/gfx/color_conversions.cc
@@ -298,14 +298,9 @@ lab_output.vals[2]); } -std::tuple<float, float, float> LchToLab(float l, - float c, - absl::optional<float> h) { - if (!h.has_value()) - return std::make_tuple(l, 0, 0); - - return std::make_tuple(l, c * std::cos(gfx::DegToRad(h.value())), - c * std::sin(gfx::DegToRad(h.value()))); +std::tuple<float, float, float> LchToLab(float l, float c, float h) { + return std::make_tuple(l, c * std::cos(gfx::DegToRad(h)), + c * std::sin(gfx::DegToRad(h))); } std::tuple<float, float, float> LabToLch(float l, float a, float b) { return std::make_tuple(l, std::sqrt(a * a + b * b), @@ -498,10 +493,7 @@ return XYZD50ToSkColor4f(x, y, z, alpha); } -SkColor4f LchToSkColor4f(float l_input, - float c, - absl::optional<float> h, - float alpha) { +SkColor4f LchToSkColor4f(float l_input, float c, float h, float alpha) { auto [l, a, b] = LchToLab(l_input, c, h); auto [x, y, z] = LabToXYZD50(l, a, b); return XYZD50ToSkColor4f(x, y, z, alpha); @@ -516,10 +508,7 @@ return XYZD50ToSkColor4f(x, y, z, alpha); } -SkColor4f OklchToSkColor4f(float l_input, - float c, - absl::optional<float> h, - float alpha) { +SkColor4f OklchToSkColor4f(float l_input, float c, float h, float alpha) { auto [l, a, b] = LchToLab(l_input, c, h); auto [x, y, z] = OklabToXYZD65(l, a, b); return XYZD65ToSkColor4f(x, y, z, alpha);
diff --git a/ui/gfx/color_conversions.h b/ui/gfx/color_conversions.h index 5bacbb35..785dc81 100644 --- a/ui/gfx/color_conversions.h +++ b/ui/gfx/color_conversions.h
@@ -31,9 +31,7 @@ float y, float z); -GFX_EXPORT std::tuple<float, float, float> LchToLab(float l, - float c, - absl::optional<float> h); +GFX_EXPORT std::tuple<float, float, float> LchToLab(float l, float c, float h); GFX_EXPORT std::tuple<float, float, float> LabToLch(float l, float a, float b); @@ -105,15 +103,9 @@ GFX_EXPORT SkColor4f OklabToSkColor4f(float l, float a, float b, float alpha); -GFX_EXPORT SkColor4f LchToSkColor4f(float l, - float a, - absl::optional<float> b, - float alpha); +GFX_EXPORT SkColor4f LchToSkColor4f(float l, float a, float b, float alpha); -GFX_EXPORT SkColor4f OklchToSkColor4f(float l, - float a, - absl::optional<float> b, - float alpha); +GFX_EXPORT SkColor4f OklchToSkColor4f(float l, float a, float h, float alpha); GFX_EXPORT SkColor4f SRGBLinearToSkColor4f(float r, float g, @@ -143,4 +135,4 @@ } // namespace gfx -#endif // UI_GFX_COLOR_CONVERSIONS_H_ \ No newline at end of file +#endif // UI_GFX_COLOR_CONVERSIONS_H_
diff --git a/ui/gfx/color_conversions_unittest.cc b/ui/gfx/color_conversions_unittest.cc index 0df51ae..7310ab0 100644 --- a/ui/gfx/color_conversions_unittest.cc +++ b/ui/gfx/color_conversions_unittest.cc
@@ -279,8 +279,7 @@ for (auto& color_pair : colors_tests) { auto [input_l, input_c, input_h] = color_pair.input; auto [expected_l, expected_a, expected_b] = color_pair.expected; - auto [output_l, output_a, output_b] = - LchToLab(input_l, input_c, absl::optional<float>(input_h)); + auto [output_l, output_a, output_b] = LchToLab(input_l, input_c, input_h); EXPECT_NEAR(output_l, expected_l, 0.001f) << input_l << ' ' << input_c << ' ' << input_h << " to " << expected_l << ' ' << expected_a << ' ' << expected_b << " produced " << output_l @@ -294,28 +293,6 @@ << ' ' << expected_a << ' ' << expected_b << " produced " << output_l << ' ' << output_a << ' ' << output_b; } - - // Try with a none hue value (white). - float input_l = 100.0f; - float input_c = 0.000010331815288315629f; - absl::optional<float> input_h = absl::nullopt; - float expected_l = 100.0f; - float expected_a = -0.000007807961277528364f; - float expected_b = 0.000006766250648659877f; - auto [output_l, output_a, output_b] = - LchToLab(input_l, input_c, absl::optional<float>(input_h)); - EXPECT_NEAR(output_l, expected_l, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_l << ' ' << expected_a << ' ' << expected_b - << " produced " << output_l << ' ' << output_a << ' ' << output_b; - EXPECT_NEAR(output_a, expected_a, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_l << ' ' << expected_a << ' ' << expected_b - << " produced " << output_l << ' ' << output_a << ' ' << output_b; - EXPECT_NEAR(output_b, expected_b, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_l << ' ' << expected_a << ' ' << expected_b - << " produced " << output_l << ' ' << output_a << ' ' << output_b; } TEST(ColorConversions, LabToLch) { @@ -372,8 +349,7 @@ for (auto& color_pair : colors_tests) { auto [input_l, input_c, input_h] = color_pair.input; auto [expected_r, expected_g, expected_b] = color_pair.expected; - SkColor4f color = - LchToSkColor4f(input_l, input_c, absl::optional<float>(input_h), 1.0f); + SkColor4f color = LchToSkColor4f(input_l, input_c, input_h, 1.0f); EXPECT_NEAR(color.fR, expected_r, 0.01f) << input_l << ' ' << input_c << ' ' << input_h << " to " << expected_r << ' ' << expected_g << ' ' << expected_b << " produced " << color.fR @@ -387,28 +363,6 @@ << ' ' << expected_g << ' ' << expected_b << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; } - - // Try with a none hue value (white). - float input_l = 100.0f; - float input_c = 0.000010331815288315629f; - absl::optional<float> input_h = absl::nullopt; - float expected_r = 1.0f; - float expected_g = 1.0f; - float expected_b = 1.0f; - SkColor4f color = - LchToSkColor4f(input_l, input_c, absl::optional<float>(input_h), 1.0f); - EXPECT_NEAR(color.fR, expected_r, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_r << ' ' << expected_g << ' ' << expected_b - << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; - EXPECT_NEAR(color.fG, expected_g, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_r << ' ' << expected_g << ' ' << expected_b - << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; - EXPECT_NEAR(color.fB, expected_b, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_r << ' ' << expected_g << ' ' << expected_b - << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; } TEST(ColorConversions, OklchToSkColor4f) { @@ -429,8 +383,7 @@ for (auto& color_pair : colors_tests) { auto [input_l, input_c, input_h] = color_pair.input; auto [expected_r, expected_g, expected_b] = color_pair.expected; - SkColor4f color = OklchToSkColor4f(input_l, input_c, - absl::optional<float>(input_h), 1.0f); + SkColor4f color = OklchToSkColor4f(input_l, input_c, input_h, 1.0f); EXPECT_NEAR(color.fR, expected_r, 0.01f) << input_l << ' ' << input_c << ' ' << input_h << " to " << expected_r << ' ' << expected_g << ' ' << expected_b << " produced " << color.fR @@ -444,28 +397,6 @@ << ' ' << expected_g << ' ' << expected_b << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; } - - // Try with a none hue value (white). - float input_l = 100.0f; - float input_c = 0.000010331815288315629f; - absl::optional<float> input_h = absl::nullopt; - float expected_r = 1.0f; - float expected_g = 1.0f; - float expected_b = 1.0f; - SkColor4f color = - OklchToSkColor4f(input_l, input_c, absl::optional<float>(input_h), 1.0f); - EXPECT_NEAR(color.fR, expected_r, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_r << ' ' << expected_g << ' ' << expected_b - << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; - EXPECT_NEAR(color.fG, expected_g, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_r << ' ' << expected_g << ' ' << expected_b - << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; - EXPECT_NEAR(color.fB, expected_b, 0.001f) - << input_l << ' ' << input_c << ' ' << "none" - << " to " << expected_r << ' ' << expected_g << ' ' << expected_b - << " produced " << color.fR << ' ' << color.fG << ' ' << color.fB; } TEST(ColorConversions, SRGBLinearToXYZD50) { @@ -1270,4 +1201,4 @@ } } -} // namespace gfx \ No newline at end of file +} // namespace gfx
diff --git a/ui/gl/gl_display.cc b/ui/gl/gl_display.cc index 4a92b0c..dd34dcbe 100644 --- a/ui/gl/gl_display.cc +++ b/ui/gl/gl_display.cc
@@ -267,14 +267,9 @@ EGLDisplayPlatform native_display, const std::vector<std::string>& enabled_angle_features, const std::vector<std::string>& disabled_angle_features, - bool disable_all_angle_features, uint64_t system_device_id, DisplayKey display_key) { std::vector<EGLAttrib> extra_display_attribs; - if (disable_all_angle_features) { - extra_display_attribs.push_back(EGL_FEATURE_ALL_DISABLED_ANGLE); - extra_display_attribs.push_back(EGL_TRUE); - } if (system_device_id != 0 && g_driver_egl.client_ext.b_EGL_ANGLE_platform_angle_device_id) { uint32_t low_part = system_device_id & 0xffffffff; @@ -754,15 +749,11 @@ AdjustAngleFeaturesFromChromeFeatures(enabled_angle_features, disabled_angle_features); - bool disable_all_angle_features = - command_line->HasSwitch(switches::kDisableGpuDriverBugWorkarounds); - for (size_t disp_index = 0; disp_index < init_displays.size(); ++disp_index) { DisplayType display_type = init_displays[disp_index]; - EGLDisplay display = - GetDisplayFromType(display_type, native_display, enabled_angle_features, - disabled_angle_features, disable_all_angle_features, - system_device_id_, display_key_); + EGLDisplay display = GetDisplayFromType( + display_type, native_display, enabled_angle_features, + disabled_angle_features, system_device_id_, display_key_); if (display == EGL_NO_DISPLAY) { // Assume this is not an error, so don't verbosely report it; // simply try the next display type.
diff --git a/ui/views/interaction/interaction_test_util_views.cc b/ui/views/interaction/interaction_test_util_views.cc index 4369fc0..ab88d28 100644 --- a/ui/views/interaction/interaction_test_util_views.cc +++ b/ui/views/interaction/interaction_test_util_views.cc
@@ -606,24 +606,12 @@ return ui::test::ActionResult::kNotAttempted; auto* const widget = element->AsA<TrackedElementViews>()->view()->GetWidget(); -#if HANDLE_WAYLAND_FAILURE - if (ui::OzonePlatform::GetPlatformNameForTest() == "wayland") { - WidgetActivationWaiterWayland waiter(widget); - widget->Activate(); - if (!waiter.Wait()) { - LOG(WARNING) - << "Unable to activate widget due to lack of Wayland support for " - "widget activation; test is not meaningful on this platform."; - return ui::test::ActionResult::kKnownIncompatible; - } - return ui::test::ActionResult::kSucceeded; + if (!widget) { + LOG(WARNING) << "View not assocaited with a widget."; + return ui::test::ActionResult::kFailed; } -#endif // HANDLE_WAYLAND_FAILURE - views::test::WidgetActivationWaiter waiter(widget, true); - widget->Activate(); - waiter.Wait(); - return ui::test::ActionResult::kSucceeded; + return ActivateWidget(widget); } ui::test::ActionResult InteractionTestUtilSimulatorViews::SendAccelerator( @@ -666,6 +654,30 @@ return ui::test::ActionResult::kSucceeded; } +// static +ui::test::ActionResult InteractionTestUtilSimulatorViews::ActivateWidget( + Widget* widget) { +#if HANDLE_WAYLAND_FAILURE + if (ui::OzonePlatform::GetPlatformNameForTest() == "wayland") { + WidgetActivationWaiterWayland waiter(widget); + widget->Activate(); + if (!waiter.Wait()) { + LOG(WARNING) + << "Unable to activate widget due to lack of Wayland support for " + "widget activation; test is not meaningful on this platform."; + return ui::test::ActionResult::kKnownIncompatible; + } + return ui::test::ActionResult::kSucceeded; + } +#endif // HANDLE_WAYLAND_FAILURE + + views::test::WidgetActivationWaiter waiter(widget, true); + widget->Activate(); + waiter.Wait(); + return ui::test::ActionResult::kSucceeded; +} + +// static bool InteractionTestUtilSimulatorViews::DoDefaultAction(View* view, InputType input_type) { switch (input_type) {
diff --git a/ui/views/interaction/interaction_test_util_views.h b/ui/views/interaction/interaction_test_util_views.h index 26c4d46..787464d 100644 --- a/ui/views/interaction/interaction_test_util_views.h +++ b/ui/views/interaction/interaction_test_util_views.h
@@ -16,6 +16,7 @@ namespace views { class Button; class View; +class Widget; } namespace views::test { @@ -49,6 +50,9 @@ ui::Accelerator accelerator) override; ui::test::ActionResult Confirm(ui::TrackedElement* element) override; + // Common functionality for activating a widget. + static ui::test::ActionResult ActivateWidget(Widget* widget); + // Convenience method for tests that need to simulate a button press and have // direct access to the button. static void PressButton(Button* button,
diff --git a/ui/views/interaction/interactive_views_test_internal.cc b/ui/views/interaction/interactive_views_test_internal.cc index 9026bf1..675d6bb 100644 --- a/ui/views/interaction/interactive_views_test_internal.cc +++ b/ui/views/interaction/interactive_views_test_internal.cc
@@ -7,17 +7,58 @@ #include <memory> #include <utility> -#include "third_party/abseil-cpp/absl/types/optional.h" +#include "base/scoped_observation.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" +#include "ui/base/interaction/framework_specific_implementation.h" #include "ui/base/interaction/interaction_test_util.h" #include "ui/gfx/native_widget_types.h" +#include "ui/views/focus/widget_focus_manager.h" #include "ui/views/interaction/element_tracker_views.h" +#include "ui/views/interaction/widget_focus_observer.h" #include "ui/views/native_window_tracker.h" #include "ui/views/widget/widget.h" namespace views::test::internal { +namespace { + +// Basic observer for low-level activation changes. Relays when a widget +// receives focus. +class NativeViewWidgetFocusSupplier : public WidgetFocusSupplier, + public WidgetFocusChangeListener { + public: + NativeViewWidgetFocusSupplier() { + observation_.Observe(WidgetFocusManager::GetInstance()); + } + ~NativeViewWidgetFocusSupplier() override = default; + + DECLARE_FRAMEWORK_SPECIFIC_METADATA() + + void OnNativeFocusChanged(gfx::NativeView focused_now) override { + // TODO(dfried): There's an order-of-operations issue on some platforms + // where focus transfers between two native views, and the blur for the old + // view is received after the focus for the new view. This results in + // `focused_now` being null rather than the currently-focused view. + // + // While it's slightly less correct, ignore blur events until this can be + // fixed. In general, one would not expect windows not from the application + // under test to become focused, so this will be a valid choice most of the + // time. + if (focused_now) { + OnWidgetFocusChanged(focused_now); + } + } + + private: + base::ScopedObservation<WidgetFocusManager, WidgetFocusChangeListener> + observation_{this}; +}; + +DEFINE_FRAMEWORK_SPECIFIC_METADATA(NativeViewWidgetFocusSupplier) + +} // namespace + // Caches the last-known native window associated with a context. // Useful for executing ClickMouse() and ReleaseMouse() commands, as no target // element is provided for those commands. A NativeWindowTracker is used to @@ -52,6 +93,7 @@ InteractiveViewsTestPrivate::InteractiveViewsTestPrivate( std::unique_ptr<ui::test::InteractionTestUtil> test_util) : InteractiveTestPrivate(std::move(test_util)) {} + InteractiveViewsTestPrivate::~InteractiveViewsTestPrivate() = default; void InteractiveViewsTestPrivate::OnSequenceComplete() { @@ -69,6 +111,20 @@ InteractiveTestPrivate::OnSequenceAborted(data); } +void InteractiveViewsTestPrivate::DoTestSetUp() { + InteractiveTestPrivate::DoTestSetUp(); + // Frame should exist from set up to tear down, to prevent framework/system + // listeners from receving events outside of the test. + widget_focus_supplier_frame_ = std::make_unique<WidgetFocusSupplierFrame>(); + widget_focus_suppliers().MaybeRegister<NativeViewWidgetFocusSupplier>(); +} + +void InteractiveViewsTestPrivate::DoTestTearDown() { + // Avoid doing any widget focus tracking after the test completes. + widget_focus_supplier_frame_.reset(); + InteractiveTestPrivate::DoTestTearDown(); +} + gfx::NativeWindow InteractiveViewsTestPrivate::GetWindowHintFor( ui::TrackedElement* el) { // See if the native window can be extracted directly from the element.
diff --git a/ui/views/interaction/interactive_views_test_internal.h b/ui/views/interaction/interactive_views_test_internal.h index 33b81a5..4c4c0e5 100644 --- a/ui/views/interaction/interactive_views_test_internal.h +++ b/ui/views/interaction/interactive_views_test_internal.h
@@ -17,6 +17,7 @@ #include "ui/base/interaction/interactive_test_internal.h" #include "ui/gfx/native_widget_types.h" #include "ui/views/interaction/interaction_test_util_mouse.h" +#include "ui/views/interaction/widget_focus_observer.h" namespace views { class NativeWindowTracker; @@ -41,6 +42,8 @@ void OnSequenceComplete() override; void OnSequenceAborted( const ui::InteractionSequence::AbortedData& data) override; + void DoTestSetUp() override; + void DoTestTearDown() override; InteractionTestUtilMouse& mouse_util() { return *mouse_util_; } @@ -55,6 +58,11 @@ virtual gfx::NativeWindow GetNativeWindowFromContext( ui::ElementContext context) const; + // Use this to register widget focus suppliers. + WidgetFocusSupplierFrame::SupplierList& widget_focus_suppliers() { + return widget_focus_supplier_frame_->supplier_list(); + } + private: friend class views::test::InteractiveViewsTestApi; @@ -71,6 +79,8 @@ // so only the context is known; a NativeWindowTracker must be used to verify // that the cached information is still valid. std::map<ui::ElementContext, WindowHintCacheEntry> window_hint_cache_; + + std::unique_ptr<WidgetFocusSupplierFrame> widget_focus_supplier_frame_; }; template <size_t N, typename F>
diff --git a/ui/views/interaction/widget_focus_observer.cc b/ui/views/interaction/widget_focus_observer.cc index 079bf4e..e3e9fa6 100644 --- a/ui/views/interaction/widget_focus_observer.cc +++ b/ui/views/interaction/widget_focus_observer.cc
@@ -4,15 +4,59 @@ #include "ui/views/interaction/widget_focus_observer.h" -#include "ui/base/interaction/state_observer.h" +#include "base/functional/bind.h" +#include "base/logging.h" namespace views::test { -WidgetFocusObserver::WidgetFocusObserver() - : ObservationStateObserver(views::WidgetFocusManager::GetInstance()) {} +namespace internal { + +namespace { +WidgetFocusSupplierFrame* g_current_supplier_frame = nullptr; +} + +WidgetFocusSupplier::WidgetFocusSupplier() = default; +WidgetFocusSupplier::~WidgetFocusSupplier() = default; + +base::CallbackListSubscription +WidgetFocusSupplier::AddWidgetFocusChangedCallback( + WidgetFocusChangedCallback callback) { + return callbacks_.Add(callback); +} + +void WidgetFocusSupplier::OnWidgetFocusChanged(gfx::NativeView focused_now) { + callbacks_.Notify(focused_now); +} + +WidgetFocusSupplierFrame::WidgetFocusSupplierFrame() { + LOG_IF(ERROR, g_current_supplier_frame) + << "Old WidgetFocusSupplierFrame was not cleaned up."; + g_current_supplier_frame = this; +} + +WidgetFocusSupplierFrame::~WidgetFocusSupplierFrame() { + if (g_current_supplier_frame == this) { + g_current_supplier_frame = nullptr; + } +} + +WidgetFocusSupplierFrame* WidgetFocusSupplierFrame::GetCurrentFrame() { + return g_current_supplier_frame; +} + +} // namespace internal + +WidgetFocusObserver::WidgetFocusObserver() { + for (auto& supplier : + internal::WidgetFocusSupplierFrame::GetCurrentFrame()->supplier_list()) { + subscriptions_.emplace_back(supplier.AddWidgetFocusChangedCallback( + base::BindRepeating(&WidgetFocusObserver::OnWidgetFocusChanged, + base::Unretained(this)))); + } +} WidgetFocusObserver::~WidgetFocusObserver() = default; -void WidgetFocusObserver::OnNativeFocusChanged(gfx::NativeView focused_now) { +void WidgetFocusObserver::OnWidgetFocusChanged(gfx::NativeView focused_now) { OnStateObserverStateChanged(focused_now); }
diff --git a/ui/views/interaction/widget_focus_observer.h b/ui/views/interaction/widget_focus_observer.h index 78a057e..901a796b 100644 --- a/ui/views/interaction/widget_focus_observer.h +++ b/ui/views/interaction/widget_focus_observer.h
@@ -5,23 +5,80 @@ #ifndef UI_VIEWS_INTERACTION_WIDGET_FOCUS_OBSERVER_H_ #define UI_VIEWS_INTERACTION_WIDGET_FOCUS_OBSERVER_H_ +#include <vector> + +#include "base/callback_list.h" +#include "base/functional/callback_forward.h" +#include "ui/base/interaction/framework_specific_implementation.h" #include "ui/base/interaction/state_observer.h" #include "ui/gfx/native_widget_types.h" -#include "ui/views/focus/widget_focus_manager.h" namespace views::test { -// Tracks focus as a StateObserver. Use ObserveState and WaitForState. -class WidgetFocusObserver - : public ui::test::ObservationStateObserver<gfx::NativeView, - WidgetFocusManager, - WidgetFocusChangeListener> { +namespace internal { + +// Represents a singleton object that observes widget activation in some way. +// Useful because not all browser activations register as low-level widget +// activations, and there needs to be a way to track non-browser windows too, so +// there is no single system that can provide this information. +// +// Subclasses should be private to a specific Interactive[X]TestApi +// implementation, and be registered on the test's `WidgetFocusSupplierFrame`. +class WidgetFocusSupplier : public ui::FrameworkSpecificImplementation { + public: + WidgetFocusSupplier(); + ~WidgetFocusSupplier() override; + + // Allows a specific WidgetFocusObserver to register for callbacks. + using WidgetFocusChangedCallback = + base::RepeatingCallback<void(gfx::NativeView)>; + base::CallbackListSubscription AddWidgetFocusChangedCallback( + WidgetFocusChangedCallback callback); + + protected: + // Derived classes should call this when the focus changes. + void OnWidgetFocusChanged(gfx::NativeView focused_now); + + private: + base::RepeatingCallbackList<void(gfx::NativeView)> callbacks_; +}; + +// Creates a frame in which WidgetFocusSuppliers can be registered. +// Use `GetCurrentFrame()->supplier_list()`. +class WidgetFocusSupplierFrame { + public: + WidgetFocusSupplierFrame(); + ~WidgetFocusSupplierFrame(); + + WidgetFocusSupplierFrame(const WidgetFocusSupplierFrame&) = delete; + void operator=(const WidgetFocusSupplierFrame&) = delete; + + // Returns the current frame (there should only be one). + static WidgetFocusSupplierFrame* GetCurrentFrame(); + + using SupplierList = + ui::FrameworkSpecificRegistrationList<WidgetFocusSupplier>; + + SupplierList& supplier_list() { return supplier_list_; } + + private: + // The actual list of widget focus suppliers. + SupplierList supplier_list_; +}; + +} // namespace internal + +// Tracks widget focus as a `StateObserver`. Use ObserveState and WaitForState. +// Can only be created inside of a `WidgetFocusSupplierFrame`. +class WidgetFocusObserver : public ui::test::StateObserver<gfx::NativeView> { public: WidgetFocusObserver(); ~WidgetFocusObserver() override; - // WidgetFocusChangeListener: - void OnNativeFocusChanged(gfx::NativeView focused_now) override; + private: + void OnWidgetFocusChanged(gfx::NativeView focused_now); + + std::vector<base::CallbackListSubscription> subscriptions_; }; // Since there is only one WidgetFocusManager, there only ever needs to be one
diff --git a/ui/views/layout/layout_provider.cc b/ui/views/layout/layout_provider.cc index 8c6b228f..5319192 100644 --- a/ui/views/layout/layout_provider.cc +++ b/ui/views/layout/layout_provider.cc
@@ -88,7 +88,7 @@ case DISTANCE_BUTTON_MAX_LINKABLE_WIDTH: return 112; case DISTANCE_CLOSE_BUTTON_MARGIN: - return 4; + return features::IsChromeRefresh2023() ? 20 : 4; case DISTANCE_CONTROL_VERTICAL_TEXT_PADDING: return features::IsChromeRefresh2023() ? 10 : 8; case DISTANCE_DIALOG_BUTTON_MINIMUM_WIDTH:
diff --git a/ui/views/widget/native_widget_aura.cc b/ui/views/widget/native_widget_aura.cc index 9b35621..acd6f75 100644 --- a/ui/views/widget/native_widget_aura.cc +++ b/ui/views/widget/native_widget_aura.cc
@@ -581,7 +581,11 @@ !screen->GetDisplayWithDisplayId(display_id.value(), &dst_display)) { dst_display = screen->GetDisplayMatching(bounds); } +#if BUILDFLAG(IS_CHROMEOS) + // `dst_display` is not used on desktop chrome, and `GetDisplayMatching` above + // may return invalid display on Windows. CHECK(dst_display.is_valid()); +#endif window_->SetBoundsInScreen(bounds, dst_display); }
diff --git a/ui/webui/resources/cr_elements/md_select.css b/ui/webui/resources/cr_elements/md_select.css index 27bab2e..a574fa2 100644 --- a/ui/webui/resources/cr_elements/md_select.css +++ b/ui/webui/resources/cr_elements/md_select.css
@@ -18,7 +18,7 @@ --md-select-text-color: var(--cr-primary-text-color); -webkit-appearance: none; - background: url(chrome://resources/images/arrow_down.svg) + background: url(//resources/images/arrow_down.svg) calc(100% - var(--md-select-side-padding)) center no-repeat; background-color: var(--md-select-bg-color); @@ -47,7 +47,7 @@ --md-select-focus-shadow-color: rgba(var(--google-blue-300-rgb), .5); --md-select-option-bg-color: var(--google-grey-900-white-4-percent); - background-image: url(chrome://resources/images/dark/arrow_down.svg); + background-image: url(//resources/images/dark/arrow_down.svg); } }